25 #define pt_element_t u64
26 #define guest_walker guest_walker64
27 #define FNAME(name) paging##64_##name
28 #define PT_LEVEL_BITS 9
29 #define PT_GUEST_DIRTY_SHIFT PT_DIRTY_SHIFT
30 #define PT_GUEST_ACCESSED_SHIFT PT_ACCESSED_SHIFT
31 #define PT_HAVE_ACCESSED_DIRTY(mmu) true
33 #define PT_MAX_FULL_LEVELS PT64_ROOT_MAX_LEVEL
35 #define PT_MAX_FULL_LEVELS 2
38 #define pt_element_t u32
39 #define guest_walker guest_walker32
40 #define FNAME(name) paging##32_##name
41 #define PT_LEVEL_BITS 10
42 #define PT_MAX_FULL_LEVELS 2
43 #define PT_GUEST_DIRTY_SHIFT PT_DIRTY_SHIFT
44 #define PT_GUEST_ACCESSED_SHIFT PT_ACCESSED_SHIFT
45 #define PT_HAVE_ACCESSED_DIRTY(mmu) true
47 #define PT32_DIR_PSE36_SIZE 4
48 #define PT32_DIR_PSE36_SHIFT 13
49 #define PT32_DIR_PSE36_MASK \
50 (((1ULL << PT32_DIR_PSE36_SIZE) - 1) << PT32_DIR_PSE36_SHIFT)
51 #elif PTTYPE == PTTYPE_EPT
52 #define pt_element_t u64
53 #define guest_walker guest_walkerEPT
54 #define FNAME(name) ept_##name
55 #define PT_LEVEL_BITS 9
56 #define PT_GUEST_DIRTY_SHIFT 9
57 #define PT_GUEST_ACCESSED_SHIFT 8
58 #define PT_HAVE_ACCESSED_DIRTY(mmu) (!(mmu)->cpu_role.base.ad_disabled)
59 #define PT_MAX_FULL_LEVELS PT64_ROOT_MAX_LEVEL
61 #error Invalid PTTYPE value
65 #define PT_BASE_ADDR_MASK ((pt_element_t)__PT_BASE_ADDR_MASK)
66 #define PT_LVL_ADDR_MASK(lvl) __PT_LVL_ADDR_MASK(PT_BASE_ADDR_MASK, lvl, PT_LEVEL_BITS)
67 #define PT_LVL_OFFSET_MASK(lvl) __PT_LVL_OFFSET_MASK(PT_BASE_ADDR_MASK, lvl, PT_LEVEL_BITS)
68 #define PT_INDEX(addr, lvl) __PT_INDEX(addr, lvl, PT_LEVEL_BITS)
70 #define PT_GUEST_DIRTY_MASK (1 << PT_GUEST_DIRTY_SHIFT)
71 #define PT_GUEST_ACCESSED_MASK (1 << PT_GUEST_ACCESSED_SHIFT)
73 #define gpte_to_gfn_lvl FNAME(gpte_to_gfn_lvl)
74 #define gpte_to_gfn(pte) gpte_to_gfn_lvl((pte), PG_LEVEL_4K)
96 static inline gfn_t pse36_gfn_delta(u32 gpte)
98 int shift = 32 - PT32_DIR_PSE36_SHIFT - PAGE_SHIFT;
100 return (gpte & PT32_DIR_PSE36_MASK) << shift;
129 #if PTTYPE != PTTYPE_EPT
138 #if PTTYPE != PTTYPE_EPT
182 #if PTTYPE == PTTYPE_EPT
200 gpa_t addr,
int write_fault)
202 unsigned level, index;
213 pte = orig_pte = walker->
ptes[
level - 1];
218 trace_kvm_mmu_set_accessed_bit(
table_gfn, index,
sizeof(pte));
223 trace_kvm_mmu_set_dirty_bit(
table_gfn, index,
sizeof(pte));
224 #if PTTYPE == PTTYPE_EPT
225 if (kvm_x86_ops.nested_ops->write_log_dirty(vcpu, addr))
263 pte_t pte = {.pte = gpte};
265 pkeys = pte_flags_pkey(pte_flags(pte));
271 unsigned int level,
unsigned int gpte)
295 gpte |= level - PG_LEVEL_4K - 1;
303 struct kvm_vcpu *vcpu,
struct kvm_mmu *mmu,
304 gpa_t addr, u64 access)
310 u64 pt_access, pte_access;
311 unsigned index, accessed_dirty, pte_pkey;
316 u64 walk_nx_mask = 0;
317 const int write_fault = access & PFERR_WRITE_MASK;
318 const int user_fault = access & PFERR_USER_MASK;
319 const int fetch_fault = access & PFERR_FETCH_MASK;
324 trace_kvm_mmu_pagetable_walk(addr, access);
326 walker->
level = mmu->cpu_role.base.level;
333 pte = mmu->get_pdptr(vcpu, (addr >> 30) & 3);
334 trace_kvm_mmu_paging_element(pte, walker->
level);
347 nested_access = (have_ad ? PFERR_WRITE_MASK : 0) | PFERR_USER_MASK;
364 struct kvm_memory_slot *slot;
365 unsigned long host_addr;
367 pt_access = pte_access;
373 pte_gpa = gfn_to_gpa(table_gfn) + offset;
375 BUG_ON(walker->
level < 1);
380 nested_access, &walker->
fault);
392 if (unlikely(real_gpa == INVALID_GPA))
396 if (!kvm_is_visible_memslot(slot))
401 if (unlikely(kvm_is_error_hva(host_addr)))
404 ptep_user = (
pt_element_t __user *)((
void *)host_addr + offset);
405 if (unlikely(__get_user(pte, ptep_user)))
409 trace_kvm_mmu_paging_element(pte, walker->
level);
415 pte_access = pt_access & (pte ^ walk_nx_mask);
421 errcode = PFERR_RSVD_MASK | PFERR_PRESENT_MASK;
437 if (unlikely(errcode))
445 gfn += pse36_gfn_delta(pte);
449 if (real_gpa == INVALID_GPA)
452 walker->
gfn = real_gpa >> PAGE_SHIFT;
462 accessed_dirty &= pte >>
465 if (unlikely(!accessed_dirty)) {
468 if (unlikely(ret < 0))
477 errcode |= write_fault | user_fault;
478 if (fetch_fault && (is_efer_nx(mmu) || is_cr4_smep(mmu)))
479 errcode |= PFERR_FETCH_MASK;
485 #if PTTYPE == PTTYPE_EPT
499 if (!(errcode & PFERR_RSVD_MASK)) {
500 vcpu->arch.exit_qualification &= (EPT_VIOLATION_GVA_IS_VALID |
501 EPT_VIOLATION_GVA_TRANSLATED);
503 vcpu->arch.exit_qualification |= EPT_VIOLATION_ACC_WRITE;
505 vcpu->arch.exit_qualification |= EPT_VIOLATION_ACC_READ;
507 vcpu->arch.exit_qualification |= EPT_VIOLATION_ACC_INSTR;
513 vcpu->arch.exit_qualification |= (pte_access & VMX_EPT_RWX_MASK) <<
514 EPT_VIOLATION_RWX_SHIFT;
526 struct kvm_vcpu *vcpu, gpa_t addr, u64 access)
536 struct kvm_memory_slot *slot;
553 if (is_error_pfn(pfn))
556 mmu_set_spte(vcpu, slot, spte, pte_access, gfn, pfn, NULL);
569 if (
level == PG_LEVEL_4K) {
579 &curr_pte,
sizeof(curr_pte));
581 return r || curr_pte != gw->
ptes[
level - 1];
594 if (sp->
role.level > PG_LEVEL_4K)
601 if (unlikely(vcpu->kvm->mmu_invalidate_in_progress))
632 unsigned int direct_access, access;
634 gfn_t base_gfn = fault->
gfn;
636 WARN_ON_ONCE(gw->
gfn != base_gfn);
639 top_level = vcpu->arch.mmu->cpu_role.base.level;
649 goto out_gpte_changed;
651 if (WARN_ON_ONCE(!VALID_PAGE(vcpu->arch.mmu->root.hpa)))
652 goto out_gpte_changed;
661 kvm_make_request(KVM_REQ_MMU_FREE_OBSOLETE_ROOTS, vcpu);
662 goto out_gpte_changed;
677 if (sp != ERR_PTR(-EEXIST)) {
704 goto out_gpte_changed;
706 if (sp != ERR_PTR(-EEXIST))
709 if (fault->
write && table_gfn == fault->
gfn)
721 trace_kvm_mmu_spte_requested(fault);
738 true, direct_access);
739 if (sp == ERR_PTR(-EEXIST))
752 base_gfn, fault->
pfn, fault);
782 WARN_ON_ONCE(
fault->is_tdp);
796 if (!
fault->prefetch)
824 !is_cr0_wp(vcpu->arch.mmu) && !
fault->user &&
fault->slot) {
834 if (is_cr4_smep(vcpu->arch.mmu))
839 write_lock(&vcpu->kvm->mmu_lock);
850 write_unlock(&vcpu->kvm->mmu_lock);
859 WARN_ON_ONCE(sp->
role.level != PG_LEVEL_4K);
869 gpa_t addr, u64 access,
873 gpa_t gpa = INVALID_GPA;
876 #ifndef CONFIG_X86_64
878 WARN_ON_ONCE((addr >> 32) && mmu == vcpu->arch.walk_mmu);
884 gpa = gfn_to_gpa(walker.
gfn);
885 gpa |= addr & ~PAGE_MASK;
886 }
else if (exception)
887 *exception = walker.
fault;
908 struct kvm_memory_slot *slot;
914 if (WARN_ON_ONCE(!sp->
spt[i]))
928 pte_access = sp->role.access;
963 make_spte(vcpu, sp, slot, pte_access, gfn,
965 host_writable, &spte);
973 #undef PT_BASE_ADDR_MASK
975 #undef PT_LVL_ADDR_MASK
976 #undef PT_LVL_OFFSET_MASK
978 #undef PT_MAX_FULL_LEVELS
980 #undef gpte_to_gfn_lvl
981 #undef PT_GUEST_ACCESSED_MASK
982 #undef PT_GUEST_DIRTY_MASK
983 #undef PT_GUEST_DIRTY_SHIFT
984 #undef PT_GUEST_ACCESSED_SHIFT
985 #undef PT_HAVE_ACCESSED_DIRTY
int kvm_vcpu_read_guest_atomic(struct kvm_vcpu *vcpu, gpa_t gpa, void *data, unsigned long len)
void kvm_vcpu_mark_page_dirty(struct kvm_vcpu *vcpu, gfn_t gfn)
struct kvm_memory_slot * kvm_vcpu_gfn_to_memslot(struct kvm_vcpu *vcpu, gfn_t gfn)
kvm_pfn_t gfn_to_pfn_memslot_atomic(const struct kvm_memory_slot *slot, gfn_t gfn)
unsigned long gfn_to_hva_memslot_prot(struct kvm_memory_slot *slot, gfn_t gfn, bool *writable)
void kvm_release_pfn_clean(kvm_pfn_t pfn)
static void validate_direct_spte(struct kvm_vcpu *vcpu, u64 *sptep, unsigned direct_access)
static int mmu_topup_memory_caches(struct kvm_vcpu *vcpu, bool maybe_indirect)
static int is_cpuid_PSE36(void)
static void __direct_pte_prefetch(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp, u64 *sptep)
static unsigned long kvm_mmu_get_guest_pgd(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu)
static int mmu_sync_children(struct kvm_vcpu *vcpu, struct kvm_mmu_page *parent, bool can_yield)
static bool sync_mmio_spte(struct kvm_vcpu *vcpu, u64 *sptep, gfn_t gfn, unsigned int access)
static void shadow_walk_next(struct kvm_shadow_walk_iterator *iterator)
static void drop_spte(struct kvm *kvm, u64 *sptep)
static bool mmu_spte_update(u64 *sptep, u64 new_spte)
#define for_each_shadow_entry(_vcpu, _addr, _walker)
static bool shadow_walk_okay(struct kvm_shadow_walk_iterator *iterator)
static int kvm_faultin_pfn(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault, unsigned int access)
static void link_shadow_page(struct kvm_vcpu *vcpu, u64 *sptep, struct kvm_mmu_page *sp)
static gfn_t kvm_mmu_page_get_gfn(struct kvm_mmu_page *sp, int index)
static bool page_fault_handle_page_track(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault)
static struct kvm_memory_slot * gfn_to_memslot_dirty_bitmap(struct kvm_vcpu *vcpu, gfn_t gfn, bool no_dirty_log)
static int mmu_set_spte(struct kvm_vcpu *vcpu, struct kvm_memory_slot *slot, u64 *sptep, unsigned int pte_access, gfn_t gfn, kvm_pfn_t pfn, struct kvm_page_fault *fault)
static void kvm_mmu_page_set_access(struct kvm_mmu_page *sp, int index, unsigned int access)
static struct kvm_mmu_page * kvm_mmu_get_child_sp(struct kvm_vcpu *vcpu, u64 *sptep, gfn_t gfn, bool direct, unsigned int access)
static int make_mmu_pages_available(struct kvm_vcpu *vcpu)
void kvm_mmu_hugepage_adjust(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault)
static bool is_page_fault_stale(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault)
static void account_nx_huge_page(struct kvm *kvm, struct kvm_mmu_page *sp, bool nx_huge_page_possible)
static void clear_sp_write_flooding_count(u64 *spte)
static u32 kvm_mmu_page_get_access(struct kvm_mmu_page *sp, int index)
void disallowed_hugepage_adjust(struct kvm_page_fault *fault, u64 spte, int cur_level)
static void shadow_page_table_clear_flood(struct kvm_vcpu *vcpu, gva_t addr)
static gpa_t kvm_translate_gpa(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, gpa_t gpa, u64 access, struct x86_exception *exception)
#define PT_PAGE_SIZE_MASK
#define PT_WRITABLE_SHIFT
static u8 permission_fault(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, unsigned pte_access, unsigned pte_pkey, u64 access)
static bool kvm_mmu_is_dummy_root(hpa_t shadow_page)
static gfn_t gfn_round_for_level(gfn_t gfn, int level)
static int FNAME() sync_spte(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp, int i)
#define PT_LVL_OFFSET_MASK(lvl)
static int FNAME() walk_addr(struct guest_walker *walker, struct kvm_vcpu *vcpu, gpa_t addr, u64 access)
static bool FNAME() is_last_gpte(struct kvm_mmu *mmu, unsigned int level, unsigned int gpte)
static gpa_t FNAME() get_level1_sp_gpa(struct kvm_mmu_page *sp)
static void FNAME() pte_prefetch(struct kvm_vcpu *vcpu, struct guest_walker *gw, u64 *sptep)
static bool FNAME() gpte_changed(struct kvm_vcpu *vcpu, struct guest_walker *gw, int level)
static unsigned FNAME() gpte_pkeys(struct kvm_vcpu *vcpu, u64 gpte)
static int FNAME() page_fault(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault)
static unsigned FNAME() gpte_access(u64 gpte)
#define PT_GUEST_DIRTY_MASK
#define PT_HAVE_ACCESSED_DIRTY(mmu)
#define PT_INDEX(addr, lvl)
static bool FNAME() is_rsvd_bits_set(struct kvm_mmu *mmu, u64 gpte, int level)
static gpa_t FNAME() gva_to_gpa(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, gpa_t addr, u64 access, struct x86_exception *exception)
static bool FNAME() is_bad_mt_xwr(struct rsvd_bits_validate *rsvd_check, u64 gpte)
static void FNAME() protect_clean_gpte(struct kvm_mmu *mmu, unsigned *access, unsigned gpte)
static int FNAME() update_accessed_dirty_bits(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, struct guest_walker *walker, gpa_t addr, int write_fault)
static bool FNAME() prefetch_gpte(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp, u64 *spte, pt_element_t gpte)
static int FNAME() fetch(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault, struct guest_walker *gw)
static int FNAME() walk_addr_generic(struct guest_walker *walker, struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, gpa_t addr, u64 access)
#define PT_GUEST_ACCESSED_SHIFT
#define PT_LVL_ADDR_MASK(lvl)
static bool FNAME() prefetch_invalid_gpte(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp, u64 *spte, u64 gpte)
static int FNAME() is_present_gpte(unsigned long pte)
#define PT_GUEST_DIRTY_SHIFT
#define PT_GUEST_ACCESSED_MASK
#define PT_MAX_FULL_LEVELS
u64 __read_mostly shadow_host_writable_mask
bool make_spte(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp, const struct kvm_memory_slot *slot, unsigned int pte_access, gfn_t gfn, kvm_pfn_t pfn, u64 old_spte, bool prefetch, bool can_unsync, bool host_writable, u64 *new_spte)
u64 __read_mostly shadow_present_mask
static bool __is_rsvd_bits_set(struct rsvd_bits_validate *rsvd_check, u64 pte, int level)
static struct kvm_mmu_page * sptep_to_sp(u64 *sptep)
static bool __is_bad_mt_xwr(struct rsvd_bits_validate *rsvd_check, u64 pte)
static bool is_shadow_present_pte(u64 pte)
static kvm_pfn_t spte_to_pfn(u64 pte)
static int spte_index(u64 *sptep)
bool pte_writable[PT_MAX_FULL_LEVELS]
gpa_t pte_gpa[PT_MAX_FULL_LEVELS]
gfn_t table_gfn[PT_MAX_FULL_LEVELS]
pt_element_t prefetch_ptes[PTE_PREFETCH_NUM]
struct x86_exception fault
unsigned int pt_access[PT_MAX_FULL_LEVELS]
pt_element_t __user * ptep_user[PT_MAX_FULL_LEVELS]
pt_element_t ptes[PT_MAX_FULL_LEVELS]
unsigned int unsync_children
union kvm_mmu_page_role role
bool write_fault_to_shadow_pgtable
bool huge_page_disallowed
const bool nx_huge_page_workaround_enabled
struct kvm_memory_slot * slot
void kvm_inject_emulated_page_fault(struct kvm_vcpu *vcpu, struct x86_exception *fault)
static bool is_long_mode(struct kvm_vcpu *vcpu)
static bool is_pae(struct kvm_vcpu *vcpu)