]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/PlatformPei/Xen.c
edksetup.sh: Fix typo and return code
[mirror_edk2.git] / OvmfPkg / PlatformPei / Xen.c
CommitLineData
eec7d420 1/**@file\r
2 Xen Platform PEI support\r
3\r
bb6a9a93 4 Copyright (c) 2006 - 2013, 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
34EFI_XEN_INFO mXenInfo;\r
35\r
bb6a9a93
WL
36/**\r
37 Returns E820 map provided by Xen\r
38\r
39 @param Entries Pointer to E820 map\r
40 @param Count Number of entries\r
41\r
42 @return EFI_STATUS\r
43**/\r
44EFI_STATUS\r
45XenGetE820Map (\r
46 EFI_E820_ENTRY64 **Entries,\r
47 UINT32 *Count\r
48 )\r
49{\r
50 EFI_XEN_OVMF_INFO *Info =\r
51 (EFI_XEN_OVMF_INFO *)(UINTN) OVMF_INFO_PHYSICAL_ADDRESS;\r
52\r
53 if (AsciiStrCmp ((CHAR8 *) Info->Signature, "XenHVMOVMF")) {\r
54 return EFI_NOT_FOUND;\r
55 }\r
56\r
57 ASSERT (Info->E820 < MAX_ADDRESS);\r
58 *Entries = (EFI_E820_ENTRY64 *)(UINTN) Info->E820;\r
59 *Count = Info->E820EntriesCount;\r
60\r
61 return EFI_SUCCESS;\r
62}\r
eec7d420 63\r
64/**\r
65 Connects to the Hypervisor.\r
66 \r
67 @param XenLeaf CPUID index used to connect.\r
68\r
69 @return EFI_STATUS\r
70\r
71**/\r
72EFI_STATUS\r
73XenConnect (\r
74 UINT32 XenLeaf\r
75 )\r
76{\r
77 UINT32 Index;\r
78 UINT32 TransferReg;\r
79 UINT32 TransferPages;\r
80 UINT32 XenVersion;\r
81\r
82 AsmCpuid (XenLeaf + 2, &TransferPages, &TransferReg, NULL, NULL);\r
83 mXenInfo.HyperPages = AllocatePages (TransferPages);\r
84 if (!mXenInfo.HyperPages) {\r
85 return EFI_OUT_OF_RESOURCES;\r
86 }\r
87\r
88 for (Index = 0; Index < TransferPages; Index++) {\r
89 AsmWriteMsr64 (TransferReg,\r
90 (UINTN) mXenInfo.HyperPages +\r
91 (Index << EFI_PAGE_SHIFT) + Index);\r
92 }\r
93\r
94 AsmCpuid (XenLeaf + 1, &XenVersion, NULL, NULL, NULL);\r
95 DEBUG ((EFI_D_ERROR, "Detected Xen version %d.%d\n",\r
96 XenVersion >> 16, XenVersion & 0xFFFF));\r
670a64e7 97 mXenInfo.VersionMajor = (UINT16)(XenVersion >> 16);\r
98 mXenInfo.VersionMinor = (UINT16)(XenVersion & 0xFFFF);\r
eec7d420 99\r
100 /* TBD: Locate hvm_info and reserve it away. */\r
101 mXenInfo.HvmInfo = NULL;\r
102\r
103 BuildGuidDataHob (\r
104 &gEfiXenInfoGuid,\r
105 &mXenInfo,\r
106 sizeof(mXenInfo)\r
107 );\r
108\r
109 return EFI_SUCCESS;\r
110}\r
111\r
112/**\r
113 Figures out if we are running inside Xen HVM.\r
114\r
115 @return UINT32 CPUID index used to connect to HV.\r
116\r
117**/\r
118UINT32\r
119XenDetect (\r
120 VOID\r
121 )\r
122{\r
123\r
124 UINT32 XenLeaf;\r
125 UINT8 Signature[13];\r
126\r
127 for (XenLeaf = 0x40000000; XenLeaf < 0x40010000; XenLeaf += 0x100) {\r
128 AsmCpuid (XenLeaf, NULL, (UINT32 *) &Signature[0],\r
129 (UINT32 *) &Signature[4],\r
130 (UINT32 *) &Signature[8]);\r
131 Signature[12] = '\0';\r
132\r
133 if (!AsciiStrCmp ((CHAR8 *) Signature, "XenVMMXenVMM")) {\r
134 return XenLeaf;\r
135 }\r
136 }\r
137\r
138 return 0;\r
139}\r
140\r
141/**\r
142 Perform Xen PEI initialization.\r
143\r
144 @return EFI_SUCCESS Xen initialized successfully\r
145 @return EFI_NOT_FOUND Not running under Xen\r
146\r
147**/\r
148EFI_STATUS\r
149InitializeXen (\r
c7ea55b9 150 UINT32 XenLeaf\r
eec7d420 151 )\r
152{\r
eec7d420 153 XenConnect (XenLeaf);\r
154\r
155 //\r
156 // Reserve away HVMLOADER reserved memory [0xFC000000,0xFD000000).\r
157 // This needs to match HVMLOADER RESERVED_MEMBASE/RESERVED_MEMSIZE.\r
158 //\r
159 AddReservedMemoryBaseSizeHob (0xFC000000, 0x1000000);\r
160\r
161 return EFI_SUCCESS;\r
162}\r