Skip to content

Commit 94f296d

Browse files
Marc Zyngieroupton
authored andcommitted
KVM: arm64: Move NV-specific capping to idreg sanitisation
Instead of applying the NV idreg limits at run time, switch to doing it at the same time as the reset of the VM initialisation. This will make things much simpler once we introduce vcpu-driven variants of NV. Signed-off-by: Marc Zyngier <maz@kernel.org> Reviewed-by: Joey Gouly <joey.gouly@arm.com> Link: https://lore.kernel.org/r/20250220134907.554085-10-maz@kernel.org Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
1 parent e7ef6ed commit 94f296d

File tree

3 files changed

+5
-44
lines changed

3 files changed

+5
-44
lines changed

arch/arm64/include/asm/kvm_nested.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ static inline bool kvm_supported_tlbi_s1e2_op(struct kvm_vcpu *vpcu, u32 instr)
188188
}
189189

190190
int kvm_init_nv_sysregs(struct kvm_vcpu *vcpu);
191+
u64 limit_nv_id_reg(struct kvm *kvm, u32 reg, u64 val);
191192

192193
#ifdef CONFIG_ARM64_PTR_AUTH
193194
bool kvm_auth_eretax(struct kvm_vcpu *vcpu, u64 *elr);

arch/arm64/kvm/nested.c

Lines changed: 1 addition & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -804,7 +804,7 @@ void kvm_arch_flush_shadow_all(struct kvm *kvm)
804804
* This list should get updated as new features get added to the NV
805805
* support, and new extension to the architecture.
806806
*/
807-
static u64 limit_nv_id_reg(struct kvm *kvm, u32 reg, u64 val)
807+
u64 limit_nv_id_reg(struct kvm *kvm, u32 reg, u64 val)
808808
{
809809
switch (reg) {
810810
case SYS_ID_AA64ISAR0_EL1:
@@ -929,47 +929,6 @@ static u64 limit_nv_id_reg(struct kvm *kvm, u32 reg, u64 val)
929929
return val;
930930
}
931931

932-
static void limit_nv_id_regs(struct kvm *kvm)
933-
{
934-
u64 val;
935-
936-
val = kvm_read_vm_id_reg(kvm, SYS_ID_AA64ISAR0_EL1);
937-
val = limit_nv_id_reg(kvm, SYS_ID_AA64ISAR0_EL1, val);
938-
kvm_set_vm_id_reg(kvm, SYS_ID_AA64ISAR0_EL1, val);
939-
940-
val = kvm_read_vm_id_reg(kvm, SYS_ID_AA64ISAR1_EL1);
941-
val = limit_nv_id_reg(kvm, SYS_ID_AA64ISAR1_EL1, val);
942-
kvm_set_vm_id_reg(kvm, SYS_ID_AA64ISAR1_EL1, val);
943-
944-
val = kvm_read_vm_id_reg(kvm, SYS_ID_AA64PFR0_EL1);
945-
val = limit_nv_id_reg(kvm, SYS_ID_AA64PFR0_EL1, val);
946-
kvm_set_vm_id_reg(kvm, SYS_ID_AA64PFR0_EL1, val);
947-
948-
val = kvm_read_vm_id_reg(kvm, SYS_ID_AA64PFR1_EL1);
949-
val = limit_nv_id_reg(kvm, SYS_ID_AA64PFR1_EL1, val);
950-
kvm_set_vm_id_reg(kvm, SYS_ID_AA64PFR1_EL1, val);
951-
952-
val = kvm_read_vm_id_reg(kvm, SYS_ID_AA64MMFR0_EL1);
953-
val = limit_nv_id_reg(kvm, SYS_ID_AA64MMFR0_EL1, val);
954-
kvm_set_vm_id_reg(kvm, SYS_ID_AA64MMFR0_EL1, val);
955-
956-
val = kvm_read_vm_id_reg(kvm, SYS_ID_AA64MMFR1_EL1);
957-
val = limit_nv_id_reg(kvm, SYS_ID_AA64MMFR1_EL1, val);
958-
kvm_set_vm_id_reg(kvm, SYS_ID_AA64MMFR1_EL1, val);
959-
960-
val = kvm_read_vm_id_reg(kvm, SYS_ID_AA64MMFR2_EL1);
961-
val = limit_nv_id_reg(kvm, SYS_ID_AA64MMFR2_EL1, val);
962-
kvm_set_vm_id_reg(kvm, SYS_ID_AA64MMFR2_EL1, val);
963-
964-
val = kvm_read_vm_id_reg(kvm, SYS_ID_AA64MMFR4_EL1);
965-
val = limit_nv_id_reg(kvm, SYS_ID_AA64MMFR4_EL1, val);
966-
kvm_set_vm_id_reg(kvm, SYS_ID_AA64MMFR4_EL1, val);
967-
968-
val = kvm_read_vm_id_reg(kvm, SYS_ID_AA64DFR0_EL1);
969-
val = limit_nv_id_reg(kvm, SYS_ID_AA64DFR0_EL1, val);
970-
kvm_set_vm_id_reg(kvm, SYS_ID_AA64DFR0_EL1, val);
971-
}
972-
973932
u64 kvm_vcpu_apply_reg_masks(const struct kvm_vcpu *vcpu,
974933
enum vcpu_sysreg sr, u64 v)
975934
{
@@ -1014,8 +973,6 @@ int kvm_init_nv_sysregs(struct kvm_vcpu *vcpu)
1014973
if (!kvm->arch.sysreg_masks)
1015974
return -ENOMEM;
1016975

1017-
limit_nv_id_regs(kvm);
1018-
1019976
/* VTTBR_EL2 */
1020977
res0 = res1 = 0;
1021978
if (!kvm_has_feat_enum(kvm, ID_AA64MMFR1_EL1, VMIDBits, 16))

arch/arm64/kvm/sys_regs.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1638,6 +1638,9 @@ static u64 __kvm_read_sanitised_id_reg(const struct kvm_vcpu *vcpu,
16381638
break;
16391639
}
16401640

1641+
if (vcpu_has_nv(vcpu))
1642+
val = limit_nv_id_reg(vcpu->kvm, id, val);
1643+
16411644
return val;
16421645
}
16431646

0 commit comments

Comments
 (0)