From: Pierrick Bouvier <pierrick.bouvier@linaro.org>
To: Anton Johansson <anjo@rev.ng>, qemu-devel@nongnu.org
Cc: philmd@linaro.org, alistair.francis@wdc.com, palmer@dabbelt.com
Subject: Re: [RFC PATCH 00/34] single-binary: Make riscv cpu.h target independent
Date: Mon, 29 Sep 2025 15:44:51 -0700 [thread overview]
Message-ID: <427722cf-c91c-4c2f-b5a0-8d127c3dddea@linaro.org> (raw)
In-Reply-To: <20250924072124.6493-1-anjo@rev.ng>
Hi Anton,
thanks for joining the single-binary effort.
You didn't start with the easiest part :).
On 9/24/25 12:20 AM, Anton Johansson wrote:
> Hi,
>
> this is a first patchset moving towards single-binary support for riscv.
> Additional patchsets for hw/ and target/ are based on this one so it's
> best to make sure the approach taken is ok. Most patches in this set
> concern fields in CPUArchState which are either widened (usually to
> uint64_t) or fixed to a smaller size which handles all use cases.
>
> General purpose registers and fields mapped to TCG are dealt with by
> widening the type and applying an offset to tcg_global_mem_new() to
> correctly handle 32-bit targets on big endian hosts.
>
> Quick question to correct my understanding. AFAICT riscv64-softmmu is a
> superset of riscv32-softmmu which handles 32-, 64, and 128-bit ISAs, so
> concerning single-binary do we for the time being only need to support
> riscv64-softmmu?
>
Changes to riscv64 will probably impact riscv32 anyway, as they have
files in common (that's the tricky part of single binary porting effort).
A possible solution to this could be to duplicate (manually) compilation
units between 32 and 64 bits variants, but I don't think it's worth the
effort. It's better to do the change for all variants for a given
architecture so all the code is cleaned for a given base architecture.
> Let me know what you think of the direction taken here and if you would
> prefer something else.
>
Overall, most of the changes you do are correct, widening types, and
combining low/high part in single 64 bits integer. For this last part,
I'll let Riscv maintainers decide if they agree with the approach.
However, the main issue is that changing size impacts migration
(VMSTATE_UINT.*), which would suddenly create a breaking change when
importing 32 bits machines.
We have two ways to deal with it:
1. call it a day and make a breaking change.
On Arm side, we were lucky to not have cpu structure defined with any
target type, so the problem was not found yet. But we observed that
other architectures would need a solution.
If Riscv maintainers are ok for a breaking change, this is the
easiest/fastest solution.
2. introduce a backward compatibility change, to selectively import size
if we import from a past QEMU version. In this case, we would keep the
VMSTATE_UINTTL but adapt it to do the right thing when restoring, either
writing 32 or 64 bits.
I didn't dive deep enough in migration restore code to see if it's
easily doable, or not.
Let's see what people think of 1. first. On arm, this is very
conservative and migration backward compatibility has to work anyway.
Maybe it's more relaxed for riscv.
> Anton Johansson (34):
> target/riscv: Use 32 bits for misa extensions
> target/riscv: Fix size of trivial CPUArchState fields
> target/riscv: Fix size of mcause
> target/riscv: Fix size of mhartid
> target/riscv: Bugfix riscv_pmu_ctr_get_fixed_counters_val()
> target/riscv: Combine mhpmevent and mhpmeventh
> target/riscv: Combine mcyclecfg and mcyclecfgh
> target/riscv: Combine minstretcfg and minstretcfgh
> target/riscv: Combine mhpmcounter and mhpmcounterh
> target/riscv: Fix size of gpr and gprh
> target/riscv: Fix size of vector CSRs
> target/riscv: Fix size of pc, load_[val|res]
> target/riscv: Fix size of frm and fflags
> target/riscv: Fix size of badaddr and bins
> target/riscv: Fix size of guest_phys_fault_addr
> target/riscv: Fix size of priv_ver and vext_ver
> target/riscv: Fix size of retxh
> target/riscv: Fix size of ssp
> target/riscv: Fix size of excp_uw2
> target/riscv: Fix size of sw_check_code
> target/riscv: Fix size of priv
> target/riscv: Fix size of gei fields
> target/riscv: Fix size of [m|s|vs]iselect fields
> target/riscv: Fix arguments to board IMSIC emulation callbacks
> target/riscv: Fix size of irq_overflow_left
> target/riscv: Indent PMUFixedCtrState correctly
> target/riscv: Replace target_ulong in riscv_cpu_get_trap_name()
> target/riscv: Replace target_ulong in riscv_ctr_add_entry()
> target/riscv: Fix size of trigger data
> target/riscv: Fix size of mseccfg
> target/riscv: Move debug.h include away from cpu.h
> target/riscv: Move CSR declarations to separate csr.h header
> target/riscv: Introduce externally facing CSR access functions
> target/riscv: Make pmp.h target_ulong agnostic
>
> target/riscv/cpu.h | 341 +++++++-----------
> target/riscv/csr.h | 93 +++++
> target/riscv/debug.h | 2 -
> target/riscv/pmp.h | 20 +-
> hw/intc/riscv_imsic.c | 34 +-
> hw/riscv/riscv_hart.c | 7 +-
> linux-user/riscv/signal.c | 5 +-
> target/riscv/cpu.c | 11 +-
> target/riscv/cpu_helper.c | 37 +-
> target/riscv/csr.c | 284 ++++++++-------
> target/riscv/debug.c | 1 +
> target/riscv/fpu_helper.c | 6 +-
> target/riscv/gdbstub.c | 1 +
> target/riscv/kvm/kvm-cpu.c | 1 +
> target/riscv/machine.c | 133 ++++---
> target/riscv/op_helper.c | 1 +
> target/riscv/pmp.c | 13 +-
> target/riscv/pmu.c | 150 ++------
> target/riscv/tcg/tcg-cpu.c | 3 +-
> target/riscv/th_csr.c | 1 +
> target/riscv/translate.c | 53 ++-
> target/riscv/vector_helper.c | 22 +-
> .../riscv/insn_trans/trans_privileged.c.inc | 2 +-
> target/riscv/insn_trans/trans_rvi.c.inc | 16 +-
> target/riscv/insn_trans/trans_rvm.c.inc | 16 +-
> target/riscv/insn_trans/trans_rvv.c.inc | 22 +-
> target/riscv/insn_trans/trans_rvzicfiss.c.inc | 22 +-
> 27 files changed, 644 insertions(+), 653 deletions(-)
> create mode 100644 target/riscv/csr.h
>
Thanks,
Pierrick
next prev parent reply other threads:[~2025-09-29 22:46 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-24 7:20 [RFC PATCH 00/34] single-binary: Make riscv cpu.h target independent Anton Johansson via
2025-09-24 7:20 ` [RFC PATCH 01/34] target/riscv: Use 32 bits for misa extensions Anton Johansson via
2025-09-24 10:43 ` Philippe Mathieu-Daudé
2025-09-24 13:00 ` Anton Johansson via
2025-09-24 7:20 ` [RFC PATCH 02/34] target/riscv: Fix size of trivial CPUArchState fields Anton Johansson via
2025-09-24 21:36 ` Richard Henderson
2025-09-28 23:15 ` Alistair Francis
2025-09-29 9:39 ` anjo@rev.ng via
2025-09-24 7:20 ` [RFC PATCH 03/34] target/riscv: Fix size of mcause Anton Johansson via
2025-09-24 21:37 ` Richard Henderson
2025-09-29 9:39 ` Anton Johansson via
2025-09-24 7:20 ` [RFC PATCH 04/34] target/riscv: Fix size of mhartid Anton Johansson via
2025-09-24 7:20 ` [RFC PATCH 05/34] target/riscv: Bugfix riscv_pmu_ctr_get_fixed_counters_val() Anton Johansson via
2025-09-24 7:20 ` [RFC PATCH 06/34] target/riscv: Combine mhpmevent and mhpmeventh Anton Johansson via
2025-09-24 7:20 ` [RFC PATCH 07/34] target/riscv: Combine mcyclecfg and mcyclecfgh Anton Johansson via
2025-09-24 7:20 ` [RFC PATCH 08/34] target/riscv: Combine minstretcfg and minstretcfgh Anton Johansson via
2025-09-24 7:20 ` [RFC PATCH 09/34] target/riscv: Combine mhpmcounter and mhpmcounterh Anton Johansson via
2025-09-24 7:21 ` [RFC PATCH 10/34] target/riscv: Fix size of gpr and gprh Anton Johansson via
2025-09-24 7:21 ` [RFC PATCH 11/34] target/riscv: Fix size of vector CSRs Anton Johansson via
2025-09-24 7:21 ` [RFC PATCH 12/34] target/riscv: Fix size of pc, load_[val|res] Anton Johansson via
2025-09-24 7:21 ` [RFC PATCH 13/34] target/riscv: Fix size of frm and fflags Anton Johansson via
2025-09-24 7:21 ` [RFC PATCH 14/34] target/riscv: Fix size of badaddr and bins Anton Johansson via
2025-09-24 7:21 ` [RFC PATCH 15/34] target/riscv: Fix size of guest_phys_fault_addr Anton Johansson via
2025-09-24 7:21 ` [RFC PATCH 16/34] target/riscv: Fix size of priv_ver and vext_ver Anton Johansson via
2025-09-24 7:21 ` [RFC PATCH 17/34] target/riscv: Fix size of retxh Anton Johansson via
2025-09-24 7:21 ` [RFC PATCH 18/34] target/riscv: Fix size of ssp Anton Johansson via
2025-09-24 7:21 ` [RFC PATCH 19/34] target/riscv: Fix size of excp_uw2 Anton Johansson via
2025-09-24 7:21 ` [RFC PATCH 20/34] target/riscv: Fix size of sw_check_code Anton Johansson via
2025-09-24 7:21 ` [RFC PATCH 21/34] target/riscv: Fix size of priv Anton Johansson via
2025-09-24 7:21 ` [RFC PATCH 22/34] target/riscv: Fix size of gei fields Anton Johansson via
2025-09-24 7:21 ` [RFC PATCH 23/34] target/riscv: Fix size of [m|s|vs]iselect fields Anton Johansson via
2025-09-24 7:21 ` [RFC PATCH 24/34] target/riscv: Fix arguments to board IMSIC emulation callbacks Anton Johansson via
2025-09-24 7:21 ` [RFC PATCH 25/34] target/riscv: Fix size of irq_overflow_left Anton Johansson via
2025-09-24 7:21 ` [RFC PATCH 26/34] target/riscv: Indent PMUFixedCtrState correctly Anton Johansson via
2025-09-24 7:21 ` [RFC PATCH 27/34] target/riscv: Replace target_ulong in riscv_cpu_get_trap_name() Anton Johansson via
2025-09-24 7:21 ` [RFC PATCH 28/34] target/riscv: Replace target_ulong in riscv_ctr_add_entry() Anton Johansson via
2025-09-24 7:21 ` [RFC PATCH 29/34] target/riscv: Fix size of trigger data Anton Johansson via
2025-09-24 7:21 ` [RFC PATCH 30/34] target/riscv: Fix size of mseccfg Anton Johansson via
2025-09-24 7:21 ` [RFC PATCH 31/34] target/riscv: Move debug.h include away from cpu.h Anton Johansson via
2025-09-24 7:21 ` [RFC PATCH 32/34] target/riscv: Move CSR declarations to separate csr.h header Anton Johansson via
2025-09-24 7:21 ` [RFC PATCH 33/34] target/riscv: Introduce externally facing CSR access functions Anton Johansson via
2025-09-24 7:21 ` [RFC PATCH 34/34] target/riscv: Make pmp.h target_ulong agnostic Anton Johansson via
2025-09-29 22:44 ` Pierrick Bouvier [this message]
2025-09-30 2:03 ` [RFC PATCH 00/34] single-binary: Make riscv cpu.h target independent Philippe Mathieu-Daudé
2025-09-30 18:08 ` Pierrick Bouvier
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=427722cf-c91c-4c2f-b5a0-8d127c3dddea@linaro.org \
--to=pierrick.bouvier@linaro.org \
--cc=alistair.francis@wdc.com \
--cc=anjo@rev.ng \
--cc=palmer@dabbelt.com \
--cc=philmd@linaro.org \
--cc=qemu-devel@nongnu.org \
/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).