From 55cdb67acb3df840c1d3bbf0e0e78fba27dcfbe3 Mon Sep 17 00:00:00 2001 From: jljusten Date: Wed, 13 Oct 2010 07:07:29 +0000 Subject: 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 --- OvmfPkg/PlatformPei/MemDetect.c | 6 +++--- OvmfPkg/PlatformPei/Platform.c | 23 +++++++++++++++-------- OvmfPkg/PlatformPei/Platform.h | 2 +- 3 files changed, 19 insertions(+), 12 deletions(-) (limited to 'OvmfPkg') diff --git a/OvmfPkg/PlatformPei/MemDetect.c b/OvmfPkg/PlatformPei/MemDetect.c index 5e09cc9375..9a82cc79d0 100644 --- a/OvmfPkg/PlatformPei/MemDetect.c +++ b/OvmfPkg/PlatformPei/MemDetect.c @@ -54,7 +54,7 @@ GetSystemMemorySize ( Cmos0x34 = (UINT8) CmosRead8 (0x34); 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. **/ -EFI_STATUS +EFI_PHYSICAL_ADDRESS MemDetect ( ) { @@ -103,6 +103,6 @@ MemDetect ( AddMemoryRangeHob (BASE_1MB, MemoryBase); AddMemoryRangeHob (0, BASE_512KB + BASE_128KB); - return EFI_SUCCESS; + return MemoryBase + MemorySize; } diff --git a/OvmfPkg/PlatformPei/Platform.c b/OvmfPkg/PlatformPei/Platform.c index d35a1fbb5c..c379f88b4d 100644 --- a/OvmfPkg/PlatformPei/Platform.c +++ b/OvmfPkg/PlatformPei/Platform.c @@ -35,7 +35,7 @@ EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformation[] = { { EfiACPIMemoryNVS, 0x004 }, { EfiACPIReclaimMemory, 0x008 }, - { EfiReservedMemoryType, 0x004 }, + { EfiReservedMemoryType, 0x004 }, { EfiRuntimeServicesData, 0x024 }, { EfiRuntimeServicesCode, 0x030 }, { EfiBootServicesCode, 0x180 }, @@ -104,6 +104,7 @@ AddMemoryRangeHob ( VOID MemMapInitialization ( + EFI_PHYSICAL_ADDRESS TopOfMemory ) { // @@ -129,22 +130,26 @@ MemMapInitialization ( // // 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 // - AddIoMemoryBaseSizeHob (0xFEC80000, 0x80000); + AddIoMemoryBaseSizeHob (0xFEC80000, SIZE_512KB); // // I/O APIC range // - AddIoMemoryBaseSizeHob (0xFEC00000, 0x80000); + AddIoMemoryBaseSizeHob (0xFEC00000, SIZE_512KB); // // Video memory + Legacy BIOS region // - AddIoMemoryRangeHob (0x0A0000, 0x100000); + AddIoMemoryRangeHob (0x0A0000, BASE_1MB); } @@ -155,7 +160,7 @@ MiscInitialization ( // // 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. @@ -206,15 +211,17 @@ InitializePlatform ( IN CONST EFI_PEI_SERVICES **PeiServices ) { + EFI_PHYSICAL_ADDRESS TopOfMemory; + DEBUG ((EFI_D_ERROR, "Platform PEIM Loaded\n")); - MemDetect (); + TopOfMemory = MemDetect (); ReserveEmuVariableNvStore (); PeiFvInitialization (); - MemMapInitialization (); + MemMapInitialization (TopOfMemory); MiscInitialization (); diff --git a/OvmfPkg/PlatformPei/Platform.h b/OvmfPkg/PlatformPei/Platform.h index 53090ac2c7..0829f89d3b 100644 --- a/OvmfPkg/PlatformPei/Platform.h +++ b/OvmfPkg/PlatformPei/Platform.h @@ -39,7 +39,7 @@ AddMemoryRangeHob ( EFI_PHYSICAL_ADDRESS MemoryLimit ); -EFI_STATUS +EFI_PHYSICAL_ADDRESS MemDetect ( VOID ); -- cgit v1.2.3