On Thu, 2013-01-10 at 18:04 +0000, David Woodhouse wrote:
> From: David Woodhouse <[email protected]>
> 
> If the bootloader calls the EFI handover entry point as a standard function
> call, then it'll have a return address on the stack. We need to pop that
> before calling efi_main(), or the arguments will all be out of position on
> the stack.
> 
> Signed-off-by: David Woodhouse <[email protected]>
> ---
>  arch/x86/boot/compressed/head_32.S | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/arch/x86/boot/compressed/head_32.S 
> b/arch/x86/boot/compressed/head_32.S
> index aa4aaf1..ccb2f4a 100644
> --- a/arch/x86/boot/compressed/head_32.S
> +++ b/arch/x86/boot/compressed/head_32.S
> @@ -50,8 +50,10 @@ ENTRY(startup_32)
>       pushl   %eax
>       pushl   %esi
>       pushl   %ecx
> +     sub     $0x4, %esp
>  
>       .org 0x30,0x90
> +     add     $0x4, %esp
>       call    efi_main
>       cmpl    $0, %eax
>       movl    %eax, %esi

It's worth pointing out that efilinux doesn't invoke the handover
protocol as a function, it pushes arguments onto the stack and jumps. So
this change will actually break that boot loader.

Is there a particular reason why you need to invoke it as a standard
function on 32-bits?

-- 
Matt Fleming, Intel Open Source Technology Center

--
To unsubscribe from this list: send the line "unsubscribe linux-efi" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to