/** @file | |
API for SMBIOS table. | |
Copyright (c) 2005 - 2015, Intel Corporation. All rights reserved.<BR> | |
This program and the accompanying materials | |
are licensed and made available under the terms and conditions of the BSD License | |
which accompanies this distribution. The full text of the license may be found at | |
http://opensource.org/licenses/bsd-license.php | |
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
**/ | |
#include "../UefiShellDebug1CommandsLib.h" | |
#include <Guid/SmBios.h> | |
#include "LibSmbiosView.h" | |
#include "SmbiosView.h" | |
STATIC UINT8 mInit = 0; | |
STATIC UINT8 m64Init = 0; | |
STATIC SMBIOS_TABLE_ENTRY_POINT *mSmbiosTable = NULL; | |
STATIC SMBIOS_TABLE_3_0_ENTRY_POINT *mSmbios64BitTable = NULL; | |
STATIC SMBIOS_STRUCTURE_POINTER m_SmbiosStruct; | |
STATIC SMBIOS_STRUCTURE_POINTER *mSmbiosStruct = &m_SmbiosStruct; | |
STATIC SMBIOS_STRUCTURE_POINTER m_Smbios64BitStruct; | |
STATIC SMBIOS_STRUCTURE_POINTER *mSmbios64BitStruct = &m_Smbios64BitStruct; | |
/** | |
Init the SMBIOS VIEW API's environment. | |
@retval EFI_SUCCESS Successful to init the SMBIOS VIEW Lib. | |
**/ | |
EFI_STATUS | |
LibSmbiosInit ( | |
VOID | |
) | |
{ | |
EFI_STATUS Status; | |
// | |
// Init only once | |
// | |
if (mInit == 1) { | |
return EFI_SUCCESS; | |
} | |
// | |
// Get SMBIOS table from System Configure table | |
// | |
Status = GetSystemConfigurationTable (&gEfiSmbiosTableGuid, (VOID**)&mSmbiosTable); | |
if (mSmbiosTable == NULL) { | |
return EFI_NOT_FOUND; | |
} | |
if (EFI_ERROR (Status)) { | |
ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_LIBSMBIOSVIEW_GET_TABLE_ERROR), gShellDebug1HiiHandle, Status); | |
return Status; | |
} | |
// | |
// Init SMBIOS structure table address | |
// | |
mSmbiosStruct->Raw = (UINT8 *) (UINTN) (mSmbiosTable->TableAddress); | |
mInit = 1; | |
return EFI_SUCCESS; | |
} | |
/** | |
Init the SMBIOS VIEW API's environment. | |
@retval EFI_SUCCESS Successful to init the SMBIOS VIEW Lib. | |
**/ | |
EFI_STATUS | |
LibSmbios64BitInit ( | |
VOID | |
) | |
{ | |
EFI_STATUS Status; | |
// | |
// Init only once | |
// | |
if (m64Init == 1) { | |
return EFI_SUCCESS; | |
} | |
// | |
// Get SMBIOS table from System Configure table | |
// | |
Status = GetSystemConfigurationTable (&gEfiSmbios3TableGuid, (VOID**)&mSmbios64BitTable); | |
if (mSmbios64BitTable == NULL) { | |
return EFI_NOT_FOUND; | |
} | |
if (EFI_ERROR (Status)) { | |
ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_LIBSMBIOSVIEW_GET_TABLE_ERROR), gShellDebug1HiiHandle, Status); | |
return Status; | |
} | |
// | |
// Init SMBIOS structure table address | |
// | |
mSmbios64BitStruct->Raw = (UINT8 *) (UINTN) (mSmbios64BitTable->TableAddress); | |
m64Init = 1; | |
return EFI_SUCCESS; | |
} | |
/** | |
Cleanup the Smbios information. | |
**/ | |
VOID | |
LibSmbiosCleanup ( | |
VOID | |
) | |
{ | |
// | |
// Release resources | |
// | |
if (mSmbiosTable != NULL) { | |
mSmbiosTable = NULL; | |
} | |
mInit = 0; | |
} | |
/** | |
Cleanup the Smbios information. | |
**/ | |
VOID | |
LibSmbios64BitCleanup ( | |
VOID | |
) | |
{ | |
// | |
// Release resources | |
// | |
if (mSmbios64BitTable != NULL) { | |
mSmbios64BitTable = NULL; | |
} | |
m64Init = 0; | |
} | |
/** | |
Get the entry point structure for the table. | |
@param[out] EntryPointStructure The pointer to populate. | |
**/ | |
VOID | |
LibSmbiosGetEPS ( | |
OUT SMBIOS_TABLE_ENTRY_POINT **EntryPointStructure | |
) | |
{ | |
// | |
// return SMBIOS Table address | |
// | |
*EntryPointStructure = mSmbiosTable; | |
} | |
/** | |
Get the entry point structure for the table. | |
@param[out] EntryPointStructure The pointer to populate. | |
**/ | |
VOID | |
LibSmbios64BitGetEPS ( | |
OUT SMBIOS_TABLE_3_0_ENTRY_POINT **EntryPointStructure | |
) | |
{ | |
// | |
// return SMBIOS Table address | |
// | |
*EntryPointStructure = mSmbios64BitTable; | |
} | |
/** | |
Return SMBIOS string for the given string number. | |
@param[in] Smbios Pointer to SMBIOS structure. | |
@param[in] StringNumber String number to return. -1 is used to skip all strings and | |
point to the next SMBIOS structure. | |
@return Pointer to string, or pointer to next SMBIOS strcuture if StringNumber == -1 | |
**/ | |
CHAR8* | |
LibGetSmbiosString ( | |
IN SMBIOS_STRUCTURE_POINTER *Smbios, | |
IN UINT16 StringNumber | |
) | |
{ | |
UINT16 Index; | |
CHAR8 *String; | |
ASSERT (Smbios != NULL); | |
// | |
// Skip over formatted section | |
// | |
String = (CHAR8 *) (Smbios->Raw + Smbios->Hdr->Length); | |
// | |
// Look through unformated section | |
// | |
for (Index = 1; Index <= StringNumber; Index++) { | |
if (StringNumber == Index) { | |
return String; | |
} | |
// | |
// Skip string | |
// | |
for (; *String != 0; String++); | |
String++; | |
if (*String == 0) { | |
// | |
// If double NULL then we are done. | |
// Return pointer to next structure in Smbios. | |
// if you pass in a -1 you will always get here | |
// | |
Smbios->Raw = (UINT8 *)++String; | |
return NULL; | |
} | |
} | |
return NULL; | |
} | |
/** | |
Get SMBIOS structure for the given Handle, | |
Handle is changed to the next handle or 0xFFFF when the end is | |
reached or the handle is not found. | |
@param[in, out] Handle 0xFFFF: get the first structure | |
Others: get a structure according to this value. | |
@param[out] Buffer The pointer to the pointer to the structure. | |
@param[out] Length Length of the structure. | |
@retval DMI_SUCCESS Handle is updated with next structure handle or | |
0xFFFF(end-of-list). | |
@retval DMI_INVALID_HANDLE Handle is updated with first structure handle or | |
0xFFFF(end-of-list). | |
**/ | |
EFI_STATUS | |
LibGetSmbiosStructure ( | |
IN OUT UINT16 *Handle, | |
OUT UINT8 **Buffer, | |
OUT UINT16 *Length | |
) | |
{ | |
SMBIOS_STRUCTURE_POINTER Smbios; | |
SMBIOS_STRUCTURE_POINTER SmbiosEnd; | |
UINT8 *Raw; | |
if (*Handle == INVALID_HANDLE) { | |
*Handle = mSmbiosStruct->Hdr->Handle; | |
return DMI_INVALID_HANDLE; | |
} | |
if ((Buffer == NULL) || (Length == NULL)) { | |
ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_LIBSMBIOSVIEW_NO_BUFF_LEN_SPEC), gShellDebug1HiiHandle); | |
return DMI_INVALID_HANDLE; | |
} | |
*Length = 0; | |
Smbios.Hdr = mSmbiosStruct->Hdr; | |
SmbiosEnd.Raw = Smbios.Raw + mSmbiosTable->TableLength; | |
while (Smbios.Raw < SmbiosEnd.Raw) { | |
if (Smbios.Hdr->Handle == *Handle) { | |
Raw = Smbios.Raw; | |
// | |
// Walk to next structure | |
// | |
LibGetSmbiosString (&Smbios, (UINT16) (-1)); | |
// | |
// Length = Next structure head - this structure head | |
// | |
*Length = (UINT16) (Smbios.Raw - Raw); | |
*Buffer = Raw; | |
// | |
// update with the next structure handle. | |
// | |
if (Smbios.Raw < SmbiosEnd.Raw) { | |
*Handle = Smbios.Hdr->Handle; | |
} else { | |
*Handle = INVALID_HANDLE; | |
} | |
return DMI_SUCCESS; | |
} | |
// | |
// Walk to next structure | |
// | |
LibGetSmbiosString (&Smbios, (UINT16) (-1)); | |
} | |
*Handle = INVALID_HANDLE; | |
return DMI_INVALID_HANDLE; | |
} | |
/** | |
Get SMBIOS structure for the given Handle, | |
Handle is changed to the next handle or 0xFFFF when the end is | |
reached or the handle is not found. | |
@param[in, out] Handle 0xFFFF: get the first structure | |
Others: get a structure according to this value. | |
@param[out] Buffer The pointer to the pointer to the structure. | |
@param[out] Length Length of the structure. | |
@retval DMI_SUCCESS Handle is updated with next structure handle or | |
0xFFFF(end-of-list). | |
@retval DMI_INVALID_HANDLE Handle is updated with first structure handle or | |
0xFFFF(end-of-list). | |
**/ | |
EFI_STATUS | |
LibGetSmbios64BitStructure ( | |
IN OUT UINT16 *Handle, | |
OUT UINT8 **Buffer, | |
OUT UINT16 *Length | |
) | |
{ | |
SMBIOS_STRUCTURE_POINTER Smbios; | |
SMBIOS_STRUCTURE_POINTER SmbiosEnd; | |
UINT8 *Raw; | |
if (*Handle == INVALID_HANDLE) { | |
*Handle = mSmbios64BitStruct->Hdr->Handle; | |
return DMI_INVALID_HANDLE; | |
} | |
if ((Buffer == NULL) || (Length == NULL)) { | |
ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_LIBSMBIOSVIEW_NO_BUFF_LEN_SPEC), gShellDebug1HiiHandle); | |
return DMI_INVALID_HANDLE; | |
} | |
*Length = 0; | |
Smbios.Hdr = mSmbios64BitStruct->Hdr; | |
SmbiosEnd.Raw = Smbios.Raw + mSmbios64BitTableLength; | |
while (Smbios.Raw < SmbiosEnd.Raw) { | |
if (Smbios.Hdr->Handle == *Handle) { | |
Raw = Smbios.Raw; | |
// | |
// Walk to next structure | |
// | |
LibGetSmbiosString (&Smbios, (UINT16) (-1)); | |
// | |
// Length = Next structure head - this structure head | |
// | |
*Length = (UINT16) (Smbios.Raw - Raw); | |
*Buffer = Raw; | |
// | |
// update with the next structure handle. | |
// | |
if (Smbios.Raw < SmbiosEnd.Raw) { | |
*Handle = Smbios.Hdr->Handle; | |
} else { | |
*Handle = INVALID_HANDLE; | |
} | |
return DMI_SUCCESS; | |
} | |
// | |
// Walk to next structure | |
// | |
LibGetSmbiosString (&Smbios, (UINT16) (-1)); | |
} | |
*Handle = INVALID_HANDLE; | |
return DMI_INVALID_HANDLE; | |
} |