Message ID | 20230706101738.460804-19-dbarboza@ventanamicro.com |
---|---|
State | New |
Headers | show |
Series | target/riscv, KVM: fixes and enhancements | expand |
On Thu, Jul 6, 2023 at 8:19 PM Daniel Henrique Barboza <dbarboza@ventanamicro.com> wrote: > > We're now ready to update the multi-letter extensions status for KVM. > > kvm_riscv_update_cpu_cfg_isa_ext() is called called during vcpu creation > time to verify which user options changes host defaults (via the 'user_set' > flag) and tries to write them back to KVM. > > Failure to commit a change to KVM is only ignored in case KVM doesn't > know about the extension (-EINVAL error code) and the user wanted to > disable the given extension. Otherwise we're going to abort the boot > process. > > Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> > Reviewed-by: Andrew Jones <ajones@ventanamicro.com> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Alistair > --- > target/riscv/kvm.c | 27 +++++++++++++++++++++++++++ > 1 file changed, 27 insertions(+) > > diff --git a/target/riscv/kvm.c b/target/riscv/kvm.c > index 2d39ec154f..ba940e570e 100644 > --- a/target/riscv/kvm.c > +++ b/target/riscv/kvm.c > @@ -273,6 +273,32 @@ static void kvm_cpu_set_multi_ext_cfg(Object *obj, Visitor *v, > kvm_cpu_cfg_set(cpu, multi_ext_cfg, value); > } > > +static void kvm_riscv_update_cpu_cfg_isa_ext(RISCVCPU *cpu, CPUState *cs) > +{ > + CPURISCVState *env = &cpu->env; > + uint64_t id, reg; > + int i, ret; > + > + for (i = 0; i < ARRAY_SIZE(kvm_multi_ext_cfgs); i++) { > + KVMCPUConfig *multi_ext_cfg = &kvm_multi_ext_cfgs[i]; > + > + if (!multi_ext_cfg->user_set) { > + continue; > + } > + > + id = kvm_riscv_reg_id(env, KVM_REG_RISCV_ISA_EXT, > + multi_ext_cfg->kvm_reg_id); > + reg = kvm_cpu_cfg_get(cpu, multi_ext_cfg); > + ret = kvm_set_one_reg(cs, id, ®); > + if (ret != 0) { > + error_report("Unable to %s extension %s in KVM, error %d", > + reg ? "enable" : "disable", > + multi_ext_cfg->name, ret); > + exit(EXIT_FAILURE); > + } > + } > +} > + > static void kvm_riscv_add_cpu_user_properties(Object *cpu_obj) > { > int i; > @@ -792,6 +818,7 @@ int kvm_arch_init_vcpu(CPUState *cs) > } > > kvm_riscv_update_cpu_misa_ext(cpu, cs); > + kvm_riscv_update_cpu_cfg_isa_ext(cpu, cs); > > return ret; > } > -- > 2.41.0 > >
diff --git a/target/riscv/kvm.c b/target/riscv/kvm.c index 2d39ec154f..ba940e570e 100644 --- a/target/riscv/kvm.c +++ b/target/riscv/kvm.c @@ -273,6 +273,32 @@ static void kvm_cpu_set_multi_ext_cfg(Object *obj, Visitor *v, kvm_cpu_cfg_set(cpu, multi_ext_cfg, value); } +static void kvm_riscv_update_cpu_cfg_isa_ext(RISCVCPU *cpu, CPUState *cs) +{ + CPURISCVState *env = &cpu->env; + uint64_t id, reg; + int i, ret; + + for (i = 0; i < ARRAY_SIZE(kvm_multi_ext_cfgs); i++) { + KVMCPUConfig *multi_ext_cfg = &kvm_multi_ext_cfgs[i]; + + if (!multi_ext_cfg->user_set) { + continue; + } + + id = kvm_riscv_reg_id(env, KVM_REG_RISCV_ISA_EXT, + multi_ext_cfg->kvm_reg_id); + reg = kvm_cpu_cfg_get(cpu, multi_ext_cfg); + ret = kvm_set_one_reg(cs, id, ®); + if (ret != 0) { + error_report("Unable to %s extension %s in KVM, error %d", + reg ? "enable" : "disable", + multi_ext_cfg->name, ret); + exit(EXIT_FAILURE); + } + } +} + static void kvm_riscv_add_cpu_user_properties(Object *cpu_obj) { int i; @@ -792,6 +818,7 @@ int kvm_arch_init_vcpu(CPUState *cs) } kvm_riscv_update_cpu_misa_ext(cpu, cs); + kvm_riscv_update_cpu_cfg_isa_ext(cpu, cs); return ret; }