Energy Micro IEC60355 Library Project 1.037 GCC-Version
IEC60355 Library documentation and API

iec60335_class_b_cpureg_test_post_gcc.asm

Go to the documentation of this file.
00001 ;/***************************************************************************/
00030 .text
00031 
00032 .syntax unified
00033 .global ASMCPUregTestPOST
00034 .type   ASMCPUregTestPOST    , function
00035 
00036 .equ    testState           , 0
00037 .equ    testResult          , 4
00038 
00039 .equ    pattern1            , 0xAAAAAAAA
00040 .equ    pattern2            , 0xAAAAAAA8
00041 .equ    pattern3            , 0x55555555
00042 .equ    pattern4            , 0x55555554
00043 .equ    pattern5            , 0xA8000000
00044 .equ    pattern6            , 0x50000000
00045 .equ    pattern7            , 0x000000A0
00046 .equ    pattern8            , 0x00000060
00047 
00048 .equ    TestClear           , 0x00000000
00049 .equ    TestState_r0        , 0x00000010
00050 .equ    TestState_r1r7      , 0x00000020
00051 .equ    TestState_r8r12     , 0x00000040
00052 .equ    TestStateMSP        , 0x00000100
00053 .equ    TestStatePSP        , 0x00000200
00054 .equ    TestStateLR         , 0x00000400
00055 .equ    TestStateAPSR       , 0x00000800
00056 .equ    TestStatePRIMASK    , 0x00001000
00057 .equ    TestStateFAULTMASK  , 0x00002000
00058 .equ    TestStateBASEPRI    , 0x00004000
00059 
00060 .equ    TestResult_fail     , 0
00061 .equ    TestResult_pass     , 1
00062 
00063 ;/* CPU register test */
00064 .thumb
00065 .thumb_func
00066 ASMCPUregTestPOST:
00067 ;/* push registers to stack (atomic instruction) */
00068     push     {r0-r12,r14}
00069     mov      r12, lr
00070     cmp      r12, lr
00071     bne.w    Test_CPU_SFR_fail
00072 
00073 ;/* clear IEC60335_CPUregTestPOST */
00074     ldr      r0,  =TestClear
00075     ldr      r8,  =TestState_r0
00076     ldr      r9,  =IEC60335_CPUregTestPOST
00077     str      r8,  [r9,#testState]
00078     str      r0,  [r9,#testResult]
00079 
00080 ;/* registers r0-r7 tests */
00081 Test_r0:
00082 ;/* register r0 test:
00083 ; * r0 is tested first by immediate instructions
00084 ; * r0 is tested first to keep it free for the following tests */
00085 ;/* cmp instruction to compare with immediate values
00086 ; * byte test requires shift to the LSB */
00087 
00088 ;/* r0[31:24] */
00089     movw     r0,  #0x0000
00090     movt     r0,  #0xAA00
00091     lsr      r0,  r0, #24
00092     cmp      r0,  #0xAA
00093     bne.w    Test_r0_Exit
00094 ;/* r0[23:16] */
00095     movw     r0,  #0x0000
00096     movt     r0,  #0x00AA
00097     lsr      r0,  r0, #16
00098     cmp      r0,  #0xAA
00099     bne.w    Test_r0_Exit
00100 ;/* r0[15:8] */
00101     movw     r0,  #0xAA00
00102     lsr      r0,  r0, #8
00103     cmp      r0,  #0xAA
00104     bne.w    Test_r0_Exit
00105 ;/* r0[7:0] */
00106     movw     r0,  #0x00AA
00107     cmp      r0,  #0xAA
00108     bne.w    Test_r0_Exit
00109 
00110 ;/* use inverse pattern */
00111 ;/* r0[31:24] */
00112     movw     r0,  #0x0000
00113     movt     r0,  #0x5500
00114     lsr      r0,  r0, #24
00115     cmp      r0,  #0x55
00116     bne.w    Test_r0_Exit
00117 ;/* test r0[23:16] */
00118     movw     r0,  #0x0000
00119     movt     r0,  #0x0055
00120     lsr      r0,  r0, #16
00121     cmp      r0,  #0x55
00122     bne.w    Test_r0_Exit
00123 ;/* test r0[15:8] */
00124     movw     r0,  #0x5500
00125     lsr      r0,  r0, #8
00126     cmp      r0,  #0x55
00127     bne.w    Test_r0_Exit
00128 ;/* test r0[7:0] */
00129     movw     r0,  #0x0055
00130     cmp      r0,  #0x55
00131     bne.w    Test_r0_Exit
00132 
00133 ;/* mark r0 as passed by calling next test */
00134 Test_r0_pass:
00135 ;/* continue with result */
00136     b        Test_r1_r7
00137 
00138 Test_r1_r7:
00139 ;/* register r1-r7 test:
00140 ; * step 1:
00141 ; * each registers will be written with pattern1 = 0xAAAA.AAAA
00142 ; * each register will be compared to r0 for the test.
00143 ; * step 2:
00144 ; * the inverse pattern pattern3 = 0x5555.5555 is written to the
00145 ; * register and compared to r0 */
00146 
00147 ;/* clear IEC60335_CPUregTestPOST */
00148     ldr      r8,  =TestState_r1r7
00149     ldr      r7,  [r9]
00150     orr      r8,  r8, r7
00151     str      r8,  [r9,#testState]
00152 
00153 ;/* load pattern1 to r0 */
00154     ldr      r0,  =pattern1
00155 ;/* load pattern1 to r1-r7 */
00156     mov      r1,  r0
00157     mov      r2,  r0
00158     mov      r3,  r0
00159     mov      r4,  r0
00160     mov      r5,  r0
00161     mov      r6,  r0
00162     mov      r7,  r0
00163 ;/* test pattern1 */
00164     cmp      r1,  r0
00165     bne.w    Test_r1_r7_Exit
00166     cmp      r2,  r0
00167     bne.w    Test_r1_r7_Exit
00168     cmp      r3,  r0
00169     bne.w    Test_r1_r7_Exit
00170     cmp      r4,  r0
00171     bne.w    Test_r1_r7_Exit
00172     cmp      r5,  r0
00173     bne.w    Test_r1_r7_Exit
00174     cmp      r6,  r0
00175     bne.w    Test_r1_r7_Exit
00176     cmp      r7,  r0
00177     bne.w    Test_r1_r7_Exit
00178 
00179 ;/* load pattern3 to r0 */
00180     ldr      r0,  =pattern3
00181 ;/* load pattern3 to r1-r7 */
00182     mov      r1,  r0
00183     mov      r2,  r0
00184     mov      r3,  r0
00185     mov      r4,  r0
00186     mov      r5,  r0
00187     mov      r6,  r0
00188     mov      r7,  r0
00189 ;/* test pattern3 */
00190     cmp      r1,  r0
00191     bne.w    Test_r1_r7_Exit
00192     cmp      r2,  r0
00193     bne.w    Test_r1_r7_Exit
00194     cmp      r3,  r0
00195     bne.w    Test_r1_r7_Exit
00196     cmp      r4,  r0
00197     bne.w    Test_r1_r7_Exit
00198     cmp      r5,  r0
00199     bne.w    Test_r1_r7_Exit
00200     cmp      r6,  r0
00201     bne.w    Test_r1_r7_Exit
00202     cmp      r7,  r0
00203     bne.w    Test_r1_r7_Exit
00204 
00205 Test_r1_r7_pass:
00206 ;/* continue with result */
00207     b        Test_r8_r12
00208 
00209 ;/*    registers r8-r12 tests */
00210 Test_r8_r12:
00211 ;/* step 1:
00212 ; * each registers will be written with pattern1 = 0xAAAA.AAAA
00213 ; * each register will be compared to r0 for the test.
00214 ; * step 2:
00215 ; * the inverse pattern pattern3 = 0x5555.5555 is written to the
00216 ; * register and compared to r0 */
00217 
00218 ;/* save LR to r3 */
00219     mov      r3,  r12
00220 ;/* load IEC60335_CPUregTestPOST with test state */
00221     ldr      r5,  =TestState_r8r12
00222     ldr      r6,  =IEC60335_CPUregTestPOST
00223     ldr      r7,  [r6]
00224     orr      r5,  r5, r7
00225     str      r5,  [r6,#testState]
00226 
00227 ;/* load pattern1 to r0 */
00228     ldr      r0,  =pattern1
00229 ;/* load pattern1 to r8-r12 */
00230     mov      r8,  r0
00231     mov      r9,  r0
00232     mov      r10, r0
00233     mov      r11, r0
00234     mov      r12, r0
00235 ;/* test patter1 */
00236     cmp      r8,  r0
00237     bne.w    Test_r8_r12_Exit
00238     cmp      r9,  r0
00239     bne.w    Test_r8_r12_Exit
00240     cmp      r10, r0
00241     bne.w    Test_r8_r12_Exit
00242     cmp      r11, r0
00243     bne.w    Test_r8_r12_Exit
00244     cmp      r12, r0
00245     bne.w    Test_r8_r12_Exit
00246 
00247 ;/* load pattern3 to r0 */
00248     ldr      r0,  =pattern3
00249 ;/* load pattern3 to r8-r12 */
00250     mov      r8,  r0
00251     mov      r9,  r0
00252     mov      r10, r0
00253     mov      r11, r0
00254     mov      r12, r0
00255 ;/* test pattenr3 */
00256     cmp      r8,  r0
00257     bne.w    Test_r8_r12_Exit
00258     cmp      r9,  r0
00259     bne.w    Test_r8_r12_Exit
00260     cmp      r10, r0
00261     bne.w    Test_r8_r12_Exit
00262     cmp      r11, r0
00263     bne.w    Test_r8_r12_Exit
00264     cmp      r12, r0
00265     bne.w    Test_r8_r12_Exit
00266 
00267 Test_r8_r12_pass:
00268 ;/* restore LR */
00269     mov      r12, r3
00270 ;/* continue with result */
00271     b        Test_MSP
00272 
00273 Test_r8_r12_Exit:
00274 ;/* restore LR */
00275     mov      r12, r3
00276     b        Test_CPU_SFR_fail
00277 
00278 ;/* MainSP test: */
00279 Test_MSP:
00280 ;/* step 1:
00281 ; * select the MSP as stack pointer and
00282 ; * use mov command to read/write with different pattern
00283 ; * compare to r0 for the test.
00284 ; * step 2:
00285 ; * use mrs/msr command to read/write with different pattern
00286 ; * register and compared to r0
00287 ; * MSP[1:0] is always read as zero */
00288 
00289 ;/* save the CONTROL register value */
00290     mrs      r3,  CONTROL
00291 ;/* load IEC60335_CPUregTestPOST with test state */
00292     ldr      r8,  =TestStateMSP
00293     ldr      r9,  =IEC60335_CPUregTestPOST
00294     ldr      r10, [r9]
00295     orr      r8,  r8, r10
00296     str      r8,  [r9,#testState]
00297 
00298 ;/* set MSP as default stack */
00299     mov      r6,  #0x0
00300     msr      CONTROL, r6
00301 ;/* save current MSP content */
00302     mov      r4,  r13
00303 
00304 ;/* verify MSP as stack pointer */
00305     mrs      r5,  MSP
00306     cmp      r4,  r5
00307     bne      Test_MSP_Exit
00308 
00309 ;/* load pattern2 to MSP */
00310     ldr      r0,  =pattern2
00311     mov      r13, r0
00312 ;/* compare with r0 */
00313     cmp      r13, r0
00314     bne      Test_MSP_Exit
00315 
00316 ;/* load pattern4 to MSP */
00317     ldr      r0,  =pattern4
00318     mov      r13, r0
00319 ;/* compare with r0 */
00320     cmp      r13, r0
00321     bne      Test_MSP_Exit
00322 
00323 ;/* load pattern2 to MSP and read back r1 */
00324     ldr      r0,  =pattern2
00325     msr      MSP, r0
00326     mrs      r1,  MSP
00327 ;/* compare r1 with r0 (indirect) */
00328     cmp      r1,  r0
00329     bne      Test_MSP_Exit
00330 
00331 ;/* load pattern4 to MSP and read back r1 */
00332     ldr      r0,  =pattern4
00333     msr      MSP, r0
00334     mrs      r1,  MSP
00335 ;/* compare r1 with r0 (indirect) */
00336     cmp      r1,  r0
00337     bne      Test_MSP_Exit
00338 
00339 Test_MSP_pass:
00340 ;/* restore MSP and CONTROL */
00341     mov      r13, r4
00342     msr      CONTROL, r3
00343 ;/* continue with result */
00344     b        Test_PSP
00345 
00346 Test_MSP_Exit:
00347 ;/* restore MSP and CONTROL */
00348     mov      r13, r4
00349     msr      CONTROL, r3
00350     b        Test_CPU_SFR_fail
00351 
00352 ;/* PSP register test: */
00353 Test_PSP:
00354 ;/* step 1:
00355 ; * select the PSP as stack pointer and
00356 ; * use mov command to read/write with different pattern
00357 ; * compare to r0 for the test.
00358 ; * step 2:
00359 ; * use mrs/msr command to read/write with different pattern
00360 ; * register and compared to r0
00361 ; * PSP[1:0] is always read as zero */
00362 
00363 ;/* save the CONTROL register value */
00364     mrs      r3,  CONTROL
00365 
00366 ;/* load IEC60335_CPUregTestPOST with test state */
00367     ldr      r8,  =TestStatePSP
00368     ldr      r10, [r9]
00369     orr      r8,  r8, r10
00370     str      r8,  [r9,#testState]
00371 
00372 ;/* set PSP as default stack */
00373     mov      r6,  #0x02
00374     msr      CONTROL, r6
00375 ;/* save current PSP content */
00376     mrs      r4,  PSP
00377 
00378 ;/* verify PSP as stack pointer */
00379     mrs      r5,  PSP
00380     cmp      r4,  r5
00381     bne      Test_PSP_Exit
00382 ;/* Step1 */
00383 ;/* load pattern2 to PSP */
00384     ldr      r0,  =pattern2
00385     mov      r13, r0
00386 ;/* compare with r0 */
00387     cmp      r13, r0
00388     bne      Test_PSP_Exit
00389 
00390 ;/* load pattern4 to PSP */
00391     ldr      r0,  =pattern4
00392     mov      r13, r0
00393 ;/* compare with r0 */
00394     cmp      r13, r0
00395     bne      Test_PSP_Exit
00396 
00397 ;/* Step2 */
00398 ;/* load pattern2 to PSP and read back r1 */
00399     ldr      r0,  =pattern2
00400     msr      PSP, r0
00401     mrs      r1,  PSP
00402 ;/* compare r1 with r0 (indirect) */
00403     cmp      r1,  r0
00404     bne      Test_PSP_Exit
00405 
00406 ;/* load pattern4 to PSP and read back r1 */
00407     ldr      r0,  =pattern4
00408     msr      PSP, r0
00409     mrs      r1,  PSP
00410 ;/* compare r1 with r0 (indirect) */
00411     cmp      r1,  r0
00412     bne      Test_PSP_Exit
00413 
00414 Test_PSP_pass:
00415 ;/* restore CONTROL and PSP */
00416     msr      PSP, r4
00417     msr      CONTROL, r3
00418 ;/* continue with result */
00419     b        Test_LR
00420 
00421 Test_PSP_Exit:
00422 ;/* restore CONTROL and PSP */
00423     msr      PSP, r4
00424     msr      CONTROL, r3
00425     b        Test_CPU_SFR_fail
00426 
00427 ;/* LR register test: */
00428 Test_LR:
00429 ;/* step 1:
00430 ; * LR registers will be written with pattern1 = 0xAAAA.AAAA
00431 ; * and will be compared to r0 for the test.
00432 ; * step 2:
00433 ; * the inverse pattern pattern3 = 0x5555.5555 is written to the
00434 ; * register and compared to r0 */
00435 
00436 ;/* save the LR register content */
00437     mov      r3,  r14
00438 
00439 ;/* load IEC60335_CPUregTestPOST with test state */
00440     ldr      r8,  =TestStateLR
00441     ldr      r10, [r9]
00442     orr      r8,  r8, r10
00443     str      r8,  [r9,#testState]
00444 
00445 ;/* load pattern1 to LR */
00446     ldr      r0,  =pattern1
00447     mov      r14, r0
00448 ;/* compare with r0 */
00449     cmp      r14, r0
00450     bne      Test_LR_Exit
00451 
00452 ;/* load pattern3 to LR */
00453     ldr      r0,  =pattern3
00454     mov      r14, r0
00455 ;/* compare with r0 */
00456     cmp      r14, r0
00457     bne      Test_LR_Exit
00458 
00459 Test_LR_pass:
00460 ;/* restore LR register */
00461     mov      r14, r3
00462 ;/* continue with result */
00463     b        Test_APSR
00464 
00465 Test_LR_Exit:
00466 ;/* restore LR register and branch to eror condition */
00467     mov      r14, r3
00468     b        Test_CPU_SFR_fail
00469 
00470 ;/* APSR register test: */
00471 Test_APSR:
00472 ;/* step 1:
00473 ; * APSR registers will be written with pattern5 = 0xA800.0000
00474 ; * and will be compared to r0 for the test.
00475 ; * step 2:
00476 ; * the inverse pattern pattern6 = 0x5000.0000 is written to the
00477 ; * register and read back to r1 and compared to r0
00478 ; * IPSR and EPSR are read-only */
00479 
00480 ;/* save the APSR register content */
00481     mrs      r3,  APSR
00482 
00483 ;/* load IEC60335_CPUregTestPOST with test state */
00484     ldr      r8,  =TestStateAPSR
00485     ldr      r10, [r9]
00486     orr      r8,  r8, r10
00487     str      r8,  [r9,#testState]
00488 
00489 ;/* load pattern5 to APSR */
00490     ldr      r0,  =pattern5
00491     msr      APSR, r0
00492 ;/* read and compare with r0 */
00493     mrs      r1,  APSR
00494     cmp      r1,  r0
00495     bne      Test_APSR_Exit
00496 
00497 ;/* load pattern6 to APSR */
00498     ldr      r0,  =pattern6
00499     msr      APSR, r0
00500 ;/* read and compare with r0 */
00501     mrs      r1,  APSR
00502     cmp      r1,  r0
00503     bne      Test_APSR_Exit
00504 
00505 Test_APSR_pass:
00506 ;/* restore APSR register */
00507     msr      APSR, r3
00508 ;/* continue with result */
00509     b        Test_PRIMASK
00510 
00511 Test_APSR_Exit:
00512 ;/* restore APSR register and branch to eror condition */
00513     msr      APSR, r3
00514     b        Test_CPU_SFR_fail
00515 
00516 
00517 ;/* PRIMASK register test: */
00518 Test_PRIMASK:
00519 ;/* step 1:
00520 ; * PRIMASK registers [:0] will be written with 0x0000.0000
00521 ; * and will be compared to r0 for the test.
00522 ; * step 2:
00523 ; * the inverse pattern 0x0000.0001 is written to the
00524 ; * register and read back to r1 and compared to r0 */
00525 
00526 ;/* save the PRIMASK register content */
00527     mrs      r3,  PRIMASK
00528 
00529 ;/* load IEC60335_CPUregTestPOST with test state */
00530     ldr      r8,  =TestStatePRIMASK
00531     ldr      r10, [r9]
00532     orr      r8,  r8, r10
00533     str      r8,  [r9,#testState]
00534 
00535 ;/* load pattern to PRIMASK */
00536     mov      r0,  #0
00537     msr      PRIMASK, r0
00538 ;/* read and compare with r0 */
00539     mrs      r1,  PRIMASK
00540     cmp      r1,  r0
00541     bne      Test_PRIMASK_Exit
00542 
00543 ;/* load pattern to PRIMASK */
00544     mov      r0,  #1
00545     msr      PRIMASK, r0
00546 ;/* read and compare with r0 */
00547     mrs      r1,  PRIMASK
00548     cmp      r1,  r0
00549     bne      Test_PRIMASK_Exit
00550 
00551 Test_PRIMASK_pass:
00552 ;/* restore PRIMASK register */
00553     msr      PRIMASK, r3
00554 ;/* continue with result */
00555     b        Test_FAULTMASK
00556 
00557 Test_PRIMASK_Exit:
00558 ;/* restore PRIMASK register */
00559     msr        PRIMASK, r3
00560     b        Test_CPU_SFR_fail
00561 
00562 ;/* FAULTMASK register test: */
00563 Test_FAULTMASK:
00564 ;/* step 1:
00565 ; * FAULTMASK registers [:0] will be written with 0x0000.0000
00566 ; * and will be compared to r0 for the test.
00567 ; * step 2:
00568 ; * the inverse pattern 0x0000.0001 is written to the
00569 ; * register and read back to r1 and compared to r0 */
00570 
00571 ;/* save the FAULTMASK register content */
00572     mrs        r3,  FAULTMASK
00573 
00574 ;/* load IEC60335_CPUregTestPOST with test state */
00575     ldr        r8,  =TestStateFAULTMASK
00576     ldr        r10, [r9]
00577     orr        r8,  r8, r10
00578     str        r8,  [r9,#testState]
00579 
00580 ;/* load pattern to FAULTMASK */
00581     mov        r0,  #0
00582     msr        FAULTMASK, r0
00583 ;/* read and compare with r0 */
00584     mrs        r1,  FAULTMASK
00585     cmp        r1,  r0
00586     bne        Test_FAULTMASK_Exit
00587 
00588 ;/* load pattern to FAULTMASK */
00589     mov        r0,  #1
00590     msr        FAULTMASK, r0
00591 ;/* read and compare with r0 */
00592     mrs        r1,  FAULTMASK
00593     cmp        r1,  r0
00594     bne        Test_FAULTMASK_Exit
00595 
00596 Test_FAULTMASK_pass:
00597 ;/* restore FAULTMASK register */
00598     msr        FAULTMASK, r3
00599 ;/* continue with result */
00600     b        Test_BASEPRI
00601 
00602 Test_FAULTMASK_Exit:
00603 ;/* restore FAULTMASK register */
00604     msr        FAULTMASK, r3
00605     b        Test_CPU_SFR_fail
00606 
00607 ;/* BASEPRI register test: */
00608 Test_BASEPRI:
00609 ;/* step 1:
00610 ; * BASEPRI registers [7:0] will be written with pattern7 = 0x0000.00A0
00611 ; * and will be compared to r0 for the test.
00612 ; * step 2:
00613 ; * the inverse pattern pattern8 = 0x0000.0055 is written to the
00614 ; * register and read back to r1 and compared to r0
00615 ; * BASEPRI[4:0] are read as 0 */
00616 
00617 ;/* save the BASEPRI register content */
00618     mrs        r3,  BASEPRI
00619 
00620 ;/* load IEC60335_CPUregTestPOST with test state */
00621     ldr        r8,  =TestStateBASEPRI
00622     ldr        r10, [r9]
00623     orr        r8,  r8, r10
00624     str        r8,  [r9,#testState]
00625 
00626 ;/* load pattern7 to BASEPRI */
00627     ldr        r0,  =pattern7
00628     msr        BASEPRI, r0
00629 ;/* read and compare with r0 */
00630     mrs        r1,  BASEPRI
00631     cmp        r1,  r0
00632     bne        Test_BASEPRI_Exit
00633 
00634 ;/* load pattern8 to BASEPRI */
00635     ldr        r0,  =pattern8
00636     msr        BASEPRI, r0
00637 ;/* read and compare with r0 */
00638     mrs        r1,  BASEPRI
00639     cmp        r1,  r0
00640     bne        Test_BASEPRI_Exit
00641 
00642 Test_BASEPRI_pass:
00643 ;/* restore BASEPRI register */
00644     msr        BASEPRI, r3
00645 ;/* load IEC60335_CPUregTestPOST with pass result */
00646     ldr        r0,  =TestResult_pass
00647     str        r0,  [r9,#testResult]
00648 ;/* continue with result */
00649     b        Test_CPU_SFR_Exit
00650 
00651 Test_BASEPRI_Exit:
00652 ;    /* Restore the BASEPRI */
00653     msr        BASEPRI, r3
00654     b        Test_CPU_SFR_fail
00655 
00656 Test_r0_Exit:
00657 Test_r1_r7_Exit:
00658 Test_CPU_SFR_fail:
00659 ;/* returns a positiv test result */
00660     ldr        r0,  =TestResult_fail
00661     str        r0,  [r9,#testResult]
00662 
00663 Test_CPU_SFR_Exit:
00664 ;/* pop the stack back to registers (atomic instruction) */
00665     pop        {r0-r12,r14}
00666 ;/* branch with exchange back */
00667     bx         lr
00668 ;/* end of CPU SFR registers tests */
00669 .end