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

VxWorks

开发平台:

C/C++

  1. /* Copyright 1984-2004 Wind River Systems, Inc. */
  2. /*
  3. modification history
  4. --------------------
  5. 01a,10jun04,dtr  L1 Errata Fix created.
  6. */
  7. FUNC_EXPORT(sysIParityHandler)
  8. FUNC_EXPORT(sysIParityHandlerEnd)
  9. DATA_IMPORT(instrParityCount)
  10. _WRS_TEXT_SEG_START
  11. #define DETECT_EXCHDL_ADRS(ivor)  
  12.         mfspr   p0, IVPR;         
  13.         mfspr   p1, ivor;         
  14.         or      p1, p1, p0;       
  15.         mfspr   p0, MCSRR0;       
  16.         cmpw    p0, p1;           
  17.         beq     faultDetected;
  18. /*********************************************************************
  19.  *
  20.  * sysIParityHandler - This routine is call for a machine check. 
  21.  * This routine will invalidate the instruction cache for the address 
  22.  * in MCSRRO. If only instruction parity error then it will return from
  23.  * machine check else it will go to standard machine check handler.
  24.  */ 
  25. FUNC_BEGIN(sysIParityHandler)
  26.         /* Save registers used */
  27.      
  28.         mtspr   SPRG4_W ,p0
  29.         mtspr   SPRG5_W ,p1
  30.         mfcr    p0
  31.         mtspr   SPRG6_W ,p0
  32.             
  33.         /* check for ICPERR */
  34.         mfspr   p1, MCSR
  35.         andis.  p1, p1, 0x4000
  36.         beq     ppcE500Mch_norm
  37.         /* check if mcsrr0 is pointing to 1st instr of exception handler */
  38.         DETECT_EXCHDL_ADRS(IVOR0)
  39.         DETECT_EXCHDL_ADRS(IVOR1)
  40.         DETECT_EXCHDL_ADRS(IVOR2)
  41.         DETECT_EXCHDL_ADRS(IVOR3)
  42.         DETECT_EXCHDL_ADRS(IVOR4)
  43.         DETECT_EXCHDL_ADRS(IVOR5)
  44.         DETECT_EXCHDL_ADRS(IVOR6)
  45.         DETECT_EXCHDL_ADRS(IVOR8)
  46.         DETECT_EXCHDL_ADRS(IVOR10)
  47.         DETECT_EXCHDL_ADRS(IVOR11)
  48.         DETECT_EXCHDL_ADRS(IVOR12)
  49.         DETECT_EXCHDL_ADRS(IVOR13)
  50.         DETECT_EXCHDL_ADRS(IVOR14)
  51.         DETECT_EXCHDL_ADRS(IVOR15)
  52.         DETECT_EXCHDL_ADRS(IVOR32)
  53.         DETECT_EXCHDL_ADRS(IVOR33)
  54.         DETECT_EXCHDL_ADRS(IVOR34)
  55.         DETECT_EXCHDL_ADRS(IVOR35)
  56.         /* p0 here has mcsrr0 value, round to cache line boundary */
  57.         rlwinm  p0, p0, 0, 0, 31 - CACHE_ALIGN_SHIFT 
  58.         /* invalidate instruction cache */
  59.         icbi    r0, p0
  60.         isync
  61. #ifdef INCLUDE_SHOW_ROUTINES
  62.         /* Add 1 to instrParityCount to measure no of parity errors */ 
  63.         lis     p0, HIADJ(instrParityCount)
  64.         addi    p0, p0, LO(instrParityCount)
  65.         lwz     p1, 0(p0)
  66.         addi    p1, p1, 1
  67.         stw     p1, 0(p0)
  68. #endif
  69.         /* return after invalidate */
  70.         mfspr   p0, SPRG6_R
  71.         mtcr    p0
  72.         mfspr   p0, SPRG4_R
  73.         mfspr   p1, SPRG5_R
  74.         isync     
  75.         rfmci /*.long   0x4c00004c*/
  76. ppcE500Mch_norm:
  77.         mfspr   p0, SPRG6_R
  78.         mtcr    p0
  79.         mfspr   p0, SPRG4_R
  80.         mfspr   p1, SPRG5_R
  81.         ba      0x200       /* _EXC_OFF_MACH */
  82. faultDetected:
  83.         /* rebooting, no need to save regs */
  84.         bl      chipErrataCpu29Print
  85.         li      p0, BOOT_NORMAL
  86.         b       sysToMonitor      /* reset */
  87. FUNC_END(sysIParityHandler)
  88. FUNC_LABEL(sysIParityHandlerEnd)
  89. /* Branch to above handler copied to _EXC_OFF_END */
  90. FUNC_BEGIN(jumpIParity)
  91. ba     sysIParityHandler
  92. FUNC_END(jumpIParity)