mirror of https://github.com/acidanthera/audk.git
374 lines
9.3 KiB
C
374 lines
9.3 KiB
C
/** @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;
|
|
}
|