Message ID | 1396894732-122060-2-git-send-email-seth.forshee@canonical.com |
---|---|
State | New |
Headers | show |
On Mon, Apr 07, 2014 at 01:18:52PM -0500, Seth Forshee wrote: > From: Borislav Petkov <bp@suse.de> > > We do not enable the new efi memmap on 32-bit and thus we need to run > runtime_code_page_mkexec() unconditionally there. Fix that. > > Reported-and-tested-by: Lejun Zhu <lejun.zhu@intel.com> > Signed-off-by: Borislav Petkov <bp@suse.de> > Signed-off-by: Matt Fleming <matt.fleming@intel.com> > (backported from commit c55d016f7a930dd1c995336017123b469a8c8f5a) > Conflicts: > arch/x86/platform/efi/efi_64.c > BugLink: http://bugs.launchpad.net/bugs/1301590 > Signed-off-by: Seth Forshee <seth.forshee@canonical.com> > --- > arch/x86/include/asm/efi.h | 2 ++ > arch/x86/platform/efi/efi.c | 5 ++--- > arch/x86/platform/efi/efi_32.c | 6 ++++++ > arch/x86/platform/efi/efi_64.c | 9 +++++++++ > 4 files changed, 19 insertions(+), 3 deletions(-) > > diff --git a/arch/x86/include/asm/efi.h b/arch/x86/include/asm/efi.h > index 89a05b0..a208456 100644 > --- a/arch/x86/include/asm/efi.h > +++ b/arch/x86/include/asm/efi.h > @@ -131,6 +131,8 @@ extern void __init efi_map_region(efi_memory_desc_t *md); > extern void efi_sync_low_kernel_mappings(void); > extern void efi_setup_page_tables(void); > extern void __init old_map_region(efi_memory_desc_t *md); > +extern void __init runtime_code_page_mkexec(void); > +extern void __init efi_runtime_mkexec(void); > > #ifdef CONFIG_EFI > > diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c > index d7bf479..b26ab71 100644 > --- a/arch/x86/platform/efi/efi.c > +++ b/arch/x86/platform/efi/efi.c > @@ -717,7 +717,7 @@ void __init efi_set_executable(efi_memory_desc_t *md, bool executable) > set_memory_nx(addr, npages); > } > > -static void __init runtime_code_page_mkexec(void) > +void __init runtime_code_page_mkexec(void) > { > efi_memory_desc_t *md; > void *p; > @@ -905,8 +905,7 @@ void __init efi_enter_virtual_mode(void) > efi.update_capsule = virt_efi_update_capsule; > efi.query_capsule_caps = virt_efi_query_capsule_caps; > > - if (efi_enabled(EFI_OLD_MEMMAP) && (__supported_pte_mask & _PAGE_NX)) > - runtime_code_page_mkexec(); > + efi_runtime_mkexec(); > > kfree(new_memmap); > > diff --git a/arch/x86/platform/efi/efi_32.c b/arch/x86/platform/efi/efi_32.c > index e94557c..24d63c0 100644 > --- a/arch/x86/platform/efi/efi_32.c > +++ b/arch/x86/platform/efi/efi_32.c > @@ -74,3 +74,9 @@ void efi_call_phys_epilog(void) > > local_irq_restore(efi_rt_eflags); > } > + > +void __init efi_runtime_mkexec(void) > +{ > + if (__supported_pte_mask & _PAGE_NX) > + runtime_code_page_mkexec(); > +} > diff --git a/arch/x86/platform/efi/efi_64.c b/arch/x86/platform/efi/efi_64.c > index bf286c3..3abfde2 100644 > --- a/arch/x86/platform/efi/efi_64.c > +++ b/arch/x86/platform/efi/efi_64.c > @@ -222,3 +222,12 @@ void __iomem *__init efi_ioremap(unsigned long phys_addr, unsigned long size, > > return (void __iomem *)__va(phys_addr); > } > + > +void __init efi_runtime_mkexec(void) > +{ > + if (!efi_enabled(EFI_OLD_MEMMAP)) > + return; > + > + if (__supported_pte_mask & _PAGE_NX) > + runtime_code_page_mkexec(); > +} Seems to do what is claimed. Acked-by: Andy Whitcroft <apw@canonical.com> -apw
diff --git a/arch/x86/include/asm/efi.h b/arch/x86/include/asm/efi.h index 89a05b0..a208456 100644 --- a/arch/x86/include/asm/efi.h +++ b/arch/x86/include/asm/efi.h @@ -131,6 +131,8 @@ extern void __init efi_map_region(efi_memory_desc_t *md); extern void efi_sync_low_kernel_mappings(void); extern void efi_setup_page_tables(void); extern void __init old_map_region(efi_memory_desc_t *md); +extern void __init runtime_code_page_mkexec(void); +extern void __init efi_runtime_mkexec(void); #ifdef CONFIG_EFI diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c index d7bf479..b26ab71 100644 --- a/arch/x86/platform/efi/efi.c +++ b/arch/x86/platform/efi/efi.c @@ -717,7 +717,7 @@ void __init efi_set_executable(efi_memory_desc_t *md, bool executable) set_memory_nx(addr, npages); } -static void __init runtime_code_page_mkexec(void) +void __init runtime_code_page_mkexec(void) { efi_memory_desc_t *md; void *p; @@ -905,8 +905,7 @@ void __init efi_enter_virtual_mode(void) efi.update_capsule = virt_efi_update_capsule; efi.query_capsule_caps = virt_efi_query_capsule_caps; - if (efi_enabled(EFI_OLD_MEMMAP) && (__supported_pte_mask & _PAGE_NX)) - runtime_code_page_mkexec(); + efi_runtime_mkexec(); kfree(new_memmap); diff --git a/arch/x86/platform/efi/efi_32.c b/arch/x86/platform/efi/efi_32.c index e94557c..24d63c0 100644 --- a/arch/x86/platform/efi/efi_32.c +++ b/arch/x86/platform/efi/efi_32.c @@ -74,3 +74,9 @@ void efi_call_phys_epilog(void) local_irq_restore(efi_rt_eflags); } + +void __init efi_runtime_mkexec(void) +{ + if (__supported_pte_mask & _PAGE_NX) + runtime_code_page_mkexec(); +} diff --git a/arch/x86/platform/efi/efi_64.c b/arch/x86/platform/efi/efi_64.c index bf286c3..3abfde2 100644 --- a/arch/x86/platform/efi/efi_64.c +++ b/arch/x86/platform/efi/efi_64.c @@ -222,3 +222,12 @@ void __iomem *__init efi_ioremap(unsigned long phys_addr, unsigned long size, return (void __iomem *)__va(phys_addr); } + +void __init efi_runtime_mkexec(void) +{ + if (!efi_enabled(EFI_OLD_MEMMAP)) + return; + + if (__supported_pte_mask & _PAGE_NX) + runtime_code_page_mkexec(); +}