3 Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>
4 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
;
34 GuidHob
.Raw
= GetFirstGuidHob (&gEfiSmbiosTableGuid
);
35 if (GuidHob
.Raw
!= NULL
) {
36 Table
= GET_GUID_HOB_DATA (GuidHob
.Guid
);
38 return (VOID
*)(UINTN
)*Table
;
47 InstallProcessorSmbios (
51 SMBIOS_STRUCTURE_POINTER SmbiosTable
;
57 // Processor info (TYPE 4)
59 SmbiosTable
= GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT
*)Smbios
, 4, 0);
60 if (SmbiosTable
.Raw
== NULL
) {
61 DEBUG ((EFI_D_ERROR
, "SmbiosTable: Type 4 (Processor Info) not found!\n"));
66 // Log Smbios Record Type4
68 LogSmbiosData(gSmbios
,(UINT8
*)SmbiosTable
.Type4
);
71 // Set ProcessorVersion string
73 AString
= GetSmbiosString (SmbiosTable
, SmbiosTable
.Type4
->ProcessorVersion
);
74 UString
= AllocateZeroPool ((AsciiStrLen(AString
) + 1) * sizeof(CHAR16
));
75 ASSERT (UString
!= NULL
);
76 AsciiStrToUnicodeStr (AString
, UString
);
78 Token
= HiiSetString (gStringHandle
, 0, UString
, NULL
);
80 gBS
->FreePool (UString
);
83 gBS
->FreePool (UString
);
100 SMBIOS_STRUCTURE_POINTER SmbiosTable
;
103 // Generate Memory Array Mapped Address info (TYPE 19)
105 SmbiosTable
= GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT
*)Smbios
, 19, 0);
106 if (SmbiosTable
.Raw
== NULL
) {
107 DEBUG ((EFI_D_ERROR
, "SmbiosTable: Type 19 (Memory Array Mapped Address Info) not found!\n"));
112 // Record Smbios Type 19
114 LogSmbiosData(gSmbios
, (UINT8
*)SmbiosTable
.Type19
);
123 SMBIOS_STRUCTURE_POINTER SmbiosTable
;
129 // BIOS information (TYPE 0)
131 SmbiosTable
= GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT
*)Smbios
, 0, 0);
132 if (SmbiosTable
.Raw
== NULL
) {
133 DEBUG ((EFI_D_ERROR
, "SmbiosTable: Type 0 (BIOS Information) not found!\n"));
140 AString
= GetSmbiosString (SmbiosTable
, SmbiosTable
.Type0
->BiosVersion
);
141 UString
= AllocateZeroPool ((AsciiStrLen(AString
) + 1) * sizeof(CHAR16
) + sizeof(FIRMWARE_BIOS_VERSIONE
));
142 ASSERT (UString
!= NULL
);
143 CopyMem (UString
, FIRMWARE_BIOS_VERSIONE
, sizeof(FIRMWARE_BIOS_VERSIONE
));
144 AsciiStrToUnicodeStr (AString
, UString
+ sizeof(FIRMWARE_BIOS_VERSIONE
) / sizeof(CHAR16
) - 1);
146 Token
= HiiSetString (gStringHandle
, 0, UString
, NULL
);
148 gBS
->FreePool (UString
);
151 gBS
->FreePool (UString
);
156 LogSmbiosData(gSmbios
, (UINT8
*)SmbiosTable
.Type0
);
159 // System information (TYPE 1)
161 SmbiosTable
= GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT
*)Smbios
, 1, 0);
162 if (SmbiosTable
.Raw
== NULL
) {
163 DEBUG ((EFI_D_ERROR
, "SmbiosTable: Type 1 (System Information) not found!\n"));
170 AString
= GetSmbiosString (SmbiosTable
, SmbiosTable
.Type1
->ProductName
);
171 UString
= AllocateZeroPool ((AsciiStrLen(AString
) + 1) * sizeof(CHAR16
) + sizeof(FIRMWARE_PRODUCT_NAME
));
172 ASSERT (UString
!= NULL
);
173 CopyMem (UString
, FIRMWARE_PRODUCT_NAME
, sizeof(FIRMWARE_PRODUCT_NAME
));
174 AsciiStrToUnicodeStr (AString
, UString
+ sizeof(FIRMWARE_PRODUCT_NAME
) / sizeof(CHAR16
) - 1);
176 Token
= HiiSetString (gStringHandle
, 0, UString
, NULL
);
178 gBS
->FreePool (UString
);
181 gBS
->FreePool (UString
);
186 LogSmbiosData(gSmbios
, (UINT8
*)SmbiosTable
.Type1
);
193 SmbiosGenEntrypoint (
194 IN EFI_HANDLE ImageHandle
,
195 IN EFI_SYSTEM_TABLE
*SystemTable
201 Smbios
= GetSmbiosTablesFromHob ();
202 if (Smbios
== NULL
) {
203 return EFI_NOT_FOUND
;
206 Status
= gBS
->LocateProtocol (
207 &gEfiSmbiosProtocolGuid
,
211 if (EFI_ERROR (Status
)) {
215 Status
= gBS
->LocateProtocol (
216 &gEfiHiiDatabaseProtocolGuid
,
218 (VOID
**)&gHiiDatabase
221 if (EFI_ERROR (Status
)) {
225 gStringHandle
= HiiAddPackages (
231 ASSERT (gStringHandle
!= NULL
);
233 InstallProcessorSmbios (Smbios
);
234 InstallCacheSmbios (Smbios
);
235 InstallMemorySmbios (Smbios
);
236 InstallMiscSmbios (Smbios
);
247 IN SMBIOS_STRUCTURE_POINTER SmbiosTable
253 AChar
= (CHAR8
*)(SmbiosTable
.Raw
+ SmbiosTable
.Hdr
->Length
);
254 while ((*AChar
!= 0) || (*(AChar
+ 1) != 0)) {
257 Length
= ((UINTN
)AChar
- (UINTN
)SmbiosTable
.Raw
+ 2);
262 SMBIOS_STRUCTURE_POINTER
263 GetSmbiosTableFromType (
264 IN SMBIOS_TABLE_ENTRY_POINT
*Smbios
,
269 SMBIOS_STRUCTURE_POINTER SmbiosTable
;
270 UINTN SmbiosTypeIndex
;
273 SmbiosTable
.Raw
= (UINT8
*)(UINTN
)Smbios
->TableAddress
;
274 if (SmbiosTable
.Raw
== NULL
) {
277 while ((SmbiosTypeIndex
!= Index
) || (SmbiosTable
.Hdr
->Type
!= Type
)) {
278 if (SmbiosTable
.Hdr
->Type
== 127) {
279 SmbiosTable
.Raw
= NULL
;
282 if (SmbiosTable
.Hdr
->Type
== Type
) {
285 SmbiosTable
.Raw
= (UINT8
*)(SmbiosTable
.Raw
+ SmbiosTableLength (SmbiosTable
));
293 IN SMBIOS_STRUCTURE_POINTER SmbiosTable
,
294 IN SMBIOS_TABLE_STRING String
301 AString
= (CHAR8
*)(SmbiosTable
.Raw
+ SmbiosTable
.Hdr
->Length
);
302 while (Index
!= String
) {
303 while (*AString
!= 0) {
320 @param Smbios Pointer to SMBIOS protocol instance.
321 @param Buffer Pointer to the data buffer.
326 IN EFI_SMBIOS_PROTOCOL
*Smbios
,
331 EFI_SMBIOS_HANDLE SmbiosHandle
;
333 SmbiosHandle
= SMBIOS_HANDLE_PI_RESERVED
;
334 Status
= Smbios
->Add (
338 (EFI_SMBIOS_TABLE_HEADER
*)Buffer
340 ASSERT_EFI_ERROR (Status
);