diff options
Diffstat (limited to 'sim/testsuite/bfin/cec-exact-exception.S')
-rw-r--r-- | sim/testsuite/bfin/cec-exact-exception.S | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/sim/testsuite/bfin/cec-exact-exception.S b/sim/testsuite/bfin/cec-exact-exception.S new file mode 100644 index 0000000..fd22f94 --- /dev/null +++ b/sim/testsuite/bfin/cec-exact-exception.S @@ -0,0 +1,54 @@ +# 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 |