3 #ifndef KVM_X86_MMU_SPTE_H
4 #define KVM_X86_MMU_SPTE_H
16 #define SPTE_MMU_PRESENT_MASK BIT_ULL(11)
30 #define SPTE_TDP_AD_SHIFT 52
31 #define SPTE_TDP_AD_MASK (3ULL << SPTE_TDP_AD_SHIFT)
32 #define SPTE_TDP_AD_ENABLED (0ULL << SPTE_TDP_AD_SHIFT)
33 #define SPTE_TDP_AD_DISABLED (1ULL << SPTE_TDP_AD_SHIFT)
34 #define SPTE_TDP_AD_WRPROT_ONLY (2ULL << SPTE_TDP_AD_SHIFT)
37 #ifdef CONFIG_DYNAMIC_PHYSICAL_MASK
38 #define SPTE_BASE_ADDR_MASK (physical_mask & ~(u64)(PAGE_SIZE-1))
40 #define SPTE_BASE_ADDR_MASK (((1ULL << 52) - 1) & ~(u64)(PAGE_SIZE-1))
43 #define SPTE_PERM_MASK (PT_PRESENT_MASK | PT_WRITABLE_MASK | shadow_user_mask \
44 | shadow_x_mask | shadow_nx_mask | shadow_me_mask)
46 #define ACC_EXEC_MASK 1
47 #define ACC_WRITE_MASK PT_WRITABLE_MASK
48 #define ACC_USER_MASK PT_USER_MASK
49 #define ACC_ALL (ACC_EXEC_MASK | ACC_WRITE_MASK | ACC_USER_MASK)
52 #define SPTE_EPT_READABLE_MASK 0x1ull
53 #define SPTE_EPT_EXECUTABLE_MASK 0x4ull
55 #define SPTE_LEVEL_BITS 9
56 #define SPTE_LEVEL_SHIFT(level) __PT_LEVEL_SHIFT(level, SPTE_LEVEL_BITS)
57 #define SPTE_INDEX(address, level) __PT_INDEX(address, level, SPTE_LEVEL_BITS)
58 #define SPTE_ENT_PER_PAGE __PT_ENT_PER_PAGE(SPTE_LEVEL_BITS)
67 #define SHADOW_ACC_TRACK_SAVED_BITS_MASK (SPTE_EPT_READABLE_MASK | \
68 SPTE_EPT_EXECUTABLE_MASK)
69 #define SHADOW_ACC_TRACK_SAVED_BITS_SHIFT 54
70 #define SHADOW_ACC_TRACK_SAVED_MASK (SHADOW_ACC_TRACK_SAVED_BITS_MASK << \
71 SHADOW_ACC_TRACK_SAVED_BITS_SHIFT)
80 #define DEFAULT_SPTE_HOST_WRITABLE BIT_ULL(9)
81 #define DEFAULT_SPTE_MMU_WRITABLE BIT_ULL(10)
88 #define EPT_SPTE_HOST_WRITABLE BIT_ULL(57)
89 #define EPT_SPTE_MMU_WRITABLE BIT_ULL(58)
97 #undef SHADOW_ACC_TRACK_SAVED_MASK
114 #define MMIO_SPTE_GEN_LOW_START 3
115 #define MMIO_SPTE_GEN_LOW_END 10
117 #define MMIO_SPTE_GEN_HIGH_START 52
118 #define MMIO_SPTE_GEN_HIGH_END 62
120 #define MMIO_SPTE_GEN_LOW_MASK GENMASK_ULL(MMIO_SPTE_GEN_LOW_END, \
121 MMIO_SPTE_GEN_LOW_START)
122 #define MMIO_SPTE_GEN_HIGH_MASK GENMASK_ULL(MMIO_SPTE_GEN_HIGH_END, \
123 MMIO_SPTE_GEN_HIGH_START)
137 #define SPTE_MMIO_ALLOWED_MASK (BIT_ULL(63) | GENMASK_ULL(51, 12) | GENMASK_ULL(2, 0))
141 #define MMIO_SPTE_GEN_LOW_BITS (MMIO_SPTE_GEN_LOW_END - MMIO_SPTE_GEN_LOW_START + 1)
142 #define MMIO_SPTE_GEN_HIGH_BITS (MMIO_SPTE_GEN_HIGH_END - MMIO_SPTE_GEN_HIGH_START + 1)
147 #define MMIO_SPTE_GEN_LOW_SHIFT (MMIO_SPTE_GEN_LOW_START - 0)
148 #define MMIO_SPTE_GEN_HIGH_SHIFT (MMIO_SPTE_GEN_HIGH_START - MMIO_SPTE_GEN_LOW_BITS)
150 #define MMIO_SPTE_GEN_MASK GENMASK_ULL(MMIO_SPTE_GEN_LOW_BITS + MMIO_SPTE_GEN_HIGH_BITS - 1, 0)
183 #define SHADOW_NONPRESENT_OR_RSVD_MASK_LEN 5
197 #define REMOVED_SPTE 0x5a0ULL
225 struct page *page = pfn_to_page((shadow_page) >> PAGE_SHIFT);
276 return sp->
role.ad_disabled;
337 return accessed_mask ? spte & accessed_mask
348 static inline u64
get_rsvd_bits(
struct rsvd_bits_validate *rsvd_check, u64 pte,
351 int bit7 = (pte >> 7) & 1;
353 return rsvd_check->rsvd_bits_mask[bit7][level-1];
365 return rsvd_check->bad_mt_xwr & BIT_ULL(pte & 0x3f);
368 static __always_inline
bool is_rsvd_spte(
struct rsvd_bits_validate *rsvd_check,
451 KBUILD_MODNAME
": MMU-writable SPTE is not Host-writable: %llx",
455 KBUILD_MODNAME
": Writable SPTE is not MMU-writable: %llx", spte);
475 const struct kvm_memory_slot *slot,
476 unsigned int pte_access, gfn_t
gfn, kvm_pfn_t pfn,
477 u64 old_spte,
bool prefetch,
bool can_unsync,
478 bool host_writable, u64 *new_spte);
480 union kvm_mmu_page_role
role,
int index);
u32 kvm_cpu_caps[NR_KVM_CPU_CAPS] __read_mostly
#define PT_PAGE_SIZE_MASK
static bool kvm_mmu_is_dummy_root(hpa_t shadow_page)
#define KVM_MMU_WARN_ON(x)
bool __read_mostly enable_mmio_caching
#define EPT_SPTE_MMU_WRITABLE
static bool is_dirty_spte(u64 spte)
#define SPTE_MMU_PRESENT_MASK
#define SPTE_MMIO_ALLOWED_MASK
#define SHADOW_ACC_TRACK_SAVED_BITS_SHIFT
u64 __read_mostly shadow_accessed_mask
bool spte_has_volatile_bits(u64 spte)
static bool is_accessed_spte(u64 spte)
u64 __read_mostly shadow_me_value
static u64 get_mmio_spte_generation(u64 spte)
#define EPT_SPTE_HOST_WRITABLE
u64 __read_mostly shadow_acc_track_mask
u64 __read_mostly shadow_host_writable_mask
#define SPTE_TDP_AD_DISABLED
static bool is_mmio_spte(u64 spte)
static void check_spte_writable_invariants(u64 spte)
static bool __is_rsvd_bits_set(struct rsvd_bits_validate *rsvd_check, u64 pte, int level)
u64 __read_mostly shadow_nonpresent_or_rsvd_mask
static bool is_access_track_spte(u64 spte)
static __always_inline bool is_rsvd_spte(struct rsvd_bits_validate *rsvd_check, u64 spte, int level)
#define MMIO_SPTE_GEN_HIGH_SHIFT
#define MMIO_SPTE_GEN_HIGH_MASK
static bool is_writable_pte(unsigned long pte)
u64 __read_mostly shadow_dirty_mask
static struct kvm_mmu_page * sptep_to_sp(u64 *sptep)
static bool is_executable_pte(u64 spte)
#define SPTE_ENT_PER_PAGE
static bool spte_ad_need_write_protect(u64 spte)
u64 __read_mostly shadow_mmio_access_mask
u64 __read_mostly shadow_mmio_mask
static bool __is_bad_mt_xwr(struct rsvd_bits_validate *rsvd_check, u64 pte)
u64 __read_mostly shadow_memtype_mask
static struct kvm_mmu_page * to_shadow_page(hpa_t shadow_page)
#define MMIO_SPTE_GEN_HIGH_BITS
static bool is_last_spte(u64 pte, int level)
#define SHADOW_ACC_TRACK_SAVED_BITS_MASK
static bool is_shadow_present_pte(u64 pte)
#define SPTE_TDP_AD_ENABLED
u64 __read_mostly shadow_me_mask
u64 __read_mostly shadow_user_mask
u64 mark_spte_for_access_track(u64 spte)
static kvm_pfn_t spte_to_pfn(u64 pte)
#define SHADOW_ACC_TRACK_SAVED_MASK
static bool spte_ad_enabled(u64 spte)
u64 make_nonleaf_spte(u64 *child_pt, bool ad_disabled)
static u64 spte_shadow_accessed_mask(u64 spte)
#define SPTE_BASE_ADDR_MASK
void __init kvm_mmu_spte_module_init(void)
static struct kvm_mmu_page * root_to_sp(hpa_t root)
#define MMIO_SPTE_GEN_LOW_SHIFT
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)
static u64 restore_acc_track_spte(u64 spte)
#define MMIO_SPTE_GEN_LOW_MASK
u64 __read_mostly shadow_nx_mask
static bool kvm_ad_enabled(void)
#define MMIO_SPTE_GEN_LOW_BITS
static u64 get_rsvd_bits(struct rsvd_bits_validate *rsvd_check, u64 pte, int level)
u64 kvm_mmu_changed_pte_notifier_make_spte(u64 old_spte, kvm_pfn_t new_pfn)
static u64 spte_shadow_dirty_mask(u64 spte)
static bool is_removed_spte(u64 spte)
u64 __read_mostly shadow_nonpresent_or_rsvd_lower_gfn_mask
void kvm_mmu_reset_all_pte_masks(void)
u64 make_huge_page_split_spte(struct kvm *kvm, u64 huge_spte, union kvm_mmu_page_role role, int index)
u64 __read_mostly shadow_x_mask
u64 make_mmio_spte(struct kvm_vcpu *vcpu, u64 gfn, unsigned int access)
static bool is_large_pte(u64 pte)
static bool is_mmu_writable_spte(u64 spte)
u64 __read_mostly shadow_mmu_writable_mask
static struct kvm_mmu_page * spte_to_child_sp(u64 spte)
u64 __read_mostly shadow_present_mask
static bool sp_ad_disabled(struct kvm_mmu_page *sp)
static int spte_index(u64 *sptep)
u64 __read_mostly shadow_mmio_value
union kvm_mmu_page_role role