Re: [PATCH 2/5] x86_32: boot, extract efi_pe_entry from startup_32
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
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
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 SlabyCc: "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
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 +