Skip to content

Commit 96e266e

Browse files
Amit Machhiwalmpe
authored andcommitted
KVM: PPC: Book3S HV: Add Power11 capability support for Nested PAPR guests
The Power11 architected and raw mode support in Linux was merged in commit c2ed087 ("powerpc: Add Power11 architected and raw mode"), and the corresponding support in QEMU is pending in [1], which is currently in its V6. Currently, booting a KVM guest inside a pseries LPAR (Logical Partition) on a kernel without P11 support results the guest boot in a Power10 compatibility mode (i.e., with logical PVR of Power10). However, booting a KVM guest on a kernel with P11 support causes the following boot crash. On a Power11 LPAR, the Power Hypervisor (L0) returns a support for both Power10 and Power11 capabilities through H_GUEST_GET_CAPABILITIES hcall. However, KVM currently supports only Power10 capabilities, resulting in only Power10 capabilities being set as "nested capabilities" via an H_GUEST_SET_CAPABILITIES hcall. In the guest entry path, gs_msg_ops_kvmhv_nestedv2_config_fill_info() is called by kvmhv_nestedv2_flush_vcpu() to fill the GSB (Guest State Buffer) elements. The arch_compat is set to the logical PVR of Power11, followed by an H_GUEST_SET_STATE hcall. This hcall returns H_INVALID_ELEMENT_VALUE as a return code when setting a Power11 logical PVR, as only Power10 capabilities were communicated as supported between PHYP and KVM, utimately resulting in the KVM guest boot crash. KVM: unknown exit, hardware reason ffffffffffffffea NIP 000000007daf97e0 LR 000000007daf1aec CTR 000000007daf1ab4 XER 0000000020040000 CPU#0 MSR 8000000000103000 HID0 0000000000000000 HF 6c002000 iidx 3 didx 3 TB 00000000 00000000 DECR 0 GPR00 8000000000003000 000000007e580e20 000000007db26700 0000000000000000 GPR04 00000000041a0c80 000000007df7f000 0000000000200000 000000007df7f000 GPR08 000000007db6d5d8 000000007e65fa90 000000007db6d5d0 0000000000003000 GPR12 8000000000000001 0000000000000000 0000000000000000 0000000000000000 GPR16 0000000000000000 0000000000000000 0000000000000000 0000000000000000 GPR20 0000000000000000 0000000000000000 0000000000000000 000000007db21a30 GPR24 000000007db65000 0000000000000000 0000000000000000 0000000000000003 GPR28 000000007db6d5e0 000000007db22220 000000007daf27ac 000000007db75000 CR 20000404 [ E - - - - G - G ] RES 000@ffffffffffffffff SRR0 000000007daf97e0 SRR1 8000000000102000 PVR 0000000000820200 VRSAVE 0000000000000000 SPRG0 0000000000000000 SPRG1 000000000000ff20 SPRG2 0000000000000000 SPRG3 0000000000000000 SPRG4 0000000000000000 SPRG5 0000000000000000 SPRG6 0000000000000000 SPRG7 0000000000000000 CFAR 0000000000000000 LPCR 0000000000020400 PTCR 0000000000000000 DAR 0000000000000000 DSISR 0000000000000000 Fix this by adding the Power11 capability support and the required plumbing in place. Note: * Booting a Power11 KVM nested PAPR guest requires [1] in QEMU. [1] https://lore.kernel.org/all/[email protected]/ Signed-off-by: Amit Machhiwal <[email protected]> Signed-off-by: Michael Ellerman <[email protected]> Link: https://patch.msgid.link/[email protected]
1 parent 1db6a4e commit 96e266e

File tree

5 files changed

+17
-8
lines changed

5 files changed

+17
-8
lines changed

arch/powerpc/include/asm/cputable.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ static inline void cpu_feature_keys_init(void) { }
193193
#define CPU_FTR_ARCH_31 LONG_ASM_CONST(0x0004000000000000)
194194
#define CPU_FTR_DAWR1 LONG_ASM_CONST(0x0008000000000000)
195195
#define CPU_FTR_DEXCR_NPHIE LONG_ASM_CONST(0x0010000000000000)
196+
#define CPU_FTR_P11_PVR LONG_ASM_CONST(0x0020000000000000)
196197

197198
#ifndef __ASSEMBLY__
198199

@@ -454,7 +455,7 @@ static inline void cpu_feature_keys_init(void) { }
454455
CPU_FTR_DAWR | CPU_FTR_DAWR1 | \
455456
CPU_FTR_DEXCR_NPHIE)
456457

457-
#define CPU_FTRS_POWER11 CPU_FTRS_POWER10
458+
#define CPU_FTRS_POWER11 (CPU_FTRS_POWER10 | CPU_FTR_P11_PVR)
458459

459460
#define CPU_FTRS_CELL (CPU_FTR_LWSYNC | \
460461
CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \
@@ -475,15 +476,15 @@ static inline void cpu_feature_keys_init(void) { }
475476
(CPU_FTRS_POWER7 | CPU_FTRS_POWER8E | CPU_FTRS_POWER8 | \
476477
CPU_FTR_ALTIVEC_COMP | CPU_FTR_VSX_COMP | CPU_FTRS_POWER9 | \
477478
CPU_FTRS_POWER9_DD2_1 | CPU_FTRS_POWER9_DD2_2 | \
478-
CPU_FTRS_POWER9_DD2_3 | CPU_FTRS_POWER10)
479+
CPU_FTRS_POWER9_DD2_3 | CPU_FTRS_POWER10 | CPU_FTRS_POWER11)
479480
#else
480481
#define CPU_FTRS_POSSIBLE \
481482
(CPU_FTRS_PPC970 | CPU_FTRS_POWER5 | \
482483
CPU_FTRS_POWER6 | CPU_FTRS_POWER7 | CPU_FTRS_POWER8E | \
483484
CPU_FTRS_POWER8 | CPU_FTRS_CELL | CPU_FTRS_PA6T | \
484485
CPU_FTR_VSX_COMP | CPU_FTR_ALTIVEC_COMP | CPU_FTRS_POWER9 | \
485486
CPU_FTRS_POWER9_DD2_1 | CPU_FTRS_POWER9_DD2_2 | \
486-
CPU_FTRS_POWER9_DD2_3 | CPU_FTRS_POWER10)
487+
CPU_FTRS_POWER9_DD2_3 | CPU_FTRS_POWER10 | CPU_FTRS_POWER11)
487488
#endif /* CONFIG_CPU_LITTLE_ENDIAN */
488489
#endif
489490
#else
@@ -547,15 +548,15 @@ enum {
547548
(CPU_FTRS_POSSIBLE & ~CPU_FTR_HVMODE & ~CPU_FTR_DBELL & \
548549
CPU_FTRS_POWER7 & CPU_FTRS_POWER8E & CPU_FTRS_POWER8 & \
549550
CPU_FTRS_POWER9 & CPU_FTRS_POWER9_DD2_1 & CPU_FTRS_POWER9_DD2_2 & \
550-
CPU_FTRS_POWER10 & CPU_FTRS_DT_CPU_BASE)
551+
CPU_FTRS_POWER10 & CPU_FTRS_POWER11 & CPU_FTRS_DT_CPU_BASE)
551552
#else
552553
#define CPU_FTRS_ALWAYS \
553554
(CPU_FTRS_PPC970 & CPU_FTRS_POWER5 & \
554555
CPU_FTRS_POWER6 & CPU_FTRS_POWER7 & CPU_FTRS_CELL & \
555556
CPU_FTRS_PA6T & CPU_FTRS_POWER8 & CPU_FTRS_POWER8E & \
556557
~CPU_FTR_HVMODE & ~CPU_FTR_DBELL & CPU_FTRS_POSSIBLE & \
557558
CPU_FTRS_POWER9 & CPU_FTRS_POWER9_DD2_1 & CPU_FTRS_POWER9_DD2_2 & \
558-
CPU_FTRS_POWER10 & CPU_FTRS_DT_CPU_BASE)
559+
CPU_FTRS_POWER10 & CPU_FTRS_POWER11 & CPU_FTRS_DT_CPU_BASE)
559560
#endif /* CONFIG_CPU_LITTLE_ENDIAN */
560561
#endif
561562
#else

arch/powerpc/include/asm/hvcall.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,7 @@
495495
#define H_GUEST_CAP_COPY_MEM (1UL<<(63-0))
496496
#define H_GUEST_CAP_POWER9 (1UL<<(63-1))
497497
#define H_GUEST_CAP_POWER10 (1UL<<(63-2))
498+
#define H_GUEST_CAP_POWER11 (1UL<<(63-3))
498499
#define H_GUEST_CAP_BITMAP2 (1UL<<(63-63))
499500

500501
#ifndef __ASSEMBLY__

arch/powerpc/kvm/book3s_hv.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,10 @@ static inline unsigned long map_pcr_to_cap(unsigned long pcr)
400400
cap = H_GUEST_CAP_POWER9;
401401
break;
402402
case PCR_ARCH_31:
403-
cap = H_GUEST_CAP_POWER10;
403+
if (cpu_has_feature(CPU_FTR_P11_PVR))
404+
cap = H_GUEST_CAP_POWER11;
405+
else
406+
cap = H_GUEST_CAP_POWER10;
404407
break;
405408
default:
406409
break;
@@ -415,7 +418,7 @@ static int kvmppc_set_arch_compat(struct kvm_vcpu *vcpu, u32 arch_compat)
415418
struct kvmppc_vcore *vc = vcpu->arch.vcore;
416419

417420
/* We can (emulate) our own architecture version and anything older */
418-
if (cpu_has_feature(CPU_FTR_ARCH_31))
421+
if (cpu_has_feature(CPU_FTR_P11_PVR) || cpu_has_feature(CPU_FTR_ARCH_31))
419422
host_pcr_bit = PCR_ARCH_31;
420423
else if (cpu_has_feature(CPU_FTR_ARCH_300))
421424
host_pcr_bit = PCR_ARCH_300;

arch/powerpc/kvm/book3s_hv_nested.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,8 @@ long kvmhv_nested_init(void)
445445
if (rc == H_SUCCESS) {
446446
unsigned long capabilities = 0;
447447

448+
if (cpu_has_feature(CPU_FTR_P11_PVR))
449+
capabilities |= H_GUEST_CAP_POWER11;
448450
if (cpu_has_feature(CPU_FTR_ARCH_31))
449451
capabilities |= H_GUEST_CAP_POWER10;
450452
if (cpu_has_feature(CPU_FTR_ARCH_300))

arch/powerpc/kvm/book3s_hv_nestedv2.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,9 @@ static int gs_msg_ops_vcpu_fill_info(struct kvmppc_gs_buff *gsb,
370370
* default to L1's PVR.
371371
*/
372372
if (!vcpu->arch.vcore->arch_compat) {
373-
if (cpu_has_feature(CPU_FTR_ARCH_31))
373+
if (cpu_has_feature(CPU_FTR_P11_PVR))
374+
arch_compat = PVR_ARCH_31_P11;
375+
else if (cpu_has_feature(CPU_FTR_ARCH_31))
374376
arch_compat = PVR_ARCH_31;
375377
else if (cpu_has_feature(CPU_FTR_ARCH_300))
376378
arch_compat = PVR_ARCH_300;

0 commit comments

Comments
 (0)