mirror of https://gitlab.com/qemu-project/qemu
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
1.5 KiB
ArmAsm
74 lines
1.5 KiB
ArmAsm
/*
|
|
* Test for MEPC masking bug fix
|
|
*
|
|
* This test verifies that MEPC properly masks the lower bits according
|
|
* to the RISC-V specification when vectored mode bits from STVEC are
|
|
* written to MEPC.
|
|
*/
|
|
|
|
.option norvc
|
|
|
|
.text
|
|
.global _start
|
|
_start:
|
|
/* Set up machine trap vector */
|
|
lla t0, machine_trap_handler
|
|
csrw mtvec, t0
|
|
|
|
/* Set STVEC with vectored mode (mode bits = 01) */
|
|
li t0, 0x80004001
|
|
csrw stvec, t0
|
|
|
|
/* Clear medeleg to handle exceptions in M-mode */
|
|
csrw medeleg, zero
|
|
|
|
/* Trigger illegal instruction exception */
|
|
.word 0xffffffff
|
|
|
|
test_completed:
|
|
/* Exit with result in a0 */
|
|
/* a0 = 0: success (bits [1:0] were masked) */
|
|
/* a0 != 0: failure (some bits were not masked) */
|
|
j _exit
|
|
|
|
machine_trap_handler:
|
|
/* Check if illegal instruction (mcause = 2) */
|
|
csrr t0, mcause
|
|
li t1, 2
|
|
bne t0, t1, skip_test
|
|
|
|
/* Test: Copy STVEC (with mode bits) to MEPC */
|
|
csrr t0, stvec /* t0 = 0x80004001 */
|
|
csrw mepc, t0 /* Write to MEPC */
|
|
csrr t1, mepc /* Read back MEPC */
|
|
|
|
/* Check if bits [1:0] are masked (IALIGN=32 without RVC) */
|
|
andi a0, t1, 3 /* a0 = 0 if both bits masked correctly */
|
|
|
|
/* Set correct return address */
|
|
lla t0, test_completed
|
|
csrw mepc, t0
|
|
|
|
skip_test:
|
|
mret
|
|
|
|
/* Exit with semihosting */
|
|
_exit:
|
|
lla a1, semiargs
|
|
li t0, 0x20026 /* ADP_Stopped_ApplicationExit */
|
|
sd t0, 0(a1)
|
|
sd a0, 8(a1)
|
|
li a0, 0x20 /* TARGET_SYS_EXIT_EXTENDED */
|
|
|
|
/* Semihosting call sequence */
|
|
.balign 16
|
|
slli zero, zero, 0x1f
|
|
ebreak
|
|
srai zero, zero, 0x7
|
|
j .
|
|
|
|
.data
|
|
.balign 8
|
|
semiargs:
|
|
.space 16
|