OvmfPkg LoadLinuxLib: Use kernel's EFI entry point where available

Usage of the EFI entry point was made feasible in the kernel
x64 boot protocol 2.12 where a 32-bit & 64-bit entry point
became well defined.

http://git.kernel.org/linus/09c205af

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@14132 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
jljusten
2013-02-14 19:21:39 +00:00
parent 25ca06f9a0
commit dd71f6e287
6 changed files with 107 additions and 7 deletions

View File

@ -1,6 +1,6 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# #
# Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
# #
# This program and the accompanying materials # This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # are licensed and made available under the terms and conditions of the BSD License
@ -13,6 +13,7 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
ASM_GLOBAL ASM_PFX(JumpToKernel) ASM_GLOBAL ASM_PFX(JumpToKernel)
ASM_GLOBAL ASM_PFX(JumpToUefiKernel)
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# VOID # VOID
@ -27,3 +28,19 @@ ASM_PFX(JumpToKernel):
calll 0x4(%esp) calll 0x4(%esp)
ret ret
#------------------------------------------------------------------------------
# VOID
# EFIAPI
# JumpToUefiKernel (
# EFI_HANDLE ImageHandle,
# EFI_SYSTEM_TABLE *SystemTable,
# VOID *KernelBootParams,
# VOID *KernelStart
# );
#------------------------------------------------------------------------------
ASM_PFX(JumpToUefiKernel):
movl 0xc(%esp), %eax
movl 0x264(%eax), %eax
addl 0x10(%esp), %eax
jmp %eax

View File

@ -1,6 +1,6 @@
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
; ;
; Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR> ; Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
; ;
; This program and the accompanying materials ; This program and the accompanying materials
; are licensed and made available under the terms and conditions of the BSD License ; are licensed and made available under the terms and conditions of the BSD License
@ -32,4 +32,23 @@ JumpToKernel PROC
JumpToKernel ENDP JumpToKernel ENDP
;------------------------------------------------------------------------------
; VOID
; EFIAPI
; JumpToUefiKernel (
; EFI_HANDLE ImageHandle,
; EFI_SYSTEM_TABLE *SystemTable,
; VOID *KernelBootParams,
; VOID *KernelStart
; );
;------------------------------------------------------------------------------
JumpToUefiKernel PROC
mov eax, [esp + 12]
mov eax, [eax + 264h]
add eax, [esp + 16]
jmp eax
JumpToUefiKernel ENDP
END END

View File

@ -604,14 +604,11 @@ SetupGraphics (
STATIC STATIC
EFI_STATUS EFI_STATUS
SetupLinuxBootParams ( SetupLinuxBootParams (
IN VOID *Kernel,
IN OUT struct boot_params *Bp IN OUT struct boot_params *Bp
) )
{ {
SetupGraphics (Bp); SetupGraphics (Bp);
Bp->hdr.code32_start = (UINT32)(UINTN) Kernel;
SetupLinuxMemmap (Bp); SetupLinuxMemmap (Bp);
return EFI_SUCCESS; return EFI_SUCCESS;
@ -644,7 +641,19 @@ LoadLinux (
InitLinuxDescriptorTables (); InitLinuxDescriptorTables ();
SetupLinuxBootParams (Kernel, (struct boot_params*) KernelSetup); Bp->hdr.code32_start = (UINT32)(UINTN) Kernel;
if (Bp->hdr.version >= 0x20c && Bp->hdr.handover_offset &&
(Bp->hdr.load_flags & (sizeof (UINTN) == 4 ? BIT2 : BIT3))) {
DEBUG ((EFI_D_INFO, "Jumping to kernel EFI handover point at ofs %x\n", Bp->hdr.handover_offset));
DisableInterrupts ();
JumpToUefiKernel ((VOID*) gImageHandle, (VOID*) gST, KernelSetup, Kernel);
}
//
// Old kernels without EFI handover protocol
//
SetupLinuxBootParams (KernelSetup);
DEBUG ((EFI_D_INFO, "Jumping to kernel\n")); DEBUG ((EFI_D_INFO, "Jumping to kernel\n"));
DisableInterrupts (); DisableInterrupts ();

View File

@ -1,7 +1,7 @@
/** @file /** @file
Boot UEFI Linux. Boot UEFI Linux.
Copyright (c) 2008 - 2011, Intel Corporation. All rights reserved.<BR> Copyright (c) 2008 - 2013, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License are licensed and made available under the terms and conditions of the BSD License
@ -36,6 +36,15 @@ JumpToKernel (
VOID *KernelBootParams VOID *KernelBootParams
); );
VOID
EFIAPI
JumpToUefiKernel (
EFI_HANDLE ImageHandle,
EFI_SYSTEM_TABLE *SystemTable,
VOID *KernelBootParams,
VOID *KernelStart
);
VOID VOID
InitLinuxDescriptorTables ( InitLinuxDescriptorTables (
VOID VOID

View File

@ -13,6 +13,7 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
ASM_GLOBAL ASM_PFX(JumpToKernel) ASM_GLOBAL ASM_PFX(JumpToKernel)
ASM_GLOBAL ASM_PFX(JumpToUefiKernel)
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# VOID # VOID
@ -67,3 +68,24 @@ ASM_PFX(JumpToKernel):
ret ret
.code64 .code64
#------------------------------------------------------------------------------
# VOID
# EFIAPI
# JumpToUefiKernel (
# EFI_HANDLE ImageHandle, // rcx
# EFI_SYSTEM_TABLE *SystemTable, // rdx
# VOID *KernelBootParams, // r8
# VOID *KernelStart // r9
# );
#------------------------------------------------------------------------------
ASM_PFX(JumpToUefiKernel):
movq %rcx, %rdi
movq %rdx, %rsi
movq %r8, %rdx
xor %rax, %rax
movl 0x264(%r8), %eax
addq %rax, %r9
addq $0x200, %r9
callq %r9
ret

View File

@ -68,4 +68,28 @@ JumpToKernel PROC
JumpToKernel ENDP JumpToKernel ENDP
;------------------------------------------------------------------------------
; VOID
; EFIAPI
; JumpToUefiKernel (
; EFI_HANDLE ImageHandle, // rcx
; EFI_SYSTEM_TABLE *SystemTable, // rdx
; VOID *KernelBootParams // r8
; VOID *KernelStart, // r9
; );
;------------------------------------------------------------------------------
JumpToUefiKernel PROC
mov rdi, rcx
mov rsi, rdx
mov rdx, r8
xor rax, rax
mov eax, [r8 + 264h]
add r9, rax
add r9, 200h
call r9
ret
JumpToUefiKernel ENDP
END END