From efc150d2f727ee29458b4b6d4d033ed284c095b3 Mon Sep 17 00:00:00 2001 From: Mauro Carvalho Chehab Date: Tue, 25 Jun 2024 10:05:45 +0200 Subject: [PATCH] ras-arm-handler: be compatible with upstream Kernel 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 --- ras-arm-handler.c | 78 ++++++++++++++++++++++++----------------------- 1 file changed, 40 insertions(+), 38 deletions(-) diff --git a/ras-arm-handler.c b/ras-arm-handler.c index 51f2f3c..e1355b5 100644 --- a/ras-arm-handler.c +++ b/ras-arm-handler.c @@ -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); -- 2.49.0