From: Julian Ganz <neither@nut.email>
To: qemu-devel@nongnu.org
Cc: Julian Ganz <neither@nut.email>,
Daniel Henrique Barboza <dbarboza@ventanamicro.com>,
Palmer Dabbelt <palmer@dabbelt.com>,
Alistair Francis <alistair.francis@wdc.com>,
Weiwei Li <liwei1518@gmail.com>,
Liu Zhiwei <zhiwei_liu@linux.alibaba.com>,
qemu-riscv@nongnu.org (open list:RISC-V TCG CPUs)
Subject: [PATCH v8 25/25] tests: add test with interrupted memory accesses on rv64
Date: Sun, 19 Oct 2025 17:18:44 +0200 [thread overview]
Message-ID: <5a95ff9e573a245ae5aba91ecc01c5e14579580b.1760884672.git.neither@nut.email> (raw)
In-Reply-To: <cover.1760884672.git.neither@nut.email>
This test aims at catching API misbehaviour w.r.t. the interaction
between interrupts and memory accesses, such as the bug fixed in
27f347e6a1d269c533633c812321cabb249eada8
(accel/tcg: also suppress asynchronous IRQs for cpu_io_recompile)
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.
The test program sends a single '.' per 1000000 loads/stores over the
serial. This output is not captured, but may be used by developers to
gauge the number of possible interactions.
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Signed-off-by: Julian Ganz <neither@nut.email>
---
tests/tcg/riscv64/Makefile.softmmu-target | 6 ++
tests/tcg/riscv64/interruptedmemory.S | 97 +++++++++++++++++++++++
2 files changed, 103 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 d9c0036eb4..eb1ce6504a 100644
--- a/tests/tcg/riscv64/Makefile.softmmu-target
+++ b/tests/tcg/riscv64/Makefile.softmmu-target
@@ -30,5 +30,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..cd9073ee31
--- /dev/null
+++ b/tests/tcg/riscv64/interruptedmemory.S
@@ -0,0 +1,97 @@
+ .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
+
+ # Set up UART
+ lui t1, 0x10000
+ li a0, 0x80 # DLAB=1
+ sb a0, 3(t1)
+ li a0, 1 # Full speed
+ sw a0, 0(t1)
+ li a0, 0x03 # 8N1, DLAB=0
+ sb a0, 3(t1)
+
+ # Run test for around 60s
+ call rtc_get
+ li t0, 30
+ slli t0, t0, 30 # Approx. 10e9 ns
+ add t0, t0, a0
+0:
+ # Tight loop with memory accesses
+ li a1, 1000000
+ la a2, semiargs
+1:
+ ld a0, 0(a2)
+ sd a0, 0(a2)
+ addi a1, a1, -1
+ bnez a1, 1b
+
+ li a0, '.'
+ call send_byte
+ call rtc_get
+ bltu a0, t0, 0b
+
+ li a0, '\n'
+ call send_byte
+
+ # Exit
+ 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
+
+send_byte:
+ # Send a single byte over the serial
+ lui t3, 0x10000
+ lb a1, 5(t3)
+ andi a1, a1, 0x20
+ beqz a1, send_byte
+ sb a0, 0(t3)
+ ret
+
+ .balign 4
+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
--
2.49.1
next prev parent reply other threads:[~2025-10-19 15:20 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-19 15:14 [PATCH v8 00/25] tcg-plugins: add hooks for discontinuities Julian Ganz
2025-10-19 15:14 ` [PATCH v8 01/25] plugins: add types for callbacks related to certain discontinuities Julian Ganz
2025-10-19 15:14 ` [PATCH v8 02/25] plugins: add API for registering discontinuity callbacks Julian Ganz
2025-10-19 15:14 ` [PATCH v8 03/25] plugins: add hooks for new discontinuity related callbacks Julian Ganz
2025-10-19 15:14 ` [PATCH v8 04/25] contrib/plugins: add plugin showcasing new dicontinuity related API Julian Ganz
2025-10-19 15:14 ` [PATCH v8 05/25] target/alpha: call plugin trap callbacks Julian Ganz
2025-10-21 20:10 ` Philippe Mathieu-Daudé
2025-10-21 20:38 ` Julian Ganz
2025-10-21 20:47 ` Philippe Mathieu-Daudé
2025-10-19 15:14 ` [PATCH v8 06/25] target/arm: " Julian Ganz
2025-10-19 15:14 ` [PATCH v8 07/25] target/avr: " Julian Ganz
2025-10-21 20:10 ` Philippe Mathieu-Daudé
2025-10-19 15:14 ` [PATCH v8 08/25] target/hppa: " Julian Ganz
2025-10-21 19:56 ` Philippe Mathieu-Daudé
2025-10-19 15:14 ` [PATCH v8 09/25] target/i386: " Julian Ganz
2025-10-21 19:57 ` Philippe Mathieu-Daudé
2025-10-19 15:14 ` [PATCH v8 10/25] target/loongarch: " Julian Ganz
2025-10-20 1:36 ` gaosong
2025-10-19 15:15 ` [PATCH v8 11/25] target/m68k: " Julian Ganz
2025-10-21 19:58 ` Philippe Mathieu-Daudé
2025-10-19 15:15 ` [PATCH v8 12/25] target/microblaze: " Julian Ganz
2025-10-21 19:58 ` Philippe Mathieu-Daudé
2025-10-19 15:15 ` [PATCH v8 13/25] target/mips: " Julian Ganz
2025-10-21 19:59 ` Philippe Mathieu-Daudé
2025-10-19 15:15 ` [PATCH v8 14/25] target/openrisc: " Julian Ganz
2025-10-21 19:59 ` Philippe Mathieu-Daudé
2025-10-19 15:15 ` [PATCH v8 15/25] target/ppc: " Julian Ganz
2025-10-19 15:15 ` [PATCH v8 16/25] target/riscv: " Julian Ganz
2025-10-19 15:15 ` [PATCH v8 17/25] target/rx: " Julian Ganz
2025-10-21 20:00 ` Philippe Mathieu-Daudé
2025-10-19 15:15 ` [PATCH v8 18/25] target/s390x: " Julian Ganz
2025-10-21 20:07 ` Philippe Mathieu-Daudé
2025-10-21 20:25 ` Julian Ganz
2025-10-19 15:15 ` [PATCH v8 19/25] target/sh4: " Julian Ganz
2025-10-19 15:15 ` [PATCH v8 20/25] target/sparc: " Julian Ganz
2025-10-21 20:01 ` Philippe Mathieu-Daudé
2025-10-19 15:18 ` [PATCH v8 21/25] target/tricore: " Julian Ganz
2025-10-19 15:18 ` [PATCH v8 22/25] target/xtensa: " Julian Ganz
2025-10-19 15:18 ` [PATCH v8 23/25] tests: add plugin asserting correctness of discon event's to_pc Julian Ganz
2025-10-19 15:18 ` [PATCH v8 24/25] tests: add test for double-traps on rv64 Julian Ganz
2025-10-19 15:18 ` Julian Ganz [this message]
2025-10-21 19:35 ` [PATCH v8 00/25] tcg-plugins: add hooks for discontinuities Alex Bennée
2025-10-23 12:16 ` Alex Bennée
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5a95ff9e573a245ae5aba91ecc01c5e14579580b.1760884672.git.neither@nut.email \
--to=neither@nut.email \
--cc=alistair.francis@wdc.com \
--cc=dbarboza@ventanamicro.com \
--cc=liwei1518@gmail.com \
--cc=palmer@dabbelt.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-riscv@nongnu.org \
--cc=zhiwei_liu@linux.alibaba.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).