Skip to content

Commit 38c26bd

Browse files
James Morsegregkh
authored andcommitted
KVM: arm64: Allow SMCCC_ARCH_WORKAROUND_3 to be discovered and migrated
commit a5905d6 upstream. KVM allows the guest to discover whether the ARCH_WORKAROUND SMCCC are implemented, and to preserve that state during migration through its firmware register interface. Add the necessary boiler plate for SMCCC_ARCH_WORKAROUND_3. Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: James Morse <james.morse@arm.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent e192c8b commit 38c26bd

3 files changed

Lines changed: 34 additions & 1 deletion

File tree

arch/arm64/include/uapi/asm/kvm.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,11 @@ struct kvm_vcpu_events {
273273
#define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_NOT_REQUIRED 3
274274
#define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_ENABLED (1U << 4)
275275

276+
#define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3 KVM_REG_ARM_FW_REG(3)
277+
#define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3_NOT_AVAIL 0
278+
#define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3_AVAIL 1
279+
#define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3_NOT_REQUIRED 2
280+
276281
/* SVE registers */
277282
#define KVM_REG_ARM64_SVE (0x15 << KVM_REG_ARM_COPROC_SHIFT)
278283

arch/arm64/kvm/hypercalls.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,18 @@ int kvm_hvc_call_handler(struct kvm_vcpu *vcpu)
5858
break;
5959
}
6060
break;
61+
case ARM_SMCCC_ARCH_WORKAROUND_3:
62+
switch (arm64_get_spectre_bhb_state()) {
63+
case SPECTRE_VULNERABLE:
64+
break;
65+
case SPECTRE_MITIGATED:
66+
val = SMCCC_RET_SUCCESS;
67+
break;
68+
case SPECTRE_UNAFFECTED:
69+
val = SMCCC_ARCH_WORKAROUND_RET_UNAFFECTED;
70+
break;
71+
}
72+
break;
6173
case ARM_SMCCC_HV_PV_TIME_FEATURES:
6274
val = SMCCC_RET_SUCCESS;
6375
break;

arch/arm64/kvm/psci.c

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ int kvm_psci_call(struct kvm_vcpu *vcpu)
397397

398398
int kvm_arm_get_fw_num_regs(struct kvm_vcpu *vcpu)
399399
{
400-
return 3; /* PSCI version and two workaround registers */
400+
return 4; /* PSCI version and three workaround registers */
401401
}
402402

403403
int kvm_arm_copy_fw_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uindices)
@@ -411,6 +411,9 @@ int kvm_arm_copy_fw_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uindices)
411411
if (put_user(KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2, uindices++))
412412
return -EFAULT;
413413

414+
if (put_user(KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3, uindices++))
415+
return -EFAULT;
416+
414417
return 0;
415418
}
416419

@@ -450,6 +453,17 @@ static int get_kernel_wa_level(u64 regid)
450453
case SPECTRE_VULNERABLE:
451454
return KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_NOT_AVAIL;
452455
}
456+
break;
457+
case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3:
458+
switch (arm64_get_spectre_bhb_state()) {
459+
case SPECTRE_VULNERABLE:
460+
return KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3_NOT_AVAIL;
461+
case SPECTRE_MITIGATED:
462+
return KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3_AVAIL;
463+
case SPECTRE_UNAFFECTED:
464+
return KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3_NOT_REQUIRED;
465+
}
466+
return KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3_NOT_AVAIL;
453467
}
454468

455469
return -EINVAL;
@@ -466,6 +480,7 @@ int kvm_arm_get_fw_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
466480
break;
467481
case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_1:
468482
case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2:
483+
case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3:
469484
val = get_kernel_wa_level(reg->id) & KVM_REG_FEATURE_LEVEL_MASK;
470485
break;
471486
default:
@@ -511,6 +526,7 @@ int kvm_arm_set_fw_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
511526
}
512527

513528
case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_1:
529+
case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3:
514530
if (val & ~KVM_REG_FEATURE_LEVEL_MASK)
515531
return -EINVAL;
516532

0 commit comments

Comments
 (0)