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