Re: [PATCH v2 02/20] kvm: x86/mmu: Introduce tdp_iter
On Wed, Oct 21, 2020 at 11:08:52AM -0700, Ben Gardon wrote: > On Wed, Oct 21, 2020 at 7:59 AM Yu Zhang wrote: > > > > On Wed, Oct 14, 2020 at 11:26:42AM -0700, Ben Gardon wrote: > > > The TDP iterator implements a pre-order traversal of a TDP paging > > > structure. This iterator will be used in future patches to create > > > an efficient implementation of the KVM MMU for the TDP case. > > > > > > Tested by running kvm-unit-tests and KVM selftests on an Intel Haswell > > > machine. This series introduced no new failures. > > > > > > This series can be viewed in Gerrit at: > > > https://linux-review.googlesource.com/c/virt/kvm/kvm/+/2538 > > > > > > Signed-off-by: Ben Gardon > > > --- > > > arch/x86/kvm/Makefile | 3 +- > > > arch/x86/kvm/mmu/mmu.c | 66 > > > arch/x86/kvm/mmu/mmu_internal.h | 66 > > > arch/x86/kvm/mmu/tdp_iter.c | 176 > > > arch/x86/kvm/mmu/tdp_iter.h | 56 ++ > > > 5 files changed, 300 insertions(+), 67 deletions(-) > > > create mode 100644 arch/x86/kvm/mmu/tdp_iter.c > > > create mode 100644 arch/x86/kvm/mmu/tdp_iter.h > > > > > > diff --git a/arch/x86/kvm/Makefile b/arch/x86/kvm/Makefile > > > index 7f86a14aed0e9..4525c1151bf99 100644 > > > --- a/arch/x86/kvm/Makefile > > > +++ b/arch/x86/kvm/Makefile > > > @@ -15,7 +15,8 @@ kvm-$(CONFIG_KVM_ASYNC_PF) += $(KVM)/async_pf.o > > > > > > kvm-y+= x86.o emulate.o i8259.o irq.o lapic.o \ > > > i8254.o ioapic.o irq_comm.o cpuid.o pmu.o mtrr.o > > > \ > > > -hyperv.o debugfs.o mmu/mmu.o mmu/page_track.o > > > +hyperv.o debugfs.o mmu/mmu.o mmu/page_track.o \ > > > +mmu/tdp_iter.o > > > > > > kvm-intel-y += vmx/vmx.o vmx/vmenter.o vmx/pmu_intel.o > > > vmx/vmcs12.o \ > > > vmx/evmcs.o vmx/nested.o vmx/posted_intr.o > > > diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c > > > index 6c9db349600c8..6d82784ed5679 100644 > > > --- a/arch/x86/kvm/mmu/mmu.c > > > +++ b/arch/x86/kvm/mmu/mmu.c > > > @@ -121,28 +121,6 @@ module_param(dbg, bool, 0644); > > > > > > #define PTE_PREFETCH_NUM 8 > > > > > > -#define PT_FIRST_AVAIL_BITS_SHIFT 10 > > > -#define PT64_SECOND_AVAIL_BITS_SHIFT 54 > > > - > > > -/* > > > - * The mask used to denote special SPTEs, which can be either MMIO SPTEs > > > or > > > - * Access Tracking SPTEs. > > > - */ > > > -#define SPTE_SPECIAL_MASK (3ULL << 52) > > > -#define SPTE_AD_ENABLED_MASK (0ULL << 52) > > > -#define SPTE_AD_DISABLED_MASK (1ULL << 52) > > > -#define SPTE_AD_WRPROT_ONLY_MASK (2ULL << 52) > > > -#define SPTE_MMIO_MASK (3ULL << 52) > > > - > > > -#define PT64_LEVEL_BITS 9 > > > - > > > -#define PT64_LEVEL_SHIFT(level) \ > > > - (PAGE_SHIFT + (level - 1) * PT64_LEVEL_BITS) > > > - > > > -#define PT64_INDEX(address, level)\ > > > - (((address) >> PT64_LEVEL_SHIFT(level)) & ((1 << PT64_LEVEL_BITS) - > > > 1)) > > > - > > > - > > > #define PT32_LEVEL_BITS 10 > > > > > > #define PT32_LEVEL_SHIFT(level) \ > > > @@ -155,19 +133,6 @@ module_param(dbg, bool, 0644); > > > #define PT32_INDEX(address, level)\ > > > (((address) >> PT32_LEVEL_SHIFT(level)) & ((1 << PT32_LEVEL_BITS) - > > > 1)) > > > > > > - > > > -#ifdef CONFIG_DYNAMIC_PHYSICAL_MASK > > > -#define PT64_BASE_ADDR_MASK (physical_mask & ~(u64)(PAGE_SIZE-1)) > > > -#else > > > -#define PT64_BASE_ADDR_MASK (((1ULL << 52) - 1) & ~(u64)(PAGE_SIZE-1)) > > > -#endif > > > -#define PT64_LVL_ADDR_MASK(level) \ > > > - (PT64_BASE_ADDR_MASK & ~((1ULL << (PAGE_SHIFT + (((level) - 1) \ > > > - * PT64_LEVEL_BITS))) - 1)) > > > -#define PT64_LVL_OFFSET_MASK(level) \ > > > - (PT64_BASE_ADDR_MASK & ((1ULL << (PAGE_SHIFT + (((level) - 1) \ > > > - * PT64_LEVEL_BITS))) - 1)) > > > - > > > #define PT32_BASE_ADDR_MASK PAGE_MASK > > > #define PT32_DIR_BASE_ADDR_MASK \ > > > (PAGE_MASK & ~((1ULL << (PAGE_SHIFT + PT32_LEVEL_BITS)) - 1)) > > > @@ -192,8 +157,6 @@ module_param(dbg, bool, 0644); > > > #define SPTE_HOST_WRITEABLE (1ULL << PT_FIRST_AVAIL_BITS_SHIFT) > > > #define SPTE_MMU_WRITEABLE (1ULL << (PT_FIRST_AVAIL_BITS_SHIFT + 1)) > > > > > > -#define SHADOW_PT_INDEX(addr, level) PT64_INDEX(addr, level) > > > - > > > /* make pte_list_desc fit well in cache line */ > > > #define PTE_LIST_EXT 3 > > > > > > @@ -349,11 +312,6 @@ void kvm_mmu_set_mmio_spte_mask(u64 mmio_value, u64 > > > access_mask) > > > } > > > EXPORT_SYMBOL_GPL(kvm_mmu_set_mmio_spte_mask); > > > > > > -static bool is_mmio_spte(u64 spte) > > > -{ > > > - return (spte & SPTE_SPECIAL_MASK) == SPTE_MMIO_MASK; > > > -} > > > - > > > static inline bool sp_ad_disabled(struct kvm_mmu_page *sp) > > > { > > > return sp->role.ad_disabled; > > > @@ -626,35 +584,11 @@ static int is_nx(struct
Re: [PATCH v2 02/20] kvm: x86/mmu: Introduce tdp_iter
On Wed, Oct 21, 2020 at 7:59 AM Yu Zhang wrote: > > On Wed, Oct 14, 2020 at 11:26:42AM -0700, Ben Gardon wrote: > > The TDP iterator implements a pre-order traversal of a TDP paging > > structure. This iterator will be used in future patches to create > > an efficient implementation of the KVM MMU for the TDP case. > > > > Tested by running kvm-unit-tests and KVM selftests on an Intel Haswell > > machine. This series introduced no new failures. > > > > This series can be viewed in Gerrit at: > > https://linux-review.googlesource.com/c/virt/kvm/kvm/+/2538 > > > > Signed-off-by: Ben Gardon > > --- > > arch/x86/kvm/Makefile | 3 +- > > arch/x86/kvm/mmu/mmu.c | 66 > > arch/x86/kvm/mmu/mmu_internal.h | 66 > > arch/x86/kvm/mmu/tdp_iter.c | 176 > > arch/x86/kvm/mmu/tdp_iter.h | 56 ++ > > 5 files changed, 300 insertions(+), 67 deletions(-) > > create mode 100644 arch/x86/kvm/mmu/tdp_iter.c > > create mode 100644 arch/x86/kvm/mmu/tdp_iter.h > > > > diff --git a/arch/x86/kvm/Makefile b/arch/x86/kvm/Makefile > > index 7f86a14aed0e9..4525c1151bf99 100644 > > --- a/arch/x86/kvm/Makefile > > +++ b/arch/x86/kvm/Makefile > > @@ -15,7 +15,8 @@ kvm-$(CONFIG_KVM_ASYNC_PF) += $(KVM)/async_pf.o > > > > kvm-y+= x86.o emulate.o i8259.o irq.o lapic.o \ > > i8254.o ioapic.o irq_comm.o cpuid.o pmu.o mtrr.o \ > > -hyperv.o debugfs.o mmu/mmu.o mmu/page_track.o > > +hyperv.o debugfs.o mmu/mmu.o mmu/page_track.o \ > > +mmu/tdp_iter.o > > > > kvm-intel-y += vmx/vmx.o vmx/vmenter.o vmx/pmu_intel.o > > vmx/vmcs12.o \ > > vmx/evmcs.o vmx/nested.o vmx/posted_intr.o > > diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c > > index 6c9db349600c8..6d82784ed5679 100644 > > --- a/arch/x86/kvm/mmu/mmu.c > > +++ b/arch/x86/kvm/mmu/mmu.c > > @@ -121,28 +121,6 @@ module_param(dbg, bool, 0644); > > > > #define PTE_PREFETCH_NUM 8 > > > > -#define PT_FIRST_AVAIL_BITS_SHIFT 10 > > -#define PT64_SECOND_AVAIL_BITS_SHIFT 54 > > - > > -/* > > - * The mask used to denote special SPTEs, which can be either MMIO SPTEs or > > - * Access Tracking SPTEs. > > - */ > > -#define SPTE_SPECIAL_MASK (3ULL << 52) > > -#define SPTE_AD_ENABLED_MASK (0ULL << 52) > > -#define SPTE_AD_DISABLED_MASK (1ULL << 52) > > -#define SPTE_AD_WRPROT_ONLY_MASK (2ULL << 52) > > -#define SPTE_MMIO_MASK (3ULL << 52) > > - > > -#define PT64_LEVEL_BITS 9 > > - > > -#define PT64_LEVEL_SHIFT(level) \ > > - (PAGE_SHIFT + (level - 1) * PT64_LEVEL_BITS) > > - > > -#define PT64_INDEX(address, level)\ > > - (((address) >> PT64_LEVEL_SHIFT(level)) & ((1 << PT64_LEVEL_BITS) - > > 1)) > > - > > - > > #define PT32_LEVEL_BITS 10 > > > > #define PT32_LEVEL_SHIFT(level) \ > > @@ -155,19 +133,6 @@ module_param(dbg, bool, 0644); > > #define PT32_INDEX(address, level)\ > > (((address) >> PT32_LEVEL_SHIFT(level)) & ((1 << PT32_LEVEL_BITS) - > > 1)) > > > > - > > -#ifdef CONFIG_DYNAMIC_PHYSICAL_MASK > > -#define PT64_BASE_ADDR_MASK (physical_mask & ~(u64)(PAGE_SIZE-1)) > > -#else > > -#define PT64_BASE_ADDR_MASK (((1ULL << 52) - 1) & ~(u64)(PAGE_SIZE-1)) > > -#endif > > -#define PT64_LVL_ADDR_MASK(level) \ > > - (PT64_BASE_ADDR_MASK & ~((1ULL << (PAGE_SHIFT + (((level) - 1) \ > > - * PT64_LEVEL_BITS))) - 1)) > > -#define PT64_LVL_OFFSET_MASK(level) \ > > - (PT64_BASE_ADDR_MASK & ((1ULL << (PAGE_SHIFT + (((level) - 1) \ > > - * PT64_LEVEL_BITS))) - 1)) > > - > > #define PT32_BASE_ADDR_MASK PAGE_MASK > > #define PT32_DIR_BASE_ADDR_MASK \ > > (PAGE_MASK & ~((1ULL << (PAGE_SHIFT + PT32_LEVEL_BITS)) - 1)) > > @@ -192,8 +157,6 @@ module_param(dbg, bool, 0644); > > #define SPTE_HOST_WRITEABLE (1ULL << PT_FIRST_AVAIL_BITS_SHIFT) > > #define SPTE_MMU_WRITEABLE (1ULL << (PT_FIRST_AVAIL_BITS_SHIFT + 1)) > > > > -#define SHADOW_PT_INDEX(addr, level) PT64_INDEX(addr, level) > > - > > /* make pte_list_desc fit well in cache line */ > > #define PTE_LIST_EXT 3 > > > > @@ -349,11 +312,6 @@ void kvm_mmu_set_mmio_spte_mask(u64 mmio_value, u64 > > access_mask) > > } > > EXPORT_SYMBOL_GPL(kvm_mmu_set_mmio_spte_mask); > > > > -static bool is_mmio_spte(u64 spte) > > -{ > > - return (spte & SPTE_SPECIAL_MASK) == SPTE_MMIO_MASK; > > -} > > - > > static inline bool sp_ad_disabled(struct kvm_mmu_page *sp) > > { > > return sp->role.ad_disabled; > > @@ -626,35 +584,11 @@ static int is_nx(struct kvm_vcpu *vcpu) > > return vcpu->arch.efer & EFER_NX; > > } > > > > -static int is_shadow_present_pte(u64 pte) > > -{ > > - return (pte != 0) && !is_mmio_spte(pte); > > -} > > - > > -static int is_large_pte(u64 pte) > > -{ > > - return pte & PT_PAGE_SIZE_MASK; > > -} > > - > > -static int
Re: [PATCH v2 02/20] kvm: x86/mmu: Introduce tdp_iter
On Wed, Oct 14, 2020 at 11:26:42AM -0700, Ben Gardon wrote: > The TDP iterator implements a pre-order traversal of a TDP paging > structure. This iterator will be used in future patches to create > an efficient implementation of the KVM MMU for the TDP case. > > Tested by running kvm-unit-tests and KVM selftests on an Intel Haswell > machine. This series introduced no new failures. > > This series can be viewed in Gerrit at: > https://linux-review.googlesource.com/c/virt/kvm/kvm/+/2538 > > Signed-off-by: Ben Gardon > --- > arch/x86/kvm/Makefile | 3 +- > arch/x86/kvm/mmu/mmu.c | 66 > arch/x86/kvm/mmu/mmu_internal.h | 66 > arch/x86/kvm/mmu/tdp_iter.c | 176 > arch/x86/kvm/mmu/tdp_iter.h | 56 ++ > 5 files changed, 300 insertions(+), 67 deletions(-) > create mode 100644 arch/x86/kvm/mmu/tdp_iter.c > create mode 100644 arch/x86/kvm/mmu/tdp_iter.h > > diff --git a/arch/x86/kvm/Makefile b/arch/x86/kvm/Makefile > index 7f86a14aed0e9..4525c1151bf99 100644 > --- a/arch/x86/kvm/Makefile > +++ b/arch/x86/kvm/Makefile > @@ -15,7 +15,8 @@ kvm-$(CONFIG_KVM_ASYNC_PF) += $(KVM)/async_pf.o > > kvm-y+= x86.o emulate.o i8259.o irq.o lapic.o \ > i8254.o ioapic.o irq_comm.o cpuid.o pmu.o mtrr.o \ > -hyperv.o debugfs.o mmu/mmu.o mmu/page_track.o > +hyperv.o debugfs.o mmu/mmu.o mmu/page_track.o \ > +mmu/tdp_iter.o > > kvm-intel-y += vmx/vmx.o vmx/vmenter.o vmx/pmu_intel.o vmx/vmcs12.o > \ > vmx/evmcs.o vmx/nested.o vmx/posted_intr.o > diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c > index 6c9db349600c8..6d82784ed5679 100644 > --- a/arch/x86/kvm/mmu/mmu.c > +++ b/arch/x86/kvm/mmu/mmu.c > @@ -121,28 +121,6 @@ module_param(dbg, bool, 0644); > > #define PTE_PREFETCH_NUM 8 > > -#define PT_FIRST_AVAIL_BITS_SHIFT 10 > -#define PT64_SECOND_AVAIL_BITS_SHIFT 54 > - > -/* > - * The mask used to denote special SPTEs, which can be either MMIO SPTEs or > - * Access Tracking SPTEs. > - */ > -#define SPTE_SPECIAL_MASK (3ULL << 52) > -#define SPTE_AD_ENABLED_MASK (0ULL << 52) > -#define SPTE_AD_DISABLED_MASK (1ULL << 52) > -#define SPTE_AD_WRPROT_ONLY_MASK (2ULL << 52) > -#define SPTE_MMIO_MASK (3ULL << 52) > - > -#define PT64_LEVEL_BITS 9 > - > -#define PT64_LEVEL_SHIFT(level) \ > - (PAGE_SHIFT + (level - 1) * PT64_LEVEL_BITS) > - > -#define PT64_INDEX(address, level)\ > - (((address) >> PT64_LEVEL_SHIFT(level)) & ((1 << PT64_LEVEL_BITS) - 1)) > - > - > #define PT32_LEVEL_BITS 10 > > #define PT32_LEVEL_SHIFT(level) \ > @@ -155,19 +133,6 @@ module_param(dbg, bool, 0644); > #define PT32_INDEX(address, level)\ > (((address) >> PT32_LEVEL_SHIFT(level)) & ((1 << PT32_LEVEL_BITS) - 1)) > > - > -#ifdef CONFIG_DYNAMIC_PHYSICAL_MASK > -#define PT64_BASE_ADDR_MASK (physical_mask & ~(u64)(PAGE_SIZE-1)) > -#else > -#define PT64_BASE_ADDR_MASK (((1ULL << 52) - 1) & ~(u64)(PAGE_SIZE-1)) > -#endif > -#define PT64_LVL_ADDR_MASK(level) \ > - (PT64_BASE_ADDR_MASK & ~((1ULL << (PAGE_SHIFT + (((level) - 1) \ > - * PT64_LEVEL_BITS))) - 1)) > -#define PT64_LVL_OFFSET_MASK(level) \ > - (PT64_BASE_ADDR_MASK & ((1ULL << (PAGE_SHIFT + (((level) - 1) \ > - * PT64_LEVEL_BITS))) - 1)) > - > #define PT32_BASE_ADDR_MASK PAGE_MASK > #define PT32_DIR_BASE_ADDR_MASK \ > (PAGE_MASK & ~((1ULL << (PAGE_SHIFT + PT32_LEVEL_BITS)) - 1)) > @@ -192,8 +157,6 @@ module_param(dbg, bool, 0644); > #define SPTE_HOST_WRITEABLE (1ULL << PT_FIRST_AVAIL_BITS_SHIFT) > #define SPTE_MMU_WRITEABLE (1ULL << (PT_FIRST_AVAIL_BITS_SHIFT + 1)) > > -#define SHADOW_PT_INDEX(addr, level) PT64_INDEX(addr, level) > - > /* make pte_list_desc fit well in cache line */ > #define PTE_LIST_EXT 3 > > @@ -349,11 +312,6 @@ void kvm_mmu_set_mmio_spte_mask(u64 mmio_value, u64 > access_mask) > } > EXPORT_SYMBOL_GPL(kvm_mmu_set_mmio_spte_mask); > > -static bool is_mmio_spte(u64 spte) > -{ > - return (spte & SPTE_SPECIAL_MASK) == SPTE_MMIO_MASK; > -} > - > static inline bool sp_ad_disabled(struct kvm_mmu_page *sp) > { > return sp->role.ad_disabled; > @@ -626,35 +584,11 @@ static int is_nx(struct kvm_vcpu *vcpu) > return vcpu->arch.efer & EFER_NX; > } > > -static int is_shadow_present_pte(u64 pte) > -{ > - return (pte != 0) && !is_mmio_spte(pte); > -} > - > -static int is_large_pte(u64 pte) > -{ > - return pte & PT_PAGE_SIZE_MASK; > -} > - > -static int is_last_spte(u64 pte, int level) > -{ > - if (level == PG_LEVEL_4K) > - return 1; > - if (is_large_pte(pte)) > - return 1; > - return 0; > -} > - > static bool is_executable_pte(u64 spte) > { > return (spte & (shadow_x_mask | shadow_nx_mask)) ==
[PATCH v2 02/20] kvm: x86/mmu: Introduce tdp_iter
The TDP iterator implements a pre-order traversal of a TDP paging structure. This iterator will be used in future patches to create an efficient implementation of the KVM MMU for the TDP case. Tested by running kvm-unit-tests and KVM selftests on an Intel Haswell machine. This series introduced no new failures. This series can be viewed in Gerrit at: https://linux-review.googlesource.com/c/virt/kvm/kvm/+/2538 Signed-off-by: Ben Gardon --- arch/x86/kvm/Makefile | 3 +- arch/x86/kvm/mmu/mmu.c | 66 arch/x86/kvm/mmu/mmu_internal.h | 66 arch/x86/kvm/mmu/tdp_iter.c | 176 arch/x86/kvm/mmu/tdp_iter.h | 56 ++ 5 files changed, 300 insertions(+), 67 deletions(-) create mode 100644 arch/x86/kvm/mmu/tdp_iter.c create mode 100644 arch/x86/kvm/mmu/tdp_iter.h diff --git a/arch/x86/kvm/Makefile b/arch/x86/kvm/Makefile index 7f86a14aed0e9..4525c1151bf99 100644 --- a/arch/x86/kvm/Makefile +++ b/arch/x86/kvm/Makefile @@ -15,7 +15,8 @@ kvm-$(CONFIG_KVM_ASYNC_PF)+= $(KVM)/async_pf.o kvm-y += x86.o emulate.o i8259.o irq.o lapic.o \ i8254.o ioapic.o irq_comm.o cpuid.o pmu.o mtrr.o \ - hyperv.o debugfs.o mmu/mmu.o mmu/page_track.o + hyperv.o debugfs.o mmu/mmu.o mmu/page_track.o \ + mmu/tdp_iter.o kvm-intel-y+= vmx/vmx.o vmx/vmenter.o vmx/pmu_intel.o vmx/vmcs12.o \ vmx/evmcs.o vmx/nested.o vmx/posted_intr.o diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c index 6c9db349600c8..6d82784ed5679 100644 --- a/arch/x86/kvm/mmu/mmu.c +++ b/arch/x86/kvm/mmu/mmu.c @@ -121,28 +121,6 @@ module_param(dbg, bool, 0644); #define PTE_PREFETCH_NUM 8 -#define PT_FIRST_AVAIL_BITS_SHIFT 10 -#define PT64_SECOND_AVAIL_BITS_SHIFT 54 - -/* - * The mask used to denote special SPTEs, which can be either MMIO SPTEs or - * Access Tracking SPTEs. - */ -#define SPTE_SPECIAL_MASK (3ULL << 52) -#define SPTE_AD_ENABLED_MASK (0ULL << 52) -#define SPTE_AD_DISABLED_MASK (1ULL << 52) -#define SPTE_AD_WRPROT_ONLY_MASK (2ULL << 52) -#define SPTE_MMIO_MASK (3ULL << 52) - -#define PT64_LEVEL_BITS 9 - -#define PT64_LEVEL_SHIFT(level) \ - (PAGE_SHIFT + (level - 1) * PT64_LEVEL_BITS) - -#define PT64_INDEX(address, level)\ - (((address) >> PT64_LEVEL_SHIFT(level)) & ((1 << PT64_LEVEL_BITS) - 1)) - - #define PT32_LEVEL_BITS 10 #define PT32_LEVEL_SHIFT(level) \ @@ -155,19 +133,6 @@ module_param(dbg, bool, 0644); #define PT32_INDEX(address, level)\ (((address) >> PT32_LEVEL_SHIFT(level)) & ((1 << PT32_LEVEL_BITS) - 1)) - -#ifdef CONFIG_DYNAMIC_PHYSICAL_MASK -#define PT64_BASE_ADDR_MASK (physical_mask & ~(u64)(PAGE_SIZE-1)) -#else -#define PT64_BASE_ADDR_MASK (((1ULL << 52) - 1) & ~(u64)(PAGE_SIZE-1)) -#endif -#define PT64_LVL_ADDR_MASK(level) \ - (PT64_BASE_ADDR_MASK & ~((1ULL << (PAGE_SHIFT + (((level) - 1) \ - * PT64_LEVEL_BITS))) - 1)) -#define PT64_LVL_OFFSET_MASK(level) \ - (PT64_BASE_ADDR_MASK & ((1ULL << (PAGE_SHIFT + (((level) - 1) \ - * PT64_LEVEL_BITS))) - 1)) - #define PT32_BASE_ADDR_MASK PAGE_MASK #define PT32_DIR_BASE_ADDR_MASK \ (PAGE_MASK & ~((1ULL << (PAGE_SHIFT + PT32_LEVEL_BITS)) - 1)) @@ -192,8 +157,6 @@ module_param(dbg, bool, 0644); #define SPTE_HOST_WRITEABLE(1ULL << PT_FIRST_AVAIL_BITS_SHIFT) #define SPTE_MMU_WRITEABLE (1ULL << (PT_FIRST_AVAIL_BITS_SHIFT + 1)) -#define SHADOW_PT_INDEX(addr, level) PT64_INDEX(addr, level) - /* make pte_list_desc fit well in cache line */ #define PTE_LIST_EXT 3 @@ -349,11 +312,6 @@ void kvm_mmu_set_mmio_spte_mask(u64 mmio_value, u64 access_mask) } EXPORT_SYMBOL_GPL(kvm_mmu_set_mmio_spte_mask); -static bool is_mmio_spte(u64 spte) -{ - return (spte & SPTE_SPECIAL_MASK) == SPTE_MMIO_MASK; -} - static inline bool sp_ad_disabled(struct kvm_mmu_page *sp) { return sp->role.ad_disabled; @@ -626,35 +584,11 @@ static int is_nx(struct kvm_vcpu *vcpu) return vcpu->arch.efer & EFER_NX; } -static int is_shadow_present_pte(u64 pte) -{ - return (pte != 0) && !is_mmio_spte(pte); -} - -static int is_large_pte(u64 pte) -{ - return pte & PT_PAGE_SIZE_MASK; -} - -static int is_last_spte(u64 pte, int level) -{ - if (level == PG_LEVEL_4K) - return 1; - if (is_large_pte(pte)) - return 1; - return 0; -} - static bool is_executable_pte(u64 spte) { return (spte & (shadow_x_mask | shadow_nx_mask)) == shadow_x_mask; } -static kvm_pfn_t spte_to_pfn(u64 pte) -{ - return (pte & PT64_BASE_ADDR_MASK) >> PAGE_SHIFT; -} - static gfn_t pse36_gfn_delta(u32 gpte) { int shift = 32 - PT32_DIR_PSE36_SHIFT - PAGE_SHIFT; diff --git a/arch/x86/kvm/mmu/mmu_internal.h