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 extern UINT8 SmbiosGenDxeStrings
[];
22 EFI_SMBIOS_PROTOCOL
*gSmbios
;
23 EFI_HII_HANDLE gStringHandle
;
26 GetSmbiosTablesFromHob (
30 EFI_PHYSICAL_ADDRESS
*Table
;
31 EFI_PEI_HOB_POINTERS GuidHob
;
33 GuidHob
.Raw
= GetFirstGuidHob (&gEfiSmbiosTableGuid
);
34 if (GuidHob
.Raw
!= NULL
) {
35 Table
= GET_GUID_HOB_DATA (GuidHob
.Guid
);
37 return (VOID
*)(UINTN
)*Table
;
46 InstallProcessorSmbios (
50 SMBIOS_STRUCTURE_POINTER SmbiosTable
;
56 // Processor info (TYPE 4)
58 SmbiosTable
= GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT
*)Smbios
, 4, 0);
59 if (SmbiosTable
.Raw
== NULL
) {
60 DEBUG ((EFI_D_ERROR
, "SmbiosTable: Type 4 (Processor Info) not found!\n"));
65 // Log Smbios Record Type4
67 LogSmbiosData(gSmbios
,(UINT8
*)SmbiosTable
.Type4
);
70 // Set ProcessorVersion string
72 AString
= GetSmbiosString (SmbiosTable
, SmbiosTable
.Type4
->ProcessorVersion
);
73 UString
= AllocateZeroPool ((AsciiStrLen(AString
) + 1) * sizeof(CHAR16
));
74 ASSERT (UString
!= NULL
);
75 AsciiStrToUnicodeStr (AString
, UString
);
77 Token
= HiiSetString (gStringHandle
, 0, UString
, NULL
);
79 gBS
->FreePool (UString
);
82 gBS
->FreePool (UString
);
99 SMBIOS_STRUCTURE_POINTER SmbiosTable
;
102 // Generate Memory Array Mapped Address info (TYPE 19)
104 SmbiosTable
= GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT
*)Smbios
, 19, 0);
105 if (SmbiosTable
.Raw
== NULL
) {
106 DEBUG ((EFI_D_ERROR
, "SmbiosTable: Type 19 (Memory Array Mapped Address Info) not found!\n"));
111 // Record Smbios Type 19
113 LogSmbiosData(gSmbios
, (UINT8
*)SmbiosTable
.Type19
);
122 SMBIOS_STRUCTURE_POINTER SmbiosTable
;
128 // BIOS information (TYPE 0)
130 SmbiosTable
= GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT
*)Smbios
, 0, 0);
131 if (SmbiosTable
.Raw
== NULL
) {
132 DEBUG ((EFI_D_ERROR
, "SmbiosTable: Type 0 (BIOS Information) not found!\n"));
139 AString
= GetSmbiosString (SmbiosTable
, SmbiosTable
.Type0
->BiosVersion
);
140 UString
= AllocateZeroPool ((AsciiStrLen(AString
) + 1) * sizeof(CHAR16
) + sizeof(FIRMWARE_BIOS_VERSIONE
));
141 ASSERT (UString
!= NULL
);
142 CopyMem (UString
, FIRMWARE_BIOS_VERSIONE
, sizeof(FIRMWARE_BIOS_VERSIONE
));
143 AsciiStrToUnicodeStr (AString
, UString
+ sizeof(FIRMWARE_BIOS_VERSIONE
) / sizeof(CHAR16
) - 1);
145 Token
= HiiSetString (gStringHandle
, 0, UString
, NULL
);
147 gBS
->FreePool (UString
);
150 gBS
->FreePool (UString
);
155 LogSmbiosData(gSmbios
, (UINT8
*)SmbiosTable
.Type0
);
158 // System information (TYPE 1)
160 SmbiosTable
= GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT
*)Smbios
, 1, 0);
161 if (SmbiosTable
.Raw
== NULL
) {
162 DEBUG ((EFI_D_ERROR
, "SmbiosTable: Type 1 (System Information) not found!\n"));
169 AString
= GetSmbiosString (SmbiosTable
, SmbiosTable
.Type1
->ProductName
);
170 UString
= AllocateZeroPool ((AsciiStrLen(AString
) + 1) * sizeof(CHAR16
) + sizeof(FIRMWARE_PRODUCT_NAME
));
171 ASSERT (UString
!= NULL
);
172 CopyMem (UString
, FIRMWARE_PRODUCT_NAME
, sizeof(FIRMWARE_PRODUCT_NAME
));
173 AsciiStrToUnicodeStr (AString
, UString
+ sizeof(FIRMWARE_PRODUCT_NAME
) / sizeof(CHAR16
) - 1);
175 Token
= HiiSetString (gStringHandle
, 0, UString
, NULL
);
177 gBS
->FreePool (UString
);
180 gBS
->FreePool (UString
);
185 LogSmbiosData(gSmbios
, (UINT8
*)SmbiosTable
.Type1
);
192 SmbiosGenEntrypoint (
193 IN EFI_HANDLE ImageHandle
,
194 IN EFI_SYSTEM_TABLE
*SystemTable
200 Smbios
= GetSmbiosTablesFromHob ();
201 if (Smbios
== NULL
) {
202 return EFI_NOT_FOUND
;
205 Status
= gBS
->LocateProtocol (
206 &gEfiSmbiosProtocolGuid
,
210 if (EFI_ERROR (Status
)) {
214 gStringHandle
= HiiAddPackages (
220 ASSERT (gStringHandle
!= NULL
);
222 InstallProcessorSmbios (Smbios
);
223 InstallCacheSmbios (Smbios
);
224 InstallMemorySmbios (Smbios
);
225 InstallMiscSmbios (Smbios
);
236 IN SMBIOS_STRUCTURE_POINTER SmbiosTable
242 AChar
= (CHAR8
*)(SmbiosTable
.Raw
+ SmbiosTable
.Hdr
->Length
);
243 while ((*AChar
!= 0) || (*(AChar
+ 1) != 0)) {
246 Length
= ((UINTN
)AChar
- (UINTN
)SmbiosTable
.Raw
+ 2);
251 SMBIOS_STRUCTURE_POINTER
252 GetSmbiosTableFromType (
253 IN SMBIOS_TABLE_ENTRY_POINT
*Smbios
,
258 SMBIOS_STRUCTURE_POINTER SmbiosTable
;
259 UINTN SmbiosTypeIndex
;
262 SmbiosTable
.Raw
= (UINT8
*)(UINTN
)Smbios
->TableAddress
;
263 if (SmbiosTable
.Raw
== NULL
) {
266 while ((SmbiosTypeIndex
!= Index
) || (SmbiosTable
.Hdr
->Type
!= Type
)) {
267 if (SmbiosTable
.Hdr
->Type
== 127) {
268 SmbiosTable
.Raw
= NULL
;
271 if (SmbiosTable
.Hdr
->Type
== Type
) {
274 SmbiosTable
.Raw
= (UINT8
*)(SmbiosTable
.Raw
+ SmbiosTableLength (SmbiosTable
));
282 IN SMBIOS_STRUCTURE_POINTER SmbiosTable
,
283 IN SMBIOS_TABLE_STRING String
290 AString
= (CHAR8
*)(SmbiosTable
.Raw
+ SmbiosTable
.Hdr
->Length
);
291 while (Index
!= String
) {
292 while (*AString
!= 0) {
309 @param Smbios Pointer to SMBIOS protocol instance.
310 @param Buffer Pointer to the data buffer.
315 IN EFI_SMBIOS_PROTOCOL
*Smbios
,
320 EFI_SMBIOS_HANDLE SmbiosHandle
;
322 SmbiosHandle
= SMBIOS_HANDLE_PI_RESERVED
;
323 Status
= Smbios
->Add (
327 (EFI_SMBIOS_TABLE_HEADER
*)Buffer
329 ASSERT_EFI_ERROR (Status
);