#include <Library/MtrrLib.h>\r
#include <IndustryStandard/Xen/arch-x86/hvm/start_info.h>\r
#include <Library/XenHypercallLib.h>\r
+#include <IndustryStandard/Xen/memory.h>\r
\r
#include "Platform.h"\r
#include "Xen.h"\r
// Only the E820 table is used by OVMF.\r
//\r
EFI_XEN_OVMF_INFO *mXenHvmloaderInfo;\r
+STATIC EFI_E820_ENTRY64 mE820Entries[128];\r
+STATIC UINT32 mE820EntriesCount;\r
\r
/**\r
Returns E820 map provided by Xen\r
UINT32 *Count\r
)\r
{\r
+ INTN ReturnCode;\r
+ xen_memory_map_t Parameters;\r
+ UINTN LoopIndex;\r
+ UINTN Index;\r
+ EFI_E820_ENTRY64 TmpEntry;\r
+\r
//\r
// Get E820 produced by hvmloader\r
//\r
return EFI_SUCCESS;\r
}\r
\r
- return EFI_NOT_FOUND;\r
+ //\r
+ // Otherwise, get the E820 table from the Xen hypervisor\r
+ //\r
+\r
+ if (mE820EntriesCount > 0) {\r
+ *Entries = mE820Entries;\r
+ *Count = mE820EntriesCount;\r
+ return EFI_SUCCESS;\r
+ }\r
+\r
+ Parameters.nr_entries = 128;\r
+ set_xen_guest_handle (Parameters.buffer, mE820Entries);\r
+\r
+ // Returns a errno\r
+ ReturnCode = XenHypercallMemoryOp (XENMEM_memory_map, &Parameters);\r
+ ASSERT (ReturnCode == 0);\r
+\r
+ mE820EntriesCount = Parameters.nr_entries;\r
+\r
+ //\r
+ // Sort E820 entries\r
+ //\r
+ for (LoopIndex = 1; LoopIndex < mE820EntriesCount; LoopIndex++) {\r
+ for (Index = LoopIndex; Index < mE820EntriesCount; Index++) {\r
+ if (mE820Entries[Index - 1].BaseAddr > mE820Entries[Index].BaseAddr) {\r
+ TmpEntry = mE820Entries[Index];\r
+ mE820Entries[Index] = mE820Entries[Index - 1];\r
+ mE820Entries[Index - 1] = TmpEntry;\r
+ }\r
+ }\r
+ }\r
+\r
+ *Count = mE820EntriesCount;\r
+ *Entries = mE820Entries;\r
+\r
+ return EFI_SUCCESS;\r
}\r
\r
/**\r