]> git.proxmox.com Git - mirror_edk2.git/blame - DuetPkg/DxeIpl/HobGeneration.c
Fix a bug about the iSCSI DHCP dependency issue.
[mirror_edk2.git] / DuetPkg / DxeIpl / HobGeneration.c
CommitLineData
18b84857 1/** @file\r
ca162103 2\r
db4d3fa1 3Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
b1f700a8 4This program and the accompanying materials \r
ca162103 5are licensed and made available under the terms and conditions of the BSD License \r
6which accompanies this distribution. The full text of the license may be found at \r
7http://opensource.org/licenses/bsd-license.php \r
8 \r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
11\r
12Module Name:\r
13 HobGeneration.c\r
14\r
15Abstract:\r
16\r
17Revision History:\r
18\r
18b84857 19**/\r
ca162103 20#include "DxeIpl.h"\r
21#include "HobGeneration.h"\r
22#include "PpisNeededByDxeCore.h"\r
23#include "FlashLayout.h"\r
24#include "Debug.h"\r
25\r
4a1db20f 26#define EFI_CPUID_EXTENDED_FUNCTION 0x80000000\r
27#define CPUID_EXTENDED_ADD_SIZE 0x80000008\r
ca162103 28\r
29HOB_TEMPLATE gHobTemplate = {\r
30 { // Phit\r
31 { // Header\r
32 EFI_HOB_TYPE_HANDOFF, // HobType\r
33 sizeof (EFI_HOB_HANDOFF_INFO_TABLE), // HobLength\r
34 0 // Reserved\r
35 },\r
36 EFI_HOB_HANDOFF_TABLE_VERSION, // Version\r
37 BOOT_WITH_FULL_CONFIGURATION, // BootMode\r
38 0, // EfiMemoryTop\r
39 0, // EfiMemoryBottom\r
40 0, // EfiFreeMemoryTop\r
41 0, // EfiFreeMemoryBottom\r
42 0 // EfiEndOfHobList\r
43 }, \r
44 { // Bfv\r
45 {\r
46 EFI_HOB_TYPE_FV, // HobType\r
47 sizeof (EFI_HOB_FIRMWARE_VOLUME), // HobLength\r
48 0 // Reserved\r
49 },\r
50 0, // BaseAddress\r
51 0 // Length\r
52 },\r
53 { // BfvResource\r
54 {\r
55 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, // HobType\r
56 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR), // HobLength\r
57 0 // Reserved\r
58 },\r
59 {\r
60 0 // Owner Guid\r
61 },\r
62 EFI_RESOURCE_FIRMWARE_DEVICE, // ResourceType\r
63 (EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
64 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
65 EFI_RESOURCE_ATTRIBUTE_TESTED |\r
66 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE), // ResourceAttribute\r
67 0, // PhysicalStart\r
68 0 // ResourceLength\r
69 },\r
70 { // Cpu\r
71 { // Header\r
72 EFI_HOB_TYPE_CPU, // HobType\r
73 sizeof (EFI_HOB_CPU), // HobLength\r
74 0 // Reserved\r
75 },\r
76 52, // SizeOfMemorySpace - Architecture Max\r
77 16, // SizeOfIoSpace,\r
78 {\r
79 0, 0, 0, 0, 0, 0 // Reserved[6]\r
80 }\r
81 },\r
82 { // Stack HOB\r
83 { // header\r
84 EFI_HOB_TYPE_MEMORY_ALLOCATION, // Hob type\r
85 sizeof (EFI_HOB_MEMORY_ALLOCATION_STACK), // Hob size\r
86 0 // reserved\r
87 },\r
88 {\r
89 EFI_HOB_MEMORY_ALLOC_STACK_GUID,\r
90 0x0, // EFI_PHYSICAL_ADDRESS MemoryBaseAddress;\r
91 0x0, // UINT64 MemoryLength;\r
92 EfiBootServicesData, // EFI_MEMORY_TYPE MemoryType; \r
9008db4a 93 {0, 0, 0, 0} // Reserved Reserved[4]; \r
ca162103 94 }\r
95 },\r
96 { // MemoryAllocation for HOB's & Images\r
97 {\r
98 EFI_HOB_TYPE_MEMORY_ALLOCATION, // HobType\r
99 sizeof (EFI_HOB_MEMORY_ALLOCATION), // HobLength\r
100 0 // Reserved\r
101 },\r
102 {\r
103 {\r
104 0, //EFI_HOB_MEMORY_ALLOC_MODULE_GUID // Name\r
105 },\r
106 0x0, // EFI_PHYSICAL_ADDRESS MemoryBaseAddress;\r
107 0x0, // UINT64 MemoryLength;\r
108 EfiBootServicesData, // EFI_MEMORY_TYPE MemoryType; \r
109 {\r
110 0, 0, 0, 0 // Reserved Reserved[4]; \r
111 }\r
112 }\r
113 },\r
114 { // MemoryFreeUnder1MB for unused memory that DXE core will claim\r
115 {\r
116 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, // HobType\r
117 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR), // HobLength\r
118 0 // Reserved\r
119 },\r
120 {\r
121 0 // Owner Guid\r
122 },\r
123 EFI_RESOURCE_SYSTEM_MEMORY, // ResourceType\r
124 (EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
125 EFI_RESOURCE_ATTRIBUTE_TESTED |\r
126 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
127 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE | \r
128 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE | \r
129 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE | \r
130 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE), \r
131 0x0, // PhysicalStart\r
132 0 // ResourceLength\r
133 },\r
134 { // MemoryFreeAbove1MB for unused memory that DXE core will claim\r
135 {\r
136 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, // HobType\r
137 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR), // HobLength\r
138 0 // Reserved\r
139 },\r
140 {\r
141 0 // Owner Guid\r
142 },\r
143 EFI_RESOURCE_SYSTEM_MEMORY, // ResourceType\r
144 (EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
145 EFI_RESOURCE_ATTRIBUTE_TESTED |\r
146 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
147 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE | \r
148 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE | \r
149 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE | \r
150 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE), \r
151 0x0, // PhysicalStart\r
152 0 // ResourceLength\r
153 },\r
154 { // MemoryFreeAbove4GB for unused memory that DXE core will claim\r
155 {\r
156 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, // HobType\r
157 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR), // HobLength\r
158 0 // Reserved\r
159 },\r
160 {\r
161 0 // Owner Guid\r
162 },\r
163 EFI_RESOURCE_SYSTEM_MEMORY, // ResourceType\r
164 (EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
165 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
166 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE | \r
167 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE | \r
168 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE | \r
169 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE), \r
170 0x0, // PhysicalStart\r
171 0 // ResourceLength\r
172 },\r
173 { // Memory Allocation Module for DxeCore\r
174 { // header\r
175 EFI_HOB_TYPE_MEMORY_ALLOCATION, // Hob type\r
176 sizeof (EFI_HOB_MEMORY_ALLOCATION_MODULE), // Hob size\r
177 0 // reserved\r
178 },\r
179 {\r
180 EFI_HOB_MEMORY_ALLOC_MODULE_GUID,\r
181 0x0, // EFI_PHYSICAL_ADDRESS MemoryBaseAddress;\r
182 0x0, // UINT64 MemoryLength;\r
183 EfiBootServicesCode, // EFI_MEMORY_TYPE MemoryType; \r
184 {\r
185 0, 0, 0, 0 // UINT8 Reserved[4]; \r
186 },\r
187 },\r
db4d3fa1 188 DXE_CORE_FILE_NAME_GUID,\r
ca162103 189 0x0 // EFI_PHYSICAL_ADDRESS of EntryPoint;\r
190 },\r
d569cbb0 191 { // MemoryDxeCore\r
192 {\r
193 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, // HobType\r
194 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR), // HobLength\r
195 0 // Reserved\r
196 },\r
197 {\r
198 0 // Owner Guid\r
199 },\r
200 EFI_RESOURCE_SYSTEM_MEMORY, // ResourceType\r
201 (EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
202// EFI_RESOURCE_ATTRIBUTE_TESTED | // Do not mark as TESTED, or DxeCore will find it and use it before check Allocation\r
203 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
204 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE | \r
205 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE | \r
206 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE | \r
207 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE), \r
208 0x0, // PhysicalStart\r
209 0 // ResourceLength\r
210 },\r
ca162103 211 { // Memory Map Hints to reduce fragmentation in the memory map\r
9008db4a 212 {\r
213 {\r
214 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
215 sizeof (MEMORY_TYPE_INFORMATION_HOB), // Hob size\r
216 0, // reserved\r
217 },\r
218 EFI_MEMORY_TYPE_INFORMATION_GUID\r
219 },\r
ca162103 220 {\r
221 {\r
222 EfiACPIReclaimMemory,\r
223 0x80\r
224 }, // 0x80 pages = 512k for ASL\r
225 {\r
226 EfiACPIMemoryNVS,\r
227 0x100\r
228 }, // 0x100 pages = 1024k for S3, SMM, etc\r
229 {\r
230 EfiReservedMemoryType,\r
231 0x04\r
232 }, // 16k for BIOS Reserved\r
233 {\r
234 EfiRuntimeServicesData,\r
235 0x100\r
236 },\r
237 {\r
238 EfiRuntimeServicesCode,\r
239 0x100\r
240 },\r
241 {\r
242 EfiBootServicesCode,\r
243 0x200\r
244 },\r
245 {\r
246 EfiBootServicesData,\r
247 0x200\r
248 },\r
249 {\r
250 EfiLoaderCode,\r
251 0x100\r
252 },\r
253 {\r
254 EfiLoaderData,\r
255 0x100\r
256 },\r
257 {\r
258 EfiMaxMemoryType,\r
259 0\r
260 }\r
261 }\r
262 },\r
263 { // Pointer to ACPI Table\r
9008db4a 264 {\r
265 {\r
266 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
267 sizeof (TABLE_HOB), // Hob size\r
268 0 // reserved\r
269 },\r
270 EFI_ACPI_TABLE_GUID\r
271 },\r
ca162103 272 0\r
273 },\r
274 { // Pointer to ACPI20 Table\r
9008db4a 275 {\r
276 { \r
277 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
278 sizeof (TABLE_HOB), // Hob size\r
279 0 // reserved\r
280 },\r
281 EFI_ACPI_20_TABLE_GUID\r
282 },\r
ca162103 283 0\r
284 },\r
285 { // Pointer to SMBIOS Table\r
9008db4a 286 {\r
287 {\r
288 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
289 sizeof (TABLE_HOB), // Hob size\r
290 0 // reserved\r
291 },\r
7bc4989f 292 SMBIOS_TABLE_GUID\r
9008db4a 293 },\r
ca162103 294 0\r
295 },\r
296 { // Pointer to MPS Table\r
9008db4a 297 {\r
298 {\r
299 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
300 sizeof (TABLE_HOB), // Hob size\r
301 0, // reserved\r
302 },\r
303 EFI_MPS_TABLE_GUID\r
304 },\r
ca162103 305 0\r
306 },\r
307 /**\r
308 { // Pointer to FlushInstructionCache\r
309 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
310 sizeof (PROTOCOL_HOB), // Hob size\r
311 0, // reserved\r
312 EFI_PEI_FLUSH_INSTRUCTION_CACHE_GUID,\r
313 NULL\r
314 },\r
315 { // Pointer to TransferControl\r
316 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
317 sizeof (PROTOCOL_HOB), // Hob size\r
318 0, // reserved\r
319 EFI_PEI_TRANSFER_CONTROL_GUID,\r
320 NULL\r
321 },\r
322 { // Pointer to PeCoffLoader\r
323 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
324 sizeof (PROTOCOL_HOB), // Hob size\r
325 0, // reserved\r
326 EFI_PEI_PE_COFF_LOADER_GUID,\r
327 NULL\r
328 },\r
329 { // Pointer to EfiDecompress\r
330 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
331 sizeof (PROTOCOL_HOB), // Hob size\r
332 0, // reserved\r
333 EFI_DECOMPRESS_PROTOCOL_GUID,\r
334 NULL\r
335 },\r
336 { // Pointer to TianoDecompress\r
337 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
338 sizeof (PROTOCOL_HOB), // Hob size\r
339 0, // reserved\r
340 EFI_TIANO_DECOMPRESS_PROTOCOL_GUID,\r
341 NULL\r
342 },\r
343 **/\r
344 { // Pointer to ReportStatusCode\r
9008db4a 345 {\r
346 {\r
347 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
348 sizeof (PROTOCOL_HOB), // Hob size\r
349 0 // reserved\r
350 },\r
351 EFI_STATUS_CODE_RUNTIME_PROTOCOL_GUID\r
352 },\r
d555d90f 353 0\r
ca162103 354 },\r
355 { // EFILDR Memory Descriptor\r
9008db4a 356 {\r
357 {\r
358 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
359 sizeof (MEMORY_DESC_HOB), // Hob size\r
360 0 // reserved\r
361 },\r
db4d3fa1 362 LDR_MEMORY_DESCRIPTOR_GUID\r
9008db4a 363 },\r
ca162103 364 0,\r
365 NULL\r
366 },\r
367 { // Pci Express Base Address Hob\r
9008db4a 368 {\r
369 {\r
370 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
371 sizeof (PCI_EXPRESS_BASE_HOB), // Hob size\r
372 0 // reserved\r
373 },\r
374 EFI_PCI_EXPRESS_BASE_ADDRESS_GUID\r
375 },\r
ca162103 376 {\r
377 0,\r
378 0,\r
379 0,\r
380 }\r
381 },\r
382 { // Acpi Description Hob\r
ca162103 383 {\r
9008db4a 384 {\r
385 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
386 sizeof (ACPI_DESCRIPTION_HOB), // Hob size\r
387 0 // reserved\r
388 },\r
389 EFI_ACPI_DESCRIPTION_GUID\r
390 },\r
391 {\r
392 {\r
393 0,\r
394 },\r
ca162103 395 }\r
396 },\r
397 { // NV Storage FV Resource\r
398 {\r
399 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, // HobType\r
400 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR), // HobLength\r
401 0 // Reserved\r
402 },\r
403 {\r
404 0 // Owner Guid\r
405 },\r
406 EFI_RESOURCE_FIRMWARE_DEVICE, // ResourceType\r
407 (EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
408 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
409 EFI_RESOURCE_ATTRIBUTE_TESTED |\r
410 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE), // ResourceAttribute\r
411 0, // PhysicalStart (Fixed later)\r
412 NV_STORAGE_FVB_SIZE // ResourceLength\r
413 },\r
414 { // FVB holding NV Storage\r
ca162103 415 {\r
9008db4a 416 {\r
417 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
418 sizeof (FVB_HOB),\r
419 0\r
420 },\r
421 EFI_FLASH_MAP_HOB_GUID\r
422 },\r
423 {\r
424 {0, 0, 0}, // Reserved[3]\r
ca162103 425 EFI_FLASH_AREA_GUID_DEFINED, // AreaType\r
204d0e01 426 EFI_SYSTEM_NV_DATA_FV_GUID , // AreaTypeGuid\r
ca162103 427 1,\r
428 {\r
9008db4a 429 {\r
430 EFI_FLASH_AREA_FV | EFI_FLASH_AREA_MEMMAPPED_FV, // SubAreaData.Attributes\r
431 0, // SubAreaData.Reserved\r
432 0, // SubAreaData.Base (Fixed later)\r
433 NV_STORAGE_FVB_SIZE, // SubAreaData.Length\r
434 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID // SubAreaData.FileSystem\r
435 }\r
ca162103 436 }, \r
437 0, // VolumeSignature (Fixed later)\r
438 NV_STORAGE_FILE_PATH, // Mapped file without padding\r
439 // TotalFVBSize = FileSize + PaddingSize = multiple of BLOCK_SIZE\r
440 NV_STORAGE_SIZE + EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH,\r
441 // ActuralSize\r
442 EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH\r
443 }\r
444 },\r
445 { // NV Storage Hob\r
ca162103 446 {\r
9008db4a 447 {\r
448 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
449 sizeof (FVB_HOB), // Hob size\r
450 0 // reserved\r
451 },\r
452 EFI_FLASH_MAP_HOB_GUID\r
453 },\r
454 {\r
455 {0, 0, 0}, // Reserved[3]\r
ca162103 456 EFI_FLASH_AREA_EFI_VARIABLES, // AreaType\r
457 { 0 }, // AreaTypeGuid\r
458 1,\r
459 {\r
9008db4a 460 {\r
461 EFI_FLASH_AREA_SUBFV | EFI_FLASH_AREA_MEMMAPPED_FV, // SubAreaData.Attributes\r
462 0, // SubAreaData.Reserved\r
463 0, // SubAreaData.Base (Fixed later)\r
464 NV_STORAGE_SIZE, // SubAreaData.Length\r
465 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID // SubAreaData.FileSystem\r
466 }\r
ca162103 467 }, \r
468 0,\r
469 NV_STORAGE_FILE_PATH,\r
470 NV_STORAGE_SIZE,\r
471 0\r
472 }\r
473 },\r
d569cbb0 474 { // NV Ftw FV Resource\r
475 {\r
476 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, // HobType\r
477 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR), // HobLength\r
478 0 // Reserved\r
479 },\r
480 {\r
481 0 // Owner Guid\r
482 },\r
483 EFI_RESOURCE_FIRMWARE_DEVICE, // ResourceType\r
484 (EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
485 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
486 EFI_RESOURCE_ATTRIBUTE_TESTED |\r
487 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE), // ResourceAttribute\r
488 0, // PhysicalStart (Fixed later)\r
489 NV_FTW_FVB_SIZE // ResourceLength\r
490 }, \r
ca162103 491 { // FVB holding FTW spaces including Working & Spare space\r
ca162103 492 {\r
9008db4a 493 {\r
494 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
495 sizeof (FVB_HOB),\r
496 0\r
497 },\r
498 EFI_FLASH_MAP_HOB_GUID\r
499 },\r
500 {\r
501 {0, 0, 0}, // Reserved[3]\r
ca162103 502 EFI_FLASH_AREA_GUID_DEFINED, // AreaType\r
204d0e01 503 EFI_SYSTEM_NV_DATA_FV_GUID, // AreaTypeGuid\r
ca162103 504 1,\r
505 {\r
9008db4a 506 {\r
507 EFI_FLASH_AREA_FV | EFI_FLASH_AREA_MEMMAPPED_FV, // SubAreaData.Attributes\r
508 0, // SubAreaData.Reserved\r
509 0, // SubAreaData.Base (Fixed later)\r
510 NV_FTW_FVB_SIZE, // SubAreaData.Length\r
511 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID // SubAreaData.FileSystem\r
512 }\r
ca162103 513 }, \r
514 0,\r
515 L"", // Empty String indicates using memory\r
516 0,\r
517 0\r
518 }\r
519 },\r
520 { // NV Ftw working Hob\r
ca162103 521 {\r
9008db4a 522 {\r
523 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
524 sizeof (FVB_HOB), // Hob size\r
525 0 // reserved\r
526 },\r
527 EFI_FLASH_MAP_HOB_GUID\r
528 },\r
529 {\r
530 {0, 0, 0}, // Reserved[3]\r
ca162103 531 EFI_FLASH_AREA_FTW_STATE, // AreaType\r
532 { 0 }, // AreaTypeGuid\r
533 1,\r
534 {\r
9008db4a 535 {\r
536 EFI_FLASH_AREA_SUBFV | EFI_FLASH_AREA_MEMMAPPED_FV, // SubAreaData.Attributes\r
537 0, // SubAreaData.Reserved\r
538 0, // SubAreaData.Base (Fixed later)\r
539 NV_FTW_WORKING_SIZE, // SubAreaData.Length\r
540 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID // SubAreaData.FileSystem\r
541 }\r
ca162103 542 }, \r
543 0, // VolumeSignature\r
544 L"",\r
545 0,\r
546 0\r
547 }\r
548 },\r
549 { // NV Ftw spare Hob\r
ca162103 550 {\r
9008db4a 551 {\r
552 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
553 sizeof (FVB_HOB), // Hob size\r
554 0 // reserved\r
555 },\r
556 EFI_FLASH_MAP_HOB_GUID\r
557 },\r
558 {\r
559 {0, 0, 0}, // Reserved[3]\r
ca162103 560 EFI_FLASH_AREA_FTW_BACKUP, // AreaType\r
561 { 0 }, // AreaTypeGuid\r
562 1,\r
563 {\r
9008db4a 564 {\r
565 EFI_FLASH_AREA_SUBFV | EFI_FLASH_AREA_MEMMAPPED_FV, // SubAreaData.Attributes\r
566 0, // SubAreaData.Reserved\r
567 0, // SubAreaData.Base (Fixed later)\r
568 NV_FTW_SPARE_SIZE, // SubAreaData.Length\r
569 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID // SubAreaData.FileSystem\r
570 }\r
ca162103 571 }, \r
572 0,\r
573 L"",\r
574 0,\r
575 0\r
576 }\r
577 },\r
578 { // EndOfHobList\r
579 EFI_HOB_TYPE_END_OF_HOB_LIST, // HobType\r
580 sizeof (EFI_HOB_GENERIC_HEADER), // HobLength\r
581 0 // Reserved\r
582 }\r
583};\r
584\r
585HOB_TEMPLATE *gHob = &gHobTemplate;\r
586\r
587VOID *\r
588PrepareHobMemory (\r
589 IN UINTN NumberOfMemoryMapEntries,\r
590 IN EFI_MEMORY_DESCRIPTOR *EfiMemoryDescriptor\r
591 )\r
592/*++\r
593Description:\r
594 Update the Hob filling MemoryFreeUnder1MB, MemoryAbove1MB, MemoryAbove4GB\r
595\r
596Arguments:\r
597 NumberOfMemoryMapEntries - Count of Memory Descriptors\r
598 EfiMemoryDescriptor - Point to the buffer containing NumberOfMemoryMapEntries Memory Descriptors\r
599\r
600Return:\r
601 VOID * : The end address of MemoryAbove1MB (or the top free memory under 4GB)\r
602--*/\r
603{\r
604 UINTN Index;\r
605\r
606 //\r
607 // Prepare Low Memory\r
608 // 0x18 pages is 72 KB.\r
609 //\r
610 gHob->MemoryFreeUnder1MB.ResourceLength = EFI_MEMORY_BELOW_1MB_END - EFI_MEMORY_BELOW_1MB_START;\r
611 gHob->MemoryFreeUnder1MB.PhysicalStart = EFI_MEMORY_BELOW_1MB_START;\r
612\r
613 //\r
614 // Prepare High Memory\r
615 // Assume Memory Map is ordered from low to high\r
616 //\r
617 gHob->MemoryAbove1MB.PhysicalStart = 0;\r
618 gHob->MemoryAbove1MB.ResourceLength = 0;\r
619 gHob->MemoryAbove4GB.PhysicalStart = 0;\r
620 gHob->MemoryAbove4GB.ResourceLength = 0;\r
621\r
622 for (Index = 0; Index < NumberOfMemoryMapEntries; Index++) {\r
623 //\r
624 // Skip regions below 1MB\r
625 //\r
626 if (EfiMemoryDescriptor[Index].PhysicalStart < 0x100000) {\r
627 continue;\r
628 }\r
629 //\r
630 // Process regions above 1MB\r
631 //\r
632 if (EfiMemoryDescriptor[Index].PhysicalStart >= 0x100000) {\r
633 if (EfiMemoryDescriptor[Index].Type == EfiConventionalMemory) {\r
634 if (gHob->MemoryAbove1MB.PhysicalStart == 0) {\r
635 gHob->MemoryAbove1MB.PhysicalStart = EfiMemoryDescriptor[Index].PhysicalStart;\r
636 gHob->MemoryAbove1MB.ResourceLength = LShiftU64 (EfiMemoryDescriptor[Index].NumberOfPages, EFI_PAGE_SHIFT);\r
637 } else if (gHob->MemoryAbove1MB.PhysicalStart + gHob->MemoryAbove1MB.ResourceLength == EfiMemoryDescriptor[Index].PhysicalStart) {\r
638 gHob->MemoryAbove1MB.ResourceLength += LShiftU64 (EfiMemoryDescriptor[Index].NumberOfPages, EFI_PAGE_SHIFT);\r
639 }\r
640 }\r
641 if ((EfiMemoryDescriptor[Index].Type == EfiReservedMemoryType) ||\r
642 (EfiMemoryDescriptor[Index].Type >= EfiACPIReclaimMemory) ) {\r
643 continue;\r
644 }\r
645 if ((EfiMemoryDescriptor[Index].Type == EfiRuntimeServicesCode) ||\r
646 (EfiMemoryDescriptor[Index].Type == EfiRuntimeServicesData)) {\r
647 break;\r
648 }\r
649 }\r
650 //\r
651 // Process region above 4GB\r
652 //\r
f40bbc08 653 if (EfiMemoryDescriptor[Index].PhysicalStart >= 0x100000000LL) {\r
ca162103 654 if (EfiMemoryDescriptor[Index].Type == EfiConventionalMemory) {\r
655 if (gHob->MemoryAbove4GB.PhysicalStart == 0) {\r
656 gHob->MemoryAbove4GB.PhysicalStart = EfiMemoryDescriptor[Index].PhysicalStart;\r
657 gHob->MemoryAbove4GB.ResourceLength = LShiftU64 (EfiMemoryDescriptor[Index].NumberOfPages, EFI_PAGE_SHIFT);\r
658 }\r
659 if (gHob->MemoryAbove4GB.PhysicalStart + gHob->MemoryAbove4GB.ResourceLength == \r
660 EfiMemoryDescriptor[Index].PhysicalStart) {\r
661 gHob->MemoryAbove4GB.ResourceLength += LShiftU64 (EfiMemoryDescriptor[Index].NumberOfPages, EFI_PAGE_SHIFT);\r
662 }\r
663 }\r
664 }\r
665 }\r
666\r
667 if (gHob->MemoryAbove4GB.ResourceLength == 0) {\r
668 //\r
669 // If there is no memory above 4GB then change the resource descriptor HOB\r
670 // into another type. I'm doing this as it's unclear if a resource\r
671 // descriptor HOB of length zero is valid. Spec does not say it's illegal,\r
672 // but code in EDK does not seem to handle this case.\r
673 //\r
674 gHob->MemoryAbove4GB.Header.HobType = EFI_HOB_TYPE_UNUSED;\r
675 }\r
676\r
677 return (VOID *)(UINTN)(gHob->MemoryAbove1MB.PhysicalStart + gHob->MemoryAbove1MB.ResourceLength);\r
678}\r
679\r
680VOID *\r
681PrepareHobStack (\r
682 IN VOID *StackTop\r
683 )\r
684{\r
685 gHob->Stack.AllocDescriptor.MemoryLength = EFI_MEMORY_STACK_PAGE_NUM * EFI_PAGE_SIZE;\r
686 gHob->Stack.AllocDescriptor.MemoryBaseAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)StackTop - gHob->Stack.AllocDescriptor.MemoryLength;\r
687\r
688 return (VOID *)(UINTN)gHob->Stack.AllocDescriptor.MemoryBaseAddress;\r
689}\r
690\r
691VOID *\r
692PrepareHobMemoryDescriptor (\r
693 VOID *MemoryDescriptorTop,\r
694 UINTN MemDescCount,\r
695 EFI_MEMORY_DESCRIPTOR *MemDesc\r
696 )\r
697{\r
698 gHob->MemoryDescriptor.MemDescCount = MemDescCount;\r
699 gHob->MemoryDescriptor.MemDesc = (EFI_MEMORY_DESCRIPTOR *)((UINTN)MemoryDescriptorTop - MemDescCount * sizeof(EFI_MEMORY_DESCRIPTOR));\r
700 //\r
701 // Make MemoryDescriptor.MemDesc page aligned\r
702 //\r
703 gHob->MemoryDescriptor.MemDesc = (EFI_MEMORY_DESCRIPTOR *)((UINTN) gHob->MemoryDescriptor.MemDesc & ~EFI_PAGE_MASK);\r
704\r
705 CopyMem (gHob->MemoryDescriptor.MemDesc, MemDesc, MemDescCount * sizeof(EFI_MEMORY_DESCRIPTOR));\r
706\r
707 return gHob->MemoryDescriptor.MemDesc;\r
708}\r
709\r
710VOID\r
711PrepareHobBfv (\r
712 VOID *Bfv,\r
713 UINTN BfvLength\r
714 )\r
715{\r
e188a609 716 //UINTN BfvLengthPageSize;\r
ca162103 717\r
718 //\r
719 // Calculate BFV location at top of the memory region.\r
720 // This is like a RAM Disk. Align to page boundry.\r
721 //\r
e188a609 722 //BfvLengthPageSize = EFI_PAGES_TO_SIZE (EFI_SIZE_TO_PAGES (BfvLength));\r
ca162103 723 \r
724 gHob->Bfv.BaseAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)Bfv;\r
725 gHob->Bfv.Length = BfvLength;\r
726\r
727 //\r
728 // Resource descriptor for the FV\r
729 //\r
730 gHob->BfvResource.PhysicalStart = gHob->Bfv.BaseAddress;\r
731 gHob->BfvResource.ResourceLength = gHob->Bfv.Length;\r
732}\r
733\r
734VOID\r
735PrepareHobDxeCore (\r
736 VOID *DxeCoreEntryPoint,\r
737 EFI_PHYSICAL_ADDRESS DxeCoreImageBase,\r
738 UINT64 DxeCoreLength\r
739 )\r
740{\r
d569cbb0 741 gHob->DxeCore.MemoryAllocationHeader.MemoryBaseAddress = DxeCoreImageBase;\r
ca162103 742 gHob->DxeCore.MemoryAllocationHeader.MemoryLength = DxeCoreLength;\r
743 gHob->DxeCore.EntryPoint = (EFI_PHYSICAL_ADDRESS)(UINTN)DxeCoreEntryPoint;\r
d569cbb0 744\r
745\r
746 gHob->MemoryDxeCore.PhysicalStart = DxeCoreImageBase;\r
747 gHob->MemoryDxeCore.ResourceLength = DxeCoreLength; \r
ca162103 748}\r
749\r
750VOID *\r
751PrepareHobNvStorage (\r
752 VOID *NvStorageTop\r
753 )\r
754/*\r
755 Initialize Block-Aligned Firmware Block.\r
756\r
757 Variable:\r
758 +-------------------+\r
759 | FV_Header |\r
760 +-------------------+\r
761 | |\r
762 |VAR_STORAGE(0x4000)|\r
763 | |\r
764 +-------------------+\r
765 FTW:\r
766 +-------------------+\r
767 | FV_Header |\r
768 +-------------------+\r
769 | |\r
770 | Working(0x2000) |\r
771 | |\r
772 +-------------------+\r
773 | |\r
774 | Spare(0x10000) |\r
775 | |\r
776 +-------------------+\r
777*/\r
778{\r
e56dd2ce 779 STATIC VARIABLE_STORE_HEADER VarStoreHeader = {\r
439c34f3 780 VARIABLE_STORE_SIGNATURE,\r
ca162103 781 0xffffffff, // will be fixed in Variable driver\r
782 VARIABLE_STORE_FORMATTED,\r
783 VARIABLE_STORE_HEALTHY,\r
784 0,\r
785 0\r
786 };\r
787 \r
e56dd2ce 788 STATIC EFI_FIRMWARE_VOLUME_HEADER NvStorageFvbHeader = {\r
ca162103 789 {\r
790 0,\r
791 }, // ZeroVector[16]\r
792 EFI_SYSTEM_NV_DATA_FV_GUID,\r
793 NV_STORAGE_FVB_SIZE,\r
794 EFI_FVH_SIGNATURE,\r
795 EFI_FVB_READ_ENABLED_CAP |\r
796 EFI_FVB_READ_STATUS |\r
797 EFI_FVB_WRITE_ENABLED_CAP |\r
798 EFI_FVB_WRITE_STATUS |\r
799 EFI_FVB_ERASE_POLARITY,\r
800 EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH,\r
801 0, // CheckSum\r
802 0, // ExtHeaderOffset\r
803 {\r
804 0,\r
805 }, // Reserved[1]\r
806 1, // Revision\r
807 {\r
808 {\r
809 NV_STORAGE_FVB_BLOCK_NUM,\r
810 FV_BLOCK_SIZE,\r
811 }\r
812 }\r
813 };\r
814\r
e56dd2ce 815 STATIC EFI_FV_BLOCK_MAP_ENTRY BlockMapEntryEnd = {0, 0};\r
ca162103 816\r
817 EFI_PHYSICAL_ADDRESS StorageFvbBase;\r
818 EFI_PHYSICAL_ADDRESS FtwFvbBase;\r
819\r
820 UINT16 *Ptr;\r
821 UINT16 Checksum;\r
822\r
823\r
824 //\r
825 // Use first 16-byte Reset Vector of FVB to store extra information\r
826 // UINT32 Offset 0 stores the volume signature\r
827 // UINT8 Offset 4 : should init the Variable Store Header if non-zero\r
828 //\r
829 gHob->NvStorageFvb.FvbInfo.VolumeId = *(UINT32 *) (UINTN) (NV_STORAGE_STATE);\r
830 gHob->NvStorage. FvbInfo.VolumeId = *(UINT32 *) (UINTN) (NV_STORAGE_STATE);\r
831\r
832 //\r
833 // *(NV_STORAGE_STATE + 4):\r
834 // 2 - Size error\r
835 // 1 - File not exist\r
836 // 0 - File exist with correct size\r
837 //\r
838 if (*(UINT8 *) (UINTN) (NV_STORAGE_STATE + 4) == 2) {\r
839 ClearScreen ();\r
840 PrintString ("Error: Size of Efivar.bin should be 16k!\n");\r
841 CpuDeadLoop();\r
842 }\r
843 \r
844 if (*(UINT8 *) (UINTN) (NV_STORAGE_STATE + 4) != 0) {\r
845 //\r
846 // Efivar.bin doesn't exist\r
847 // 1. Init variable storage header to valid header\r
848 //\r
849 CopyMem (\r
850 (VOID *) (UINTN) NV_STORAGE_START,\r
851 &VarStoreHeader,\r
852 sizeof (VARIABLE_STORE_HEADER)\r
853 );\r
854 //\r
855 // 2. set all bits in variable storage body to 1\r
856 //\r
857 SetMem (\r
858 (VOID *) (UINTN) (NV_STORAGE_START + sizeof (VARIABLE_STORE_HEADER)),\r
859 NV_STORAGE_SIZE - sizeof (VARIABLE_STORE_HEADER),\r
860 0xff\r
861 );\r
862 }\r
863\r
864 //\r
865 // Relocate variable storage\r
866 // \r
867 // 1. Init FVB Header to valid header: First 0x48 bytes\r
868 // In real platform, these fields are fixed by tools\r
869 //\r
870 //\r
871 Checksum = 0;\r
872 for (\r
873 Ptr = (UINT16 *) &NvStorageFvbHeader; \r
874 Ptr < (UINT16 *) ((UINTN) (UINT8 *) &NvStorageFvbHeader + sizeof (EFI_FIRMWARE_VOLUME_HEADER));\r
875 ++Ptr\r
876 ) {\r
877 Checksum = (UINT16) (Checksum + (*Ptr));\r
878 }\r
879 NvStorageFvbHeader.Checksum = (UINT16) (0x10000 - Checksum);\r
880 StorageFvbBase = (EFI_PHYSICAL_ADDRESS)(((UINTN)NvStorageTop - NV_STORAGE_FVB_SIZE - NV_FTW_FVB_SIZE) & ~EFI_PAGE_MASK);\r
881 CopyMem ((VOID *) (UINTN) StorageFvbBase, &NvStorageFvbHeader, sizeof (EFI_FIRMWARE_VOLUME_HEADER));\r
882 CopyMem (\r
883 (VOID *) (UINTN) (StorageFvbBase + sizeof (EFI_FIRMWARE_VOLUME_HEADER)),\r
884 &BlockMapEntryEnd,\r
885 sizeof (EFI_FV_BLOCK_MAP_ENTRY)\r
886 );\r
887 \r
888 //\r
889 // 2. Relocate variable data\r
890 //\r
891 CopyMem (\r
892 (VOID *) (UINTN) (StorageFvbBase + EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH),\r
893 (VOID *) (UINTN) NV_STORAGE_START,\r
894 NV_STORAGE_SIZE\r
895 );\r
896\r
897 //\r
898 // 3. Set the remaining memory to 0xff\r
899 //\r
900 SetMem (\r
901 (VOID *) (UINTN) (StorageFvbBase + EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH + NV_STORAGE_SIZE),\r
902 NV_STORAGE_FVB_SIZE - NV_STORAGE_SIZE - EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH,\r
903 0xff\r
904 );\r
905\r
906 //\r
907 // Create the FVB holding NV Storage in memory\r
908 //\r
909 gHob->NvStorageFvResource.PhysicalStart =\r
910 gHob->NvStorageFvb.FvbInfo.Entries[0].Base = StorageFvbBase;\r
911 //\r
912 // Create the NV Storage Hob\r
913 //\r
914 gHob->NvStorage.FvbInfo.Entries[0].Base = StorageFvbBase + EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH;\r
915\r
916 //\r
917 // Create the FVB holding FTW spaces\r
918 //\r
919 FtwFvbBase = (EFI_PHYSICAL_ADDRESS)((UINTN) StorageFvbBase + NV_STORAGE_FVB_SIZE);\r
d569cbb0 920 gHob->NvFtwFvResource.PhysicalStart =\r
921 gHob->NvFtwFvb.FvbInfo.Entries[0].Base = FtwFvbBase;\r
ca162103 922 //\r
923 // Put FTW Working in front\r
924 //\r
925 gHob->NvFtwWorking.FvbInfo.Entries[0].Base = FtwFvbBase + EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH;\r
926\r
927 //\r
928 // Put FTW Spare area after FTW Working area\r
929 //\r
930 gHob->NvFtwSpare.FvbInfo.Entries[0].Base = \r
931 (EFI_PHYSICAL_ADDRESS)((UINTN) FtwFvbBase + EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH + NV_FTW_WORKING_SIZE);\r
932 \r
933 return (VOID *)(UINTN)StorageFvbBase;\r
934}\r
935\r
936VOID\r
937PrepareHobPhit (\r
938 VOID *MemoryTop,\r
939 VOID *FreeMemoryTop\r
940 )\r
941{\r
942 gHob->Phit.EfiMemoryTop = (EFI_PHYSICAL_ADDRESS)(UINTN)MemoryTop;\r
943 gHob->Phit.EfiMemoryBottom = gHob->Phit.EfiMemoryTop - CONSUMED_MEMORY;\r
944 gHob->Phit.EfiFreeMemoryTop = (EFI_PHYSICAL_ADDRESS)(UINTN)FreeMemoryTop;\r
945 gHob->Phit.EfiFreeMemoryBottom = gHob->Phit.EfiMemoryBottom + sizeof(HOB_TEMPLATE);\r
946\r
947 CopyMem ((VOID *)(UINTN)gHob->Phit.EfiMemoryBottom, gHob, sizeof(HOB_TEMPLATE));\r
948 gHob = (HOB_TEMPLATE *)(UINTN)gHob->Phit.EfiMemoryBottom;\r
949\r
950 gHob->Phit.EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS)(UINTN)&gHob->EndOfHobList;\r
951}\r
952\r
953VOID\r
954PrepareHobCpu (\r
955 VOID\r
956 )\r
957{\r
4a1db20f 958 UINT32 CpuidEax;\r
ca162103 959\r
960 //\r
961 // Create a CPU hand-off information\r
962 //\r
4a1db20f 963 gHob->Cpu.SizeOfMemorySpace = 36;\r
ca162103 964\r
4a1db20f 965 AsmCpuid (EFI_CPUID_EXTENDED_FUNCTION, &CpuidEax, NULL, NULL, NULL);\r
966 if (CpuidEax >= CPUID_EXTENDED_ADD_SIZE) {\r
967 AsmCpuid (CPUID_EXTENDED_ADD_SIZE, &CpuidEax, NULL, NULL, NULL);\r
968 gHob->Cpu.SizeOfMemorySpace = (UINT8)(CpuidEax & 0xFF);\r
ca162103 969 }\r
ca162103 970}\r
971\r
972VOID\r
973CompleteHobGeneration (\r
974 VOID\r
975 )\r
976{\r
977 gHob->MemoryAllocation.AllocDescriptor.MemoryBaseAddress = gHob->Phit.EfiFreeMemoryTop;\r
978 //\r
979 // Reserve all the memory under Stack above FreeMemoryTop as allocated\r
980 //\r
981 gHob->MemoryAllocation.AllocDescriptor.MemoryLength = gHob->Stack.AllocDescriptor.MemoryBaseAddress - gHob->Phit.EfiFreeMemoryTop;\r
982\r
983 //\r
984 // adjust Above1MB ResourceLength\r
985 //\r
986 if (gHob->MemoryAbove1MB.PhysicalStart + gHob->MemoryAbove1MB.ResourceLength > gHob->Phit.EfiMemoryTop) {\r
987 gHob->MemoryAbove1MB.ResourceLength = gHob->Phit.EfiMemoryTop - gHob->MemoryAbove1MB.PhysicalStart;\r
988 }\r
989}\r
990\r