OVMF: Support greater than 2GB of memory

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10928 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
jljusten 2010-10-13 07:07:29 +00:00
parent 3d131d1a20
commit 55cdb67acb
3 changed files with 19 additions and 12 deletions

View File

@ -54,7 +54,7 @@ GetSystemMemorySize (
Cmos0x34 = (UINT8) CmosRead8 (0x34); Cmos0x34 = (UINT8) CmosRead8 (0x34);
Cmos0x35 = (UINT8) CmosRead8 (0x35); Cmos0x35 = (UINT8) CmosRead8 (0x35);
return ((((Cmos0x35 << 8) + Cmos0x34) << 16) + SIZE_16MB); return (((UINTN)((Cmos0x35 << 8) + Cmos0x34) << 16) + SIZE_16MB);
} }
@ -64,7 +64,7 @@ GetSystemMemorySize (
@return EFI_SUCCESS The PEIM initialized successfully. @return EFI_SUCCESS The PEIM initialized successfully.
**/ **/
EFI_STATUS EFI_PHYSICAL_ADDRESS
MemDetect ( MemDetect (
) )
{ {
@ -103,6 +103,6 @@ MemDetect (
AddMemoryRangeHob (BASE_1MB, MemoryBase); AddMemoryRangeHob (BASE_1MB, MemoryBase);
AddMemoryRangeHob (0, BASE_512KB + BASE_128KB); AddMemoryRangeHob (0, BASE_512KB + BASE_128KB);
return EFI_SUCCESS; return MemoryBase + MemorySize;
} }

View File

@ -35,7 +35,7 @@
EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformation[] = { EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformation[] = {
{ EfiACPIMemoryNVS, 0x004 }, { EfiACPIMemoryNVS, 0x004 },
{ EfiACPIReclaimMemory, 0x008 }, { EfiACPIReclaimMemory, 0x008 },
{ EfiReservedMemoryType, 0x004 }, { EfiReservedMemoryType, 0x004 },
{ EfiRuntimeServicesData, 0x024 }, { EfiRuntimeServicesData, 0x024 },
{ EfiRuntimeServicesCode, 0x030 }, { EfiRuntimeServicesCode, 0x030 },
{ EfiBootServicesCode, 0x180 }, { EfiBootServicesCode, 0x180 },
@ -104,6 +104,7 @@ AddMemoryRangeHob (
VOID VOID
MemMapInitialization ( MemMapInitialization (
EFI_PHYSICAL_ADDRESS TopOfMemory
) )
{ {
// //
@ -129,22 +130,26 @@ MemMapInitialization (
// //
// Add PCI MMIO space available to PCI resource allocations // Add PCI MMIO space available to PCI resource allocations
// //
AddIoMemoryBaseSizeHob (0x80000000, 0xFEC00000 - 0x80000000); if (TopOfMemory < BASE_2GB) {
AddIoMemoryBaseSizeHob (BASE_2GB, 0xFEC00000 - BASE_2GB);
} else {
AddIoMemoryBaseSizeHob (TopOfMemory, 0xFEC00000 - TopOfMemory);
}
// //
// Local APIC range // Local APIC range
// //
AddIoMemoryBaseSizeHob (0xFEC80000, 0x80000); AddIoMemoryBaseSizeHob (0xFEC80000, SIZE_512KB);
// //
// I/O APIC range // I/O APIC range
// //
AddIoMemoryBaseSizeHob (0xFEC00000, 0x80000); AddIoMemoryBaseSizeHob (0xFEC00000, SIZE_512KB);
// //
// Video memory + Legacy BIOS region // Video memory + Legacy BIOS region
// //
AddIoMemoryRangeHob (0x0A0000, 0x100000); AddIoMemoryRangeHob (0x0A0000, BASE_1MB);
} }
@ -155,7 +160,7 @@ MiscInitialization (
// //
// Disable A20 Mask // Disable A20 Mask
// //
IoWrite8 (0x92, (UINT8) (IoRead8 (0x92) | 0x02)); IoOr8 (0x92, BIT1);
// //
// Build the CPU hob with 36-bit addressing and 16-bits of IO space. // Build the CPU hob with 36-bit addressing and 16-bits of IO space.
@ -206,15 +211,17 @@ InitializePlatform (
IN CONST EFI_PEI_SERVICES **PeiServices IN CONST EFI_PEI_SERVICES **PeiServices
) )
{ {
EFI_PHYSICAL_ADDRESS TopOfMemory;
DEBUG ((EFI_D_ERROR, "Platform PEIM Loaded\n")); DEBUG ((EFI_D_ERROR, "Platform PEIM Loaded\n"));
MemDetect (); TopOfMemory = MemDetect ();
ReserveEmuVariableNvStore (); ReserveEmuVariableNvStore ();
PeiFvInitialization (); PeiFvInitialization ();
MemMapInitialization (); MemMapInitialization (TopOfMemory);
MiscInitialization (); MiscInitialization ();

View File

@ -39,7 +39,7 @@ AddMemoryRangeHob (
EFI_PHYSICAL_ADDRESS MemoryLimit EFI_PHYSICAL_ADDRESS MemoryLimit
); );
EFI_STATUS EFI_PHYSICAL_ADDRESS
MemDetect ( MemDetect (
VOID VOID
); );