}\r
\r
\r
+STATIC\r
+VOID\r
+QemuInitializeRamBelow1gb (\r
+ VOID\r
+ )\r
+{\r
+ if (FeaturePcdGet (PcdSmmSmramRequire) && mQ35SmramAtDefaultSmbase) {\r
+ AddMemoryRangeHob (0, SMM_DEFAULT_SMBASE);\r
+ AddReservedMemoryBaseSizeHob (SMM_DEFAULT_SMBASE, MCH_DEFAULT_SMBASE_SIZE,\r
+ TRUE /* Cacheable */);\r
+ STATIC_ASSERT (\r
+ SMM_DEFAULT_SMBASE + MCH_DEFAULT_SMBASE_SIZE < BASE_512KB + BASE_128KB,\r
+ "end of SMRAM at default SMBASE ends at, or exceeds, 640KB"\r
+ );\r
+ AddMemoryRangeHob (SMM_DEFAULT_SMBASE + MCH_DEFAULT_SMBASE_SIZE,\r
+ BASE_512KB + BASE_128KB);\r
+ } else {\r
+ AddMemoryRangeHob (0, BASE_512KB + BASE_128KB);\r
+ }\r
+}\r
+\r
+\r
/**\r
Peform Memory Detection for QEMU / KVM\r
\r
// allocation HOBs, and to honor preexistent memory allocation HOBs when\r
// looking for an area to borrow.\r
//\r
- AddMemoryRangeHob (0, BASE_512KB + BASE_128KB);\r
+ QemuInitializeRamBelow1gb ();\r
} else {\r
//\r
// Create memory HOBs\r
//\r
- AddMemoryRangeHob (0, BASE_512KB + BASE_128KB);\r
+ QemuInitializeRamBelow1gb ();\r
\r
if (FeaturePcdGet (PcdSmmSmramRequire)) {\r
UINT32 TsegSize;\r
TsegSize,\r
EfiReservedMemoryType\r
);\r
+ //\r
+ // Similarly, allocate away the (already reserved) SMRAM at the default\r
+ // SMBASE, if it exists.\r
+ //\r
+ if (mQ35SmramAtDefaultSmbase) {\r
+ BuildMemoryAllocationHob (\r
+ SMM_DEFAULT_SMBASE,\r
+ MCH_DEFAULT_SMBASE_SIZE,\r
+ EfiReservedMemoryType\r
+ );\r
+ }\r
}\r
}\r
}\r