mXenInfo.VersionMajor = (UINT16)(XenVersion >> 16);\r
mXenInfo.VersionMinor = (UINT16)(XenVersion & 0xFFFF);\r
\r
- /* TBD: Locate hvm_info and reserve it away. */\r
- mXenInfo.HvmInfo = NULL;\r
-\r
BuildGuidDataHob (\r
&gEfiXenInfoGuid,\r
&mXenInfo,\r
\r
EFI_XEN_INFO mXenInfo;\r
\r
+//\r
+// Location of the firmware info struct setup by hvmloader.\r
+// Only the E820 table is used by OVMF.\r
+//\r
+EFI_XEN_OVMF_INFO *mXenHvmloaderInfo;\r
+\r
/**\r
Returns E820 map provided by Xen\r
\r
UINT32 TransferReg;\r
UINT32 TransferPages;\r
UINT32 XenVersion;\r
+ EFI_XEN_OVMF_INFO *Info;\r
+ CHAR8 Sig[sizeof (Info->Signature) + 1];\r
\r
AsmCpuid (XenLeaf + 2, &TransferPages, &TransferReg, NULL, NULL);\r
mXenInfo.HyperPages = AllocatePages (TransferPages);\r
mXenInfo.VersionMajor = (UINT16)(XenVersion >> 16);\r
mXenInfo.VersionMinor = (UINT16)(XenVersion & 0xFFFF);\r
\r
- /* TBD: Locate hvm_info and reserve it away. */\r
- mXenInfo.HvmInfo = NULL;\r
+ //\r
+ // Check if there are information left by hvmloader\r
+ //\r
+\r
+ Info = (EFI_XEN_OVMF_INFO *)(UINTN) OVMF_INFO_PHYSICAL_ADDRESS;\r
+ //\r
+ // Copy the signature, and make it null-terminated.\r
+ //\r
+ AsciiStrnCpyS (Sig, sizeof (Sig), (CHAR8 *) &Info->Signature,\r
+ sizeof (Info->Signature));\r
+ if (AsciiStrCmp (Sig, "XenHVMOVMF") == 0) {\r
+ mXenHvmloaderInfo = Info;\r
+ } else {\r
+ mXenHvmloaderInfo = NULL;\r
+ }\r
\r
BuildGuidDataHob (\r
&gEfiXenInfoGuid,\r