/** @file\r
\r
-Copyright (c) 2006 - 2007, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
+Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials \r
are licensed and made available under the terms and conditions of the BSD License \r
which accompanies this distribution. The full text of the license may be found at \r
http://opensource.org/licenses/bsd-license.php \r
#include "FlashLayout.h"\r
#include "Debug.h"\r
\r
-#define EFI_DXE_FILE_GUID \\r
- { 0xb1644c1a, 0xc16a, 0x4c5b, {0x88, 0xde, 0xea, 0xfb, 0xa9, 0x7e, 0x74, 0xd8 }}\r
-\r
-#define CPUID_EXTENDED_ADD_SIZE 0x80000008\r
+#define EFI_CPUID_EXTENDED_FUNCTION 0x80000000\r
+#define CPUID_EXTENDED_ADD_SIZE 0x80000008\r
+#define EBDA_VALUE_ADDRESS 0x40E\r
\r
HOB_TEMPLATE gHobTemplate = {\r
{ // Phit\r
0, 0, 0, 0 // UINT8 Reserved[4]; \r
},\r
},\r
- EFI_DXE_FILE_GUID,\r
+ DXE_CORE_FILE_NAME_GUID,\r
0x0 // EFI_PHYSICAL_ADDRESS of EntryPoint;\r
},\r
+ { // MemoryDxeCore\r
+ {\r
+ EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, // HobType\r
+ sizeof (EFI_HOB_RESOURCE_DESCRIPTOR), // HobLength\r
+ 0 // Reserved\r
+ },\r
+ {\r
+ 0 // Owner Guid\r
+ },\r
+ EFI_RESOURCE_SYSTEM_MEMORY, // ResourceType\r
+ (EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
+// EFI_RESOURCE_ATTRIBUTE_TESTED | // Do not mark as TESTED, or DxeCore will find it and use it before check Allocation\r
+ EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
+ EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE | \r
+ EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE | \r
+ EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE | \r
+ EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE), \r
+ 0x0, // PhysicalStart\r
+ 0 // ResourceLength\r
+ },\r
{ // Memory Map Hints to reduce fragmentation in the memory map\r
{\r
{\r
},\r
EFI_STATUS_CODE_RUNTIME_PROTOCOL_GUID\r
},\r
- NULL\r
+ 0\r
},\r
{ // EFILDR Memory Descriptor\r
{\r
sizeof (MEMORY_DESC_HOB), // Hob size\r
0 // reserved\r
},\r
- EFI_LDR_MEMORY_DESCRIPTOR_GUID\r
+ LDR_MEMORY_DESCRIPTOR_GUID\r
},\r
0,\r
NULL\r
0\r
}\r
},\r
+ { // NV Ftw FV Resource\r
+ {\r
+ EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, // HobType\r
+ sizeof (EFI_HOB_RESOURCE_DESCRIPTOR), // HobLength\r
+ 0 // Reserved\r
+ },\r
+ {\r
+ 0 // Owner Guid\r
+ },\r
+ EFI_RESOURCE_FIRMWARE_DEVICE, // ResourceType\r
+ (EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
+ EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
+ EFI_RESOURCE_ATTRIBUTE_TESTED |\r
+ EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE), // ResourceAttribute\r
+ 0, // PhysicalStart (Fixed later)\r
+ NV_FTW_FVB_SIZE // ResourceLength\r
+ }, \r
{ // FVB holding FTW spaces including Working & Spare space\r
{\r
{\r
--*/\r
{\r
UINTN Index;\r
+ UINT64 EbdaAddress;\r
\r
//\r
// Prepare Low Memory\r
// 0x18 pages is 72 KB.\r
//\r
- gHob->MemoryFreeUnder1MB.ResourceLength = EFI_MEMORY_BELOW_1MB_END - EFI_MEMORY_BELOW_1MB_START;\r
+ EbdaAddress = ((UINT64)(*(UINT16 *)(UINTN)(EBDA_VALUE_ADDRESS))) << 4;\r
+ if (EbdaAddress < 0x9A000 || EbdaAddress > EFI_MEMORY_BELOW_1MB_END) {\r
+ //\r
+ // EBDA should not go below 0x9A000 in any implementation,\r
+ // so add check here to make sure EBDA_VALUE_ADDRESS has a valid value.\r
+ //\r
+ EbdaAddress = EFI_MEMORY_BELOW_1MB_END;\r
+ }\r
+ gHob->MemoryFreeUnder1MB.ResourceLength = EbdaAddress - EFI_MEMORY_BELOW_1MB_START;\r
gHob->MemoryFreeUnder1MB.PhysicalStart = EFI_MEMORY_BELOW_1MB_START;\r
\r
//\r
\r
//\r
// Calculate BFV location at top of the memory region.\r
- // This is like a RAM Disk. Align to page boundry.\r
+ // This is like a RAM Disk. Align to page boundary.\r
//\r
//BfvLengthPageSize = EFI_PAGES_TO_SIZE (EFI_SIZE_TO_PAGES (BfvLength));\r
\r
UINT64 DxeCoreLength\r
)\r
{\r
- gHob->DxeCore.MemoryAllocationHeader.MemoryBaseAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)DxeCoreImageBase;\r
+ gHob->DxeCore.MemoryAllocationHeader.MemoryBaseAddress = DxeCoreImageBase;\r
gHob->DxeCore.MemoryAllocationHeader.MemoryLength = DxeCoreLength;\r
gHob->DxeCore.EntryPoint = (EFI_PHYSICAL_ADDRESS)(UINTN)DxeCoreEntryPoint;\r
+\r
+\r
+ gHob->MemoryDxeCore.PhysicalStart = DxeCoreImageBase;\r
+ gHob->MemoryDxeCore.ResourceLength = DxeCoreLength; \r
}\r
\r
VOID *\r
// Create the FVB holding FTW spaces\r
//\r
FtwFvbBase = (EFI_PHYSICAL_ADDRESS)((UINTN) StorageFvbBase + NV_STORAGE_FVB_SIZE);\r
- gHob->NvFtwFvb.FvbInfo.Entries[0].Base = FtwFvbBase;\r
+ gHob->NvFtwFvResource.PhysicalStart =\r
+ gHob->NvFtwFvb.FvbInfo.Entries[0].Base = FtwFvbBase;\r
//\r
// Put FTW Working in front\r
//\r
VOID\r
)\r
{\r
- EFI_CPUID_REGISTER Reg;\r
- UINT8 CpuMemoryAddrBitNumber;\r
+ UINT32 CpuidEax;\r
\r
//\r
// Create a CPU hand-off information\r
//\r
- CpuMemoryAddrBitNumber = 36;\r
- AsmCpuid (EFI_CPUID_EXTENDED_FUNCTION, &Reg.RegEax, &Reg.RegEbx, &Reg.RegEcx, &Reg.RegEdx);\r
+ gHob->Cpu.SizeOfMemorySpace = 36;\r
\r
- if (Reg.RegEax >= CPUID_EXTENDED_ADD_SIZE) {\r
- AsmCpuid (CPUID_EXTENDED_ADD_SIZE, &Reg.RegEax, &Reg.RegEbx, &Reg.RegEcx, &Reg.RegEdx);\r
- CpuMemoryAddrBitNumber = (UINT8)(UINTN)(Reg.RegEax & 0xFF);\r
+ AsmCpuid (EFI_CPUID_EXTENDED_FUNCTION, &CpuidEax, NULL, NULL, NULL);\r
+ if (CpuidEax >= CPUID_EXTENDED_ADD_SIZE) {\r
+ AsmCpuid (CPUID_EXTENDED_ADD_SIZE, &CpuidEax, NULL, NULL, NULL);\r
+ gHob->Cpu.SizeOfMemorySpace = (UINT8)(CpuidEax & 0xFF);\r
}\r
- \r
- gHob->Cpu.SizeOfMemorySpace = CpuMemoryAddrBitNumber;\r
}\r
\r
VOID\r