qemu-e2k/tests/tcg/xtensa/test_break.S
Max Filippov 66c58ba71b tests/tcg/xtensa: conditionalize debug option tests
Make debug tests conditional on the presence of the debug option in the
config and tests that depend on the presence/number of instruction or
data breakpoint registers on the corresponding definitions. Use
configured debug interrupt level instead of the hardcoded value to set
up IRQ handler and access debug EPC register.

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
2019-02-28 04:43:23 -08:00

267 lines
6.1 KiB
ArmAsm

#include "macros.inc"
test_suite break
#if XCHAL_HAVE_DEBUG
#define debug_level XCHAL_DEBUGLEVEL
#define debug_vector glue(level, XCHAL_DEBUGLEVEL)
#define EPC_DEBUG glue(epc, XCHAL_DEBUGLEVEL)
test break
set_vector debug_vector, 0
rsil a2, debug_level
_break 0, 0
set_vector debug_vector, 2f
rsil a2, debug_level - 1
1:
_break 0, 0
test_fail
2:
rsr a2, ps
movi a3, 0x1f
and a2, a2, a3
movi a3, 0x10 | debug_level
assert eq, a2, a3
rsr a2, EPC_DEBUG
movi a3, 1b
assert eq, a2, a3
rsr a2, debugcause
movi a3, 0x8
assert eq, a2, a3
test_end
test breakn
set_vector debug_vector, 0
rsil a2, debug_level
_break.n 0
set_vector debug_vector, 2f
rsil a2, debug_level - 1
1:
_break.n 0
test_fail
2:
rsr a2, ps
movi a3, 0x1f
and a2, a2, a3
movi a3, 0x10 | debug_level
assert eq, a2, a3
rsr a2, EPC_DEBUG
movi a3, 1b
assert eq, a2, a3
rsr a2, debugcause
movi a3, 0x10
assert eq, a2, a3
test_end
#if XCHAL_NUM_IBREAK
test ibreak
set_vector debug_vector, 0
rsil a2, debug_level
movi a2, 1f
wsr a2, ibreaka0
movi a2, 1
wsr a2, ibreakenable
isync
1:
rsil a2, debug_level - 1
movi a2, 1f
wsr a2, ibreaka0
movi a2, 0
wsr a2, ibreakenable
isync
1:
set_vector debug_vector, 2f
movi a2, 1f
wsr a2, ibreaka0
movi a2, 1
wsr a2, ibreakenable
isync
1:
test_fail
2:
rsr a2, ps
movi a3, 0x1f
and a2, a2, a3
movi a3, 0x10 | debug_level
assert eq, a2, a3
rsr a2, EPC_DEBUG
movi a3, 1b
assert eq, a2, a3
rsr a2, debugcause
movi a3, 0x2
assert eq, a2, a3
test_end
test ibreak_remove
set_vector debug_vector, 3f
rsil a2, debug_level - 1
movi a2, 2f
wsr a2, ibreaka0
movi a3, 1
1:
wsr a3, ibreakenable
isync
2:
beqz a3, 4f
test_fail
3:
assert eqi, a3, 1
rsr a2, ps
movi a3, 0x1f
and a2, a2, a3
movi a3, 0x10 | debug_level
assert eq, a2, a3
rsr a2, EPC_DEBUG
movi a3, 2b
assert eq, a2, a3
rsr a2, debugcause
movi a3, 0x2
assert eq, a2, a3
movi a2, 0x40000
wsr a2, ps
isync
movi a3, 0
j 1b
4:
test_end
test ibreak_priority
set_vector debug_vector, 2f
rsil a2, debug_level - 1
movi a2, 1f
wsr a2, ibreaka0
movi a2, 1
wsr a2, ibreakenable
isync
1:
break 0, 0
test_fail
2:
rsr a2, debugcause
movi a3, 0x2
assert eq, a2, a3
test_end
#endif
test icount
set_vector debug_vector, 2f
rsil a2, debug_level - 1
movi a2, -2
wsr a2, icount
movi a2, 1
wsr a2, icountlevel
isync
rsil a2, 0
nop
1:
break 0, 0
test_fail
2:
movi a2, 0
wsr a2, icountlevel
rsr a2, EPC_DEBUG
movi a3, 1b
assert eq, a2, a3
rsr a2, debugcause
movi a3, 0x1
assert eq, a2, a3
test_end
.macro check_dbreak dr
rsr a2, EPC_DEBUG
movi a3, 1b
assert eq, a2, a3
rsr a2, debugcause
movi a3, 0x4 | (\dr << 8)
assert eq, a2, a3
movi a2, 0
wsr a2, dbreakc\dr
.endm
.macro dbreak_test dr, ctl, break, access, op
set_vector debug_vector, 2f
rsil a2, debug_level - 1
movi a2, \ctl
wsr a2, dbreakc\dr
movi a2, \break
wsr a2, dbreaka\dr
movi a2, \access
isync
1:
\op a3, a2, 0
test_fail
2:
check_dbreak \dr
reset_ps
.endm
#if XCHAL_NUM_DBREAK
test dbreak_exact
dbreak_test 0, 0x4000003f, 0xd000007f, 0xd000007f, l8ui
dbreak_test 1, 0x4000003e, 0xd000007e, 0xd000007e, l16ui
dbreak_test 0, 0x4000003c, 0xd000007c, 0xd000007c, l32i
dbreak_test 1, 0x8000003f, 0xd000007f, 0xd000007f, s8i
dbreak_test 0, 0x8000003e, 0xd000007e, 0xd000007e, s16i
dbreak_test 1, 0x8000003c, 0xd000007c, 0xd000007c, s32i
test_end
test dbreak_overlap
dbreak_test 0, 0x4000003f, 0xd000007d, 0xd000007c, l16ui
dbreak_test 1, 0x4000003f, 0xd000007d, 0xd000007c, l32i
dbreak_test 0, 0x4000003e, 0xd000007e, 0xd000007f, l8ui
dbreak_test 1, 0x4000003e, 0xd000007e, 0xd000007c, l32i
dbreak_test 0, 0x4000003c, 0xd000007c, 0xd000007d, l8ui
dbreak_test 1, 0x4000003c, 0xd000007c, 0xd000007c, l16ui
dbreak_test 0, 0x40000038, 0xd0000078, 0xd000007b, l8ui
dbreak_test 1, 0x40000038, 0xd0000078, 0xd000007a, l16ui
dbreak_test 0, 0x40000038, 0xd0000078, 0xd000007c, l32i
dbreak_test 1, 0x40000030, 0xd0000070, 0xd0000075, l8ui
dbreak_test 0, 0x40000030, 0xd0000070, 0xd0000076, l16ui
dbreak_test 1, 0x40000030, 0xd0000070, 0xd0000078, l32i
dbreak_test 0, 0x40000020, 0xd0000060, 0xd000006f, l8ui
dbreak_test 1, 0x40000020, 0xd0000060, 0xd0000070, l16ui
dbreak_test 0, 0x40000020, 0xd0000060, 0xd0000074, l32i
dbreak_test 0, 0x8000003f, 0xd000007d, 0xd000007c, s16i
dbreak_test 1, 0x8000003f, 0xd000007d, 0xd000007c, s32i
dbreak_test 0, 0x8000003e, 0xd000007e, 0xd000007f, s8i
dbreak_test 1, 0x8000003e, 0xd000007e, 0xd000007c, s32i
dbreak_test 0, 0x8000003c, 0xd000007c, 0xd000007d, s8i
dbreak_test 1, 0x8000003c, 0xd000007c, 0xd000007c, s16i
dbreak_test 0, 0x80000038, 0xd0000078, 0xd000007b, s8i
dbreak_test 1, 0x80000038, 0xd0000078, 0xd000007a, s16i
dbreak_test 0, 0x80000038, 0xd0000078, 0xd000007c, s32i
dbreak_test 1, 0x80000030, 0xd0000070, 0xd0000075, s8i
dbreak_test 0, 0x80000030, 0xd0000070, 0xd0000076, s16i
dbreak_test 1, 0x80000030, 0xd0000070, 0xd0000078, s32i
dbreak_test 0, 0x80000020, 0xd0000060, 0xd000006f, s8i
dbreak_test 1, 0x80000020, 0xd0000060, 0xd0000070, s16i
dbreak_test 0, 0x80000020, 0xd0000060, 0xd0000074, s32i
test_end
test dbreak_invalid
dbreak_test 0, 0x40000030, 0xd0000071, 0xd0000070, l16ui
dbreak_test 1, 0x40000035, 0xd0000072, 0xd0000070, l32i
test_end
#endif
#endif
test_suite_end