| # Blackfin testcase for aborting an excepting insn immediately |
| # mach: bfin |
| # sim: --environment operating |
| |
| #include "test.h" |
| .include "testutils.inc" |
| |
| # This test keeps P5 as the base of the EVT table |
| |
| .macro set_evt lvl:req, sym:req |
| loadsym R1, \sym; |
| [P5 + 4 * \lvl\()] = R1; |
| .endm |
| |
| start |
| |
| # Set up exception handler |
| imm32 P4, EVT3; |
| loadsym R1, _evx; |
| [P4] = R1; |
| |
| # Lower ourselves to userspace |
| loadsym R1, _user; |
| RETI = R1; |
| RTI; |
| |
| _user: |
| imm32 R0, 0x12345678; |
| R1 = R0; |
| imm32 P0, 0xffffffff; |
| P1 = P0; |
| _user_fail: |
| # Sometimes this even causes immediate double faults when |
| # exceptions are not exact since this may trigger multiple |
| R0 = [P0++]; |
| |
| JUMP fail_lvl; |
| |
| _evx: |
| # RETX should be pointing to the right place |
| loadsym R6, _user_fail; |
| R7 = RETX; |
| CC = R6 == R7; |
| IF !CC JUMP fail_lvl; |
| |
| # R0 and P0 should be unchanged |
| CC = R1 == R0; |
| IF !CC JUMP fail_lvl; |
| CC = P1 == P0; |
| IF !CC JUMP fail_lvl; |
| |
| dbg_pass |
| fail_lvl: |
| dbg_fail |