| #ifndef ARCH_X86_KVM_X86_H |
| #define ARCH_X86_KVM_X86_H |
| |
| #include <linux/kvm_host.h> |
| #include "kvm_cache_regs.h" |
| |
| static inline void kvm_clear_exception_queue(struct kvm_vcpu *vcpu) |
| { |
| vcpu->arch.exception.pending = false; |
| } |
| |
| static inline void kvm_queue_interrupt(struct kvm_vcpu *vcpu, u8 vector, |
| bool soft) |
| { |
| vcpu->arch.interrupt.pending = true; |
| vcpu->arch.interrupt.soft = soft; |
| vcpu->arch.interrupt.nr = vector; |
| } |
| |
| static inline void kvm_clear_interrupt_queue(struct kvm_vcpu *vcpu) |
| { |
| vcpu->arch.interrupt.pending = false; |
| } |
| |
| static inline bool kvm_event_needs_reinjection(struct kvm_vcpu *vcpu) |
| { |
| return vcpu->arch.exception.pending || vcpu->arch.interrupt.pending || |
| vcpu->arch.nmi_injected; |
| } |
| |
| static inline bool kvm_exception_is_soft(unsigned int nr) |
| { |
| return (nr == BP_VECTOR) || (nr == OF_VECTOR); |
| } |
| |
| struct kvm_cpuid_entry2 *kvm_find_cpuid_entry(struct kvm_vcpu *vcpu, |
| u32 function, u32 index); |
| |
| static inline bool is_protmode(struct kvm_vcpu *vcpu) |
| { |
| return kvm_read_cr0_bits(vcpu, X86_CR0_PE); |
| } |
| |
| static inline int is_long_mode(struct kvm_vcpu *vcpu) |
| { |
| #ifdef CONFIG_X86_64 |
| return vcpu->arch.efer & EFER_LMA; |
| #else |
| return 0; |
| #endif |
| } |
| |
| static inline bool mmu_is_nested(struct kvm_vcpu *vcpu) |
| { |
| return vcpu->arch.walk_mmu == &vcpu->arch.nested_mmu; |
| } |
| |
| static inline int is_pae(struct kvm_vcpu *vcpu) |
| { |
| return kvm_read_cr4_bits(vcpu, X86_CR4_PAE); |
| } |
| |
| static inline int is_pse(struct kvm_vcpu *vcpu) |
| { |
| return kvm_read_cr4_bits(vcpu, X86_CR4_PSE); |
| } |
| |
| static inline int is_paging(struct kvm_vcpu *vcpu) |
| { |
| return kvm_read_cr0_bits(vcpu, X86_CR0_PG); |
| } |
| |
| void kvm_before_handle_nmi(struct kvm_vcpu *vcpu); |
| void kvm_after_handle_nmi(struct kvm_vcpu *vcpu); |
| |
| void kvm_write_tsc(struct kvm_vcpu *vcpu, u64 data); |
| |
| #endif |