cpus_have_const_cap(ARM64_SVE);
  }
  
- /*
-  * Read the pseudo-ZCR used by cpufeatures to identify the supported SVE
-  * vector length.
-  *
-  * Use only if SVE is present.
-  * This function clobbers the SVE vector length.
-  */
- static inline u64 read_zcr_features(void)
- {
-       u64 zcr;
-       unsigned int vq_max;
- 
-       /*
-        * Set the maximum possible VL, and write zeroes to all other
-        * bits to see if they stick.
-        */
-       sve_kernel_enable(NULL);
-       write_sysreg_s(ZCR_ELx_LEN_MASK, SYS_ZCR_EL1);
- 
-       zcr = read_sysreg_s(SYS_ZCR_EL1);
-       zcr &= ~(u64)ZCR_ELx_LEN_MASK; /* find sticky 1s outside LEN field */
-       vq_max = sve_vq_from_vl(sve_get_vl());
-       zcr |= vq_max - 1; /* set LEN field to maximum effective value */
- 
-       return zcr;
- }
- 
 +#define ARM64_SSBD_UNKNOWN            -1
 +#define ARM64_SSBD_FORCE_DISABLE      0
 +#define ARM64_SSBD_KERNEL             1
 +#define ARM64_SSBD_FORCE_ENABLE               2
 +#define ARM64_SSBD_MITIGATED          3
 +
 +static inline int arm64_get_ssbd_state(void)
 +{
 +#ifdef CONFIG_ARM64_SSBD
 +      extern int ssbd_state;
 +      return ssbd_state;
 +#else
 +      return ARM64_SSBD_UNKNOWN;
 +#endif
 +}
 +
 +#ifdef CONFIG_ARM64_SSBD
 +void arm64_set_ssbd_mitigation(bool state);
 +#else
 +static inline void arm64_set_ssbd_mitigation(bool state) {}
 +#endif
 +
  #endif /* __ASSEMBLY__ */
  
  #endif
 
        /* Exception Information */
        struct kvm_vcpu_fault_info fault;
  
-       /* Guest debug state */
-       u64 debug_flags;
 +      /* State of various workarounds, see kvm_asm.h for bit assignment */
 +      u64 workaround_flags;
 +
+       /* Miscellaneous vcpu state flags */
+       u64 flags;
  
        /*
         * We maintain more than a single set of debug registers to support
 
  void cpu_enable_cache_maint_trap(const struct arm64_cpu_capabilities *__unused);
  void cpu_clear_disr(const struct arm64_cpu_capabilities *__unused);
  
 +extern unsigned long __ro_after_init signal_minsigstksz; /* sigframe size */
 +extern void __init minsigstksz_setup(void);
 +
+ /*
+  * Not at the top of the file due to a direct #include cycle between
+  * <asm/fpsimd.h> and <asm/processor.h>.  Deferring this #include
+  * ensures that contents of processor.h are visible to fpsimd.h even if
+  * processor.h is included first.
+  *
+  * These prctl helpers are the only things in this file that require
+  * fpsimd.h.  The core code expects them to be in this header.
+  */
+ #include <asm/fpsimd.h>
+ 
  /* Userspace interface for PR_SVE_{SET,GET}_VL prctl()s: */
  #define SVE_SET_VL(arg)       sve_set_current_vl(arg)
  #define SVE_GET_VL()  sve_get_current_vl()
 
                /* And we're baaack! */
        } while (fixup_guest_exit(vcpu, &exit_code));
  
-       fp_enabled = fpsimd_enabled_vhe();
- 
 +      __set_host_arch_workaround_state(vcpu);
 +
        sysreg_save_guest_state_vhe(guest_ctxt);
  
        __deactivate_traps(vcpu);
                /* And we're baaack! */
        } while (fixup_guest_exit(vcpu, &exit_code));
  
-       fp_enabled = __fpsimd_enabled_nvhe();
- 
 +      __set_host_arch_workaround_state(vcpu);
 +
        __sysreg_save_state_nvhe(guest_ctxt);
        __sysreg32_save_state(vcpu);
        __timer_disable_traps(vcpu);
 
                break;
        }
  
- out:
 -      kvm_hv_hypercall_set_result(vcpu, ret);
 -      return 1;
 +      return kvm_hv_hypercall_complete(vcpu, ret);
  }
  
  void kvm_hv_init_vm(struct kvm *kvm)