📄 dmidecode.c
字号:
/*
* 3.3.16 System Event Log (Type 15)
*/
static const char *dmi_event_log_method(u8 code)
{
static const char *method[] = {
"Indexed I/O, one 8-bit index port, one 8-bit data port", /* 0x00 */
"Indexed I/O, two 8-bit index ports, one 8-bit data port",
"Indexed I/O, one 16-bit index port, one 8-bit data port",
"Memory-mapped physical 32-bit address",
"General-purpose non-volatile data functions" /* 0x04 */
};
if (code <= 0x04)
return method[code];
if (code >= 0x80)
return "OEM-specific";
return out_of_spec;
}
static void dmi_event_log_status(u8 code)
{
static const char *valid[] = {
"Invalid", /* 0 */
"Valid" /* 1 */
};
static const char *full[] = {
"Not Full", /* 0 */
"Full" /* 1 */
};
printf(" %s, %s",
valid[(code >> 0) & 1], full[(code >> 1) & 1]);
}
static void dmi_event_log_address(u8 method, const u8 *p)
{
/* 3.3.16.3 */
switch (method)
{
case 0x00:
case 0x01:
case 0x02:
printf(" Index 0x%04X, Data 0x%04X", WORD(p), WORD(p + 2));
break;
case 0x03:
printf(" 0x%08X", DWORD(p));
break;
case 0x04:
printf(" 0x%04X", WORD(p));
break;
default:
printf(" Unknown");
}
}
static const char *dmi_event_log_header_type(u8 code)
{
static const char *type[] = {
"No Header", /* 0x00 */
"Type 1" /* 0x01 */
};
if (code <= 0x01)
return type[code];
if (code >= 0x80)
return "OEM-specific";
return out_of_spec;
}
static const char *dmi_event_log_descriptor_type(u8 code)
{
/* 3.3.16.6.1 */
static const char *type[] = {
NULL, /* 0x00 */
"Single-bit ECC memory error",
"Multi-bit ECC memory error",
"Parity memory error",
"Bus timeout",
"I/O channel block",
"Software NMI",
"POST memory resize",
"POST error",
"PCI parity error",
"PCI system error",
"CPU failure",
"EISA failsafe timer timeout",
"Correctable memory log disabled",
"Logging disabled",
NULL, /* 0x0F */
"System limit exceeded",
"Asynchronous hardware timer expired",
"System configuration information",
"Hard disk information",
"System reconfigured",
"Uncorrectable CPU-complex error",
"Log area reset/cleared",
"System boot" /* 0x17 */
};
if (code <= 0x17 && type[code] != NULL)
return type[code];
if (code >= 0x80 && code <= 0xFE)
return "OEM-specific";
if (code == 0xFF)
return "End of log";
return out_of_spec;
}
static const char *dmi_event_log_descriptor_format(u8 code)
{
/* 3.3.16.6.2 */
static const char *format[] = {
"None", /* 0x00 */
"Handle",
"Multiple-event",
"Multiple-event handle",
"POST results bitmap",
"System management",
"Multiple-event system management" /* 0x06 */
};
if (code <= 0x06)
return format[code];
if (code >= 0x80)
return "OEM-specific";
return out_of_spec;
}
static void dmi_event_log_descriptors(u8 count, u8 len, const u8 *p, const char *prefix)
{
/* 3.3.16.1 */
int i;
for (i = 0; i < count; i++)
{
if (len >= 0x02)
{
printf("%sDescriptor %u: %s\n",
prefix, i + 1, dmi_event_log_descriptor_type(p[i * len]));
printf("%sData Format %u: %s\n",
prefix, i + 1, dmi_event_log_descriptor_format(p[i * len + 1]));
}
}
}
/*
* 3.3.17 Physical Memory Array (Type 16)
*/
static const char *dmi_memory_array_location(u8 code)
{
/* 3.3.17.1 */
static const char *location[] = {
"Other", /* 0x01 */
"Unknown",
"System Board Or Motherboard",
"ISA Add-on Card",
"EISA Add-on Card",
"PCI Add-on Card",
"MCA Add-on Card",
"PCMCIA Add-on Card",
"Proprietary Add-on Card",
"NuBus" /* 0x0A */
};
static const char *location_0xA0[] = {
"PC-98/C20 Add-on Card", /* 0xA0 */
"PC-98/C24 Add-on Card",
"PC-98/E Add-on Card",
"PC-98/Local Bus Add-on Card" /* 0xA3 */
};
if (code >= 0x01 && code <= 0x0A)
return location[code - 0x01];
if (code >= 0xA0 && code <= 0xA4)
return location_0xA0[code - 0xA0];
return out_of_spec;
}
static const char *dmi_memory_array_use(u8 code)
{
/* 3.3.17.2 */
static const char *use[] = {
"Other", /* 0x01 */
"Unknown",
"System Memory",
"Video Memory",
"Flash Memory",
"Non-volatile RAM",
"Cache Memory" /* 0x07 */
};
if (code >= 0x01 && code <= 0x07)
return use[code - 0x01];
return out_of_spec;
}
static const char *dmi_memory_array_ec_type(u8 code)
{
/* 3.3.17.3 */
static const char *type[] = {
"Other", /* 0x01 */
"Unknown",
"None",
"Parity",
"Single-bit ECC",
"Multi-bit ECC",
"CRC" /* 0x07 */
};
if (code >= 0x01 && code <= 0x07)
return type[code - 0x01];
return out_of_spec;
}
static void dmi_memory_array_capacity(u32 code)
{
if (code == 0x8000000)
printf(" Unknown");
else
{
if ((code & 0x000FFFFF) == 0)
printf(" %u GB", code >> 20);
else if ((code & 0x000003FF) == 0)
printf(" %u MB", code >> 10);
else
printf(" %u kB", code);
}
}
static void dmi_memory_array_error_handle(u16 code)
{
if (code == 0xFFFE)
printf(" Not Provided");
else if (code == 0xFFFF)
printf(" No Error");
else
printf(" 0x%04X", code);
}
/*
* 3.3.18 Memory Device (Type 17)
*/
static void dmi_memory_device_width(u16 code)
{
/*
* If no memory module is present, width may be 0
*/
if (code == 0xFFFF || code == 0)
printf(" Unknown");
else
printf(" %u bits", code);
}
static void dmi_memory_device_size(u16 code)
{
if (code == 0)
printf(" No Module Installed");
else if (code == 0xFFFF)
printf(" Unknown");
else
{
if (code & 0x8000)
printf(" %u kB", code & 0x7FFF);
else
printf(" %u MB", code);
}
}
static const char *dmi_memory_device_form_factor(u8 code)
{
/* 3.3.18.1 */
static const char *form_factor[] = {
"Other", /* 0x01 */
"Unknown",
"SIMM",
"SIP",
"Chip",
"DIP",
"ZIP",
"Proprietary Card",
"DIMM",
"TSOP",
"Row Of Chips",
"RIMM",
"SODIMM",
"SRIMM",
"FB-DIMM" /* 0x0F */
};
if (code >= 0x01 && code <= 0x0F)
return form_factor[code - 0x01];
return out_of_spec;
}
static void dmi_memory_device_set(u8 code)
{
if (code == 0)
printf(" None");
else if (code == 0xFF)
printf(" Unknown");
else
printf(" %u", code);
}
static const char *dmi_memory_device_type(u8 code)
{
/* 3.3.18.2 */
static const char *type[] = {
"Other", /* 0x01 */
"Unknown",
"DRAM",
"EDRAM",
"VRAM",
"SRAM",
"RAM",
"ROM",
"Flash",
"EEPROM",
"FEPROM",
"EPROM",
"CDRAM",
"3DRAM",
"SDRAM",
"SGRAM",
"RDRAM",
"DDR",
"DDR2",
"DDR2 FB-DIMM" /* 0x14 */
};
if (code >= 0x01 && code <= 0x14)
return type[code - 0x01];
return out_of_spec;
}
static void dmi_memory_device_type_detail(u16 code)
{
/* 3.3.18.3 */
static const char *detail[] = {
"Other", /* 1 */
"Unknown",
"Fast-paged",
"Static Column",
"Pseudo-static",
"RAMBus",
"Synchronous",
"CMOS",
"EDO",
"Window DRAM",
"Cache DRAM",
"Non-Volatile" /* 12 */
};
if ((code & 0x1FFE) == 0)
printf(" None");
else
{
int i;
for (i = 1; i <= 12; i++)
if (code & (1 << i))
printf(" %s", detail[i - 1]);
}
}
static void dmi_memory_device_speed(u16 code)
{
if (code == 0)
printf(" Unknown");
else
printf(" %u MHz", code);
}
/*
* 3.3.19 32-bit Memory Error Information (Type 18)
*/
static const char *dmi_memory_error_type(u8 code)
{
/* 3.3.19.1 */
static const char *type[] = {
"Other", /* 0x01 */
"Unknown",
"OK",
"Bad Read",
"Parity Error",
"Single-bit Error",
"Double-bit Error",
"Multi-bit Error",
"Nibble Error",
"Checksum Error",
"CRC Error",
"Corrected Single-bit Error",
"Corrected Error",
"Uncorrectable Error" /* 0x0E */
};
if (code >= 0x01 && code <= 0x0E)
return type[code - 0x01];
return out_of_spec;
}
static const char *dmi_memory_error_granularity(u8 code)
{
/* 3.3.19.2 */
static const char *granularity[] = {
"Other", /* 0x01 */
"Unknown",
"Device Level",
"Memory Partition Level" /* 0x04 */
};
if (code >= 0x01 && code <= 0x04)
return granularity[code - 0x01];
return out_of_spec;
}
static const char *dmi_memory_error_operation(u8 code)
{
/* 3.3.19.3 */
static const char *operation[] = {
"Other", /* 0x01 */
"Unknown",
"Read",
"Write",
"Partial Write" /* 0x05 */
};
if (code >= 0x01 && code <= 0x05)
return operation[code - 0x01];
return out_of_spec;
}
static void dmi_memory_error_syndrome(u32 code)
{
if (code == 0x00000000)
printf(" Unknown");
else
printf(" 0x%08X", code);
}
static void dmi_32bit_memory_error_address(u32 code)
{
if (code == 0x80000000)
printf(" Unknown");
else
printf(" 0x%08X", code);
}
/*
* 3.3.20 Memory Array Mapped Address (Type 19)
*/
static void dmi_mapped_address_size(u32 code)
{
if (code == 0)
printf(" Invalid");
else if ((code & 0x000FFFFF) == 0)
printf(" %u GB", code >> 20);
else if ((code & 0x000003FF) == 0)
printf(" %u MB", code >> 10);
else
printf(" %u kB", code);
}
/*
* 3.3.21 Memory Device Mapped Address (Type 20)
*/
static void dmi_mapped_address_row_position(u8 code)
{
if (code == 0)
printf(" %s", out_of_spec);
else if (code == 0xFF)
printf(" Unknown");
else
printf(" %u", code);
}
static void dmi_mapped_address_interleave_position(u8 code, const char *prefix)
{
if (code != 0)
{
printf("%sInterleave Position:", prefix);
if (code == 0xFF)
printf(" Unknown");
else
printf(" %u", code);
printf("\n");
}
}
static void dmi_mapped_address_interleaved_data_depth(u8 code, const char *prefix)
{
if (code != 0)
{
printf("%sInterleaved Data Depth:", prefix);
if (code == 0xFF)
printf(" Unknown");
else
printf(" %u", code);
printf("\n");
}
}
/*
* 3.3.22 Built-in Pointing Device (Type 21)
*/
static const char *dmi_pointing_device_type(u8 code)
{
/* 3.3.22.1 */
static const char *type[] = {
"Other", /* 0x01 */
"Unknown",
"Mouse",
"Track Ball",
"Track Point",
"Glide Point",
"Touch Pad",
"Touch Screen",
"Optical Sensor" /* 0x09 */
};
if (code >= 0x01 && code <= 0x09)
return type[code - 0x01];
return out_of_spec;
}
static const char *dmi_pointing_device_interface(u8 code)
{
/* 3.3.22.2 */
static const char *interface[] = {
"Other", /* 0x01 */
"Unknown",
"Serial",
"PS/2",
"Infrared",
"HIP-HIL",
"Bus Mouse",
"ADB (Apple Desktop Bus)" /* 0x08 */
};
static const char *interface_0xA0[] = {
"Bus Mouse DB-9", /* 0xA0 */
"Bus Mouse Micro DIN",
"USB" /* 0xA2 */
};
if (code >= 0x01 && code <= 0x08)
return interface[code - 0x01];
if (code >= 0xA0 && code <= 0xA2)
return interface_0xA0[code - 0xA0];
return out_of_spec;
}
/*
* 3.3.23 Portable Battery (Type 22)
*/
static const char *dmi_battery_chemistry(u8 code)
{
/* 3.3.23.1 */
static const char *chemistry[] = {
"Other", /* 0x01 */
"Unknown",
"Lead Acid",
"Nickel Cadmium",
"Nickel Metal Hydride",
"Lithium Ion",
"Zinc Air",
"Lithium Polymer" /* 0x08 */
};
if (code >= 0x01 && code <= 0x08)
return chemistry[code - 0x01];
return out_of_spec;
}
static void dmi_battery_capacity(u16 code, u8 multiplier)
{
if (code == 0)
printf(" Unknown");
else
printf(" %u mWh", code * multiplier);
}
static void dmi_battery_voltage(u16 code)
{
if (code == 0)
printf(" Unknown");
else
printf(" %u mV", code);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -