2007-12-14 09:35:10 +08:00
# ifndef __KVM_X86_MMU_H
# define __KVM_X86_MMU_H
2007-12-16 11:02:48 +02:00
# include <linux/kvm_host.h>
2009-12-07 12:16:48 +02:00
# include "kvm_cache_regs.h"
2007-12-14 09:35:10 +08:00
2008-04-25 10:17:08 +08: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 13:51:35 +03:00
# define PT_ACCESSED_SHIFT 5
# define PT_ACCESSED_MASK (1ULL << PT_ACCESSED_SHIFT)
2008-04-25 10:17:08 +08: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
2010-01-05 19:02:26 +08:00
# define PT_PDPE_LEVEL 3
# define PT_DIRECTORY_LEVEL 2
# define PT_PAGE_TABLE_LEVEL 1
2010-02-10 14:21:32 +02:00
# define PFERR_PRESENT_MASK (1U << 0)
# define PFERR_WRITE_MASK (1U << 1)
# define PFERR_USER_MASK (1U << 2)
# define PFERR_RSVD_MASK (1U << 3)
# define PFERR_FETCH_MASK (1U << 4)
2009-06-11 12:07:42 -03:00
int kvm_mmu_get_spte_hierarchy ( struct kvm_vcpu * vcpu , u64 addr , u64 sptes [ 4 ] ) ;
2010-08-19 18:11:05 -07:00
static inline unsigned int kvm_mmu_available_pages ( struct kvm * kvm )
{
2010-08-19 18:11:28 -07:00
return kvm - > arch . n_max_mmu_pages -
kvm - > arch . n_used_mmu_pages ;
2010-08-19 18:11:05 -07:00
}
2007-12-14 09:35:10 +08:00
static inline void kvm_mmu_free_some_pages ( struct kvm_vcpu * vcpu )
{
2010-08-19 18:11:05 -07:00
if ( unlikely ( kvm_mmu_available_pages ( vcpu - > kvm ) < KVM_MIN_FREE_MMU_PAGES ) )
2007-12-14 09:35:10 +08: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 ) ;
}
2009-06-10 14:12:05 +03:00
static inline int is_present_gpte ( unsigned long pte )
2009-03-31 23:03:45 +08:00
{
return pte & PT_PRESENT_MASK ;
}
2007-12-14 09:35:10 +08:00
# endif