Skip to content

Commit

Permalink
9569 smbios(1M) could decode voltage and curent probes
Browse files Browse the repository at this point in the history
9570 smbios(1M) could decode cooling devices
9571 smbios(1M) could decode temperature probes
9572 smb_impl.h structs should comment corresponding type
9573 overshifted smbios major version leads to undershifted data
9574 smbios(1M) shouldn't print non-existant bios versions
Reviewed by: Tim Kordas <tim.kordas@joyent.com>
Reviewed by: Dan McDonald <danmcd@joyent.com>
Reviewed by: Toomas Soome <tsoome@me.com>
Reviewed by: Igor Kozhukhov <igor@dilos.org>
Reviewed by: Yuri Pankov <yuripv@yuripv.net>
Approved by: Dan McDonald <danmcd@joyent.com>
  • Loading branch information
rmustacc committed Jul 19, 2018
1 parent 284ce98 commit f44a139
Show file tree
Hide file tree
Showing 6 changed files with 752 additions and 2 deletions.
245 changes: 244 additions & 1 deletion usr/src/cmd/smbios/smbios.c
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,13 @@ print_bios(smbios_hdl_t *shp, FILE *fp)
b.smbb_biosv.smbv_major, b.smbb_biosv.smbv_minor);
}

if (b.smbb_nxcflags > SMB_BIOSXB_ECFW_MIN) {
/*
* If the major and minor versions are 0xff then that indicates that the
* embedded controller does not exist.
*/
if (b.smbb_nxcflags > SMB_BIOSXB_ECFW_MIN &&
b.smbb_ecfwv.smbv_major != 0xff &&
b.smbb_ecfwv.smbv_minor != 0xff) {
oprintf(fp, " Embedded Ctlr Firmware Version Number: %u.%u\n",
b.smbb_ecfwv.smbv_major, b.smbb_ecfwv.smbv_minor);
}
Expand Down Expand Up @@ -976,6 +982,227 @@ print_hwsec(smbios_hdl_t *shp, FILE *fp)
fp, " Front Panel Reset Status: %u", h.smbh_pan_ps);
}

static void
print_vprobe(smbios_hdl_t *shp, id_t id, FILE *fp)
{
smbios_vprobe_t vp;

if (smbios_info_vprobe(shp, id, &vp) != 0) {
smbios_warn(shp, "failed to read voltage probe information");
return;
}

oprintf(fp, " Description: %s\n", vp.smbvp_description != NULL ?
vp.smbvp_description : "unknown");
desc_printf(smbios_vprobe_loc_desc(vp.smbvp_location),
fp, " Location: %u", vp.smbvp_location);
desc_printf(smbios_vprobe_status_desc(vp.smbvp_status),
fp, " Status: %u", vp.smbvp_status);

if (vp.smbvp_maxval != SMB_PROBE_UNKNOWN_VALUE) {
oprintf(fp, " Maximum Possible Voltage: %u mV\n",
vp.smbvp_maxval);
} else {
oprintf(fp, " Maximum Possible Voltage: unknown\n");
}

if (vp.smbvp_minval != SMB_PROBE_UNKNOWN_VALUE) {
oprintf(fp, " Minimum Possible Voltage: %u mV\n",
vp.smbvp_minval);
} else {
oprintf(fp, " Minimum Possible Voltage: unknown\n");
}

if (vp.smbvp_resolution != SMB_PROBE_UNKNOWN_VALUE) {
oprintf(fp, " Probe Resolution: %u.%u mV\n",
vp.smbvp_resolution / 10,
vp.smbvp_resolution % 10);
} else {
oprintf(fp, " Probe Resolution: unknown\n");
}

if (vp.smbvp_tolerance != SMB_PROBE_UNKNOWN_VALUE) {
oprintf(fp, " Probe Tolerance: +/-%u mV\n",
vp.smbvp_tolerance);
} else {
oprintf(fp, " Probe Tolerance: unknown\n");
}

if (vp.smbvp_accuracy != SMB_PROBE_UNKNOWN_VALUE) {
oprintf(fp, " Probe Accuracy: +/-%u.%02u%%\n",
vp.smbvp_accuracy / 100,
vp.smbvp_accuracy % 100);
} else {
oprintf(fp, " Probe Accuracy: unknown\n");
}

oprintf(fp, " OEM- or BIOS- defined value: 0x%x\n", vp.smbvp_oem);

if (vp.smbvp_nominal != SMB_PROBE_UNKNOWN_VALUE) {
oprintf(fp, " Probe Nominal Value: %u mV\n", vp.smbvp_nominal);
} else {
oprintf(fp, " Probe Nominal Value: unknown\n");
}
}

static void
print_cooldev(smbios_hdl_t *shp, id_t id, FILE *fp)
{
smbios_cooldev_t cd;

if (smbios_info_cooldev(shp, id, &cd) != 0) {
smbios_warn(shp, "failed to read cooling device "
"information");
return;
}

id_printf(fp, " Temperature Probe Handle: ", cd.smbcd_tprobe);
desc_printf(smbios_cooldev_type_desc(cd.smbcd_type),
fp, " Device Type: %u", cd.smbcd_type);
desc_printf(smbios_cooldev_status_desc(cd.smbcd_status),
fp, " Status: %u", cd.smbcd_status);
oprintf(fp, " Cooling Unit Group: %u\n", cd.smbcd_group);
oprintf(fp, " OEM- or BIOS- defined data: 0x%x\n", cd.smbcd_oem);
if (cd.smbcd_nominal != SMB_PROBE_UNKNOWN_VALUE) {
oprintf(fp, " Nominal Speed: %u RPM\n", cd.smbcd_nominal);
} else {
oprintf(fp, " Nominal Speed: unknown\n");
}

if (cd.smbcd_descr != NULL && cd.smbcd_descr[0] != '\0') {
oprintf(fp, " Description: %s\n", cd.smbcd_descr);
}
}

static void
print_tprobe(smbios_hdl_t *shp, id_t id, FILE *fp)
{
smbios_tprobe_t tp;

if (smbios_info_tprobe(shp, id, &tp) != 0) {
smbios_warn(shp, "failed to read temperature probe "
"information");
return;
}

oprintf(fp, " Description: %s\n", tp.smbtp_description != NULL ?
tp.smbtp_description : "unknown");
desc_printf(smbios_tprobe_loc_desc(tp.smbtp_location),
fp, " Location: %u", tp.smbtp_location);
desc_printf(smbios_tprobe_status_desc(tp.smbtp_status),
fp, " Status: %u", tp.smbtp_status);

if (tp.smbtp_maxval != SMB_PROBE_UNKNOWN_VALUE) {
oprintf(fp, " Maximum Possible Temperature: %u.%u C\n",
tp.smbtp_maxval / 10, tp.smbtp_maxval % 10);
} else {
oprintf(fp, " Maximum Possible Temperature: unknown\n");
}

if (tp.smbtp_minval != SMB_PROBE_UNKNOWN_VALUE) {
oprintf(fp, " Minimum Possible Temperature: %u.%u C\n",
tp.smbtp_minval / 10, tp.smbtp_minval % 10);
} else {
oprintf(fp, " Minimum Possible Temperature: unknown\n");
}

if (tp.smbtp_resolution != SMB_PROBE_UNKNOWN_VALUE) {
oprintf(fp, " Probe Resolution: %u.%03u C\n",
tp.smbtp_resolution / 1000,
tp.smbtp_resolution % 1000);
} else {
oprintf(fp, " Probe Resolution: unknown\n");
}

if (tp.smbtp_tolerance != SMB_PROBE_UNKNOWN_VALUE) {
oprintf(fp, " Probe Tolerance: +/-%u.%u C\n",
tp.smbtp_tolerance / 10, tp.smbtp_tolerance % 10);
} else {
oprintf(fp, " Probe Tolerance: unknown\n");
}

if (tp.smbtp_accuracy != SMB_PROBE_UNKNOWN_VALUE) {
oprintf(fp, " Probe Accuracy: +/-%u.%02u%%\n",
tp.smbtp_accuracy / 100,
tp.smbtp_accuracy % 100);
} else {
oprintf(fp, " Probe Accuracy: unknown\n");
}

oprintf(fp, " OEM- or BIOS- defined value: 0x%x\n", tp.smbtp_oem);

if (tp.smbtp_nominal != SMB_PROBE_UNKNOWN_VALUE) {
oprintf(fp, " Probe Nominal Value: %u.%u C\n",
tp.smbtp_nominal / 10, tp.smbtp_nominal % 10);
} else {
oprintf(fp, " Probe Nominal Value: unknown\n");
}
}

static void
print_iprobe(smbios_hdl_t *shp, id_t id, FILE *fp)
{
smbios_iprobe_t ip;

if (smbios_info_iprobe(shp, id, &ip) != 0) {
smbios_warn(shp, "failed to read current probe information");
return;
}

oprintf(fp, " Description: %s\n", ip.smbip_description != NULL ?
ip.smbip_description : "unknown");
desc_printf(smbios_iprobe_loc_desc(ip.smbip_location),
fp, " Location: %u", ip.smbip_location);
desc_printf(smbios_iprobe_status_desc(ip.smbip_status),
fp, " Status: %u", ip.smbip_status);

if (ip.smbip_maxval != SMB_PROBE_UNKNOWN_VALUE) {
oprintf(fp, " Maximum Possible Current: %u mA\n",
ip.smbip_maxval);
} else {
oprintf(fp, " Maximum Possible Current: unknown\n");
}

if (ip.smbip_minval != SMB_PROBE_UNKNOWN_VALUE) {
oprintf(fp, " Minimum Possible Current: %u mA\n",
ip.smbip_minval);
} else {
oprintf(fp, " Minimum Possible Current: unknown\n");
}

if (ip.smbip_resolution != SMB_PROBE_UNKNOWN_VALUE) {
oprintf(fp, " Probe Resolution: %u.%u mA\n",
ip.smbip_resolution / 10,
ip.smbip_resolution % 10);
} else {
oprintf(fp, " Probe Resolution: unknown\n");
}

if (ip.smbip_tolerance != SMB_PROBE_UNKNOWN_VALUE) {
oprintf(fp, " Probe Tolerance: +/-%u mA\n",
ip.smbip_tolerance);
} else {
oprintf(fp, " Probe Tolerance: unknown\n");
}

if (ip.smbip_accuracy != SMB_PROBE_UNKNOWN_VALUE) {
oprintf(fp, " Probe Accuracy: +/-%u.%02u%%\n",
ip.smbip_accuracy / 100,
ip.smbip_accuracy % 100);
} else {
oprintf(fp, " Probe Accuracy: unknown\n");
}

oprintf(fp, " OEM- or BIOS- defined value: 0x%x\n", ip.smbip_oem);

if (ip.smbip_nominal != SMB_PROBE_UNKNOWN_VALUE) {
oprintf(fp, " Probe Nominal Value: %u mA\n", ip.smbip_nominal);
} else {
oprintf(fp, " Probe Nominal Value: unknown\n");
}
}


static void
print_boot(smbios_hdl_t *shp, FILE *fp)
{
Expand Down Expand Up @@ -1255,6 +1482,22 @@ print_struct(smbios_hdl_t *shp, const smbios_struct_t *sp, void *fp)
oprintf(fp, "\n");
print_hwsec(shp, fp);
break;
case SMB_TYPE_VPROBE:
oprintf(fp, "\n");
print_vprobe(shp, sp->smbstr_id, fp);
break;
case SMB_TYPE_COOLDEV:
oprintf(fp, "\n");
print_cooldev(shp, sp->smbstr_id, fp);
break;
case SMB_TYPE_TPROBE:
oprintf(fp, "\n");
print_tprobe(shp, sp->smbstr_id, fp);
break;
case SMB_TYPE_IPROBE:
oprintf(fp, "\n");
print_iprobe(shp, sp->smbstr_id, fp);
break;
case SMB_TYPE_BOOT:
oprintf(fp, "\n");
print_boot(shp, fp);
Expand Down
8 changes: 8 additions & 0 deletions usr/src/common/smbios/mktables.sh
Original file line number Diff line number Diff line change
Expand Up @@ -72,12 +72,16 @@ SMB_CAG_ smbios_cache_logical_desc uint_t
SMB_CAM_ smbios_cache_mode_desc uint_t
SMB_CHST_ smbios_chassis_state_desc uint_t
SMB_CHT_ smbios_chassis_type_desc uint_t
SMB_COOLDEV_S_ smbios_cooldev_status_desc uint_t
SMB_COOLDEV_T_ smbios_cooldev_type_desc uint_t
SMB_EVFL_ smbios_evlog_flag_desc uint_t
SMB_EVHF_ smbios_evlog_format_desc uint_t
SMB_EVM_ smbios_evlog_method_desc uint_t
SMB_HWSEC_PS_ smbios_hwsec_desc uint_t
SMB_IPMI_F_ smbios_ipmi_flag_desc uint_t
SMB_IPMI_T_ smbios_ipmi_type_desc uint_t
SMB_IPROBE_L_ smbios_iprobe_loc_desc uint_t
SMB_IPROBE_S_ smbios_iprobe_status_desc uint_t
SMB_POWERSUP_F_ smbios_powersup_flag_desc uint_t
SMB_POWERSUP_I_ smbios_powersup_input_desc uint_t
SMB_POWERSUP_S_ smbios_powersup_status_desc uint_t
Expand All @@ -103,7 +107,11 @@ SMB_SLL_ smbios_slot_length_desc uint_t
SMB_SLT_ smbios_slot_type_desc uint_t
SMB_SLU_ smbios_slot_usage_desc uint_t
SMB_SLW_ smbios_slot_width_desc uint_t
SMB_TPROBE_L_ smbios_tprobe_loc_desc uint_t
SMB_TPROBE_S_ smbios_tprobe_status_desc uint_t
SMB_TYPE_ smbios_type_desc uint_t
SMB_VPROBE_L_ smbios_vprobe_loc_desc uint_t
SMB_VPROBE_S_ smbios_vprobe_status_desc uint_t
SMB_WAKEUP_ smbios_system_wakeup_desc uint_t
'

Expand Down
Loading

0 comments on commit f44a139

Please sign in to comment.