diff options
Diffstat (limited to 'arch/x86/kvm/x86.h')
| -rw-r--r-- | arch/x86/kvm/x86.h | 42 | 
1 files changed, 40 insertions, 2 deletions
diff --git a/arch/x86/kvm/x86.h b/arch/x86/kvm/x86.h index bcfd9b719ada..f3dc77f006f9 100644 --- a/arch/x86/kvm/x86.h +++ b/arch/x86/kvm/x86.h @@ -50,6 +50,7 @@ struct kvm_host_values {  	u64 efer;  	u64 xcr0;  	u64 xss; +	u64 s_cet;  	u64 arch_capabilities;  }; @@ -101,6 +102,16 @@ do {											\  #define KVM_SVM_DEFAULT_PLE_WINDOW_MAX	USHRT_MAX  #define KVM_SVM_DEFAULT_PLE_WINDOW	3000 +/* + * KVM's internal, non-ABI indices for synthetic MSRs. The values themselves + * are arbitrary and have no meaning, the only requirement is that they don't + * conflict with "real" MSRs that KVM supports. Use values at the upper end + * of KVM's reserved paravirtual MSR range to minimize churn, i.e. these values + * will be usable until KVM exhausts its supply of paravirtual MSR indices. + */ + +#define MSR_KVM_INTERNAL_GUEST_SSP	0x4b564dff +  static inline unsigned int __grow_ple_window(unsigned int val,  		unsigned int base, unsigned int modifier, unsigned int max)  { @@ -431,14 +442,15 @@ void kvm_deliver_exception_payload(struct kvm_vcpu *vcpu,  int kvm_mtrr_set_msr(struct kvm_vcpu *vcpu, u32 msr, u64 data);  int kvm_mtrr_get_msr(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata); -bool kvm_vector_hashing_enabled(void);  void kvm_fixup_and_inject_pf_error(struct kvm_vcpu *vcpu, gva_t gva, u16 error_code);  int x86_decode_emulated_instruction(struct kvm_vcpu *vcpu, int emulation_type,  				    void *insn, int insn_len);  int x86_emulate_instruction(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa,  			    int emulation_type, void *insn, int insn_len); -fastpath_t handle_fastpath_set_msr_irqoff(struct kvm_vcpu *vcpu); +fastpath_t handle_fastpath_wrmsr(struct kvm_vcpu *vcpu); +fastpath_t handle_fastpath_wrmsr_imm(struct kvm_vcpu *vcpu, u32 msr, int reg);  fastpath_t handle_fastpath_hlt(struct kvm_vcpu *vcpu); +fastpath_t handle_fastpath_invd(struct kvm_vcpu *vcpu);  extern struct kvm_caps kvm_caps;  extern struct kvm_host_values kvm_host; @@ -668,6 +680,9 @@ static inline bool __kvm_is_valid_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)  		__reserved_bits |= X86_CR4_PCIDE;       \  	if (!__cpu_has(__c, X86_FEATURE_LAM))           \  		__reserved_bits |= X86_CR4_LAM_SUP;     \ +	if (!__cpu_has(__c, X86_FEATURE_SHSTK) &&       \ +	    !__cpu_has(__c, X86_FEATURE_IBT))           \ +		__reserved_bits |= X86_CR4_CET;         \  	__reserved_bits;                                \  }) @@ -699,4 +714,27 @@ int ____kvm_emulate_hypercall(struct kvm_vcpu *vcpu, int cpl,  int kvm_emulate_hypercall(struct kvm_vcpu *vcpu); +#define CET_US_RESERVED_BITS		GENMASK(9, 6) +#define CET_US_SHSTK_MASK_BITS		GENMASK(1, 0) +#define CET_US_IBT_MASK_BITS		(GENMASK_ULL(5, 2) | GENMASK_ULL(63, 10)) +#define CET_US_LEGACY_BITMAP_BASE(data)	((data) >> 12) + +static inline bool kvm_is_valid_u_s_cet(struct kvm_vcpu *vcpu, u64 data) +{ +	if (data & CET_US_RESERVED_BITS) +		return false; +	if (!guest_cpu_cap_has(vcpu, X86_FEATURE_SHSTK) && +	    (data & CET_US_SHSTK_MASK_BITS)) +		return false; +	if (!guest_cpu_cap_has(vcpu, X86_FEATURE_IBT) && +	    (data & CET_US_IBT_MASK_BITS)) +		return false; +	if (!IS_ALIGNED(CET_US_LEGACY_BITMAP_BASE(data), 4)) +		return false; +	/* IBT can be suppressed iff the TRACKER isn't WAIT_ENDBR. */ +	if ((data & CET_SUPPRESS) && (data & CET_WAIT_ENDBR)) +		return false; + +	return true; +}  #endif  | 
