1# Blackfin testcase for aborting an excepting insn immediately
2# mach: bfin
3# sim: --environment operating
4
5#include "test.h"
6	.include "testutils.inc"
7
8	# This test keeps P5 as the base of the EVT table
9
10	.macro set_evt lvl:req, sym:req
11	loadsym R1, \sym;
12	[P5 + 4 * \lvl\()] = R1;
13	.endm
14
15	start
16
17	# Set up exception handler
18	imm32 P4, EVT3;
19	loadsym R1, _evx;
20	[P4] = R1;
21
22	# Lower ourselves to userspace
23	loadsym R1, _user;
24	RETI = R1;
25	RTI;
26
27_user:
28	imm32 R0, 0x12345678;
29	R1 = R0;
30	imm32 P0, 0xffffffff;
31	P1 = P0;
32_user_fail:
33	# Sometimes this even causes immediate double faults when
34	# exceptions are not exact since this may trigger multiple
35	R0 = [P0++];
36
37	JUMP fail_lvl;
38
39_evx:
40	# RETX should be pointing to the right place
41	loadsym R6, _user_fail;
42	R7 = RETX;
43	CC = R6 == R7;
44	IF !CC JUMP fail_lvl;
45
46	# R0 and P0 should be unchanged
47	CC = R1 == R0;
48	IF !CC JUMP fail_lvl;
49	CC = P1 == P0;
50	IF !CC JUMP fail_lvl;
51
52	dbg_pass
53fail_lvl:
54	dbg_fail
55