From mboxrd@z Thu Jan 1 00:00:00 1970 From: Boris Ostrovsky Subject: Re: [PATCH 1/2] KVM: MMU: fix SMAP virtualization Date: Fri, 22 May 2015 20:42:31 -0400 Message-ID: <555FCCF7.3070207@oracle.com> References: <1431356122-8500-1-git-send-email-guangrong.xiao@linux.intel.com> <555F94E6.3010200@oracle.com> Mime-Version: 1.0 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: QUOTED-PRINTABLE Cc: Xiao Guangrong , pbonzini@redhat.com, gleb@kernel.org, mtosatti@redhat.com, kvm@vger.kernel.org, linux-kernel@vger.kernel.org To: Bandan Das Return-path: In-Reply-To: Sender: linux-kernel-owner@vger.kernel.org List-Id: kvm.vger.kernel.org On 05/22/2015 07:54 PM, Bandan Das wrote: > Boris Ostrovsky writes: > >> On 05/11/2015 10:55 AM, Xiao Guangrong wrote: >>> KVM may turn a user page to a kernel page when kernel writes a read= only >>> user page if CR0.WP =3D 1. This shadow page entry will be reused af= ter >>> SMAP is enabled so that kernel is allowed to access this user page >>> >>> Fix it by setting SMAP && !CR0.WP into shadow page's role and reset= mmu >>> once CR4.SMAP is updated >>> >>> Signed-off-by: Xiao Guangrong >>> --- >> >> >>> >>> @@ -4208,12 +4211,18 @@ void kvm_mmu_pte_write(struct kvm_vcpu *vcp= u, gpa_t gpa, >>> const u8 *new, int bytes) >>> { >>> gfn_t gfn =3D gpa >> PAGE_SHIFT; >>> - union kvm_mmu_page_role mask =3D { .word =3D 0 }; >>> struct kvm_mmu_page *sp; >>> LIST_HEAD(invalid_list); >>> u64 entry, gentry, *spte; >>> int npte; >>> bool remote_flush, local_flush, zap_page; >>> + union kvm_mmu_page_role mask =3D (union kvm_mmu_page_role) { >>> + .cr0_wp =3D 1, >>> + .cr4_pae =3D 1, >>> + .nxe =3D 1, >>> + .smep_andnot_wp =3D 1, >>> + .smap_andnot_wp =3D 1, >>> + }; >>> >>> >> >> >> This breaks older compilers that can't initialize anon structures. > > How old ? Even gcc 3.1 says you can use unnamed struct/union fields a= nd > 3.2 is the minimum version required to compile the kernel as mentione= d > in the README. > > We could simply just name the structure, but I doubt this is the > only place in the kernel code where it's being used this way :) You can use them but you can't use initializers. Unfortunately my build= =20 system (F13) conveniently went down but this is an example from an old=20 email: =46C-64 cat anon.c struct bar { struct { int i; }; }; main() { struct bar a =3D {.i =3D 0}; } =46C-64 gcc --version|head -1 gcc (GCC) 4.4.4 20100503 (Red Hat 4.4.4-2) =46C-64 gcc anon.c anon.c: In function =91main=92: anon.c:9: error: unknown field =91i=92 specified in initializer =46C-64 but build@build-mk2 bootstrap]$ gcc --version|head -1 gcc (GCC) 4.6.3 20120306 (Red Hat 4.6.3-2) [build@build-mk2 bootstrap]$ gcc anon.c [build@build-mk2 bootstrap]$ -boris