summaryrefslogtreecommitdiffstats
path: root/OvmfPkg/PlatformPei/Xen.c
diff options
context:
space:
mode:
authorjljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>2011-08-05 15:43:05 +0000
committerjljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>2011-08-05 15:43:05 +0000
commiteec7d420170b2e3b6a4f1ddd282328483a12de60 (patch)
tree5f69b93b624dcba82d35b3f25782664ed843c731 /OvmfPkg/PlatformPei/Xen.c
parent8379337c91e3b6da5ebc0d99d4147fb623afcd22 (diff)
downloadedk2-eec7d420170b2e3b6a4f1ddd282328483a12de60.tar.gz
edk2-eec7d420170b2e3b6a4f1ddd282328483a12de60.tar.bz2
edk2-eec7d420170b2e3b6a4f1ddd282328483a12de60.zip
OvmfPkg/PlatformPei: Add Xen support
* Make PlatformPei aware of Xen * Fix assigned PIO and MMIO ranges to be compatible with Xen * Reserve Xen HVM address range * Publish XenInfo HOB * Don't program PIIX4 PMBA for Xen Signed-off-by: Andrei Warkentin <andreiw@motorola.com> Reviewed-by: gavinguan Signed-off-by: jljusten git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12091 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'OvmfPkg/PlatformPei/Xen.c')
-rw-r--r--OvmfPkg/PlatformPei/Xen.c144
1 files changed, 144 insertions, 0 deletions
diff --git a/OvmfPkg/PlatformPei/Xen.c b/OvmfPkg/PlatformPei/Xen.c
new file mode 100644
index 0000000000..1bb6b50a4d
--- /dev/null
+++ b/OvmfPkg/PlatformPei/Xen.c
@@ -0,0 +1,144 @@
+/**@file
+ Xen Platform PEI support
+
+ Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2011, Andrei Warkentin <andreiw@motorola.com>
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+//
+// The package level header files this module uses
+//
+#include <PiPei.h>
+
+//
+// The Library classes this module consumes
+//
+#include <Library/DebugLib.h>
+#include <Library/HobLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/PcdLib.h>
+#include <Guid/XenInfo.h>
+
+#include "Platform.h"
+
+EFI_XEN_INFO mXenInfo;
+
+
+/**
+ Connects to the Hypervisor.
+
+ @param XenLeaf CPUID index used to connect.
+
+ @return EFI_STATUS
+
+**/
+EFI_STATUS
+XenConnect (
+ UINT32 XenLeaf
+ )
+{
+ UINT32 Index;
+ UINT32 TransferReg;
+ UINT32 TransferPages;
+ UINT32 XenVersion;
+
+ AsmCpuid (XenLeaf + 2, &TransferPages, &TransferReg, NULL, NULL);
+ mXenInfo.HyperPages = AllocatePages (TransferPages);
+ if (!mXenInfo.HyperPages) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ for (Index = 0; Index < TransferPages; Index++) {
+ AsmWriteMsr64 (TransferReg,
+ (UINTN) mXenInfo.HyperPages +
+ (Index << EFI_PAGE_SHIFT) + Index);
+ }
+
+ AsmCpuid (XenLeaf + 1, &XenVersion, NULL, NULL, NULL);
+ DEBUG ((EFI_D_ERROR, "Detected Xen version %d.%d\n",
+ XenVersion >> 16, XenVersion & 0xFFFF));
+ mXenInfo.VersionMajor = XenVersion >> 16;
+ mXenInfo.VersionMinor = XenVersion & 0xFFFF;
+
+ /* TBD: Locate hvm_info and reserve it away. */
+ mXenInfo.HvmInfo = NULL;
+
+ BuildGuidDataHob (
+ &gEfiXenInfoGuid,
+ &mXenInfo,
+ sizeof(mXenInfo)
+ );
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Figures out if we are running inside Xen HVM.
+
+ @return UINT32 CPUID index used to connect to HV.
+
+**/
+UINT32
+XenDetect (
+ VOID
+ )
+{
+
+ UINT32 XenLeaf;
+ UINT8 Signature[13];
+
+ for (XenLeaf = 0x40000000; XenLeaf < 0x40010000; XenLeaf += 0x100) {
+ AsmCpuid (XenLeaf, NULL, (UINT32 *) &Signature[0],
+ (UINT32 *) &Signature[4],
+ (UINT32 *) &Signature[8]);
+ Signature[12] = '\0';
+
+ if (!AsciiStrCmp ((CHAR8 *) Signature, "XenVMMXenVMM")) {
+ return XenLeaf;
+ }
+ }
+
+ return 0;
+}
+
+/**
+ Perform Xen PEI initialization.
+
+ @return EFI_SUCCESS Xen initialized successfully
+ @return EFI_NOT_FOUND Not running under Xen
+
+**/
+EFI_STATUS
+InitializeXen (
+ VOID
+ )
+{
+ UINT32 XenLeaf;
+
+ XenLeaf = XenDetect ();
+
+ if (XenLeaf == 0) {
+ return EFI_NOT_FOUND;
+ }
+
+ DEBUG ((EFI_D_INFO, "Xen was detected\n"));
+
+ XenConnect (XenLeaf);
+
+ //
+ // Reserve away HVMLOADER reserved memory [0xFC000000,0xFD000000).
+ // This needs to match HVMLOADER RESERVED_MEMBASE/RESERVED_MEMSIZE.
+ //
+ AddReservedMemoryBaseSizeHob (0xFC000000, 0x1000000);
+
+ return EFI_SUCCESS;
+}