ppc/spapr: KVM FWNMI should not be enabled until guest requests it
The KVM FWNMI capability should be enabled with the "ibm,nmi-register" rtas call. Although MCEs from KVM will be delivered as architected interrupts to the guest before "ibm,nmi-register" is called, KVM has different behaviour depending on whether the guest has enabled FWNMI (it attempts to do more recovery on behalf of a non-FWNMI guest). Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Message-Id: <20200325142906.221248-2-npiggin@gmail.com> Reviewed-by: Greg Kurz <groug@kaod.org> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
79178edd2a
commit
ec010c0066
@ -517,9 +517,10 @@ static void cap_fwnmi_apply(SpaprMachineState *spapr, uint8_t val,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (kvm_enabled()) {
|
if (kvm_enabled()) {
|
||||||
if (kvmppc_set_fwnmi() < 0) {
|
if (!kvmppc_get_fwnmi()) {
|
||||||
error_setg(errp, "Firmware Assisted Non-Maskable Interrupts(FWNMI) "
|
error_setg(errp,
|
||||||
"not supported by KVM");
|
"Firmware Assisted Non-Maskable Interrupts(FWNMI) not supported by KVM.");
|
||||||
|
error_append_hint(errp, "Try appending -machine cap-fwnmi=off\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -437,6 +437,13 @@ static void rtas_ibm_nmi_register(PowerPCCPU *cpu,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (kvm_enabled()) {
|
||||||
|
if (kvmppc_set_fwnmi() < 0) {
|
||||||
|
rtas_st(rets, 0, RTAS_OUT_NOT_SUPPORTED);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
spapr->fwnmi_system_reset_addr = sreset_addr;
|
spapr->fwnmi_system_reset_addr = sreset_addr;
|
||||||
spapr->fwnmi_machine_check_addr = mce_addr;
|
spapr->fwnmi_machine_check_addr = mce_addr;
|
||||||
|
|
||||||
|
@ -88,6 +88,7 @@ static int cap_ppc_safe_indirect_branch;
|
|||||||
static int cap_ppc_count_cache_flush_assist;
|
static int cap_ppc_count_cache_flush_assist;
|
||||||
static int cap_ppc_nested_kvm_hv;
|
static int cap_ppc_nested_kvm_hv;
|
||||||
static int cap_large_decr;
|
static int cap_large_decr;
|
||||||
|
static int cap_fwnmi;
|
||||||
|
|
||||||
static uint32_t debug_inst_opcode;
|
static uint32_t debug_inst_opcode;
|
||||||
|
|
||||||
@ -136,6 +137,7 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
|
|||||||
kvmppc_get_cpu_characteristics(s);
|
kvmppc_get_cpu_characteristics(s);
|
||||||
cap_ppc_nested_kvm_hv = kvm_vm_check_extension(s, KVM_CAP_PPC_NESTED_HV);
|
cap_ppc_nested_kvm_hv = kvm_vm_check_extension(s, KVM_CAP_PPC_NESTED_HV);
|
||||||
cap_large_decr = kvmppc_get_dec_bits();
|
cap_large_decr = kvmppc_get_dec_bits();
|
||||||
|
cap_fwnmi = kvm_vm_check_extension(s, KVM_CAP_PPC_FWNMI);
|
||||||
/*
|
/*
|
||||||
* Note: setting it to false because there is not such capability
|
* Note: setting it to false because there is not such capability
|
||||||
* in KVM at this moment.
|
* in KVM at this moment.
|
||||||
@ -2064,6 +2066,11 @@ void kvmppc_set_mpic_proxy(PowerPCCPU *cpu, int mpic_proxy)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool kvmppc_get_fwnmi(void)
|
||||||
|
{
|
||||||
|
return cap_fwnmi;
|
||||||
|
}
|
||||||
|
|
||||||
int kvmppc_set_fwnmi(void)
|
int kvmppc_set_fwnmi(void)
|
||||||
{
|
{
|
||||||
PowerPCCPU *cpu = POWERPC_CPU(first_cpu);
|
PowerPCCPU *cpu = POWERPC_CPU(first_cpu);
|
||||||
|
@ -27,6 +27,7 @@ void kvmppc_enable_h_page_init(void);
|
|||||||
void kvmppc_set_papr(PowerPCCPU *cpu);
|
void kvmppc_set_papr(PowerPCCPU *cpu);
|
||||||
int kvmppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr);
|
int kvmppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr);
|
||||||
void kvmppc_set_mpic_proxy(PowerPCCPU *cpu, int mpic_proxy);
|
void kvmppc_set_mpic_proxy(PowerPCCPU *cpu, int mpic_proxy);
|
||||||
|
bool kvmppc_get_fwnmi(void);
|
||||||
int kvmppc_set_fwnmi(void);
|
int kvmppc_set_fwnmi(void);
|
||||||
int kvmppc_smt_threads(void);
|
int kvmppc_smt_threads(void);
|
||||||
void kvmppc_error_append_smt_possible_hint(Error *const *errp);
|
void kvmppc_error_append_smt_possible_hint(Error *const *errp);
|
||||||
@ -163,6 +164,11 @@ static inline void kvmppc_set_mpic_proxy(PowerPCCPU *cpu, int mpic_proxy)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool kvmppc_get_fwnmi(void)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static inline int kvmppc_set_fwnmi(void)
|
static inline int kvmppc_set_fwnmi(void)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
|
Loading…
Reference in New Issue
Block a user