On Wed, Feb 19, 2025 at 2:59 AM Paolo Bonzini <pbonz...@redhat.com> wrote: > > "supported" can be computed on the fly based on the max_satp_mode. > > Signed-off-by: Paolo Bonzini <pbonz...@redhat.com>
Reviewed-by: Alistair Francis <alistair.fran...@wdc.com> Alistair > --- > target/riscv/cpu_cfg.h | 4 +--- > target/riscv/cpu.c | 34 ++++++++++++++++++++++++---------- > 2 files changed, 25 insertions(+), 13 deletions(-) > > diff --git a/target/riscv/cpu_cfg.h b/target/riscv/cpu_cfg.h > index 28d8de978fa..1d7fff8decd 100644 > --- a/target/riscv/cpu_cfg.h > +++ b/target/riscv/cpu_cfg.h > @@ -29,11 +29,9 @@ > * > * init is a 16-bit bitmap used to make sure the user selected a correct > * configuration as per the specification. > - * > - * supported is a 16-bit bitmap used to reflect the hw capabilities. > */ > typedef struct { > - uint16_t map, init, supported; > + uint16_t map, init; > } RISCVSATPMap; > > struct RISCVCPUConfig { > diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c > index ce71ee95a52..86a048b62c5 100644 > --- a/target/riscv/cpu.c > +++ b/target/riscv/cpu.c > @@ -437,14 +437,27 @@ static void set_satp_mode_max_supported(RISCVCPU *cpu, > bool rv32 = riscv_cpu_mxl(&cpu->env) == MXL_RV32; > const bool *valid_vm = rv32 ? valid_vm_1_10_32 : valid_vm_1_10_64; > > - for (int i = 0; i <= satp_mode; ++i) { > - if (valid_vm[i]) { > - cpu->cfg.satp_mode.supported |= (1 << i); > - } > + assert(valid_vm[satp_mode]); > + cpu->cfg.max_satp_mode = satp_mode; > +} > + > +static bool get_satp_mode_supported(RISCVCPU *cpu, uint16_t *supported) > +{ > + bool rv32 = riscv_cpu_is_32bit(cpu); > + const bool *valid_vm = rv32 ? valid_vm_1_10_32 : valid_vm_1_10_64; > + int satp_mode = cpu->cfg.max_satp_mode; > + > + if (satp_mode == -1) { > + return false; > } > > - assert(cpu->cfg.satp_mode.supported & (1 << satp_mode)); > - cpu->cfg.max_satp_mode = satp_mode; > + *supported = 0; > + for (int i = 0; i <= satp_mode; ++i) { > + if (valid_vm[i]) { > + *supported |= (1 << i); > + } > + } > + return true; > } > > /* Set the satp mode to the max supported */ > @@ -1176,9 +1189,10 @@ static void riscv_cpu_disas_set_info(CPUState *s, > disassemble_info *info) > static void riscv_cpu_satp_mode_finalize(RISCVCPU *cpu, Error **errp) > { > bool rv32 = riscv_cpu_is_32bit(cpu); > + uint16_t supported; > uint8_t satp_mode_map_max; > > - if (cpu->cfg.max_satp_mode == -1) { > + if (!get_satp_mode_supported(cpu, &supported)) { > /* The CPU wants the hypervisor to decide which satp mode to allow */ > return; > } > @@ -1195,9 +1209,9 @@ static void riscv_cpu_satp_mode_finalize(RISCVCPU *cpu, > Error **errp) > */ > for (int i = 1; i < 16; ++i) { > if ((cpu->cfg.satp_mode.init & (1 << i)) && > - (cpu->cfg.satp_mode.supported & (1 << i))) { > + supported & (1 << i)) { > for (int j = i - 1; j >= 0; --j) { > - if (cpu->cfg.satp_mode.supported & (1 << j)) { > + if (supported & (1 << j)) { > cpu->cfg.max_satp_mode = j; > return; > } > @@ -1226,7 +1240,7 @@ static void riscv_cpu_satp_mode_finalize(RISCVCPU *cpu, > Error **errp) > for (int i = satp_mode_map_max - 1; i >= 0; --i) { > if (!(cpu->cfg.satp_mode.map & (1 << i)) && > (cpu->cfg.satp_mode.init & (1 << i)) && > - (cpu->cfg.satp_mode.supported & (1 << i))) { > + (supported & (1 << i))) { > error_setg(errp, "cannot disable %s satp mode if %s " > "is enabled", satp_mode_str(i, false), > satp_mode_str(satp_mode_map_max, false)); > -- > 2.48.1 > >