Re: [PATCH 2/5] x86_32: boot, extract efi_pe_entry from startup_32

2017-06-05 Thread Matt Fleming
On Wed, 31 May, at 10:12:40AM, Jiri Slaby wrote:
> efi_pe_entry body is somehow squashed into startup_32. In the old days,
> we forced startup_32 to start at offset 0x00 and efi_pe_entry to start
> at 0x10. But this requirement was removed in 99f857db8857 ("x86, build:
> Dynamically find entry points in compressed startup code") long time
> ago.
> 
> The way it is now makes the code less readable and illogical. And given
> we can now safely extract the inlined efi_pe_entry body from
> startup_32 into a separate function, we do so and we separate it to two
> functions as they are marked already: efi_pe_entry + efi32_stub_entry.
> 
> We also annotate the functions appropriatelly by ENTRY+ENDPROC.
> 
> ABI offset is preserved:
>      128 FUNCGLOBAL DEFAULT6 startup_32
>   008060 FUNCGLOBAL DEFAULT6 efi_pe_entry
>   00bc68 FUNCGLOBAL DEFAULT6 efi32_stub_entry
> 
> On the top-level, it looked like:
>   ENTRY(startup_32)
>   #ifdef CONFIG_EFI_STUB  ; start of inlined
>   jmp preferred_addr
>   ENTRY(efi_pe_entry)
>   ... ; a lot of assembly (efi_pe_entry)
>   ENTRY(efi32_stub_entry)
>   ... ; a lot of assembly (efi32_stub_entry)
>   lealpreferred_addr(%eax), %eax
>   jmp *%eax
>   preferred_addr:
>   #endif  ; end of inlined
>   ... ; a lot of assembly (startup_32)
>   ENDPROC(startup_32)
> 
> And it is converted into:
>   ENTRY(startup_32)
>   ... ; a lot of assembly (startup_32)
>   ENDPROC(startup_32)
> 
>   #ifdef CONFIG_EFI_STUB
>   ENTRY(efi_pe_entry)
>   ... ; a lot of assembly (efi_pe_entry)
>   ENDPROC(efi_pe_entry)
> 
>   ENTRY(efi32_stub_entry)
>   ... ; a lot of assembly (efi32_stub_entry)
>   lealstartup_32(%eax), %eax
>   jmp *%eax
>   ENDPROC(efi32_stub_entry)
>   #endif
> 
> Signed-off-by: Jiri Slaby 
> Cc: "H. Peter Anvin" 
> Cc: Thomas Gleixner 
> Cc: Ingo Molnar 
> Cc: 
> Cc: David Woodhouse 
> Cc: Matt Fleming 
> ---
>  arch/x86/boot/compressed/head_32.S | 129 
> ++---
>  1 file changed, 64 insertions(+), 65 deletions(-)

Reviewed-by: Matt Fleming 


Re: [PATCH 2/5] x86_32: boot, extract efi_pe_entry from startup_32

2017-06-05 Thread Matt Fleming
On Wed, 31 May, at 10:12:40AM, Jiri Slaby wrote:
> efi_pe_entry body is somehow squashed into startup_32. In the old days,
> we forced startup_32 to start at offset 0x00 and efi_pe_entry to start
> at 0x10. But this requirement was removed in 99f857db8857 ("x86, build:
> Dynamically find entry points in compressed startup code") long time
> ago.
> 
> The way it is now makes the code less readable and illogical. And given
> we can now safely extract the inlined efi_pe_entry body from
> startup_32 into a separate function, we do so and we separate it to two
> functions as they are marked already: efi_pe_entry + efi32_stub_entry.
> 
> We also annotate the functions appropriatelly by ENTRY+ENDPROC.
> 
> ABI offset is preserved:
>      128 FUNCGLOBAL DEFAULT6 startup_32
>   008060 FUNCGLOBAL DEFAULT6 efi_pe_entry
>   00bc68 FUNCGLOBAL DEFAULT6 efi32_stub_entry
> 
> On the top-level, it looked like:
>   ENTRY(startup_32)
>   #ifdef CONFIG_EFI_STUB  ; start of inlined
>   jmp preferred_addr
>   ENTRY(efi_pe_entry)
>   ... ; a lot of assembly (efi_pe_entry)
>   ENTRY(efi32_stub_entry)
>   ... ; a lot of assembly (efi32_stub_entry)
>   lealpreferred_addr(%eax), %eax
>   jmp *%eax
>   preferred_addr:
>   #endif  ; end of inlined
>   ... ; a lot of assembly (startup_32)
>   ENDPROC(startup_32)
> 
> And it is converted into:
>   ENTRY(startup_32)
>   ... ; a lot of assembly (startup_32)
>   ENDPROC(startup_32)
> 
>   #ifdef CONFIG_EFI_STUB
>   ENTRY(efi_pe_entry)
>   ... ; a lot of assembly (efi_pe_entry)
>   ENDPROC(efi_pe_entry)
> 
>   ENTRY(efi32_stub_entry)
>   ... ; a lot of assembly (efi32_stub_entry)
>   lealstartup_32(%eax), %eax
>   jmp *%eax
>   ENDPROC(efi32_stub_entry)
>   #endif
> 
> Signed-off-by: Jiri Slaby 
> Cc: "H. Peter Anvin" 
> Cc: Thomas Gleixner 
> Cc: Ingo Molnar 
> Cc: 
> Cc: David Woodhouse 
> Cc: Matt Fleming 
> ---
>  arch/x86/boot/compressed/head_32.S | 129 
> ++---
>  1 file changed, 64 insertions(+), 65 deletions(-)

Reviewed-by: Matt Fleming 


[PATCH 2/5] x86_32: boot, extract efi_pe_entry from startup_32

2017-05-31 Thread Jiri Slaby
efi_pe_entry body is somehow squashed into startup_32. In the old days,
we forced startup_32 to start at offset 0x00 and efi_pe_entry to start
at 0x10. But this requirement was removed in 99f857db8857 ("x86, build:
Dynamically find entry points in compressed startup code") long time
ago.

The way it is now makes the code less readable and illogical. And given
we can now safely extract the inlined efi_pe_entry body from
startup_32 into a separate function, we do so and we separate it to two
functions as they are marked already: efi_pe_entry + efi32_stub_entry.

We also annotate the functions appropriatelly by ENTRY+ENDPROC.

ABI offset is preserved:
     128 FUNCGLOBAL DEFAULT6 startup_32
  008060 FUNCGLOBAL DEFAULT6 efi_pe_entry
  00bc68 FUNCGLOBAL DEFAULT6 efi32_stub_entry

On the top-level, it looked like:
ENTRY(startup_32)
#ifdef CONFIG_EFI_STUB  ; start of inlined
jmp preferred_addr
ENTRY(efi_pe_entry)
... ; a lot of assembly (efi_pe_entry)
ENTRY(efi32_stub_entry)
... ; a lot of assembly (efi32_stub_entry)
lealpreferred_addr(%eax), %eax
jmp *%eax
preferred_addr:
#endif  ; end of inlined
... ; a lot of assembly (startup_32)
ENDPROC(startup_32)

And it is converted into:
ENTRY(startup_32)
... ; a lot of assembly (startup_32)
ENDPROC(startup_32)

#ifdef CONFIG_EFI_STUB
ENTRY(efi_pe_entry)
... ; a lot of assembly (efi_pe_entry)
ENDPROC(efi_pe_entry)

ENTRY(efi32_stub_entry)
... ; a lot of assembly (efi32_stub_entry)
lealstartup_32(%eax), %eax
jmp *%eax
ENDPROC(efi32_stub_entry)
#endif

Signed-off-by: Jiri Slaby 
Cc: "H. Peter Anvin" 
Cc: Thomas Gleixner 
Cc: Ingo Molnar 
Cc: 
Cc: David Woodhouse 
Cc: Matt Fleming 
---
 arch/x86/boot/compressed/head_32.S | 129 ++---
 1 file changed, 64 insertions(+), 65 deletions(-)

diff --git a/arch/x86/boot/compressed/head_32.S 
b/arch/x86/boot/compressed/head_32.S
index d85b9625e836..11c68cf53d4e 100644
--- a/arch/x86/boot/compressed/head_32.S
+++ b/arch/x86/boot/compressed/head_32.S
@@ -61,71 +61,6 @@
 
__HEAD
 ENTRY(startup_32)
-#ifdef CONFIG_EFI_STUB
-   jmp preferred_addr
-
-   /*
-* We don't need the return address, so set up the stack so
-* efi_main() can find its arguments.
-*/
-ENTRY(efi_pe_entry)
-   add $0x4, %esp
-
-   call1f
-1: popl%esi
-   subl$1b, %esi
-
-   popl%ecx
-   movl%ecx, efi32_config(%esi)/* Handle */
-   popl%ecx
-   movl%ecx, efi32_config+8(%esi)  /* EFI System table pointer */
-
-   /* Relocate efi_config->call() */
-   lealefi32_config(%esi), %eax
-   add %esi, 40(%eax)
-   pushl   %eax
-
-   callmake_boot_params
-   cmpl$0, %eax
-   je  fail
-   movl%esi, BP_code32_start(%eax)
-   popl%ecx
-   pushl   %eax
-   pushl   %ecx
-   jmp 2f  /* Skip efi_config initialization */
-
-ENTRY(efi32_stub_entry)
-   add $0x4, %esp
-   popl%ecx
-   popl%edx
-
-   call1f
-1: popl%esi
-   subl$1b, %esi
-
-   movl%ecx, efi32_config(%esi)/* Handle */
-   movl%edx, efi32_config+8(%esi)  /* EFI System table pointer */
-
-   /* Relocate efi_config->call() */
-   lealefi32_config(%esi), %eax
-   add %esi, 40(%eax)
-   pushl   %eax
-2:
-   callefi_main
-   cmpl$0, %eax
-   movl%eax, %esi
-   jne 2f
-fail:
-   /* EFI init failed, so hang. */
-   hlt
-   jmp fail
-2:
-   movlBP_code32_start(%esi), %eax
-   lealpreferred_addr(%eax), %eax
-   jmp *%eax
-
-preferred_addr:
-#endif
cld
/*
 * Test KEEP_SEGMENTS flag to see if the bootloader is asking
@@ -208,6 +143,70 @@ preferred_addr:
jmp *%eax
 ENDPROC(startup_32)
 
+#ifdef CONFIG_EFI_STUB
+/*
+ * We don't need the return address, so set up the stack so efi_main() can find
+ * its arguments.
+ */
+ENTRY(efi_pe_entry)
+   add $0x4, %esp
+
+   call1f
+1: popl%esi
+   subl$1b, %esi
+
+   popl%ecx
+   movl%ecx, efi32_config(%esi)/* Handle */
+   popl%ecx
+   movl%ecx, efi32_config+8(%esi)  /* EFI System table pointer */
+
+   /* Relocate efi_config->call() */
+   lealefi32_config(%esi), %eax
+   add %esi, 40(%eax)
+   pushl   %eax
+
+   callmake_boot_params
+   

[PATCH 2/5] x86_32: boot, extract efi_pe_entry from startup_32

2017-05-31 Thread Jiri Slaby
efi_pe_entry body is somehow squashed into startup_32. In the old days,
we forced startup_32 to start at offset 0x00 and efi_pe_entry to start
at 0x10. But this requirement was removed in 99f857db8857 ("x86, build:
Dynamically find entry points in compressed startup code") long time
ago.

The way it is now makes the code less readable and illogical. And given
we can now safely extract the inlined efi_pe_entry body from
startup_32 into a separate function, we do so and we separate it to two
functions as they are marked already: efi_pe_entry + efi32_stub_entry.

We also annotate the functions appropriatelly by ENTRY+ENDPROC.

ABI offset is preserved:
     128 FUNCGLOBAL DEFAULT6 startup_32
  008060 FUNCGLOBAL DEFAULT6 efi_pe_entry
  00bc68 FUNCGLOBAL DEFAULT6 efi32_stub_entry

On the top-level, it looked like:
ENTRY(startup_32)
#ifdef CONFIG_EFI_STUB  ; start of inlined
jmp preferred_addr
ENTRY(efi_pe_entry)
... ; a lot of assembly (efi_pe_entry)
ENTRY(efi32_stub_entry)
... ; a lot of assembly (efi32_stub_entry)
lealpreferred_addr(%eax), %eax
jmp *%eax
preferred_addr:
#endif  ; end of inlined
... ; a lot of assembly (startup_32)
ENDPROC(startup_32)

And it is converted into:
ENTRY(startup_32)
... ; a lot of assembly (startup_32)
ENDPROC(startup_32)

#ifdef CONFIG_EFI_STUB
ENTRY(efi_pe_entry)
... ; a lot of assembly (efi_pe_entry)
ENDPROC(efi_pe_entry)

ENTRY(efi32_stub_entry)
... ; a lot of assembly (efi32_stub_entry)
lealstartup_32(%eax), %eax
jmp *%eax
ENDPROC(efi32_stub_entry)
#endif

Signed-off-by: Jiri Slaby 
Cc: "H. Peter Anvin" 
Cc: Thomas Gleixner 
Cc: Ingo Molnar 
Cc: 
Cc: David Woodhouse 
Cc: Matt Fleming 
---
 arch/x86/boot/compressed/head_32.S | 129 ++---
 1 file changed, 64 insertions(+), 65 deletions(-)

diff --git a/arch/x86/boot/compressed/head_32.S 
b/arch/x86/boot/compressed/head_32.S
index d85b9625e836..11c68cf53d4e 100644
--- a/arch/x86/boot/compressed/head_32.S
+++ b/arch/x86/boot/compressed/head_32.S
@@ -61,71 +61,6 @@
 
__HEAD
 ENTRY(startup_32)
-#ifdef CONFIG_EFI_STUB
-   jmp preferred_addr
-
-   /*
-* We don't need the return address, so set up the stack so
-* efi_main() can find its arguments.
-*/
-ENTRY(efi_pe_entry)
-   add $0x4, %esp
-
-   call1f
-1: popl%esi
-   subl$1b, %esi
-
-   popl%ecx
-   movl%ecx, efi32_config(%esi)/* Handle */
-   popl%ecx
-   movl%ecx, efi32_config+8(%esi)  /* EFI System table pointer */
-
-   /* Relocate efi_config->call() */
-   lealefi32_config(%esi), %eax
-   add %esi, 40(%eax)
-   pushl   %eax
-
-   callmake_boot_params
-   cmpl$0, %eax
-   je  fail
-   movl%esi, BP_code32_start(%eax)
-   popl%ecx
-   pushl   %eax
-   pushl   %ecx
-   jmp 2f  /* Skip efi_config initialization */
-
-ENTRY(efi32_stub_entry)
-   add $0x4, %esp
-   popl%ecx
-   popl%edx
-
-   call1f
-1: popl%esi
-   subl$1b, %esi
-
-   movl%ecx, efi32_config(%esi)/* Handle */
-   movl%edx, efi32_config+8(%esi)  /* EFI System table pointer */
-
-   /* Relocate efi_config->call() */
-   lealefi32_config(%esi), %eax
-   add %esi, 40(%eax)
-   pushl   %eax
-2:
-   callefi_main
-   cmpl$0, %eax
-   movl%eax, %esi
-   jne 2f
-fail:
-   /* EFI init failed, so hang. */
-   hlt
-   jmp fail
-2:
-   movlBP_code32_start(%esi), %eax
-   lealpreferred_addr(%eax), %eax
-   jmp *%eax
-
-preferred_addr:
-#endif
cld
/*
 * Test KEEP_SEGMENTS flag to see if the bootloader is asking
@@ -208,6 +143,70 @@ preferred_addr:
jmp *%eax
 ENDPROC(startup_32)
 
+#ifdef CONFIG_EFI_STUB
+/*
+ * We don't need the return address, so set up the stack so efi_main() can find
+ * its arguments.
+ */
+ENTRY(efi_pe_entry)
+   add $0x4, %esp
+
+   call1f
+1: popl%esi
+   subl$1b, %esi
+
+   popl%ecx
+   movl%ecx, efi32_config(%esi)/* Handle */
+   popl%ecx
+   movl%ecx, efi32_config+8(%esi)  /* EFI System table pointer */
+
+   /* Relocate efi_config->call() */
+   lealefi32_config(%esi), %eax
+   add %esi, 40(%eax)
+   pushl   %eax
+
+   callmake_boot_params
+   cmpl$0, %eax
+   je  fail
+   movl%esi, BP_code32_start(%eax)
+   popl%ecx
+   pushl   %eax
+