Skip to content

Commit

Permalink
rasdaemon: Add support to parse microcode field of mce tracepoint
Browse files Browse the repository at this point in the history
Support for exporting the Microcode Revision is being added to the
mce_record tracepoint.

Add the required, corresponding support in the rasdaemon for the field
to be parsed and logged or added to the database and viewed later through
ras-mc-ctl utility.

Signed-off-by: Avadhut Naik <avadhut.naik@amd.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
  • Loading branch information
Avadhut Naik authored and mchehab committed Jun 11, 2024
1 parent 045ab08 commit 7906593
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 13 deletions.
7 changes: 7 additions & 0 deletions ras-mce-handler.c
Original file line number Diff line number Diff line change
Expand Up @@ -375,6 +375,9 @@ static void report_mce_event(struct ras_events *ras,
if (e->ppin)
trace_seq_printf(s, ", ppin= %llx", (long long)e->ppin);

if (e->microcode)
trace_seq_printf(s, ", microcode= %x", e->microcode);

if (!e->vdata_len)
return;

Expand Down Expand Up @@ -573,6 +576,10 @@ int ras_mce_event_handler(struct trace_seq *s,
if (!tep_get_field_val(s, event, "ppin", record, &val, 1))
e.ppin = val;

/* Get Microcode Revision */
if (!tep_get_field_val(s, event, "microcode", record, &val, 1))
e.microcode = val;

/* Get Vendor-specfic Data, if any */
e.vdata = tep_get_field_raw(s, event, "v_data", record, &e.vdata_len, 1);

Expand Down
1 change: 1 addition & 0 deletions ras-mce-handler.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ struct mce_event {
uint64_t synd; /* MCA_SYND MSR: only valid on SMCA systems */
uint64_t ipid; /* MCA_IPID MSR: only valid on SMCA systems */
uint64_t ppin;
uint32_t microcode;
int32_t vdata_len;
const uint64_t *vdata;

Expand Down
22 changes: 12 additions & 10 deletions ras-record.c
Original file line number Diff line number Diff line change
Expand Up @@ -338,11 +338,12 @@ static const struct db_fields mce_record_fields[] = {
{ .name = "cs", .type = "INTEGER" }, // 15
{ .name = "bank", .type = "INTEGER" },
{ .name = "cpuvendor", .type = "INTEGER" },
{ .name = "microcode", .type = "INTEGER" },

/* Parsed data - will likely change */
{ .name = "bank_name", .type = "TEXT" },
{ .name = "error_msg", .type = "TEXT" },
{ .name = "mcgstatus_msg", .type = "TEXT" },// 20
{ .name = "error_msg", .type = "TEXT" }, // 20
{ .name = "mcgstatus_msg", .type = "TEXT" },
{ .name = "mcistatus_msg", .type = "TEXT" },
{ .name = "mcastatus_msg", .type = "TEXT" },
{ .name = "user_action", .type = "TEXT" },
Expand Down Expand Up @@ -381,14 +382,15 @@ int ras_store_mce_record(struct ras_events *ras, struct mce_event *ev)
sqlite3_bind_int (priv->stmt_mce_record, 15, ev->cs);
sqlite3_bind_int (priv->stmt_mce_record, 16, ev->bank);
sqlite3_bind_int (priv->stmt_mce_record, 17, ev->cpuvendor);

sqlite3_bind_text(priv->stmt_mce_record, 18, ev->bank_name, -1, NULL);
sqlite3_bind_text(priv->stmt_mce_record, 19, ev->error_msg, -1, NULL);
sqlite3_bind_text(priv->stmt_mce_record, 20, ev->mcgstatus_msg, -1, NULL);
sqlite3_bind_text(priv->stmt_mce_record, 21, ev->mcistatus_msg, -1, NULL);
sqlite3_bind_text(priv->stmt_mce_record, 22, ev->mcastatus_msg, -1, NULL);
sqlite3_bind_text(priv->stmt_mce_record, 23, ev->user_action, -1, NULL);
sqlite3_bind_text(priv->stmt_mce_record, 24, ev->mc_location, -1, NULL);
sqlite3_bind_int (priv->stmt_mce_record, 18, ev->microcode);

sqlite3_bind_text(priv->stmt_mce_record, 19, ev->bank_name, -1, NULL);
sqlite3_bind_text(priv->stmt_mce_record, 20, ev->error_msg, -1, NULL);
sqlite3_bind_text(priv->stmt_mce_record, 21, ev->mcgstatus_msg, -1, NULL);
sqlite3_bind_text(priv->stmt_mce_record, 22, ev->mcistatus_msg, -1, NULL);
sqlite3_bind_text(priv->stmt_mce_record, 23, ev->mcastatus_msg, -1, NULL);
sqlite3_bind_text(priv->stmt_mce_record, 24, ev->user_action, -1, NULL);
sqlite3_bind_text(priv->stmt_mce_record, 25, ev->mc_location, -1, NULL);

rc = sqlite3_step(priv->stmt_mce_record);
if (rc != SQLITE_OK && rc != SQLITE_DONE)
Expand Down
7 changes: 4 additions & 3 deletions util/ras-mc-ctl.in
Original file line number Diff line number Diff line change
Expand Up @@ -1743,7 +1743,7 @@ sub errors
{
require DBI;
my ($query, $query_handle, $id, $time, $devname, $count, $type, $msg, $label, $mc, $top, $mid, $low, $addr, $grain, $syndrome, $detail, $out);
my ($mcgcap,$mcgstatus, $status, $misc, $ip, $tsc, $walltime, $ppin, $cpu, $cpuid, $apicid, $socketid, $cs, $bank, $cpuvendor, $bank_name, $mcgstatus_msg, $mcistatus_msg, $mcastatus_msg, $user_action, $mc_location);
my ($mcgcap,$mcgstatus, $status, $misc, $ip, $tsc, $walltime, $ppin, $cpu, $cpuid, $apicid, $socketid, $cs, $bank, $cpuvendor, $microcode, $bank_name, $mcgstatus_msg, $mcistatus_msg, $mcastatus_msg, $user_action, $mc_location);
my ($timestamp, $etype, $severity, $etype_string, $severity_string, $fru_id, $fru_text, $cper_data);
my ($bus_name, $dev_name, $driver_name, $reporter_name);
my ($dev, $sector, $nr_sector, $error, $rwbs, $cmd);
Expand Down Expand Up @@ -2192,10 +2192,10 @@ sub errors

# MCE mce_record errors
if ($has_mce == 1) {
$query = "select id, timestamp, mcgcap, mcgstatus, status, addr, misc, ip, tsc, walltime, ppin, cpu, cpuid, apicid, socketid, cs, bank, cpuvendor, bank_name, error_msg, mcgstatus_msg, mcistatus_msg, mcastatus_msg, user_action, mc_location from mce_record$conf{opt}{since} order by id";
$query = "select id, timestamp, mcgcap, mcgstatus, status, addr, misc, ip, tsc, walltime, ppin, cpu, cpuid, apicid, socketid, cs, bank, cpuvendor, microcode, bank_name, error_msg, mcgstatus_msg, mcistatus_msg, mcastatus_msg, user_action, mc_location from mce_record$conf{opt}{since} order by id";
$query_handle = $dbh->prepare($query);
$query_handle->execute();
$query_handle->bind_columns(\($id, $time, $mcgcap,$mcgstatus, $status, $addr, $misc, $ip, $tsc, $walltime, $ppin, $cpu, $cpuid, $apicid, $socketid, $cs, $bank, $cpuvendor, $bank_name, $msg, $mcgstatus_msg, $mcistatus_msg, $mcastatus_msg, $user_action, $mc_location));
$query_handle->bind_columns(\($id, $time, $mcgcap,$mcgstatus, $status, $addr, $misc, $ip, $tsc, $walltime, $ppin, $cpu, $cpuid, $apicid, $socketid, $cs, $bank, $cpuvendor, $microcode, $bank_name, $msg, $mcgstatus_msg, $mcistatus_msg, $mcastatus_msg, $user_action, $mc_location));
$out = "";
while($query_handle->fetch()) {
$out .= "$id $time error: $msg";
Expand All @@ -2221,6 +2221,7 @@ sub errors
$out .= sprintf ", socketid=0x%08x", $socketid if ($socketid);
$out .= sprintf ", cs=0x%08x", $cs if ($cs);
$out .= sprintf ", bank=0x%08x", $bank if ($bank);
$out .= sprintf ", microcode=0x%08x", $microcode if ($microcode);

$out .= "\n";
}
Expand Down

0 comments on commit 7906593

Please sign in to comment.