aboutsummaryrefslogtreecommitdiff
path: root/hw
diff options
context:
space:
mode:
authorFabiano Rosas <farosas@linux.ibm.com>2020-09-11 01:31:23 -0300
committerDavid Gibson <david@gibson.dropbear.id.au>2020-10-09 10:15:06 +1100
commitf0638a0b6bba455e8eaf518f23487d6ff1f59b5a (patch)
treec894e067f5fb9b461e7ebaaeab0defad3eca3682 /hw
parent497d415d76b9f59fcae27f22df1ca2c3fa4df64e (diff)
downloadqemu-f0638a0b6bba455e8eaf518f23487d6ff1f59b5a.zip
qemu-f0638a0b6bba455e8eaf518f23487d6ff1f59b5a.tar.gz
qemu-f0638a0b6bba455e8eaf518f23487d6ff1f59b5a.tar.bz2
spapr: Handle HPT allocation failure in nested guest
The nested KVM code does not yet support HPT guests. Calling the KVM_CAP_PPC_ALLOC_HTAB ioctl currently leads to KVM setting the guest as HPT and erroneously executing code in L1 that should only run in hypervisor mode, leading to an exception in the L1 vcpu thread when it enters the nested guest. This can be reproduced with -machine max-cpu-compat=power8 in the L2 guest command line. The KVM code has since been modified to fail the ioctl when running in a nested environment so QEMU needs to be able to handle that. This patch provides an error message informing the user about the lack of support for HPT in nested guests. Reported-by: Satheesh Rajendran <sathnaga@linux.vnet.ibm.com> Signed-off-by: Fabiano Rosas <farosas@linux.ibm.com> Message-Id: <20200911043123.204162-1-farosas@linux.ibm.com> Reviewed-by: Greg Kurz <groug@kaod.org> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Diffstat (limited to 'hw')
-rw-r--r--hw/ppc/spapr.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 2db810f..544a194 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -1483,6 +1483,12 @@ void spapr_reallocate_hpt(SpaprMachineState *spapr, int shift,
spapr_free_hpt(spapr);
rc = kvmppc_reset_htab(shift);
+
+ if (rc == -EOPNOTSUPP) {
+ error_setg(errp, "HPT not supported in nested guests");
+ return;
+ }
+
if (rc < 0) {
/* kernel-side HPT needed, but couldn't allocate one */
error_setg_errno(errp, errno,