]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/Library/LoadLinuxLib/Linux.c
OvmfPkg: fix conversion specifiers in DEBUG format strings
[mirror_edk2.git] / OvmfPkg / Library / LoadLinuxLib / Linux.c
index 1da5507ff12ee19ca14b4f607ad999d4ff80445f..9c996adfbb0030c0b776083890b56480a61e6756 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 \r
-  Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 \r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
@@ -143,7 +143,8 @@ LoadLinuxInitializeKernelSetup (
   //\r
   ZeroMem (KernelSetup, 0x1f1);\r
   ZeroMem (((UINT8 *)KernelSetup) + SetupEnd, 4096 - SetupEnd);\r
-  DEBUG ((EFI_D_INFO, "Cleared kernel setup 0-0x1f1, 0x%x-0x1000\n", SetupEnd));\r
+  DEBUG ((EFI_D_INFO, "Cleared kernel setup 0-0x1f1, 0x%Lx-0x1000\n",\r
+    (UINT64)SetupEnd));\r
 \r
   return EFI_SUCCESS;\r
 }\r
@@ -280,8 +281,12 @@ SetupLinuxMemmap (
   // Enlarge space here, because we will allocate pool now.\r
   //\r
   MemoryMapSize += EFI_PAGE_SIZE;\r
-  MemoryMap = AllocatePool (MemoryMapSize);\r
-  ASSERT (MemoryMap != NULL);\r
+  Status = gBS->AllocatePool (\r
+                  EfiLoaderData,\r
+                  MemoryMapSize,\r
+                  (VOID **) &MemoryMap\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
 \r
   //\r
   // Get System MemoryMap\r
@@ -349,15 +354,15 @@ SetupLinuxMemmap (
     if ((LastE820 != NULL) &&\r
         (LastE820->type == (UINT32) E820Type) &&\r
         (MemoryMap->PhysicalStart == LastEndAddr)) {\r
-      LastE820->size += EFI_PAGES_TO_SIZE (MemoryMap->NumberOfPages);\r
-      LastEndAddr += EFI_PAGES_TO_SIZE (MemoryMap->NumberOfPages);\r
+      LastE820->size += EFI_PAGES_TO_SIZE ((UINTN) MemoryMap->NumberOfPages);\r
+      LastEndAddr += EFI_PAGES_TO_SIZE ((UINTN) MemoryMap->NumberOfPages);\r
     } else {\r
       if (E820EntryCount >= (sizeof (Bp->e820_map) / sizeof (Bp->e820_map[0]))) {\r
         break;\r
       }\r
       E820->type = (UINT32) E820Type;\r
       E820->addr = MemoryMap->PhysicalStart;\r
-      E820->size = EFI_PAGES_TO_SIZE (MemoryMap->NumberOfPages);\r
+      E820->size = EFI_PAGES_TO_SIZE ((UINTN) MemoryMap->NumberOfPages);\r
       LastE820 = E820;\r
       LastEndAddr = E820->addr + E820->size;\r
       E820++;\r
@@ -380,8 +385,8 @@ SetupLinuxMemmap (
 #ifdef MDE_CPU_IA32\r
   Efi->efi_loader_signature = SIGNATURE_32 ('E', 'L', '3', '2');\r
 #else\r
-  Efi->efi_systab_hi = ((UINT64)(UINTN) gST) >> 32;\r
-  Efi->efi_memmap_hi = ((UINT64)(UINTN) MemoryMapPtr) >> 32;\r
+  Efi->efi_systab_hi = (UINT32) (((UINT64)(UINTN) gST) >> 32);\r
+  Efi->efi_memmap_hi = (UINT32) (((UINT64)(UINTN) MemoryMapPtr) >> 32);\r
   Efi->efi_loader_signature = SIGNATURE_32 ('E', 'L', '6', '4');\r
 #endif\r
 \r
@@ -604,14 +609,11 @@ SetupGraphics (
 STATIC\r
 EFI_STATUS\r
 SetupLinuxBootParams (\r
-  IN VOID                   *Kernel,\r
   IN OUT struct boot_params *Bp\r
   )\r
 {\r
   SetupGraphics (Bp);\r
 \r
-  Bp->hdr.code32_start = (UINT32)(UINTN) Kernel;\r
-\r
   SetupLinuxMemmap (Bp);\r
 \r
   return EFI_SUCCESS;\r
@@ -644,7 +646,19 @@ LoadLinux (
 \r
   InitLinuxDescriptorTables ();\r
 \r
-  SetupLinuxBootParams (Kernel, (struct boot_params*) KernelSetup);\r
+  Bp->hdr.code32_start = (UINT32)(UINTN) Kernel;\r
+  if (Bp->hdr.version >= 0x20c && Bp->hdr.handover_offset &&\r
+      (Bp->hdr.xloadflags & (sizeof (UINTN) == 4 ? BIT2 : BIT3))) {\r
+    DEBUG ((EFI_D_INFO, "Jumping to kernel EFI handover point at ofs %x\n", Bp->hdr.handover_offset));\r
+\r
+    DisableInterrupts ();\r
+    JumpToUefiKernel ((VOID*) gImageHandle, (VOID*) gST, KernelSetup, Kernel);\r
+  }\r
+\r
+  //\r
+  // Old kernels without EFI handover protocol\r
+  //\r
+  SetupLinuxBootParams (KernelSetup);\r
 \r
   DEBUG ((EFI_D_INFO, "Jumping to kernel\n"));\r
   DisableInterrupts ();\r