]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.c
UefiCpuPkg/MpInitLib: Restore IDT context for APs.
[mirror_edk2.git] / OvmfPkg / SmbiosPlatformDxe / SmbiosPlatformDxe.c
... / ...
CommitLineData
1/** @file\r
2 This driver installs SMBIOS information for OVMF\r
3\r
4 Copyright (c) 2011, Bei Guan <gbtju85@gmail.com>\r
5 Copyright (c) 2011 - 2015, Intel Corporation. All rights reserved.<BR>\r
6\r
7 SPDX-License-Identifier: BSD-2-Clause-Patent\r
8\r
9**/\r
10\r
11#include "SmbiosPlatformDxe.h"\r
12\r
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
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
23 UINT8 Strings[sizeof(TYPE0_STRINGS)];\r
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
57 TYPE0_STRINGS\r
58};\r
59\r
60\r
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
93 @param TableAddress SMBIOS tables starting address\r
94\r
95**/\r
96EFI_STATUS\r
97InstallAllStructures (\r
98 IN EFI_SMBIOS_PROTOCOL *Smbios,\r
99 IN UINT8 *TableAddress\r
100 )\r
101{\r
102 EFI_STATUS Status;\r
103 SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
104 EFI_SMBIOS_HANDLE SmbiosHandle;\r
105 BOOLEAN NeedSmbiosType0;\r
106\r
107 SmbiosTable.Raw = TableAddress;\r
108 if (SmbiosTable.Raw == NULL) {\r
109 return EFI_INVALID_PARAMETER;\r
110 }\r
111\r
112 NeedSmbiosType0 = TRUE;\r
113\r
114 while (SmbiosTable.Hdr->Type != 127) {\r
115 //\r
116 // Log the SMBIOS data for this structure\r
117 //\r
118 SmbiosHandle = SmbiosTable.Hdr->Handle;\r
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
127 if (SmbiosTable.Hdr->Type == 0) {\r
128 NeedSmbiosType0 = FALSE;\r
129 }\r
130\r
131 //\r
132 // Get the next structure address\r
133 //\r
134 SmbiosTable.Raw = (UINT8 *)(SmbiosTable.Raw + SmbiosTableLength (SmbiosTable));\r
135 }\r
136\r
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
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
175 UINT8 *SmbiosTables;\r
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
190 // Add Xen or QEMU SMBIOS data if found\r
191 //\r
192 EntryPointStructure = GetXenSmbiosTables ();\r
193 if (EntryPointStructure != NULL) {\r
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
208 }\r
209\r
210 return Status;\r
211}\r