sysALib.s
上传用户:dqzhongke1
上传日期:2022-06-26
资源大小:667k
文件大小:19k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* sysALib.s - Assembly support file and init routines */
  2. /*
  3.  * Copyright (c) 2005 Wind River Systems, Inc.
  4.  *
  5.  * The right to copy, distribute, modify, or otherwise make use
  6.  * of this software may be licensed only pursuant to the terms
  7.  * of an applicable Wind River license agreement.
  8.  */
  9. /*
  10. modification history
  11. --------------------
  12. 01a,03oct05,dtr  Created from cds85xx/01m
  13. */
  14. #define _ASMLANGUAGE
  15. #include <vxWorks.h>
  16. #include <asm.h>
  17. #include <config.h>
  18. #include <sysLib.h>
  19. #include <sysL2Cache.h>
  20. #include <arch/ppc/mmuE500Lib.h>
  21. FUNC_EXPORT(sysInit)
  22. FUNC_EXPORT(_sysInit)
  23. FUNC_EXPORT(sysIvprSet)
  24. FUNC_EXPORT(vxL2CTLSet)
  25. FUNC_EXPORT(vxL2CTLGet)
  26. FUNC_EXPORT(sysCacheFlush)
  27. FUNC_IMPORT(usrInit)
  28. FUNC_EXPORT(sysInWord)
  29. FUNC_EXPORT(sysOutWord)
  30. FUNC_EXPORT(sysInLong)
  31. FUNC_EXPORT(sysOutLong)
  32.         FUNC_EXPORT(sysInByte)
  33. FUNC_EXPORT(sysOutByte)
  34. FUNC_EXPORT(sysPciRead32)
  35. FUNC_EXPORT(sysPciWrite32)
  36. FUNC_EXPORT(sysPciInByte)
  37. FUNC_EXPORT(sysPciOutByte)
  38. FUNC_EXPORT(sysPciInWord)
  39. FUNC_EXPORT(sysPciOutWord)
  40. FUNC_EXPORT(sysPciInLong)
  41. FUNC_EXPORT(sysPciOutLong)
  42.         FUNC_EXPORT(sysPCGet)   /* get the value of the PC register */
  43.         FUNC_EXPORT(sysL1Csr1Set)
  44.         FUNC_EXPORT(sysTimeBaseLGet)
  45. #ifdef INCLUDE_L1_IPARITY_HDLR_INBSP
  46.         FUNC_EXPORT(sysIParityHandler)
  47.         FUNC_EXPORT(sysIvor1Set)
  48.         FUNC_EXPORT(jumpIParity)
  49. #endif  /* INCLUDE_L1_IPARITY_HDLR_INBSP */
  50. FUNC_EXPORT(disableBranchPrediction)
  51. FUNC_EXPORT(sysTas)
  52. _WRS_TEXT_SEG_START
  53.         DATA_IMPORT(inFullVxWorksImage)
  54. #define CACHE_ALIGN_SHIFT 5 /* Cache line size == 2**5 */
  55. FUNC_LABEL(_sysInit)
  56. FUNC_BEGIN(sysInit)
  57. mr  r8, r3
  58.         xor p0,p0,p0
  59. mtspr TCR,p0
  60. xor   r6, r6, r6
  61. msync
  62. isync
  63. mtspr L1CSR0, r6 /* Disable the Data cache */
  64.         li   r6, 0x0002              
  65. msync
  66. isync
  67. mtspr L1CSR0, r6 /* Invalidate the Data cache */
  68.         li    r6, 0x0000              
  69.         msync
  70. isync
  71. mtspr L1CSR1, r6  /* Disable the Instrunction cache */
  72.         li   r6, 0x0002              
  73.         msync
  74. isync
  75. mtspr L1CSR1, r6 /* Invalidate the Instruction cache */
  76.         isync
  77.         li   r6, 0x0000              
  78. msync
  79. isync
  80. mtspr L1CSR1, r6        /* Disable the Instruction cache*/
  81. msync
  82. isync
  83.         mbar 0
  84. #ifdef INCLUDE_BRANCH_PREDICTION
  85.         li   r6, _PPC_BUCSR_FI
  86.         mtspr 1013,r6
  87.         li   r6, _PPC_BUCSR_E
  88.         mtspr 1013,r6
  89. #endif
  90. lis  r6, HIADJ(inFullVxWorksImage)
  91. addi r6, r6,LO(inFullVxWorksImage)
  92. li   r7, TRUE
  93. stw  r7, 0(r6)
  94. /* initialize the stack pointer */
  95. lis     sp, HIADJ(RAM_LOW_ADRS)
  96. addi    sp, sp, LO(RAM_LOW_ADRS)
  97. addi    sp, sp, -FRAMEBASESZ    /* get frame stack */
  98. mr      r3, r8
  99. b usrInit
  100. FUNC_END(sysInit)
  101. .balign 32
  102. /******************************************************************************
  103. *
  104. * vxL2CTLSet - Set the value of the L@ cache control register
  105. *
  106. * This routine returns the value written.
  107. *
  108. * SYNOPSIS
  109. * ss
  110. * UINT32 sysL2CTLSet
  111. *     (
  112. *     UINT32 value,
  113. *     UINT32 *addr
  114. *     )
  115. * se
  116. *
  117. * RETURNS: This routine returns the value in the L2CTL reg.
  118. */
  119. FUNC_BEGIN(vxL2CTLSet)
  120. mbar 0 
  121. isync
  122. stw p0,0(p1)
  123. lwz p0,0(p1)
  124. mbar 0
  125. isync
  126. blr
  127. FUNC_END(vxL2CTLSet)
  128. .balign 32
  129. /******************************************************************************
  130. *
  131. * vxL2CTLGet - Get the value of the L2 cache control register
  132. *
  133. * SYNOPSIS
  134. * ss
  135. * UINT32 sysL2CTLGet
  136. *     (
  137. *     UINT32 *addr
  138. *     )
  139. * se
  140. *
  141. * RETURNS: This routine returns the value in the L2CTL reg.
  142. */
  143. FUNC_BEGIN(vxL2CTLGet)
  144. mbar    0
  145. isync
  146. lwz p1,0x0(p0)
  147. addi    p0,p1,0x0
  148. mbar    0
  149. isync
  150. blr
  151. FUNC_END(vxL2CTLGet)
  152. /******************************************************************************
  153. * disableBranchPrediction - disables branch prediction 
  154. *
  155. * SYNOPSIS
  156. * ss
  157. * void disableBranchPrediction
  158. *     (
  159. *     void
  160. *     )
  161. * se
  162. *
  163. * RETURNS: NONE
  164. */
  165. FUNC_BEGIN(disableBranchPrediction)
  166.         mfspr p0, 1013
  167.         andi. p1, p0,LO(~_PPC_BUCSR_E)
  168.         isync
  169.         mtspr 1013,p1
  170.         isync
  171.         li    p0, _PPC_BUCSR_FI
  172.         mtspr 1013,p0
  173.         isync
  174.         blr
  175. FUNC_END(disableBranchPrediction)
  176. /****************************************************
  177.  * sysCacheFlush just flushes cache - assume int lock
  178.  * p0 - cache line num
  179.  * p1 - buffer origin
  180.  * p2 - cache align size
  181.  */
  182. FUNC_BEGIN(sysCacheFlush)
  183. /*
  184.  * p3 contains the count of cache lines to be fetched & flushed.
  185.  * Convert to a count of pages covered, and fetch a word from
  186.  * each page to ensure that all addresses involved are in
  187.  * the TLB so that reloads do not disrupt the flush loop.
  188.  * A simple shift without round-up is sufficient because
  189.  * the p3 value is always a multiple of the shift count.
  190.  */
  191. srwi p3, p0, MMU_RPN_SHIFT - CACHE_ALIGN_SHIFT
  192. mtspr CTR, p3
  193.         addi    p6,p1,0
  194.         li      p5,MMU_PAGE_SIZE
  195. subf    p3,p5,p1
  196. /*
  197.  * There might be a page boundary between here and the end of
  198.  * the function, so make sure both pages are in the I-TLB.
  199.  */
  200. b cacheL2DisableLoadItlb
  201. cacheL2DisableLoadDtlb:
  202. add     p3,p3,p5
  203. lbzu p4,0(p3)
  204. bdnz cacheL2DisableLoadDtlb
  205. mtctr   p0         /* Load counter with number of cache lines */
  206. subf p1, p2, p1 /* buffer points to text  - cache line size */
  207. l2DisableFlush:
  208.         add p1, p2, p1   /* +  cache line size */
  209. lbzu p3, 0x0(p1)           /* flush the data cache block */
  210.         bdnz    l2DisableFlush     /* loop till cache ctr is zero */
  211. sync
  212. isync
  213. mtctr   p0         /* Load counter with number of cache lines */
  214.         addi    p1, p6, 0
  215. subf p1, p2, p1 /* buffer points to text  - cache line size */
  216. l2DisableClear:
  217. add p1, p2, p1  /* point to next cache line */
  218. dcbf 0,p1     /* flush newly-loaded line */
  219. bdnz l2DisableClear     /* repeat for all sets and ways */
  220. sync
  221. isync
  222. blr
  223. cacheL2DisableLoadItlb:
  224. b cacheL2DisableLoadDtlb
  225. FUNC_END(sysCacheFlush)
  226. /*****************************************************************************
  227. *
  228. * sysInByte - reads a byte from an io address.
  229. *
  230. * This function reads a byte from a specified io address.
  231. *
  232. * RETURNS: byte from address.
  233. * UCHAR sysInByte
  234. *     (
  235. *     UCHAR *  pAddr /@ Virtual I/O addr to read from @/
  236. *     )
  237. */
  238. FUNC_BEGIN(sysInByte)
  239. eieio /* Sync I/O operation */
  240. sync
  241. lbzx p0,r0,p0 /* Read byte from I/O space */
  242. bclr 20,0 /* Return to caller */
  243. FUNC_END(sysInByte)
  244. /******************************************************************************
  245. *
  246. * sysOutByte - writes a byte to an io address.
  247. *
  248. * This function writes a byte to a specified io address.
  249. *
  250. * RETURNS: N/A
  251. * VOID sysOutByte
  252. *     (
  253. *     UCHAR *  pAddr, /@ Virtual I/O addr to write to @/
  254. *     UCHAR    data /@ data to be written @/
  255. *     )
  256. */
  257. FUNC_BEGIN(sysOutByte)
  258. stbx p1,r0,p0 /* Write a byte to PCI space */
  259. eieio /* Sync I/O operation */
  260. sync
  261. bclr 20,0 /* Return to caller */
  262. FUNC_END(sysOutByte)
  263. /*****************************************************************************
  264. *
  265. * sysInWord - reads a word from an address, swapping the bytes.
  266. *
  267. * This function reads a swapped word from a specified 
  268. * address.
  269. *
  270. * RETURNS:
  271. * Returns swapped 16 bit data from the specified address.
  272. * USHORT sysInWord
  273. *     (
  274. *     ULONG  address, /@ addr to read from @/
  275. *     )
  276. */
  277. FUNC_BEGIN(sysInWord)
  278. eieio /* Sync I/O operation */
  279. sync
  280.         lhbrx   p0,r0,p0 /* Read and swap */
  281.         bclr    20,0 /* Return to caller */
  282. FUNC_END(sysInWord)
  283. /*****************************************************************************
  284. *
  285. * sysOutWord - writes a word to an address swapping the bytes.
  286. *
  287. * This function writes a swapped word to a specified 
  288. * address.
  289. *
  290. * RETURNS: N/A
  291. * VOID sysOutWord
  292. *     (
  293. *     ULONG address, /@ Virtual addr to write to @/
  294. *     UINT16  data /@ Data to be written       @/
  295. *     )
  296. */
  297. FUNC_BEGIN(sysOutWord)
  298.         sthbrx  p1,r0,p0 /* Write with swap to address */
  299. eieio /* Sync I/O operation */
  300. sync
  301.         bclr    20,0 /* Return to caller */
  302. FUNC_END(sysOutWord)
  303. /*****************************************************************************
  304. *
  305. * sysInLong - reads a long from an address.
  306. *
  307. * This function reads a long from a specified PCI Config Space (little-endian)
  308. * address.
  309. *
  310. * RETURNS:
  311. * Returns 32 bit data from the specified register.  Note that for PCI systems
  312. * if no target responds, the data returned to the CPU will be 0xffffffff.
  313. * ULONG sysInLong
  314. *     (
  315. *     ULONG  address, /@ Virtual addr to read from @/
  316. *     )
  317. */
  318. FUNC_BEGIN(sysInLong)
  319. eieio /* Sync I/O operation */
  320. sync
  321.         lwbrx   p0,r0,p0 /* Read and swap from address */
  322.         bclr    20,0 /* Return to caller */
  323. FUNC_END(sysInLong)
  324. /******************************************************************************
  325. *
  326. * sysOutLong - write a swapped long to address.
  327. *
  328. * This routine will store a 32-bit data item (input as big-endian)
  329. * into an address in little-endian mode.
  330. *
  331. * RETURNS: N/A
  332. * VOID sysOutLong
  333. *     (
  334. *     ULONG   address, /@ Virtual addr to write to @/
  335. *     ULONG   data /@ Data to be written @/
  336. *     )
  337. */
  338. FUNC_BEGIN(sysOutLong)
  339.         stwbrx  p1,r0,p0 /* store data as little-endian */
  340. eieio /* Sync I/O operation */
  341. sync
  342.         bclr    20,0
  343. FUNC_END(sysOutLong)
  344. /******************************************************************************
  345. *
  346. * sysPciRead32 - read 32 bit PCI data
  347. *
  348. * This routine will read a 32-bit data item from PCI (I/O or
  349. * memory) space.
  350. *
  351. * RETURNS: N/A
  352. * VOID sysPciRead32
  353. *     (
  354. *     ULONG *  pAddr, /@ Virtual addr to read from @/
  355. *     ULONG *  pResult /@ location to receive data @/
  356. *     )
  357. */
  358. FUNC_BEGIN(sysPciRead32)
  359. eieio /* Sync I/O operation */
  360.         lwbrx   p0,r0,p0 /* get the data and swap the bytes */
  361.         stw     p0,0(p1) /* store into address ptd. to by p1 */
  362.         bclr    20,0
  363. FUNC_END(sysPciRead32)
  364. /******************************************************************************
  365. *
  366. * sysPciWrite32 - write a 32 bit data item to PCI space
  367. *
  368. * This routine will store a 32-bit data item (input as big-endian)
  369. * into PCI (I/O or memory) space in little-endian mode.
  370. *
  371. * RETURNS: N/A
  372. * VOID sysPciWrite32
  373. *     (
  374. *     ULONG *  pAddr, /@ Virtual addr to write to @/
  375. *     ULONG   data /@ Data to be written @/
  376. *     )
  377. */
  378. FUNC_BEGIN(sysPciWrite32)
  379.         stwbrx  p1,r0,p0 /* store data as little-endian */
  380.         bclr    20,0
  381. FUNC_END(sysPciWrite32)
  382. /*****************************************************************************
  383. *
  384. * sysPciInByte - reads a byte from PCI Config Space.
  385. *
  386. * This function reads a byte from a specified PCI Config Space address.
  387. *
  388. * RETURNS:
  389. * Returns 8 bit data from the specified register.  Note that for PCI systems
  390. * if no target responds, the data returned to the CPU will be 0xff.
  391. * UINT8 sysPciInByte
  392. *     (
  393. *     UINT8 *  pAddr, /@ Virtual addr to read from @/
  394. *     )
  395. */
  396. FUNC_BEGIN(sysPciInByte)
  397. eieio /* Sync I/O operation */
  398.         lbzx    p0,r0,p0 /* Read byte from PCI space */
  399.         bclr    20,0 /* Return to caller */
  400. FUNC_END(sysPciInByte)
  401. /*****************************************************************************
  402. *
  403. * sysPciInWord - reads a word (16-bit big-endian) from PCI Config Space.
  404. *
  405. * This function reads a word from a specified PCI Config Space (little-endian)
  406. * address.
  407. *
  408. * RETURNS:
  409. * Returns 16 bit data from the specified register.  Note that for PCI systems
  410. * if no target responds, the data returned to the CPU will be 0xffff.
  411. * USHORT sysPciInWord
  412. *     (
  413. *     USHORT *  pAddr, /@ Virtual addr to read from @/
  414. *     )
  415. */
  416. FUNC_BEGIN(sysPciInWord)
  417. eieio /* Sync I/O operation */
  418.         lhbrx   p0,r0,p0 /* Read and swap from PCI space */
  419.         bclr    20,0 /* Return to caller */
  420. FUNC_END(sysPciInWord)
  421. /*****************************************************************************
  422. *
  423. * sysPciInLong - reads a long (32-bit big-endian) from PCI Config Space.
  424. *
  425. * This function reads a long from a specified PCI Config Space (little-endian)
  426. * address.
  427. *
  428. * RETURNS:
  429. * Returns 32 bit data from the specified register.  Note that for PCI systems
  430. * if no target responds, the data returned to the CPU will be 0xffffffff.
  431. * ULONG sysPciInLong
  432. *     (
  433. *     ULONG *  pAddr, /@ Virtual addr to read from @/
  434. *     )
  435. */
  436. FUNC_BEGIN(sysPciInLong)
  437. eieio /* Sync I/O operation */
  438.         lwbrx   p0,r0,p0 /* Read and swap from PCI space */
  439.         bclr    20,0 /* Return to caller */
  440. FUNC_END(sysPciInLong)
  441. /******************************************************************************
  442. *
  443. * sysPciOutByte - writes a byte to PCI Config Space.
  444. *
  445. * This function writes a byte to a specified PCI Config Space address.
  446. *
  447. * RETURNS: N/A
  448. * VOID sysPciOutByte
  449. *     (
  450. *     UINT8 *  pAddr, /@ Virtual addr to write to @/
  451. *     UINT8  data /@ Data to be written       @/
  452. *     )
  453. */
  454. FUNC_BEGIN(sysPciOutByte)
  455.         stbx    p1,r0,p0 /* Write a byte to PCI space */
  456.         bclr    20,0 /* Return to caller */
  457. FUNC_END(sysPciOutByte)
  458. /******************************************************************************
  459. *
  460. * sysPciOutWord - writes a word (16-bit big-endian) to PCI Config Space.
  461. *
  462. * This function writes a word to a specified PCI Config Space (little-endian)
  463. * address.
  464. *
  465. * RETURNS: N/A
  466. * VOID sysPciOutWord
  467. *     (
  468. *     USHORT *  pAddr, /@ Virtual addr to write to @/
  469. *     USHORT  data /@ Data to be written       @/
  470. *     )
  471. */
  472. FUNC_BEGIN(sysPciOutWord)
  473.         sthbrx  p1,r0,p0 /* Write with swap to PCI space */
  474.         bclr    20,0 /* Return to caller */
  475. FUNC_END(sysPciOutWord)
  476. /******************************************************************************
  477. *
  478. * sysPciOutLong - writes a long (32-bit big-endian) to PCI Config Space.
  479. *
  480. * This function writes a long to a specified PCI Config Space (little-endian)
  481. * address.
  482. *
  483. * RETURNS: N/A
  484. * VOID sysPciOutLong
  485. *     (
  486. *     ULONG *  pAddr, /@ Virtual addr to write to @/
  487. *     ULONG  data /@ Data to be written       @/
  488. *     )
  489. */
  490. FUNC_BEGIN(sysPciOutLong)
  491.         stwbrx  p1,r0,p0 /* Write big-endian long to little-endian */
  492.         mr      p0,p1 /* PCI space */
  493.         bclr    20,0 /* Return to caller */
  494. FUNC_END(sysPciOutLong)
  495. /******************************************************************************
  496. *
  497. * sysPCGet - Get the value of the PC (Program Counter)
  498. *
  499. * This routine returns the value of the PC.
  500. *
  501. * SYNOPSIS
  502. * ss
  503. * UINT32 sysPCGet
  504. *     (
  505. *     void
  506. *     )
  507. * se
  508. *
  509. * RETURNS: the Program Counter Register (PC) value.
  510. */
  511. FUNC_BEGIN(sysPCGet)
  512.         mflr r4 /* Save LR value */
  513.         bl      Next    /* Set PC */
  514. Next:
  515.         mflr    r3 /* Get PC */
  516. mtlr    r4 /* Restor LR value */
  517. blr
  518. FUNC_END(sysPCGet)
  519. /******************************************************************************
  520. *
  521. * sysTimeBaseLGet - Get lower half of Time Base Register
  522. *
  523. * SYNOPSIS
  524. * ss
  525. * UINT32 sysTimeBaseLGet(void)
  526. * se
  527. *
  528. * This routine will read the contents the lower half of the Time
  529. * Base Register (TBL - TBR 268).
  530. *
  531. * RETURNS: value of TBR 268 (in r3)
  532. */
  533. FUNC_BEGIN(sysTimeBaseLGet)
  534.     mfspr       r3, 268
  535.     bclr        20,0                    /* Return to caller */
  536. FUNC_END(sysTimeBaseLGet)
  537. /******************************************************************************
  538. *
  539. * sysL1Csr1Set - Set the value of L1CSR1
  540. *
  541. * SYNOPSIS
  542. * ss
  543. * void sysL1Csr1Set
  544. *     (
  545. *     UINT32
  546. *     )
  547. * se
  548. *
  549. * RETURNS: none
  550. */
  551. FUNC_BEGIN(sysL1Csr1Set)
  552.         msync
  553.         isync
  554.         mtspr   L1CSR1, r3
  555.         msync
  556.         isync
  557.         blr
  558. FUNC_END(sysL1Csr1Set)
  559. FUNC_BEGIN(sysIvprSet)
  560. mtspr  IVPR,p0
  561. blr
  562. FUNC_END(sysIvprSet)
  563. #if defined(INCLUDE_L1_IPARITY_HDLR)
  564. # include "sysL1ICacheParity.s"
  565. #elif defined(INCLUDE_L1_IPARITY_HDLR_INBSP)
  566. #define DETECT_EXCHDL_ADRS(ivor)  
  567.         mfspr   p0, IVPR;         
  568.         mfspr   p1, ivor;         
  569.         or      p1, p1, p0;       
  570.         mfspr   p0, MCSRR0;       
  571.         cmpw    p0, p1;           
  572.         beq     faultDetected;
  573. /*********************************************************************
  574.  *
  575.  * sysIParityHandler - This routine is call for a machine check. 
  576.  * This routine will invalidate the instruction cache for the address 
  577.  * in MCSRRO. If only instruction parity error then it will return from
  578.  * machine check else it will go to standard machine check handler.
  579.  */ 
  580. FUNC_BEGIN(sysIParityHandler)
  581.         /* Save registers used */
  582.      
  583.         mtspr   SPRG4_W ,p0
  584.         mtspr   SPRG5_W ,p1
  585.         mfcr    p0
  586.         mtspr   SPRG6_W ,p0
  587.             
  588.         /* check for ICPERR */
  589.         mfspr   p1, MCSR
  590.         andis.  p1, p1, 0x4000
  591.         beq     ppcE500Mch_norm
  592.         /* check if mcsrr0 is pointing to 1st instr of exception handler */
  593.         DETECT_EXCHDL_ADRS(IVOR0)
  594.         DETECT_EXCHDL_ADRS(IVOR1)
  595.         DETECT_EXCHDL_ADRS(IVOR2)
  596.         DETECT_EXCHDL_ADRS(IVOR3)
  597.         DETECT_EXCHDL_ADRS(IVOR4)
  598.         DETECT_EXCHDL_ADRS(IVOR5)
  599.         DETECT_EXCHDL_ADRS(IVOR6)
  600.         DETECT_EXCHDL_ADRS(IVOR8)
  601.         DETECT_EXCHDL_ADRS(IVOR10)
  602.         DETECT_EXCHDL_ADRS(IVOR11)
  603.         DETECT_EXCHDL_ADRS(IVOR12)
  604.         DETECT_EXCHDL_ADRS(IVOR13)
  605.         DETECT_EXCHDL_ADRS(IVOR14)
  606.         DETECT_EXCHDL_ADRS(IVOR15)
  607.         DETECT_EXCHDL_ADRS(IVOR32)
  608.         DETECT_EXCHDL_ADRS(IVOR33)
  609.         DETECT_EXCHDL_ADRS(IVOR34)
  610.         DETECT_EXCHDL_ADRS(IVOR35)
  611.         /* p0 here has mcsrr0 value, round to cache line boundary */
  612.         rlwinm  p0, p0, 0, 0, 31 - CACHE_ALIGN_SHIFT 
  613.         /* invalidate instruction cache */
  614.         icbi    r0, p0
  615.         isync
  616. #ifdef INCLUDE_SHOW_ROUTINES
  617.         /* Add 1 to instrParityCount to measure no of parity errors */ 
  618.         lis     p0, HIADJ(instrParityCount)
  619.         addi    p0, p0, LO(instrParityCount)
  620.         lwz     p1, 0(p0)
  621.         addi    p1, p1, 1
  622.         stw     p1, 0(p0)
  623. #endif
  624.         /* return after invalidate */
  625.         mfspr   p0, SPRG6_R
  626.         mtcr    p0
  627.         mfspr   p0, SPRG4_R
  628.         mfspr   p1, SPRG5_R
  629.         isync     
  630.         rfmci /*.long   0x4c00004c*/
  631. ppcE500Mch_norm:
  632.         mfspr   p0, SPRG6_R
  633.         mtcr    p0
  634.         mfspr   p0, SPRG4_R
  635.         mfspr   p1, SPRG5_R
  636.         ba      0x200       /* _EXC_OFF_MACH */
  637. faultDetected:
  638.         /* rebooting, no need to save regs */
  639.         bl      chipErrataCpu29Print
  640.         li      p0, BOOT_NORMAL
  641.         b       sysToMonitor      /* reset */
  642. FUNC_END(sysIParityHandler)
  643. /* Branch to above handler copied to _EXC_OFF_END */
  644. FUNC_BEGIN(jumpIParity)
  645. ba     sysIParityHandler
  646. FUNC_END(jumpIParity)
  647. /****************************************************************
  648.  * sysIvor1Set - fills in value of IVOR1 register to override 
  649.  * standard machine check handler for L1 instruction parity recovery.
  650.  */
  651. FUNC_BEGIN(sysIvor1Set)
  652.         mtspr IVOR1, p0
  653. blr
  654. FUNC_END(sysIvor1Set)
  655. #endif  /* INCLUDE_L1_IPARITY_HDLR */
  656. /*******************************************************************************
  657. *
  658. * vxTas - this routine performs the atomic test and set for the PowerPC arch.
  659. *
  660. * RETURN: None.
  661. */
  662. FUNC_BEGIN(sysTas)
  663. lis r4, 0x8000 /* set the upper bit of r4 */
  664. ori     r4, r4, 0x0000
  665. eieio /* simple ordered store using eieio */
  666. lwarx r5, 0, r3 /* load and reserve */
  667. cmpwi r5, 0 /* done if word */
  668. bne sysTasEnd /* not equal to 0 */
  669. stwcx. r4, 0, r3 /* try to store non-zero */
  670. eieio /* preserve load/store order */
  671. bne- sysTas
  672. li r3, 0x01
  673. blr
  674. sysTasEnd:
  675. li r3, 0
  676. blr
  677. FUNC_END(sysTas)