aboutsummaryrefslogtreecommitdiff
path: root/hw/ppc/spapr_rtas.c
diff options
context:
space:
mode:
authorNicholas Piggin <npiggin@gmail.com>2020-03-17 00:26:13 +1000
committerDavid Gibson <david@gibson.dropbear.id.au>2020-03-17 17:00:22 +1100
commit75aa803835a5e868292a476fd9b5099ffb619619 (patch)
tree794a136cf757da58ac5428a00b1a874f09967e4a /hw/ppc/spapr_rtas.c
parent0e236d347790b1d938909207d5db101ab705fdd4 (diff)
downloadqemu-75aa803835a5e868292a476fd9b5099ffb619619.zip
qemu-75aa803835a5e868292a476fd9b5099ffb619619.tar.gz
qemu-75aa803835a5e868292a476fd9b5099ffb619619.tar.bz2
ppc/spapr: Ignore common "ibm,nmi-interlock" Linux bug
Linux kernels call "ibm,nmi-interlock" in their system reset handlers contrary to PAPR. Returning an error because the CPU does not hold the interlock here causes Linux to print warning messages. PowerVM returns success in this case, so do the same for now. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Message-Id: <20200316142613.121089-9-npiggin@gmail.com> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Diffstat (limited to 'hw/ppc/spapr_rtas.c')
-rw-r--r--hw/ppc/spapr_rtas.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c
index 521e6b0..9fb8c86 100644
--- a/hw/ppc/spapr_rtas.c
+++ b/hw/ppc/spapr_rtas.c
@@ -461,8 +461,18 @@ static void rtas_ibm_nmi_interlock(PowerPCCPU *cpu,
}
if (spapr->fwnmi_machine_check_interlock != cpu->vcpu_id) {
- /* The vCPU that hit the NMI should invoke "ibm,nmi-interlock" */
- rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR);
+ /*
+ * The vCPU that hit the NMI should invoke "ibm,nmi-interlock"
+ * This should be PARAM_ERROR, but Linux calls "ibm,nmi-interlock"
+ * for system reset interrupts, despite them not being interlocked.
+ * PowerVM silently ignores this and returns success here. Returning
+ * failure causes Linux to print the error "FWNMI: nmi-interlock
+ * failed: -3", although no other apparent ill effects, this is a
+ * regression for the user when enabling FWNMI. So for now, match
+ * PowerVM. When most Linux clients are fixed, this could be
+ * changed.
+ */
+ rtas_st(rets, 0, RTAS_OUT_SUCCESS);
return;
}