aboutsummaryrefslogtreecommitdiff
path: root/sim/testsuite/bfin/cec-exact-exception.S
diff options
context:
space:
mode:
Diffstat (limited to 'sim/testsuite/bfin/cec-exact-exception.S')
-rw-r--r--sim/testsuite/bfin/cec-exact-exception.S54
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