mirror of
https://github.com/crash-utility/crash
synced 2025-02-23 08:56:48 +00:00
Introduction of the "sys -i" option, which displays the kernel's DMI
identification string data if available. (atomlin@redhat.com, anderson@redhat.com)
This commit is contained in:
parent
889f4f665e
commit
9ba68adb0c
23
help.c
23
help.c
@ -3234,7 +3234,7 @@ NULL
|
||||
char *help_sys[] = {
|
||||
"sys",
|
||||
"system data",
|
||||
"[-c [name|number]] [-t] config",
|
||||
"[-c [name|number]] [-t] [-i] config",
|
||||
" 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",
|
||||
@ -3257,6 +3257,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 the DMI string data if available in the kernel.",
|
||||
|
||||
"\nEXAMPLES",
|
||||
" Display essential system information:\n",
|
||||
@ -3321,6 +3322,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 the DMI string data:\n",
|
||||
" %s> sys -i",
|
||||
" DMI_BIOS_VENDOR: LENOVO",
|
||||
" DMI_BIOS_VERSION: G4ET37WW (1.12 )",
|
||||
" DMI_BIOS_DATE: 05/29/2012",
|
||||
" DMI_SYS_VENDOR: LENOVO",
|
||||
" DMI_PRODUCT_NAME: 2429BQ1",
|
||||
" DMI_PRODUCT_VERSION: ThinkPad T530",
|
||||
" DMI_PRODUCT_SERIAL: R9R91HZ",
|
||||
" DMI_PRODUCT_UUID: 568DFA01-5180-11CB-B851-BD06085ADDB0",
|
||||
" DMI_BOARD_VENDOR: LENOVO",
|
||||
" DMI_BOARD_NAME: 2429BQ1",
|
||||
" DMI_BOARD_VERSION: Not Available",
|
||||
" DMI_BOARD_SERIAL: 1ZLV127F17M",
|
||||
" DMI_BOARD_ASSET_TAG: Not Available",
|
||||
" DMI_CHASSIS_VENDOR: LENOVO",
|
||||
" DMI_CHASSIS_TYPE: 10",
|
||||
" DMI_CHASSIS_VERSION: Not Available",
|
||||
" DMI_CHASSIS_SERIAL: R9R91HZ",
|
||||
" DMI_CHASSIS_ASSET_TAG: RH0004111",
|
||||
NULL
|
||||
};
|
||||
|
||||
|
71
kernel.c
71
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':
|
||||
@ -4942,6 +4943,10 @@ cmd_sys(void)
|
||||
show_kernel_taints(buf, VERBOSE);
|
||||
return;
|
||||
|
||||
case 'i':
|
||||
dump_dmi_info();
|
||||
return;
|
||||
|
||||
default:
|
||||
argerrs++;
|
||||
break;
|
||||
@ -10112,3 +10117,67 @@ 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, array_len, len, maxlen;
|
||||
ulong dmi_ident_p, vaddr;
|
||||
char buf1[BUFSIZE];
|
||||
char buf2[BUFSIZE];
|
||||
char *arglist[MAXARGS];
|
||||
|
||||
if (!kernel_symbol_exists("dmi_ident"))
|
||||
error(FATAL, "dmi_ident does not exist in this kernel\n");
|
||||
|
||||
dmi_ident_p = symbol_value("dmi_ident");
|
||||
array_len = get_array_length("dmi_ident", NULL, 0);
|
||||
maxlen = 0;
|
||||
|
||||
open_tmpfile();
|
||||
|
||||
if (dump_enumerator_list("dmi_field")) {
|
||||
rewind(pc->tmpfile);
|
||||
while (fgets(buf1, BUFSIZE, pc->tmpfile)) {
|
||||
if (!strstr(buf1, " = "))
|
||||
continue;
|
||||
if ((parse_line(buf1, arglist) != 3) ||
|
||||
(atoi(arglist[2]) >= array_len))
|
||||
break;
|
||||
len = strlen(arglist[0]);
|
||||
if (len > maxlen)
|
||||
maxlen = len;
|
||||
}
|
||||
|
||||
rewind(pc->tmpfile);
|
||||
while (fgets(buf1, BUFSIZE, pc->tmpfile)) {
|
||||
if (!strstr(buf1, " = "))
|
||||
continue;
|
||||
|
||||
if ((parse_line(buf1, arglist) != 3) ||
|
||||
((i = atoi(arglist[2])) >= array_len))
|
||||
break;
|
||||
|
||||
readmem(dmi_ident_p + (sizeof(void *) * i),
|
||||
KVADDR, &vaddr, sizeof(void *),
|
||||
"dmi_ident", FAULT_ON_ERROR);
|
||||
if (!vaddr)
|
||||
continue;
|
||||
|
||||
read_string(vaddr, buf2, BUFSIZE-1);
|
||||
fprintf(pc->saved_fp, " %s%s: %s\n",
|
||||
space(maxlen - strlen(arglist[0])), arglist[0], buf2);
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < array_len; i++) {
|
||||
readmem(dmi_ident_p + (sizeof(void *) * i),
|
||||
KVADDR, &vaddr, sizeof(void *),
|
||||
"dmi_ident", FAULT_ON_ERROR);
|
||||
if (!vaddr)
|
||||
continue;
|
||||
read_string(vaddr, buf1, BUFSIZE-1);
|
||||
fprintf(pc->saved_fp, " dmi_ident[%d]: %s\n", i, buf1);
|
||||
}
|
||||
}
|
||||
|
||||
close_tmpfile();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user