8b912ff033
Don't use hardcoded software interrupt masks, use XCHAL macros. Mask off timer interrupt bits that are not checked for. Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
208 lines
3.8 KiB
ArmAsm
208 lines
3.8 KiB
ArmAsm
#include "macros.inc"
|
|
|
|
#define LSBIT(v) ((v) ^ ((v) & ((v) - 1)))
|
|
|
|
test_suite interrupt
|
|
|
|
.macro clear_interrupts
|
|
movi a2, 0
|
|
wsr a2, intenable
|
|
wsr a2, ccompare0
|
|
wsr a2, ccompare1
|
|
wsr a2, ccompare2
|
|
esync
|
|
rsr a2, interrupt
|
|
wsr a2, intclear
|
|
|
|
esync
|
|
rsr a2, interrupt
|
|
assert eqi, a2, 0
|
|
.endm
|
|
|
|
.macro check_l1
|
|
rsr a2, ps
|
|
movi a3, 0x1f /* EXCM | INTMASK */
|
|
and a2, a2, a3
|
|
assert eqi, a2, 0x10 /* only EXCM is set for level-1 interrupt */
|
|
rsr a2, exccause
|
|
assert eqi, a2, 4
|
|
.endm
|
|
|
|
test rsil
|
|
clear_interrupts
|
|
|
|
rsr a2, ps
|
|
rsil a3, 7
|
|
rsr a4, ps
|
|
assert eq, a2, a3
|
|
movi a2, 0xf
|
|
and a2, a4, a2
|
|
assert eqi, a2, 7
|
|
xor a3, a3, a4
|
|
movi a2, 0xfffffff0
|
|
and a2, a3, a2
|
|
assert eqi, a2, 0
|
|
test_end
|
|
|
|
test soft_disabled
|
|
set_vector kernel, 1f
|
|
clear_interrupts
|
|
|
|
movi a2, LSBIT(XCHAL_INTTYPE_MASK_SOFTWARE)
|
|
wsr a2, intset
|
|
esync
|
|
rsr a3, interrupt
|
|
movi a4, ~XCHAL_INTTYPE_MASK_TIMER
|
|
and a3, a3, a4
|
|
assert eq, a2, a3
|
|
wsr a2, intclear
|
|
esync
|
|
rsr a3, interrupt
|
|
and a3, a3, a4
|
|
assert eqi, a3, 0
|
|
j 2f
|
|
1:
|
|
test_fail
|
|
2:
|
|
test_end
|
|
|
|
test soft_intenable
|
|
set_vector kernel, 1f
|
|
clear_interrupts
|
|
|
|
movi a2, LSBIT(XCHAL_INTTYPE_MASK_SOFTWARE)
|
|
wsr a2, intset
|
|
esync
|
|
rsr a3, interrupt
|
|
movi a4, ~XCHAL_INTTYPE_MASK_TIMER
|
|
and a3, a3, a4
|
|
assert eq, a2, a3
|
|
rsil a3, 0
|
|
wsr a2, intenable
|
|
esync
|
|
test_fail
|
|
1:
|
|
check_l1
|
|
test_end
|
|
|
|
test soft_rsil
|
|
set_vector kernel, 1f
|
|
clear_interrupts
|
|
|
|
movi a2, LSBIT(XCHAL_INTTYPE_MASK_SOFTWARE)
|
|
wsr a2, intset
|
|
esync
|
|
rsr a3, interrupt
|
|
movi a4, ~XCHAL_INTTYPE_MASK_TIMER
|
|
and a3, a3, a4
|
|
assert eq, a2, a3
|
|
wsr a2, intenable
|
|
rsil a3, 0
|
|
esync
|
|
test_fail
|
|
1:
|
|
check_l1
|
|
test_end
|
|
|
|
test soft_waiti
|
|
set_vector kernel, 1f
|
|
clear_interrupts
|
|
|
|
movi a2, LSBIT(XCHAL_INTTYPE_MASK_SOFTWARE)
|
|
wsr a2, intset
|
|
esync
|
|
rsr a3, interrupt
|
|
movi a4, ~XCHAL_INTTYPE_MASK_TIMER
|
|
and a3, a3, a4
|
|
assert eq, a2, a3
|
|
wsr a2, intenable
|
|
waiti 0
|
|
test_fail
|
|
1:
|
|
check_l1
|
|
test_end
|
|
|
|
test soft_user
|
|
set_vector kernel, 1f
|
|
set_vector user, 2f
|
|
clear_interrupts
|
|
|
|
movi a2, LSBIT(XCHAL_INTTYPE_MASK_SOFTWARE)
|
|
wsr a2, intset
|
|
esync
|
|
rsr a3, interrupt
|
|
movi a4, ~XCHAL_INTTYPE_MASK_TIMER
|
|
and a3, a3, a4
|
|
assert eq, a2, a3
|
|
wsr a2, intenable
|
|
|
|
rsr a2, ps
|
|
movi a3, 0x20
|
|
or a2, a2, a3
|
|
wsr a2, ps
|
|
waiti 0
|
|
1:
|
|
test_fail
|
|
2:
|
|
check_l1
|
|
test_end
|
|
|
|
test soft_priority
|
|
set_vector kernel, 1f
|
|
set_vector level3, 2f
|
|
clear_interrupts
|
|
|
|
movi a2, XCHAL_INTTYPE_MASK_SOFTWARE
|
|
wsr a2, intenable
|
|
rsil a3, 0
|
|
esync
|
|
wsr a2, intset
|
|
esync
|
|
1:
|
|
test_fail
|
|
2:
|
|
rsr a2, ps
|
|
movi a3, 0x1f /* EXCM | INTMASK */
|
|
and a2, a2, a3
|
|
movi a3, 0x13
|
|
assert eq, a2, a3 /* EXCM and INTMASK are set
|
|
for high-priority interrupt */
|
|
test_end
|
|
|
|
test eps_epc_rfi
|
|
set_vector level3, 3f
|
|
clear_interrupts
|
|
reset_ps
|
|
|
|
movi a2, XCHAL_INTTYPE_MASK_SOFTWARE
|
|
wsr a2, intenable
|
|
rsil a3, 0
|
|
rsr a3, ps
|
|
esync
|
|
wsr a2, intset
|
|
1:
|
|
esync
|
|
2:
|
|
test_fail
|
|
3:
|
|
rsr a2, eps3
|
|
assert eq, a2, a3
|
|
rsr a2, epc3
|
|
movi a3, 1b
|
|
assert ge, a2, a3
|
|
movi a3, 2b
|
|
assert ge, a3, a2
|
|
movi a2, 4f
|
|
wsr a2, epc3
|
|
movi a2, 0x40003
|
|
wsr a2, eps3
|
|
rfi 3
|
|
test_fail
|
|
4:
|
|
rsr a2, ps
|
|
movi a3, 0x40003
|
|
assert eq, a2, a3
|
|
test_end
|
|
|
|
test_suite_end
|