On Tue, Jan 05, 2010 at 07:02:29PM +0800, Sheng Yang wrote: > > Signed-off-by: Sheng Yang <sheng@xxxxxxxxxxxxxxx> > --- > arch/x86/include/asm/vmx.h | 1 + > arch/x86/kvm/mmu.c | 8 +++++--- > arch/x86/kvm/vmx.c | 11 ++++++++++- > 3 files changed, 16 insertions(+), 4 deletions(-) > > diff --git a/arch/x86/include/asm/vmx.h b/arch/x86/include/asm/vmx.h > index 713ed9a..43f1e9b 100644 > --- a/arch/x86/include/asm/vmx.h > +++ b/arch/x86/include/asm/vmx.h > @@ -364,6 +364,7 @@ enum vmcs_field { > #define VMX_EPTP_UC_BIT (1ull << 8) > #define VMX_EPTP_WB_BIT (1ull << 14) > #define VMX_EPT_2MB_PAGE_BIT (1ull << 16) > +#define VMX_EPT_1GB_PAGE_BIT (1ull << 17) > #define VMX_EPT_EXTENT_INDIVIDUAL_BIT (1ull << 24) > #define VMX_EPT_EXTENT_CONTEXT_BIT (1ull << 25) > #define VMX_EPT_EXTENT_GLOBAL_BIT (1ull << 26) > diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c > index 43cf2ea..9012541 100644 > --- a/arch/x86/kvm/mmu.c > +++ b/arch/x86/kvm/mmu.c > @@ -499,8 +499,7 @@ out: > static int mapping_level(struct kvm_vcpu *vcpu, gfn_t large_gfn) > { > struct kvm_memory_slot *slot; > - int host_level; > - int level = PT_PAGE_TABLE_LEVEL; > + int host_level, level, max_level; > > slot = gfn_to_memslot(vcpu->kvm, large_gfn); > if (slot && slot->dirty_bitmap) > @@ -511,7 +510,10 @@ static int mapping_level(struct kvm_vcpu *vcpu, gfn_t large_gfn) > if (host_level == PT_PAGE_TABLE_LEVEL) > return host_level; > > - for (level = PT_DIRECTORY_LEVEL; level <= host_level; ++level) > + max_level = kvm_x86_ops->get_lpage_level() < host_level ? > + kvm_x86_ops->get_lpage_level() : host_level; > + BUG_ON(kvm_x86_ops->get_lpage_level() < host_level) instead? See the if (host_level == PT_PAGE_TABLE_LEVEL) above. -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html