[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