+++ /dev/null
-/**@file\r
- Xen Platform PEI support\r
-\r
- Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>\r
- Copyright (c) 2011, Andrei Warkentin <andreiw@motorola.com>\r
-\r
- This program and the accompanying materials\r
- are licensed and made available under the terms and conditions of the BSD License\r
- which accompanies this distribution. The full text of the license may be found at\r
- http://opensource.org/licenses/bsd-license.php\r
-\r
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-//\r
-// The package level header files this module uses\r
-//\r
-#include <PiPei.h>\r
-\r
-//\r
-// The Library classes this module consumes\r
-//\r
-#include <Library/DebugLib.h>\r
-#include <Library/HobLib.h>\r
-#include <Library/MemoryAllocationLib.h>\r
-#include <Library/PcdLib.h>\r
-#include <Guid/XenInfo.h>\r
-\r
-#include "Platform.h"\r
-#include "Xen.h"\r
-\r
-BOOLEAN mXen = FALSE;\r
-\r
-STATIC UINT32 mXenLeaf = 0;\r
-\r
-EFI_XEN_INFO mXenInfo;\r
-\r
-/**\r
- Returns E820 map provided by Xen\r
-\r
- @param Entries Pointer to E820 map\r
- @param Count Number of entries\r
-\r
- @return EFI_STATUS\r
-**/\r
-EFI_STATUS\r
-XenGetE820Map (\r
- EFI_E820_ENTRY64 **Entries,\r
- UINT32 *Count\r
- )\r
-{\r
- EFI_XEN_OVMF_INFO *Info =\r
- (EFI_XEN_OVMF_INFO *)(UINTN) OVMF_INFO_PHYSICAL_ADDRESS;\r
-\r
- if (AsciiStrCmp ((CHAR8 *) Info->Signature, "XenHVMOVMF")) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- ASSERT (Info->E820 < MAX_ADDRESS);\r
- *Entries = (EFI_E820_ENTRY64 *)(UINTN) Info->E820;\r
- *Count = Info->E820EntriesCount;\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Connects to the Hypervisor.\r
- \r
- @param XenLeaf CPUID index used to connect.\r
-\r
- @return EFI_STATUS\r
-\r
-**/\r
-EFI_STATUS\r
-XenConnect (\r
- UINT32 XenLeaf\r
- )\r
-{\r
- UINT32 Index;\r
- UINT32 TransferReg;\r
- UINT32 TransferPages;\r
- UINT32 XenVersion;\r
-\r
- AsmCpuid (XenLeaf + 2, &TransferPages, &TransferReg, NULL, NULL);\r
- mXenInfo.HyperPages = AllocatePages (TransferPages);\r
- if (!mXenInfo.HyperPages) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- for (Index = 0; Index < TransferPages; Index++) {\r
- AsmWriteMsr64 (TransferReg,\r
- (UINTN) mXenInfo.HyperPages +\r
- (Index << EFI_PAGE_SHIFT) + Index);\r
- }\r
-\r
- AsmCpuid (XenLeaf + 1, &XenVersion, NULL, NULL, NULL);\r
- DEBUG ((EFI_D_ERROR, "Detected Xen version %d.%d\n",\r
- XenVersion >> 16, XenVersion & 0xFFFF));\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
- BuildGuidDataHob (\r
- &gEfiXenInfoGuid,\r
- &mXenInfo,\r
- sizeof(mXenInfo)\r
- );\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Figures out if we are running inside Xen HVM.\r
-\r
- @retval TRUE Xen was detected\r
- @retval FALSE Xen was not detected\r
-\r
-**/\r
-BOOLEAN\r
-XenDetect (\r
- VOID\r
- )\r
-{\r
- UINT8 Signature[13];\r
-\r
- if (mXenLeaf != 0) {\r
- return TRUE;\r
- }\r
-\r
- Signature[12] = '\0';\r
- for (mXenLeaf = 0x40000000; mXenLeaf < 0x40010000; mXenLeaf += 0x100) {\r
- AsmCpuid (mXenLeaf,\r
- NULL,\r
- (UINT32 *) &Signature[0],\r
- (UINT32 *) &Signature[4],\r
- (UINT32 *) &Signature[8]);\r
-\r
- if (!AsciiStrCmp ((CHAR8 *) Signature, "XenVMMXenVMM")) {\r
- mXen = TRUE;\r
- return TRUE;\r
- }\r
- }\r
-\r
- mXenLeaf = 0;\r
- return FALSE;\r
-}\r
-\r
-/**\r
- Perform Xen PEI initialization.\r
-\r
- @return EFI_SUCCESS Xen initialized successfully\r
- @return EFI_NOT_FOUND Not running under Xen\r
-\r
-**/\r
-EFI_STATUS\r
-InitializeXen (\r
- VOID\r
- )\r
-{\r
- if (mXenLeaf == 0) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- XenConnect (mXenLeaf);\r
-\r
- //\r
- // Reserve away HVMLOADER reserved memory [0xFC000000,0xFD000000).\r
- // This needs to match HVMLOADER RESERVED_MEMBASE/RESERVED_MEMSIZE.\r
- //\r
- AddReservedMemoryBaseSizeHob (0xFC000000, 0x1000000);\r
-\r
- return EFI_SUCCESS;\r
-}\r