summaryrefslogtreecommitdiff
path: root/sim/testsuite/sim/bfin/cec-snen-reti.S
blob: 306d99b0ecd966b261a2b3bd7756a16363c6ae10 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# Blackfin testcase for having RETI LSB set correctly when self nested
# mach: bfin
# sim: --environment operating

#include "test.h"
	.include "testutils.inc"

	start

	# Set our handler
	imm32 P5, EVT11;
	loadsym R1, _ivg11;
	[P5] = R1;
	loadsym R1, _fail_lvl;
	[P5 + 4] = R1;	/* IVG12 */
	[P5 + 12] = R1;	/* IVG14 */
	loadsym R1, _ivg13;
	[P5 + 8] = R1;

	# Enable self nesting
	R2 = SYSCFG;
	BITSET (R2, 2);
	SYSCFG = R2;
	CSYNC;

	# Enable IVG11/IVG13/IVG14 but not IVG12
	cli R3;
	BITSET (R3, 11);
	BITCLR (R3, 12);
	BITSET (R3, 13);
	BITSET (R3, 14);
	sti R3;

	# Counter to keep track of nesting depth
	R7 = 0;

	# Lower ourselves to IVG11
	loadsym R4, _fail_lvl;
	RETI = R4;
	RAISE 11;
	RAISE 12;
	RAISE 13;
	RAISE 14;
	RTI;

# This IVG makes sure RETI LSB is set correctly on transition in (RAISE)
_ivg11:
	R0 = RETI;

	# Make sure we are indeed at IVG11
	imm32 P0, IPEND;
	R1 = [P0];
	CC = BITTST (R1, 11);
	IF !CC JUMP _fail_lvl;

	# Make sure LSB of RETI is set only on first pass
	CC = ! BITTST (R0, 0);
	R1 = CC;
	CC = R7 == 0;
	R2 = CC;
	CC = R1 == R2;
	IF !CC JUMP _fail_lvl;

	# Nest ourselves a few times
	R6 = 3;
	CC = R7 < R6;
	IF !CC JUMP 1f;
	[--sp] = RETI;
	R7 += 1;
	RAISE 11;
	MNOP;
	JUMP _fail_lvl;

	# Move down to IVG13 for next test
1:	loadsym R4, _fail_lvl;
	RETI = R4;
	RTI;

# This IVG makes sure RETI LSB is respected on transition out (RTI)
_ivg13:
	R0 = RETI;

	# Make sure we are indeed at IVG13
	imm32 P0, IPEND;
	R1 = [P0];
	CC = BITTST (R1, 13);
	IF !CC JUMP _fail_lvl;

	# RETI LSB should be set when re-entering IVG13
	CC = ! BITTST (R0, 0);
	R1 = CC;
	CC = R7 == R6;
	R2 = CC;
	CC = R1 == R2;
	IF !CC JUMP _fail_lvl;

	# Should get here only after a few IVG11 tests
	CC = R7 < R6;
	IF CC JUMP _fail_lvl;

	# Make sure IVG13 isn't pending
	imm32 P0, ILAT;
	R1 = [P0];
	CC = BITTST (R1, 13);
	IF CC JUMP _fail_lvl;

	# Manually set RETI to with LSB set so we return there
	R5 = R6;
	R5 += 3;
	CC = R7 < R5;
	IF !CC JUMP 1f;
	loadsym R1, _ivg13;
	BITSET (R1, 0);
	RETI = R1;
	R7 += 1;
	RTI;

	# All done!
1:	dbg_pass

_fail_lvl:
	dbg_fail;