]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/PlatformPei/Xen.c
Fix build crash while using MSFT to build OVMF, also fix some build warning report...
[mirror_edk2.git] / OvmfPkg / PlatformPei / Xen.c
CommitLineData
eec7d420 1/**@file\r
2 Xen Platform PEI support\r
3\r
4 Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
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
32\r
33EFI_XEN_INFO mXenInfo;\r
34\r
35\r
36/**\r
37 Connects to the Hypervisor.\r
38 \r
39 @param XenLeaf CPUID index used to connect.\r
40\r
41 @return EFI_STATUS\r
42\r
43**/\r
44EFI_STATUS\r
45XenConnect (\r
46 UINT32 XenLeaf\r
47 )\r
48{\r
49 UINT32 Index;\r
50 UINT32 TransferReg;\r
51 UINT32 TransferPages;\r
52 UINT32 XenVersion;\r
53\r
54 AsmCpuid (XenLeaf + 2, &TransferPages, &TransferReg, NULL, NULL);\r
55 mXenInfo.HyperPages = AllocatePages (TransferPages);\r
56 if (!mXenInfo.HyperPages) {\r
57 return EFI_OUT_OF_RESOURCES;\r
58 }\r
59\r
60 for (Index = 0; Index < TransferPages; Index++) {\r
61 AsmWriteMsr64 (TransferReg,\r
62 (UINTN) mXenInfo.HyperPages +\r
63 (Index << EFI_PAGE_SHIFT) + Index);\r
64 }\r
65\r
66 AsmCpuid (XenLeaf + 1, &XenVersion, NULL, NULL, NULL);\r
67 DEBUG ((EFI_D_ERROR, "Detected Xen version %d.%d\n",\r
68 XenVersion >> 16, XenVersion & 0xFFFF));\r
670a64e7 69 mXenInfo.VersionMajor = (UINT16)(XenVersion >> 16);\r
70 mXenInfo.VersionMinor = (UINT16)(XenVersion & 0xFFFF);\r
eec7d420 71\r
72 /* TBD: Locate hvm_info and reserve it away. */\r
73 mXenInfo.HvmInfo = NULL;\r
74\r
75 BuildGuidDataHob (\r
76 &gEfiXenInfoGuid,\r
77 &mXenInfo,\r
78 sizeof(mXenInfo)\r
79 );\r
80\r
81 return EFI_SUCCESS;\r
82}\r
83\r
84/**\r
85 Figures out if we are running inside Xen HVM.\r
86\r
87 @return UINT32 CPUID index used to connect to HV.\r
88\r
89**/\r
90UINT32\r
91XenDetect (\r
92 VOID\r
93 )\r
94{\r
95\r
96 UINT32 XenLeaf;\r
97 UINT8 Signature[13];\r
98\r
99 for (XenLeaf = 0x40000000; XenLeaf < 0x40010000; XenLeaf += 0x100) {\r
100 AsmCpuid (XenLeaf, NULL, (UINT32 *) &Signature[0],\r
101 (UINT32 *) &Signature[4],\r
102 (UINT32 *) &Signature[8]);\r
103 Signature[12] = '\0';\r
104\r
105 if (!AsciiStrCmp ((CHAR8 *) Signature, "XenVMMXenVMM")) {\r
106 return XenLeaf;\r
107 }\r
108 }\r
109\r
110 return 0;\r
111}\r
112\r
113/**\r
114 Perform Xen PEI initialization.\r
115\r
116 @return EFI_SUCCESS Xen initialized successfully\r
117 @return EFI_NOT_FOUND Not running under Xen\r
118\r
119**/\r
120EFI_STATUS\r
121InitializeXen (\r
122 VOID\r
123 )\r
124{\r
125 UINT32 XenLeaf;\r
126\r
127 XenLeaf = XenDetect ();\r
128\r
129 if (XenLeaf == 0) {\r
130 return EFI_NOT_FOUND;\r
131 }\r
132\r
133 DEBUG ((EFI_D_INFO, "Xen was detected\n"));\r
134\r
135 XenConnect (XenLeaf);\r
136\r
137 //\r
138 // Reserve away HVMLOADER reserved memory [0xFC000000,0xFD000000).\r
139 // This needs to match HVMLOADER RESERVED_MEMBASE/RESERVED_MEMSIZE.\r
140 //\r
141 AddReservedMemoryBaseSizeHob (0xFC000000, 0x1000000);\r
142\r
143 return EFI_SUCCESS;\r
144}\r