]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg/QemuKernelLoaderFsDxe: add support for the kernel setup block
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Fri, 28 Feb 2020 22:15:22 +0000 (23:15 +0100)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Thu, 5 Mar 2020 19:45:05 +0000 (19:45 +0000)
On x86, the kernel image consists of a setup block and the actual kernel,
and QEMU presents these as separate blobs, whereas on disk (and in terms
of PE/COFF image signing), they consist of a single image.

So add support to our FS loader driver to expose files via the abstract
file system that consist of up to two concatenated blobs, and redefine
the kernel file so it consists of the setup and kernel blobs, on every
architecture (on non-x86, the setup block is simply 0 bytes and is
therefore ignored implicitly)

Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=2566
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c

index dc86a48af3789c05e0ee2e8bca542543c4b1da2e..8ccb1983170c11c7ecca8511f32f53242c5ac611 100644 (file)
@@ -34,16 +34,29 @@ typedef enum {
 } KERNEL_BLOB_TYPE;\r
 \r
 typedef struct {\r
-  FIRMWARE_CONFIG_ITEM CONST SizeKey;\r
-  FIRMWARE_CONFIG_ITEM CONST DataKey;\r
-  CONST CHAR16 *       CONST Name;\r
-  UINT32                     Size;\r
-  UINT8                      *Data;\r
+  CONST CHAR16                  Name[8];\r
+  struct {\r
+    FIRMWARE_CONFIG_ITEM CONST  SizeKey;\r
+    FIRMWARE_CONFIG_ITEM CONST  DataKey;\r
+    UINT32                      Size;\r
+  }                             FwCfgItem[2];\r
+  UINT32                        Size;\r
+  UINT8                         *Data;\r
 } KERNEL_BLOB;\r
 \r
 STATIC KERNEL_BLOB mKernelBlob[KernelBlobTypeMax] = {\r
-  { QemuFwCfgItemKernelSize,      QemuFwCfgItemKernelData,      L"kernel"  },\r
-  { QemuFwCfgItemInitrdSize,      QemuFwCfgItemInitrdData,      L"initrd"  },\r
+  {\r
+    L"kernel",\r
+    {\r
+      { QemuFwCfgItemKernelSetupSize, QemuFwCfgItemKernelSetupData, },\r
+      { QemuFwCfgItemKernelSize,      QemuFwCfgItemKernelData,      },\r
+    }\r
+  }, {\r
+    L"initrd",\r
+    {\r
+      { QemuFwCfgItemInitrdSize,      QemuFwCfgItemInitrdData,      },\r
+    }\r
+  }\r
 };\r
 \r
 STATIC UINT64 mTotalBlobBytes;\r
@@ -850,12 +863,21 @@ FetchBlob (
   )\r
 {\r
   UINT32 Left;\r
+  UINTN  Idx;\r
+  UINT8  *ChunkData;\r
 \r
   //\r
   // Read blob size.\r
   //\r
-  QemuFwCfgSelectItem (Blob->SizeKey);\r
-  Blob->Size = QemuFwCfgRead32 ();\r
+  Blob->Size = 0;\r
+  for (Idx = 0; Idx < ARRAY_SIZE (Blob->FwCfgItem); Idx++) {\r
+    if (Blob->FwCfgItem[Idx].SizeKey == 0) {\r
+      break;\r
+    }\r
+    QemuFwCfgSelectItem (Blob->FwCfgItem[Idx].SizeKey);\r
+    Blob->FwCfgItem[Idx].Size = QemuFwCfgRead32 ();\r
+    Blob->Size += Blob->FwCfgItem[Idx].Size;\r
+  }\r
   if (Blob->Size == 0) {\r
     return EFI_SUCCESS;\r
   }\r
@@ -872,18 +894,28 @@ FetchBlob (
 \r
   DEBUG ((DEBUG_INFO, "%a: loading %Ld bytes for \"%s\"\n", __FUNCTION__,\r
     (INT64)Blob->Size, Blob->Name));\r
-  QemuFwCfgSelectItem (Blob->DataKey);\r
-\r
-  Left = Blob->Size;\r
-  do {\r
-    UINT32 Chunk;\r
-\r
-    Chunk = (Left < SIZE_1MB) ? Left : SIZE_1MB;\r
-    QemuFwCfgReadBytes (Chunk, Blob->Data + (Blob->Size - Left));\r
-    Left -= Chunk;\r
-    DEBUG ((DEBUG_VERBOSE, "%a: %Ld bytes remaining for \"%s\"\n",\r
-      __FUNCTION__, (INT64)Left, Blob->Name));\r
-  } while (Left > 0);\r
+\r
+  ChunkData = Blob->Data;\r
+  for (Idx = 0; Idx < ARRAY_SIZE (Blob->FwCfgItem); Idx++) {\r
+    if (Blob->FwCfgItem[Idx].DataKey == 0) {\r
+      break;\r
+    }\r
+    QemuFwCfgSelectItem (Blob->FwCfgItem[Idx].DataKey);\r
+\r
+    Left = Blob->FwCfgItem[Idx].Size;\r
+    while (Left > 0) {\r
+      UINT32 Chunk;\r
+\r
+      Chunk = (Left < SIZE_1MB) ? Left : SIZE_1MB;\r
+      QemuFwCfgReadBytes (Chunk, ChunkData + Blob->FwCfgItem[Idx].Size - Left);\r
+      Left -= Chunk;\r
+      DEBUG ((DEBUG_VERBOSE, "%a: %Ld bytes remaining for \"%s\" (%d)\n",\r
+        __FUNCTION__, (INT64)Left, Blob->Name, (INT32)Idx));\r
+    }\r
+\r
+    ChunkData += Blob->FwCfgItem[Idx].Size;\r
+  }\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r