From: Richard Henderson <richard.henderson@linaro.org>
To: qemu-devel@nongnu.org
Subject: Re: [PATCH] target/riscv: fix C extension disabling on misa write
Date: Thu, 20 Feb 2025 10:49:34 -0800 [thread overview]
Message-ID: <97bea0ff-f93a-45a5-b8ec-2bb91e37f143@linaro.org> (raw)
In-Reply-To: <20250220163120.77328-1-vladimir.isaev@syntacore.com>
On 2/20/25 08:31, Vladimir Isaev wrote:
> According to spec:
> Writing misa may increase IALIGN, e.g., by disabling the "C" extension. If an instruction that would
> write misa increases IALIGN, and the subsequent instruction’s address is not IALIGN-bit aligned, the
> write to misa is suppressed, leaving misa unchanged.
>
> So we should suppress disabling "C" if it is already enabled and
> next instruction is not aligned to 4.
>
> Fixes: f18637cd611c ("RISC-V: Add misa runtime write support")
> Signed-off-by: Vladimir Isaev <vladimir.isaev@syntacore.com>
> ---
> target/riscv/csr.c | 7 ++++---
> 1 file changed, 4 insertions(+), 3 deletions(-)
>
> diff --git a/target/riscv/csr.c b/target/riscv/csr.c
> index afb7544f0780..32f9b7b16f6f 100644
> --- a/target/riscv/csr.c
> +++ b/target/riscv/csr.c
> @@ -2067,11 +2067,12 @@ static RISCVException write_misa(CPURISCVState *env, int csrno,
> val &= env->misa_ext_mask;
>
> /*
> - * Suppress 'C' if next instruction is not aligned
> + * Disabling 'C' increases IALIGN to 32. If subsequent instruction's address
> + * is not 32-bit aligned, write to misa is suppressed.
> * TODO: this should check next_pc
> */
> - if ((val & RVC) && (GETPC() & ~3) != 0) {
> - val &= ~RVC;
> + if (!(val & RVC) && (env->misa_ext & RVC) && (GETPC() & 0x3)) {
> + return RISCV_EXCP_NONE;
> }
GETPC is a host thing, not a target thing.
Both the old and new code are very wrong.
You wanted to check env->pc, but this isn't updated before calling gen_helper_csr*w.
The simplest fix is to make sure that happens in the translator.
A slightly more complex fix that does not require all csr writes to update the pc would
involve using cpu_unwind_state_data. See target/openrisc/sys_helper.c for an example.
r~
prev parent reply other threads:[~2025-02-20 18:50 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-20 16:31 [PATCH] target/riscv: fix C extension disabling on misa write Vladimir Isaev
2025-02-20 17:59 ` Daniel Henrique Barboza
2025-02-21 7:58 ` Vladimir Isaev
2025-02-21 9:13 ` Daniel Henrique Barboza
2025-02-20 18:49 ` Richard Henderson [this message]
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=97bea0ff-f93a-45a5-b8ec-2bb91e37f143@linaro.org \
--to=richard.henderson@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).