mirror of
https://github.com/ipmitool/ipmitool.git
synced 2025-05-10 18:47:22 +00:00
add function to print extended SEL record info
for breaking down Event Data fields
This commit is contained in:
parent
929d330424
commit
7dcd5cec76
@ -404,6 +404,158 @@ ipmi_sel_print_std_entry_verbose(struct sel_event_record * evt)
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
static void
|
||||
ipmi_sel_print_extended_entry_verbose(struct sel_event_record * evt, struct sdr_record_list * sdr)
|
||||
{
|
||||
char * description;
|
||||
if (!evt || !sdr)
|
||||
return;
|
||||
|
||||
printf("SEL Record ID : %04x\n", evt->record_id);
|
||||
|
||||
if (evt->record_type == 0xf0)
|
||||
{
|
||||
printf (" Record Type : Linux kernel panic (OEM record %02x)\n", evt->record_type);
|
||||
printf (" Panic string : %.11s\n\n", (char *) evt + 5);
|
||||
return;
|
||||
}
|
||||
|
||||
if (evt->record_type >= 0xc0)
|
||||
printf(" Record Type : OEM record %02x\n", evt->record_type >= 0xc0);
|
||||
else
|
||||
printf(" Record Type : %02x\n", evt->record_type);
|
||||
|
||||
if (evt->record_type < 0xe0)
|
||||
{
|
||||
printf(" Timestamp : %s\n",
|
||||
ipmi_sel_timestamp(evt->timestamp));
|
||||
}
|
||||
|
||||
if (evt->record_type >= 0xc0)
|
||||
{
|
||||
printf("\n");
|
||||
return;
|
||||
}
|
||||
|
||||
printf(" Generator ID : %04x\n",
|
||||
evt->gen_id);
|
||||
printf(" EvM Revision : %02x\n",
|
||||
evt->evm_rev);
|
||||
printf(" Sensor Type : %s\n",
|
||||
ipmi_sel_get_sensor_type(evt->sensor_type));
|
||||
printf(" Sensor Number : %02x\n",
|
||||
evt->sensor_num);
|
||||
printf(" Event Type : %s\n",
|
||||
ipmi_get_event_type(evt->event_type));
|
||||
printf(" Event Direction : %s\n",
|
||||
val2str(evt->event_dir, event_dir_vals));
|
||||
printf(" Event Data (RAW) : %02x%02x%02x\n",
|
||||
evt->event_data[0], evt->event_data[1], evt->event_data[2]);
|
||||
|
||||
/* break down event data field
|
||||
* as per IPMI Spec 2.0 Table 29-6 */
|
||||
if (evt->event_type == 1 && sdr->type == SDR_RECORD_TYPE_FULL_SENSOR) {
|
||||
/* Threshold */
|
||||
switch ((evt->event_data[0] >> 6) & 3) { /* EV1[7:6] */
|
||||
case 0:
|
||||
/* unspecified byte 2 */
|
||||
break;
|
||||
case 1:
|
||||
/* trigger reading in byte 2 */
|
||||
printf(" Trigger Reading : %.3f",
|
||||
sdr_convert_sensor_reading(sdr->record.full,
|
||||
evt->event_data[1]));
|
||||
/* determine units with possible modifiers */
|
||||
switch (sdr->record.full->unit.modifier) {
|
||||
case 2:
|
||||
printf(" %s * %s\n",
|
||||
unit_desc[sdr->record.full->unit.type.base],
|
||||
unit_desc[sdr->record.full->unit.type.modifier]);
|
||||
break;
|
||||
case 1:
|
||||
printf(" %s/%s\n",
|
||||
unit_desc[sdr->record.full->unit.type.base],
|
||||
unit_desc[sdr->record.full->unit.type.modifier]);
|
||||
break;
|
||||
case 0:
|
||||
printf(" %s\n",
|
||||
unit_desc[sdr->record.full->unit.type.base]);
|
||||
break;
|
||||
default:
|
||||
printf("\n");
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
/* oem code in byte 2 */
|
||||
printf(" OEM Data : %02x\n",
|
||||
evt->event_data[1]);
|
||||
break;
|
||||
case 3:
|
||||
/* sensor-specific extension code in byte 2 */
|
||||
printf(" Sensor Extension Code : %02x\n",
|
||||
evt->event_data[1]);
|
||||
break;
|
||||
}
|
||||
switch ((evt->event_data[0] >> 4) & 3) { /* EV1[5:4] */
|
||||
case 0:
|
||||
/* unspecified byte 3 */
|
||||
break;
|
||||
case 1:
|
||||
/* trigger threshold value in byte 3 */
|
||||
printf(" Trigger Threshold : %.3f",
|
||||
sdr_convert_sensor_reading(sdr->record.full,
|
||||
evt->event_data[2]));
|
||||
/* determine units with possible modifiers */
|
||||
switch (sdr->record.full->unit.modifier) {
|
||||
case 2:
|
||||
printf(" %s * %s\n",
|
||||
unit_desc[sdr->record.full->unit.type.base],
|
||||
unit_desc[sdr->record.full->unit.type.modifier]);
|
||||
break;
|
||||
case 1:
|
||||
printf(" %s/%s\n",
|
||||
unit_desc[sdr->record.full->unit.type.base],
|
||||
unit_desc[sdr->record.full->unit.type.modifier]);
|
||||
break;
|
||||
case 0:
|
||||
printf(" %s\n",
|
||||
unit_desc[sdr->record.full->unit.type.base]);
|
||||
break;
|
||||
default:
|
||||
printf("\n");
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
/* OEM code in byte 3 */
|
||||
printf(" OEM Data : %02x\n",
|
||||
evt->event_data[2]);
|
||||
break;
|
||||
case 3:
|
||||
/* sensor-specific extension code in byte 3 */
|
||||
printf(" Sensor Extension Code : %02x\n",
|
||||
evt->event_data[2]);
|
||||
break;
|
||||
}
|
||||
} else if ((evt->event_type >= 0x2 && evt->event_type <= 0xc) ||
|
||||
(evt->event_type == 0x6f)) {
|
||||
/* Discrete */
|
||||
} else if (evt->event_type >= 0x70 && evt->event_type <= 0x7f) {
|
||||
/* OEM */
|
||||
} else {
|
||||
printf(" Event Data : %02x%02x%02x\n",
|
||||
evt->event_data[0], evt->event_data[1], evt->event_data[2]);
|
||||
}
|
||||
|
||||
ipmi_get_event_desc(evt, &description);
|
||||
printf(" Description : %s\n",
|
||||
description ? description : "");
|
||||
free(description);
|
||||
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
static void
|
||||
ipmi_sel_list_entries(struct ipmi_intf * intf)
|
||||
{
|
||||
@ -707,12 +859,12 @@ ipmi_sel_show_entry(struct ipmi_intf * intf, int argc, char ** argv)
|
||||
|
||||
/* lookup SEL entry based on ID */
|
||||
ipmi_sel_get_std_entry(intf, id, &evt);
|
||||
/* print SEL entry */
|
||||
ipmi_sel_print_std_entry_verbose(&evt);
|
||||
/* lookup SDR entry based on sensor number and type */
|
||||
sdr = ipmi_sdr_find_sdr_bynumtype(intf, evt.sensor_num, evt.sensor_type);
|
||||
if (!sdr)
|
||||
continue;
|
||||
/* print SEL extended entry */
|
||||
ipmi_sel_print_extended_entry_verbose(&evt, sdr);
|
||||
/* print SDR entry */
|
||||
oldv = verbose;
|
||||
verbose = verbose ? : 1;
|
||||
|
Loading…
x
Reference in New Issue
Block a user