]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.c
CryptoPkg PeiCryptLib: Enable SHA384/512 support
[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
fb511817 67/**\r
68 Get SMBIOS record length.\r
69\r
70 @param SmbiosTable SMBIOS pointer.\r
71\r
72**/\r
73UINTN\r
74SmbiosTableLength (\r
75 IN SMBIOS_STRUCTURE_POINTER SmbiosTable\r
76 )\r
77{\r
78 CHAR8 *AChar;\r
79 UINTN Length;\r
80\r
81 AChar = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);\r
82\r
83 //\r
84 // Each structure shall be terminated by a double-null (SMBIOS spec.7.1)\r
85 //\r
86 while ((*AChar != 0) || (*(AChar + 1) != 0)) {\r
87 AChar ++;\r
88 }\r
89 Length = ((UINTN)AChar - (UINTN)SmbiosTable.Raw + 2);\r
90\r
91 return Length;\r
92}\r
93\r
94\r
95/**\r
96 Install all structures from the given SMBIOS structures block\r
97\r
98 @param Smbios SMBIOS protocol\r
a145e28d 99 @param TableAddress SMBIOS tables starting address\r
fb511817 100\r
101**/\r
102EFI_STATUS\r
103InstallAllStructures (\r
104 IN EFI_SMBIOS_PROTOCOL *Smbios,\r
a145e28d 105 IN UINT8 *TableAddress\r
fb511817 106 )\r
107{\r
108 EFI_STATUS Status;\r
109 SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
110 EFI_SMBIOS_HANDLE SmbiosHandle;\r
24256744 111 BOOLEAN NeedSmbiosType0;\r
fb511817 112\r
a145e28d 113 SmbiosTable.Raw = TableAddress;\r
fb511817 114 if (SmbiosTable.Raw == NULL) {\r
115 return EFI_INVALID_PARAMETER;\r
116 }\r
117\r
24256744
GS
118 NeedSmbiosType0 = TRUE;\r
119\r
fb511817 120 while (SmbiosTable.Hdr->Type != 127) {\r
121 //\r
122 // Log the SMBIOS data for this structure\r
123 //\r
6b23d767 124 SmbiosHandle = SmbiosTable.Hdr->Handle;\r
fb511817 125 Status = Smbios->Add (\r
126 Smbios,\r
127 NULL,\r
128 &SmbiosHandle,\r
129 (EFI_SMBIOS_TABLE_HEADER*) SmbiosTable.Raw\r
130 );\r
131 ASSERT_EFI_ERROR (Status);\r
132\r
24256744
GS
133 if (SmbiosTable.Hdr->Type == 0) {\r
134 NeedSmbiosType0 = FALSE;\r
135 }\r
136\r
fb511817 137 //\r
138 // Get the next structure address\r
139 //\r
140 SmbiosTable.Raw = (UINT8 *)(SmbiosTable.Raw + SmbiosTableLength (SmbiosTable));\r
141 }\r
142\r
24256744
GS
143 if (NeedSmbiosType0) {\r
144 //\r
145 // Add OVMF default Type 0 (BIOS Information) table\r
146 //\r
147 SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;\r
148 Status = Smbios->Add (\r
149 Smbios,\r
150 NULL,\r
151 &SmbiosHandle,\r
152 (EFI_SMBIOS_TABLE_HEADER*) &mOvmfDefaultType0\r
153 );\r
154 ASSERT_EFI_ERROR (Status);\r
155 }\r
156\r
fb511817 157 return EFI_SUCCESS;\r
158}\r
159\r
160\r
161/**\r
162 Installs SMBIOS information for OVMF\r
163\r
164 @param ImageHandle Module's image handle\r
165 @param SystemTable Pointer of EFI_SYSTEM_TABLE\r
166\r
167 @retval EFI_SUCCESS Smbios data successfully installed\r
168 @retval Other Smbios data was not installed\r
169\r
170**/\r
171EFI_STATUS\r
172EFIAPI\r
173SmbiosTablePublishEntry (\r
174 IN EFI_HANDLE ImageHandle,\r
175 IN EFI_SYSTEM_TABLE *SystemTable\r
176 )\r
177{\r
178 EFI_STATUS Status;\r
179 EFI_SMBIOS_PROTOCOL *Smbios;\r
180 SMBIOS_TABLE_ENTRY_POINT *EntryPointStructure;\r
a145e28d 181 UINT8 *SmbiosTables;\r
fb511817 182\r
183 //\r
184 // Find the SMBIOS protocol\r
185 //\r
186 Status = gBS->LocateProtocol (\r
187 &gEfiSmbiosProtocolGuid,\r
188 NULL,\r
189 (VOID**)&Smbios\r
190 );\r
191 if (EFI_ERROR (Status)) {\r
192 return Status;\r
193 }\r
194\r
195 //\r
a145e28d 196 // Add Xen or QEMU SMBIOS data if found\r
fb511817 197 //\r
198 EntryPointStructure = GetXenSmbiosTables ();\r
199 if (EntryPointStructure != NULL) {\r
a145e28d
GS
200 SmbiosTables = (UINT8*)(UINTN)EntryPointStructure->TableAddress;\r
201 } else {\r
202 SmbiosTables = GetQemuSmbiosTables ();\r
203 }\r
204\r
205 if (SmbiosTables != NULL) {\r
206 Status = InstallAllStructures (Smbios, SmbiosTables);\r
207\r
208 //\r
209 // Free SmbiosTables if allocated by Qemu (i.e., NOT by Xen):\r
210 //\r
211 if (EntryPointStructure == NULL) {\r
212 FreePool (SmbiosTables);\r
213 }\r
fb511817 214 }\r
215\r
216 return Status;\r
217}\r