From e75432dba1fc2bcf39297ee2b361c790980209da Mon Sep 17 00:00:00 2001 From: yxk Date: Fri, 19 Sep 2025 17:52:21 +0800 Subject: [PATCH] arm64 kvm: On the Adaptation of CCA and virtCCA. community inclusion category: bugfix bugzilla: https://gitee.com/openeuler/kernel/issues/ICYRLF?from=project-issue ------------------------ Enforce isolation between CCA and virtCCA use _kvm_is_realm to avoid kernel panic in virtCCA scenarios. Fixes: befbde867291 ("VirtCCA: Adapt virtcca operations by cca_base.") Signed-off-by: yxk --- arch/arm64/kvm/guest.c | 4 ++-- arch/arm64/kvm/hypercalls.c | 2 +- arch/arm64/kvm/mmu.c | 10 +++++----- arch/arm64/kvm/reset.c | 2 +- arch/arm64/kvm/sys_regs.c | 6 +++--- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/arch/arm64/kvm/guest.c b/arch/arm64/kvm/guest.c index f7871996e160..53d4c90130e2 100644 --- a/arch/arm64/kvm/guest.c +++ b/arch/arm64/kvm/guest.c @@ -716,7 +716,7 @@ static unsigned long num_sve_regs(const struct kvm_vcpu *vcpu) if (!vcpu_has_sve(vcpu) || !kvm_arm_vcpu_sve_finalized(vcpu)) return 0; - if (kvm_is_realm(vcpu->kvm)) + if (_kvm_is_realm(vcpu->kvm)) return 1; /* KVM_REG_ARM64_SVE_VLS */ return slices * (SVE_NUM_PREGS + SVE_NUM_ZREGS + 1 /* FFR */) @@ -746,7 +746,7 @@ static int copy_sve_reg_indices(const struct kvm_vcpu *vcpu, return -EFAULT; ++num_regs; - if (kvm_is_realm(vcpu->kvm)) + if (_kvm_is_realm(vcpu->kvm)) return num_regs; for (i = 0; i < slices; i++) { diff --git a/arch/arm64/kvm/hypercalls.c b/arch/arm64/kvm/hypercalls.c index 02ea4d10a128..b0d19aaf5f89 100644 --- a/arch/arm64/kvm/hypercalls.c +++ b/arch/arm64/kvm/hypercalls.c @@ -444,7 +444,7 @@ void kvm_arm_teardown_hypercalls(struct kvm *kvm) int kvm_arm_get_fw_num_regs(struct kvm_vcpu *vcpu) { - return kvm_is_realm(vcpu->kvm) ? 0 : ARRAY_SIZE(kvm_arm_fw_reg_ids); + return _kvm_is_realm(vcpu->kvm) ? 0 : ARRAY_SIZE(kvm_arm_fw_reg_ids); } int kvm_arm_copy_fw_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uindices) diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c index dd44bc9dd513..9873838ef342 100644 --- a/arch/arm64/kvm/mmu.c +++ b/arch/arm64/kvm/mmu.c @@ -348,7 +348,7 @@ static void stage2_flush_memslot(struct kvm *kvm, phys_addr_t addr = memslot->base_gfn << PAGE_SHIFT; phys_addr_t end = addr + PAGE_SIZE * memslot->npages; - if (kvm_is_realm(kvm)) + if (_kvm_is_realm(kvm)) kvm_realm_unmap_range(kvm, addr, end - addr, false); else stage2_apply_range_resched(&kvm->arch.mmu, addr, end, @@ -1019,7 +1019,7 @@ void stage2_unmap_vm(struct kvm *kvm) int idx, bkt; /* For realms this is handled by the RMM so nothing to do here */ - if (kvm_is_realm(kvm)) + if (_kvm_is_realm(kvm)) return; idx = srcu_read_lock(&kvm->srcu); @@ -1120,7 +1120,7 @@ int kvm_phys_addr_ioremap(struct kvm *kvm, phys_addr_t guest_ipa, return -EPERM; /* We don't support mapping special pages into a Realm */ - if (kvm_is_realm(kvm)) + if (_kvm_is_realm(kvm)) return -EPERM; size += offset_in_page(guest_ipa); @@ -1943,7 +1943,7 @@ bool kvm_age_gfn(struct kvm *kvm, struct kvm_gfn_range *range) return false; /* We don't support aging for Realms */ - if (kvm_is_realm(kvm)) + if (_kvm_is_realm(kvm)) return true; return kvm_pgtable_stage2_test_clear_young(kvm->arch.mmu.pgt, @@ -1959,7 +1959,7 @@ bool kvm_test_age_gfn(struct kvm *kvm, struct kvm_gfn_range *range) return false; /* We don't support aging for Realms */ - if (kvm_is_realm(kvm)) + if (_kvm_is_realm(kvm)) return true; return kvm_pgtable_stage2_test_clear_young(kvm->arch.mmu.pgt, diff --git a/arch/arm64/kvm/reset.c b/arch/arm64/kvm/reset.c index ac6c4f5bf52a..905f5ef872b0 100644 --- a/arch/arm64/kvm/reset.c +++ b/arch/arm64/kvm/reset.c @@ -75,7 +75,7 @@ int __init kvm_arm_init_sve(void) unsigned int kvm_sve_get_max_vl(struct kvm *kvm) { - if (kvm_is_realm(kvm)) + if (_kvm_is_realm(kvm)) return kvm_realm_sve_max_vl(); else return kvm_sve_max_vl; diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c index 240c8caf0f0a..98af8358296a 100644 --- a/arch/arm64/kvm/sys_regs.c +++ b/arch/arm64/kvm/sys_regs.c @@ -3678,7 +3678,7 @@ int kvm_arm_sys_reg_set_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg static unsigned int num_demux_regs(struct kvm_vcpu *vcpu) { - return kvm_is_realm(vcpu->kvm) ? 0 : CSSELR_MAX; + return _kvm_is_realm(vcpu->kvm) ? 0 : CSSELR_MAX; } static int write_demux_regids(struct kvm_vcpu *vcpu, u64 __user *uindices) @@ -3697,7 +3697,7 @@ static int write_demux_regids(struct kvm_vcpu *vcpu, u64 __user *uindices) static unsigned int num_invariant_regs(struct kvm_vcpu *vcpu) { - return kvm_is_realm(vcpu->kvm) ? 0 : ARRAY_SIZE(invariant_sys_regs); + return _kvm_is_realm(vcpu->kvm) ? 0 : ARRAY_SIZE(invariant_sys_regs); } static int write_invariant_regids(struct kvm_vcpu *vcpu, u64 __user *uindices) @@ -3738,7 +3738,7 @@ static bool copy_reg_to_user(const struct sys_reg_desc *reg, u64 __user **uind) static bool kvm_realm_sys_reg_hidden_user(const struct kvm_vcpu *vcpu, u64 reg) { - if (!kvm_is_realm(vcpu->kvm)) + if (!_kvm_is_realm(vcpu->kvm)) return false; switch (reg) { -- Gitee