# Blackfin testcase for HW Loops and user->super transitions # mach: bfin # sim: --environment operating #include "test.h" .include "testutils.inc" .macro check_hwloop_regs lc:req, lt:req, lb:req R0 = LC0; CC = R0 == \lc; IF !CC JUMP fail; R0 = LT0; CC = R0 == \lt; IF !CC JUMP fail; R0 = LB0; CC = R0 == \lb; IF !CC JUMP fail; R0 = LC1; CC = R0 == \lc; IF !CC JUMP fail; R0 = LT1; CC = R0 == \lt; IF !CC JUMP fail; R0 = LB1; CC = R0 == \lb; IF !CC JUMP fail; .endm start imm32 P0, EVT3; loadsym R0, exception; [P0] = R0; imm32 P0, EVT2; loadsym R0, nmi; [P0] = R0; loadsym R0, usermode; RETI = R0; # Set the LC/LB/LT up with LSB set # - Hardware clears LT LSB, but LB remains until we lower imm32 R6, 0xaaaa5555 R4 = R6; BITCLR (R4, 0); imm32 R7, 0xaa55aa55 R5 = R7; BITCLR (R5, 0); LC0 = R6; LT0 = R6; LB0 = R7; LC1 = R6; LT1 = R6; LB1 = R7; # Sanity check check_hwloop_regs R6, R4, R7 RTI; usermode: # Make sure LSB has been cleared in LB check_hwloop_regs R6, R4, R5 # Clear LSB in all LC/LT/LB LC0 = R4; LT0 = R4; LB0 = R5; LC1 = R4; LT1 = R4; LB1 = R5; # Now move back up to supervisor EXCPT 4; exception: # Make sure LSB is set in LB check_hwloop_regs R4, R4, R7 # Clear the LSB and move up another supervisor level LC0 = R4; LT0 = R4; LB0 = R5; LC1 = R4; LT1 = R4; LB1 = R5; RAISE 2; nmi: # Make sure LSB stayed clear check_hwloop_regs R4, R4, R5 dbg_pass fail: dbg_fail