diff mbox

[trusty,1/1] x86/efi: Fix 32-bit fallout

Message ID 1396894732-122060-2-git-send-email-seth.forshee@canonical.com
State New
Headers show

Commit Message

Seth Forshee April 7, 2014, 6:18 p.m. UTC
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(-)

Comments

Andy Whitcroft April 7, 2014, 6:31 p.m. UTC | #1
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 mbox

Patch

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();
+}