Skip to content

Commit a5905d6

Browse files
author
James Morse
committed
KVM: arm64: Allow SMCCC_ARCH_WORKAROUND_3 to be discovered and migrated
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) <[email protected]> Reviewed-by: Catalin Marinas <[email protected]> Signed-off-by: James Morse <[email protected]>
1 parent 558c303 commit a5905d6

File tree

3 files changed

+34
-1
lines changed

3 files changed

+34
-1
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,11 @@ struct kvm_arm_copy_mte_tags {
281281
#define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_NOT_REQUIRED 3
282282
#define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_ENABLED (1U << 4)
283283

284+
#define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3 KVM_REG_ARM_FW_REG(3)
285+
#define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3_NOT_AVAIL 0
286+
#define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3_AVAIL 1
287+
#define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3_NOT_REQUIRED 2
288+
284289
/* SVE registers */
285290
#define KVM_REG_ARM64_SVE (0x15 << KVM_REG_ARM_COPROC_SHIFT)
286291

arch/arm64/kvm/hypercalls.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,18 @@ int kvm_hvc_call_handler(struct kvm_vcpu *vcpu)
107107
break;
108108
}
109109
break;
110+
case ARM_SMCCC_ARCH_WORKAROUND_3:
111+
switch (arm64_get_spectre_bhb_state()) {
112+
case SPECTRE_VULNERABLE:
113+
break;
114+
case SPECTRE_MITIGATED:
115+
val[0] = SMCCC_RET_SUCCESS;
116+
break;
117+
case SPECTRE_UNAFFECTED:
118+
val[0] = SMCCC_ARCH_WORKAROUND_RET_UNAFFECTED;
119+
break;
120+
}
121+
break;
110122
case ARM_SMCCC_HV_PV_TIME_FEATURES:
111123
val[0] = SMCCC_RET_SUCCESS;
112124
break;

arch/arm64/kvm/psci.c

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

407407
int kvm_arm_get_fw_num_regs(struct kvm_vcpu *vcpu)
408408
{
409-
return 3; /* PSCI version and two workaround registers */
409+
return 4; /* PSCI version and three workaround registers */
410410
}
411411

412412
int kvm_arm_copy_fw_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uindices)
@@ -420,6 +420,9 @@ int kvm_arm_copy_fw_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uindices)
420420
if (put_user(KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2, uindices++))
421421
return -EFAULT;
422422

423+
if (put_user(KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3, uindices++))
424+
return -EFAULT;
425+
423426
return 0;
424427
}
425428

@@ -459,6 +462,17 @@ static int get_kernel_wa_level(u64 regid)
459462
case SPECTRE_VULNERABLE:
460463
return KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_NOT_AVAIL;
461464
}
465+
break;
466+
case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3:
467+
switch (arm64_get_spectre_bhb_state()) {
468+
case SPECTRE_VULNERABLE:
469+
return KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3_NOT_AVAIL;
470+
case SPECTRE_MITIGATED:
471+
return KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3_AVAIL;
472+
case SPECTRE_UNAFFECTED:
473+
return KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3_NOT_REQUIRED;
474+
}
475+
return KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3_NOT_AVAIL;
462476
}
463477

464478
return -EINVAL;
@@ -475,6 +489,7 @@ int kvm_arm_get_fw_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
475489
break;
476490
case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_1:
477491
case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2:
492+
case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3:
478493
val = get_kernel_wa_level(reg->id) & KVM_REG_FEATURE_LEVEL_MASK;
479494
break;
480495
default:
@@ -520,6 +535,7 @@ int kvm_arm_set_fw_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
520535
}
521536

522537
case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_1:
538+
case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3:
523539
if (val & ~KVM_REG_FEATURE_LEVEL_MASK)
524540
return -EINVAL;
525541

0 commit comments

Comments
 (0)