| //Original:/proj/frio/dv/testcases/lmu/lmu_excpt_align/lmu_excpt_align.dsp |
| // Description: LMU data alignment exceptions |
| # mach: bfin |
| # sim: --environment operating |
| |
| #include "test.h" |
| .include "testutils.inc" |
| start |
| |
| include(selfcheck.inc) |
| include(std.inc) |
| include(mmrs.inc) |
| |
| CHECK_INIT(p5, 0xE0000000); |
| |
| // test address for DAG0 |
| // test address for DAG1 |
| |
| // setup interrupt controller with exception handler address |
| WR_MMR_LABEL(EVT3, handler, p0, r1); |
| |
| // Write fault addr MMR to known state |
| WR_MMR(DCPLB_FAULT_ADDR, 0, p0, r6); |
| |
| //nop;nop;nop;nop;nop; // in lieu of CSYNC |
| CSYNC; |
| |
| A0 = 0; |
| |
| // go to user mode. and enable exceptions |
| LD32_LABEL(r0, User); |
| RETI = R0; |
| RTI; |
| |
| // Nops to work around ICache bug |
| NOP;NOP;NOP;NOP;NOP; |
| NOP;NOP;NOP;NOP;NOP; |
| |
| |
| User: |
| NOP;NOP;NOP;NOP;NOP; |
| |
| //------------------------------------------------------- |
| // First do stores |
| //------------------------------------------------------- |
| // 16-bit alignment, DAG0 |
| |
| |
| |
| LD32(i1, ((0x1000 + 1))); |
| LD32(p2, ((0x1000 + 1) & 0xFFFFFFFE)); // Aligned version |
| LD32(r1, 0xDEADBEEF); |
| R5 = 0;R6 = 0;R7 = 0; // Exception handler will set these, reset them first |
| |
| X01: W [ I1 ] = R1.L; // Exception should occur here |
| |
| CHECKREG(r5,0x24); // supv and EXCPT_ALIGN |
| CHECKREG(r6, (0x1000 + 1)); // FAULT_ADDR should contain fail address |
| CHECKREG_SYM(r7, X01, r0); // RETX should be value of X01 (HARDCODED ADDR!!) |
| |
| |
| //------------------------------------------------------- |
| // 32-bit alignment, DAG0 |
| |
| |
| |
| LD32(i1, ((0x1000 + 1))); |
| LD32(p2, ((0x1000 + 1) & 0xFFFFFFFC)); // Aligned version |
| LD32(r1, 0xDEADBEEF); |
| R5 = 0;R6 = 0;R7 = 0; // Exception handler will set these, reset them first |
| |
| X02: [ I1 ] = R1; // Exception should occur here |
| |
| CHECKREG(r5,0x24); // supv and EXCPT_ALIGN |
| CHECKREG(r6, (0x1000 + 1)); // FAULT_ADDR should contain fail address |
| CHECKREG_SYM(r7, X02, r0); // RETX should be value of X02 (HARDCODED ADDR!!) |
| |
| |
| //------------------------------------------------------- |
| // 32-bit alignment, DAG0 |
| |
| |
| |
| LD32(i1, ((0x1000 + 2))); |
| LD32(p2, ((0x1000 + 2) & 0xFFFFFFFC)); // Aligned version |
| LD32(r1, 0xDEADBEEF); |
| R5 = 0;R6 = 0;R7 = 0; // Exception handler will set these, reset them first |
| |
| X03: [ I1 ] = R1; // Exception should occur here |
| |
| CHECKREG(r5,0x24); // supv and EXCPT_ALIGN |
| CHECKREG(r6, (0x1000 + 2)); // FAULT_ADDR should contain fail address |
| CHECKREG_SYM(r7, X03, r0); // RETX should be value of X03 (HARDCODED ADDR!!) |
| |
| |
| //------------------------------------------------------- |
| // 32-bit alignment, DAG0 |
| |
| |
| |
| LD32(i1, ((0x1000 + 3))); |
| LD32(p2, ((0x1000 + 3) & 0xFFFFFFFC)); // Aligned version |
| LD32(r1, 0xDEADBEEF); |
| R5 = 0;R6 = 0;R7 = 0; // Exception handler will set these, reset them first |
| |
| X04: [ I1 ] = R1; // Exception should occur here |
| |
| CHECKREG(r5,0x24); // supv and EXCPT_ALIGN |
| CHECKREG(r6, (0x1000 + 3)); // FAULT_ADDR should contain fail address |
| CHECKREG_SYM(r7, X04, r0); // RETX should be value of X04 (HARDCODED ADDR!!) |
| |
| |
| //------------------------------------------------------- |
| // 16-bit alignment, DAG1 |
| |
| |
| |
| LD32(i1, ((0x1000 + 1))); |
| LD32(p2, ((0x1000 + 1) & 0xFFFFFFFE)); // Aligned version |
| LD32(r1, 0xDEADBEEF); |
| R5 = 0;R6 = 0;R7 = 0; // Exception handler will set these, reset them first |
| |
| X05: A0 = 0 || NOP || W [ I1 ] = R1.L; // Exception should occur here |
| |
| CHECKREG(r5,0x24); // supv and EXCPT_ALIGN |
| CHECKREG(r6, (0x1000 + 1)); // FAULT_ADDR should contain fail address |
| CHECKREG_SYM(r7, X05, r0); // RETX should be value of X05 (HARDCODED ADDR!!) |
| |
| |
| //------------------------------------------------------- |
| // 32-bit alignment, DAG1 |
| |
| |
| |
| LD32(i1, ((0x1000 + 1))); |
| LD32(p2, ((0x1000 + 1) & 0xFFFFFFFC)); // Aligned version |
| LD32(r1, 0xDEADBEEF); |
| R5 = 0;R6 = 0;R7 = 0; // Exception handler will set these, reset them first |
| |
| X06: A0 = 0 || NOP || [ I1 ] = R1; // Exception should occur here |
| |
| CHECKREG(r5,0x24); // supv and EXCPT_ALIGN |
| CHECKREG(r6, (0x1000 + 1)); // FAULT_ADDR should contain fail address |
| CHECKREG_SYM(r7, X06, r0); // RETX should be value of X06 (HARDCODED ADDR!!) |
| |
| |
| //------------------------------------------------------- |
| // 32-bit alignment, DAG1 |
| |
| |
| |
| LD32(i1, ((0x1000 + 2))); |
| LD32(p2, ((0x1000 + 2) & 0xFFFFFFFC)); // Aligned version |
| LD32(r1, 0xDEADBEEF); |
| R5 = 0;R6 = 0;R7 = 0; // Exception handler will set these, reset them first |
| |
| X07: A0 = 0 || NOP || [ I1 ] = R1; // Exception should occur here |
| |
| CHECKREG(r5,0x24); // supv and EXCPT_ALIGN |
| CHECKREG(r6, (0x1000 + 2)); // FAULT_ADDR should contain fail address |
| CHECKREG_SYM(r7, X07, r0); // RETX should be value of X07 (HARDCODED ADDR!!) |
| |
| |
| //------------------------------------------------------- |
| // 32-bit alignment, DAG1 |
| |
| |
| |
| LD32(i1, ((0x1000 + 3))); |
| LD32(p2, ((0x1000 + 3) & 0xFFFFFFFC)); // Aligned version |
| LD32(r1, 0xDEADBEEF); |
| R5 = 0;R6 = 0;R7 = 0; // Exception handler will set these, reset them first |
| |
| X08: A0 = 0 || NOP || [ I1 ] = R1; // Exception should occur here |
| |
| CHECKREG(r5,0x24); // supv and EXCPT_ALIGN |
| CHECKREG(r6, (0x1000 + 3)); // FAULT_ADDR should contain fail address |
| CHECKREG_SYM(r7, X08, r0); // RETX should be value of X08 (HARDCODED ADDR!!) |
| |
| |
| //------------------------------------------------------- |
| // Now repeat for Loads |
| //------------------------------------------------------- |
| // 16-bit alignment, DAG0 |
| |
| |
| |
| LD32(i1, ((0x1000 + 1))); |
| LD32(p2, ((0x1000 + 1) & 0xFFFFFFFE)); // Aligned version |
| LD32(r1, 0xDEADBEEF); |
| R5 = 0;R6 = 0;R7 = 0; // Exception handler will set these, reset them first |
| |
| X11: R1.L = W [ I1 ]; // Exception should occur here |
| |
| CHECKREG(r5,0x24); // supv and EXCPT_ALIGN |
| CHECKREG(r6, (0x1000 + 1)); // FAULT_ADDR should contain fail address |
| CHECKREG_SYM(r7, X11, r0); // RETX should be value of X11 (HARDCODED ADDR!!) |
| |
| |
| //------------------------------------------------------- |
| // 32-bit alignment, DAG0 |
| |
| |
| |
| LD32(i1, ((0x1000 + 1))); |
| LD32(p2, ((0x1000 + 1) & 0xFFFFFFFC)); // Aligned version |
| LD32(r1, 0xDEADBEEF); |
| R5 = 0;R6 = 0;R7 = 0; // Exception handler will set these, reset them first |
| |
| X12: R1 = [ I1 ]; // Exception should occur here |
| |
| CHECKREG(r5,0x24); // supv and EXCPT_ALIGN |
| CHECKREG(r6, (0x1000 + 1)); // FAULT_ADDR should contain fail address |
| CHECKREG_SYM(r7, X12, r0); // RETX should be value of X12 (HARDCODED ADDR!!) |
| |
| |
| //------------------------------------------------------- |
| // 32-bit alignment, DAG0 |
| |
| |
| |
| LD32(i1, ((0x1000 + 2))); |
| LD32(p2, ((0x1000 + 2) & 0xFFFFFFFC)); // Aligned version |
| LD32(r1, 0xDEADBEEF); |
| R5 = 0;R6 = 0;R7 = 0; // Exception handler will set these, reset them first |
| |
| X13: R1 = [ I1 ]; // Exception should occur here |
| |
| CHECKREG(r5,0x24); // supv and EXCPT_ALIGN |
| CHECKREG(r6, (0x1000 + 2)); // FAULT_ADDR should contain fail address |
| CHECKREG_SYM(r7, X13, r0); // RETX should be value of X13 (HARDCODED ADDR!!) |
| |
| |
| //------------------------------------------------------- |
| // 32-bit alignment, DAG0 |
| |
| |
| |
| LD32(i1, ((0x1000 + 3))); |
| LD32(p2, ((0x1000 + 3) & 0xFFFFFFFC)); // Aligned version |
| LD32(r1, 0xDEADBEEF); |
| R5 = 0;R6 = 0;R7 = 0; // Exception handler will set these, reset them first |
| |
| X14: R1 = [ I1 ]; // Exception should occur here |
| |
| CHECKREG(r5,0x24); // supv and EXCPT_ALIGN |
| CHECKREG(r6, (0x1000 + 3)); // FAULT_ADDR should contain fail address |
| CHECKREG_SYM(r7, X14, r0); // RETX should be value of X14 (HARDCODED ADDR!!) |
| |
| |
| //------------------------------------------------------- |
| // 16-bit alignment, DAG1 |
| |
| |
| |
| LD32(i1, ((0x1000 + 1))); |
| LD32(p2, ((0x1000 + 1) & 0xFFFFFFFE)); // Aligned version |
| LD32(r1, 0xDEADBEEF); |
| R5 = 0;R6 = 0;R7 = 0; // Exception handler will set these, reset them first |
| |
| X15: A0 = 0 || NOP || R1.L = W [ I1 ]; // Exception should occur here |
| |
| CHECKREG(r5,0x24); // supv and EXCPT_ALIGN |
| CHECKREG(r6, (0x1000 + 1)); // FAULT_ADDR should contain fail address |
| CHECKREG_SYM(r7, X15, r0); // RETX should be value of X15 (HARDCODED ADDR!!) |
| |
| |
| //------------------------------------------------------- |
| // 32-bit alignment, DAG1 |
| |
| |
| |
| LD32(i1, ((0x1000 + 1))); |
| LD32(p2, ((0x1000 + 1) & 0xFFFFFFFC)); // Aligned version |
| LD32(r1, 0xDEADBEEF); |
| R5 = 0;R6 = 0;R7 = 0; // Exception handler will set these, reset them first |
| |
| X16: A0 = 0 || NOP || R1 = [ I1 ]; // Exception should occur here |
| |
| CHECKREG(r5,0x24); // supv and EXCPT_ALIGN |
| CHECKREG(r6, (0x1000 + 1)); // FAULT_ADDR should contain fail address |
| CHECKREG_SYM(r7, X16, r0); // RETX should be value of X16 (HARDCODED ADDR!!) |
| |
| |
| //------------------------------------------------------- |
| // 32-bit alignment, DAG1 |
| |
| |
| |
| LD32(i1, ((0x1000 + 2))); |
| LD32(p2, ((0x1000 + 2) & 0xFFFFFFFC)); // Aligned version |
| LD32(r1, 0xDEADBEEF); |
| R5 = 0;R6 = 0;R7 = 0; // Exception handler will set these, reset them first |
| |
| X17: A0 = 0 || NOP || R1 = [ I1 ]; // Exception should occur here |
| |
| CHECKREG(r5,0x24); // supv and EXCPT_ALIGN |
| CHECKREG(r6, (0x1000 + 2)); // FAULT_ADDR should contain fail address |
| CHECKREG_SYM(r7, X17, r0); // RETX should be value of X17 (HARDCODED ADDR!!) |
| |
| |
| //------------------------------------------------------- |
| // 32-bit alignment, DAG1 |
| |
| |
| |
| LD32(i1, ((0x1000 + 3))); |
| LD32(p2, ((0x1000 + 3) & 0xFFFFFFFC)); // Aligned version |
| LD32(r1, 0xDEADBEEF); |
| R5 = 0;R6 = 0;R7 = 0; // Exception handler will set these, reset them first |
| |
| X18: A0 = 0 || NOP || R1 = [ I1 ]; // Exception should occur here |
| |
| CHECKREG(r5,0x24); // supv and EXCPT_ALIGN |
| CHECKREG(r6, (0x1000 + 3)); // FAULT_ADDR should contain fail address |
| CHECKREG_SYM(r7, X18, r0); // RETX should be value of X18 (HARDCODED ADDR!!) |
| |
| |
| //------------------------------------------------------- |
| dbg_pass; |
| |
| |
| handler: |
| R5 = SEQSTAT; // Get exception cause |
| |
| // read and check fail addr (addr_which_causes_exception) |
| // should not be set for alignment exception |
| RD_MMR(DCPLB_FAULT_ADDR, p0, r6); |
| |
| R7 = RETX; // get address of excepting instruction |
| |
| // align the offending address |
| I1 = P2; |
| |
| RTX; |
| // Nops to work around ICache bug |
| NOP;NOP;NOP;NOP;NOP; |
| NOP;NOP;NOP;NOP;NOP; |
| |
| |
| .section MEM_0x1000,"aw" |
| .dd 0x00000000 |
| .dd 0x00000000 |
| .dd 0x00000000 |
| .dd 0x00000000 |