1 /* Copyright (C) 2018 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 {
SizeSize145 	Size(): value(0) {}
SizeSize146 	Size(T value): value(value) {}
147 	T value;
TSize148 	operator T() const { return value; }
149 };
150 
151 // SMBIOS structure handle - only displayed if meaningful
152 struct Handle
153 {
HandleHandle154 	Handle(): value(0) {}
HandleHandle155 	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(removeable, 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 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 LIB_API const Structures* GetStructures();
1223 
1224 /**
1225  * @return a string describing all structures (omitting fields with
1226  * meaningless or dummy values).
1227  **/
1228 LIB_API std::string StringizeStructures(const Structures*);
1229 
1230 }	// namespace SMBIOS
1231 
1232 #endif	// #ifndef INCLUDED_SMBIOS
1233