\r
STATIC\r
UINTN\r
-GetSystemMemorySize (\r
+GetSystemMemorySizeBelow4gb (\r
)\r
{\r
UINT8 Cmos0x34;\r
}\r
\r
\r
+STATIC\r
+UINT64\r
+GetSystemMemorySizeAbove4gb (\r
+ )\r
+{\r
+ UINT32 Size;\r
+ UINTN CmosIndex;\r
+\r
+ //\r
+ // CMOS 0x5b-0x5d specifies the system memory above 4GB MB.\r
+ // * CMOS(0x5d) is the most significant size byte\r
+ // * CMOS(0x5c) is the middle size byte\r
+ // * CMOS(0x5b) is the least significant size byte\r
+ // * The size is specified in 64kb chunks\r
+ //\r
+\r
+ Size = 0;\r
+ for (CmosIndex = 0x5d; CmosIndex >= 0x5b; CmosIndex--) {\r
+ Size = (UINT32) (Size << 8) + (UINT32) CmosRead8 (CmosIndex);\r
+ }\r
+\r
+ return LShiftU64 (Size, 16);\r
+}\r
+\r
+\r
/**\r
Peform Memory Detection\r
\r
EFI_STATUS Status;\r
EFI_PHYSICAL_ADDRESS MemoryBase;\r
UINT64 MemorySize;\r
- UINT64 TotalMemorySize;\r
+ UINT64 LowerMemorySize;\r
+ UINT64 UpperMemorySize;\r
\r
DEBUG ((EFI_D_ERROR, "MemDetect called\n"));\r
\r
//\r
// Determine total memory size available\r
//\r
- TotalMemorySize = (UINT64)GetSystemMemorySize ();\r
+ LowerMemorySize = GetSystemMemorySizeBelow4gb ();\r
+ UpperMemorySize = GetSystemMemorySizeAbove4gb ();\r
\r
//\r
// Determine the range of memory to use during PEI\r
//\r
MemoryBase = PcdGet32 (PcdOvmfMemFvBase) + PcdGet32 (PcdOvmfMemFvSize);\r
- MemorySize = TotalMemorySize - MemoryBase;\r
- if (MemorySize > SIZE_16MB) {\r
- MemoryBase = TotalMemorySize - SIZE_16MB;\r
- MemorySize = SIZE_16MB;\r
+ MemorySize = LowerMemorySize - MemoryBase;\r
+ if (MemorySize > SIZE_64MB) {\r
+ MemoryBase = LowerMemorySize - SIZE_64MB;\r
+ MemorySize = SIZE_64MB;\r
}\r
\r
//\r
AddMemoryRangeHob (BASE_1MB, MemoryBase);\r
AddMemoryRangeHob (0, BASE_512KB + BASE_128KB);\r
\r
+ if (UpperMemorySize != 0) {\r
+ AddUntestedMemoryBaseSizeHob (BASE_4GB, UpperMemorySize);\r
+ }\r
+\r
return MemoryBase + MemorySize;\r
}\r
\r
AddMemoryBaseSizeHob (MemoryBase, (UINT64)(MemoryLimit - MemoryBase));\r
}\r
\r
+\r
+VOID\r
+AddUntestedMemoryBaseSizeHob (\r
+ EFI_PHYSICAL_ADDRESS MemoryBase,\r
+ UINT64 MemorySize\r
+ )\r
+{\r
+ BuildResourceDescriptorHob (\r
+ EFI_RESOURCE_SYSTEM_MEMORY,\r
+ EFI_RESOURCE_ATTRIBUTE_PRESENT |\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
+ MemoryBase,\r
+ MemorySize\r
+ );\r
+}\r
+\r
+\r
+VOID\r
+AddUntestedMemoryRangeHob (\r
+ EFI_PHYSICAL_ADDRESS MemoryBase,\r
+ EFI_PHYSICAL_ADDRESS MemoryLimit\r
+ )\r
+{\r
+ AddUntestedMemoryBaseSizeHob (MemoryBase, (UINT64)(MemoryLimit - MemoryBase));\r
+}\r
+\r
+\r
VOID\r
MemMapInitialization (\r
EFI_PHYSICAL_ADDRESS TopOfMemory\r