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