KVM: PPC: Book3S HV: Fix L2 guest reboot failure due to empty 'arch_compat'
Currently, rebooting a pseries nested qemu-kvm guest (L2) results in
below error as L1 qemu sends PVR value 'arch_compat' == 0 via
ppc_set_compat ioctl. This triggers a condition failure in
kvmppc_set_arch_compat() resulting in an EINVAL.
qemu-system-ppc64: Unable to set CPU compatibility mode in KVM: Invalid
argument
Also, a value of 0 for arch_compat generally refers the default
compatibility of the host. But, arch_compat, being a Guest Wide Element
in nested API v2, cannot be set to 0 in GSB as PowerVM (L0) expects a
non-zero value. A value of 0 triggers a kernel trap during a reboot and
consequently causes it to fail:
[ 22.106360] reboot: Restarting system
KVM: unknown exit, hardware reason
ffffffffffffffea
NIP
0000000000000100 LR
000000000000fe44 CTR
0000000000000000 XER
0000000020040092 CPU#0
MSR
0000000000001000 HID0
0000000000000000 HF
6c000000 iidx 3 didx 3
TB
00000000 00000000 DECR 0
GPR00
0000000000000000 0000000000000000 c000000002a8c300 000000007fe00000
GPR04
0000000000000000 0000000000000000 0000000000001002 8000000002803033
GPR08
000000000a000000 0000000000000000 0000000000000004 000000002fff0000
GPR12
0000000000000000 c000000002e10000 0000000105639200 0000000000000004
GPR16
0000000000000000 000000010563a090 0000000000000000 0000000000000000
GPR20
0000000105639e20 00000001056399c8 00007fffe54abab0 0000000105639288
GPR24
0000000000000000 0000000000000001 0000000000000001 0000000000000000
GPR28
0000000000000000 0000000000000000 c000000002b30840 0000000000000000
CR
00000000 [ - - - - - - - - ] RES 000@
ffffffffffffffff
SRR0
0000000000000000 SRR1
0000000000000000 PVR
0000000000800200 VRSAVE
0000000000000000
SPRG0
0000000000000000 SPRG1
0000000000000000 SPRG2
0000000000000000 SPRG3
0000000000000000
SPRG4
0000000000000000 SPRG5
0000000000000000 SPRG6
0000000000000000 SPRG7
0000000000000000
HSRR0
0000000000000000 HSRR1
0000000000000000
CFAR
0000000000000000
LPCR
0000000000020400
PTCR
0000000000000000 DAR
0000000000000000 DSISR
0000000000000000
kernel:trap=0xffffffea | pc=0x100 | msr=0x1000
This patch updates kvmppc_set_arch_compat() to use the host PVR value if
'compat_pvr' == 0 indicating that qemu doesn't want to enforce any
specific PVR compat mode.
The relevant part of the code might need a rework if PowerVM implements
a support for `arch_compat == 0` in nestedv2 API.
Fixes: 19d31c5f1157 ("KVM: PPC: Add support for nestedv2 guests")
Reviewed-by: "Aneesh Kumar K.V (IBM)" <aneesh.kumar@kernel.org>
Reviewed-by: Vaibhav Jain <vaibhav@linux.ibm.com>
Signed-off-by: Amit Machhiwal <amachhiw@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/20240207054526.3720087-1-amachhiw@linux.ibm.com