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