[Crash-utility] [PATCH] sys: Introduce -i option to dump dmi_ident data

Dave Anderson anderson at redhat.com
Mon Dec 7 16:59:47 UTC 2015


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




More information about the Crash-utility mailing list