X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=OvmfPkg%2FPlatformPei%2FXen.c;h=da3133bb9b7aa16625e2694e14bcc81ab0d9da34;hp=1bb6b50a4d9b8562fd1ba3c0c3d6c99c191dda89;hb=b98b4941e266526bf4c75f9004c869bfe9ef2f14;hpb=eec7d420170b2e3b6a4f1ddd282328483a12de60 diff --git a/OvmfPkg/PlatformPei/Xen.c b/OvmfPkg/PlatformPei/Xen.c index 1bb6b50a4d..da3133bb9b 100644 --- a/OvmfPkg/PlatformPei/Xen.c +++ b/OvmfPkg/PlatformPei/Xen.c @@ -1,7 +1,7 @@ /**@file Xen Platform PEI support - Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.
+ Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
Copyright (c) 2011, Andrei Warkentin This program and the accompanying materials @@ -29,9 +29,41 @@ #include #include "Platform.h" +#include "Xen.h" + +BOOLEAN mXen = FALSE; + +STATIC UINT32 mXenLeaf = 0; 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 *)(UINTN) OVMF_INFO_PHYSICAL_ADDRESS; + + if (AsciiStrCmp ((CHAR8 *) Info->Signature, "XenHVMOVMF")) { + return EFI_NOT_FOUND; + } + + ASSERT (Info->E820 < MAX_ADDRESS); + *Entries = (EFI_E820_ENTRY64 *)(UINTN) Info->E820; + *Count = Info->E820EntriesCount; + + return EFI_SUCCESS; +} /** Connects to the Hypervisor. @@ -66,8 +98,8 @@ XenConnect ( 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; + mXenInfo.VersionMajor = (UINT16)(XenVersion >> 16); + mXenInfo.VersionMinor = (UINT16)(XenVersion & 0xFFFF); /* TBD: Locate hvm_info and reserve it away. */ mXenInfo.HvmInfo = NULL; @@ -84,30 +116,37 @@ XenConnect ( /** Figures out if we are running inside Xen HVM. - @return UINT32 CPUID index used to connect to HV. + @retval TRUE Xen was detected + @retval FALSE Xen was not detected **/ -UINT32 +BOOLEAN XenDetect ( VOID ) { - - UINT32 XenLeaf; UINT8 Signature[13]; - for (XenLeaf = 0x40000000; XenLeaf < 0x40010000; XenLeaf += 0x100) { - AsmCpuid (XenLeaf, NULL, (UINT32 *) &Signature[0], + if (mXenLeaf != 0) { + return TRUE; + } + + Signature[12] = '\0'; + for (mXenLeaf = 0x40000000; mXenLeaf < 0x40010000; mXenLeaf += 0x100) { + AsmCpuid (mXenLeaf, + NULL, + (UINT32 *) &Signature[0], (UINT32 *) &Signature[4], (UINT32 *) &Signature[8]); - Signature[12] = '\0'; if (!AsciiStrCmp ((CHAR8 *) Signature, "XenVMMXenVMM")) { - return XenLeaf; + mXen = TRUE; + return TRUE; } } - return 0; + mXenLeaf = 0; + return FALSE; } /** @@ -122,17 +161,11 @@ InitializeXen ( VOID ) { - UINT32 XenLeaf; - - XenLeaf = XenDetect (); - - if (XenLeaf == 0) { + if (mXenLeaf == 0) { return EFI_NOT_FOUND; } - DEBUG ((EFI_D_INFO, "Xen was detected\n")); - - XenConnect (XenLeaf); + XenConnect (mXenLeaf); // // Reserve away HVMLOADER reserved memory [0xFC000000,0xFD000000).