]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/PlatformPei/Xen.c
OvmfPkg/PlatformPei: Add mXen boolean to indicate Xen is running
[mirror_edk2.git] / OvmfPkg / PlatformPei / Xen.c
CommitLineData
eec7d420 1/**@file\r
2 Xen Platform PEI support\r
3\r
b621bb0a 4 Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>\r
eec7d420 5 Copyright (c) 2011, Andrei Warkentin <andreiw@motorola.com>\r
6\r
7 This program and the accompanying materials\r
8 are licensed and made available under the terms and conditions of the BSD License\r
9 which accompanies this distribution. The full text of the license may be found at\r
10 http://opensource.org/licenses/bsd-license.php\r
11\r
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
14\r
15**/\r
16\r
17//\r
18// The package level header files this module uses\r
19//\r
20#include <PiPei.h>\r
21\r
22//\r
23// The Library classes this module consumes\r
24//\r
25#include <Library/DebugLib.h>\r
26#include <Library/HobLib.h>\r
27#include <Library/MemoryAllocationLib.h>\r
28#include <Library/PcdLib.h>\r
29#include <Guid/XenInfo.h>\r
30\r
31#include "Platform.h"\r
bb6a9a93 32#include "Xen.h"\r
eec7d420 33\r
b621bb0a
JJ
34BOOLEAN mXen = FALSE;\r
35\r
eec7d420 36EFI_XEN_INFO mXenInfo;\r
37\r
bb6a9a93
WL
38/**\r
39 Returns E820 map provided by Xen\r
40\r
41 @param Entries Pointer to E820 map\r
42 @param Count Number of entries\r
43\r
44 @return EFI_STATUS\r
45**/\r
46EFI_STATUS\r
47XenGetE820Map (\r
48 EFI_E820_ENTRY64 **Entries,\r
49 UINT32 *Count\r
50 )\r
51{\r
52 EFI_XEN_OVMF_INFO *Info =\r
53 (EFI_XEN_OVMF_INFO *)(UINTN) OVMF_INFO_PHYSICAL_ADDRESS;\r
54\r
55 if (AsciiStrCmp ((CHAR8 *) Info->Signature, "XenHVMOVMF")) {\r
56 return EFI_NOT_FOUND;\r
57 }\r
58\r
59 ASSERT (Info->E820 < MAX_ADDRESS);\r
60 *Entries = (EFI_E820_ENTRY64 *)(UINTN) Info->E820;\r
61 *Count = Info->E820EntriesCount;\r
62\r
63 return EFI_SUCCESS;\r
64}\r
eec7d420 65\r
66/**\r
67 Connects to the Hypervisor.\r
68 \r
69 @param XenLeaf CPUID index used to connect.\r
70\r
71 @return EFI_STATUS\r
72\r
73**/\r
74EFI_STATUS\r
75XenConnect (\r
76 UINT32 XenLeaf\r
77 )\r
78{\r
79 UINT32 Index;\r
80 UINT32 TransferReg;\r
81 UINT32 TransferPages;\r
82 UINT32 XenVersion;\r
83\r
84 AsmCpuid (XenLeaf + 2, &TransferPages, &TransferReg, NULL, NULL);\r
85 mXenInfo.HyperPages = AllocatePages (TransferPages);\r
86 if (!mXenInfo.HyperPages) {\r
87 return EFI_OUT_OF_RESOURCES;\r
88 }\r
89\r
90 for (Index = 0; Index < TransferPages; Index++) {\r
91 AsmWriteMsr64 (TransferReg,\r
92 (UINTN) mXenInfo.HyperPages +\r
93 (Index << EFI_PAGE_SHIFT) + Index);\r
94 }\r
95\r
96 AsmCpuid (XenLeaf + 1, &XenVersion, NULL, NULL, NULL);\r
97 DEBUG ((EFI_D_ERROR, "Detected Xen version %d.%d\n",\r
98 XenVersion >> 16, XenVersion & 0xFFFF));\r
670a64e7 99 mXenInfo.VersionMajor = (UINT16)(XenVersion >> 16);\r
100 mXenInfo.VersionMinor = (UINT16)(XenVersion & 0xFFFF);\r
eec7d420 101\r
102 /* TBD: Locate hvm_info and reserve it away. */\r
103 mXenInfo.HvmInfo = NULL;\r
104\r
105 BuildGuidDataHob (\r
106 &gEfiXenInfoGuid,\r
107 &mXenInfo,\r
108 sizeof(mXenInfo)\r
109 );\r
110\r
111 return EFI_SUCCESS;\r
112}\r
113\r
114/**\r
115 Figures out if we are running inside Xen HVM.\r
116\r
117 @return UINT32 CPUID index used to connect to HV.\r
118\r
119**/\r
120UINT32\r
121XenDetect (\r
122 VOID\r
123 )\r
124{\r
125\r
126 UINT32 XenLeaf;\r
127 UINT8 Signature[13];\r
128\r
129 for (XenLeaf = 0x40000000; XenLeaf < 0x40010000; XenLeaf += 0x100) {\r
130 AsmCpuid (XenLeaf, NULL, (UINT32 *) &Signature[0],\r
131 (UINT32 *) &Signature[4],\r
132 (UINT32 *) &Signature[8]);\r
133 Signature[12] = '\0';\r
134\r
135 if (!AsciiStrCmp ((CHAR8 *) Signature, "XenVMMXenVMM")) {\r
b621bb0a 136 mXen = TRUE;\r
eec7d420 137 return XenLeaf;\r
138 }\r
139 }\r
140\r
141 return 0;\r
142}\r
143\r
144/**\r
145 Perform Xen PEI initialization.\r
146\r
147 @return EFI_SUCCESS Xen initialized successfully\r
148 @return EFI_NOT_FOUND Not running under Xen\r
149\r
150**/\r
151EFI_STATUS\r
152InitializeXen (\r
c7ea55b9 153 UINT32 XenLeaf\r
eec7d420 154 )\r
155{\r
eec7d420 156 XenConnect (XenLeaf);\r
157\r
158 //\r
159 // Reserve away HVMLOADER reserved memory [0xFC000000,0xFD000000).\r
160 // This needs to match HVMLOADER RESERVED_MEMBASE/RESERVED_MEMSIZE.\r
161 //\r
162 AddReservedMemoryBaseSizeHob (0xFC000000, 0x1000000);\r
163\r
164 return EFI_SUCCESS;\r
165}\r