2 Xen Platform PEI support
4 Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
5 Copyright (c) 2011, Andrei Warkentin <andreiw@motorola.com>
7 SPDX-License-Identifier: BSD-2-Clause-Patent
12 // The package level header files this module uses
17 // The Library classes this module consumes
19 #include <Library/DebugLib.h>
20 #include <Library/HobLib.h>
21 #include <Library/MemoryAllocationLib.h>
22 #include <Library/PcdLib.h>
23 #include <Guid/XenInfo.h>
24 #include <IndustryStandard/E820.h>
25 #include <Library/ResourcePublicationLib.h>
26 #include <Library/MtrrLib.h>
33 STATIC UINT32 mXenLeaf
= 0;
35 EFI_XEN_INFO mXenInfo
;
38 Returns E820 map provided by Xen
40 @param Entries Pointer to E820 map
41 @param Count Number of entries
47 EFI_E820_ENTRY64
**Entries
,
51 EFI_XEN_OVMF_INFO
*Info
=
52 (EFI_XEN_OVMF_INFO
*)(UINTN
) OVMF_INFO_PHYSICAL_ADDRESS
;
54 if (AsciiStrCmp ((CHAR8
*) Info
->Signature
, "XenHVMOVMF")) {
58 ASSERT (Info
->E820
< MAX_ADDRESS
);
59 *Entries
= (EFI_E820_ENTRY64
*)(UINTN
) Info
->E820
;
60 *Count
= Info
->E820EntriesCount
;
66 Connects to the Hypervisor.
68 @param XenLeaf CPUID index used to connect.
83 AsmCpuid (XenLeaf
+ 2, &TransferPages
, &TransferReg
, NULL
, NULL
);
84 mXenInfo
.HyperPages
= AllocatePages (TransferPages
);
85 if (!mXenInfo
.HyperPages
) {
86 return EFI_OUT_OF_RESOURCES
;
89 for (Index
= 0; Index
< TransferPages
; Index
++) {
90 AsmWriteMsr64 (TransferReg
,
91 (UINTN
) mXenInfo
.HyperPages
+
92 (Index
<< EFI_PAGE_SHIFT
) + Index
);
95 AsmCpuid (XenLeaf
+ 1, &XenVersion
, NULL
, NULL
, NULL
);
96 DEBUG ((EFI_D_ERROR
, "Detected Xen version %d.%d\n",
97 XenVersion
>> 16, XenVersion
& 0xFFFF));
98 mXenInfo
.VersionMajor
= (UINT16
)(XenVersion
>> 16);
99 mXenInfo
.VersionMinor
= (UINT16
)(XenVersion
& 0xFFFF);
111 Figures out if we are running inside Xen HVM.
113 @retval TRUE Xen was detected
114 @retval FALSE Xen was not detected
128 Signature
[12] = '\0';
129 for (mXenLeaf
= 0x40000000; mXenLeaf
< 0x40010000; mXenLeaf
+= 0x100) {
132 (UINT32
*) &Signature
[0],
133 (UINT32
*) &Signature
[4],
134 (UINT32
*) &Signature
[8]);
136 if (!AsciiStrCmp ((CHAR8
*) Signature
, "XenVMMXenVMM")) {
148 XenPublishRamRegions (
152 EFI_E820_ENTRY64
*E820Map
;
153 UINT32 E820EntriesCount
;
160 DEBUG ((EFI_D_INFO
, "Using memory map provided by Xen\n"));
163 // Parse RAM in E820 map
165 E820EntriesCount
= 0;
166 Status
= XenGetE820Map (&E820Map
, &E820EntriesCount
);
168 ASSERT_EFI_ERROR (Status
);
170 if (E820EntriesCount
> 0) {
171 EFI_E820_ENTRY64
*Entry
;
174 for (Loop
= 0; Loop
< E820EntriesCount
; Loop
++) {
175 Entry
= E820Map
+ Loop
;
178 // Only care about RAM
180 if (Entry
->Type
!= EfiAcpiAddressRangeMemory
) {
184 AddMemoryBaseSizeHob (Entry
->BaseAddr
, Entry
->Length
);
186 MtrrSetMemoryAttribute (Entry
->BaseAddr
, Entry
->Length
, CacheWriteBack
);
193 Perform Xen PEI initialization.
195 @return EFI_SUCCESS Xen initialized successfully
196 @return EFI_NOT_FOUND Not running under Xen
204 RETURN_STATUS PcdStatus
;
207 return EFI_NOT_FOUND
;
210 XenConnect (mXenLeaf
);
213 // Reserve away HVMLOADER reserved memory [0xFC000000,0xFD000000).
214 // This needs to match HVMLOADER RESERVED_MEMBASE/RESERVED_MEMSIZE.
216 AddReservedMemoryBaseSizeHob (0xFC000000, 0x1000000, FALSE
);
218 PcdStatus
= PcdSetBoolS (PcdPciDisableBusEnumeration
, TRUE
);
219 ASSERT_RETURN_ERROR (PcdStatus
);