qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v6 0/5] target/riscv: Add Smrnmi support.
@ 2024-09-02  7:13 Tommy Wu
  2024-09-02  7:13 ` [PATCH v6 1/5] target/riscv: Add `ext_smrnmi` in the RISCVCPUConfig Tommy Wu
                   ` (6 more replies)
  0 siblings, 7 replies; 15+ messages in thread
From: Tommy Wu @ 2024-09-02  7:13 UTC (permalink / raw)
  To: qemu-devel, qemu-riscv
  Cc: frank.chang, palmer, alistair.francis, alistair23, bin.meng,
	liweiwei, dbarboza, ajones, Tommy Wu

This patchset added support for Smrnmi Extension in RISC-V.

There are four new CSRs and one new instruction added to allow NMI to be
resumable in RISC-V, which are:

=============================================================
  * mnscratch (0x740)
  * mnepc     (0x741)
  * mncause   (0x742)
  * mnstatus  (0x744)
=============================================================
  * mnret: To return from RNMI interrupt/exception handler.
=============================================================

RNMI also has higher priority than any other interrupts or exceptions
and cannot be disabled by software.

RNMI may be used to route to other devices such as Bus Error Unit or
Watchdog Timer in the future.

The interrupt/exception trap handler addresses of RNMI are
implementation defined.

If anyone wants to test the patches, we can use the customized OpenSBI[1],
and the customized QEMU[2].

We implemented a PoC RNMI trap handler in the customized OpenSBI.
In the customized QEMU, we use the Smrnmi patches and the patch from
Damien Hedde[3]. The patch from Damien Hedde can be used to inject
the RNMI signal with the qmp command.

[1] https://github.com/TommyWu-fdgkhdkgh/opensbi/tree/dev/twu/master
[2] https://github.com/TommyWu-fdgkhdkgh/qemu/tree/dev/twu/master
[3] https://lists.gnu.org/archive/html/qemu-devel/2019-06/msg06232.html

Test commands :
$ ./build/qemu-system-riscv64 -M virt -cpu rv64,smrnmi=true,
rnmi-interrupt-vector={Offset of the RNMI handler in the customized
OpenSBI.} -m 4G -smp 2 -serial mon:stdio -serial null -nographic
-bios fw_jump.elf -kernel Image -initrd rootfs.cpio
-qmp unix:/tmp/qmp-sock,server,wait=off

Use qmp command to inject the RNMI interrupt.
$ ./scripts/qmp/qmp-shell /tmp/qmp-sock
(QEMU)  gpio-set path=/machine/soc0/harts[0] gpio=riscv.cpu.rnmi
number=0 value=true

(QEMU)  gpio-set path=/machine/soc0/harts[0] gpio=riscv.cpu.rnmi
number=0 value=false

Changelog:

v6
  * Delete the redundant code in `riscv_cpu_do_interrupt`.
  ( Thank Alvin for the suggestion. )
  * Split the shared code in `helper_mret` and `helper_mnret` into a
    helper function `check_ret_from_m_mode`.
  ( Thank Alistair for the suggestion. )

v5
  * Move the patch that adds the Smrnmi extension to the last patch.
  ( Thank Alistair for the suggestion. )
  * Implement an M-mode software PoC for this with implemented handlers.
  ( Thank Andrew Jones for the suggestion. )
  * Add a commit message to all patches of the series.
  ( Thank Andrew Jones for the suggestion. )

v4
  * Fix some coding style issues.
  ( Thank Daniel for the suggestions. )

v3
  * Update to the newest version of Smrnmi extension specification.

v2
  * split up the series into more commits for convenience of review.
  * add missing rnmi_irqvec and rnmi_excpvec properties to riscv_harts.

Tommy Wu (5):
  target/riscv: Add `ext_smrnmi` in the RISCVCPUConfig.
  target/riscv: Handle Smrnmi interrupt and exception.
  target/riscv: Add Smrnmi CSRs.
  target/riscv: Add Smrnmi mnret instruction.
  target/riscv: Add Smrnmi cpu extension.

 hw/riscv/riscv_hart.c                         | 18 ++++
 include/hw/riscv/riscv_hart.h                 |  4 +
 target/riscv/cpu.c                            | 18 ++++
 target/riscv/cpu.h                            | 10 +++
 target/riscv/cpu_bits.h                       | 23 ++++++
 target/riscv/cpu_cfg.h                        |  1 +
 target/riscv/cpu_helper.c                     | 80 ++++++++++++++++--
 target/riscv/csr.c                            | 82 +++++++++++++++++++
 target/riscv/helper.h                         |  1 +
 target/riscv/insn32.decode                    |  3 +
 .../riscv/insn_trans/trans_privileged.c.inc   | 12 +++
 target/riscv/op_helper.c                      | 49 +++++++++--
 12 files changed, 291 insertions(+), 10 deletions(-)

-- 
2.39.3



^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2024-10-14 16:16 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-09-02  7:13 [PATCH v6 0/5] target/riscv: Add Smrnmi support Tommy Wu
2024-09-02  7:13 ` [PATCH v6 1/5] target/riscv: Add `ext_smrnmi` in the RISCVCPUConfig Tommy Wu
2024-09-02  7:13 ` [PATCH v6 2/5] target/riscv: Handle Smrnmi interrupt and exception Tommy Wu
2024-09-02 10:34   ` Clément Léger
2024-09-02 12:49     ` Clément Léger
2024-09-02  7:13 ` [PATCH v6 3/5] target/riscv: Add Smrnmi CSRs Tommy Wu
2024-09-02  7:13 ` [PATCH v6 4/5] target/riscv: Add Smrnmi mnret instruction Tommy Wu
2024-09-06  0:51   ` Alistair Francis
2024-09-02  7:13 ` [PATCH v6 5/5] target/riscv: Add Smrnmi cpu extension Tommy Wu
2024-09-06  0:37 ` [PATCH v6 0/5] target/riscv: Add Smrnmi support Alistair Francis
2024-10-11 11:38 ` Daniel Henrique Barboza
2024-10-14  1:54   ` Frank Chang
2024-10-14  7:35   ` Clément Léger
2024-10-14  9:04     ` Frank Chang
2024-10-14 16:15       ` Daniel Henrique Barboza

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).