Revision: 14053
          http://edk2.svn.sourceforge.net/edk2/?rev=14053&view=rev
Author:   jljusten
Date:     2013-01-16 06:50:08 +0000 (Wed, 16 Jan 2013)
Log Message:
-----------
OvmfPkg: LoadLinuxLib: Use kernel's EFI entry point where available

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: David Woodhouse <[email protected]>
Reviewed-by: Jordan Justen <[email protected]>

Modified Paths:
--------------
    trunk/edk2/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.S
    trunk/edk2/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.asm
    trunk/edk2/OvmfPkg/Library/LoadLinuxLib/Linux.c
    trunk/edk2/OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.h
    trunk/edk2/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.S
    trunk/edk2/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.asm

Modified: trunk/edk2/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.S
===================================================================
--- trunk/edk2/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.S 2013-01-16 
06:49:45 UTC (rev 14052)
+++ trunk/edk2/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.S 2013-01-16 
06:50:08 UTC (rev 14053)
@@ -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
 # 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 @@
     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
+

Modified: trunk/edk2/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.asm
===================================================================
--- trunk/edk2/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.asm       
2013-01-16 06:49:45 UTC (rev 14052)
+++ trunk/edk2/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.asm       
2013-01-16 06:50:08 UTC (rev 14053)
@@ -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
 ; are licensed and made available under the terms and conditions of the BSD 
License
@@ -32,4 +32,23 @@
 
 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

Modified: trunk/edk2/OvmfPkg/Library/LoadLinuxLib/Linux.c
===================================================================
--- trunk/edk2/OvmfPkg/Library/LoadLinuxLib/Linux.c     2013-01-16 06:49:45 UTC 
(rev 14052)
+++ trunk/edk2/OvmfPkg/Library/LoadLinuxLib/Linux.c     2013-01-16 06:50:08 UTC 
(rev 14053)
@@ -604,14 +604,11 @@
 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,8 +641,19 @@
 
   InitLinuxDescriptorTables ();
 
-  SetupLinuxBootParams (Kernel, (struct boot_params*) KernelSetup);
+  Bp->hdr.code32_start = (UINT32)(UINTN) Kernel;
+  if (Bp->hdr.version >= 0x20b && Bp->hdr.handover_offset &&
+      (Bp->hdr.load_flags & (sizeof(long) >> 1))) {
+    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 ();
   SetLinuxDescriptorTables ();

Modified: trunk/edk2/OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.h
===================================================================
--- trunk/edk2/OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.h      2013-01-16 
06:49:45 UTC (rev 14052)
+++ trunk/edk2/OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.h      2013-01-16 
06:50:08 UTC (rev 14053)
@@ -1,7 +1,7 @@
 /** @file
   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
   are licensed and made available under the terms and conditions of the BSD 
License
@@ -37,6 +37,15 @@
   );
 
 VOID
+EFIAPI
+JumpToUefiKernel (
+  EFI_HANDLE ImageHandle,
+  EFI_SYSTEM_TABLE *SystemTable,
+  VOID *KernelBootParams,
+  VOID *KernelStart
+  );
+
+VOID
 InitLinuxDescriptorTables (
   VOID
   );

Modified: trunk/edk2/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.S
===================================================================
--- trunk/edk2/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.S  2013-01-16 
06:49:45 UTC (rev 14052)
+++ trunk/edk2/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.S  2013-01-16 
06:50:08 UTC (rev 14053)
@@ -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
 # 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
@@ -67,3 +68,24 @@
     ret
 .code64
 
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# JumpToUefiKernel (
+#   EFI_HANDLE ImageHandle,
+#   EFI_SYSTEM_TABLE *SystemTable,
+#   VOID *KernelBootParams,
+#   VOID *KernelStart
+#   );
+#------------------------------------------------------------------------------
+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
+

Modified: trunk/edk2/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.asm
===================================================================
--- trunk/edk2/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.asm        
2013-01-16 06:49:45 UTC (rev 14052)
+++ trunk/edk2/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.asm        
2013-01-16 06:50:08 UTC (rev 14053)
@@ -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
 ; are licensed and made available under the terms and conditions of the BSD 
License
@@ -68,4 +68,28 @@
 
 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

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Master Java SE, Java EE, Eclipse, Spring, Hibernate, JavaScript, jQuery
and much more. Keep your Java skills current with LearnJavaNow -
200+ hours of step-by-step video tutorials by Java experts.
SALE $49.99 this month only -- learn more at:
http://p.sf.net/sfu/learnmore_122612 
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to