On Wed, Nov 01, 2023 at 05:41:48PM -0300, Daniel Henrique Barboza wrote: > The setter() for the boolean attributes that set satp_mode (sv32, sv39, > sv48, sv57, sv64) considers that the CPU will always do a > set_satp_mode_max_supported() during cpu_init(). > > This is not the case for the KVM 'host' CPU, and we'll add another CPU > that won't set satp_mode_max() during cpu_init(). Users should be able > to set a max_support in these circunstances. > > Allow cpu_riscv_set_satp() to set satp_mode_max_supported if the CPU > didn't set one prior. > > Signed-off-by: Daniel Henrique Barboza <dbarb...@ventanamicro.com> > --- > target/riscv/cpu.c | 11 +++++++++++ > 1 file changed, 11 insertions(+) > > diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c > index 822970345c..9f6837ecb7 100644 > --- a/target/riscv/cpu.c > +++ b/target/riscv/cpu.c > @@ -1100,6 +1100,7 @@ static void cpu_riscv_get_satp(Object *obj, Visitor *v, > const char *name, > static void cpu_riscv_set_satp(Object *obj, Visitor *v, const char *name, > void *opaque, Error **errp) > { > + RISCVCPU *cpu = RISCV_CPU(obj); > RISCVSATPMap *satp_map = opaque; > uint8_t satp = satp_mode_from_str(name); > bool value; > @@ -1108,6 +1109,16 @@ static void cpu_riscv_set_satp(Object *obj, Visitor > *v, const char *name, > return; > } > > + /* > + * Allow users to set satp max supported if the CPU didn't > + * set any during cpu_init(). First value set to 'true' > + * in this case is assumed to be the max supported for > + * the CPU.
Hmm, doesn't that mean if a user does -cpu rv64,sv39=true,sv48=true then the max is set to sv39 instead of sv48? I made a mistake in my last review by stating we shouldn't set the max supported satp for rv64i to the maximum satp that TCG supports. I forgot how all of it worked. Setting the _supported_ modes to the maximum that TCG supports makes sense as long as we don't default to any of them for rv64i. So, I think we should return the set_satp_mode_max_supported() to rv64i's definition (passing VM_1_10_SV57 or maybe even VM_1_10_SV64) and then change set_satp_mode_default_map() to error out for rv64i (or maybe for all "bare" type cpus). > + */ > + if (value && cpu->cfg.satp_mode.supported == 0) { > + set_satp_mode_max_supported(cpu, satp); > + } > + > satp_map->map = deposit32(satp_map->map, satp, 1, value); > satp_map->init |= 1 << satp; > } > -- > 2.41.0 > Thanks, drew