Aaron and Buland,
I was just about to check this in when I thought that maybe it could
be a bit more informative than just "dmi_ident[#]: <string>", given
that the output could also incorporate the enum name/index, as is done
with a few other crash commands:
crash> dmi_field
enum dmi_field {
DMI_NONE = 0
DMI_BIOS_VENDOR = 1
DMI_BIOS_VERSION = 2
DMI_BIOS_DATE = 3
DMI_SYS_VENDOR = 4
DMI_PRODUCT_NAME = 5
DMI_PRODUCT_VERSION = 6
DMI_PRODUCT_SERIAL = 7
DMI_PRODUCT_UUID = 8
DMI_BOARD_VENDOR = 9
DMI_BOARD_NAME = 10
DMI_BOARD_VERSION = 11
DMI_BOARD_SERIAL = 12
DMI_BOARD_ASSET_TAG = 13
DMI_CHASSIS_VENDOR = 14
DMI_CHASSIS_TYPE = 15
DMI_CHASSIS_VERSION = 16
DMI_CHASSIS_SERIAL = 17
DMI_CHASSIS_ASSET_TAG = 18
DMI_STRING_MAX = 19
};
Although, gdb doesn't have the dmi_field enum data available like the
above in really old kernels, so in those rare cases it could only be
done as you have. Maybe there could be an index_to_DMI_field() function
that returns the string above, or just a number string if it can't do
the translation?
Dave
----- Original Message -----
This patch introduces a '-i' option to the 'sys'
command to allow the user
to conveniently display the DMI (Desktop Management Interface) table,
if available in the kernel. For example:
crash> sys -i
dmi_ident[1]: LENOVO
dmi_ident[2]: GIET75WW (2.25 )
dmi_ident[3]: 06/24/2014
dmi_ident[4]: LENOVO
dmi_ident[5]: 20AMS22U0C
dmi_ident[6]: ThinkPad X240
dmi_ident[7]: PC00CDZE
dmi_ident[8]: 01338439-0853-CB11-8EBB-CE1D1FC1CBC0
dmi_ident[9]: LENOVO
dmi_ident[10]: 20AMS22U0C
dmi_ident[11]: Not Defined
dmi_ident[12]: L1HF47E00T3
dmi_ident[13]: Not Available
dmi_ident[14]: LENOVO
dmi_ident[15]: 10
dmi_ident[16]: Not Available
dmi_ident[17]: PC00CDZE
dmi_ident[18]: No Asset Information
crash>
Suggested-by: Buland Singh <bsingh(a)redhat.com>
Signed-off-by: Aaron Tomlin <atomlin(a)redhat.com>
---
help.c | 23 ++++++++++++++++++++++-
kernel.c | 31 ++++++++++++++++++++++++++++++-
2 files changed, 52 insertions(+), 2 deletions(-)
diff --git a/help.c b/help.c
index 4834f4b..563cd88 100644
--- a/help.c
+++ b/help.c
@@ -3231,7 +3231,7 @@ NULL
char *help_sys[] = {
"sys",
"system data",
-"[-c [name|number]] [-t] config",
+"[-c [name|number]] [-t] config [-i]",
" This command displays system-specific data. If no arguments are
entered,\n"
" the same system data shown during %s invocation is shown.\n",
" -c [name|number] If no name or number argument is entered, dump all",
@@ -3254,6 +3254,7 @@ char *help_sys[] = {
" /dev/mem. Results in the %s context causing an",
" \"Attempted to kill the idle task!\" panic. (The
dump",
" will indicate that the %s context has a PID of 0).",
+" -i Dump dmi_ident data, if available in the kernel.",
"\nEXAMPLES",
" Display essential system information:\n",
@@ -3318,6 +3319,26 @@ char *help_sys[] = {
" ",
" If the current output radix has been set to 16, the system call
numbers",
" will be displayed in hexadecimal.",
+"\n Dump dmi_ident data:\n",
+" %s> sys -i",
+" dmi_ident[1]: LENOVO",
+" dmi_ident[2]: GIET75WW (2.25 )",
+" dmi_ident[3]: 06/24/2014",
+" dmi_ident[4]: LENOVO",
+" dmi_ident[5]: 20AMS22U0C",
+" dmi_ident[6]: ThinkPad X240",
+" dmi_ident[7]: PC00CDZE",
+" dmi_ident[8]: 01338439-0853-CB11-8EBB-CE1D1FC1CBC0",
+" dmi_ident[9]: LENOVO",
+" dmi_ident[10]: 20AMS22U0C",
+" dmi_ident[11]: Not Defined",
+" dmi_ident[12]: L1HF47E00T3",
+" dmi_ident[13]: Not Available",
+" dmi_ident[14]: LENOVO",
+" dmi_ident[15]: 10",
+" dmi_ident[16]: Not Available",
+" dmi_ident[17]: PC00CDZE",
+" dmi_ident[18]: No Asset Information",
NULL
};
diff --git a/kernel.c b/kernel.c
index dbba05a..d9ca676 100644
--- a/kernel.c
+++ b/kernel.c
@@ -77,6 +77,7 @@ static void dump_log_legacy(void);
static void dump_variable_length_record(void);
static int is_livepatch(void);
static void show_kernel_taints(char *, int);
+static void dump_dmi_info(void);
static void list_source_code(struct gnu_request *, int);
static void source_tree_init(void);
@@ -4924,7 +4925,7 @@ cmd_sys(void)
sflag = FALSE;
- while ((c = getopt(argcnt, args, "ctp:")) != EOF) {
+ while ((c = getopt(argcnt, args, "ctip:")) != EOF) {
switch(c)
{
case 'p':
@@ -4941,6 +4942,9 @@ cmd_sys(void)
case 't':
show_kernel_taints(buf, VERBOSE);
return;
+ case 'i':
+ dump_dmi_info();
+ return;
default:
argerrs++;
@@ -10112,3 +10116,28 @@ show_kernel_taints(char *buf, int verbose)
fprintf(fp, "TAINTED_MASK: %lx %s\n", tainted_mask, buf);
}
+static void
+dump_dmi_info(void)
+{
+ int i, len;
+ ulong dmi_ident_p, vaddr;
+ char buf[BUFSIZE];
+
+ if (!kernel_symbol_exists("dmi_ident")) {
+ error(INFO, "dmi_ident does not exist in this kernel\n");
+ }
+
+ dmi_ident_p = symbol_value("dmi_ident");
+ len = get_array_length("dmi_ident", NULL, 0);
+
+ for (i = 0; i < len; i++) {
+ readmem(dmi_ident_p + (sizeof(void *) * i),
+ KVADDR, &vaddr, sizeof(void *),
+ "dmi_ident", FAULT_ON_ERROR);
+
+ if (!vaddr)
+ continue;
+ read_string(vaddr, buf, BUFSIZE-1);
+ fprintf(fp, " dmi_ident[%d]: %s\n", i, buf);
+ }
+}
--
2.4.3
--
Crash-utility mailing list
Crash-utility(a)redhat.com
https://www.redhat.com/mailman/listinfo/crash-utility