2 Xen Platform PEI support
4 Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
5 Copyright (c) 2011, Andrei Warkentin <andreiw@motorola.com>
7 This program and the accompanying materials
8 are licensed and made available under the terms and conditions of the BSD License
9 which accompanies this distribution. The full text of the license may be found at
10 http://opensource.org/licenses/bsd-license.php
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 // The package level header files this module uses
23 // The Library classes this module consumes
25 #include <Library/DebugLib.h>
26 #include <Library/HobLib.h>
27 #include <Library/MemoryAllocationLib.h>
28 #include <Library/PcdLib.h>
29 #include <Guid/XenInfo.h>
36 STATIC UINT32 mXenLeaf
= 0;
38 EFI_XEN_INFO mXenInfo
;
41 Returns E820 map provided by Xen
43 @param Entries Pointer to E820 map
44 @param Count Number of entries
50 EFI_E820_ENTRY64
**Entries
,
54 EFI_XEN_OVMF_INFO
*Info
=
55 (EFI_XEN_OVMF_INFO
*)(UINTN
) OVMF_INFO_PHYSICAL_ADDRESS
;
57 if (AsciiStrCmp ((CHAR8
*) Info
->Signature
, "XenHVMOVMF")) {
61 ASSERT (Info
->E820
< MAX_ADDRESS
);
62 *Entries
= (EFI_E820_ENTRY64
*)(UINTN
) Info
->E820
;
63 *Count
= Info
->E820EntriesCount
;
69 Connects to the Hypervisor.
71 @param XenLeaf CPUID index used to connect.
86 AsmCpuid (XenLeaf
+ 2, &TransferPages
, &TransferReg
, NULL
, NULL
);
87 mXenInfo
.HyperPages
= AllocatePages (TransferPages
);
88 if (!mXenInfo
.HyperPages
) {
89 return EFI_OUT_OF_RESOURCES
;
92 for (Index
= 0; Index
< TransferPages
; Index
++) {
93 AsmWriteMsr64 (TransferReg
,
94 (UINTN
) mXenInfo
.HyperPages
+
95 (Index
<< EFI_PAGE_SHIFT
) + Index
);
98 AsmCpuid (XenLeaf
+ 1, &XenVersion
, NULL
, NULL
, NULL
);
99 DEBUG ((EFI_D_ERROR
, "Detected Xen version %d.%d\n",
100 XenVersion
>> 16, XenVersion
& 0xFFFF));
101 mXenInfo
.VersionMajor
= (UINT16
)(XenVersion
>> 16);
102 mXenInfo
.VersionMinor
= (UINT16
)(XenVersion
& 0xFFFF);
104 /* TBD: Locate hvm_info and reserve it away. */
105 mXenInfo
.HvmInfo
= NULL
;
117 Figures out if we are running inside Xen HVM.
119 @retval TRUE Xen was detected
120 @retval FALSE Xen was not detected
134 Signature
[12] = '\0';
135 for (mXenLeaf
= 0x40000000; mXenLeaf
< 0x40010000; mXenLeaf
+= 0x100) {
138 (UINT32
*) &Signature
[0],
139 (UINT32
*) &Signature
[4],
140 (UINT32
*) &Signature
[8]);
142 if (!AsciiStrCmp ((CHAR8
*) Signature
, "XenVMMXenVMM")) {
153 Perform Xen PEI initialization.
155 @return EFI_SUCCESS Xen initialized successfully
156 @return EFI_NOT_FOUND Not running under Xen
165 return EFI_NOT_FOUND
;
168 XenConnect (mXenLeaf
);
171 // Reserve away HVMLOADER reserved memory [0xFC000000,0xFD000000).
172 // This needs to match HVMLOADER RESERVED_MEMBASE/RESERVED_MEMSIZE.
174 AddReservedMemoryBaseSizeHob (0xFC000000, 0x1000000);