3 Copyright (c) 2009, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
20 #include "SmbiosGen.h"
21 EFI_HII_DATABASE_PROTOCOL
*gHiiDatabase
;
22 extern UINT8 SmbiosGenDxeStrings
[];
23 EFI_SMBIOS_PROTOCOL
*gSmbios
;
24 EFI_HII_HANDLE gStringHandle
;
27 GetSmbiosTablesFromHob (
31 EFI_PHYSICAL_ADDRESS
*Table
;
32 EFI_PEI_HOB_POINTERS GuidHob
;
36 GuidHob
.Raw
= GetHobList ();
37 GuidHob
.Raw
= GetNextGuidHob (&gEfiSmbiosTableGuid
, GuidHob
.Raw
);
38 if (GuidHob
.Raw
!= NULL
) {
39 Table
= GET_GUID_HOB_DATA (GuidHob
.Guid
);
41 return (VOID
*)(UINTN
)*Table
;
50 InstallProcessorSmbios (
54 SMBIOS_STRUCTURE_POINTER SmbiosTable
;
60 // Processor info (TYPE 4)
62 SmbiosTable
= GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT
*)Smbios
, 4, 0);
63 if (SmbiosTable
.Raw
== NULL
) {
64 DEBUG ((EFI_D_ERROR
, "SmbiosTable: Type 4 (Processor Info) not found!\n"));
69 // Log Smbios Record Type4
71 LogSmbiosData(gSmbios
,(UINT8
*)SmbiosTable
.Type4
);
74 // Set ProcessorVersion string
76 AString
= GetSmbiosString (SmbiosTable
, SmbiosTable
.Type4
->ProcessorVersion
);
77 UString
= AllocateZeroPool ((AsciiStrLen(AString
) + 1) * sizeof(CHAR16
));
78 ASSERT (UString
!= NULL
);
79 AsciiStrToUnicodeStr (AString
, UString
);
81 Token
= HiiSetString (gStringHandle
, 0, UString
, NULL
);
83 gBS
->FreePool (UString
);
86 gBS
->FreePool (UString
);
103 SMBIOS_STRUCTURE_POINTER SmbiosTable
;
106 // Generate Memory Array Mapped Address info (TYPE 19)
108 SmbiosTable
= GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT
*)Smbios
, 19, 0);
109 if (SmbiosTable
.Raw
== NULL
) {
110 DEBUG ((EFI_D_ERROR
, "SmbiosTable: Type 19 (Memory Array Mapped Address Info) not found!\n"));
115 // Record Smbios Type 19
117 LogSmbiosData(gSmbios
, (UINT8
*)SmbiosTable
.Type19
);
126 SMBIOS_STRUCTURE_POINTER SmbiosTable
;
132 // BIOS information (TYPE 0)
134 SmbiosTable
= GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT
*)Smbios
, 0, 0);
135 if (SmbiosTable
.Raw
== NULL
) {
136 DEBUG ((EFI_D_ERROR
, "SmbiosTable: Type 0 (BIOS Information) not found!\n"));
143 AString
= GetSmbiosString (SmbiosTable
, SmbiosTable
.Type0
->BiosVersion
);
144 UString
= AllocateZeroPool ((AsciiStrLen(AString
) + 1) * sizeof(CHAR16
) + sizeof(FIRMWARE_BIOS_VERSIONE
));
145 ASSERT (UString
!= NULL
);
146 CopyMem (UString
, FIRMWARE_BIOS_VERSIONE
, sizeof(FIRMWARE_BIOS_VERSIONE
));
147 AsciiStrToUnicodeStr (AString
, UString
+ sizeof(FIRMWARE_BIOS_VERSIONE
) / sizeof(CHAR16
) - 1);
149 Token
= HiiSetString (gStringHandle
, 0, UString
, NULL
);
151 gBS
->FreePool (UString
);
154 gBS
->FreePool (UString
);
159 LogSmbiosData(gSmbios
, (UINT8
*)SmbiosTable
.Type0
);
162 // System information (TYPE 1)
164 SmbiosTable
= GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT
*)Smbios
, 1, 0);
165 if (SmbiosTable
.Raw
== NULL
) {
166 DEBUG ((EFI_D_ERROR
, "SmbiosTable: Type 1 (System Information) not found!\n"));
173 AString
= GetSmbiosString (SmbiosTable
, SmbiosTable
.Type1
->ProductName
);
174 UString
= AllocateZeroPool ((AsciiStrLen(AString
) + 1) * sizeof(CHAR16
) + sizeof(FIRMWARE_PRODUCT_NAME
));
175 ASSERT (UString
!= NULL
);
176 CopyMem (UString
, FIRMWARE_PRODUCT_NAME
, sizeof(FIRMWARE_PRODUCT_NAME
));
177 AsciiStrToUnicodeStr (AString
, UString
+ sizeof(FIRMWARE_PRODUCT_NAME
) / sizeof(CHAR16
) - 1);
179 Token
= HiiSetString (gStringHandle
, 0, UString
, NULL
);
181 gBS
->FreePool (UString
);
184 gBS
->FreePool (UString
);
189 LogSmbiosData(gSmbios
, (UINT8
*)SmbiosTable
.Type1
);
196 SmbiosGenEntrypoint (
197 IN EFI_HANDLE ImageHandle
,
198 IN EFI_SYSTEM_TABLE
*SystemTable
204 Smbios
= GetSmbiosTablesFromHob ();
205 if (Smbios
== NULL
) {
206 return EFI_NOT_FOUND
;
209 Status
= gBS
->LocateProtocol (
210 &gEfiSmbiosProtocolGuid
,
214 if (EFI_ERROR (Status
)) {
218 Status
= gBS
->LocateProtocol (
219 &gEfiHiiDatabaseProtocolGuid
,
221 (VOID
**)&gHiiDatabase
224 if (EFI_ERROR (Status
)) {
228 gStringHandle
= HiiAddPackages (
234 ASSERT (gStringHandle
!= NULL
);
236 InstallProcessorSmbios (Smbios
);
237 InstallCacheSmbios (Smbios
);
238 InstallMemorySmbios (Smbios
);
239 InstallMiscSmbios (Smbios
);
250 IN SMBIOS_STRUCTURE_POINTER SmbiosTable
256 AChar
= (CHAR8
*)(SmbiosTable
.Raw
+ SmbiosTable
.Hdr
->Length
);
257 while ((*AChar
!= 0) || (*(AChar
+ 1) != 0)) {
260 Length
= ((UINTN
)AChar
- (UINTN
)SmbiosTable
.Raw
+ 2);
265 SMBIOS_STRUCTURE_POINTER
266 GetSmbiosTableFromType (
267 IN SMBIOS_TABLE_ENTRY_POINT
*Smbios
,
272 SMBIOS_STRUCTURE_POINTER SmbiosTable
;
273 UINTN SmbiosTypeIndex
;
276 SmbiosTable
.Raw
= (UINT8
*)(UINTN
)Smbios
->TableAddress
;
277 if (SmbiosTable
.Raw
== NULL
) {
280 while ((SmbiosTypeIndex
!= Index
) || (SmbiosTable
.Hdr
->Type
!= Type
)) {
281 if (SmbiosTable
.Hdr
->Type
== 127) {
282 SmbiosTable
.Raw
= NULL
;
285 if (SmbiosTable
.Hdr
->Type
== Type
) {
288 SmbiosTable
.Raw
= (UINT8
*)(SmbiosTable
.Raw
+ SmbiosTableLength (SmbiosTable
));
296 IN SMBIOS_STRUCTURE_POINTER SmbiosTable
,
297 IN SMBIOS_TABLE_STRING String
304 AString
= (CHAR8
*)(SmbiosTable
.Raw
+ SmbiosTable
.Hdr
->Length
);
305 while (Index
!= String
) {
306 while (*AString
!= 0) {
323 @param Smbios Pointer to SMBIOS protocol instance.
324 @param Buffer Pointer to the data buffer.
329 IN EFI_SMBIOS_PROTOCOL
*Smbios
,
334 EFI_SMBIOS_HANDLE SmbiosHandle
;
337 Status
= Smbios
->Add (
341 (EFI_SMBIOS_TABLE_HEADER
*)Buffer
343 ASSERT_EFI_ERROR (Status
);