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