LCOV - code coverage report
Current view: top level - source/lib/sysdep - smbios.h (source / functions) Hit Total Coverage
Test: 0 A.D. test coverage report Lines: 0 3 0.0 %
Date: 2023-01-19 00:18:29 Functions: 0 58 0.0 %

          Line data    Source code
       1             : /* Copyright (C) 2022 Wildfire Games.
       2             :  *
       3             :  * Permission is hereby granted, free of charge, to any person obtaining
       4             :  * a copy of this software and associated documentation files (the
       5             :  * "Software"), to deal in the Software without restriction, including
       6             :  * without limitation the rights to use, copy, modify, merge, publish,
       7             :  * distribute, sublicense, and/or sell copies of the Software, and to
       8             :  * permit persons to whom the Software is furnished to do so, subject to
       9             :  * the following conditions:
      10             :  *
      11             :  * The above copyright notice and this permission notice shall be included
      12             :  * in all copies or substantial portions of the Software.
      13             :  *
      14             :  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
      15             :  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
      16             :  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
      17             :  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
      18             :  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
      19             :  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
      20             :  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
      21             :  */
      22             : 
      23             : /*
      24             :  * provide access to System Management BIOS information
      25             :  */
      26             : 
      27             : #ifndef INCLUDED_SMBIOS
      28             : #define INCLUDED_SMBIOS
      29             : 
      30             : namespace SMBIOS {
      31             : 
      32             : // to introduce another enumeration:
      33             : // 1) add its name and underlying type here
      34             : // 2) define a <name>_ENUMERATORS macro specifying its enumerators
      35             : //    (prefer lower case to avoid conflicts with macros)
      36             : #define ENUMERATIONS\
      37             :     ENUMERATION(State, u8)\
      38             :     ENUMERATION(ECC, u8)\
      39             :     ENUMERATION(BiosFlags, u32)\
      40             :     ENUMERATION(BiosFlags1, u8)\
      41             :     ENUMERATION(BiosFlags2, u8)\
      42             :     ENUMERATION(SystemWakeUpType, u8)\
      43             :     ENUMERATION(BaseboardFlags, u8)\
      44             :     ENUMERATION(BaseboardType, u8)\
      45             :     ENUMERATION(ChassisType, u8)\
      46             :     ENUMERATION(ChassisSecurityStatus, u8)\
      47             :     ENUMERATION(ProcessorType, u8)\
      48             :     ENUMERATION(ProcessorStatus, u8)\
      49             :     ENUMERATION(ProcessorUpgrade, u8)\
      50             :     ENUMERATION(ProcessorFlags, u16)\
      51             :     ENUMERATION(CacheMode, u8)\
      52             :     ENUMERATION(CacheLocation, u8)\
      53             :     ENUMERATION(CacheConfigurationFlags, u16)\
      54             :     ENUMERATION(CacheFlags, u16)\
      55             :     ENUMERATION(CacheType, u8)\
      56             :     ENUMERATION(CacheAssociativity, u8)\
      57             :     ENUMERATION(PortConnectorType, u8)\
      58             :     ENUMERATION(PortType, u8)\
      59             :     ENUMERATION(SystemSlotType, u8)\
      60             :     ENUMERATION(SystemSlotBusWidth, u8)\
      61             :     ENUMERATION(SystemSlotUsage, u8)\
      62             :     ENUMERATION(SystemSlotLength, u8)\
      63             :     ENUMERATION(SystemSlotFlags1, u8)\
      64             :     ENUMERATION(SystemSlotFlags2, u8)\
      65             :     ENUMERATION(OnBoardDeviceType, u8)\
      66             :     ENUMERATION(MemoryArrayLocation, u8)\
      67             :     ENUMERATION(MemoryArrayUse, u8)\
      68             :     ENUMERATION(MemoryDeviceFormFactor, u8)\
      69             :     ENUMERATION(MemoryDeviceType, u8)\
      70             :     ENUMERATION(MemoryDeviceTypeFlags, u16)\
      71             :     ENUMERATION(PortableBatteryChemistry, u8)\
      72             :     ENUMERATION(VoltageProbeLocation, u8)\
      73             :     ENUMERATION(CoolingDeviceType, u8)\
      74             :     ENUMERATION(TemperatureProbeLocation, u8)\
      75             :     ENUMERATION(SystemBootStatus, u8)\
      76             :     ENUMERATION(ManagementDeviceType, u8)\
      77             :     ENUMERATION(ManagementDeviceAddressType, u8)\
      78             :     ENUMERATION(SystemPowerSupplyCharacteristics, u16)\
      79             :     ENUMERATION(SystemPowerSupplyType, u8)\
      80             :     ENUMERATION(SystemPowerSupplyInputSwitching, u8)
      81             : 
      82             : // to introduce another structure:
      83             : // 1) add its name and ID here
      84             : // 2) define a <name>_FIELDS macro specifying its fields
      85             : // 3) (optional) add a specialization of Fixup
      86             : #define STRUCTURES\
      87             :     STRUCTURE(Bios, 0)\
      88             :     STRUCTURE(System, 1)\
      89             :     STRUCTURE(Baseboard, 2)\
      90             :     STRUCTURE(Chassis, 3)\
      91             :     STRUCTURE(Processor, 4)\
      92             :     /* MemoryController (5) and MemoryModule (6) are obsolete */\
      93             :     STRUCTURE(Cache, 7)\
      94             :     STRUCTURE(PortConnector, 8)\
      95             :     STRUCTURE(SystemSlot, 9)\
      96             :     STRUCTURE(OnBoardDevices, 10)\
      97             :     /* OemStrings (11), SystemConfiguration (12), BiosLanguage (13), GroupAssociations (14), SystemEventLog (15) are optional */\
      98             :     STRUCTURE(MemoryArray, 16)\
      99             :     STRUCTURE(MemoryDevice, 17)\
     100             :     /* MemoryError32 (18) is optional */\
     101             :     STRUCTURE(MemoryArrayMappedAddress, 19)\
     102             :     STRUCTURE(MemoryDeviceMappedAddress, 20)\
     103             :     /* PointingDevice (21) is optional */\
     104             :     STRUCTURE(PortableBattery, 22)\
     105             :     /* SystemReset (23), HardwareSecurity (24), SystemPowerControls (25) are optional */\
     106             :     STRUCTURE(VoltageProbe, 26)\
     107             :     STRUCTURE(CoolingDevice, 27)\
     108             :     STRUCTURE(TemperatureProbe, 28)\
     109             :     /* ElectricalCurrentProbe (29), OutOfBandRemoteAccess (30), BootIntegrityServices (31) are optional */\
     110             :     STRUCTURE(SystemBoot, 32)\
     111             :     STRUCTURE(ManagementDevice, 34)\
     112             :     STRUCTURE(ManagementDeviceComponent, 35)\
     113             :     STRUCTURE(ManagementDeviceThreshold, 36)\
     114             :     STRUCTURE(SystemPowerSupply, 39)\
     115             :     STRUCTURE(OnboardDevices2, 41)\
     116             :     /* MemoryError64 (33), MemoryChannel (37), IpmiDevice (38) are optional */
     117             :     /* Additional (40), ManagementControllerHostInterface (42) are optional */
     118             : 
     119             : 
     120             : //-----------------------------------------------------------------------------
     121             : // declarations required for the fields
     122             : 
     123             : // indicates a field (:= member of a structure) is:
     124             : enum FieldFlags
     125             : {
     126             :     // computed via other fields (i.e. should not be copied from the SMBIOS data).
     127             :     F_DERIVED  = 1,
     128             : 
     129             :     // not intended for display / use by applications (usually because
     130             :     // it is superseded by another - possibly derived - field).
     131             :     F_INTERNAL = 2,
     132             : 
     133             :     // a number that should be displayed in hexadecimal form.
     134             :     F_HEX      = 4
     135             : };
     136             : 
     137             : 
     138             : // (wrapper classes allow special handling of certain fields via
     139             : // template specialization and function overloads)
     140             : 
     141             : // size [bytes] - displayed with auto-range
     142             : template<typename T>
     143             : struct Size
     144             : {
     145             :     Size(): value(0) {}
     146           0 :     Size(T value): value(value) {}
     147             :     T value;
     148           0 :     operator T() const { return value; }
     149             : };
     150             : 
     151             : // SMBIOS structure handle - only displayed if meaningful
     152             : struct Handle
     153             : {
     154             :     Handle(): value(0) {}
     155             :     Handle(u16 value): value(value) {}
     156             :     u16 value;
     157             : };
     158             : 
     159             : 
     160             : #define State_ENUMERATORS\
     161             :     ENUM(other, 1)\
     162             :     ENUM(unknown, 2)\
     163             :     ENUM(ok, 3)\
     164             :     ENUM(noncritical, 4)\
     165             :     ENUM(critical, 5)\
     166             :     ENUM(nonrecoverable, 6)
     167             : 
     168             : #define ECC_ENUMERATORS\
     169             :     ENUM(other, 1)\
     170             :     ENUM(unknown, 2)\
     171             :     ENUM(none, 3)\
     172             :     ENUM(parity, 4)\
     173             :     ENUM(single_bit, 5)\
     174             :     ENUM(multiple_bit, 6)\
     175             :     ENUM(crc, 7)
     176             : 
     177             : 
     178             : #pragma pack(push, 1)
     179             : 
     180             : 
     181             : //-----------------------------------------------------------------------------
     182             : // Bios
     183             : 
     184             : #define BiosFlags_ENUMERATORS\
     185             :     ENUM(isa, 0x10)\
     186             :     ENUM(mca, 0x20)\
     187             :     ENUM(eisa, 0x40)\
     188             :     ENUM(pci, 0x80)\
     189             :     ENUM(pcmcia, 0x100)\
     190             :     ENUM(plug_and_play, 0x200)\
     191             :     ENUM(apm, 0x400)\
     192             :     ENUM(upgradable, 0x800)\
     193             :     ENUM(shadowing, 0x1000)\
     194             :     ENUM(vl_vesa, 0x2000)\
     195             :     ENUM(escd, 0x4000)\
     196             :     ENUM(boot_cd, 0x8000)\
     197             :     ENUM(selectable_boot, 0x10000)\
     198             :     ENUM(socketed_rom, 0x20000)\
     199             :     ENUM(boot_pcmcia, 0x40000)\
     200             :     ENUM(edd, 0x80000)\
     201             :     ENUM(int13a, 0x100000)\
     202             :     ENUM(int13b, 0x200000)\
     203             :     ENUM(int13c, 0x400000)\
     204             :     ENUM(int13d, 0x800000)\
     205             :     ENUM(int13e, 0x1000000)\
     206             :     ENUM(int13f, 0x2000000)\
     207             :     ENUM(int5, 0x4000000)\
     208             :     ENUM(int9, 0x8000000)\
     209             :     ENUM(int14, 0x10000000)\
     210             :     ENUM(int17, 0x20000000)\
     211             :     ENUM(int10, 0x40000000)\
     212             :     ENUM(pc_98, 0x80000000)
     213             : 
     214             : #define BiosFlags1_ENUMERATORS\
     215             :     ENUM(acpi, 0x01)\
     216             :     ENUM(usb_legacy, 0x02)\
     217             :     ENUM(agp, 0x04)\
     218             :     ENUM(boot_i2o, 0x08)\
     219             :     ENUM(boot_ls_120, 0x10)\
     220             :     ENUM(boot_zip_drive, 0x20)\
     221             :     ENUM(boot_1394, 0x40)\
     222             :     ENUM(smart_battery, 0x80)
     223             : 
     224             : #define BiosFlags2_ENUMERATORS\
     225             :     ENUM(bios_boot, 0x01)\
     226             :     ENUM(function_key_boot, 0x02)\
     227             :     ENUM(targeted_content_distribution, 0x04)\
     228             :     ENUM(uefi, 0x08)\
     229             :     ENUM(virtual_machine, 0x10)
     230             : 
     231             : #define Bios_FIELDS\
     232             :     FIELD(0, const char*, vendor, "")\
     233             :     FIELD(0, const char*, version, "")\
     234             :     FIELD(F_HEX, u16, startSegment, "")\
     235             :     FIELD(0, const char*, releaseDate, "")\
     236             :     FIELD(F_INTERNAL, u8, encodedSize, "")\
     237             :     FIELD(0, BiosFlags, flags, "")\
     238             :     FIELD(F_HEX, u32, vendorFlags, "")\
     239             :     FIELD(0, BiosFlags1, flags1, "")\
     240             :     FIELD(0, BiosFlags2, flags2, "")\
     241             :     FIELD(F_DERIVED, Size<size_t>, size, "")
     242             : 
     243             : 
     244             : //-----------------------------------------------------------------------------
     245             : // System
     246             : 
     247             : #define SystemWakeUpType_ENUMERATORS\
     248             :     ENUM(other, 1)\
     249             :     ENUM(unknown, 2)\
     250             :     ENUM(apm_timer, 3)\
     251             :     ENUM(modem_ring, 4)\
     252             :     ENUM(lan_remote, 5)\
     253             :     ENUM(power_switch, 6)\
     254             :     ENUM(pci_pme, 7)\
     255             :     ENUM(ac_power_restored, 8)
     256             : 
     257             : #define System_FIELDS\
     258             :     FIELD(0, const char*, manufacturer, "")\
     259             :     FIELD(0, const char*, productName, "")\
     260             :     FIELD(0, const char*, version, "")\
     261             :     FIELD(0, const char*, serialNumber, "")\
     262             :     FIELD(F_HEX, u64, uuid0, "")\
     263             :     FIELD(F_HEX, u64, uuid1, "")\
     264             :     FIELD(0, SystemWakeUpType, wakeUpType, "")\
     265             :     FIELD(0, const char*, skuNumber, "")\
     266             :     FIELD(0, const char*, m_Family, "")
     267             : 
     268             : 
     269             : //-----------------------------------------------------------------------------
     270             : // Baseboard
     271             : 
     272             : #define BaseboardFlags_ENUMERATORS\
     273             :     ENUM(motherboard, 0x01)\
     274             :     ENUM(requires_add_in, 0x02)\
     275             :     ENUM(removable, 0x04)\
     276             :     ENUM(replaceable, 0x08)\
     277             :     ENUM(hot_swappable, 0x10)
     278             : 
     279             : #define BaseboardType_ENUMERATORS\
     280             :     ENUM(other, 1)\
     281             :     ENUM(unknown, 2)\
     282             :     ENUM(blade, 3)\
     283             :     ENUM(connectivity_switch, 4)\
     284             :     ENUM(system_management, 5)\
     285             :     ENUM(processor, 6)\
     286             :     ENUM(io, 7)\
     287             :     ENUM(memory, 8)\
     288             :     ENUM(daughter, 9)\
     289             :     ENUM(motherboard, 10)\
     290             :     ENUM(processor_memory, 11)\
     291             :     ENUM(processor_io, 12)\
     292             :     ENUM(interconnect, 13)
     293             : 
     294             : #define Baseboard_FIELDS\
     295             :     FIELD(0, const char*, manufacturer, "")\
     296             :     FIELD(0, const char*, product, "")\
     297             :     FIELD(0, const char*, version, "")\
     298             :     FIELD(0, const char*, serialNumber, "")\
     299             :     FIELD(0, const char*, assetTag, "")\
     300             :     FIELD(0, BaseboardFlags, flags, "")\
     301             :     FIELD(0, const char*, location, "")\
     302             :     FIELD(0, Handle, hChassis, "")\
     303             :     FIELD(0, BaseboardType, type, "")\
     304             :     /* omit subsequent fields because we can't handle the variable-length contained objects */
     305             : 
     306             : 
     307             : //-----------------------------------------------------------------------------
     308             : // Chassis
     309             : 
     310             : #define ChassisType_ENUMERATORS\
     311             :     ENUM(other, 1)\
     312             :     ENUM(unknown, 2)\
     313             :     ENUM(desktop, 3)\
     314             :     ENUM(low_profile_desktop, 4)\
     315             :     ENUM(pizza_box, 5)\
     316             :     ENUM(mini_tower, 6)\
     317             :     ENUM(tower, 7)\
     318             :     ENUM(portable, 8)\
     319             :     ENUM(laptop, 9)\
     320             :     ENUM(notebook, 10)\
     321             :     ENUM(handheld, 11)\
     322             :     ENUM(docking_station, 12)\
     323             :     ENUM(all_in_one, 13)\
     324             :     ENUM(subnotebook, 14)\
     325             :     ENUM(space_saving, 15)\
     326             :     ENUM(lunchbox, 16)\
     327             :     ENUM(main_server, 17)\
     328             :     ENUM(expansion, 18)\
     329             :     ENUM(sub, 19)\
     330             :     ENUM(bus_expansion, 20)\
     331             :     ENUM(peripheral, 21)\
     332             :     ENUM(raid, 22)\
     333             :     ENUM(rack_mount, 23)\
     334             :     ENUM(sealed_case, 24)\
     335             :     ENUM(multi_system, 25)\
     336             :     ENUM(compact_pci, 26)\
     337             :     ENUM(advanced_tca, 27)\
     338             :     ENUM(blade, 28)\
     339             :     ENUM(blade_enclosure, 29)
     340             : 
     341             : #define ChassisSecurityStatus_ENUMERATORS\
     342             :     ENUM(other, 1)\
     343             :     ENUM(unknown, 2)\
     344             :     ENUM(none, 3)\
     345             :     ENUM(external_interface_locked, 4)\
     346             :     ENUM(external_interface_enabled, 5)
     347             : 
     348             : #define Chassis_FIELDS\
     349             :     FIELD(0, const char*, manufacturer, "")\
     350             :     FIELD(0, ChassisType, type, "")\
     351             :     FIELD(0, const char*, version, "")\
     352             :     FIELD(0, const char*, serialNumber, "")\
     353             :     FIELD(0, const char*, assetTag, "")\
     354             :     FIELD(0, State, state, "")\
     355             :     FIELD(0, State, powerState, "")\
     356             :     FIELD(0, State, thermalState, "")\
     357             :     FIELD(0, ChassisSecurityStatus, securityStatus, "")\
     358             :     FIELD(0, u32, oemDefined, "")\
     359             :     FIELD(0, u8, height, "U")\
     360             :     FIELD(0, u8, numPowerCords, "")\
     361             :     /* omit subsequent fields because we can't handle the variable-length contained objects */
     362             : 
     363             : 
     364             : //-----------------------------------------------------------------------------
     365             : // Processor
     366             : 
     367             : #define ProcessorType_ENUMERATORS\
     368             :     ENUM(other, 1)\
     369             :     ENUM(unknown, 2)\
     370             :     ENUM(CPU, 3)\
     371             :     ENUM(FPU, 4)\
     372             :     ENUM(DSP, 5)\
     373             :     ENUM(GPU, 6)
     374             : 
     375             : #define ProcessorStatus_ENUMERATORS\
     376             :     ENUM(unknown, 0)\
     377             :     ENUM(other, 7)\
     378             :     ENUM(enabled, 1)\
     379             :     ENUM(user_disabled, 2)\
     380             :     ENUM(post_disabled, 3)\
     381             :     ENUM(idle, 4)
     382             : 
     383             : #define ProcessorUpgrade_ENUMERATORS\
     384             :     ENUM(other, 1)\
     385             :     ENUM(unknown, 2)\
     386             :     ENUM(daughter, 3)\
     387             :     ENUM(zif, 4)\
     388             :     ENUM(piggyback, 5)\
     389             :     ENUM(none, 6)\
     390             :     ENUM(lif, 7)\
     391             :     ENUM(slot_1, 8)\
     392             :     ENUM(slot_2, 9)\
     393             :     ENUM(socket_370, 10)\
     394             :     ENUM(slot_a, 11)\
     395             :     ENUM(slot_m, 12)\
     396             :     ENUM(socket_423, 13)\
     397             :     ENUM(socket_a, 14)\
     398             :     ENUM(socket_478, 15)\
     399             :     ENUM(socket_754, 16)\
     400             :     ENUM(socket_940, 17)\
     401             :     ENUM(socket_939, 18)\
     402             :     ENUM(socket_604, 19)\
     403             :     ENUM(socket_771, 20)\
     404             :     ENUM(socket_775, 21)\
     405             :     ENUM(socket_s1, 22)\
     406             :     ENUM(socket_am2, 23)\
     407             :     ENUM(socket_1207, 24)\
     408             :     ENUM(socket_1366, 25)\
     409             :     ENUM(socket_g34, 26)\
     410             :     ENUM(socket_am3, 27)\
     411             :     ENUM(socket_c32, 28)\
     412             :     ENUM(socket_1156, 29)\
     413             :     ENUM(socket_1567, 30)\
     414             :     ENUM(socket_988a, 31)\
     415             :     ENUM(socket_1288, 32)\
     416             :     ENUM(socket_988b, 33)\
     417             :     ENUM(socket_1023, 34)\
     418             :     ENUM(socket_1224, 35)\
     419             :     ENUM(socket_1155, 36)\
     420             :     ENUM(socket_1356, 37)\
     421             :     ENUM(socket_2011, 38)\
     422             :     ENUM(socket_fs1, 39)\
     423             :     ENUM(socket_fs2, 40)\
     424             :     ENUM(socket_fm1, 41)\
     425             :     ENUM(socket_fm2, 42)
     426             : 
     427             : #define ProcessorFlags_ENUMERATORS\
     428             :     ENUM(unknown, 0x2)\
     429             :     ENUM(x64, 0x4)\
     430             :     ENUM(multi_core, 0x8)/* indicates cores are present, but they might be disabled*/\
     431             :     ENUM(ht, 0x10)\
     432             :     ENUM(execute_protection, 0x20)\
     433             :     ENUM(enhanced_virtualization, 0x40)\
     434             :     ENUM(power_control, 0x80)
     435             : 
     436             : #define Processor_FIELDS\
     437             :     FIELD(0, const char*, socket, "")\
     438             :     FIELD(0, ProcessorType, type, "")\
     439             :     FIELD(0, u8, m_Family, "") /* we don't bother providing enumerators for > 200 families */\
     440             :     FIELD(0, const char*, manufacturer, "")\
     441             :     FIELD(F_HEX, u64, id, "")\
     442             :     FIELD(0, const char*, version, "")\
     443             :     FIELD(0, u8, voltage, " dV")\
     444             :     FIELD(0, u16, externalClockFrequency, " MHz")\
     445             :     FIELD(0, u16, maxFrequency, " MHz")\
     446             :     FIELD(0, u16, bootFrequency, " MHz")\
     447             :     FIELD(0, ProcessorStatus, status, "")\
     448             :     FIELD(0, ProcessorUpgrade, upgrade, "")\
     449             :     FIELD(0, Handle, hL1, "")\
     450             :     FIELD(0, Handle, hL2, "")\
     451             :     FIELD(0, Handle, hL3, "")\
     452             :     FIELD(0, const char*, serialNumber, "")\
     453             :     FIELD(0, const char*, assetTag, "")\
     454             :     FIELD(0, const char*, partNumber, "")\
     455             :     FIELD(0, u8, coresPerPackage, "")\
     456             :     FIELD(0, u8, enabledCores, "")\
     457             :     FIELD(0, u8, logicalPerPackage, "")\
     458             :     FIELD(0, ProcessorFlags, flags, "")\
     459             :     FIELD(0, u16, family2, "")\
     460             :     FIELD(F_DERIVED, bool, populated, "")
     461             : 
     462             : 
     463             : //-----------------------------------------------------------------------------
     464             : // Cache
     465             : 
     466             : #define CacheMode_ENUMERATORS\
     467             :     ENUM(write_through, 0)\
     468             :     ENUM(write_back, 1)\
     469             :     ENUM(varies, 2)\
     470             :     ENUM(unknown, 3)
     471             : 
     472             : #define CacheLocation_ENUMERATORS\
     473             :     ENUM(internal, 0)\
     474             :     ENUM(external, 1)\
     475             :     ENUM(reserved, 2)\
     476             :     ENUM(unknown, 3)
     477             : 
     478             : #define CacheConfigurationFlags_ENUMERATORS\
     479             :     ENUM(socketed, 0x08)\
     480             :     ENUM(enabled, 0x80)
     481             : 
     482             : #define CacheFlags_ENUMERATORS\
     483             :     ENUM(other, 0x01)\
     484             :     ENUM(unknown, 0x02)\
     485             :     ENUM(non_burst, 0x04)\
     486             :     ENUM(burst, 0x08)\
     487             :     ENUM(pipeline_burst, 0x10)\
     488             :     ENUM(synchronous, 0x20)\
     489             :     ENUM(asynchronous, 0x40)
     490             : 
     491             : #define CacheType_ENUMERATORS\
     492             :     ENUM(other, 1)\
     493             :     ENUM(unknown, 2)\
     494             :     ENUM(instruction, 3)\
     495             :     ENUM(data, 4)\
     496             :     ENUM(unified, 5)
     497             : 
     498             : #define CacheAssociativity_ENUMERATORS\
     499             :     ENUM(other, 1)\
     500             :     ENUM(unknown, 2)\
     501             :     ENUM(direct_mapped, 3)\
     502             :     ENUM(A2, 4)\
     503             :     ENUM(A4, 5)\
     504             :     ENUM(full, 6)\
     505             :     ENUM(A8, 7)\
     506             :     ENUM(A16, 8)\
     507             :     ENUM(A12, 9)\
     508             :     ENUM(A24, 10)\
     509             :     ENUM(A32, 11)\
     510             :     ENUM(A48, 12)\
     511             :     ENUM(A64, 13)\
     512             :     ENUM(A20, 14)
     513             : 
     514             : #define Cache_FIELDS\
     515             :     FIELD(0, const char*, designation, "")\
     516             :     FIELD(0, CacheConfigurationFlags, configuration, "")\
     517             :     FIELD(F_INTERNAL, u16, maxSize16, "")\
     518             :     FIELD(F_INTERNAL, u16, installedSize16, "")\
     519             :     FIELD(0, CacheFlags, supportedFlags, "")\
     520             :     FIELD(0, CacheFlags, currentFlags, "")\
     521             :     FIELD(0, u8, speed, " ns")\
     522             :     FIELD(0, ECC, ecc, "")\
     523             :     FIELD(0, CacheType, type, "")\
     524             :     FIELD(0, CacheAssociativity, m_Associativity, "")\
     525             :     FIELD(F_DERIVED, size_t, level, "") /* 1..8 */\
     526             :     FIELD(F_DERIVED, CacheLocation, location, "")\
     527             :     FIELD(F_DERIVED, CacheMode, mode, "")\
     528             :     FIELD(F_DERIVED, Size<u64>, maxSize, "")\
     529             :     FIELD(F_DERIVED, Size<u64>, installedSize, "")
     530             : 
     531             : 
     532             : //-----------------------------------------------------------------------------
     533             : // PortConnector
     534             : 
     535             : #define PortConnectorType_ENUMERATORS\
     536             :     ENUM(other, 255)\
     537             :     ENUM(none, 0)\
     538             :     ENUM(centronics, 1)\
     539             :     ENUM(mini_centronics, 2)\
     540             :     ENUM(proprietary, 3)\
     541             :     ENUM(db25_male, 4)\
     542             :     ENUM(db25_pin_female, 5)\
     543             :     ENUM(db15_pin_male, 6)\
     544             :     ENUM(db15_pin_female, 7)\
     545             :     ENUM(db9_pin_male, 8)\
     546             :     ENUM(db9_pin_female, 9)\
     547             :     ENUM(rj11, 10)\
     548             :     ENUM(rj45, 11)\
     549             :     ENUM(mini_scsi, 12)\
     550             :     ENUM(mini_din, 13)\
     551             :     ENUM(micro_din, 14)\
     552             :     ENUM(ps2, 15)\
     553             :     ENUM(infrared, 16)\
     554             :     ENUM(hp_hil, 17)\
     555             :     ENUM(access_bus_usb, 18)\
     556             :     ENUM(pc_ssa_scsi, 19)\
     557             :     ENUM(din8_male, 20)\
     558             :     ENUM(din8_female, 21)\
     559             :     ENUM(on_board_ide, 22)\
     560             :     ENUM(on_board_floppy, 23)\
     561             :     ENUM(dual_inline_9, 24)\
     562             :     ENUM(dual_inline_25, 25)\
     563             :     ENUM(dual_inline_50, 26)\
     564             :     ENUM(dual_inline_68, 27)\
     565             :     ENUM(on_board_sound_input_from_cd, 28)\
     566             :     ENUM(mini_centronics_14, 29)\
     567             :     ENUM(mini_centronics_26, 30)\
     568             :     ENUM(headphones, 31)\
     569             :     ENUM(bnc, 32)\
     570             :     ENUM(pc_firewire, 33)\
     571             :     ENUM(sas_sata, 34)\
     572             :     ENUM(pc_98, 160)\
     573             :     ENUM(pc_98_hireso, 161)\
     574             :     ENUM(pc_h98, 162)\
     575             :     ENUM(pc_98_note, 163)\
     576             :     ENUM(pc_98_full, 164)
     577             : 
     578             : #define PortType_ENUMERATORS\
     579             :     ENUM(other, 255)\
     580             :     ENUM(none, 0)\
     581             :     ENUM(parallel_xt_at, 1)\
     582             :     ENUM(parallel_ps2, 2)\
     583             :     ENUM(parallel_ecp, 3)\
     584             :     ENUM(parallel_epp, 4)\
     585             :     ENUM(parallel_ecepp, 5)\
     586             :     ENUM(serial_xt_at, 6)\
     587             :     ENUM(serial_16450, 7)\
     588             :     ENUM(serial_16550, 8)\
     589             :     ENUM(serial_16550a, 9)\
     590             :     ENUM(scsi, 10)\
     591             :     ENUM(midi, 11)\
     592             :     ENUM(joystick, 12)\
     593             :     ENUM(keyboard, 13)\
     594             :     ENUM(mouse, 14)\
     595             :     ENUM(ssa_scsi, 15)\
     596             :     ENUM(usb, 16)\
     597             :     ENUM(firewire, 17)\
     598             :     ENUM(pcmcia_i, 18)\
     599             :     ENUM(pcmcia_ii, 19)\
     600             :     ENUM(pcmcia_iii, 20)\
     601             :     ENUM(cardbus, 21)\
     602             :     ENUM(access_bus, 22)\
     603             :     ENUM(scsi_ii, 23)\
     604             :     ENUM(scsi_wide, 24)\
     605             :     ENUM(pc_98, 25)\
     606             :     ENUM(pc_98_hireso, 26)\
     607             :     ENUM(pc_h98, 27)\
     608             :     ENUM(video, 28)\
     609             :     ENUM(audio, 29)\
     610             :     ENUM(modem, 30)\
     611             :     ENUM(network, 31)\
     612             :     ENUM(sata, 32)\
     613             :     ENUM(sas, 33)\
     614             :     ENUM(_8251_compatible, 160)\
     615             :     ENUM(_8251_fifo_compatible, 161)
     616             : 
     617             : #define PortConnector_FIELDS\
     618             :     FIELD(0, const char*, internalDesignator, "")\
     619             :     FIELD(0, PortConnectorType, internalConnectorType, "")\
     620             :     FIELD(0, const char*, externalDesignator, "")\
     621             :     FIELD(0, PortConnectorType, externalConnectorType, "")\
     622             :     FIELD(0, PortType, portType, "")
     623             : 
     624             : 
     625             : //-----------------------------------------------------------------------------
     626             : // SystemSlot
     627             : 
     628             : #define SystemSlotType_ENUMERATORS\
     629             :     ENUM(other, 1)\
     630             :     ENUM(unknown, 2)\
     631             :     ENUM(isa, 3)\
     632             :     ENUM(mca, 4)\
     633             :     ENUM(eisa, 5)\
     634             :     ENUM(pci, 6)\
     635             :     ENUM(pcmcia, 7)\
     636             :     ENUM(vesa, 8)\
     637             :     ENUM(proprietary, 9)\
     638             :     ENUM(processor, 10)\
     639             :     ENUM(memory_card, 11)\
     640             :     ENUM(io_riser, 12)\
     641             :     ENUM(nubus, 13)\
     642             :     ENUM(pci_66, 14)\
     643             :     ENUM(agp, 15)\
     644             :     ENUM(agp_2x, 16)\
     645             :     ENUM(agp_4x, 17)\
     646             :     ENUM(pcix, 18)\
     647             :     ENUM(agp_8x, 19)\
     648             :     ENUM(pc_98_c20, 160)\
     649             :     ENUM(pc_98_c24, 161)\
     650             :     ENUM(pc_98_e, 162)\
     651             :     ENUM(pc_98_local_bus, 163)\
     652             :     ENUM(pc_98_card, 164)\
     653             :     ENUM(pcie, 165)\
     654             :     ENUM(pcie_x1, 166)\
     655             :     ENUM(pcie_x2, 167)\
     656             :     ENUM(pcie_x4, 168)\
     657             :     ENUM(pcie_x8, 169)\
     658             :     ENUM(pcie_x16, 170)\
     659             :     ENUM(pcie2, 171)\
     660             :     ENUM(pcie2_x1, 172)\
     661             :     ENUM(pcie2_x2, 173)\
     662             :     ENUM(pcie2_x4, 174)\
     663             :     ENUM(pcie2_x8, 175)\
     664             :     ENUM(pcie2_x16, 176)\
     665             :     ENUM(pcie3, 177)\
     666             :     ENUM(pcie3_x1, 178)\
     667             :     ENUM(pcie3_x2, 179)\
     668             :     ENUM(pcie3_x4, 180)\
     669             :     ENUM(pcie3_x8, 181)\
     670             :     ENUM(pcie3_x16, 182)
     671             : 
     672             : #define SystemSlotBusWidth_ENUMERATORS\
     673             :     ENUM(other, 1)\
     674             :     ENUM(unknown, 2)\
     675             :     ENUM(_8, 3)\
     676             :     ENUM(_16, 4)\
     677             :     ENUM(_32, 5)\
     678             :     ENUM(_64, 6)\
     679             :     ENUM(_128, 7)\
     680             :     ENUM(x1, 8)\
     681             :     ENUM(x2, 9)\
     682             :     ENUM(x4, 10)\
     683             :     ENUM(x8, 11)\
     684             :     ENUM(x12, 12)\
     685             :     ENUM(x16, 13)\
     686             :     ENUM(x32, 14)
     687             : 
     688             : #define SystemSlotUsage_ENUMERATORS\
     689             :     ENUM(other, 1)\
     690             :     ENUM(unknown, 2)\
     691             :     ENUM(available, 3)\
     692             :     ENUM(in_use, 4)
     693             : 
     694             : #define SystemSlotLength_ENUMERATORS\
     695             :     ENUM(other, 1)\
     696             :     ENUM(unknown, 2)\
     697             :     ENUM(_short, 3)\
     698             :     ENUM(_long, 4)
     699             : 
     700             : #define SystemSlotFlags1_ENUMERATORS\
     701             :     ENUM(unknown, 0x1)\
     702             :     ENUM(v5, 0x2)\
     703             :     ENUM(v3_3, 0x4)\
     704             :     ENUM(shared, 0x8)\
     705             :     ENUM(pc_card_16, 0x10)\
     706             :     ENUM(pc_cardbus, 0x20)\
     707             :     ENUM(pc_zoom_video, 0x40)\
     708             :     ENUM(pc_modem_ring_resume, 0x80)
     709             : 
     710             : #define SystemSlotFlags2_ENUMERATORS\
     711             :     ENUM(pme, 0x1)\
     712             :     ENUM(hot_plug, 0x2)\
     713             :     ENUM(smbus, 0x4)\
     714             : 
     715             : #define SystemSlot_FIELDS\
     716             :     FIELD(0, const char*, designation, "")\
     717             :     FIELD(0, SystemSlotType, type, "")\
     718             :     FIELD(0, SystemSlotBusWidth, busWidth, "")\
     719             :     FIELD(0, SystemSlotUsage, usage, "")\
     720             :     FIELD(0, SystemSlotLength, length, "")\
     721             :     FIELD(0, u16, id, "")\
     722             :     FIELD(0, SystemSlotFlags1, flags1, "")\
     723             :     FIELD(0, SystemSlotFlags2, flags2, "")\
     724             :     FIELD(0, u16, segmentGroupNumber, "")\
     725             :     FIELD(0, u8, busNumber, "")\
     726             :     FIELD(F_INTERNAL, u8, functionAndDeviceNumber, "")\
     727             :     FIELD(F_DERIVED, u8, deviceNumber, "")\
     728             :     FIELD(F_DERIVED, u8, functionNumber, "")
     729             : 
     730             : 
     731             : //-----------------------------------------------------------------------------
     732             : // OnBoardDevices
     733             : 
     734             : #define OnBoardDeviceType_ENUMERATORS\
     735             :     ENUM(other, 1)\
     736             :     ENUM(unknown, 2)\
     737             :     ENUM(video, 3)\
     738             :     ENUM(scsi_controller, 4)\
     739             :     ENUM(ethernet, 5)\
     740             :     ENUM(token_ring, 6)\
     741             :     ENUM(sound, 7)\
     742             :     ENUM(pata_controller, 8)\
     743             :     ENUM(sata_controller, 9)\
     744             :     ENUM(sas_controller, 10)
     745             : 
     746             : #define OnBoardDevices_FIELDS\
     747             :     FIELD(0, OnBoardDeviceType, type, "")\
     748             :     FIELD(0, const char*, description, "")\
     749             :     FIELD(F_DERIVED, bool, enabled, "")\
     750             :     /* NB: this structure could contain any number of type/description pairs, but Dell BIOS only provides 1 */
     751             : 
     752             : 
     753             : //-----------------------------------------------------------------------------
     754             : // MemoryArray
     755             : 
     756             : #define MemoryArrayLocation_ENUMERATORS\
     757             :     ENUM(other, 1)\
     758             :     ENUM(unknown, 2)\
     759             :     ENUM(motherboard, 3)\
     760             :     ENUM(isa_addon, 4)\
     761             :     ENUM(eisa_addon, 5)\
     762             :     ENUM(pci_addon, 6)\
     763             :     ENUM(mca_addon, 7)\
     764             :     ENUM(pcmcia_addon, 8)\
     765             :     ENUM(proprietary_addon, 9)\
     766             :     ENUM(nubus, 10)\
     767             :     ENUM(pc_98_c20, 160)\
     768             :     ENUM(pc_98_c24, 161)\
     769             :     ENUM(pc_98_e, 162)\
     770             :     ENUM(pc_98_local_bus, 163)
     771             : 
     772             : #define MemoryArrayUse_ENUMERATORS\
     773             :     ENUM(other, 1)\
     774             :     ENUM(unknown, 2)\
     775             :     ENUM(system, 3)\
     776             :     ENUM(video, 4)\
     777             :     ENUM(flash, 5)\
     778             :     ENUM(nvram, 6)\
     779             :     ENUM(cache, 7)
     780             : 
     781             : #define MemoryArray_FIELDS\
     782             :     FIELD(0, MemoryArrayLocation, location, "")\
     783             :     FIELD(0, MemoryArrayUse, use, "")\
     784             :     FIELD(0, ECC, ecc, "")\
     785             :     FIELD(F_INTERNAL, u32, maxCapacity32, "")\
     786             :     FIELD(0, Handle, hError, "")\
     787             :     FIELD(0, u16, numDevices, "")\
     788             :     FIELD(0, Size<u64>, maxCapacity, "")
     789             : 
     790             : 
     791             : //-----------------------------------------------------------------------------
     792             : // MemoryDevice
     793             : 
     794             : #define MemoryDeviceFormFactor_ENUMERATORS\
     795             :     ENUM(other, 1)\
     796             :     ENUM(unknown, 2)\
     797             :     ENUM(SIMM, 3)\
     798             :     ENUM(SIP, 4)\
     799             :     ENUM(chip, 5)\
     800             :     ENUM(DIP, 6)\
     801             :     ENUM(ZIP, 7)\
     802             :     ENUM(proprietary_card, 8)\
     803             :     ENUM(DIMM, 9)\
     804             :     ENUM(TSOP, 10)\
     805             :     ENUM(row_of_chips, 11)\
     806             :     ENUM(RIMM, 12)\
     807             :     ENUM(SODIMM, 13)\
     808             :     ENUM(SRIMM, 14)\
     809             :     ENUM(FBDIMM, 15)
     810             : 
     811             : #define MemoryDeviceType_ENUMERATORS\
     812             :     ENUM(other, 1)\
     813             :     ENUM(unknown, 2)\
     814             :     ENUM(DRAM, 3)\
     815             :     ENUM(EDRAM, 4)\
     816             :     ENUM(VRAM, 5)\
     817             :     ENUM(SRAM, 6)\
     818             :     ENUM(RAM, 7)\
     819             :     ENUM(ROM, 8)\
     820             :     ENUM(FLASH, 9)\
     821             :     ENUM(EEPROM, 10)\
     822             :     ENUM(FEPROM, 11)\
     823             :     ENUM(EPROM, 12)\
     824             :     ENUM(CRRAM, 13)\
     825             :     ENUM(_3DRAM, 14)\
     826             :     ENUM(SDRAM, 15)\
     827             :     ENUM(SGRAM, 16)\
     828             :     ENUM(RDRAM, 17)\
     829             :     ENUM(DDR, 18)\
     830             :     ENUM(DDR2, 19)\
     831             :     ENUM(DDR2_FBDIMM, 20)\
     832             :     ENUM(DDR3, 24)\
     833             :     ENUM(FBD2, 25)
     834             : 
     835             : #define MemoryDeviceTypeFlags_ENUMERATORS\
     836             :     ENUM(other, 0x0002)\
     837             :     ENUM(unknown, 0x0004)\
     838             :     ENUM(fast_paged, 0x0008)\
     839             :     ENUM(static_column, 0x0010)\
     840             :     ENUM(pseudo_static, 0x0020)\
     841             :     ENUM(rambus, 0x0040)\
     842             :     ENUM(synchronous, 0x0080)\
     843             :     ENUM(cmos, 0x0100)\
     844             :     ENUM(edo, 0x0200)\
     845             :     ENUM(window_dram, 0x0400)\
     846             :     ENUM(cache_dram, 0x0800)\
     847             :     ENUM(non_volatile, 0x1000)\
     848             :     ENUM(buffered, 0x2000)\
     849             :     ENUM(unbuffered, 0x4000)
     850             : 
     851             : #define MemoryDevice_FIELDS\
     852             :     FIELD(0, Handle, hMemoryArray, "")\
     853             :     FIELD(0, Handle, hError, "")\
     854             :     FIELD(0, u16, totalWidth, " bits")\
     855             :     FIELD(0, u16, dataWidth, " bits")\
     856             :     FIELD(F_INTERNAL, u16, size16, "")\
     857             :     FIELD(0, MemoryDeviceFormFactor, formFactor, "")\
     858             :     FIELD(0, u8, deviceSet, "")\
     859             :     FIELD(0, const char*, locator, "")\
     860             :     FIELD(0, const char*, bank, "")\
     861             :     FIELD(0, MemoryDeviceType, type, "")\
     862             :     FIELD(0, MemoryDeviceTypeFlags, typeFlags, "")\
     863             :     FIELD(0, u16, speed, " MHz")\
     864             :     FIELD(0, const char*, manufacturer, "")\
     865             :     FIELD(0, const char*, serialNumber, "")\
     866             :     FIELD(0, const char*, assetTag, "")\
     867             :     FIELD(0, const char*, partNumber, "")\
     868             :     FIELD(F_INTERNAL, u8, attributes, "")\
     869             :     FIELD(F_INTERNAL, u32, size32, "")\
     870             :     FIELD(0, u16, configuredSpeed, " MHz")\
     871             :     FIELD(F_DERIVED, Size<u64>, size, "")\
     872             :     FIELD(F_DERIVED, u8, rank, "")\
     873             : 
     874             : 
     875             : //-----------------------------------------------------------------------------
     876             : // MemoryArrayMappedAddress
     877             : 
     878             : #define MemoryArrayMappedAddress_FIELDS\
     879             :     FIELD(F_INTERNAL, u32, startAddress32, "")\
     880             :     FIELD(F_INTERNAL, u32, endAddress32, "")\
     881             :     FIELD(0, Handle, hMemoryArray, "")\
     882             :     FIELD(0, u8, partitionWidth, "")\
     883             :     FIELD(F_HEX, u64, startAddress, "")\
     884             :     FIELD(F_HEX, u64, endAddress, "")
     885             : 
     886             : 
     887             : //-----------------------------------------------------------------------------
     888             : // MemoryDeviceMappedAddress
     889             : 
     890             : #define MemoryDeviceMappedAddress_FIELDS\
     891             :     FIELD(F_INTERNAL, u32, startAddress32, "")\
     892             :     FIELD(F_INTERNAL, u32, endAddress32, "")\
     893             :     FIELD(0, Handle, hMemoryDevice, "")\
     894             :     FIELD(0, Handle, hMemoryArrayMappedAddress, "")\
     895             :     FIELD(0, u8, partitionRowPosition, "")\
     896             :     FIELD(0, u8, interleavePosition, "")\
     897             :     FIELD(0, u8, interleavedDataDepth, "")\
     898             :     FIELD(F_HEX, u64, startAddress, "")\
     899             :     FIELD(F_HEX, u64, endAddress, "")
     900             : 
     901             : 
     902             : //----------------------------------------------------------------------------
     903             : // PortableBattery
     904             : 
     905             : #define PortableBatteryChemistry_ENUMERATORS\
     906             :     ENUM(other, 1)\
     907             :     ENUM(unknown, 2)\
     908             :     ENUM(lead_acid, 3)\
     909             :     ENUM(nickel_cadmium, 4)\
     910             :     ENUM(nickel_metal_hydride, 5)\
     911             :     ENUM(lithium_ion, 6)\
     912             :     ENUM(zinc_air, 7)\
     913             :     ENUM(lithium_polymer, 8)
     914             : 
     915             : #define PortableBattery_FIELDS\
     916             :     FIELD(0, const char*, location, "")\
     917             :     FIELD(0, const char*, manufacturer, "")\
     918             :     FIELD(0, const char*, date, "")\
     919             :     FIELD(0, const char*, serialNumber, "")\
     920             :     FIELD(0, const char*, deviceName, "")\
     921             :     FIELD(0, PortableBatteryChemistry, chemistry, "")\
     922             :     FIELD(0, u16, capacity, " mWh")\
     923             :     FIELD(0, u16, voltage, " mV")\
     924             :     FIELD(0, const char*, sbdsVersion, "")\
     925             :     FIELD(0, u8, maxError, "%")\
     926             :     FIELD(0, u16, sbdsSerialNumber, "")\
     927             :     FIELD(0, u16, sbdsDate, "")\
     928             :     FIELD(0, const char*, sbdsChemistry, "")\
     929             :     FIELD(0, u8, capacityMultiplier, "")\
     930             :     FIELD(0, u32, oemSpecific, "")
     931             : 
     932             : 
     933             : //----------------------------------------------------------------------------
     934             : // VoltageProbe
     935             : 
     936             : #define VoltageProbeLocation_ENUMERATORS\
     937             :     ENUM(other, 1)\
     938             :     ENUM(unknown, 2)\
     939             :     ENUM(processor, 3)\
     940             :     ENUM(disk, 4)\
     941             :     ENUM(peripheral_bay, 5)\
     942             :     ENUM(system_management_module, 6)\
     943             :     ENUM(motherboard, 7)\
     944             :     ENUM(memory_module, 8)\
     945             :     ENUM(processor_module, 9)\
     946             :     ENUM(power_unit, 10)\
     947             :     ENUM(add_in_card, 11)
     948             : 
     949             : #define VoltageProbe_FIELDS\
     950             :     FIELD(0, const char*, description, "")\
     951             :     FIELD(F_INTERNAL, u8, locationAndStatus, "")\
     952             :     FIELD(0, i16, maxValue, " mV")\
     953             :     FIELD(0, i16, minValue, " mV")\
     954             :     FIELD(0, i16, resolution, " x 0.1 mV")\
     955             :     FIELD(0, i16, tolerance, " mV")\
     956             :     FIELD(0, i16, accuracy, " x 0.01%")\
     957             :     FIELD(0, u32, oemDefined, "")\
     958             :     FIELD(0, i16, nominalValue, " mv")\
     959             :     FIELD(F_DERIVED, VoltageProbeLocation, location, "")\
     960             :     FIELD(F_DERIVED, State, status, "")
     961             : 
     962             : 
     963             : //----------------------------------------------------------------------------
     964             : // CoolingDevice
     965             : 
     966             : #define CoolingDeviceType_ENUMERATORS\
     967             :     ENUM(other, 1)\
     968             :     ENUM(unknown, 2)\
     969             :     ENUM(fan, 3)\
     970             :     ENUM(centrifugal_blower, 4)\
     971             :     ENUM(chip_fan, 5)\
     972             :     ENUM(cabinet_fan, 6)\
     973             :     ENUM(power_supply_fan, 7)\
     974             :     ENUM(heat_pipe, 8)\
     975             :     ENUM(integrated_refrigeration, 9)\
     976             :     ENUM(active_cooling, 16)\
     977             :     ENUM(passive_cooling, 17)
     978             : 
     979             : #define CoolingDevice_FIELDS\
     980             :     FIELD(0, Handle, hTemperatureProbe, "")\
     981             :     FIELD(F_INTERNAL, u8, typeAndStatus, "")\
     982             :     FIELD(0, u8, group, "")\
     983             :     FIELD(0, u32, oemDefined, "")\
     984             :     FIELD(0, u16, nominalSpeed, " rpm")\
     985             :     FIELD(0, const char*, description, "")\
     986             :     FIELD(F_DERIVED, CoolingDeviceType, type, "")\
     987             :     FIELD(F_DERIVED, State, status, "")
     988             : 
     989             : 
     990             : //----------------------------------------------------------------------------
     991             : // TemperatureProbe
     992             : 
     993             : #define TemperatureProbeLocation_ENUMERATORS\
     994             :     ENUM(other, 1)\
     995             :     ENUM(unknown, 2)\
     996             :     ENUM(processor, 3)\
     997             :     ENUM(disk, 4)\
     998             :     ENUM(peripheral_bay, 5)\
     999             :     ENUM(system_management_module, 6)\
    1000             :     ENUM(motherboard, 7)\
    1001             :     ENUM(memory_module, 8)\
    1002             :     ENUM(processor_module, 9)\
    1003             :     ENUM(power_unit, 10)\
    1004             :     ENUM(add_in_card, 11)\
    1005             :     ENUM(front_panel_board, 12)\
    1006             :     ENUM(back_panel_board, 13)\
    1007             :     ENUM(power_system_board, 14)\
    1008             :     ENUM(drive_backplane, 15)
    1009             : 
    1010             : #define TemperatureProbe_FIELDS\
    1011             :     FIELD(0, const char*, description, "")\
    1012             :     FIELD(F_INTERNAL, u8, locationAndStatus, "")\
    1013             :     FIELD(0, i16, maxValue, " dDegC")\
    1014             :     FIELD(0, i16, minValue, " dDegC")\
    1015             :     FIELD(0, i16, resolution, " mDegC")\
    1016             :     FIELD(0, i16, tolerance, " dDegC")\
    1017             :     FIELD(0, i16, accuracy, " x 0.01%")\
    1018             :     FIELD(0, u32, oemDefined, "")\
    1019             :     FIELD(0, i16, nominalValue, " dDegC")\
    1020             :     FIELD(F_DERIVED, TemperatureProbeLocation, location, "")\
    1021             :     FIELD(F_DERIVED, State, status, "")
    1022             : 
    1023             : 
    1024             : //----------------------------------------------------------------------------
    1025             : // SystemBoot
    1026             : 
    1027             : #define SystemBootStatus_ENUMERATORS\
    1028             :     ENUM(no_error, 0)\
    1029             :     ENUM(no_bootable_media, 1)\
    1030             :     ENUM(os_load_failed, 2)\
    1031             :     ENUM(hardware_failure_firmware, 3)\
    1032             :     ENUM(hardware_failure_os, 4)\
    1033             :     ENUM(user_requested_boot, 5)\
    1034             :     ENUM(security_violation, 6)\
    1035             :     ENUM(previously_requested_image, 7)\
    1036             :     ENUM(watchdog_expired, 8)
    1037             : 
    1038             : #define SystemBoot_FIELDS\
    1039             :     FIELD(F_INTERNAL, u32, reserved32, "")\
    1040             :     FIELD(F_INTERNAL, u16, reserved16, "")\
    1041             :     FIELD(0, SystemBootStatus, status, "")\
    1042             : 
    1043             : 
    1044             : //----------------------------------------------------------------------------
    1045             : // ManagementDevice
    1046             : 
    1047             : #define ManagementDeviceType_ENUMERATORS\
    1048             :     ENUM(other, 1)\
    1049             :     ENUM(unknown, 2)\
    1050             :     ENUM(LM75, 3)\
    1051             :     ENUM(LM78, 4)\
    1052             :     ENUM(LM79, 5)\
    1053             :     ENUM(LM80, 6)\
    1054             :     ENUM(LM81, 7)\
    1055             :     ENUM(ADM9240, 8)\
    1056             :     ENUM(DS1780, 9)\
    1057             :     ENUM(M1617, 0xA)\
    1058             :     ENUM(GL518SM, 0xB)\
    1059             :     ENUM(W83781D, 0xC)\
    1060             :     ENUM(HT82H791, 0xD)\
    1061             : 
    1062             : #define ManagementDeviceAddressType_ENUMERATORS\
    1063             :     ENUM(other, 1)\
    1064             :     ENUM(unknown, 2)\
    1065             :     ENUM(port, 3)\
    1066             :     ENUM(memory, 4)\
    1067             :     ENUM(smbus, 5)
    1068             : 
    1069             : #define ManagementDevice_FIELDS\
    1070             :     FIELD(0, const char*, description, "")\
    1071             :     FIELD(0, ManagementDeviceType, type, "")\
    1072             :     FIELD(0, u32, address, "")\
    1073             :     FIELD(0, ManagementDeviceAddressType, addressType, "")
    1074             : 
    1075             : 
    1076             : //----------------------------------------------------------------------------
    1077             : // ManagementDeviceComponent
    1078             : 
    1079             : #define ManagementDeviceComponent_FIELDS\
    1080             :     FIELD(0, const char*, description, "")\
    1081             :     FIELD(0, Handle, hDevice, "")\
    1082             :     FIELD(0, Handle, hComponent, "")\
    1083             :     FIELD(0, Handle, hThreshold, "")
    1084             : 
    1085             : 
    1086             : //----------------------------------------------------------------------------
    1087             : // ManagementDeviceThreshold
    1088             : 
    1089             : #define ManagementDeviceThreshold_FIELDS\
    1090             :     FIELD(0, i16, nonCriticalLo, "")\
    1091             :     FIELD(0, i16, nonCriticalHi, "")\
    1092             :     FIELD(0, i16, criticalLo, "")\
    1093             :     FIELD(0, i16, criticalHi, "")\
    1094             :     FIELD(0, i16, nonrecoverableLo, "")\
    1095             :     FIELD(0, i16, nonrecoverableHi, "")
    1096             : 
    1097             : 
    1098             : //----------------------------------------------------------------------------
    1099             : // SystemPowerSupply
    1100             : 
    1101             : #define SystemPowerSupplyCharacteristics_ENUMERATORS\
    1102             :     ENUM(hot_replaceable, 1)\
    1103             :     ENUM(present, 2)\
    1104             :     ENUM(unplugged, 4)
    1105             : 
    1106             : #define SystemPowerSupplyType_ENUMERATORS\
    1107             :     ENUM(other, 1)\
    1108             :     ENUM(unknown, 2)\
    1109             :     ENUM(linear, 3)\
    1110             :     ENUM(switching, 4)\
    1111             :     ENUM(battery, 5)\
    1112             :     ENUM(ups, 6)\
    1113             :     ENUM(converter, 7)\
    1114             :     ENUM(regulator, 8)
    1115             : 
    1116             : #define SystemPowerSupplyInputSwitching_ENUMERATORS\
    1117             :     ENUM(other, 1)\
    1118             :     ENUM(unknown, 2)\
    1119             :     ENUM(manual, 3)\
    1120             :     ENUM(auto_switch, 4)\
    1121             :     ENUM(wide_range, 5)\
    1122             :     ENUM(none, 6)
    1123             : 
    1124             : #define SystemPowerSupply_FIELDS\
    1125             :     FIELD(0, u8, group, "")\
    1126             :     FIELD(0, const char*, location, "")\
    1127             :     FIELD(0, const char*, deviceName, "")\
    1128             :     FIELD(0, const char*, manufacturer, "")\
    1129             :     FIELD(0, const char*, serialNumber, "")\
    1130             :     FIELD(0, const char*, assetTag, "")\
    1131             :     FIELD(0, const char*, partNumber, "")\
    1132             :     FIELD(0, const char*, revisionLevel, "")\
    1133             :     FIELD(0, i16, maxPower, " mW")\
    1134             :     FIELD(0, SystemPowerSupplyCharacteristics, characteristics, "")\
    1135             :     FIELD(0, Handle, hVoltageProbe, "")\
    1136             :     FIELD(0, Handle, hCoolingDevice, "")\
    1137             :     FIELD(0, Handle, hCurrentProbe, "")\
    1138             :     FIELD(F_DERIVED, SystemPowerSupplyType, type, "")\
    1139             :     FIELD(F_DERIVED, State, status, "")\
    1140             :     FIELD(F_DERIVED, SystemPowerSupplyInputSwitching, inputSwitching, "")\
    1141             : 
    1142             : 
    1143             : //----------------------------------------------------------------------------
    1144             : // OnboardDevices2
    1145             : 
    1146             : #define OnboardDevices2_FIELDS\
    1147             :     FIELD(0, const char*, referenceDesignation, "")\
    1148             :     FIELD(0, OnBoardDeviceType, type, "")\
    1149             :     FIELD(0, u8, instance, "")\
    1150             :     FIELD(0, u16, groupNumber, "")\
    1151             :     FIELD(0, u8, busNumber, "")\
    1152             :     FIELD(F_INTERNAL, u8, functionAndDeviceNumber, "")\
    1153             :     FIELD(F_DERIVED, bool, enabled, "")\
    1154             :     FIELD(F_DERIVED, u8, deviceNumber, "")\
    1155             :     FIELD(F_DERIVED, u8, functionNumber, "")\
    1156             : 
    1157             : 
    1158             : //-----------------------------------------------------------------------------
    1159             : 
    1160             : struct Header
    1161             : {
    1162             :     u8 id;
    1163             :     u8 length;
    1164             :     Handle handle;
    1165             : };
    1166             : 
    1167             : // define each enumeration:
    1168             : #define ENUM(enumerator, value) enumerator = value,
    1169             : // (a struct wrapper allows reusing common enumerator names such as `other'.)
    1170             : #define ENUMERATION(name, type)\
    1171             :     struct name\
    1172             :     {\
    1173             :         /* (determines how much data to read from SMBIOS) */\
    1174             :         typedef type T;\
    1175             :         name(): value((Enum)0) {}\
    1176             :         name(size_t num): value((Enum)num) {}\
    1177             :         /* (the existence of this member type indicates the field is an enum) */\
    1178             :         enum Enum { name##_ENUMERATORS sentinel } value;\
    1179             :         /* (allows generic Field comparison against numeric_limits) */\
    1180             :         operator size_t() const { return value; }\
    1181             :     };
    1182           0 : ENUMERATIONS
    1183             : #undef ENUMERATION
    1184             : #undef ENUM
    1185             : 
    1186             : // declare each structure
    1187             : #define FIELD(flags, type, name, units) type name;
    1188             : #define STRUCTURE(name, id)\
    1189             :     struct name\
    1190             :     {\
    1191             :         /* (allows searching for a structure with a given handle) */\
    1192             :         Header header;\
    1193             :         /* (defines a linked list of instances of this structure type) */\
    1194             :         name* next;\
    1195             :         name##_FIELDS\
    1196             :     };
    1197             : STRUCTURES
    1198             : #undef STRUCTURE
    1199             : #undef FIELD
    1200             : 
    1201             : // declare a struct holding pointers (freed at exit) to each structure
    1202             : struct Structures
    1203             : {
    1204             : #define STRUCTURE(name, id) name* name##_;
    1205             :     STRUCTURES
    1206             : #undef STRUCTURE
    1207             : };
    1208             : 
    1209             : #pragma pack(pop)
    1210             : 
    1211             : 
    1212             : //-----------------------------------------------------------------------------
    1213             : 
    1214             : /**
    1215             :  * @return a pointer to a static Structures (i.e. always valid), with its
    1216             :  * member pointers non-zero iff SMBIOS information is available and includes
    1217             :  * the corresponding structure.
    1218             :  *
    1219             :  * thread-safe; return value should be cached (if possible) to avoid an
    1220             :  * atomic comparison.
    1221             :  **/
    1222             : const Structures* GetStructures();
    1223             : 
    1224             : /**
    1225             :  * @return a string describing all structures (omitting fields with
    1226             :  * meaningless or dummy values).
    1227             :  **/
    1228             : std::string StringizeStructures(const Structures*);
    1229             : 
    1230             : }   // namespace SMBIOS
    1231             : 
    1232             : #endif  // #ifndef INCLUDED_SMBIOS

Generated by: LCOV version 1.13