|
@@ -322,6 +322,44 @@ static inline unsigned int kvm_get_vmid_bits(void)
|
|
|
return (cpuid_feature_extract_unsigned_field(reg, ID_AA64MMFR1_VMIDBITS_SHIFT) == 2) ? 16 : 8;
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_HARDEN_BRANCH_PREDICTOR
|
|
|
+#include <asm/mmu.h>
|
|
|
+
|
|
|
+static inline void *kvm_get_hyp_vector(void)
|
|
|
+{
|
|
|
+ struct bp_hardening_data *data = arm64_get_bp_hardening_data();
|
|
|
+ void *vect = kvm_ksym_ref(__kvm_hyp_vector);
|
|
|
+
|
|
|
+ if (data->fn) {
|
|
|
+ vect = __bp_harden_hyp_vecs_start +
|
|
|
+ data->hyp_vectors_slot * SZ_2K;
|
|
|
+
|
|
|
+ if (!has_vhe())
|
|
|
+ vect = lm_alias(vect);
|
|
|
+ }
|
|
|
+
|
|
|
+ return vect;
|
|
|
+}
|
|
|
+
|
|
|
+static inline int kvm_map_vectors(void)
|
|
|
+{
|
|
|
+ return create_hyp_mappings(kvm_ksym_ref(__bp_harden_hyp_vecs_start),
|
|
|
+ kvm_ksym_ref(__bp_harden_hyp_vecs_end),
|
|
|
+ PAGE_HYP_EXEC);
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+static inline void *kvm_get_hyp_vector(void)
|
|
|
+{
|
|
|
+ return kvm_ksym_ref(__kvm_hyp_vector);
|
|
|
+}
|
|
|
+
|
|
|
+static inline int kvm_map_vectors(void)
|
|
|
+{
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
#define kvm_phys_to_vttbr(addr) phys_to_ttbr(addr)
|
|
|
|
|
|
#endif /* __ASSEMBLY__ */
|