KVM: MMU: Move pse36 handling to the guest walker
Signed-off-by: Avi Kivity <avi@qumranet.com>
This commit is contained in:
parent
5fb07ddb18
commit
da928521b7
|
@ -218,6 +218,13 @@ static int is_rmap_pte(u64 pte)
|
||||||
&& pte != shadow_notrap_nonpresent_pte;
|
&& pte != shadow_notrap_nonpresent_pte;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gfn_t pse36_gfn_delta(u32 gpte)
|
||||||
|
{
|
||||||
|
int shift = 32 - PT32_DIR_PSE36_SHIFT - PAGE_SHIFT;
|
||||||
|
|
||||||
|
return (gpte & PT32_DIR_PSE36_MASK) << shift;
|
||||||
|
}
|
||||||
|
|
||||||
static void set_shadow_pte(u64 *sptep, u64 spte)
|
static void set_shadow_pte(u64 *sptep, u64 spte)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_X86_64
|
#ifdef CONFIG_X86_64
|
||||||
|
|
|
@ -149,6 +149,8 @@ static int FNAME(walk_addr)(struct guest_walker *walker,
|
||||||
&& (PTTYPE == 64 || is_pse(vcpu))) {
|
&& (PTTYPE == 64 || is_pse(vcpu))) {
|
||||||
walker->gfn = gpte_to_gfn_pde(pte);
|
walker->gfn = gpte_to_gfn_pde(pte);
|
||||||
walker->gfn += PT_INDEX(addr, PT_PAGE_TABLE_LEVEL);
|
walker->gfn += PT_INDEX(addr, PT_PAGE_TABLE_LEVEL);
|
||||||
|
if (PTTYPE == 32 && is_cpuid_PSE36())
|
||||||
|
walker->gfn += pse36_gfn_delta(pte);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -320,9 +322,6 @@ static void FNAME(set_pde)(struct kvm_vcpu *vcpu, pt_element_t gpde,
|
||||||
|
|
||||||
access_bits &= gpde;
|
access_bits &= gpde;
|
||||||
gaddr = (gpa_t)gfn << PAGE_SHIFT;
|
gaddr = (gpa_t)gfn << PAGE_SHIFT;
|
||||||
if (PTTYPE == 32 && is_cpuid_PSE36())
|
|
||||||
gaddr |= (gpde & PT32_DIR_PSE36_MASK) <<
|
|
||||||
(32 - PT32_DIR_PSE36_SHIFT);
|
|
||||||
FNAME(set_pte_common)(vcpu, shadow_pte, gaddr,
|
FNAME(set_pte_common)(vcpu, shadow_pte, gaddr,
|
||||||
gpde, access_bits, user_fault, write_fault,
|
gpde, access_bits, user_fault, write_fault,
|
||||||
ptwrite, walker, gfn);
|
ptwrite, walker, gfn);
|
||||||
|
|
Loading…
Reference in New Issue