2007-12-14 04:35:10 +03:00
# ifndef __KVM_X86_MMU_H
# define __KVM_X86_MMU_H
2007-12-16 12:02:48 +03:00
# include <linux/kvm_host.h>
2007-12-14 04:35:10 +03:00
2008-04-25 06:17:08 +04:00
# define PT64_PT_BITS 9
# define PT64_ENT_PER_PAGE (1 << PT64_PT_BITS)
# define PT32_PT_BITS 10
# define PT32_ENT_PER_PAGE (1 << PT32_PT_BITS)
# define PT_WRITABLE_SHIFT 1
# define PT_PRESENT_MASK (1ULL << 0)
# define PT_WRITABLE_MASK (1ULL << PT_WRITABLE_SHIFT)
# define PT_USER_MASK (1ULL << 2)
# define PT_PWT_MASK (1ULL << 3)
# define PT_PCD_MASK (1ULL << 4)
2008-05-15 14:51:35 +04:00
# define PT_ACCESSED_SHIFT 5
# define PT_ACCESSED_MASK (1ULL << PT_ACCESSED_SHIFT)
2008-04-25 06:17:08 +04:00
# define PT_DIRTY_MASK (1ULL << 6)
# define PT_PAGE_SIZE_MASK (1ULL << 7)
# define PT_PAT_MASK (1ULL << 7)
# define PT_GLOBAL_MASK (1ULL << 8)
# define PT64_NX_SHIFT 63
# define PT64_NX_MASK (1ULL << PT64_NX_SHIFT)
# define PT_PAT_SHIFT 7
# define PT_DIR_PAT_SHIFT 12
# define PT_DIR_PAT_MASK (1ULL << PT_DIR_PAT_SHIFT)
# define PT32_DIR_PSE36_SIZE 4
# define PT32_DIR_PSE36_SHIFT 13
# define PT32_DIR_PSE36_MASK \
( ( ( 1ULL < < PT32_DIR_PSE36_SIZE ) - 1 ) < < PT32_DIR_PSE36_SHIFT )
# define PT64_ROOT_LEVEL 4
# define PT32_ROOT_LEVEL 2
# define PT32E_ROOT_LEVEL 3
2009-06-11 19:07:42 +04:00
int kvm_mmu_get_spte_hierarchy ( struct kvm_vcpu * vcpu , u64 addr , u64 sptes [ 4 ] ) ;
2007-12-14 04:35:10 +03:00
static inline void kvm_mmu_free_some_pages ( struct kvm_vcpu * vcpu )
{
2007-12-14 05:01:48 +03:00
if ( unlikely ( vcpu - > kvm - > arch . n_free_mmu_pages < KVM_MIN_FREE_MMU_PAGES ) )
2007-12-14 04:35:10 +03:00
__kvm_mmu_free_some_pages ( vcpu ) ;
}
static inline int kvm_mmu_reload ( struct kvm_vcpu * vcpu )
{
if ( likely ( vcpu - > arch . mmu . root_hpa ! = INVALID_PAGE ) )
return 0 ;
return kvm_mmu_load ( vcpu ) ;
}
static inline int is_long_mode ( struct kvm_vcpu * vcpu )
{
# ifdef CONFIG_X86_64
2008-02-28 13:36:15 +03:00
return vcpu - > arch . shadow_efer & EFER_LMA ;
2007-12-14 04:35:10 +03:00
# else
return 0 ;
# endif
}
static inline int is_pae ( struct kvm_vcpu * vcpu )
{
return vcpu - > arch . cr4 & X86_CR4_PAE ;
}
static inline int is_pse ( struct kvm_vcpu * vcpu )
{
return vcpu - > arch . cr4 & X86_CR4_PSE ;
}
static inline int is_paging ( struct kvm_vcpu * vcpu )
{
return vcpu - > arch . cr0 & X86_CR0_PG ;
}
2009-06-10 15:12:05 +04:00
static inline int is_present_gpte ( unsigned long pte )
2009-03-31 19:03:45 +04:00
{
return pte & PT_PRESENT_MASK ;
}
2007-12-14 04:35:10 +03:00
# endif