}
 
 /* Resets the value of cptr_el2 when returning to the host. */
-static __always_inline void kvm_reset_cptr_el2(struct kvm_vcpu *vcpu)
+static __always_inline void __kvm_reset_cptr_el2(struct kvm *kvm)
 {
        u64 val;
 
        } else if (has_hvhe()) {
                val = CPACR_ELx_FPEN;
 
-               if (!vcpu_has_sve(vcpu) || !guest_owns_fp_regs())
+               if (!kvm_has_sve(kvm) || !guest_owns_fp_regs())
                        val |= CPACR_ELx_ZEN;
                if (cpus_have_final_cap(ARM64_SME))
                        val |= CPACR_ELx_SMEN;
        } else {
                val = CPTR_NVHE_EL2_RES1;
 
-               if (vcpu_has_sve(vcpu) && guest_owns_fp_regs())
+               if (kvm_has_sve(kvm) && guest_owns_fp_regs())
                        val |= CPTR_EL2_TZ;
                if (!cpus_have_final_cap(ARM64_SME))
                        val |= CPTR_EL2_TSM;
        kvm_write_cptr_el2(val);
 }
 
+#ifdef __KVM_NVHE_HYPERVISOR__
+#define kvm_reset_cptr_el2(v)  __kvm_reset_cptr_el2(kern_hyp_va((v)->kvm))
+#else
+#define kvm_reset_cptr_el2(v)  __kvm_reset_cptr_el2((v)->kvm)
+#endif
+
 /*
  * Returns a 'sanitised' view of CPTR_EL2, translating from nVHE to the VHE
  * format if E2H isn't set.
 
 #define KVM_ARCH_FLAG_ID_REGS_INITIALIZED              7
        /* Fine-Grained UNDEF initialised */
 #define KVM_ARCH_FLAG_FGU_INITIALIZED                  8
+       /* SVE exposed to guest */
+#define KVM_ARCH_FLAG_GUEST_HAS_SVE                    9
        unsigned long flags;
 
        /* VM-wide vCPU feature set */
 #define vcpu_set_flag(v, ...)  __vcpu_set_flag((v), __VA_ARGS__)
 #define vcpu_clear_flag(v, ...)        __vcpu_clear_flag((v), __VA_ARGS__)
 
-/* SVE exposed to guest */
-#define GUEST_HAS_SVE          __vcpu_single_flag(cflags, BIT(0))
+/* KVM_ARM_VCPU_INIT completed */
+#define VCPU_INITIALIZED       __vcpu_single_flag(cflags, BIT(0))
 /* SVE config completed */
 #define VCPU_SVE_FINALIZED     __vcpu_single_flag(cflags, BIT(1))
-/* KVM_ARM_VCPU_INIT completed */
-#define VCPU_INITIALIZED       __vcpu_single_flag(cflags, BIT(2))
 
 /* Exception pending */
 #define PENDING_EXCEPTION      __vcpu_single_flag(iflags, BIT(0))
                                 KVM_GUESTDBG_USE_HW | \
                                 KVM_GUESTDBG_SINGLESTEP)
 
-#define vcpu_has_sve(vcpu) (system_supports_sve() &&                   \
-                           vcpu_get_flag(vcpu, GUEST_HAS_SVE))
+#define kvm_has_sve(kvm)       (system_supports_sve() &&               \
+                                test_bit(KVM_ARCH_FLAG_GUEST_HAS_SVE, &(kvm)->arch.flags))
+
+#ifdef __KVM_NVHE_HYPERVISOR__
+#define vcpu_has_sve(vcpu)     kvm_has_sve(kern_hyp_va((vcpu)->kvm))
+#else
+#define vcpu_has_sve(vcpu)     kvm_has_sve((vcpu)->kvm)
+#endif
 
 #ifdef CONFIG_ARM64_PTR_AUTH
 #define vcpu_has_ptrauth(vcpu)                                         \
 
 static void pkvm_init_features_from_host(struct pkvm_hyp_vm *hyp_vm, const struct kvm *host_kvm)
 {
        struct kvm *kvm = &hyp_vm->kvm;
+       unsigned long host_arch_flags = READ_ONCE(host_kvm->arch.flags);
        DECLARE_BITMAP(allowed_features, KVM_VCPU_MAX_FEATURES);
 
        /* No restrictions for non-protected VMs. */
        if (!kvm_vm_is_protected(kvm)) {
+               hyp_vm->kvm.arch.flags = host_arch_flags;
+
                bitmap_copy(kvm->arch.vcpu_features,
                            host_kvm->arch.vcpu_features,
                            KVM_VCPU_MAX_FEATURES);
        if (kvm_pvm_ext_allowed(KVM_CAP_ARM_PTRAUTH_GENERIC))
                set_bit(KVM_ARM_VCPU_PTRAUTH_GENERIC, allowed_features);
 
-       if (kvm_pvm_ext_allowed(KVM_CAP_ARM_SVE))
+       if (kvm_pvm_ext_allowed(KVM_CAP_ARM_SVE)) {
                set_bit(KVM_ARM_VCPU_SVE, allowed_features);
+               kvm->arch.flags |= host_arch_flags & BIT(KVM_ARCH_FLAG_GUEST_HAS_SVE);
+       }
 
        bitmap_and(kvm->arch.vcpu_features, host_kvm->arch.vcpu_features,
                   allowed_features, KVM_VCPU_MAX_FEATURES);
 {
        struct kvm_vcpu *vcpu = &hyp_vcpu->vcpu;
 
-       if (!vcpu_has_feature(vcpu, KVM_ARM_VCPU_SVE)) {
-               vcpu_clear_flag(vcpu, GUEST_HAS_SVE);
+       if (!vcpu_has_feature(vcpu, KVM_ARM_VCPU_SVE))
                vcpu_clear_flag(vcpu, VCPU_SVE_FINALIZED);
-       }
 }
 
 static int init_pkvm_hyp_vcpu(struct pkvm_hyp_vcpu *hyp_vcpu,
 
         * KVM_REG_ARM64_SVE_VLS.  Allocation is deferred until
         * kvm_arm_vcpu_finalize(), which freezes the configuration.
         */
-       vcpu_set_flag(vcpu, GUEST_HAS_SVE);
+       set_bit(KVM_ARCH_FLAG_GUEST_HAS_SVE, &vcpu->kvm->arch.flags);
 }
 
 /*