Skip to content

Commit

Permalink
rasdaemon: Add support to parse the PPIN field of mce tracepoint
Browse files Browse the repository at this point in the history
Support for exporting the PPIN (Protected Processor Inventory Number)
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 b1ace39 commit 045ab08
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 23 deletions.
7 changes: 7 additions & 0 deletions ras-mce-handler.c
Original file line number Diff line number Diff line change
Expand Up @@ -372,6 +372,9 @@ static void report_mce_event(struct ras_events *ras,

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

if (e->ppin)
trace_seq_printf(s, ", ppin= %llx", (long long)e->ppin);

if (!e->vdata_len)
return;

Expand Down Expand Up @@ -566,6 +569,10 @@ int ras_mce_event_handler(struct trace_seq *s,
return -1;
e.ipid = val;

/* Get PPIN */
if (!tep_get_field_val(s, event, "ppin", record, &val, 1))
e.ppin = 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 @@ -75,6 +75,7 @@ struct mce_event {
uint8_t cpuvendor;
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;
int32_t vdata_len;
const uint64_t *vdata;

Expand Down
42 changes: 22 additions & 20 deletions ras-record.c
Original file line number Diff line number Diff line change
Expand Up @@ -330,19 +330,20 @@ static const struct db_fields mce_record_fields[] = {
{ .name = "ip", .type = "INTEGER" },
{ .name = "tsc", .type = "INTEGER" },
{ .name = "walltime", .type = "INTEGER" },
{ .name = "cpu", .type = "INTEGER" }, // 10
{ .name = "ppin", .type = "INTEGER" }, // 10
{ .name = "cpu", .type = "INTEGER" },
{ .name = "cpuid", .type = "INTEGER" },
{ .name = "apicid", .type = "INTEGER" },
{ .name = "socketid", .type = "INTEGER" },
{ .name = "cs", .type = "INTEGER" },
{ .name = "bank", .type = "INTEGER" }, //15
{ .name = "cs", .type = "INTEGER" }, // 15
{ .name = "bank", .type = "INTEGER" },
{ .name = "cpuvendor", .type = "INTEGER" },

/* Parsed data - will likely change */
{ .name = "bank_name", .type = "TEXT" },
{ .name = "error_msg", .type = "TEXT" },
{ .name = "mcgstatus_msg", .type = "TEXT" },
{ .name = "mcistatus_msg", .type = "TEXT" }, // 20
{ .name = "mcgstatus_msg", .type = "TEXT" },// 20
{ .name = "mcistatus_msg", .type = "TEXT" },
{ .name = "mcastatus_msg", .type = "TEXT" },
{ .name = "user_action", .type = "TEXT" },
{ .name = "mc_location", .type = "TEXT" },
Expand Down Expand Up @@ -372,21 +373,22 @@ int ras_store_mce_record(struct ras_events *ras, struct mce_event *ev)
sqlite3_bind_int64(priv->stmt_mce_record, 7, ev->ip);
sqlite3_bind_int64(priv->stmt_mce_record, 8, ev->tsc);
sqlite3_bind_int64(priv->stmt_mce_record, 9, ev->walltime);
sqlite3_bind_int (priv->stmt_mce_record, 10, ev->cpu);
sqlite3_bind_int (priv->stmt_mce_record, 11, ev->cpuid);
sqlite3_bind_int (priv->stmt_mce_record, 12, ev->apicid);
sqlite3_bind_int (priv->stmt_mce_record, 13, ev->socketid);
sqlite3_bind_int (priv->stmt_mce_record, 14, ev->cs);
sqlite3_bind_int (priv->stmt_mce_record, 15, ev->bank);
sqlite3_bind_int (priv->stmt_mce_record, 16, ev->cpuvendor);

sqlite3_bind_text(priv->stmt_mce_record, 17, ev->bank_name, -1, NULL);
sqlite3_bind_text(priv->stmt_mce_record, 18, ev->error_msg, -1, NULL);
sqlite3_bind_text(priv->stmt_mce_record, 19, ev->mcgstatus_msg, -1, NULL);
sqlite3_bind_text(priv->stmt_mce_record, 20, ev->mcistatus_msg, -1, NULL);
sqlite3_bind_text(priv->stmt_mce_record, 21, ev->mcastatus_msg, -1, NULL);
sqlite3_bind_text(priv->stmt_mce_record, 22, ev->user_action, -1, NULL);
sqlite3_bind_text(priv->stmt_mce_record, 23, ev->mc_location, -1, NULL);
sqlite3_bind_int64(priv->stmt_mce_record, 10, ev->ppin);
sqlite3_bind_int (priv->stmt_mce_record, 11, ev->cpu);
sqlite3_bind_int (priv->stmt_mce_record, 12, ev->cpuid);
sqlite3_bind_int (priv->stmt_mce_record, 13, ev->apicid);
sqlite3_bind_int (priv->stmt_mce_record, 14, ev->socketid);
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);

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, $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, $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, 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, 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, $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, $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 @@ -2214,6 +2214,7 @@ sub errors
$out .= sprintf ", ip=0x%08x", $ip if ($ip);
$out .= sprintf ", tsc=0x%08x", $tsc if ($tsc);
$out .= sprintf ", walltime=0x%08x", $walltime if ($walltime);
$out .= sprintf ", ppin=0x%08x", $ppin if ($ppin);
$out .= sprintf ", cpu=0x%08x", $cpu if ($cpu);
$out .= sprintf ", cpuid=0x%08x", $cpuid if ($cpuid);
$out .= sprintf ", apicid=0x%08x", $apicid if ($apicid);
Expand Down

0 comments on commit 045ab08

Please sign in to comment.