} 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
)\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
\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