From 0ce5c0673348861c57ae5544c6f96c89f8330a56 Mon Sep 17 00:00:00 2001 From: Void NV Date: Sat, 4 Apr 2020 19:31:48 -0500 Subject: [PATCH] Added SysRep (SMBIOS Parsing). CPURep now partially uses SysRep. --- ...o => Zenith-latest-2020-04-04-19_30_09.iso | Bin 34766848 -> 34775040 bytes mnt.ps1 | 2 +- src/Demo/Games/Varoom.CC | 4 +- src/Demo/Graphics/32BitColor.CC | 2 +- src/Doc/ChangeLog.DD | 3 + src/Kernel/KernelA.HH | 242 +++++++ src/PersonalMenu.DD | Bin 63372 -> 63369 bytes src/Zenith/Gr/SpriteMesh.CC | 5 +- src/Zenith/Utils/CPURep.CC | 35 +- src/Zenith/Utils/MakeUtils.CC | 1 + src/Zenith/Utils/SysRep.CC | 627 ++++++++++++++++++ 11 files changed, 881 insertions(+), 40 deletions(-) rename Zenith-latest-2020-04-04-13_25_39.iso => Zenith-latest-2020-04-04-19_30_09.iso (99%) mode change 100755 => 100644 create mode 100644 src/Zenith/Utils/SysRep.CC diff --git a/Zenith-latest-2020-04-04-13_25_39.iso b/Zenith-latest-2020-04-04-19_30_09.iso old mode 100755 new mode 100644 similarity index 99% rename from Zenith-latest-2020-04-04-13_25_39.iso rename to Zenith-latest-2020-04-04-19_30_09.iso index 3711ecd00e6455dd2f21993f212c4b06cea11525..9de24a0d0b4c0c7017fdd32ec1cc760e5da47c3b GIT binary patch delta 82267 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 Vj$fk&jpJ1|W0Cjfv-+>v{2%!|5Yqqv delta 71916 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 diff --git a/mnt.ps1 b/mnt.ps1 index f48c4e6a..5d65a097 100644 --- a/mnt.ps1 +++ b/mnt.ps1 @@ -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 diff --git a/src/Demo/Games/Varoom.CC b/src/Demo/Games/Varoom.CC index 966824cb..f66178fb 100755 --- a/src/Demo/Games/Varoom.CC +++ b/src/Demo/Games/Varoom.CC @@ -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].dé -= .000001; - if (is_right_pressed) c[0].dé += .000001; + if (is_left_pressed) c[0].dé -= .0000015; + if (is_right_pressed) c[0].dé += .0000015; if (is_up_pressed) c[0].speed += .004; if (is_down_pressed) { diff --git a/src/Demo/Graphics/32BitColor.CC b/src/Demo/Graphics/32BitColor.CC index 2e3c6916..3cbd78dd 100755 --- a/src/Demo/Graphics/32BitColor.CC +++ b/src/Demo/Graphics/32BitColor.CC @@ -21,7 +21,7 @@ I0 Color32Demo() for (j = 0; j < SQUARE_SIZE; j++) DrawPixel(x + i, y + j, color); - Sleep(1); + Busy(1000); } } diff --git a/src/Doc/ChangeLog.DD b/src/Doc/ChangeLog.DD index 35ecb10e..9db92b1e 100755 --- a/src/Doc/ChangeLog.DD +++ b/src/Doc/ChangeLog.DD @@ -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. diff --git a/src/Kernel/KernelA.HH b/src/Kernel/KernelA.HH index 0723e657..b1075992 100755 --- a/src/Kernel/KernelA.HH +++ b/src/Kernel/KernelA.HH @@ -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. diff --git a/src/PersonalMenu.DD b/src/PersonalMenu.DD index 4fc3dd68ded27a643b620fa2e75d37da5e7a98f1..8a41ed0b5478116021a3030f7a83582a64dd2b7b 100755 GIT binary patch delta 27 jcmeBq&)oT*d4nD^3#WpD!ej$x{mDtp6E=Tgp79v~gPsZc delta 30 mcmeBt&)oB#d4nD^lLF^tBW8UjPR_{*%o7= 0x80000004) - {//if getting full name is supported - name = MAlloc(4 * 4 * 3); - for (i = 2; i <= 4; i++) - { - CPUId(0x80000000 + i, ®s); - 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, ®s); - 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); diff --git a/src/Zenith/Utils/MakeUtils.CC b/src/Zenith/Utils/MakeUtils.CC index ed962b4e..283de9de 100755 --- a/src/Zenith/Utils/MakeUtils.CC +++ b/src/Zenith/Utils/MakeUtils.CC @@ -1,5 +1,6 @@ Cd(__DIR__);; #include "BinRep" +#include "SysRep" #include "CPURep" #include "Diff" #include "Find" diff --git a/src/Zenith/Utils/SysRep.CC b/src/Zenith/Utils/SysRep.CC new file mode 100644 index 00000000..a8776d0b --- /dev/null +++ b/src/Zenith/Utils/SysRep.CC @@ -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, ®s); + "$$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; +}