From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrew Cooper Subject: Re: [PATCH] x86/EFI: keep EFI runtime services top level page tables up-to-date Date: Mon, 18 May 2015 11:27:43 +0100 Message-ID: <5559BE9F.9020107@citrix.com> References: <5559D999020000780007AFD3@mail.emea.novell.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1YuJpC-0004aN-AE for xen-devel@lists.xenproject.org; Mon, 18 May 2015 12:07:14 +0000 In-Reply-To: <5559D999020000780007AFD3@mail.emea.novell.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Jan Beulich , xen-devel Cc: Ross Lagerwall , Keir Fraser List-Id: xen-devel@lists.xenproject.org On 18/05/15 11:22, Jan Beulich wrote: > Updates to idle_pg_table[] need to be mirrored into the page tables > used for invoking EFI runtime services. > > Signed-off-by: Jan Beulich Reviewed-by: Andrew Cooper > --- > This in particular is a prereq for the patch at > http://lists.xenproject.org/archives/html/xen-devel/2015-05/msg02125.html > to be correct. > > --- a/xen/arch/x86/efi/runtime.h > +++ b/xen/arch/x86/efi/runtime.h > @@ -2,4 +2,10 @@ > > #ifndef COMPAT > l4_pgentry_t *__read_mostly efi_l4_pgtable; > + > +void efi_update_l4_pgtable(unsigned int l4idx, l4_pgentry_t l4e) > +{ > + if ( efi_l4_pgtable ) > + l4e_write(efi_l4_pgtable + l4idx, l4e); > +} > #endif > --- a/xen/arch/x86/efi/stub.c > +++ b/xen/arch/x86/efi/stub.c > @@ -2,6 +2,7 @@ > #include > #include > #include > +#include > > #ifndef efi_enabled > const bool_t efi_enabled = 0; > @@ -9,6 +10,8 @@ const bool_t efi_enabled = 0; > > void __init efi_init_memory(void) { } > > +void efi_update_l4_pgtable(unsigned int l4idx, l4_pgentry_t l4e) { } > + > paddr_t efi_rs_page_table(void) > { > BUG(); > --- a/xen/arch/x86/mm.c > +++ b/xen/arch/x86/mm.c > @@ -5311,7 +5311,10 @@ static l3_pgentry_t *virt_to_xen_l3e(uns > spin_lock(&map_pgdir_lock); > if ( !(l4e_get_flags(*pl4e) & _PAGE_PRESENT) ) > { > - l4e_write(pl4e, l4e_from_paddr(__pa(pl3e), __PAGE_HYPERVISOR)); > + l4_pgentry_t l4e = l4e_from_paddr(__pa(pl3e), __PAGE_HYPERVISOR); > + > + l4e_write(pl4e, l4e); > + efi_update_l4_pgtable(l4_table_offset(v), l4e); > pl3e = NULL; > } > if ( locking ) > --- a/xen/include/asm-x86/page.h > +++ b/xen/include/asm-x86/page.h > @@ -288,6 +288,7 @@ extern l2_pgentry_t l2_identmap[4*L2_PAG > extern l1_pgentry_t l1_identmap[L1_PAGETABLE_ENTRIES], > l1_fixmap[L1_PAGETABLE_ENTRIES]; > void paging_init(void); > +void efi_update_l4_pgtable(unsigned int l4idx, l4_pgentry_t); > #endif /* !defined(__ASSEMBLY__) */ > > #define _PAGE_NONE _AC(0x000,U) > > >