From dd71f6e2876cb791fda1feb889558d1efcf41ea2 Mon Sep 17 00:00:00 2001 From: jljusten Date: Thu, 14 Feb 2013 19:21:39 +0000 Subject: [PATCH] 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 Reviewed-by: Jordan Justen git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@14132 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Library/LoadLinuxLib/Ia32/JumpToKernel.S | 19 ++++++++++++++- .../LoadLinuxLib/Ia32/JumpToKernel.asm | 21 +++++++++++++++- OvmfPkg/Library/LoadLinuxLib/Linux.c | 17 +++++++++---- OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.h | 11 ++++++++- .../Library/LoadLinuxLib/X64/JumpToKernel.S | 22 +++++++++++++++++ .../Library/LoadLinuxLib/X64/JumpToKernel.asm | 24 +++++++++++++++++++ 6 files changed, 107 insertions(+), 7 deletions(-) diff --git a/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.S b/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.S index b8cd4ca515..f7440f74c4 100644 --- a/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.S +++ b/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.S @@ -1,6 +1,6 @@ #------------------------------------------------------------------------------ # -# Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.
+# Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.
# # This program and the accompanying materials # 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(JumpToUefiKernel) #------------------------------------------------------------------------------ # VOID @@ -27,3 +28,19 @@ ASM_PFX(JumpToKernel): calll 0x4(%esp) 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 + diff --git a/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.asm b/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.asm index a8f3965f9a..21d0c4e724 100644 --- a/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.asm +++ b/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.asm @@ -1,6 +1,6 @@ ;------------------------------------------------------------------------------ ; -; Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.
+; Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.
; ; This program and the accompanying materials ; are licensed and made available under the terms and conditions of the BSD License @@ -32,4 +32,23 @@ JumpToKernel PROC 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 diff --git a/OvmfPkg/Library/LoadLinuxLib/Linux.c b/OvmfPkg/Library/LoadLinuxLib/Linux.c index 1da5507ff1..c714225e55 100644 --- a/OvmfPkg/Library/LoadLinuxLib/Linux.c +++ b/OvmfPkg/Library/LoadLinuxLib/Linux.c @@ -604,14 +604,11 @@ SetupGraphics ( STATIC EFI_STATUS SetupLinuxBootParams ( - IN VOID *Kernel, IN OUT struct boot_params *Bp ) { SetupGraphics (Bp); - Bp->hdr.code32_start = (UINT32)(UINTN) Kernel; - SetupLinuxMemmap (Bp); return EFI_SUCCESS; @@ -644,7 +641,19 @@ LoadLinux ( 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")); DisableInterrupts (); diff --git a/OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.h b/OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.h index f869797262..045cbf9b2f 100644 --- a/OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.h +++ b/OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.h @@ -1,7 +1,7 @@ /** @file Boot UEFI Linux. - Copyright (c) 2008 - 2011, Intel Corporation. All rights reserved.
+ Copyright (c) 2008 - 2013, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License @@ -36,6 +36,15 @@ JumpToKernel ( VOID *KernelBootParams ); +VOID +EFIAPI +JumpToUefiKernel ( + EFI_HANDLE ImageHandle, + EFI_SYSTEM_TABLE *SystemTable, + VOID *KernelBootParams, + VOID *KernelStart + ); + VOID InitLinuxDescriptorTables ( VOID diff --git a/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.S b/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.S index edc6e7bd70..056e3c013f 100644 --- a/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.S +++ b/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.S @@ -13,6 +13,7 @@ #------------------------------------------------------------------------------ ASM_GLOBAL ASM_PFX(JumpToKernel) +ASM_GLOBAL ASM_PFX(JumpToUefiKernel) #------------------------------------------------------------------------------ # VOID @@ -67,3 +68,24 @@ ASM_PFX(JumpToKernel): ret .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 + diff --git a/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.asm b/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.asm index bcf6260e1d..fc07eab684 100644 --- a/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.asm +++ b/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.asm @@ -68,4 +68,28 @@ JumpToKernel PROC 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 -- 2.39.2