368 lines
6.8 KiB
ArmAsm
368 lines
6.8 KiB
ArmAsm
|
#include "macros.inc"
|
||
|
|
||
|
test_suite windowed
|
||
|
|
||
|
#if XCHAL_HAVE_WINDOWED
|
||
|
|
||
|
.altmacro
|
||
|
|
||
|
.macro reset_window start
|
||
|
movi a2, 0xffff
|
||
|
wsr a2, windowstart
|
||
|
rsync
|
||
|
movi a2, 0
|
||
|
wsr a2, windowbase
|
||
|
rsync
|
||
|
movi a2, \start
|
||
|
wsr a2, windowstart
|
||
|
rsync
|
||
|
.endm
|
||
|
|
||
|
.macro overflow_test shift, window, probe_ok, probe_ex
|
||
|
set_vector window_overflow_4, 0
|
||
|
set_vector window_overflow_8, 0
|
||
|
set_vector window_overflow_12, 0
|
||
|
|
||
|
movi a2, 1 | (((1 << ((\window) / 4)) | 1) << ((\shift) / 4))
|
||
|
wsr a2, windowstart
|
||
|
reset_ps
|
||
|
|
||
|
mov a2, a\probe_ok
|
||
|
set_vector window_overflow_\window, 10f
|
||
|
1:
|
||
|
mov a2, a\probe_ex
|
||
|
test_fail
|
||
|
10:
|
||
|
rsr a2, epc1
|
||
|
movi a3, 1b
|
||
|
assert eq, a2, a3
|
||
|
movi a2, 2f
|
||
|
wsr a2, epc1
|
||
|
|
||
|
rsr a2, windowbase
|
||
|
movi a3, (\shift) / 4
|
||
|
assert eq, a2, a3
|
||
|
rsr a2, ps
|
||
|
movi a3, 0x4001f
|
||
|
assert eq, a2, a3
|
||
|
rfwo
|
||
|
test_fail
|
||
|
2:
|
||
|
rsr a2, windowbase
|
||
|
assert eqi, a2, 0
|
||
|
rsr a2, windowstart
|
||
|
movi a3, 1 | ((1 << ((\window) / 4)) << ((\shift) / 4))
|
||
|
assert eq, a2, a3
|
||
|
rsr a2, ps
|
||
|
movi a3, 0x4000f
|
||
|
assert eq, a2, a3
|
||
|
.endm
|
||
|
|
||
|
.macro overflow_tests shift, window, probe
|
||
|
.if \probe < 15
|
||
|
overflow_test \shift, \window, %((\shift) - 1), \probe
|
||
|
overflow_tests \shift, \window, %((\probe) + 1)
|
||
|
.endif
|
||
|
.endm
|
||
|
|
||
|
.macro all_overflow_tests
|
||
|
.irp shift, 4, 8, 12
|
||
|
.irp window, 4, 8, 12
|
||
|
overflow_tests \shift, \window, \shift
|
||
|
.endr
|
||
|
.endr
|
||
|
.endm
|
||
|
|
||
|
test overflow
|
||
|
all_overflow_tests
|
||
|
test_end
|
||
|
|
||
|
|
||
|
.macro underflow_test window
|
||
|
set_vector window_underflow_4, 0
|
||
|
set_vector window_underflow_8, 0
|
||
|
set_vector window_underflow_12, 0
|
||
|
|
||
|
set_vector window_underflow_\window, 10f
|
||
|
|
||
|
reset_window 1
|
||
|
reset_ps
|
||
|
|
||
|
ssai 2
|
||
|
movi a2, 2f
|
||
|
slli a2, a2, 2
|
||
|
movi a3, (\window) / 4
|
||
|
src a0, a3, a2
|
||
|
1:
|
||
|
retw
|
||
|
test_fail
|
||
|
10:
|
||
|
rsr a2, epc1
|
||
|
movi a3, 1b
|
||
|
assert eq, a2, a3
|
||
|
movi a2, 2f
|
||
|
wsr a2, epc1
|
||
|
|
||
|
rsr a2, ps
|
||
|
movi a3, 0x4001f
|
||
|
assert eq, a2, a3
|
||
|
rsr a2, windowbase
|
||
|
movi a3, (XCHAL_NUM_AREGS - (\window)) / 4
|
||
|
assert eq, a2, a3
|
||
|
rsr a2, windowstart
|
||
|
assert eqi, a2, 1
|
||
|
rfwu
|
||
|
2:
|
||
|
rsr a2, ps
|
||
|
movi a3, 0x4000f
|
||
|
assert eq, a2, a3
|
||
|
rsr a2, windowbase
|
||
|
assert eqi, a2, 0
|
||
|
rsr a2, windowstart
|
||
|
assert bsi.l, a2, 0
|
||
|
assert bsi.l, a2, (XCHAL_NUM_AREGS - (\window)) / 4
|
||
|
.endm
|
||
|
|
||
|
test underflow
|
||
|
set_vector window_overflow_4, 0
|
||
|
set_vector window_overflow_8, 0
|
||
|
set_vector window_overflow_12, 0
|
||
|
|
||
|
underflow_test 4
|
||
|
underflow_test 8
|
||
|
underflow_test 12
|
||
|
test_end
|
||
|
|
||
|
|
||
|
.macro retw_test window
|
||
|
reset_window %(1 | (1 << ((XCHAL_NUM_AREGS - \window) / 4)))
|
||
|
reset_ps
|
||
|
|
||
|
ssai 2
|
||
|
movi a2, 1f
|
||
|
slli a2, a2, 2
|
||
|
movi a3, (\window) / 4
|
||
|
src a0, a3, a2
|
||
|
retw
|
||
|
test_fail
|
||
|
1:
|
||
|
rsr a2, ps
|
||
|
movi a3, 0x4000f
|
||
|
assert eq, a2, a3
|
||
|
rsr a2, windowbase
|
||
|
movi a3, (XCHAL_NUM_AREGS - (\window)) / 4
|
||
|
assert eq, a2, a3
|
||
|
rsr a2, windowstart
|
||
|
assert bci.l, a2, 0
|
||
|
assert bsi.l, a2, (XCHAL_NUM_AREGS - (\window)) / 4
|
||
|
.endm
|
||
|
|
||
|
test retw
|
||
|
set_vector window_underflow_4, 0
|
||
|
set_vector window_underflow_8, 0
|
||
|
set_vector window_underflow_12, 0
|
||
|
|
||
|
retw_test 4
|
||
|
retw_test 8
|
||
|
retw_test 12
|
||
|
test_end
|
||
|
|
||
|
test movsp
|
||
|
set_vector kernel, 2f
|
||
|
|
||
|
reset_window 1
|
||
|
reset_ps
|
||
|
1:
|
||
|
movsp a2, a3
|
||
|
test_fail
|
||
|
2:
|
||
|
rsr a2, exccause
|
||
|
assert eqi, a2, 5
|
||
|
rsr a2, epc1
|
||
|
movi a3, 1b
|
||
|
assert eq, a2, a3
|
||
|
|
||
|
set_vector kernel, 0
|
||
|
|
||
|
reset_window %(0x1 | (1 << ((XCHAL_NUM_AREGS / 4) - 1)))
|
||
|
reset_ps
|
||
|
|
||
|
movsp a2, a3
|
||
|
test_end
|
||
|
|
||
|
test rotw
|
||
|
reset_window 0x4b
|
||
|
reset_ps
|
||
|
|
||
|
movi a3, 0x10
|
||
|
|
||
|
rotw 1
|
||
|
rsr a2, windowbase
|
||
|
assert eqi, a2, 1
|
||
|
movi a3, 0x11
|
||
|
movi a7, 0x12
|
||
|
|
||
|
rotw 2
|
||
|
rsr a2, windowbase
|
||
|
assert eqi, a2, 3
|
||
|
movi a3, 0x13
|
||
|
movi a7, 0x14
|
||
|
movi a11, 0x15
|
||
|
|
||
|
rotw 3
|
||
|
rsr a2, windowbase
|
||
|
assert eqi, a2, 6
|
||
|
movi a3, 0x16
|
||
|
movi a7, 0x17
|
||
|
|
||
|
#if XCHAL_NUM_AREGS == 32
|
||
|
movi a2, 0x44
|
||
|
wsr a2, windowstart
|
||
|
#elif XCHAL_NUM_AREGS == 64
|
||
|
movi a2, 0x4004
|
||
|
wsr a2, windowstart
|
||
|
rotw -8
|
||
|
#else
|
||
|
#error XCHAL_NUM_AREGS unsupported
|
||
|
#endif
|
||
|
rsync
|
||
|
|
||
|
movi a2, 0x10
|
||
|
assert eq, a2, a11
|
||
|
movi a11, 0x18
|
||
|
movi a2, 0x11
|
||
|
assert eq, a2, a15
|
||
|
movi a15, 0x19
|
||
|
|
||
|
rotw 4
|
||
|
movi a2, 0x12
|
||
|
assert eq, a2, a3
|
||
|
movi a2, 0x13
|
||
|
assert eq, a2, a7
|
||
|
movi a2, 0x14
|
||
|
assert eq, a2, a11
|
||
|
movi a2, 0x15
|
||
|
assert eq, a2, a15
|
||
|
|
||
|
movi a2, 0x5
|
||
|
wsr a2, windowstart
|
||
|
rsync
|
||
|
|
||
|
rotw -2
|
||
|
movi a2, 0x18
|
||
|
assert eq, a2, a3
|
||
|
movi a2, 0x19
|
||
|
assert eq, a2, a7
|
||
|
test_end
|
||
|
|
||
|
.macro callw_test window
|
||
|
call\window 2f
|
||
|
1:
|
||
|
test_fail
|
||
|
.align 4
|
||
|
2:
|
||
|
rsr a2, windowbase
|
||
|
assert eqi, a2, 0
|
||
|
rsr a2, ps
|
||
|
movi a3, 0x4000f | ((\window) << 14)
|
||
|
assert eq, a2, a3
|
||
|
movi a2, 1b
|
||
|
slli a2, a2, 2
|
||
|
ssai 2
|
||
|
movi a3, (\window) / 4
|
||
|
src a2, a3, a2
|
||
|
assert eq, a2, a\window
|
||
|
.endm
|
||
|
|
||
|
test callw
|
||
|
reset_window 0x1
|
||
|
reset_ps
|
||
|
|
||
|
callw_test 4
|
||
|
callw_test 8
|
||
|
callw_test 12
|
||
|
test_end
|
||
|
|
||
|
|
||
|
.macro entry_test window
|
||
|
reset_window 0x1
|
||
|
reset_ps
|
||
|
movi a2, 0x4000f | ((\window) << 14)
|
||
|
wsr a2, ps
|
||
|
isync
|
||
|
movi a3, 0x12345678
|
||
|
j 1f
|
||
|
.align 4
|
||
|
1:
|
||
|
entry a3, 0x5678
|
||
|
movi a2, 0x12340000
|
||
|
assert eq, a2, a3
|
||
|
rsr a2, windowbase
|
||
|
assert eqi, a2, (\window) / 4
|
||
|
rsr a2, windowstart
|
||
|
movi a3, 1 | (1 << ((\window) / 4))
|
||
|
assert eq, a2, a3
|
||
|
rotw -(\window) / 4
|
||
|
.endm
|
||
|
|
||
|
test entry
|
||
|
entry_test 4
|
||
|
entry_test 8
|
||
|
entry_test 12
|
||
|
test_end
|
||
|
|
||
|
.macro entry_overflow_test window, free, next_window
|
||
|
set_vector window_overflow_4, 0
|
||
|
set_vector window_overflow_8, 0
|
||
|
set_vector window_overflow_12, 0
|
||
|
set_vector window_overflow_\next_window, 10f
|
||
|
|
||
|
movi a2, \window
|
||
|
movi a2, \free
|
||
|
movi a2, \next_window
|
||
|
reset_window %(1 | ((1 | (1 << ((\next_window) / 4))) << ((\free) / 4)))
|
||
|
reset_ps
|
||
|
movi a2, 0x4000f | ((\window) << 14)
|
||
|
wsr a2, ps
|
||
|
isync
|
||
|
movi a3, 0x12345678
|
||
|
j 1f
|
||
|
.align 4
|
||
|
1:
|
||
|
entry a3, 0x5678
|
||
|
test_fail
|
||
|
.align 4
|
||
|
10:
|
||
|
rsr a2, epc1
|
||
|
movi a3, 1b
|
||
|
assert eq, a2, a3
|
||
|
movi a2, 2f
|
||
|
wsr a2, epc1
|
||
|
|
||
|
rsr a2, windowbase
|
||
|
movi a3, (\free) / 4
|
||
|
assert eq, a2, a3
|
||
|
rfwo
|
||
|
2:
|
||
|
.endm
|
||
|
|
||
|
.macro all_entry_overflow_tests
|
||
|
.irp window, 4, 8, 12
|
||
|
.irp next_window, 4, 8, 12
|
||
|
.irp free, 4, 8, 12
|
||
|
.if \free <= \window
|
||
|
entry_overflow_test \window, \free, \next_window
|
||
|
.endif
|
||
|
.endr
|
||
|
.endr
|
||
|
.endr
|
||
|
.endm
|
||
|
|
||
|
test entry_overflow
|
||
|
all_entry_overflow_tests
|
||
|
test_end
|
||
|
|
||
|
#endif
|
||
|
|
||
|
test_suite_end
|