2020-01-18 09:38:21 +01:00
/*
2020-03-06 16:55:17 +02:00
* Copyright ( c ) 2020 , Liav A . < liavalb @ hotmail . co . il >
2020-01-18 09:38:21 +01:00
* All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions are met :
*
* 1. Redistributions of source code must retain the above copyright notice , this
* list of conditions and the following disclaimer .
*
* 2. Redistributions in binary form must reproduce the above copyright notice ,
* this list of conditions and the following disclaimer in the documentation
* and / or other materials provided with the distribution .
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS " AS IS "
* AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL
* DAMAGES ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY ,
* OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*/
2019-12-31 13:02:21 +02:00
# pragma once
2020-02-16 01:33:41 +01:00
# include <AK/SinglyLinkedList.h>
2019-12-31 13:02:21 +02:00
# include <AK/Types.h>
# include <AK/Vector.h>
# include <Kernel/VM/Region.h>
2020-02-09 18:15:58 +02:00
# include <LibBareMetal/Memory/PhysicalAddress.h>
# include <LibBareMetal/Memory/VirtualAddress.h>
2019-12-31 13:02:21 +02:00
2020-02-16 01:27:42 +01:00
namespace Kernel {
2019-12-31 13:02:21 +02:00
namespace SMBIOS {
2020-03-22 13:12:45 +13:00
struct [ [ gnu : : packed ] ] LegacyEntryPoint32bit
{
char legacy_sig [ 5 ] ;
u8 checksum2 ;
u16 smboios_table_length ;
u32 smbios_table_ptr ;
u16 smbios_tables_count ;
u8 smbios_bcd_revision ;
} ;
struct [ [ gnu : : packed ] ] EntryPoint32bit
{
char sig [ 4 ] ;
u8 checksum ;
u8 length ;
u8 major_version ;
u8 minor_version ;
u16 maximum_structure_size ;
u8 implementation_revision ;
char formatted_area [ 5 ] ;
LegacyEntryPoint32bit legacy_structure ;
} ;
struct [ [ gnu : : packed ] ] EntryPoint64bit
{
char sig [ 5 ] ;
u8 checksum ;
u8 length ;
u8 major_version ;
u8 minor_version ;
u8 document_revision ;
u8 revision ;
u8 reserved ;
u32 table_maximum_size ;
u64 table_ptr ;
} ;
struct [ [ gnu : : packed ] ] TableHeader
{
u8 type ;
u8 length ;
u16 handle ;
} ;
enum class TableType {
BIOSInfo = 0 ,
SysInfo = 1 ,
ModuleInfo = 2 ,
SysEnclosure = 3 ,
ProcessorInfo = 4 ,
CacheInfo = 7 ,
PortConnectorInfo = 8 ,
SystemSlots = 9 ,
OEMStrings = 11 ,
SysConfigOptions = 12 ,
BIOSLanguageInfo = 13 ,
GroupAssociations = 14 ,
SysEventLog = 15 ,
PhysicalMemoryArray = 16 ,
MemoryDevice = 17 ,
MemoryErrorInfo32Bit = 18 ,
MemoryArrayMappedAddress = 19 ,
MemoryDeviceMappedAddress = 20 ,
BuiltinPointingDevice = 21 ,
PortableBattery = 22 ,
SysReset = 23 ,
HardwareSecurity = 24 ,
SysPowerControls = 25 ,
VoltageProbe = 26 ,
CoolingDevice = 27 ,
TemperatureProbe = 28 ,
ElectricalCurrentProbe = 29 ,
OutOfBandRemoteAccess = 30 ,
SystemBootInfo = 32 ,
MemoryErrorInfo64Bit = 33 ,
ManagementDevice = 34 ,
ManagementDeviceComponent = 35 ,
ManagementDeviceThresholdData = 36 ,
MemoryChannel = 37 ,
IPMIDeviceInfo = 38 ,
SysPowerSupply = 39 ,
AdditionalInfo = 40 ,
OnboardDevicesExtendedInfo = 41 ,
ManagementControllerHostInterface = 42 ,
TPMDevice = 43 ,
ProcessorAdditionalInfo = 44 ,
Inactive = 126 ,
EndOfTable = 127
} ;
struct [ [ gnu : : packed ] ] BIOSInfo
{ // Type 0
TableHeader h ;
u8 bios_vendor_str_number ;
u8 bios_version_str_number ;
u16 bios_segment ;
u8 bios_release_date_str_number ;
u8 bios_rom_size ;
u64 bios_characteristics ;
u8 ext_bios_characteristics [ ] ;
} ;
enum class BIOSCharacteristics {
Unknown = ( 1 < < 2 ) ,
NotSupported = ( 1 < < 3 ) ,
ISA_support = ( 1 < < 4 ) ,
MCA_support = ( 1 < < 5 ) ,
EISA_support = ( 1 < < 6 ) ,
PCI_support = ( 1 < < 7 ) ,
PCMCIA_support = ( 1 < < 8 ) ,
PnP_support = ( 1 < < 9 ) ,
APM_support = ( 1 < < 10 ) ,
UpgradeableBIOS = ( 1 < < 11 ) ,
Shadowing_BIOS = ( 1 < < 12 ) ,
VL_VESA_support = ( 1 < < 13 ) ,
ESCD_support = ( 1 < < 14 ) ,
CD_boot_support = ( 1 < < 15 ) ,
select_boot_support = ( 1 < < 16 ) ,
BIOS_ROM_socketed = ( 1 < < 17 ) ,
PCMCIA_boot_support = ( 1 < < 18 ) ,
EDD_spec_support = ( 1 < < 19 ) ,
floppy_nec98_1200k_support = ( 1 < < 20 ) ,
floppy_toshiba_1200k_support = ( 1 < < 21 ) ,
floppy_360k_support = ( 1 < < 22 ) ,
floppy_1200k_services_support = ( 1 < < 23 ) ,
floppy_720k_services_support = ( 1 < < 24 ) ,
floppy_2880k_services_support = ( 1 < < 25 ) ,
int5_print_screen_support = ( 1 < < 26 ) ,
int9_8042_keyboard_support = ( 1 < < 27 ) ,
int14_serial_support = ( 1 < < 28 ) ,
int17_printer_support = ( 1 < < 29 ) ,
int10_video_support = ( 1 < < 30 ) ,
nec_pc98 = ( 1 < < 31 )
} ;
struct [ [ gnu : : packed ] ] ExtBIOSInfo
{
u8 bios_major_release ;
u8 bios_minor_release ;
u8 embedded_controller_firmware_major_release ;
u8 embedded_controller_firmware_minor_release ;
u16 ext_bios_rom_size ;
} ;
struct [ [ gnu : : packed ] ] SysInfo
{ // Type 1
TableHeader h ;
u8 manufacturer_str_number ;
u8 product_name_str_number ;
u8 version_str_number ;
u8 serial_number_str_number ;
u64 uuid [ 2 ] ;
u8 wake_up_type ;
u8 sku_str_number ;
u8 family_str_number ;
} ;
enum class WakeUpType {
Reserved = 0 ,
Other = 1 ,
Unknown = 2 ,
APM_TIMER = 3 ,
MODEM_RING = 4 ,
LAN_REMOTE = 5 ,
POWER_SWTCH = 6 ,
PCI_PME = 7 ,
AC_RESTORE = 8 ,
} ;
struct [ [ gnu : : packed ] ] ModuleInfo
{ // Type 2
TableHeader h ;
u8 manufacturer_str_number ;
u8 product_name_str_number ;
u8 version_str_number ;
u8 serial_number_str_number ;
u8 asset_tag_str_number ;
u8 feature_flags ;
u8 chassis_location ;
u16 chassis_handle ;
u8 board_type ;
u8 contained_object_handles_count ;
u16 contained_object_handles [ ] ;
} ;
enum class BoardType {
Unkown = 0x1 ,
Other = 0x2 ,
Server_Blade = 0x3 ,
Connectivity_Switch = 0x4 ,
System_Management_Module = 0x5 ,
Processor_Module = 0x6 ,
IO_Module = 0x7 ,
Memory_Module = 0x8 ,
Daughter_Board = 0x9 ,
Motherboard = 0xA ,
Processor_Memory_Module = 0xB ,
Processor_IO_Module = 0xC ,
Interconnect_Board = 0xD ,
} ;
struct [ [ gnu : : packed ] ] SysEnclosure
{ // Type 3
TableHeader h ;
u8 manufacturer_str_number ;
u8 type ;
u8 version_str_number ;
u8 serial_number_str_number ;
u8 asset_tag_str_number ;
u8 boot_up_state ;
u8 power_supply_state ;
u8 thermal_state ;
u8 security_status ;
u32 vendor_specific_info ;
u8 height ;
u8 power_cords_number ;
u8 contained_element_count ;
u8 contained_element_record_length ;
} ;
struct [ [ gnu : : packed ] ] ExtSysEnclosure
{
u8 sku_str_number ;
} ;
enum class SysEnclosureType {
Other = 0x1 ,
Unknown = 0x2 ,
Desktop = 0x3 ,
Low_Profile_Desktop = 0x4 ,
Pizza_Box = 0x5 ,
Mini_Tower = 0x6 ,
Tower = 0x7 ,
Portable = 0x8 ,
Laptop = 0x9 ,
Notebook = 0xA ,
Hand_Held = 0xB ,
Docking_Station = 0xC ,
AIO = 0xD ,
Sub_Notebook = 0xE ,
Space_Saving = 0xF ,
Lunch_Box = 0x10 ,
Main_Server_Chassis = 0x11 ,
Expansion_Chassis = 0x12 ,
Sub_Chassis = 0x13 ,
Bus_Expansion_Chassis = 0x14 ,
Peripheral_Chassis = 0x15 ,
RAID_Chassis = 0x16 ,
Rack_MOunt_Chassis = 0x17 ,
Sealed_case_PC = 0x18 ,
Multi_System_Chasis = 0x19 ,
Compact_PCI = 0x1A ,
Advanced_TCA = 0x1B ,
Blade = 0x1C ,
Blade_Enclosure = 0x1D ,
Tablet = 0x1E ,
Convertible = 0x1F ,
Detachable = 0x20 ,
IoT_Gateway = 0x21 ,
Embedded_PC = 0x22 ,
Mini_PC = 0x23 ,
Stick_PC = 0x24 ,
} ;
enum class SysEnclosureState {
Other = 0x1 ,
Unknown = 0x2 ,
Safe = 0x3 ,
Warning = 0x4 ,
Critical = 0x5 ,
Non_Recoverable = 0x6 ,
} ;
enum class SysEnclosureSecurityStatus {
Other = 0x1 ,
Unknown = 0x2 ,
None = 0x3 ,
External_Interface_Locked_Out = 0x4 ,
External_Interface_Enabled = 0x5 ,
} ;
struct [ [ gnu : : packed ] ] SysEnclosureContainedElement
{
u8 type ;
u8 min_contained_element_count ;
u8 max_contained_element_count ;
} ;
struct [ [ gnu : : packed ] ] ProcessorInfo
{ // Type 4
TableHeader h ;
u8 socket_designation_str_number ;
u8 processor_type ;
u8 processor_family ;
u8 processor_manufacturer_str_number ;
u64 processor_id ;
u8 processor_version_str_number ;
u8 voltage ;
u16 external_clock ;
u16 max_speed ;
u16 current_speed ;
u8 status ;
u8 processor_upgrade ;
u16 l1_cache_handle ;
u16 l2_cache_handle ;
u16 l3_cache_handle ;
u8 serial_number_str_number ;
u8 asset_tag_str_number ;
u8 part_number_str_number ;
u8 core_count ;
u8 core_enabled ;
u8 thread_count ;
u16 processor_characteristics ;
u16 processor_family2 ;
u16 core_count2 ;
u16 core_enabled2 ;
u16 thread_count2 ;
} ;
enum class ProcessorType {
Other = 0x1 ,
Unknown = 0x2 ,
Central_Processor = 0x3 ,
Math_Processor = 0x4 ,
DSP_Processor = 0x5 ,
Video_Processor = 0x6 ,
} ;
enum class ProcessorUpgrade {
Other = 0x1 ,
Unknown = 0x2 ,
Daughter_Board = 0x3 ,
ZIF_Socket = 0x4 ,
Replaceable_Piggy_Back = 0x5 ,
None = 0x6 ,
LIF_Sokcet = 0x7 ,
Slot_1 = 0x8 ,
Slot_2 = 0x9 ,
Socket_370_pin = 0xA ,
Slot_A = 0xB ,
Slot_M = 0xC ,
Socket_423 = 0xD ,
Socket_A_462 = 0xE ,
Socket_478 = 0xF ,
Socket_754 = 0x10 ,
Socket_940 = 0x11 ,
Socket_939 = 0x12 ,
Socket_mPGA604 = 0x13 ,
Socket_LGA771 = 0x14 ,
Socket_LGA775 = 0x15 ,
Socket_S1 = 0x16 ,
Socket_AM2 = 0x17 ,
Socket_F_1207 = 0x18 ,
Socket_LGA1366 = 0x19 ,
Socket_G34 = 0x1A ,
Socket_AM3 = 0x1B ,
Socket_C32 = 0x1C ,
Socket_LGA1156 = 0x1D ,
Socket_LGA1567 = 0x1E ,
Socket_PGA988A = 0x1F ,
Socket_BGA1288 = 0x20 ,
Socket_rPGA988B = 0x21 ,
Socket_BGA1023 = 0x22 ,
Socket_BGA1224 = 0x23 ,
Socket_LGA1155 = 0x24 ,
Socket_LGA1356 = 0x25 ,
Socket_LGA2011 = 0x26 ,
Socket_FS1 = 0x27 ,
Socket_FS2 = 0x28 ,
Socket_FM1 = 0x29 ,
Socket_FM2 = 0x2A ,
Socket_LGA2011_3 = 0x2B ,
Socket_LGA1356_3 = 0x2C ,
Socket_LGA1150 = 0x2D ,
Socket_BGA1168 = 0x2E ,
Socket_BGA1234 = 0x2F ,
Socket_BGA1364 = 0x30 ,
Socket_AM4 = 0x31 ,
Socket_LGA1151 = 0x32 ,
Socket_BGA1356 = 0x33 ,
Socket_BGA1440 = 0x34 ,
Socket_BGA1515 = 0x35 ,
Socket_LGA3647_1 = 0x36 ,
Socket_SP3 = 0x37 ,
Socket_SP3r2 = 0x38 ,
Socket_LGA2066 = 0x39 ,
Socket_BGA1392 = 0x3A ,
Socket_BGA1510 = 0x3B ,
Socket_BGA1528 = 0x3C
} ;
struct [ [ gnu : : packed ] ] CacheInfo
{ // Type 7
TableHeader h ;
u8 socket_designation_str_number ;
u16 cache_config ;
u16 max_cache_size ;
u16 installed_size ;
u16 supported_sram_type ;
u16 current_sram_type ;
u8 cache_speed ;
u8 error_correction_type ;
u8 system_cache_type ;
u8 associativity ;
u32 max_cache_size2 ;
u32 installed_size2 ;
} ;
struct [ [ gnu : : packed ] ] PortConnectorInfo
{ // Type 8
TableHeader h ;
u8 internal_reference_designator_str_number ;
u8 internal_connector_type ;
u8 external_reference_designator_str_number ;
u8 external_connector_type ;
u8 port_type ;
} ;
enum class ConnectorType {
None = 0x0 ,
Centronics = 0x1 ,
Mini_Centronics = 0x2 ,
Proprietary = 0x3 ,
DB_25_pin_male = 0x4 ,
DB_25_pin_female = 0x5 ,
DB_15_pin_male = 0x6 ,
DB_15_pin_female = 0x7 ,
DB_9_pin_male = 0x8 ,
DB_9_pin_female = 0x9 ,
RJ_11 = 0xA ,
RJ_45 = 0xB ,
MiniSCSI_50_pin = 0xC ,
MiniDIN = 0xD ,
MicroDIN = 0xE ,
PS2 = 0xF ,
Infrared = 0x10 ,
HP_HIL = 0x11 ,
AccessBus_USB = 0x12 ,
SSA_SCSI = 0x13 ,
Circular_DIN8_male = 0x14 ,
Circular_DIN8_female = 0x15 ,
OnBoard_IDE = 0x16 ,
OnBoard_Floppy = 0x17 ,
Dual_Inline_9pin = 0x18 ,
Dual_Inline_25pin = 0x19 ,
Dual_Inline_50pin = 0x1A ,
Dual_Inline_68pin = 0x1B ,
OnBoard_SoundInput_CDROM = 0x1C ,
Mini_Centronics_Type14 = 0x1D ,
Mini_Centronics_Type26 = 0x1E ,
Mini_Jack_Headphones = 0x1F ,
BNC = 0x20 ,
Connector_1394 = 0x21 ,
SAS_SATA_Plug_Receptacle = 0x22 ,
USB_TypeC_Receptacle = 0x23 ,
PC98 = 0xA0 ,
PC98_Hireso = 0xA1 ,
PC_H98 = 0xA2 ,
PC98_Note = 0xA3 ,
PC98_Full = 0xA4 ,
Other = 0xFF
} ;
enum class PortType {
None = 0x0 ,
Parallel_Port_XT_AT_Compatible = 0x1 ,
Parallel_Port_PS2 = 0x2 ,
Parallel_Port_ECP = 0x3 ,
Parallel_Port_EPP = 0x4 ,
Parallel_Port_ECP_EPP = 0x5 ,
Serial_Port_XT_AT_Compatible = 0x6 ,
Serial_Port_16450_Compatible = 0x7 ,
Serial_Port_16550_Compatible = 0x8 ,
Serial_Port_16550A_Compatible = 0x9 ,
SCSI_Port = 0xA ,
MIDI_Port = 0xB ,
Joy_Stick_Port = 0xC ,
Keyboard_Port = 0xD ,
Mouse_Port = 0xE ,
SSA_SCSI = 0xF ,
USB = 0x10 ,
FireWire = 0x11 ,
PCMCIA_Type1 = 0x12 ,
PCMCIA_Type2 = 0x13 ,
PCMCIA_Type3 = 0x14 ,
Cardbus = 0x15 ,
AccessBus_Port = 0x16 ,
SCSI_2 = 0x17 ,
SCSI_Wide = 0x18 ,
PC98 = 0x19 ,
PC98_Hireso = 0x1A ,
PC_H98 = 0x1B ,
Video_Port = 0x1C ,
Audio_Port = 0x1D ,
Modem_Port = 0x1E ,
Network_Port = 0x1F ,
SATA = 0x20 ,
SAS = 0x21 ,
MFDP = 0x22 ,
Thunderbolt = 0x23 ,
Intel_8251_Compatible = 0xA0 ,
Intel_8251_FIFO_Compatible = 0xA1 ,
Other = 0xFF
} ;
struct [ [ gnu : : packed ] ] SystemSlotPeerGroup
{
u16 segment_group_number ;
u8 bus_number ;
u8 device_function_number ;
u8 data_bus_width ;
} ;
struct [ [ gnu : : packed ] ] SystemSlots
{ // Type 9
TableHeader h ;
u8 slot_designation_str_number ;
u8 slot_type ;
u8 slot_data_bus_width ;
u8 current_stage ;
u8 slot_length ;
u16 slot_id ;
u8 slot_characteristics_1 ;
u8 slot_characteristics_2 ;
u16 segment_group_number ;
u8 bus_number ;
u8 device_function_number ;
u8 data_bus_width ;
u8 peer_grouping_count ;
SystemSlotPeerGroup peer_groups [ ] ;
} ;
enum class SlotType {
Other = 0x1 ,
Unknown = 0x2 ,
ISA = 0x3 ,
MCA = 0x4 ,
EISA = 0x5 ,
PCI = 0x6 ,
PCMCIA = 0x7 ,
VL_VESA = 0x8 ,
Proprietary = 0x9 ,
Processor_Card_Slot = 0xA ,
Proprietary_Memory_Card_Slot = 0xB ,
IO_Riser_Card_Slot = 0xC ,
NuBus = 0xD ,
PCI_66MHZ_Capable = 0xE ,
AGP = 0xF ,
AGP_2X = 0x10 ,
AGP_4X = 0x11 ,
PCI_X = 0x12 ,
AGP_8X = 0x13 ,
M_Dot_2_Socket_1_DP = 0x14 ,
M_Dot_2_Socket_1_SD = 0x15 ,
M_Dot_2_Socket_2 = 0x16 ,
M_Dot_2_Socket_3 = 0x17 ,
MXM_Type1 = 0x18 ,
MXM_Type2 = 0x19 ,
MXM_Type3_Standard = 0x1A ,
MXM_Type3_HE = 0x1B ,
MXM_Type4 = 0x1C ,
MXM_3_Type_A = 0x1D ,
MXM_3_Type_B = 0x1E ,
PCI_Express_Gen2 = 0x1F ,
PCI_Express_Gen3 = 0x20 ,
PCI_Express_Mini_52pin_Type1 = 0x21 ,
PCI_Express_Mini_52pin_Type2 = 0x22 ,
PCI_Express_Mini_76pin = 0x23 ,
CXL_Flexbus_1_0 = 0x30 ,
PC98_C20 = 0xA0 ,
PC98_C24 = 0xA1 ,
PC98_E = 0xA2 ,
PC98_Local_Bus = 0xA3 ,
PC98_Card = 0xA4 ,
PCI_Express = 0xA5 ,
PCI_Express_x1 = 0xA6 ,
PCI_Express_x2 = 0xA7 ,
PCI_Express_x4 = 0xA8 ,
PCI_Express_x8 = 0xA9 ,
PCI_Express_x16 = 0xAA ,
PCI_Express_Gen_2 = 0xAB ,
PCI_Express_Gen_2_x1 = 0xAC ,
PCI_Express_Gen_2_x2 = 0xAD ,
PCI_Express_Gen_2_x4 = 0xAE ,
PCI_Express_Gen_2_x8 = 0xAF ,
PCI_Express_Gen_2_x16 = 0xB0 ,
PCI_Express_Gen_3 = 0xB1 ,
PCI_Express_Gen_3_x1 = 0xB2 ,
PCI_Express_Gen_3_x2 = 0xB3 ,
PCI_Express_Gen_3_x4 = 0xB4 ,
PCI_Express_Gen_3_x8 = 0xB5 ,
PCI_Express_Gen_3_x16 = 0xB6 ,
PCI_Express_Gen_4 = 0xB8 ,
PCI_Express_Gen_4_x1 = 0xB9 ,
PCI_Express_Gen_4_x2 = 0xBA ,
PCI_Express_Gen_4_x4 = 0xBB ,
PCI_Express_Gen_4_x8 = 0xBC ,
PCI_Express_Gen_4_x16 = 0xBD
} ;
enum class SlotDataBusWidth {
Other = 0x1 ,
Unknown = 0x2 ,
_8_bit = 0x3 ,
_16_bit = 0x4 ,
_32_bit = 0x5 ,
_64_bit = 0x6 ,
_128_bit = 0x7 ,
_1x_x1 = 0x8 ,
_2x_x2 = 0x9 ,
_4x_x4 = 0xA ,
_8x_x8 = 0xB ,
_12x_x12 = 0xC ,
_16x_x16 = 0xD ,
_32x_x32 = 0xE
} ;
enum class SlotCurrentUsage {
Other = 0x1 ,
Unknown = 0x2 ,
Available = 0x3 ,
In_Use = 0x4 ,
Unavailable = 0x5
} ;
enum class SlotLength {
Other = 0x1 ,
Unknown = 0x2 ,
Short_Length = 0x3 ,
Long_Length = 0x4 ,
_2_5_Drive_Form_Factor = 0x5 ,
_3_5_Drive_Form_Factor = 0x6
} ;
enum class SlotCharacteristics1 {
Unknown = ( 1 < < 0 ) ,
Provides_5volt = ( 1 < < 1 ) ,
Provides_3_3volt = ( 1 < < 2 ) ,
Shared_Slot = ( 1 < < 3 ) ,
Support_PC_Card_16 = ( 1 < < 4 ) ,
Support_CardBus = ( 1 < < 5 ) ,
Support_Zoom_Video = ( 1 < < 6 ) ,
Support_Modem_Ring_Resume = ( 1 < < 7 )
} ;
enum class SlotCharacteristics2 {
Support_PCI_PME = ( 1 < < 0 ) ,
Support_Hot_Plug = ( 1 < < 1 ) ,
Support_SMBus = ( 1 < < 2 ) ,
Support_Bifurcation = ( 1 < < 3 ) ,
} ;
struct [ [ gnu : : packed ] ] OEMStrings
{ // Type 11
TableHeader h ;
u8 strings_count ;
} ;
struct [ [ gnu : : packed ] ] SysConfigOptions
{ // Type 12
TableHeader h ;
u8 strings_count ;
} ;
struct [ [ gnu : : packed ] ] BIOSLanguageInfo
{ // Type 13
TableHeader h ;
u8 installable_langs_counts ;
u8 flags ;
u8 reserved [ 15 ] ;
u8 current_lang_str_number ; // String number (one-based) of the currently installed language
} ;
struct [ [ gnu : : packed ] ] GroupAssociations
{ // Type 14
TableHeader h ;
u8 group_name_str_number ;
u8 item_type ;
u16 item_handle ;
} ;
struct [ [ gnu : : packed ] ] SysEventLog
{ // Type 15
TableHeader h ;
u16 log_area_length ;
u16 log_header_start_offset ;
u16 log_data_start_offset ;
u8 access_method ;
u8 log_status ;
u32 log_change_token ;
u32 access_method_address ;
u8 log_header_format ;
u8 supported_log_type_descriptors_count ;
u8 log_type_descriptor_length ;
u8 supported_event_log_type_descriptor_list [ ] ;
} ;
struct [ [ gnu : : packed ] ] PhysicalMemoryArray
{ // Type 16
TableHeader h ;
u8 location ;
u8 use ;
u8 memory_error_correction ;
u32 max_capacity ;
u16 memory_error_info_handle ;
u16 memory_devices_count ;
u64 ext_max_capacity ;
} ;
enum class MemoryArrayLocation {
Other = 0x1 ,
Unknown = 0x2 ,
Motherboard = 0x3 ,
ISA_addon_card = 0x4 ,
EISA_addon_card = 0x5 ,
PCI_addon_card = 0x6 ,
MCA_addon_card = 0x7 ,
PCMCIA_addon_card = 0x8 ,
Proprietary_addon_card = 0x9 ,
NuBus = 0xA ,
PC98_C20_addon_card = 0xA0 ,
PC98_C24_addon_card = 0xA1 ,
PC98_E_addon_card = 0xA2 ,
PC98_Local_Bus_addon_card = 0xA3 ,
CXL_Flexbus_1_0_addon_card = 0xA4
} ;
enum class MemoryArrayUse {
Other = 0x1 ,
Unknown = 0x2 ,
System_Memory = 0x3 ,
Video_Memory = 0x4 ,
Flash_Memory = 0x5 ,
Non_Volatile_RAM = 0x6 ,
Cache_Memory = 0x7
} ;
enum class MemoryArrayErrorCorrectionType {
Other = 0x1 ,
Unknown = 0x2 ,
None = 0x3 ,
Parity = 0x4 ,
SingleBit_ECC = 0x5 ,
MultiBit_ECC = 0x6 ,
CRC = 0x7
} ;
struct [ [ gnu : : packed ] ] MemoryDevice
{ // Type 17
TableHeader h ;
u16 physical_memory_array_handle ;
u16 memory_error_info_handle ;
u16 total_width ;
u16 data_width ;
u16 size ;
u8 form_factor ;
u8 device_set ;
u8 device_locator_str_number ;
u8 bank_locator_str_number ;
u8 memory_type ;
u16 type_detail ;
u16 speed ;
u8 manufacturer_str_number ;
u8 serial_number_str_number ;
u8 asset_tag_str_number ;
u8 part_number_str_number ;
u8 attributes ;
u32 ext_size ;
u16 configured_memory_speed ;
u16 min_voltage ;
u16 max_voltage ;
u16 configured_voltage ;
u8 memory_technology ;
u16 memory_operating_mode_capability ;
u8 firmware_version_str_number ;
u16 module_manufacturer_id ;
u16 module_product_id ;
u16 memory_subsystem_controller_manufacturer_id ;
u16 memory_subsystem_controller_product_id ;
u64 non_volatile_size ;
u64 volatile_size ;
u64 cache_size ;
u64 logical_size ;
u32 ext_speed ;
u32 ext_configured_memory_speed ;
} ;
enum class MemoryDeviceFormFactor {
Other = 0x1 ,
Unknown = 0x2 ,
SIMM = 0x3 ,
SIP = 0x4 ,
Chip = 0x5 ,
DIP = 0x6 ,
ZIP = 0x7 ,
ProprietaryCard = 0x8 ,
DIMM = 0x9 ,
TSOP = 0xA ,
Chips_Row = 0xB ,
RIMM = 0xC ,
SODIMM = 0xD ,
SRIMM = 0xE ,
FB_DIMM = 0xF ,
Die = 0x10
} ;
enum class MemoryDeviceType {
Other = 0x1 ,
Unknown = 0x2 ,
DRAM = 0x3 ,
EDRAM = 0x4 ,
VRAM = 0x5 ,
SRAM = 0x6 ,
RAM = 0x7 ,
ROM = 0x8 ,
FLASH = 0x9 ,
EEPROM = 0xA ,
FEPROM = 0xB ,
EPROM = 0xC ,
CDRAM = 0xD ,
_3DRAM = 0xE ,
SDRAM = 0xF ,
SGRAM = 0x10 ,
RDRAM = 0x11 ,
DDR = 0x12 ,
DDR2 = 0x13 ,
DDR2_FB_DIMM = 0x14 ,
DDR3 = 0x18 ,
FBD2 = 0x19 ,
DDR4 = 0x1A ,
LPDDR = 0x1B ,
LPDDR2 = 0x1C ,
LPDDR3 = 0x1D ,
LPDDR4 = 0x1E ,
Logical_Non_Volatile_Device = 0x1F ,
HBM = 0x20 , // (High Bandwidth Memory)
HBM2 = 0x21 , // (High Bandwidth Memory Generation 2)
} ;
enum class MemoryDeviceTypeDetail {
Other = ( 1 < < 1 ) ,
Unknown = ( 1 < < 2 ) ,
Fast_paged = ( 1 < < 3 ) ,
Static_Column = ( 1 < < 4 ) ,
Pseudo_Static = ( 1 < < 5 ) ,
RAMBUS = ( 1 < < 6 ) ,
Synchronous = ( 1 < < 7 ) ,
CMOS = ( 1 < < 8 ) ,
EDO = ( 1 < < 9 ) ,
Window_DRAM = ( 1 < < 10 ) ,
Cache_DRAM = ( 1 < < 11 ) ,
Non_volatile = ( 1 < < 12 ) ,
Registered_Buffered = ( 1 < < 13 ) ,
Unbuffered_Unregistered = ( 1 < < 14 ) ,
LRDIMM = ( 1 < < 15 )
} ;
enum class MemoryDeviceTechnology {
Other = 0x1 ,
Unknown = 0x2 ,
DRAM = 0x3 ,
NVDIMM_N = 0x4 ,
NVDIMM_F = 0x5 ,
NVDIMM_P = 0x6 ,
Intel_Optane_DC_Persistent_Memory = 0x7
} ;
enum class MemoryDeviceOperatingModeCapability {
Other = ( 1 < < 1 ) ,
Unknown = ( 1 < < 2 ) ,
Volatile_Memory = ( 1 < < 3 ) ,
Byte_accessible_persistent_memory = ( 1 < < 4 ) ,
Block_accessible_persistent_memory = ( 1 < < 5 ) ,
} ;
struct MemoryErrorInfo32Bit { // Type 18
TableHeader h ;
u8 error_type ;
u8 error_granularity ;
u8 error_operation ;
u32 vendor_syndrome ;
u32 memory_array_error_address ;
u32 device_error_address ;
u32 error_resolution ;
} ;
enum class MemoryErrorType {
Other = 0x1 ,
Unknown = 0x2 ,
OK = 0x3 ,
Bad_read = 0x4 ,
Parity_error = 0x5 ,
SingleBit_error = 0x6 ,
DoubleBit_error = 0x7 ,
MultiBit_error = 0x8 ,
Nibble_error = 0x9 ,
Checksum_error = 0xA ,
CRC_error = 0xB ,
Corrected_SingleBit_error = 0xC ,
Corrected_error = 0xD ,
Uncorrectable_error = 0xE
} ;
enum class MemoryErrorGranularity {
Other = 0x1 ,
Unknown = 0x2 ,
Device_level = 0x3 ,
Memory_partition_level = 0x4
} ;
enum class MemoryErrorOperation {
Other = 0x1 ,
Unknown = 0x2 ,
Read = 0x3 ,
Write = 0x4 ,
Partial_Write = 0x5
} ;
struct [ [ gnu : : packed ] ] MemoryArrayMappedAddress
{ // Type 19
TableHeader h ;
u32 starting_address ;
u32 ending_address ;
u16 memory_array_handle ;
u8 partition_width ;
u64 ext_starting_address ;
u64 ext_ending_address ;
} ;
struct [ [ gnu : : packed ] ] MemoryDeviceMappedAddress
{ // Type 20
TableHeader h ;
u32 starting_address ;
u32 ending_address ;
u16 memory_device_handle ;
u16 memory_array_mapped_handle ;
u8 partition_row_position ;
u8 interleave_position ;
u8 interleaved_data_depth ;
u64 ext_starting_address ;
u64 ext_ending_address ;
} ;
struct [ [ gnu : : packed ] ] BuiltinPointingDevice
{ // Type 21
TableHeader h ;
u8 type ;
u8 interface ;
u8 buttons_count ;
} ;
enum class PointingDeviceType {
Other = 0x1 ,
Unknown = 0x2 ,
Mouse = 0x3 ,
Track_Ball = 0x4 ,
Track_Point = 0x5 ,
Glide_Point = 0x6 ,
Touch_Pad = 0x7 ,
Touch_Screen = 0x8 ,
Optical_Sensor = 0x9
} ;
enum class PointingDeviceInterface {
Other = 0x1 ,
Unknown = 0x2 ,
Serial = 0x3 ,
PS2 = 0x4 ,
Infrared = 0x5 ,
HP_HIL = 0x6 ,
Bus_mouse = 0x7 ,
AppleDesktopBus = 0x8 ,
Bus_mouse_DB9 = 0xA0 ,
Bus_mouse_microDIN = 0xA1 ,
USB = 0xA2
} ;
struct [ [ gnu : : packed ] ] PortableBattery
{ // Type 22
TableHeader h ;
u8 location_str_number ;
u8 manufacturer_str_number ;
u8 manufacture_date_str_number ;
u8 serial_number_str_number ;
u8 device_name_str_number ;
u8 device_chemistry ;
u16 design_capacity ;
u16 design_voltage ;
u8 sbds_version_number ;
u8 max_error_battery_data ;
u16 sbds_serial_number ;
u16 sbds_manufacture_date ;
u8 sbds_device_chemistry_str_number ;
u8 design_capacity_multiplier ;
u32 oem_specific ;
} ;
enum class PortableBatteryChemistry {
Other = 0x1 ,
Unknown = 0x2 ,
Lead_Acid = 0x3 ,
Nickel_Cadmium = 0x4 ,
Nickel_metal_hydride = 0x5 ,
Lithium_ion = 0x6 ,
Zinc_air = 0x7 ,
Lithium_polymer = 0x8
} ;
struct [ [ gnu : : packed ] ] SysReset
{ // Type 23
TableHeader h ;
u8 capabilities ;
u16 reset_count ;
u16 reset_limit ;
u16 timer_interval ;
u16 timeout ;
} ;
struct [ [ gnu : : packed ] ] HardwareSecurity
{ // Type 24
TableHeader h ;
u8 hardware_security_settings ;
} ;
struct [ [ gnu : : packed ] ] SysPowerControls
{ // Type 25
TableHeader h ;
u8 next_scheduled_power_on_month ;
u8 next_scheduled_power_on_day_of_month ;
u8 next_scheduled_power_on_hour ;
u8 next_scheduled_power_on_minute ;
u8 next_scheduled_power_on_second ;
} ;
struct [ [ gnu : : packed ] ] VoltageProbe
{ // Type 26
TableHeader h ;
u8 description_str_number ;
u8 location_and_status ;
u16 max_value ;
u16 min_value ;
u16 resolution ;
u16 tolerance ;
u16 accuracy ;
u32 oem_defined ;
u16 nominal_value ;
} ;
struct [ [ gnu : : packed ] ] CoolingDevice
{ // Type 27
TableHeader h ;
u16 temperature_probe_handle ;
u8 device_type_and_status ;
u8 cooling_unit_group ;
u32 oem_defined ;
u16 nominal_speed ;
u8 description_str_number ;
} ;
struct [ [ gnu : : packed ] ] TemperatureProbe
{ // Type 28
TableHeader h ;
u8 description_str_number ;
u8 location_and_status ;
u16 max_value ;
u16 min_value ;
u16 resolution ;
u16 tolerance ;
u16 accuracy ;
u32 oem_defined ;
u16 nominal_value ;
} ;
struct [ [ gnu : : packed ] ] ElectricalCurrentProbe
{ // Type 29
TableHeader h ;
u8 description_str_number ;
u8 location_and_status ;
u16 max_value ;
u16 min_value ;
u16 resolution ;
u16 tolerance ;
u16 accuracy ;
u32 oem_defined ;
u16 nominal_value ;
} ;
struct [ [ gnu : : packed ] ] OutOfBandRemoteAccess
{ // Type 30
TableHeader h ;
u8 manufacturer_name_str_number ;
u8 connections ;
} ;
struct [ [ gnu : : packed ] ] SystemBootInfo
{ // Type 32
TableHeader h ;
u8 reserved [ 6 ] ;
u8 boot_status [ 10 ] ;
} ;
struct [ [ gnu : : packed ] ] MemoryErrorInfo64Bit
{ // Type 33
TableHeader h ;
u8 error_type ;
u8 error_granularity ;
u8 error_operation ;
u32 vendor_syndrome ;
u64 memory_array_error_address ;
u64 device_error_address ;
u32 error_resolution ;
} ;
struct [ [ gnu : : packed ] ] ManagementDevice
{ // Type 34
TableHeader h ;
u8 description_str_number ;
u8 type ;
u32 address ;
u8 address_type ;
} ;
enum class ManagementDeviceType {
Other = 0x1 ,
Unknown = 0x2 ,
LM75 = 0x3 ,
LM78 = 0x4 ,
LM79 = 0x5 ,
LM80 = 0x6 ,
LM81 = 0x7 ,
ADM9240 = 0x8 ,
DS1780 = 0x9 ,
Maxim_1617 = 0xA ,
GL518SM = 0xB , // Genesys GL518SM
W83781D = 0xC , // Winbond W83781D
HT82H791 = 0xD // Holtek HT82H791
} ;
enum class ManagementDeviceAddressType {
Other = 0x1 ,
Unknown = 0x2 ,
IO_Port = 0x3 ,
Memory = 0x4 ,
SMBus = 0x5
} ;
struct [ [ gnu : : packed ] ] ManagementDeviceComponent
{ // Type 35
TableHeader h ;
u8 description_str_number ;
u16 management_device_handle ;
u16 component_handle ;
u16 threshold_handle ;
} ;
struct [ [ gnu : : packed ] ] ManagementDeviceThresholdData
{ // Type 36
TableHeader h ;
u16 lower_threshold_non_critical ;
u16 upper_threshold_non_critical ;
u16 lower_threshold_critical ;
u16 upper_threshold_critical ;
u16 lower_threshold_non_recoverable ;
u16 upper_threshold_non_recoverable ;
} ;
struct [ [ gnu : : packed ] ] MemoryDeviceDescriptor
{
u8 device_load ;
u16 device_handle ;
} ;
struct [ [ gnu : : packed ] ] MemoryChannel
{ // Type 37
TableHeader h ;
u8 channel_type ;
u8 memory_device_count ;
MemoryDeviceDescriptor memory_devices_descriptors [ ] ;
} ;
enum class MemroryChannelType {
Other = 0x1 ,
Unknown = 0x2 ,
RamBus = 0x3 ,
SyncLink = 0x4
} ;
struct [ [ gnu : : packed ] ] IPMIDeviceInfo
{ // Type 38
TableHeader h ;
u8 interface_type ;
u8 ipmi_spec_revision ;
u8 i2c_slave_address ;
u8 nv_storage_device_address ;
u64 base_address ;
u8 base_address_modifier ;
u8 interrupt_number ;
} ;
enum class IPMIDeviceInfoBMCInterfaceType {
Unknown = 0x1 ,
KCS = 0x2 , // KCS: Keyboard Controller Style
SMIC = 0x3 , // SMIC: Server Management Interface Chip
BT = 0x4 , // BT: Block Transfer
SSIF = 0x5 // SSIF: SMBus System Interface
} ;
struct [ [ gnu : : packed ] ] SysPowerSupply
{ // Type 39
TableHeader h ;
u8 power_unit_group ;
u8 location_str_number ;
u8 device_name_str_number ;
u8 manufacturer_str_number ;
u8 serial_number_str_number ;
u8 asset_tag_number_str_number ;
u8 model_part_number_str_number ;
u8 revision_level_str_number ;
u16 max_power_capacity ;
u16 power_supply_characteristics ;
u16 input_voltage_probe_handle ;
u16 cooling_device_handle ;
u16 input_current_probe_handle ;
} ;
struct [ [ gnu : : packed ] ] AdditionalInfoEntry
{
u8 entry_length ;
u16 referenced_handle ;
u8 referenced_offset ;
u8 string_number ;
u8 value [ ] ;
} ;
struct [ [ gnu : : packed ] ] AdditionalInfo
{ // Type 40
TableHeader h ;
u8 additional_info_entries_count ;
AdditionalInfoEntry entries [ ] ;
} ;
struct [ [ gnu : : packed ] ] OnboardDevicesExtendedInfo
{ // Type 41
TableHeader h ;
u8 reference_designation_str_number ;
u8 device_type ;
u8 device_type_instance ;
u16 segment_group_number ;
u8 bus_number ;
u8 device_function_number ;
} ;
enum class OnboardDeviceType {
Other = 0x1 ,
Unknown = 0x2 ,
Video = 0x3 ,
SCSI_Controller = 0x4 ,
Ethernet = 0x5 ,
Token_Ring = 0x6 ,
Sound = 0x7 ,
PATA_Controller = 0x8 ,
SATA_Controller = 0x9 ,
SAS_Controller = 0xA
} ;
struct [ [ gnu : : packed ] ] ManagementControllerHostInterface
{ // Type 42
TableHeader h ;
u8 interface_type ;
u8 interface_type_specific_data_length ;
u8 interface_type_specific_data [ ] ;
} ;
struct [ [ gnu : : packed ] ] ProtocolRecordData
{
u8 protocol_type ;
u8 protocol_type_specific_data_length ;
u8 protocol_type_specific_data [ ] ;
} ;
struct [ [ gnu : : packed ] ] ExtManagementControllerHostInterface
{ // Type 42 Ext
u8 protocol_records_count ;
ProtocolRecordData protocol_records [ ] ;
} ;
enum class ManagementControllerHostInterfaceProtocolType {
IPMI = 0x2 ,
MCTP = 0x3 ,
RedfishOverIP = 0x4
} ;
struct [ [ gnu : : packed ] ] TPMDevice
{ // Type 43
TableHeader h ;
char vendor_id [ 4 ] ;
u8 major_spec_version ;
u8 minor_spec_version ;
u32 firmware_version_1 ;
u32 firmware_version_2 ;
u8 description_str_number ;
u64 characteristics ;
u32 oem_defined ;
} ;
enum class TPMDeviceCharacteristics {
Characteristics_not_supported = ( 1 < < 2 ) ,
Family_Configurable_1 = ( 1 < < 3 ) , // Family configurable via firmware update; for example, switching between TPM 1.2 and TPM 2.0.
Family_Configurable_2 = ( 1 < < 4 ) , // Family configurable via platform software support, such as BIOS Setup; for example, switching between TPM 1.2 and TPM 2.0.
Family_Configurable_3 = ( 1 < < 5 ) , // Family configurable via OEM proprietary mechanism; for example, switching between TPM 1.2 and TPM 2.0.
} ;
struct [ [ gnu : : packed ] ] ProcessorSpecificBlock
{
u8 block_length ;
u8 processor_type ;
u8 processor_specific_data [ ] ;
} ;
struct [ [ gnu : : packed ] ] ProcessorAdditionalInfo
{ // Type 44
TableHeader h ;
u16 referenced_handle ;
ProcessorSpecificBlock blocks [ ] ;
} ;
enum class ProcessorArchitectureType {
IA32 = 0x1 ,
x86_64 = 0x2 ,
Itanium = 0x3 ,
ARM32bit = 0x4 ,
ARM64bit = 0x5 ,
RISC_V_32bit = 0x6 ,
RISC_V_64bit = 0x7 ,
RISC_V_128bit = 0x8
} ;
struct [ [ gnu : : packed ] ] Inactive
{ // Type 126
TableHeader h ;
} ;
struct [ [ gnu : : packed ] ] EndOfTable
{ // Type 127
TableHeader h ;
} ;
2019-12-31 13:02:21 +02:00
}
class DMIDecoder {
public :
static DMIDecoder & the ( ) ;
static void initialize ( ) ;
static void initialize_untrusted ( ) ;
Vector < SMBIOS : : PhysicalMemoryArray * > & get_physical_memory_areas ( ) ;
bool is_reliable ( ) ;
u64 get_bios_characteristics ( ) ;
private :
void enumerate_smbios_tables ( ) ;
2020-02-24 13:59:48 +02:00
PhysicalAddress get_next_physical_table ( PhysicalAddress p_table ) ;
PhysicalAddress get_smbios_physical_table_by_handle ( u16 handle ) ;
PhysicalAddress get_smbios_physical_table_by_type ( u8 table_type ) ;
char * get_smbios_string ( PhysicalAddress , u8 string_number ) ;
size_t get_table_size ( PhysicalAddress ) ;
2019-12-31 13:02:21 +02:00
explicit DMIDecoder ( bool trusted ) ;
void initialize_parser ( ) ;
2020-02-24 13:59:48 +02:00
void set_64_bit_entry_initialization_values ( PhysicalAddress ) ;
void set_32_bit_entry_initialization_values ( PhysicalAddress ) ;
2020-01-21 04:35:57 +02:00
2020-02-24 13:59:48 +02:00
PhysicalAddress find_entry32bit_point ( ) ;
PhysicalAddress find_entry64bit_point ( ) ;
2019-12-31 13:02:21 +02:00
2020-02-24 13:59:48 +02:00
PhysicalAddress m_entry32bit_point ;
PhysicalAddress m_entry64bit_point ;
PhysicalAddress m_structure_table ;
2019-12-31 13:02:21 +02:00
u32 m_structures_count ;
u32 m_table_length ;
bool m_use_64bit_entry ;
bool m_operable ;
bool m_untrusted ;
2020-02-24 13:59:48 +02:00
SinglyLinkedList < PhysicalAddress > m_smbios_tables ;
2019-12-31 13:02:21 +02:00
} ;
2020-02-16 01:27:42 +01:00
}