mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 19:52:45 +00:00 
			
		
		
		
	 21d5f4ada1
			
		
	
	
		21d5f4ada1
		
	
	
	
	
		
			
			This was supposed to be the foundation for some kind of pre-kernel environment, but nobody is working on it right now, so let's move everything back into the kernel and remove all the confusion.
		
			
				
	
	
		
			1425 lines
		
	
	
	
		
			33 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			1425 lines
		
	
	
	
		
			33 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2020, Liav A. <liavalb@hotmail.co.il>
 | |
|  * 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.
 | |
|  */
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <AK/SinglyLinkedList.h>
 | |
| #include <AK/Types.h>
 | |
| #include <AK/Vector.h>
 | |
| #include <Kernel/VM/Region.h>
 | |
| #include <Kernel/PhysicalAddress.h>
 | |
| #include <Kernel/VirtualAddress.h>
 | |
| 
 | |
| namespace Kernel {
 | |
| 
 | |
| namespace SMBIOS {
 | |
| 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;
 | |
| };
 | |
| }
 | |
| 
 | |
| 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();
 | |
|     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);
 | |
| 
 | |
|     explicit DMIDecoder(bool trusted);
 | |
|     void initialize_parser();
 | |
| 
 | |
|     void set_64_bit_entry_initialization_values(PhysicalAddress);
 | |
|     void set_32_bit_entry_initialization_values(PhysicalAddress);
 | |
| 
 | |
|     PhysicalAddress find_entry32bit_point();
 | |
|     PhysicalAddress find_entry64bit_point();
 | |
| 
 | |
|     PhysicalAddress m_entry32bit_point;
 | |
|     PhysicalAddress m_entry64bit_point;
 | |
|     PhysicalAddress m_structure_table;
 | |
|     u32 m_structures_count;
 | |
|     u32 m_table_length;
 | |
|     bool m_use_64bit_entry;
 | |
|     bool m_operable;
 | |
|     bool m_untrusted;
 | |
| 
 | |
|     SinglyLinkedList<PhysicalAddress> m_smbios_tables;
 | |
| };
 | |
| 
 | |
| }
 |