UINT64 MemorySize;\r
UINT64 LowerMemorySize;\r
\r
- LowerMemorySize = GetSystemMemorySizeBelow4gb ();\r
-\r
- //\r
- // Determine the range of memory to use during PEI\r
- //\r
- MemoryBase = PcdGet32 (PcdOvmfDxeMemFvBase) + PcdGet32 (PcdOvmfDxeMemFvSize);\r
- MemorySize = LowerMemorySize - MemoryBase;\r
- if (MemorySize > SIZE_64MB) {\r
- MemoryBase = LowerMemorySize - SIZE_64MB;\r
- MemorySize = SIZE_64MB;\r
+ if (mBootMode == BOOT_ON_S3_RESUME) {\r
+ MemoryBase = PcdGet32 (PcdS3AcpiReservedMemoryBase);\r
+ MemorySize = PcdGet32 (PcdS3AcpiReservedMemorySize);\r
+ } else {\r
+ LowerMemorySize = GetSystemMemorySizeBelow4gb ();\r
+\r
+ //\r
+ // Determine the range of memory to use during PEI\r
+ //\r
+ MemoryBase = PcdGet32 (PcdOvmfDxeMemFvBase) + PcdGet32 (PcdOvmfDxeMemFvSize);\r
+ MemorySize = LowerMemorySize - MemoryBase;\r
+ if (MemorySize > SIZE_64MB) {\r
+ MemoryBase = LowerMemorySize - SIZE_64MB;\r
+ MemorySize = SIZE_64MB;\r
+ }\r
}\r
\r
//\r
\r
\r
/**\r
- Peform Memory Detection\r
-\r
- @return Top of memory\r
+ Peform Memory Detection for QEMU / KVM\r
\r
**/\r
-EFI_PHYSICAL_ADDRESS\r
-MemDetect (\r
+STATIC\r
+VOID\r
+QemuInitializeRam (\r
+ VOID\r
)\r
{\r
UINT64 LowerMemorySize;\r
UINT64 UpperMemorySize;\r
\r
- DEBUG ((EFI_D_ERROR, "MemDetect called\n"));\r
+ DEBUG ((EFI_D_INFO, "%a called\n", __FUNCTION__));\r
\r
//\r
// Determine total memory size available\r
LowerMemorySize = GetSystemMemorySizeBelow4gb ();\r
UpperMemorySize = GetSystemMemorySizeAbove4gb ();\r
\r
- //\r
- // Create memory HOBs\r
- //\r
- AddMemoryRangeHob (BASE_1MB, LowerMemorySize);\r
- AddMemoryRangeHob (0, BASE_512KB + BASE_128KB);\r
+ if (mBootMode != BOOT_ON_S3_RESUME) {\r
+ //\r
+ // Create memory HOBs\r
+ //\r
+ AddMemoryRangeHob (BASE_1MB, LowerMemorySize);\r
+ AddMemoryRangeHob (0, BASE_512KB + BASE_128KB);\r
+ }\r
\r
MtrrSetMemoryAttribute (BASE_1MB, LowerMemorySize - BASE_1MB, CacheWriteBack);\r
\r
MtrrSetMemoryAttribute (0, BASE_512KB + BASE_128KB, CacheWriteBack);\r
\r
if (UpperMemorySize != 0) {\r
- AddUntestedMemoryBaseSizeHob (BASE_4GB, UpperMemorySize);\r
+ if (mBootMode != BOOT_ON_S3_RESUME) {\r
+ AddUntestedMemoryBaseSizeHob (BASE_4GB, UpperMemorySize);\r
+ }\r
\r
MtrrSetMemoryAttribute (BASE_4GB, UpperMemorySize, CacheWriteBack);\r
}\r
-\r
- return LowerMemorySize;\r
}\r
\r
+/**\r
+ Publish system RAM and reserve memory regions\r
+\r
+**/\r
+VOID\r
+InitializeRamRegions (\r
+ VOID\r
+ )\r
+{\r
+ if (!mXen) {\r
+ QemuInitializeRam ();\r
+ } else {\r
+ XenPublishRamRegions ();\r
+ }\r
+\r
+ if (mS3Supported && mBootMode != BOOT_ON_S3_RESUME) {\r
+ //\r
+ // This is the memory range that will be used for PEI on S3 resume\r
+ //\r
+ BuildMemoryAllocationHob (\r
+ (EFI_PHYSICAL_ADDRESS)(UINTN) PcdGet32 (PcdS3AcpiReservedMemoryBase),\r
+ (UINT64)(UINTN) PcdGet32 (PcdS3AcpiReservedMemorySize),\r
+ EfiACPIMemoryNVS\r
+ );\r
+\r
+ //\r
+ // Cover the initial RAM area used as stack and temporary PEI heap.\r
+ //\r
+ // This is reserved as ACPI NVS so it can be used on S3 resume.\r
+ //\r
+ BuildMemoryAllocationHob (\r
+ PcdGet32 (PcdOvmfSecPeiTempRamBase),\r
+ PcdGet32 (PcdOvmfSecPeiTempRamSize),\r
+ EfiACPIMemoryNVS\r
+ );\r
+ }\r
+}\r