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@xxxxxxxxxx> > Signed-off-by: Aaron Tomlin <atomlin@xxxxxxxxxx> > --- > 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@xxxxxxxxxx > https://www.redhat.com/mailman/listinfo/crash-utility > -- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility