mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
target/riscv: Fix write_misa vs aligned next_pc
Do not examine a random host return address, but
properly compute the next pc for the guest cpu.
Fixes: f18637cd61 ("RISC-V: Add misa runtime write support")
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Message-ID: <20250425152311.804338-8-richard.henderson@linaro.org>
[ Changes by AF:
- Change `& ~3` to `& 3`
]
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
committed by
Alistair Francis
parent
dd9953a554
commit
7b069906b6
+17
-5
@@ -30,6 +30,8 @@
|
||||
#include "accel/tcg/getpc.h"
|
||||
#include "qemu/guest-random.h"
|
||||
#include "qapi/error.h"
|
||||
#include "tcg/insn-start-words.h"
|
||||
#include "internals.h"
|
||||
#include <stdbool.h>
|
||||
|
||||
/* CSR function table public API */
|
||||
@@ -2099,6 +2101,19 @@ static RISCVException read_misa(CPURISCVState *env, int csrno,
|
||||
return RISCV_EXCP_NONE;
|
||||
}
|
||||
|
||||
static target_ulong get_next_pc(CPURISCVState *env, uintptr_t ra)
|
||||
{
|
||||
uint64_t data[INSN_START_WORDS];
|
||||
|
||||
/* Outside of a running cpu, env contains the next pc. */
|
||||
if (ra == 0 || !cpu_unwind_state_data(env_cpu(env), ra, data)) {
|
||||
return env->pc;
|
||||
}
|
||||
|
||||
/* Within unwind data, [0] is pc and [1] is the opcode. */
|
||||
return data[0] + insn_len(data[1]);
|
||||
}
|
||||
|
||||
static RISCVException write_misa(CPURISCVState *env, int csrno,
|
||||
target_ulong val, uintptr_t ra)
|
||||
{
|
||||
@@ -2114,11 +2129,8 @@ static RISCVException write_misa(CPURISCVState *env, int csrno,
|
||||
/* Mask extensions that are not supported by this hart */
|
||||
val &= env->misa_ext_mask;
|
||||
|
||||
/*
|
||||
* Suppress 'C' if next instruction is not aligned
|
||||
* TODO: this should check next_pc
|
||||
*/
|
||||
if ((val & RVC) && (GETPC() & ~3) != 0) {
|
||||
/* Suppress 'C' if next instruction is not aligned. */
|
||||
if ((val & RVC) && (get_next_pc(env, ra) & 3) != 0) {
|
||||
val &= ~RVC;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user