]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.c
CorebootPayloadPkg: Use extra braces to prevent gcc compile fail
[mirror_edk2.git] / OvmfPkg / SmbiosPlatformDxe / SmbiosPlatformDxe.c
CommitLineData
fb511817 1/** @file\r
2 This driver installs SMBIOS information for OVMF\r
3\r
4 Copyright (c) 2011, Bei Guan <gbtju85@gmail.com>\r
5f239ef7 5 Copyright (c) 2011 - 2015, Intel Corporation. All rights reserved.<BR>\r
fb511817 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#include "SmbiosPlatformDxe.h"\r
18\r
5f239ef7
JJ
19#define TYPE0_STRINGS \\r
20 "EFI Development Kit II / OVMF\0" /* Vendor */ \\r
21 "0.0.0\0" /* BiosVersion */ \\r
22 "02/06/2015\0" /* BiosReleaseDate */\r
24256744
GS
23//\r
24// Type definition and contents of the default Type 0 SMBIOS table.\r
25//\r
26#pragma pack(1)\r
27typedef struct {\r
28 SMBIOS_TABLE_TYPE0 Base;\r
5f239ef7 29 UINT8 Strings[sizeof(TYPE0_STRINGS)];\r
24256744
GS
30} OVMF_TYPE0;\r
31#pragma pack()\r
32\r
33STATIC CONST OVMF_TYPE0 mOvmfDefaultType0 = {\r
34 {\r
35 // SMBIOS_STRUCTURE Hdr\r
36 {\r
37 EFI_SMBIOS_TYPE_BIOS_INFORMATION, // UINT8 Type\r
38 sizeof (SMBIOS_TABLE_TYPE0), // UINT8 Length\r
39 },\r
40 1, // SMBIOS_TABLE_STRING Vendor\r
41 2, // SMBIOS_TABLE_STRING BiosVersion\r
42 0xE800,// UINT16 BiosSegment\r
43 3, // SMBIOS_TABLE_STRING BiosReleaseDate\r
44 0, // UINT8 BiosSize\r
45 { // MISC_BIOS_CHARACTERISTICS BiosCharacteristics\r
46 0, // Reserved :2\r
47 0, // Unknown :1\r
48 1, // BiosCharacteristicsNotSupported :1\r
49 // Remaining BiosCharacteristics bits left unset :60\r
50 },\r
51 { // BIOSCharacteristicsExtensionBytes[2]\r
52 0, // BiosReserved\r
53 0x1C // SystemReserved = VirtualMachineSupported |\r
54 // UefiSpecificationSupported |\r
55 // TargetContentDistributionEnabled\r
56 },\r
57 0, // UINT8 SystemBiosMajorRelease\r
58 0, // UINT8 SystemBiosMinorRelease\r
59 0xFF, // UINT8 EmbeddedControllerFirmwareMajorRelease\r
60 0xFF // UINT8 EmbeddedControllerFirmwareMinorRelease\r
61 },\r
62 // Text strings (unformatted area)\r
5f239ef7 63 TYPE0_STRINGS\r
24256744
GS
64};\r
65\r
fb511817 66\r
67/**\r
68 Validates the SMBIOS entry point structure\r
69\r
70 @param EntryPointStructure SMBIOS entry point structure\r
71\r
72 @retval TRUE The entry point structure is valid\r
73 @retval FALSE The entry point structure is not valid\r
74\r
75**/\r
76BOOLEAN\r
77IsEntryPointStructureValid (\r
78 IN SMBIOS_TABLE_ENTRY_POINT *EntryPointStructure\r
79 )\r
80{\r
81 UINTN Index;\r
82 UINT8 Length;\r
83 UINT8 Checksum;\r
84 UINT8 *BytePtr;\r
85\r
86 BytePtr = (UINT8*) EntryPointStructure;\r
87 Length = EntryPointStructure->EntryPointLength;\r
88 Checksum = 0;\r
89\r
90 for (Index = 0; Index < Length; Index++) {\r
670a64e7 91 Checksum = Checksum + (UINT8) BytePtr[Index];\r
fb511817 92 }\r
93\r
94 if (Checksum != 0) {\r
95 return FALSE;\r
96 } else {\r
97 return TRUE;\r
98 }\r
99}\r
100\r
101\r
102/**\r
103 Get SMBIOS record length.\r
104\r
105 @param SmbiosTable SMBIOS pointer.\r
106\r
107**/\r
108UINTN\r
109SmbiosTableLength (\r
110 IN SMBIOS_STRUCTURE_POINTER SmbiosTable\r
111 )\r
112{\r
113 CHAR8 *AChar;\r
114 UINTN Length;\r
115\r
116 AChar = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);\r
117\r
118 //\r
119 // Each structure shall be terminated by a double-null (SMBIOS spec.7.1)\r
120 //\r
121 while ((*AChar != 0) || (*(AChar + 1) != 0)) {\r
122 AChar ++;\r
123 }\r
124 Length = ((UINTN)AChar - (UINTN)SmbiosTable.Raw + 2);\r
125\r
126 return Length;\r
127}\r
128\r
129\r
130/**\r
131 Install all structures from the given SMBIOS structures block\r
132\r
133 @param Smbios SMBIOS protocol\r
a145e28d 134 @param TableAddress SMBIOS tables starting address\r
fb511817 135\r
136**/\r
137EFI_STATUS\r
138InstallAllStructures (\r
139 IN EFI_SMBIOS_PROTOCOL *Smbios,\r
a145e28d 140 IN UINT8 *TableAddress\r
fb511817 141 )\r
142{\r
143 EFI_STATUS Status;\r
144 SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
145 EFI_SMBIOS_HANDLE SmbiosHandle;\r
24256744 146 BOOLEAN NeedSmbiosType0;\r
fb511817 147\r
a145e28d 148 SmbiosTable.Raw = TableAddress;\r
fb511817 149 if (SmbiosTable.Raw == NULL) {\r
150 return EFI_INVALID_PARAMETER;\r
151 }\r
152\r
24256744
GS
153 NeedSmbiosType0 = TRUE;\r
154\r
fb511817 155 while (SmbiosTable.Hdr->Type != 127) {\r
156 //\r
157 // Log the SMBIOS data for this structure\r
158 //\r
6b23d767 159 SmbiosHandle = SmbiosTable.Hdr->Handle;\r
fb511817 160 Status = Smbios->Add (\r
161 Smbios,\r
162 NULL,\r
163 &SmbiosHandle,\r
164 (EFI_SMBIOS_TABLE_HEADER*) SmbiosTable.Raw\r
165 );\r
166 ASSERT_EFI_ERROR (Status);\r
167\r
24256744
GS
168 if (SmbiosTable.Hdr->Type == 0) {\r
169 NeedSmbiosType0 = FALSE;\r
170 }\r
171\r
fb511817 172 //\r
173 // Get the next structure address\r
174 //\r
175 SmbiosTable.Raw = (UINT8 *)(SmbiosTable.Raw + SmbiosTableLength (SmbiosTable));\r
176 }\r
177\r
24256744
GS
178 if (NeedSmbiosType0) {\r
179 //\r
180 // Add OVMF default Type 0 (BIOS Information) table\r
181 //\r
182 SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;\r
183 Status = Smbios->Add (\r
184 Smbios,\r
185 NULL,\r
186 &SmbiosHandle,\r
187 (EFI_SMBIOS_TABLE_HEADER*) &mOvmfDefaultType0\r
188 );\r
189 ASSERT_EFI_ERROR (Status);\r
190 }\r
191\r
fb511817 192 return EFI_SUCCESS;\r
193}\r
194\r
195\r
196/**\r
197 Installs SMBIOS information for OVMF\r
198\r
199 @param ImageHandle Module's image handle\r
200 @param SystemTable Pointer of EFI_SYSTEM_TABLE\r
201\r
202 @retval EFI_SUCCESS Smbios data successfully installed\r
203 @retval Other Smbios data was not installed\r
204\r
205**/\r
206EFI_STATUS\r
207EFIAPI\r
208SmbiosTablePublishEntry (\r
209 IN EFI_HANDLE ImageHandle,\r
210 IN EFI_SYSTEM_TABLE *SystemTable\r
211 )\r
212{\r
213 EFI_STATUS Status;\r
214 EFI_SMBIOS_PROTOCOL *Smbios;\r
215 SMBIOS_TABLE_ENTRY_POINT *EntryPointStructure;\r
a145e28d 216 UINT8 *SmbiosTables;\r
fb511817 217\r
218 //\r
219 // Find the SMBIOS protocol\r
220 //\r
221 Status = gBS->LocateProtocol (\r
222 &gEfiSmbiosProtocolGuid,\r
223 NULL,\r
224 (VOID**)&Smbios\r
225 );\r
226 if (EFI_ERROR (Status)) {\r
227 return Status;\r
228 }\r
229\r
230 //\r
a145e28d 231 // Add Xen or QEMU SMBIOS data if found\r
fb511817 232 //\r
233 EntryPointStructure = GetXenSmbiosTables ();\r
234 if (EntryPointStructure != NULL) {\r
a145e28d
GS
235 SmbiosTables = (UINT8*)(UINTN)EntryPointStructure->TableAddress;\r
236 } else {\r
237 SmbiosTables = GetQemuSmbiosTables ();\r
238 }\r
239\r
240 if (SmbiosTables != NULL) {\r
241 Status = InstallAllStructures (Smbios, SmbiosTables);\r
242\r
243 //\r
244 // Free SmbiosTables if allocated by Qemu (i.e., NOT by Xen):\r
245 //\r
246 if (EntryPointStructure == NULL) {\r
247 FreePool (SmbiosTables);\r
248 }\r
fb511817 249 }\r
250\r
251 return Status;\r
252}\r