]> www.infradead.org Git - users/mchehab/rasdaemon.git/commitdiff
ras-arm-handler: be compatible with upstream Kernel
authorMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Tue, 25 Jun 2024 08:05:45 +0000 (10:05 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Tue, 25 Jun 2024 08:06:40 +0000 (10:06 +0200)
Changeset e37eb2f11a82 ("Add code to decode Ampere specific error")
broke ARM event record with upstream Kernel, as it requires a different
trace event than the one that it is on upstream Kernel, and it is
part of a pending pull request:

https://lore.kernel.org/all/20240321-b4-arm-ras-error-vendor-info-v5-rc3-v5-0-850f9bfb97a8@os.amperecomputing.com/

Restore its behavior by making parsing the UEFI 2.6+ N.17 and N.16
table extra fields to be optional. That should make it compatible
with current upstream Kernels again.

Fixes: e37eb2f11a82 ("Add code to decode Ampere specific error")
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
ras-arm-handler.c

index 51f2f3cef6ccd2c6b81369bf60881ac92a6dfc76..e1355b5ac99f1dc066208159f2eb4b829ac1ea51 100644 (file)
@@ -207,51 +207,53 @@ int ras_arm_event_handler(struct trace_seq *s,
        ev.psci_state = val;
        trace_seq_printf(s, " psci_state: %d", ev.psci_state);
 
-       if (tep_get_field_val(s, event, "pei_len", record, &val, 1) < 0)
-               return -1;
-       ev.pei_len = val;
-       trace_seq_printf(s, " ARM Processor Err Info data len: %d\n",
-                        ev.pei_len);
-
-       ev.pei_error = tep_get_field_raw(s, event, "buf", record, &len, 1);
-       if (!ev.pei_error)
-               return -1;
-       display_raw_data(s, ev.pei_error, ev.pei_len);
-
-       if (tep_get_field_val(s, event, "ctx_len", record, &val, 1) < 0)
-               return -1;
-       ev.ctx_len = val;
-       trace_seq_printf(s, " ARM Processor Err Context Info data len: %d\n",
-                        ev.ctx_len);
-
-       ev.ctx_error = tep_get_field_raw(s, event, "buf1", record, &len, 1);
-       if (!ev.ctx_error)
-               return -1;
-       display_raw_data(s, ev.ctx_error, ev.ctx_len);
-
-       if (tep_get_field_val(s, event, "oem_len", record, &val, 1) < 0)
-               return -1;
-       ev.oem_len = val;
-       trace_seq_printf(s, " Vendor Specific Err Info data len: %d\n",
-                        ev.oem_len);
-
-       ev.vsei_error = tep_get_field_raw(s, event, "buf2", record, &len, 1);
-       if (!ev.vsei_error)
-               return -1;
+       // Upstream kKernels up to version 6.10 don't decode UEFI 2.6+ N.17 table
+       if (tep_get_field_val(s, event, "pei_len", record, &val, 1) >= 0) {
+
+               ev.pei_len = val;
+               trace_seq_printf(s, " ARM Processor Err Info data len: %d\n",
+                                ev.pei_len);
+
+               ev.pei_error = tep_get_field_raw(s, event, "buf", record, &len, 1);
+               if (!ev.pei_error)
+                       return -1;
+               display_raw_data(s, ev.pei_error, ev.pei_len);
+
+               if (tep_get_field_val(s, event, "ctx_len", record, &val, 1) < 0)
+                       return -1;
+               ev.ctx_len = val;
+               trace_seq_printf(s, " ARM Processor Err Context Info data len: %d\n",
+                                ev.ctx_len);
+
+               ev.ctx_error = tep_get_field_raw(s, event, "buf1", record, &len, 1);
+               if (!ev.ctx_error)
+                       return -1;
+               display_raw_data(s, ev.ctx_error, ev.ctx_len);
+
+               if (tep_get_field_val(s, event, "oem_len", record, &val, 1) < 0)
+                       return -1;
+               ev.oem_len = val;
+               trace_seq_printf(s, " Vendor Specific Err Info data len: %d\n",
+                                ev.oem_len);
+
+               ev.vsei_error = tep_get_field_raw(s, event, "buf2", record, &len, 1);
+               if (!ev.vsei_error)
+                       return -1;
 
 #ifdef HAVE_AMP_NS_DECODE
-       //decode ampere specific error
-       decode_amp_payload0_err_regs(NULL, s,
-                                    (struct amp_payload0_type_sec *)ev.vsei_error);
+               //decode ampere specific error
+               decode_amp_payload0_err_regs(NULL, s,
+                                            (struct amp_payload0_type_sec *)ev.vsei_error);
 #else
-       display_raw_data(s, ev.vsei_error, ev.oem_len);
+               display_raw_data(s, ev.vsei_error, ev.oem_len);
 #endif
-
 #ifdef HAVE_CPU_FAULT_ISOLATION
-       if (ras_handle_cpu_error(s, record, event, &ev, now) < 0)
-               return -1;
+               if (ras_handle_cpu_error(s, record, event, &ev, now) < 0)
+                       printf("Can't do CPU fault isolation!\n");
 #endif
 
+       }
+
        /* Insert data into the SGBD */
 #ifdef HAVE_SQLITE3
        ras_store_arm_record(ras, &ev);