/** @file This code supports the implementation of the Smbios protocol Copyright (c) 2009 - 2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef _SMBIOS_DXE_H_ #define _SMBIOS_DXE_H_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define SMBIOS_INSTANCE_SIGNATURE SIGNATURE_32 ('S', 'B', 'i', 's') typedef struct { UINT32 Signature; EFI_HANDLE Handle; // // Produced protocol // EFI_SMBIOS_PROTOCOL Smbios; // // Updates to record list must be locked. // EFI_LOCK DataLock; // // List of EFI_SMBIOS_ENTRY structures. // LIST_ENTRY DataListHead; // // List of allocated SMBIOS handle. // LIST_ENTRY AllocatedHandleListHead; } SMBIOS_INSTANCE; #define SMBIOS_INSTANCE_FROM_THIS(this) CR (this, SMBIOS_INSTANCE, Smbios, SMBIOS_INSTANCE_SIGNATURE) // // SMBIOS record Header // // An SMBIOS internal Record is an EFI_SMBIOS_RECORD_HEADER followed by (RecordSize - HeaderSize) bytes of // data. The format of the data is defined by the SMBIOS spec. // // #define EFI_SMBIOS_RECORD_HEADER_VERSION 0x0100 typedef struct { UINT16 Version; UINT16 HeaderSize; UINTN RecordSize; EFI_HANDLE ProducerHandle; UINTN NumberOfStrings; } EFI_SMBIOS_RECORD_HEADER; // // Private data structure to contain the SMBIOS record. One record per // structure. SmbiosRecord is a copy of the data passed in and follows RecordHeader . // #define EFI_SMBIOS_ENTRY_SIGNATURE SIGNATURE_32 ('S', 'r', 'e', 'c') typedef struct { UINT32 Signature; LIST_ENTRY Link; EFI_SMBIOS_RECORD_HEADER *RecordHeader; UINTN RecordSize; // // Indicate which table this record is added to. // BOOLEAN Smbios32BitTable; BOOLEAN Smbios64BitTable; } EFI_SMBIOS_ENTRY; #define SMBIOS_ENTRY_FROM_LINK(link) CR (link, EFI_SMBIOS_ENTRY, Link, EFI_SMBIOS_ENTRY_SIGNATURE) // // Private data to contain the Smbios handle that already allocated. // #define SMBIOS_HANDLE_ENTRY_SIGNATURE SIGNATURE_32 ('S', 'h', 'r', 'd') typedef struct { UINT32 Signature; LIST_ENTRY Link; // // Filter driver will register what record guid filter should be used. // EFI_SMBIOS_HANDLE SmbiosHandle; } SMBIOS_HANDLE_ENTRY; #define SMBIOS_HANDLE_ENTRY_FROM_LINK(link) CR (link, SMBIOS_HANDLE_ENTRY, Link, SMBIOS_HANDLE_ENTRY_SIGNATURE) typedef struct { EFI_SMBIOS_TABLE_HEADER Header; UINT8 Tailing[2]; } EFI_SMBIOS_TABLE_END_STRUCTURE; /** Create Smbios Table and installs the Smbios Table to the System Table. @param Smbios32BitTable The flag to update 32-bit table. @param Smbios64BitTable The flag to update 64-bit table. **/ VOID EFIAPI SmbiosTableConstruction ( BOOLEAN Smbios32BitTable, BOOLEAN Smbios64BitTable ); /** Validates a SMBIOS 3.0 table entry point. @param TableEntry The SmBios table entry to validate. @param TableAddress On exit, point to the smbios table addres. @param TableMaximumSize On exit, point to the maximum size of the table. @retval TRUE SMBIOS table entry point is valid. @retval FALSE SMBIOS table entry point is malformed. **/ STATIC BOOLEAN IsValidSmbios30Table ( IN VOID *TableEntry, OUT VOID **TableAddress, OUT UINTN *TableMaximumSize, OUT UINT8 *MajorVersion, OUT UINT8 *MinorVersion ); /** Validates a SMBIOS 2.0 table entry point. @param TableEntry The SmBios table entry to validate. @param TableAddress On exit, point to the smbios table addres. @param TableMaximumSize On exit, point to the maximum size of the table. @retval TRUE SMBIOS table entry point is valid. @retval FALSE SMBIOS table entry point is malformed. **/ STATIC BOOLEAN IsValidSmbios20Table ( IN VOID *TableEntry, OUT VOID **TableAddress, OUT UINTN *TableMaximumSize, OUT UINT8 *MajorVersion, OUT UINT8 *MinorVersion ); /** Validates a SMBIOS table entry point. @param TableEntry The SmBios table entry to validate. @param TableAddress On exit, point to the smbios table addres. @param TableMaximumSize On exit, point to the maximum size of the table. @retval TRUE SMBIOS table entry point is valid. @retval FALSE SMBIOS table entry point is malformed. **/ typedef BOOLEAN (*IS_SMBIOS_TABLE_VALID) ( IN VOID *TableEntry, OUT VOID **TableAddress, OUT UINTN *TableMaximumSize, OUT UINT8 *MajorVersion, OUT UINT8 *MinorVersion ); typedef struct { EFI_GUID *Guid; IS_SMBIOS_TABLE_VALID IsValid; } IS_SMBIOS_TABLE_VALID_ENTRY; #endif