182 lines
3.4 KiB
ArmAsm
182 lines
3.4 KiB
ArmAsm
# Blackfin testcase for multiple pending IVGs vs masked state
|
|
# 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
|
|
|
|
.macro check_cec mmr:req, valid:req
|
|
imm32 P3, \mmr;
|
|
R0 = [P3];
|
|
R1 = ~0x1f;
|
|
R0 = R0 & R1;
|
|
imm32 R1, \valid;
|
|
CC = R1 == R0;
|
|
IF CC JUMP 1f;
|
|
dbg_fail
|
|
1:
|
|
.endm
|
|
|
|
.macro delay cnt:req
|
|
imm32 P2, \cnt
|
|
LSETUP (1f, 1f) LC1 = P2;
|
|
1: mnop;
|
|
.endm
|
|
|
|
start
|
|
|
|
# First mark all EVTs as fails (they shouldn't be activated)
|
|
imm32 P5, EVT0;
|
|
P1 = P5;
|
|
loadsym R1, fail_lvl
|
|
imm32 P2, 16
|
|
LSETUP (1f, 1f) LC0 = P2;
|
|
1: [P1++] = R1;
|
|
|
|
# Lower ourselves to EVT15
|
|
set_evt 15, evt15;
|
|
R7 = 0 (x);
|
|
BITSET (R7, 15);
|
|
sti R7;
|
|
loadsym R1, wait;
|
|
RETI = R1;
|
|
RAISE 15;
|
|
RTI;
|
|
|
|
wait:
|
|
jump wait;
|
|
|
|
evt15:
|
|
# We shouldn't come back here
|
|
set_evt 15, fail_lvl;
|
|
|
|
# Activate interrupt nesting early
|
|
[--SP] = RETI;
|
|
|
|
# Raise some higher levels, but they should be masked and so
|
|
# they should never be activated ...
|
|
RAISE 6;
|
|
RAISE 5;
|
|
RAISE 9;
|
|
RAISE 12;
|
|
|
|
# Only IVG15 should be pending
|
|
check_cec IPEND, (1<<15);
|
|
|
|
# But all should be latched
|
|
check_cec ILAT, (1<<5) | (1<<6) | (1<<9) | (1<<12);
|
|
|
|
# Delay a little in case a higher level wrongly activates
|
|
delay 30
|
|
|
|
# If we're still here, things are still good. So let's
|
|
# transition up *slightly*, but not to the highest latched.
|
|
set_evt 12, evt12;
|
|
cli R7;
|
|
BITSET (R7, 12);
|
|
sti R7;
|
|
|
|
# Let CEC raise us to IVG12
|
|
delay 30
|
|
# CEC should have been faster than this ...
|
|
dbg_fail
|
|
|
|
evt12:
|
|
# We shouldn't come back here
|
|
set_evt 12, fail_lvl;
|
|
|
|
# Raise some higher levels, but they should be masked and so
|
|
# they should never be activated ...
|
|
RAISE 11;
|
|
|
|
# Both IVG15 and IVG12 should be pending
|
|
check_cec IPEND, (1<<15) | (1<<12);
|
|
|
|
# But all should be latched
|
|
check_cec ILAT, (1<<5) | (1<<6) | (1<<9) | (1<<11);
|
|
|
|
# Activate interrupt nesting a little later
|
|
[--SP] = RETI;
|
|
|
|
# Still here, so unmask a higher IVG again to move up
|
|
set_evt 9, evt9;
|
|
cli R7;
|
|
BITSET (R7, 9);
|
|
sti R7;
|
|
delay 30
|
|
|
|
# CEC should have been faster than this ...
|
|
dbg_fail
|
|
|
|
evt9:
|
|
# We shouldn't come back here
|
|
set_evt 9, fail_lvl;
|
|
|
|
# IVG9 should also be pending now
|
|
check_cec IPEND, (1<<15) | (1<<12) | (1<<9);
|
|
|
|
# But all should be latched
|
|
check_cec ILAT, (1<<5) | (1<<6) | (1<<11);
|
|
|
|
# Unmask the next level, but IPEND[4] is set, so we should stay here
|
|
set_evt 6, evt6;
|
|
cli R7;
|
|
BITSET (R7, 6);
|
|
sti R7;
|
|
|
|
# Delay a little in case a higher level wrongly activates
|
|
delay 30
|
|
|
|
# Good, now unmask things globally
|
|
[--SP] = RETI;
|
|
delay 30
|
|
|
|
# CEC should have been faster than this ...
|
|
dbg_fail
|
|
|
|
evt6:
|
|
# We shouldn't come back here
|
|
set_evt 6, fail_lvl;
|
|
|
|
# IVG6 should also be pending now
|
|
check_cec IPEND, (1<<15) | (1<<12) | (1<<9) | (1<<6);
|
|
|
|
# But all should be latched
|
|
check_cec ILAT, (1<<5) | (1<<11);
|
|
|
|
# Activate interrupt nesting a little later
|
|
[--SP] = RETI;
|
|
|
|
# Unmask the next level, but do it via IMASK
|
|
set_evt 5, evt5;
|
|
imm32 P2, IMASK;
|
|
R7 = [P2];
|
|
BITSET (R7, 5);
|
|
[P2] = R7;
|
|
delay 30
|
|
|
|
# CEC should have been faster than this ...
|
|
dbg_fail
|
|
|
|
evt5:
|
|
# We shouldn't come back here
|
|
set_evt 5, fail_lvl;
|
|
|
|
# IVG5 should also be pending now
|
|
check_cec IPEND, (1<<15) | (1<<12) | (1<<9) | (1<<6) | (1<<5);
|
|
|
|
# But all should be latched
|
|
check_cec ILAT, (1<<11);
|
|
|
|
# All good!
|
|
dbg_pass;
|
|
|
|
fail_lvl:
|
|
dbg_fail;
|