[Acked] [PATCH][trusty 1/1] x86/efi: Fix 32-bit fallout
Andy Whitcroft
apw at canonical.com
Mon Apr 7 18:31:15 UTC 2014
On Mon, Apr 07, 2014 at 01:18:52PM -0500, Seth Forshee wrote:
> From: Borislav Petkov <bp at 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 at intel.com>
> Signed-off-by: Borislav Petkov <bp at suse.de>
> Signed-off-by: Matt Fleming <matt.fleming at 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 at 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 at canonical.com>
-apw
More information about the kernel-team
mailing list