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