[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC 06/14] OvmfPkg/XenPlatformPei: Add xen PVH specific code
- learn about memory size from the E820 - ignore error if host bridge devid is 0xffff, PVH does not have PCI and reading from unexisting device return -1. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx> --- OvmfPkg/XenPlatformPei/MemDetect.c | 71 ++++++++++++++++++++++++++++++++++++++ OvmfPkg/XenPlatformPei/Platform.c | 5 +++ OvmfPkg/XenPlatformPei/Platform.h | 10 ++++++ 3 files changed, 86 insertions(+) diff --git a/OvmfPkg/XenPlatformPei/MemDetect.c b/OvmfPkg/XenPlatformPei/MemDetect.c index 4ecdf5e..0d80775 100644 --- a/OvmfPkg/XenPlatformPei/MemDetect.c +++ b/OvmfPkg/XenPlatformPei/MemDetect.c @@ -42,6 +42,70 @@ UINT8 mPhysMemAddressWidth; STATIC UINT32 mS3AcpiReservedMemoryBase; STATIC UINT32 mS3AcpiReservedMemorySize; +STATIC UINT32 mXenLowerMemorySize = 0; +STATIC UINT64 mXenHighMemorySize = 0; + +VOID +XenReadMemorySizes ( + VOID + ) +{ + EFI_E820_ENTRY64 *E820Map; + UINT32 E820EntriesCount; + EFI_STATUS Status; + + Status = XenGetE820Map (&E820Map, &E820EntriesCount); + ASSERT_EFI_ERROR (Status); + + mXenLowerMemorySize = 0; + mXenHighMemorySize = 0; + + if (E820EntriesCount > 0) { + EFI_E820_ENTRY64 *Entry; + UINT32 Loop; + + for (Loop = 0; Loop < E820EntriesCount; Loop++) { + Entry = E820Map + Loop; + + // + // Only care about RAM + // + if (Entry->Type != EfiAcpiAddressRangeMemory) { + continue; + } + + if ((Entry->BaseAddr + Entry->Length) <= SIZE_16MB) { + continue; + } + + if (Entry->BaseAddr < SIZE_16MB) { + UINT64 bottom = Entry->BaseAddr; + UINT64 size = Entry->Length; + size -= SIZE_16MB - bottom; + bottom = SIZE_16MB; + mXenLowerMemorySize += size; + continue; + } + if (Entry->BaseAddr <= SIZE_4GB) { + UINT64 size = Entry->Length; + mXenLowerMemorySize += size; + continue; + } + + if (Entry->BaseAddr == SIZE_4GB) { + mXenHighMemorySize = Entry->Length; + continue; + } + + DEBUG ((EFI_D_INFO, "%a: ignored XenE820 entry (0x%llx, 0x%llx)\n", + __FUNCTION__, + Entry->BaseAddr, + Entry->Length)); + } + mXenLowerMemorySize += SIZE_16MB; + } +} + UINT32 GetSystemMemorySizeBelow4gb ( VOID @@ -50,6 +114,9 @@ GetSystemMemorySizeBelow4gb ( UINT8 Cmos0x34; UINT8 Cmos0x35; + if (mXen && mXenLowerMemorySize) + return mXenLowerMemorySize; + // // CMOS 0x34/0x35 specifies the system memory above 16 MB. // * CMOS(0x35) is the high byte @@ -74,6 +141,10 @@ GetSystemMemorySizeAbove4gb ( UINT32 Size; UINTN CmosIndex; + // if lower memory is specified that way, return also high memory + if (mXen && mXenLowerMemorySize) + return mXenHighMemorySize; + // // CMOS 0x5b-0x5d specifies the system memory above 4GB MB. // * CMOS(0x5d) is the most significant size byte diff --git a/OvmfPkg/XenPlatformPei/Platform.c b/OvmfPkg/XenPlatformPei/Platform.c index bf78878..9fc713c 100644 --- a/OvmfPkg/XenPlatformPei/Platform.c +++ b/OvmfPkg/XenPlatformPei/Platform.c @@ -362,6 +362,10 @@ MiscInitialization ( AcpiCtlReg = POWER_MGMT_REGISTER_Q35 (ICH9_ACPI_CNTL); AcpiEnBit = ICH9_ACPI_CNTL_ACPI_EN; break; + case 0xffff: + // xen PVH, ignore + PcdStatus = PcdSet16S (PcdOvmfHostBridgePciDevId, mHostBridgeDevId); + return; default: DEBUG ((EFI_D_ERROR, "%a: Unknown Host Bridge Device ID: 0x%04x\n", __FUNCTION__, mHostBridgeDevId)); @@ -503,6 +507,7 @@ InitializeXenPlatform ( DebugDumpCmos (); XenDetect (); + XenReadMemorySizes (); BootModeInitialization (); AddressWidthInitialization (); diff --git a/OvmfPkg/XenPlatformPei/Platform.h b/OvmfPkg/XenPlatformPei/Platform.h index eda765b..2948853 100644 --- a/OvmfPkg/XenPlatformPei/Platform.h +++ b/OvmfPkg/XenPlatformPei/Platform.h @@ -101,4 +101,14 @@ extern BOOLEAN mS3Supported; extern UINT8 mPhysMemAddressWidth; +EFI_STATUS +XenGetE820Map ( + EFI_E820_ENTRY64 **Entries, + UINT32 *Count + ); +VOID +XenReadMemorySizes ( + VOID + ); + #endif // _PLATFORM_PEI_H_INCLUDED_ -- Anthony PERARD _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |