>From df03f6d79760d974fbec78421f988c86e2a46cfb Mon Sep 17 00:00:00 2001 From: Aaron Tomlin Date: Sun, 6 Dec 2015 09:58:45 +0000 Subject: [PATCH v2] sys: Introduce -i option to dump dmi_ident data 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_BIOS_VENDOR: LENOVO DMI_BIOS_VERSION: GIET75WW (2.25 ) DMI_BIOS_DATE: 06/24/2014 DMI_SYS_VENDOR: LENOVO DMI_PRODUCT_NAME: 20AMS22U0C DMI_PRODUCT_VERSION: ThinkPad X240 DMI_PRODUCT_SERIAL: PC00CDZE DMI_PRODUCT_UUID: 01338439-0853-CB11-8EBB-CE1D1FC1CBC0 DMI_BOARD_VENDOR: LENOVO DMI_BOARD_NAME: 20AMS22U0C DMI_BOARD_VERSION: Not Defined DMI_BOARD_SERIAL: L1HF47E00T3 DMI_BOARD_ASSET_TAG: Not Available DMI_CHASSIS_VENDOR: LENOVO DMI_CHASSIS_TYPE: 10 DMI_CHASSIS_VERSION: Not Available DMI_CHASSIS_SERIAL: PC00CDZE DMI_CHASSIS_ASSET_TAG: No Asset Information crash> For older kernels that do not have 'dmi_field' enum data available, the output is as follows: 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 Signed-off-by: Aaron Tomlin --- help.c | 23 ++++++++++++++++++++++- kernel.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 80 insertions(+), 2 deletions(-) diff --git a/help.c b/help.c index 4834f4b..f9d654e 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_BIOS_VENDOR: LENOVO", +" DMI_BIOS_VERSION: GIET75WW (2.25 )", +" DMI_BIOS_DATE: 06/24/2014", +" DMI_SYS_VENDOR: LENOVO", +" DMI_PRODUCT_NAME: 20AMS22U0C", +" DMI_PRODUCT_VERSION: ThinkPad X240", +" DMI_PRODUCT_SERIAL: PC00CDZE", +" DMI_PRODUCT_UUID: 01338439-0853-CB11-8EBB-CE1D1FC1CBC0", +" DMI_BOARD_VENDOR: LENOVO", +" DMI_BOARD_NAME: 20AMS22U0C", +" DMI_BOARD_VERSION: Not Defined", +" DMI_BOARD_SERIAL: L1HF47E00T3", +" DMI_BOARD_ASSET_TAG: Not Available", +" DMI_CHASSIS_VENDOR: LENOVO", +" DMI_CHASSIS_TYPE: 10", +" DMI_CHASSIS_VERSION: Not Available", +" DMI_CHASSIS_SERIAL: PC00CDZE", +" DMI_CHASSIS_ASSET_TAG: No Asset Information", NULL }; diff --git a/kernel.c b/kernel.c index dbba05a..096cfa2 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,56 @@ 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]; + char dmi_str[BUFSIZE]; + char *arglist[MAXARGS]; + + 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); + + open_tmpfile(); + if (dump_enumerator_list("dmi_field")) { + rewind(pc->tmpfile); + while (fgets(buf, BUFSIZE, pc->tmpfile)) { + if (!strstr(buf, " = ")) + continue; + + parse_line(buf, arglist); + + i = atoi(arglist[2]); + if (i >= len) + break; + + readmem(dmi_ident_p + (sizeof(void *) * i), + KVADDR, &vaddr, sizeof(void *), + "dmi_ident", FAULT_ON_ERROR); + + if (!vaddr) + continue; + read_string(vaddr, dmi_str, BUFSIZE-1); + fprintf(pc->saved_fp, " %25s: %s\n", arglist[0], + dmi_str); + } + } else { + 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(pc->saved_fp, " dmi_ident[%d]: %s\n", i, buf); + } + } + close_tmpfile(); +} -- 2.4.3