| //Original:/proj/frio/dv/testcases/core/c_progctrl_except_rtx/c_progctrl_except_rtx.dsp | |
| // Spec Reference: c_progctrl_except_rtx | |
| # mach: bfin | |
| # sim: --environment operating | |
| #include "test.h" | |
| .include "testutils.inc" | |
| start | |
| include(std.inc) | |
| include(selfcheck.inc) | |
| INIT_R_REGS(0); | |
| INIT_P_REGS(0); | |
| //CHECK_INIT(p5, 0xe0000000); | |
| include(symtable.inc) | |
| CHECK_INIT_DEF(p5); | |
| // load address of exception handler | |
| P0 = 0x200C (Z); // 0xFFE0200C EVT3 EXCEPTION | |
| P0.H = 0xFFE0; | |
| R0 = exception_handler (Z); // wr address of exception handler to MMR EVT3 | |
| R0.H = exception_handler; | |
| [ P0 ] = R0; | |
| // Jump to User mode and enable exceptions | |
| R0 = MidUserCode (Z); | |
| R0.H = MidUserCode; | |
| RETI = R0; | |
| RTI; // cause it to go to Midusercode, .dd cause exception | |
| BeginUserCode: | |
| P1 = 1; | |
| P2 = 2; | |
| P3 = 3; | |
| P4 = 4; | |
| CHECKREG(r0, 0x00000000); | |
| CHECKREG(r1, 0x00000001); | |
| CHECKREG(r2, 0x00000002); | |
| CHECKREG(r3, 0x00000003); | |
| CHECKREG(r5, 0x00000000); | |
| CHECKREG(r6, 0x00000000); | |
| CHECKREG(r7, 0x00000000); | |
| CHECKREG(p1, 0x00000001); | |
| CHECKREG(p2, 0x00000002); | |
| CHECKREG(p3, 0x00000003); | |
| CHECKREG(p4, 0x00000004); | |
| dbg_pass; | |
| //jump 2; | |
| //jump -2; | |
| .dd 0xFFFFFFFF | |
| .dd 0xFFFFFFFF | |
| .dd 0xFFFFFFFF | |
| .dd 0xFFFFFFFF | |
| .dd 0xFFFFFFFF | |
| .dd 0xFFFFFFFF | |
| .dd 0xFFFFFFFF | |
| .dd 0xFFFFFFFF | |
| //dbg_pass; | |
| MidUserCode: | |
| .dd 0xFFFFFFFF | |
| R0 = 0; | |
| R1 = 1; | |
| R2 = 2; | |
| R3 = 3; | |
| CC = R0; | |
| IF !CC JUMP BeginUserCode; | |
| .dd 0xFFFFFFFF | |
| .dd 0xFFFFFFFF | |
| .dd 0xFFFFFFFF | |
| .dd 0xFFFFFFFF | |
| .dd 0xFFFFFFFF | |
| .dd 0xFFFFFFFF | |
| .dd 0xFFFFFFFF | |
| .dd 0xFFFFFFFF | |
| exception_handler: | |
| R4 = RETX; // error handler: RETX has the address of the same Illegal instr | |
| R1 += 1; | |
| R2 += 2; | |
| R3 += 3; | |
| R1 += 1; | |
| R4 += 4; // we have to add 4 to point to next instr after return | |
| RETX = R4; | |
| RTX; // return from exception | |
| .section MEM_DATA_ADDR_1,"aw" | |
| .dd 0xDEADBEEF | |
| .dd 0xBAD00BAD |