On 5/11/25 10:22 AM, Julian Ganz wrote:
This test aims at catching API misbehaviour w.r.t. the interaction
between interrupts and memory accesses, such as the bug fixed in

     27f347e6a1d269c533633c812321cabb249eada8

Because the condition for triggering misbehaviour may not be
deterministic and the cross-section between memory accesses and
interrupt handlers may be small, we have to place our trust in large
numbers. Instead of guessing/trying an arbitrary, fixed loop-bound, we
decided to loop for a fixed amount of real-time. This avoids the test
running into a time-out on slower machines while enabling a high number
of possible interactions on faster machines.

Signed-off-by: Julian Ganz <neither@nut.email>
---


Reviewed-by: Daniel Henrique Barboza <dbarb...@ventanamicro.com>

  tests/tcg/riscv64/Makefile.softmmu-target |  6 ++
  tests/tcg/riscv64/interruptedmemory.S     | 67 +++++++++++++++++++++++
  2 files changed, 73 insertions(+)
  create mode 100644 tests/tcg/riscv64/interruptedmemory.S

diff --git a/tests/tcg/riscv64/Makefile.softmmu-target 
b/tests/tcg/riscv64/Makefile.softmmu-target
index 5fba973e18..5d07755964 100644
--- a/tests/tcg/riscv64/Makefile.softmmu-target
+++ b/tests/tcg/riscv64/Makefile.softmmu-target
@@ -26,5 +26,11 @@ run-plugin-doubletrap: doubletrap
          $(QEMU) -plugin ../plugins/libdiscons.so -d plugin -D $*.pout \
          $(QEMU_OPTS)$<)
+EXTRA_RUNS += run-plugin-interruptedmemory
+run-plugin-interruptedmemory: interruptedmemory
+       $(call run-test, $<, \
+         $(QEMU) -plugin ../plugins/libdiscons.so -d plugin -D $*.pout \
+         $(QEMU_OPTS)$<)
+
  # We don't currently support the multiarch system tests
  undefine MULTIARCH_TESTS
diff --git a/tests/tcg/riscv64/interruptedmemory.S 
b/tests/tcg/riscv64/interruptedmemory.S
new file mode 100644
index 0000000000..a32d672849
--- /dev/null
+++ b/tests/tcg/riscv64/interruptedmemory.S
@@ -0,0 +1,67 @@
+       .option norvc
+
+       .text
+       .global _start
+_start:
+       # Set up trap vector
+       lla     t0, trap
+       csrw    mtvec, t0
+
+       # Set up timer
+       lui     t1, 0x02004
+       sd      zero, 0(t1) # MTIMECMP0
+
+       # Enable timer interrupts
+       li      t0, 0x80
+       csrrs   zero, mie, t0
+       csrrsi  zero, mstatus, 0x8
+
+       # Find out when to stop
+       call    rtc_get
+       li      t0, 60
+       slli    t0, t0, 30 # Approx. 10e9 ns
+       add     t0, t0, a0
+
+       # Loop with memory accesses
+       la      t1, semiargs
+0:
+       ld      t2, 0(t1)
+       sd      t2, 0(t1)
+       call    rtc_get
+       bltu    a0, t0, 0b
+
+       li      a0, 0
+       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       .
+
+rtc_get:
+       # Get current time from the goldfish RTC
+       lui     t3, 0x0101
+       lw      a0, 0(t3)
+       lw      t3, 4(t3)
+       slli    t3, t3, 32
+       add     a0, a0, t3
+       ret
+
+trap:
+       lui     t5, 0x0200c
+       ld      t6, -0x8(t5) # MTIME
+       addi    t6, t6, 100
+       lui     t5, 0x02004
+       sd      t6, 0(t5) # MTIMECMP
+       mret
+
+       .data
+       .balign 16
+semiargs:
+       .space  16


Reply via email to