]> git.proxmox.com Git - mirror_edk2.git/blame - DuetPkg/SmbiosGenDxe/SmbiosGen.c
DuetPkg: Fix GCC error to avoid the duplicated global variable in SmbiosGenDxe
[mirror_edk2.git] / DuetPkg / SmbiosGenDxe / SmbiosGen.c
CommitLineData
21020c7c 1/** @file\r
2\r
979a00fa 3Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
b1f700a8 4This program and the accompanying materials \r
21020c7c 5are licensed and made available under the terms and conditions of the BSD License \r
6which accompanies this distribution. The full text of the license may be found at \r
7http://opensource.org/licenses/bsd-license.php \r
8 \r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
11\r
12Module Name:\r
13\r
14 SmbiosGen.c\r
15\r
16Abstract:\r
17\r
18**/\r
19\r
20#include "SmbiosGen.h"\r
21020c7c 21extern UINT8 SmbiosGenDxeStrings[];\r
22EFI_SMBIOS_PROTOCOL *gSmbios;\r
23EFI_HII_HANDLE gStringHandle;\r
24\r
25VOID *\r
26GetSmbiosTablesFromHob (\r
27 VOID\r
28 )\r
29{\r
30 EFI_PHYSICAL_ADDRESS *Table;\r
31 EFI_PEI_HOB_POINTERS GuidHob;\r
fa8a1af2 32\r
33 GuidHob.Raw = GetFirstGuidHob (&gEfiSmbiosTableGuid);\r
21020c7c 34 if (GuidHob.Raw != NULL) {\r
35 Table = GET_GUID_HOB_DATA (GuidHob.Guid);\r
36 if (Table != NULL) {\r
37 return (VOID *)(UINTN)*Table;\r
38 }\r
39 }\r
40\r
41 return NULL;\r
42}\r
43\r
44\r
45VOID\r
46InstallProcessorSmbios (\r
47 IN VOID *Smbios\r
48 )\r
49{\r
50 SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
51 CHAR8 *AString;\r
52 CHAR16 *UString;\r
53 STRING_REF Token;\r
54\r
55 //\r
56 // Processor info (TYPE 4)\r
57 // \r
58 SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 4, 0);\r
59 if (SmbiosTable.Raw == NULL) {\r
60 DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 4 (Processor Info) not found!\n"));\r
61 return ;\r
62 }\r
63\r
64 //\r
65 // Log Smbios Record Type4\r
66 //\r
67 LogSmbiosData(gSmbios,(UINT8*)SmbiosTable.Type4);\r
68\r
69 //\r
70 // Set ProcessorVersion string\r
71 //\r
72 AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type4->ProcessorVersion);\r
73 UString = AllocateZeroPool ((AsciiStrLen(AString) + 1) * sizeof(CHAR16));\r
74 ASSERT (UString != NULL);\r
75 AsciiStrToUnicodeStr (AString, UString);\r
76\r
77 Token = HiiSetString (gStringHandle, 0, UString, NULL);\r
78 if (Token == 0) {\r
79 gBS->FreePool (UString);\r
80 return ;\r
81 }\r
82 gBS->FreePool (UString);\r
83 return ;\r
84}\r
85\r
86VOID\r
87InstallCacheSmbios (\r
88 IN VOID *Smbios\r
89 )\r
90{\r
91 return ;\r
92}\r
93\r
94VOID\r
95InstallMemorySmbios (\r
96 IN VOID *Smbios\r
97 )\r
98{\r
99 SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
100\r
101 //\r
102 // Generate Memory Array Mapped Address info (TYPE 19)\r
103 //\r
104 SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 19, 0);\r
105 if (SmbiosTable.Raw == NULL) {\r
106 DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 19 (Memory Array Mapped Address Info) not found!\n"));\r
107 return ;\r
108 }\r
109\r
110 //\r
111 // Record Smbios Type 19\r
112 //\r
113 LogSmbiosData(gSmbios, (UINT8*)SmbiosTable.Type19);\r
114 return ;\r
115}\r
116\r
117VOID\r
118InstallMiscSmbios (\r
119 IN VOID *Smbios\r
120 )\r
121{\r
122 SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
123 CHAR8 *AString;\r
124 CHAR16 *UString;\r
125 STRING_REF Token;\r
126\r
127 //\r
128 // BIOS information (TYPE 0)\r
129 // \r
130 SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 0, 0);\r
131 if (SmbiosTable.Raw == NULL) {\r
132 DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 0 (BIOS Information) not found!\n"));\r
133 return ;\r
134 }\r
135\r
136 //\r
137 // Record Type 2\r
138 //\r
139 AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type0->BiosVersion);\r
140 UString = AllocateZeroPool ((AsciiStrLen(AString) + 1) * sizeof(CHAR16) + sizeof(FIRMWARE_BIOS_VERSIONE));\r
141 ASSERT (UString != NULL);\r
142 CopyMem (UString, FIRMWARE_BIOS_VERSIONE, sizeof(FIRMWARE_BIOS_VERSIONE));\r
143 AsciiStrToUnicodeStr (AString, UString + sizeof(FIRMWARE_BIOS_VERSIONE) / sizeof(CHAR16) - 1);\r
144\r
145 Token = HiiSetString (gStringHandle, 0, UString, NULL);\r
146 if (Token == 0) {\r
147 gBS->FreePool (UString);\r
148 return ;\r
149 }\r
150 gBS->FreePool (UString);\r
151\r
152 //\r
153 // Log Smios Type 0\r
154 //\r
155 LogSmbiosData(gSmbios, (UINT8*)SmbiosTable.Type0);\r
156 \r
157 //\r
158 // System information (TYPE 1)\r
159 // \r
160 SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 1, 0);\r
161 if (SmbiosTable.Raw == NULL) {\r
162 DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 1 (System Information) not found!\n"));\r
163 return ;\r
164 }\r
165\r
166 //\r
167 // Record Type 3\r
168 //\r
169 AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type1->ProductName);\r
170 UString = AllocateZeroPool ((AsciiStrLen(AString) + 1) * sizeof(CHAR16) + sizeof(FIRMWARE_PRODUCT_NAME));\r
171 ASSERT (UString != NULL);\r
172 CopyMem (UString, FIRMWARE_PRODUCT_NAME, sizeof(FIRMWARE_PRODUCT_NAME));\r
173 AsciiStrToUnicodeStr (AString, UString + sizeof(FIRMWARE_PRODUCT_NAME) / sizeof(CHAR16) - 1);\r
174\r
175 Token = HiiSetString (gStringHandle, 0, UString, NULL);\r
176 if (Token == 0) {\r
177 gBS->FreePool (UString);\r
178 return ;\r
179 }\r
180 gBS->FreePool (UString);\r
181\r
182 //\r
183 // Log Smbios Type 1\r
184 //\r
185 LogSmbiosData(gSmbios, (UINT8*)SmbiosTable.Type1);\r
186 \r
187 return ;\r
188}\r
189\r
190EFI_STATUS\r
191EFIAPI\r
192SmbiosGenEntrypoint (\r
193 IN EFI_HANDLE ImageHandle,\r
194 IN EFI_SYSTEM_TABLE *SystemTable\r
195 )\r
196{\r
197 EFI_STATUS Status;\r
198 VOID *Smbios;\r
199\r
200 Smbios = GetSmbiosTablesFromHob ();\r
201 if (Smbios == NULL) {\r
202 return EFI_NOT_FOUND;\r
203 }\r
204\r
205 Status = gBS->LocateProtocol (\r
206 &gEfiSmbiosProtocolGuid,\r
207 NULL,\r
208 (VOID**)&gSmbios\r
209 );\r
210 if (EFI_ERROR (Status)) {\r
211 return Status;\r
212 }\r
21020c7c 213 \r
214 gStringHandle = HiiAddPackages (\r
215 &gEfiCallerIdGuid,\r
216 NULL,\r
217 SmbiosGenDxeStrings,\r
218 NULL\r
219 );\r
220 ASSERT (gStringHandle != NULL);\r
221\r
222 InstallProcessorSmbios (Smbios);\r
223 InstallCacheSmbios (Smbios);\r
224 InstallMemorySmbios (Smbios);\r
225 InstallMiscSmbios (Smbios);\r
226\r
227 return EFI_SUCCESS;\r
228}\r
229\r
230//\r
231// Internal function\r
232//\r
233\r
234UINTN\r
235SmbiosTableLength (\r
236 IN SMBIOS_STRUCTURE_POINTER SmbiosTable\r
237 )\r
238{\r
239 CHAR8 *AChar;\r
240 UINTN Length;\r
241\r
242 AChar = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);\r
243 while ((*AChar != 0) || (*(AChar + 1) != 0)) {\r
244 AChar ++;\r
245 }\r
246 Length = ((UINTN)AChar - (UINTN)SmbiosTable.Raw + 2);\r
247 \r
248 return Length;\r
249}\r
250\r
251SMBIOS_STRUCTURE_POINTER\r
252GetSmbiosTableFromType (\r
253 IN SMBIOS_TABLE_ENTRY_POINT *Smbios,\r
254 IN UINT8 Type,\r
255 IN UINTN Index\r
256 )\r
257{\r
258 SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
259 UINTN SmbiosTypeIndex;\r
260 \r
261 SmbiosTypeIndex = 0;\r
262 SmbiosTable.Raw = (UINT8 *)(UINTN)Smbios->TableAddress;\r
263 if (SmbiosTable.Raw == NULL) {\r
264 return SmbiosTable;\r
265 }\r
266 while ((SmbiosTypeIndex != Index) || (SmbiosTable.Hdr->Type != Type)) {\r
267 if (SmbiosTable.Hdr->Type == 127) {\r
268 SmbiosTable.Raw = NULL;\r
269 return SmbiosTable;\r
270 }\r
271 if (SmbiosTable.Hdr->Type == Type) {\r
272 SmbiosTypeIndex ++;\r
273 }\r
274 SmbiosTable.Raw = (UINT8 *)(SmbiosTable.Raw + SmbiosTableLength (SmbiosTable));\r
275 }\r
276\r
277 return SmbiosTable;\r
278}\r
279\r
280CHAR8 *\r
281GetSmbiosString (\r
282 IN SMBIOS_STRUCTURE_POINTER SmbiosTable,\r
283 IN SMBIOS_TABLE_STRING String\r
284 )\r
285{\r
286 CHAR8 *AString;\r
287 UINT8 Index;\r
288\r
289 Index = 1;\r
290 AString = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);\r
291 while (Index != String) {\r
292 while (*AString != 0) {\r
293 AString ++;\r
294 }\r
295 AString ++;\r
296 if (*AString == 0) {\r
297 return AString;\r
298 }\r
299 Index ++;\r
300 }\r
301\r
302 return AString;\r
303}\r
304\r
305\r
306/**\r
307 Logs SMBIOS record.\r
308\r
309 @param Smbios Pointer to SMBIOS protocol instance.\r
310 @param Buffer Pointer to the data buffer.\r
311\r
312**/\r
313VOID\r
314LogSmbiosData (\r
315 IN EFI_SMBIOS_PROTOCOL *Smbios,\r
316 IN UINT8 *Buffer\r
317 )\r
318{\r
319 EFI_STATUS Status;\r
320 EFI_SMBIOS_HANDLE SmbiosHandle;\r
321 \r
979a00fa 322 SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;\r
21020c7c 323 Status = Smbios->Add (\r
324 Smbios,\r
325 NULL,\r
326 &SmbiosHandle,\r
327 (EFI_SMBIOS_TABLE_HEADER*)Buffer\r
328 );\r
329 ASSERT_EFI_ERROR (Status);\r
330}\r