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 <[email protected]> --- 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. + */ + 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
