Added SysRep (SMBIOS Parsing).

CPURep now partially uses SysRep.
This commit is contained in:
Void NV 2020-04-04 19:31:48 -05:00
parent 79c21f25c5
commit 0ce5c06733
11 changed files with 881 additions and 40 deletions

Binary file not shown.

View file

@ -1,3 +1,3 @@
copy -r -Force E:/* ~/Desktop/zenithos/src/
copy -r -Force D:/* ~/Desktop/zenithos/src/
del ~/Desktop/zenithos/*.iso
move ~/Desktop/zenithos/src/Tmp/MyDistro.ISO.C ~/Desktop/zenithos/Zenith-latest-$(get-date -Format "yyyy-MM-dd-HH_mm_ss").iso

View file

@ -685,8 +685,8 @@ U0 Varoom()
is_nl_pressed = Bt(kbd.down_bitmap, sc_nl);
is_esc_pressed = Bt(kbd.down_bitmap, SC_ESC);
if (is_left_pressed) c[0]. -= .000001;
if (is_right_pressed) c[0]. += .000001;
if (is_left_pressed) c[0]. -= .0000015;
if (is_right_pressed) c[0]. += .0000015;
if (is_up_pressed) c[0].speed += .004;
if (is_down_pressed)
{

View file

@ -21,7 +21,7 @@ I0 Color32Demo()
for (j = 0; j < SQUARE_SIZE; j++)
DrawPixel(x + i, y + j, color);
Sleep(1);
Busy(1000);
}
}

View file

@ -1,4 +1,7 @@
$WW,1$$FG,5$$TX+CX,"ChangeLog"$$FG$
$IV,1$----04/04/20 19:15:21----$IV,0$
* Added $LK,"SysRep",A="MN:SysRep"$(). Various $LK,"CSM*Info",A="MN:CSMBIOSBIOSInfo"$ classes added. Pass in a $LK,"SMBIOSt_*",A="MN:SMBIOSt_BIOS"$ to get info for that specific structure type. It parses SMBIOS structures located in low memory. Question-colon operator would have saved many lines of code.
$IV,1$----04/02/20 03:27:03----$IV,0$
* Added camera rotation via mouse in 3D $LK,"SpriteMesh",A="FF:::/Zenith/Gr/SpriteMesh.CC,SpriteMeshEd"$ editor. 360 used as magic number, trying $LK,"VIEWANGLES_RANGE",A="FF:::/Zenith/Ctrls/CtrlsA.CC,VIEWANGLES_RANGE"$ crashed it.

View file

@ -2374,6 +2374,248 @@ class CUAsmGlobals
mem_arg_mask;
};
#help_index "Devices/SMBIOS"
//SMBIOS parsing based on SMBIOS specification 3.3.0 (document "DSP0134")
#define SMBIOSt_BIOS 0
#define SMBIOSt_SYSTEM 1
#define SMBIOSt_BASEBOARD 2
#define SMBIOSt_ENCLOSURE 3
#define SMBIOSt_PROCESSOR 4
#define SMBIOSt_CACHE 7
#define SMBIOSt_CONNECTOR 8
#define SMBIOSt_SLOT 9
#define SMBIOSt_OEM_STRINGS 11
#define SMBIOSt_SYS_CONFIG_OPTIONS 12
#define SMBIOSt_PHYMEM 16
#define SMBIOSt_MEM_DEVICE 17
#define SMBIOSt_MAPPED_ADDR 19
#define SMBIOSt_BATTERY 22
#define SMBIOSt_BOOT_INFO 32
class CSMBIOSHeader
{//Section 6.1.2 line 885
U8 type, //SMBIOSt_*
length;
U16 handle; //identifier for this structure.
};
class CSMBIOSEntryPoint
{//Section 5.2.1 line 812
U8 anchor_str[4], // '_SM_'
checksum,
length,
major_version,
minor_version;
U16 max_structure_size;
U8 entry_point_revision,
formatted_area[5],
anchor_str2[5], // '_DMI_'
checksum2;
U16 table_length;
U32 table_address;
U16 structure_count;
U8 bcd_revision;
};
class CSMBIOSBIOSInfo
{//Section 7.1 line 922
CSMBIOSHeader header;
U8 vendor,
version;
U16 start_address_segment;
U8 release_date,
rom_size;
U64 flags;
U8 extended_flags[2];
U8 major_release,
minor_release,
embedded_controller_firmware_major_release,
embedded_controller_firmware_minor_release;
U16 extended_rom_size;
};
class CSMBIOSSystemInfo
{//Section 7.2 line 936
CSMBIOSHeader header;
U8 manufacturer,
product_name,
version,
serial_number,
uuid[16],
wakeup_type,
sku_number,
family;
};
class CSMBIOSBaseboardInfo
{//Section 7.3 line 968
CSMBIOSHeader header;
U8 manufacturer,
product,
version,
serial_number,
asset_tag,
feature_flags,
chassis_location;
U16 chassis_handle;
U8 board_type,
contained_object_handles_num;
U16 contained_object_handles[1]; //Variable length, member above gives length
};
class CSMBIOSEnclosureInfo
{//Section 7.4 line 984
CSMBIOSHeader header;
U8 manufacturer,
type,
version,
serial_number,
asset_tag,
bootup_state,
power_supply_state,
thermal_state,
security_status;
U32 oem_defined;
U8 height,
power_cord_count,
contained_element_count,
contained_element_record_length,
contained_elements[1]; //array length == count * record_length;
};
class CSMBIOSEnclosureContainedElement
{//Section 7.4.4 line 999
U8 contained_element_type,
contained_element_minimum,
contained_element_maximum;
};
class CSMBIOSProcessorInfo
{//Section 7.5 line 1010
CSMBIOSHeader header;
U8 name,
type,
family,
manufacturer;
U64 id;
U8 version,
voltage;
U16 external_clock,
max_speed,
current_speed;
U8 status,
upgrade;
U16 l1_cache_handle,
l2_cache_handle,
l3_cache_handle;
U8 serial_number,
asset_tag,
part_number,
core_count,
cores_enabled,
thread_count;
U16 characteristics;
};
class CSMBIOSCacheInfo
{//Section 7.8 line 1168
CSMBIOSHeader header;
U8 name;
U16 config,
max_size,
installed_size,
supported_sram_type,
installed_sram_type;
U8 cache_speed,
error_correction_type,
cache_type,
associativity;
};
class CSMBIOSConnectorInfo
{//Section 7.9 line 1198
CSMBIOSHeader header;
U8 internal_name,
internal_type,
external_name,
external_type,
port_type;
};
class CSMBIOSSlotInfo
{//Section 7.10 line 1226
CSMBIOSHeader header;
U8 name,
type,
data_bus_width,
current_usage,
length;
U16 id;
U8 flags1,
flags2;
U16 segment_group_number;
U8 bus_number,
device_function_number;
};
class CSMBIOSMemArrayInfo
{//Section 7.17 line 1519
CSMBIOSHeader header;
U8 location,
use,
memory_error_correction;
U32 max_capacity;
U16 memory_error_info_handle,
mem_device_count;
U64 extended_max_capacity;
};
class CSMBIOSMemDeviceInfo
{//Section 7.18 line 1538
CSMBIOSHeader header;
U16 memory_array_handle,
memory_error_info_handle,
total_width,
data_width,
size;
U8 form_factor,
device_set,
device_locator,
bank_locator,
type;
U16 type_detail,
speed;
U8 manufacturer,
serial_number,
asset_tag,
part_number,
attributes;
U32 extended_size;
U16 configured_speed,
min_voltage,
max_voltage,
configured_voltage;
};
class CSMBIOSBatteryInfo
{//Section 7.23 line 1723
CSMBIOSHeader header;
U8 location,
manufacturer,
manufacture_date,
serial_number,
name,
chemistry,
capacity,
voltage,
sbds_version_number,
max_battery_data_error,
sbds_serial_number,
sbds_manufacture_date,
sbds_chemistry,
capacity_multiplier;
U32 oem;
};
#help_index "Devices;PCI"
//PCI Registers, used with $LK,"PCIRead",A="MN:PCIReadU16"$ functions.

Binary file not shown.

View file

@ -974,10 +974,7 @@ $WW,0$*/
I64 i,message_code,sel_mode,arg1,arg2,make_tri_vertex_num=0,x,y,z;
CD3I32 p0a,p0b;
CMeshEdVertex *va[3],*tmpv;
Bool adjusting_z=FALSE,moving,save_and_exit;
Bool adjusting_camera_xy = FALSE;
Bool adjusting_camera_z = FALSE;
Bool adjusting_z=FALSE, moving, save_and_exit, adjusting_camera_xy = FALSE, adjusting_camera_z = FALSE;
CMeshFrame e;

View file

@ -25,43 +25,14 @@ U0 MPCPURep(CCPURep *cr)
public U0 CPURep(Bool full=FALSE)
{//Report name, number of cores and clock freq.
U8 *name;
I64 i, total_swaps, total_cycles;
F64 t0, tf;
CCPURep cr;
CRAXRBXRCXRDX regs;
CPUId(0x80000000, &regs);
if (regs.rax >= 0x80000004)
{//if getting full name is supported
name = MAlloc(4 * 4 * 3);
for (i = 2; i <= 4; i++)
{
CPUId(0x80000000 + i, &regs);
CatPrint(name, "%c%c%c%c", regs.rax, regs.rbx, regs.rcx, regs.rdx);
}
StrUtil(name, SUF_REM_LEADING | SUF_REM_TRAILING);
"%s\n\n", name;
Free(name);
}
else
{//Use vendor string
CPUId(0, &regs);
name = MStrPrint("%c%c%c", regs.rbx, regs.rdx, regs.rcx);
"Vendor: ";
if (!StrCompare(name, "AuthenticAMD"))
"Advanced Micro Devices, Inc.\n";
else if (!StrCompare(name, "GenuineIntel"))
"Intel Corporation\n";
else if (!StrCompare(name, "VIA VIA VIA ")) //for that one odd user
"VIA Technologies, Inc.\n";
else
"%s\n", name;
'\n';
Free(name);
}
SysRep(SMBIOSt_PROCESSOR);
if (!full)
"%03X Cores %6h?nHz\n",mp_count,ToF64(counts.time_stamp_freq);
"%03X Active Cores at %6h?nHz\n",mp_count,ToF64(counts.time_stamp_freq);
else {
cr.swaps=CAlloc(sizeof(I64)*mp_count);
cr.cycles=CAlloc(sizeof(I64)*mp_count);

View file

@ -1,5 +1,6 @@
Cd(__DIR__);;
#include "BinRep"
#include "SysRep"
#include "CPURep"
#include "Diff"
#include "Find"

627
src/Zenith/Utils/SysRep.CC Normal file
View file

@ -0,0 +1,627 @@
//SMBIOS parsing.
//Based on SMBIOS specification 3.3.0 (document "DSP0134")
U0 SMBIOSInit()
{
//Section 7.1.1 line 925 (BIOS characteristics)
DefineListLoad("ST_SMBIOS_BIOS_FLAGS", " \0 \0 \0 \0ISA\0MCA\0EISA\0PCI\0PC Card\0Plug and Play\0APM\0Flashable BIOS\0BIOS shadowing\0"
"VESA Local Bus\0ESCD\0CD Boot\0Selectable boot\0BIOS ROM socketed\0PC Card Boot\0Enhanced Disk Drive Services\0"
" \0 \0INT 0x13 5.25\"/360 KB Floppy Support\0INT 0x13 5.25\"/1.2 MB Floppy Support\0INT 0x13 3.5\"/720 KB Floppy Support\0"
"INT 0x13 3.5\"/2.88 MB Floppy Support\0"
"INT 0x05 Screen Printing\0INT 0x09 8042 Keyboard\0INT 0x14 Serial\0INT 0x17 Printer\0INT 0x10 CGA/Mono Video");
//Section 7.1.2.1 line 931 (BIOS characteristics extension byte 1)
DefineListLoad("ST_SMBIOS_BIOS_FLAGSEXT1",
"ACPI\0USB Legacy\0 \0 \0 \0 \0Serial Boot\0Smart Battery");
//Section 7.1.2.2 line 935 (BIOS characteristics extension byte 2)
DefineListLoad("ST_SMBIOS_BIOS_FLAGSEXT2", "BIOS Boot\0Network Boot\0Targeted Content Distribution\0UEFI\0Virtual Machine");
//Section 7.2.2 line 959 (system wakeup types)
DefineListLoad("ST_SMBIOS_WAKEUP_TYPES",
" \0Other\0Unknown\0APM Timer\0Modem Ring\0LAN Remote\0Power Switch\0PCI PME#\0AC Power Restored");
//Section 7.3.1 line 972 (baseboard feature flags)
DefineListLoad("ST_SMBIOS_BASEBOARD_FLAGS","Hosting Board (Motherboard)\0Requires Auxilary Board\0Removable\0Replaceable\0Hot Swappable");
//Section 7.3.2 line 977 (baseboard board types)
DefineListLoad("ST_SMBIOS_BASEBOARD_TYPES", " \0Unknown\0Other\0Server Blade\0Connectivity Switch\0"
"System Management Module\0Processor Module\0I/O Module\0Daughterboard\0Motherboard\0Processor/Memory Module\0"
"Processor/IO Module\0Interconnect Board\0");
//Section 7.4.1 line 988 (system enclosure types)
DefineListLoad("ST_SMBIOS_ENCLOSURE_TYPES", " \0Other\0Unknown\0Desktop\0Low Profile Desktop\0Pizza Box\0"
"Mini Tower\0Tower\0Portable\0Laptop\0Notebook\0Hand Held\0Docking Station\0All-in-One\0Sub Notebook\0"
"Space-saving\0Lunch box\0Main Server Chassis\0Expansion Chassis\0SubChassis\0Bus Expansion Chassis\0"
"Peripheral Chassis\0RAID Chassis\0Rack Mount Chassis\0Sealed-case PC\0Multi-system Chassis\0Compact PCI\0"
"Advanced TCA\0Blade\0Blade Enclosure\0Tablet\0Convertible\0Detachable\0IoT Gateway\0Embedded PC\0Mini PC\0Stick PC");
//Section 7.4.2 line 991 (enclosure states)
DefineListLoad("ST_SMBIOS_ENCLOSURE_STATES", " \0Other\0Unknown\0Safe\0Warning\0Critical\0Non-Recoverable");
//Section 7.4.3 line 994 (enclosure security status field)
DefineListLoad("ST_SMBIOS_ENCLOSURE_SECURITY_STATUSES",
" \0Other\0Unknown\0None\0External Interface Locked Out\0External Interface Enabled");
//Section 7.5.1 line 1014 (processor type field)
DefineListLoad("ST_SMBIOS_PROCESSOR_TYPES", " \0Other\0Unknown\0Central Processor\0Math Processor\0DSP Processor\0Video Processor");
//Section 7.5.4 line 1050 (processor voltage field)
DefineListLoad("ST_SMBIOS_PROCESSOR_VOLTAGE_LEVELS", "5V\03.3V\02.9V");
DefineListLoad("ST_CPUID_1_EDX_FLAGS", "x87 FPU\0Virtual 8086 Mode Enhancements\0Debugging Extensions\0Page Size Extensions\0"
"Time Stamp Counter\0MSRs\0Page Address Extension\0Machine Check Exceptions\0CMPXCHG8B\0APIC\0 \0SYSENTER/SYSEXIT\0"
"Memory Type Range Registers\0Page Global Bit\0Machine Check Architecture\0CMOV Instructions\0Page Attribute Table\0"
"36 Bit Page Size Extension\0Processor Serial Number\0CLFLUSH\0 \0Debug Store\0ACPI\0MMX\0FXSAVE/FXRSTOR\0SSE\0SSE2\0"
"Self Snoop\0HTT\0Thermal Monitor\0 \0Pending Break Enable\0");
DefineListLoad("ST_CPUID_1_ECX_FLAGS", "SSE3\0PCLMULQDQ\064 bit DS AREA\0MONITOR/MWAIT\0CPL Qualified Debug Store\0"
"Virtual Machine Extensions\0Safer Mode Extensions\0 \0Thermal Monitor 2\0SSSE3\0L1 Context ID\0"
"IA32_DEBUG_INTERFACE\0FMA Extensions\0CMPXCHG16B\0xTPR Update Control\0Perfmon and Debug Capability\0 \0"
"Process Context Identifiers\0MMIO Prefetch\0SSE4.1\0SSE4.2\0x2APIC\0MOVBE\0POPCNT\0TSC Deadline\0AESNI\0XSAVE\0"
"OSXSAVE\0AVX\0F16C\0RDRAND");
//Section 7.5.5 line 1058 (upgrade field)
DefineListLoad("ST_SMBIOS_PROCESSOR_UPGRADES", " \0Other\0Unknown\0Daughterboard\0ZIF Socket\0Replacable Piggy Back\0"
"None\0LIF Socket\0Slot 1\0Slot2\0370-pin Socket\0Slot A\0Slot M\0Socket 423\0Socket A (Socket 462)\0Socket 478\0"
"754\0940\0939\0mPGA604\0LGA771\0LGA775\0S1\0AM2\0F (1207)\0LGA1366\0G34\0AM3\0C32\0LGA1156\0LGA1567\0PGA988A\0"
"BGA1288\0rPGA988B\0BGA1023\0BGA1224\0LGA1155\0LGA1356\0LGA2011\0FS1\0FS2\0FM1\FM2\0LGA2011-3\0LGA1356-3\0LGA1150\0"
"BGA1168\0BGA1234\BGA1364\0AM4\0LGA1151\0BGA1440\0BGA1515\0LGA3647-1\0SP3\0SP3r2\0LGA2066\0BGA1932\0BGA1510\0BGA1528");
//Section 7.5.9 line 1110 (processor characteristics)
DefineListLoad("ST_SMBIOS_PROCESSOR_FLAGS", " \0 \064 Bit\0Multicore\0HyperThreading\0NX/XD Protection\0Enhanced Virtualization\0"
"Power/Performance Control\0128 Bit Capable");
//Section 7.8.2 line 1178 (cache information SRAM type field)
DefineListLoad("ST_SMBIOS_CACHE_SRAM_TYPES", "Other\0Unknown\0Non-Burst\0Burst\0Pipeline Burst\0Synchronous\0Asynchronous");
//Section 7.8.6 line 1193 (cache information associativity field)
DefineListLoad("ST_SMBIOS_CACHE_ASSOCIATIVITY", " \0Other\0Unknown\0Direct Mapped\02-way Set-Associative\04-way Set-Associative\0"
"Fully Associative\08-way Set-Associative\016-way Set-Associative\012-way Set-Associative\024-way Set-Associative\0"
"32-way Set-Associative\048-way Set-Associative\064-way Set-Associative\020-way Set-Associative");
//Section 7.9.2 line 1219 (connector type field)
DefineListLoad("ST_SMBIOS_CONNECTOR_TYPES", "None\0Centronics\0Mini Centronics\0Proprietary\0DB-25 Pin Male\0DB-25 Pin Female\0"
"DB-15 Pin Male\0DB-15 Pin Female\0DB-9 Pin Male\0DB-9 Pin Female\0RJ-11\0RJ-45\050-Pin MiniSCSI\0Mini-DIN\0Micro-DIN\0PS/2\0"
"Infrared\0HP-HIL\0Access Bus (USB)\0SSA SCSI\0Circular DIN-8 Male\0Circular DIN-8 Female\0Onboard IDE\0Onboard Floppy\0"
"9-Pin Dual Inline (Pin 10 Cut)\025-Pin Dual Inline (Pin 26 Cut)\050-Pin Dual Inline\068-Pin Dual Inline\0Onboard CD-ROM Sound Input\0"
"Mini-Centronics Type-14\0Mini-Centronics Type-26\0Mini-Jack (Headphones)\0BNC\01394\0SAS\SATA Plug\0USB Type-C");
//Section 7.9.3 line 1222 (port type field)
DefineListLoad("ST_SMBIOS_PORT_TYPES", "None\0Parallel Port XT/AT Compatible\0Parallel Port PS/2\0Parallel Port ECP\0Parallel Port EPP\0"
"Parallel Port ECP/EPP\0Serial Port XT/AT Compatible\0Serial Port 16450 Compatible\0Serial Port 16550 Compatible\0"
"Serial Port 16550A Compatible\0SCSI Port\0MIDI Port\0Joystick Port\0Keyboard Port\0Mouse Port\0SSA SCSI\0USB\0FireWire (IEEE 1394)\0"
"PCMCIA Type I\0PCMCIA Type II\0PCMCIA Type III\0Cardbus\0Access Bus Port\0SCSI II\0SCSI Wide\0 \0 \0 \0Video Port\0Audio Port\0"
"Modem Port\0Network Port\0SATA\0SAS\0MFDP (Multi-Function Display Port\0Thunderbolt\08251 Compatible\08251 FIFO Compatible");
//Section 7.10.1 line 1229 (slot type)
DefineListLoad("ST_SMBIOS_SLOT_TYPES1", " \0Other\0Unknown\0ISA\0MCA\0EISA\0PCI\0PC Card (PCMCIA)\0VESA Local Bus\0Proprietary\0"
"Proprietary Card Slot\0Proprietary Memory Card Slot\0I/O Riser Card Slot\0NuBus\0PCI - 66 MHz Capable\0AGP\0AGP 2X\0AGP 4X\0"
"PCI-X\0AGP 8X\0M.2 Socket 1-DP (Mechanical Key A)\0M.2 Socket 1-SD (Mechanical Key E)\0M.2 Socket 2 (Mechanical Key B)\0"
"M.2 Socket 3 (Mechanical Key M)\0MXM Type I\0MXM Type II\0MXM Type III (Standard Connector)\0MXM Type III (HE Connector)\0"
"MXM Type IV\0MXM 3.0 Type A\0MXM 3.0 Type B\0PCI Express Gen 2 SFF-8639\0PCI Express Gen 3 SFF-8639\0"
"PCI Express Mini 52-Pin with bottom-side keep-outs\0PCI Express Mini 52-Pin without bottom-side keep-outs\0"
"PCI Express Mini 76-Pin\0CXL Flexbus 1.0");
DefineListLoad("ST_SMBIOS_SLOT_TYPES2", " \0 \0 \0 \0 \0PCI Express\0PCI Express 1x\0PCI Express 2x\0PCI Express 4x\0PCI Express 8x\0"
"PCI Express 16x\0PCI Express Gen 2\0PCI Express Gen 2 1x\0PCI Express Gen 2 2x\0PCI Express Gen 2 4x\0PCI Express Gen 2 8x\0"
"PCI Express Gen 2 16x\0PCI Express Gen 3\0PCI Express Gen 3 1x\0PCI Express Gen 3 2x\0PCI Express Gen 3 4x\0PCI Express Gen 3 8x\0"
"PCI Express Gen 3 16x\0PCI Express Gen 4\0PCI Express Gen 4 1x\0PCI Express Gen 4 2x\0PCI Express Gen 4 4x\0PCI Express Gen 4 8x\0"
"PCI Express Gen 4 16x");
//Section 7.10.2 line 1244 (slot data bus width field)
DefineListLoad("ST_SMBIOS_SLOT_DATA_BUS_WIDTHS"," \0Other\0Unknown\08 Bit\016 Bit\032 Bit\064 Bit\0128 Bit\01x\02x\04x\08x\012x\016x\032x");
//Section 7.10.6 line 1259 (slot characteristics 1 field)
DefineListLoad("ST_SMBIOS_SLOT_FLAGS1", " \05.0 V\03.3 V\0Shared Slot Opening\0PC Card 16\0CardBus\0Zoom Video\0Modem Ring Resume");
//Section 7.10.7 line 1262 (slot characteristics 2 field)
DefineListLoad("ST_SMBIOS_SLOT_FLAGS2", "PCI Power Management Event (PME#) Signal\0HotPlug\0SMBus\0Bifurcation");
//Section 7.17.1 line 1523 (memory array location field)
DefineListLoad("ST_SMBIOS_PHYMEM_LOCATIONS", " \0Other\0Unknown\0Motherboard\0ISA Add-On Card\0EISA Add-On Card\0PCI Add-On Card\0"
"MCA Add-On Card\0PCMCIA Add-On Card\0Proprietary Add-On Card\0NuBus\0 \0 \0 \0 \0 \0");
//Section 7.17.2 line 1527 (memory array use field)
DefineListLoad("ST_SMBIOS_PHYMEM_USES", " \0Other\0Unknown\0System Memory\0Video Memory\0Flash Memory\0Non-Volatile RAM\0Cache Memory");
//Section 7.18.1 line 1542 (form factor field)
DefineListLoad("ST_SMBIOS_MEMDEV_FORM_FACTORS",
" \0Other\0Unknown\0SIMM\0SIP\0DIP\0ZIP\0Proprietary Card\0DIMM\0TSOP\0Row of Chips\0RIMM\0SODIMM\0SRIMM\0FB-DIMM\0Die");
//Section 7.18.2 line 1546 (type field)
DefineListLoad("ST_SMBIOS_MEMDEV_TYPES", " \0Unknown\0DRAM\0EDRAM\0VRAM\0SRAM\0RAM\0ROM\0FLASH\0EEPROM\0FEPROM\0EPROM\0CDRAM\0"
"3DRAM\0SDRAM\0SGRAM\0RDRAM\0DDR\0DDR2\0DDR2 FB-DIMM\0 \0 \0 \0DDR3\0FBD2\0DDR4\0LPDDR\0LPDDR2\0LPDDR3\0LPDDR4\0"
"Logical Non-Volatile Device\0HBM (High Bandwidth Memory)\0HBM2 (High Bandwidth Memory Gen 2)");
//Section 7.18.3 line 1550 (type detail field)
DefineListLoad("ST_SMBIOS_MEMDEV_TYPE_DETAILS", " \0 \0 \0Fast Paged\0Static Column\0Psuedo Static\0RAMBUS\0Synchronous\0"
"CMOS\0EDO\0Window DRAM\0Cache DRAM\0Non Volatile\0Registered (Buffered)\0Unregistered (Unbuffered)\0LRDIMM");
} SMBIOSInit;
Bool SMBIOSEntryScan(CSMBIOSEntryPoint **entry)
{//Search 0xF0000 - 0x100000 for SMBIOS Entry Point structure.
I64 i;
U8 noreg checksum = 0, *mem = 0xF0000;
do
{
if (!MemCompare(mem, "_SM_", 4))
{
*entry = mem;
for (i = 0; i < (*entry)->length; i++)
checksum += mem[i];
if (checksum == 0) //valid checksums sum to zero
break;
}
} while ((mem += 16) < 0x100000); //anchor sits on 16-byte boundary
return mem != 0x100000;
}
U8 *SMBIOSStr(CSMBIOSHeader *header, I64 str_num, U8 *default="None")
{//Get string str_num from end of structure (string section).
I64 i;
U8* ptr = header(U8 *) + header->length;
if (!str_num) return default;
for (i = 1; i < str_num; i++)
{
while (*ptr++);
if (!ptr[0] && !ptr[1]) //structure ends in double NULL
return default;
}
return ptr;
}
CSMBIOSHeader *SMBIOSStructGet(CSMBIOSHeader *head, I64 type=0xFFFFF, I64 handle=0xFFFFF)
{//Search for struct with type or handle. Return NULL if not found.
I64 i;
while (head->type != 127)
{
if (head->handle == handle)
return head;
if (head->type == type)
return head;
head = head(U8 *) + head->length;
for (i = 1; head(U8 *)[i - 1] || head(U8 *)[i]; i++);
head = head(U8 *) + i + 1;
}
return NULL;
}
U8 *SysRepFlagsMake(U8 *buf)
{
U8 *str;
U8 *tmp = StrReplace(StrReplace(StrReplace(StrReplace(buf,
"+ ", ""),
"- ", "",, TRUE),
"+", "\n$$BLUE$$+$$GREEN$$",, TRUE),
"-", "\n$$BLUE$$-$$RED$$",, TRUE);
str = MStrPrint("$$ID,17$$%s$$ID,-17$$", tmp);
Free(tmp);
return str;
}
public I64 SysRep(I64 type=0xFF, I64 handle=0, Bool show_all_flags=FALSE, I64 memdev_handle=0xFFFF)
{//Display info of System Management BIOS (SMBIOS) structures. 'type' is a SMBIOSt_* type. Returns structure count of displayed structures.
I64 i = 1, structure_count = 0, cache_count = 0;
CSMBIOSEntryPoint *entry;
CSMBIOSHeader *header;
U8 buffer[2048], buffer2[512], *str;
if (!SMBIOSEntryScan(&entry))
{
"No SMBIOS data found.\n";
return 0;
}
header = entry->table_address;
if (!handle && type == 0xFF)
"SMBIOS version %d.%d (%d entries)\n", entry->major_version, entry->minor_version, entry->structure_count;
"$$FD,CYAN$$";
while (header->type != 127)
{
if (handle && header->handle != handle)
goto loop_end;
if (type != 0xFF && header->type != type)
goto loop_end;
switch (header->type)
{
start:
case SMBIOSt_BIOS:
CSMBIOSBIOSInfo *bios_info = header;
I64 start_addr = bios_info->start_address_segment << 16;
"$$TR-C,\"BIOS\"$$\n";
"$$ID,3$$"
"Vendor\t\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, bios_info->vendor);
"Version\t\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, bios_info->version);
"Release Date\t\t:$$BLACK$$%s (mm/dd/yyyy)$$FG$$\n", SMBIOSStr(header, bios_info->release_date);
"Release Version\t:$$BLACK$$%d.%d$$FG$$\n", bios_info->major_release, bios_info->minor_release;
"Start Address\t:$$BLACK$$0x%X$$FG$$\n", Seg2Linear(&start_addr);
"Image Size\t\t:$$BLACK$$%d bytes$$FG$$\n", (0x10000 - bios_info->start_address_segment) * 16;
"ROM Size\t\t\t:$$BLACK$$";
if (bios_info->rom_size == 0xFF)
"%d %zB$$FG$$\n", bios_info->extended_rom_size & ~0xC000, Bt(&bios_info->extended_rom_size, 14), "M\0G";
else
"%d KB$$FG$$\n", (bios_info->rom_size + 1) * 64;
if (Bt(&bios_info->flags, 3))
"Flags Not Supported$$FG$$\n";
else
{
"$$TR,\"Flags\"$$";
StrPrintFlags(buffer, Define("ST_SMBIOS_BIOS_FLAGS"), bios_info->flags & ~0xF, show_all_flags, 31);
CatPrint(buffer, StrPrintFlags(buffer2, Define("ST_SMBIOS_BIOS_FLAGSEXT1"), bios_info->extended_flags[0], show_all_flags, 8));
CatPrint(buffer, StrPrintFlags(buffer2, Define("ST_SMBIOS_BIOS_FLAGSEXT2"), bios_info->extended_flags[1], show_all_flags, 5));
str = SysRepFlagsMake(buffer);
"%s$$FG$$\n", str;
Free(str);
}
"$$ID,-3$$";
break;
case SMBIOSt_SYSTEM:
CSMBIOSSystemInfo *sys_info = header;
"$$TR-C,\"System\"$$\n";
"$$ID,3$$Manufacturer\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, sys_info->manufacturer);
"Product Name\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, sys_info->product_name);
"Version\t\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, sys_info->version);
"Serial Number\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, sys_info->serial_number);
"UUID\t\t\t\t:$$BLACK$$%X-%X-%X-%X-%X$$FG$$\n", EndianU32(sys_info->uuid(U32 *)),
EndianU16((sys_info->uuid)(U16 *)[2]), EndianU16((sys_info->uuid)(U16 *)[3]), EndianU16((sys_info->uuid)(U16 *)[4]),
EndianU16((sys_info->uuid)(U16 *)[5]) << 32 | EndianU32((sys_info->uuid)(U32 *)[3]);
"Wakeup Type\t\t:$$BLACK$$%Z$$FG$$\n", sys_info->wakeup_type, "ST_SMBIOS_WAKEUP_TYPES";
"SKU Number\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, sys_info->sku_number);
"Family\t\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, sys_info->family);
"$$ID,-3$$";
break;
case SMBIOSt_ENCLOSURE:
CSMBIOSEnclosureInfo *info = header;
"$$TR-C,\"Enclosure\"$$\n";
"$$ID,3$$Manufacturer\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, info->manufacturer);
"Type\t\t\t\t:$$BLACK$$%Z%z$$FG$$\n", info->type & 0x7F, "ST_SMBIOS_ENCLOSURE_TYPES",
Bt(&info->type, 7), " \0, Lock Present";
"Version\t\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, info->version);
"Bootup State\t\t:$$BLACK$$%Z$$FG$$\n", info->bootup_state, "ST_SMBIOS_ENCLOSURE_STATES";
"Thermal State\t:$$BLACK$$%Z$$FG$$\n", info->thermal_state, "ST_SMBIOS_ENCLOSURE_STATES";
"Power Supply\t\t:$$BLACK$$%Z$$FG$$\n", info->power_supply_state, "ST_SMBIOS_ENCLOSURE_STATES";
"Security Status\t:$$BLACK$$%Z$$FG$$\n", info->security_status, "ST_SMBIOS_ENCLOSURE_SECURITY_STATUSES";
"Height\t\t\t:$$BLACK$$";
if (info->height)
"%0.2f\"$$FG$$\n", info->height * 1.75; //height is in 'U' units. 1 'U' is 1.75 inches or 4.445 cm.
else "Unknown$$FG$$\n";
"Serial Number\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, info->serial_number);
"Asset Tag\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, info->asset_tag);
"Power Cord Count\t:$$BLACK$$";
if (info->power_cord_count)
"%d$$FG$$\n", info->power_cord_count;
else "Unknown$$FG$$\n";
// "Contained Elements:$$BLACK$$",r,'\t'; //TODO: maybe implement this?
"$$ID,-3$$";
break;
case SMBIOSt_PROCESSOR:
CSMBIOSProcessorInfo *p_info = header;
CRAXRBXRCXRDX regs;
CPUId(1, &regs);
"$$TR-C,\"Processor\"$$\n";
"$$ID,3$$Socket Name\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, p_info->name);
"Processor Type\t:$$BLACK$$%Z$$FG$$\n", p_info->type, "ST_SMBIOS_PROCESSOR_TYPES";
"Status\t\t\t:$$BLACK$$%z, %z$$FG$$\n", p_info->status >> 6, "Socket Unpopulated\0Socket Populated",
p_info->status & 7, "Unknown\0CPU Enabled\0CPU Disabled through BIOS Setup\0"
"CPU Disabled by BIOS (POST Error)\0CPU is Idle, Waiting to be Enabled\0 \0 \0Other";
"Core Count\t\t:$$BLACK$$%d$$FG$$\n", p_info->core_count;
"Cores Enabled\t:$$BLACK$$%d$$FG$$\n", p_info->cores_enabled;
"Manufacturer\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, p_info->manufacturer);
// "CPU Family\t\t\t:$$BLACK$$%z$$FG$$\n", p_info->family, "ST_SMBIOS_PROCESSOR_FAMILIES"; TODO: maybe implement this?
"Name\t\t\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, p_info->version);
"Family\t\t\t:$$BLACK$$";
if (regs.rax >> 8 & 0xF < 0xF)
"%d$$FG$$\n", regs.rax >> 8 & 0xF;
else
"%d$$FG$$\n", 0xF + regs.rax >> 20 & 0xFF;
"Model\t\t\t:$$BLACK$$";
if (regs.rax >> 4 & 0xF < 0xF)
"%d$$FG$$\n", regs.rax >> 4 & 0xF;
else
"%d$$FG$$\n", (regs.rax >> 4 & 0xF) << 4 | (regs.rax >> 16 & 0xF);
"Stepping\t\t\t:$$BLACK$$%d$$FG$$\n", regs.rax & 0xF;
"Current Speed\t:$$BLACK$$";
if (p_info->current_speed)
"%0.1f GHz$$FG$$\n", p_info->current_speed / 1000.0;
else "Unknown$$FG$$\n";
"Max Speed\t\t:$$BLACK$$";
if (p_info->max_speed)
"%0.1f GHz$$FG$$\n", p_info->max_speed / 1000.0;
else "Unknown$$FG$$\n";
"Socket\t\t\t:$$BLACK$$%Z$$FG$$\n", p_info->upgrade, "ST_SMBIOS_PROCESSOR_UPGRADES";
"Voltage\t\t\t:$$BLACK$$";
if (Bt(&p_info->voltage, 7))
"%0.1fV$$FG$$\n", (p_info->voltage & 0x7F) / 10.0;
else
"%Z$$FG$$\n", Bsf(p_info->voltage), "ST_SMBIOS_PROCESSOR_VOLTAGE_LEVELS";
"External Clock\t:$$BLACK$$";
if (p_info->external_clock)
"%d MHz$$FG$$\n", p_info->external_clock;
else "Unknown$$FG$$\n";
"Serial Number\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, p_info->serial_number);
"Asset Tag\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, p_info->asset_tag);
"Part Number\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, p_info->part_number);
StrPrintFlags(buffer, Define("ST_SMBIOS_PROCESSOR_FLAGS"), p_info->characteristics, show_all_flags, 9);
str = SysRepFlagsMake(buffer);
"$$TR,\"Processor Flags\"$$%s$$FG$$\n", str;
StrPrintFlags(buffer, Define("ST_CPUID_1_EDX_FLAGS"), regs.rdx, show_all_flags, 32);
CatPrint(buffer, StrPrintFlags(buffer2, Define("ST_CPUID_1_ECX_FLAGS"), regs.rcx, show_all_flags, 31));
str = SysRepFlagsMake(buffer);
"$$TR,\"CPUID 0x1 Flags\"$$%s$$FG$$\n", str;
Free(str);
if (p_info->l1_cache_handle && p_info->l1_cache_handle != 0xFFFF)
{
"$$TR,\"L1 Cache Info\"$$\n";
SysRep(,p_info->l1_cache_handle, show_all_flags);
}
if (p_info->l2_cache_handle && p_info->l2_cache_handle != 0xFFFF)
{
"$$TR,\"L2 Cache Info\"$$\n";
SysRep(,p_info->l2_cache_handle, show_all_flags);
}
if (p_info->l3_cache_handle && p_info->l3_cache_handle != 0xFFFF)
{
"$$TR,\"L3 Cache Info\"$$\n";
SysRep(,p_info->l3_cache_handle, show_all_flags);
}
"$$ID,-3$$";
break;
case SMBIOSt_CACHE:
if (!handle)
break;
if (cache_count++ > 0)
break;
CSMBIOSCacheInfo *c_info = header;
"$$ID,3$$";
"Name\t\t\t\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, c_info->name);
"Status\t\t\t\t:$$BLACK$$%z$$FG$$\n", Bt(&c_info->config, 7), "Disabled\0Enabled";
"Mode\t\t\t\t\t:$$BLACK$$%z$$FG$$\n", c_info->config >> 8 & 3, "Write-Through\0Write-Back\0Varies with Memory Address\0Unknown";
"Type\t\t\t\t\t:$$BLACK$$%z$$FG$$\n", c_info->cache_type, " \0Other\0Unknown\0Instruction\0Data\0Unified";
"Location\t\t\t\t:$$BLACK$$%z$$FG$$\n", c_info->config >> 5 & 3, "CPU Internal\0External\0 \0Unknown";
"Socketed\t\t\t\t:$$BLACK$$%z$$FG$$\n", Bt(&c_info->config, 3), "No\0Yes";
"Max Cache Size\t\t:$$BLACK$$";
if (Bt(&c_info->max_size, 15)) //if Bit 15 is 1 then granularity is 64K else 1K
"%d KB$$FG$$\n", (c_info->max_size & 0x7FFF) * 64;
else
"%d KB$$FG$$\n", c_info->max_size & 0x7FFF;
"Installed Size\t\t:$$BLACK$$";
if (Bt(&c_info->installed_size, 15)) //if Bit 15 is 1 then granularity is 64K else 1K
"%d KB$$FG$$\n", (c_info->installed_size & 0x7FFF) * 64;
else
"%d KB$$FG$$\n", c_info->installed_size & 0x7FFF;
StrPrintFlags(buffer, Define("ST_SMBIOS_CACHE_SRAM_TYPES"), c_info->supported_sram_type);
str = StrReplace(buffer, "+", ", ");
"Supported SRAM Types\t:$$BLACK$$%s$$FG$$\n", str + 2;
Free(str);
"Installed SRAM Type\t:$$BLACK$$%Z$$FG$$\n", Bsf(c_info->installed_sram_type), "ST_SMBIOS_CACHE_SRAM_TYPES";
"Cache Speed\t\t\t:$$BLACK$$";
if (c_info->cache_speed)
"%d nS$$FG$$\n", c_info->cache_speed;
else "Unknown$$FG$$\n";
"ECC type\t\t\t\t:$$BLACK$$%z$$FG$$\n", c_info->error_correction_type,
" \0Other\0Unknown\0None\0Parity\0Single-bit ECC\0Multi-bit ECC";
"Associativity\t\t\t:$$BLACK$$%Z$$FG$$\n", c_info->associativity, "ST_SMBIOS_CACHE_ASSOCIATIVITY";
"$$ID,-3$$";
break;
case SMBIOSt_PHYMEM:
CSMBIOSMemArrayInfo *ma_info = header;
"$$TR,\"Memory Array\"$$\n";
"$$ID,3$$";
"Location\t\t\t:$$BLACK$$%Z$$FG$$\n", ma_info->location, "ST_SMBIOS_PHYMEM_LOCATIONS";
"Use\t\t\t\t:$$BLACK$$%Z$$FG$$\n", ma_info->use, "ST_SMBIOS_PHYMEM_USES";
"Error Correction\t:$$BLACK$$%z$$FG$$\n", ma_info->use, " \0Other\0Unknown\0None\0Parity\0Single-bit ECC\0Multi-bit ECC\0CRC";
"Max Capacity\t\t:$$BLACK$$";
if (ma_info->max_capacity == 0x80000000)
"%d MB$$FG$$\n", ma_info->extended_max_capacity / 1024;
else
"%d MB$$FG$$\n", ma_info->max_capacity / 1024;
"Mem Device Count\t:$$BLACK$$%d$$FG$$\n", ma_info->mem_device_count;
"$$TR,\"Memory Devices\"$$\n";
"$$ID,3$$";
SysRep(SMBIOSt_MEM_DEVICE, handle, show_all_flags, ma_info->header.handle);
"$$ID,-3$$";
"$$ID,-3$$";
break;
case SMBIOSt_MEM_DEVICE:
CSMBIOSMemDeviceInfo *mem_info = header;
if (type != SMBIOSt_MEM_DEVICE)
break;
if (memdev_handle != 0xFFFF && memdev_handle != mem_info->memory_array_handle)
break;
"$$TR,\"Memory Device\"$$\n";
"$$ID,3$$";
"Device Location\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, mem_info->device_locator);
"Bank Location\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, mem_info->bank_locator);
"Manufacturer\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, mem_info->manufacturer);
"Size\t\t\t\t:$$BLACK$$";
if (!mem_info->size)
"No Device Installed$$FG$$\n";
else if (mem_info->size == 0xFFFF)
"Unknown$$FG$$\n";
else if (mem_info->size == 0x7FFF)
"%d GB$$FG$$\n", mem_info->extended_size;
else
"%d %zB$$FG$$\n", mem_info->size & 0x7FFF, Bt(&mem_info->size, 15), "M\0K";
if (entry->major_version >= 2 && entry->minor_version >= 8)
{
"Min Voltage\t\t:$$BLACK$$";
if (mem_info->min_voltage)
"%d mV$$FG$$\n", mem_info->min_voltage;
else
"Unknown$$FG$$\n";
"Max Voltage\t\t:$$BLACK$$";
if (mem_info->max_voltage)
"%d mV$$FG$$\n", mem_info->max_voltage;
else
"Unknown$$FG$$\n";
"Configured Volt.\t:$$BLACK$$";
if (mem_info->configured_voltage)
"%d mV$$FG$$\n", mem_info->configured_voltage;
else
"Unknown$$FG$$\n";
}
"Total Width\t\t:$$BLACK$$";
if (mem_info->total_width != 0xFFFF)
"%d bits$$FG$$\n", mem_info->total_width;
else
"Unknown$$FG$$\n";
"Data Width\t\t\t:$$BLACK$$";
if (mem_info->data_width != 0xFFFF)
"%d bits$$FG$$\n", mem_info->data_width;
else
"Unknown$$FG$$\n";
"Max Speed\t\t\t:$$BLACK$$";
if (mem_info->speed)
"%d $MA-X+PU,"MT/s",LM="\"megatransfers per second\";View;"$$$FG$$\n", mem_info->speed;
else
"Unknown$$FG$$\n";
"Configured Speed\t:$$BLACK$$";
if (mem_info->configured_speed)
"%d $MA-X+PU,"MT/s",LM="\"megatransfers per second\";View;"$$$FG$$\n", mem_info->configured_speed;
else
"Unknown$$FG$$\n";
"Serial Number\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, mem_info->serial_number);
"Part Number\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, mem_info->part_number);
"Asset Tag\t\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, mem_info->asset_tag);
"Form Factor\t\t:$$BLACK$$%Z$$FG$$\n", mem_info->form_factor, "ST_SMBIOS_MEMDEV_FORM_FACTORS";
"Type\t\t\t\t:$$BLACK$$%Z$$FG$$\n", mem_info->type, "ST_SMBIOS_MEMDEV_TYPES";
StrPrintFlags(buffer, Define("ST_SMBIOS_MEMDEV_TYPE_DETAILS"), mem_info->type_detail, show_all_flags, 16);
str = SysRepFlagsMake(buffer);
"$$TR,\"Type Flags\"$$%s$$FG$$\n", str;
Free(str);
"$$ID,-3$$";
break;
case SMBIOSt_BASEBOARD:
CSMBIOSBaseboardInfo *b_info = header;
"$$TR-C,\"Baseboard\"$$\n";
"$$ID,3$$";
"Manufacturer\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, b_info->manufacturer);
"Product\t\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, b_info->product);
"Version\t\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, b_info->version);
"Type\t\t\t\t:$$BLACK$$%Z$$FG$$\n", b_info->board_type, "ST_SMBIOS_BASEBOARD_TYPES";
"Location\t\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, b_info->chassis_location, "Not Specified");
"Serial Number\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, b_info->serial_number);
"Asset Tag\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, b_info->asset_tag);
"$$TR,\"Flags\"$$";
StrPrintFlags(buffer, Define("ST_SMBIOS_BASEBOARD_FLAGS"), b_info->feature_flags, show_all_flags, 5);
str = SysRepFlagsMake(buffer);
"%s$$FG$$\n", str;
Free(str);
"$$ID,-3$$";
break;
case SMBIOSt_CONNECTOR:
CSMBIOSConnectorInfo *con_info = header;
"$$TR,\"Port Connector\"$$\n";
"$$ID,3$$";
"Port Type\t\t:$$BLACK$$";
if (con_info->port_type == 0xFF)
"Other$$FG$$\n";
else
"%Z$$FG$$\n", con_info->port_type, "ST_SMBIOS_PORT_TYPES";
"External Name\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, con_info->external_name);
"Internal Name\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, con_info->internal_name);
"External Type\t:$$BLACK$$";
if (con_info->external_type == 0xFF)
"Other$$FG$$\n";
else
"%Z$$FG$$\n", con_info->external_type, "ST_SMBIOS_CONNECTOR_TYPES";
"Internal Type\t:$$BLACK$$";
if (con_info->internal_type == 0xFF)
"Other$$FG$$\n";
else
"%Z$$FG$$\n", con_info->internal_type, "ST_SMBIOS_CONNECTOR_TYPES";
"$$ID,-3$$";
break;
case SMBIOSt_BATTERY:
CSMBIOSBatteryInfo *bat_info = header;
"$$TR,\"Battery\"$$\n";
"$$ID,3$$";
"Name\t\t\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, bat_info->name);
"Manufacturer\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, bat_info->manufacturer);
"$MA-X+PU,"SBDS",LM="\"\dGREEN\dS\dFG\dmart \dGREEN\dB\dFG\dattery \dGREEN\dD\dFG\data \dGREEN\dS\dFG\dpecification\n\";View;"$ Version\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, bat_info->manufacturer);
"Manufacture Date\t:$$BLACK$$";
if (bat_info->manufacture_date)
"%s$$FG$$\n", SMBIOSStr(header, bat_info->manufacture_date);
else
"%s$$FG$$\n", SMBIOSStr(header, bat_info->sbds_manufacture_date);
"Chemistry\t\t:$$BLACK$$";
if (bat_info->chemistry)
"%s$$FG$$\n", SMBIOSStr(header, bat_info->chemistry);
else
"%s$$FG$$\n", SMBIOSStr(header, bat_info->sbds_chemistry);
"Capacity\t\t\t:$$BLACK$$";
if (bat_info->capacity)
"%d Milliwatt-Hours$$FG$$\n", bat_info->capacity * bat_info->capacity_multiplier;
else
"Unknown$$FG$$\n";
"Voltage\t\t\t:$$BLACK$$";
if (bat_info->voltage)
"%d Millivolts$$FG$$\n", bat_info->voltage;
else
"Unknown$$FG$$\n";
"Max Data Error\t:$$BLACK$$";
if (bat_info->max_battery_data_error != 0xFF)
"%d$$FG$$\n", bat_info->max_battery_data_error;
else
"Unknown$$FG$$\n";
"Serial Number\t:$$BLACK$$";
if (bat_info->serial_number)
"%s$$FG$$\n", SMBIOSStr(header, bat_info->serial_number);
else
"%d$$FG$$\n", bat_info->sbds_serial_number;
"$$ID,-3$$";
break;
case SMBIOSt_OEM_STRINGS:
case SMBIOSt_SYS_CONFIG_OPTIONS:
if (header->type == SMBIOSt_OEM_STRINGS)
"$$TR,\"OEM Strings\"$$\n";
else
"$$TR,\"Sys Config Strings\"$$\n";
"$$ID,3$$";
str = *(header(U8 *) + sizeof(CSMBIOSHeader)); //using str to hold the string count
for (i = 1; i <= str; i++)
"\t\t\t\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, i);
"$$ID,-3$$";
break;
case SMBIOSt_SLOT:
CSMBIOSSlotInfo *slot_info = header;
"$$TR,\"Slot\"$$\n";
"$$ID,3$$";
"Name\t\t\t\t:$$BLACK$$%s$$FG$$\n", SMBIOSStr(header, slot_info->name);
"Type\t\t\t\t:$$BLACK$$";
if (slot_info->type >= 0xA0)
"%Z$$FG$$\n", slot_info->type - 0xA0, "ST_SMBIOS_SLOT_TYPES2";
else
"%Z$$FG$$\n", slot_info->type, "ST_SMBIOS_SLOT_TYPES1";
"Data Bus Width\t:$$BLACK$$%Z$$FG$$\n", slot_info->data_bus_width, "ST_SMBIOS_SLOT_DATA_BUS_WIDTHS";
"Current Usage\t:$$BLACK$$%z$$FG$$\n", slot_info->current_usage, " \0Other\0Unknown\0Available\0In Use\0Unavailable";
"Slot Length\t\t:$$BLACK$$%z$$FG$$\n", slot_info->length, " \0Other\0Unknown\0Short\0Long\02.5\" Drive Form Factor\03.5\" Drive Form Factor";
"Segment Group\t:$$BLACK$$";
if (slot_info->segment_group_number != 0xFF)
"%d$$FG$$\n", slot_info->segment_group_number;
else
"None$$FG$$\n";
"Bus\t\t\t\t:$$BLACK$$";
if (slot_info->bus_number != 0xFF)
"%d$$FG$$\n", slot_info->bus_number;
else
"None$$FG$$\n";
if (slot_info->device_function_number != 0xFF)
{
"Device\t\t\t:$$BLACK$$%d$$FG$$\n", slot_info->device_function_number >> 3;
"Function\t\t\t:$$BLACK$$%d$$FG$$\n", slot_info->device_function_number & 7;
}
else
"Device\t\t\t:$$BLACK$$None$$FG$$\nFunction\t\t\t:$$BLACK$$None$$FG$$\n";
"$$TR,\"Flags\"$$";
if (!Bt(&slot_info->flags1, 0))
{
StrPrintFlags(buffer, Define("ST_SMBIOS_SLOT_FLAGS1"), slot_info->flags1, show_all_flags, 8);
CatPrint(buffer, StrPrintFlags(buffer2, Define("ST_SMBIOS_SLOT_FLAGS2"), slot_info->flags2, show_all_flags, 4));
str = SysRepFlagsMake(buffer);
"%s$$FG$$\n", str;
Free(str);
}
"$$ID,-3$$";
break;
case 28:
"$$TR,\"Temperature Probe\"$$\n";
break;
end:
structure_count++;
}
loop_end:
header = header(U8 *) + header->length;
for (i = 1; header(U8 *)[i - 1] || header(U8 *)[i]; i++);
header = header(U8 *) + i + 1;
}
if (!handle)
"$$FD,BLUE$$";
return structure_count;
}