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