]> www.infradead.org Git - users/mchehab/rasdaemon.git/commitdiff
rasdaemon: Add support to parse the PPIN field of mce tracepoint
authorAvadhut Naik <avadhut.naik@amd.com>
Tue, 2 Apr 2024 04:33:07 +0000 (23:33 -0500)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Tue, 11 Jun 2024 09:48:07 +0000 (11:48 +0200)
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>
ras-mce-handler.c
ras-mce-handler.h
ras-record.c
util/ras-mc-ctl.in

index 93568e31a2f23bb33cabc822940e784682f5c38c..c9e8687e4595e6bb44ba9fe2f89bb2966756ec02 100644 (file)
@@ -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;
 
@@ -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);
 
index 4f71dc82bdba6c5de2798c5542066c9f01a83f82..f3003d2e01802d4a73d596adc237c1f4b339f1b3 100644 (file)
@@ -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;
 
index f3ffafbd8ae195d81cd225378623f3c7d9fac444..327d6baa8501bc76c20b2096e36ae1d8299d417e 100644 (file)
@@ -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" },
@@ -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)
index 2eb30d91466b7ee66f2383ecc50535aed04e5f86..fdbcd625c6cd2abe660d06de68b5b037b657eb35 100755 (executable)
@@ -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);
@@ -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";
@@ -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);