From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: [PATCH 02/10] nEPT: MMU context for nested EPT Date: Mon, 14 Nov 2011 10:25:37 +0200 Message-ID: <4EC0D081.4020106@redhat.com> References: <1320919040-nyh@il.ibm.com> <201111100958.pAA9wrIv019614@rice.haifa.ibm.com> <4EBBC848.7050400@redhat.com> <20111110144027.GB3327@fermat.math.technion.ac.il> <4EBBEB65.8050600@redhat.com> <20111110200532.GA17475@fermat.math.technion.ac.il> <4EBE4CE0.7070708@redhat.com> <20111112213747.GA741@fermat.math.technion.ac.il> <4EBFAA47.406@redhat.com> <4EBFD514.4030501@redhat.com> <4EC00BC1.7000101@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Cc: "Nadav Har'El" , kvm@vger.kernel.org, "Roedel, Joerg" , abelg@il.ibm.com To: Orit Wasserman Return-path: Received: from mx1.redhat.com ([209.132.183.28]:32718 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752507Ab1KNIZt (ORCPT ); Mon, 14 Nov 2011 03:25:49 -0500 In-Reply-To: <4EC00BC1.7000101@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: On 11/13/2011 08:26 PM, Orit Wasserman wrote: > > > >> int kvm_mmu_get_spte_hierarchy(struct kvm_vcpu *vcpu, u64 addr, u64 sptes[4]); > >> void kvm_mmu_set_mmio_spte_mask(u64 mmio_mask); > >> int handle_mmio_page_fault_common(struct kvm_vcpu *vcpu, u64 addr, bool direct); > >> diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h > >> index 507e2b8..70d4cfd 100644 > >> --- a/arch/x86/kvm/paging_tmpl.h > >> +++ b/arch/x86/kvm/paging_tmpl.h > >> @@ -39,6 +39,21 @@ > >> #define CMPXCHG cmpxchg64 > >> #define PT_MAX_FULL_LEVELS 2 > >> #endif > >> +#elif PTTYPE == EPT > >> + #define pt_element_t u64 > >> + #define FNAME(name) EPT_##name > >> + #define PT_BASE_ADDR_MASK PT64_BASE_ADDR_MASK > >> + #define PT_LVL_ADDR_MASK(lvl) PT64_LVL_ADDR_MASK(lvl) > >> + #define PT_LVL_OFFSET_MASK(lvl) PT64_LVL_OFFSET_MASK(lvl) > >> + #define PT_INDEX(addr, level) PT64_INDEX(addr, level) > >> + #define PT_LEVEL_BITS PT64_LEVEL_BITS > >> + #ifdef CONFIG_X86_64 > >> + #define PT_MAX_FULL_LEVELS 4 > >> + #define CMPXCHG cmpxchg > >> + #else > >> + #define CMPXCHG cmpxchg64 > >> + #define PT_MAX_FULL_LEVELS 2 > >> + #endif > > > > The various masks should be defined here, to avoid lots of #ifdefs later. > > > > That what I did first but than I was afraid that the MASK will be changed for mmu.c too. > so I decided on ifdefs. > The more I think about it I think we need rapper function for mask checking (at least for this file). > What do you think ? Either should work, as long as the main logic is clean. > >> for (;;) { > >> gfn_t real_gfn; > >> @@ -186,9 +215,14 @@ retry_walk: > >> pte_gpa = gfn_to_gpa(table_gfn) + offset; > >> walker->table_gfn[walker->level - 1] = table_gfn; > >> walker->pte_gpa[walker->level - 1] = pte_gpa; > >> - > >> +#if PTTYPE == EPT > >> + real_gfn = mmu->translate_gpa(vcpu, gfn_to_gpa(table_gfn), > >> + EPT_WRITABLE_MASK); > >> +#else > >> real_gfn = mmu->translate_gpa(vcpu, gfn_to_gpa(table_gfn), > >> PFERR_USER_MASK|PFERR_WRITE_MASK); > >> +#endif > >> + > > > > Unneeded, I think. > > Is it because translate_nested_gpa always set USER_MASK ? Yes... maybe that function needs to do something like access |= mmu->default_access; -- error compiling committee.c: too many arguments to function