[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v4 6/7] OvmfPkg: introduce XenMemMapInitialization
This function parses E820 map provided by Xen and arrange memory maps accordingly. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- OvmfPkg/PlatformPei/Platform.c | 70 ++++++++++++++++++++++++++++++++++++++++ OvmfPkg/PlatformPei/Platform.h | 8 +++++ OvmfPkg/PlatformPei/Xen.c | 26 +++++++++++++++ 3 files changed, 104 insertions(+) diff --git a/OvmfPkg/PlatformPei/Platform.c b/OvmfPkg/PlatformPei/Platform.c index 9b7828f..83acd8b 100644 --- a/OvmfPkg/PlatformPei/Platform.c +++ b/OvmfPkg/PlatformPei/Platform.c @@ -34,6 +34,10 @@ #include <Guid/MemoryTypeInformation.h> #include <Ppi/MasterBootMode.h> #include <IndustryStandard/Pci22.h> +#include <Guid/XenInfo.h> +#include <IndustryStandard/E820.h> +#include <Library/ResourcePublicationLib.h> +#include <Library/MtrrLib.h> #include "Platform.h" #include "Cmos.h" @@ -163,6 +167,72 @@ AddUntestedMemoryRangeHob ( AddUntestedMemoryBaseSizeHob (MemoryBase, (UINT64)(MemoryLimit - MemoryBase)); } +VOID +XenMemMapInitialization ( + VOID + ) +{ + EFI_E820_ENTRY64 *E820Map; + UINT32 E820EntriesCount; + EFI_STATUS Status; + + DEBUG ((EFI_D_ERROR, "Using memory map provided by Xen\n")); + + // + // Create Memory Type Information HOB + // + BuildGuidDataHob ( + &gEfiMemoryTypeInformationGuid, + mDefaultMemoryTypeInformation, + sizeof(mDefaultMemoryTypeInformation) + ); + + // + // Add PCI IO Port space available for PCI resource allocations. + // + BuildResourceDescriptorHob ( + EFI_RESOURCE_IO, + EFI_RESOURCE_ATTRIBUTE_PRESENT | + EFI_RESOURCE_ATTRIBUTE_INITIALIZED, + 0xC000, + 0x4000 + ); + + // + // Video memory + Legacy BIOS region + // + AddIoMemoryRangeHob (0x0A0000, BASE_1MB); + + // + // Parse RAM in E820 map + // + Status = XenGetE820Map(&E820Map, &E820EntriesCount); + + ASSERT_EFI_ERROR (Status); + + 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 >= BASE_4GB) { + AddUntestedMemoryBaseSizeHob (Entry->BaseAddr, Entry->Length); + } else { + AddMemoryBaseSizeHob (Entry->BaseAddr, Entry->Length); + } + + MtrrSetMemoryAttribute (Entry->BaseAddr, Entry->Length, CacheWriteBack); + } + } +} + VOID MemMapInitialization ( diff --git a/OvmfPkg/PlatformPei/Platform.h b/OvmfPkg/PlatformPei/Platform.h index 7344c61..5378b9d 100644 --- a/OvmfPkg/PlatformPei/Platform.h +++ b/OvmfPkg/PlatformPei/Platform.h @@ -15,6 +15,8 @@ #ifndef _PLATFORM_PEI_H_INCLUDED_ #define _PLATFORM_PEI_H_INCLUDED_ +#include <IndustryStandard/E820.h> + VOID AddIoMemoryBaseSizeHob ( EFI_PHYSICAL_ADDRESS MemoryBase, @@ -82,4 +84,10 @@ XenDetect ( VOID ); +EFI_STATUS +XenGetE820Map ( + EFI_E820_ENTRY64 **Entries, + UINT32 *Count + ); + #endif // _PLATFORM_PEI_H_INCLUDED_ diff --git a/OvmfPkg/PlatformPei/Xen.c b/OvmfPkg/PlatformPei/Xen.c index 054cc4a..88c0aec 100644 --- a/OvmfPkg/PlatformPei/Xen.c +++ b/OvmfPkg/PlatformPei/Xen.c @@ -29,9 +29,35 @@ #include <Guid/XenInfo.h> #include "Platform.h" +#include "Xen.h" EFI_XEN_INFO mXenInfo; +/** + Returns E820 map provided by Xen + + @param Entries Pointer to E820 map + @param Count Number of entries + + @return EFI_STATUS +**/ +EFI_STATUS +XenGetE820Map ( + EFI_E820_ENTRY64 **Entries, + UINT32 *Count + ) +{ + EFI_XEN_OVMF_INFO *Info = (EFI_XEN_OVMF_INFO *) OVMF_INFO_PHYSICAL_ADDRESS; + + if (AsciiStrCmp ((CHAR8 *) Info->Signature, "XenHVMOVMF")) { + return EFI_NOT_FOUND; + } + + *Entries = (EFI_E820_ENTRY64 *) Info->E820; + *Count = Info->E820EntriesCount; + + return EFI_SUCCESS; +} /** Connects to the Hypervisor. -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |