Skip to content

Commit

Permalink
trace, ras: add ARM processor error trace event
Browse files Browse the repository at this point in the history
Currently there are trace events for the various RAS
errors with the exception of ARM processor type errors.
Add a new trace event for such errors so that the user
will know when they occur. These trace events are
consistent with the ARM processor error section type
defined in UEFI 2.6 spec section N.2.4.4.

Signed-off-by: Tyler Baicar <[email protected]>
Acked-by: Steven Rostedt <[email protected]>
Reviewed-by: Xie XiuQi <[email protected]>
Signed-off-by: Will Deacon <[email protected]>
  • Loading branch information
Tyler Baicar authored and wildea01 committed Jun 22, 2017
1 parent 297b64c commit e9279e8
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 1 deletion.
6 changes: 5 additions & 1 deletion drivers/acpi/apei/ghes.c
Original file line number Diff line number Diff line change
Expand Up @@ -517,7 +517,11 @@ static void ghes_do_proc(struct ghes *ghes,

}
#endif
else {
else if (guid_equal(sec_type, &CPER_SEC_PROC_ARM)) {
struct cper_sec_proc_arm *err = acpi_hest_get_payload(gdata);

log_arm_hw_error(err);
} else {
void *err = acpi_hest_get_payload(gdata);

log_non_standard_event(sec_type, fru_id, fru_text,
Expand Down
1 change: 1 addition & 0 deletions drivers/firmware/efi/cper.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
#include <linux/printk.h>
#include <linux/bcd.h>
#include <acpi/ghes.h>
#include <ras/ras_event.h>

#define INDENT_SP " "

Expand Down
6 changes: 6 additions & 0 deletions drivers/ras/ras.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ void log_non_standard_event(const uuid_le *sec_type, const uuid_le *fru_id,
trace_non_standard_event(sec_type, fru_id, fru_text, sev, err, len);
}

void log_arm_hw_error(struct cper_sec_proc_arm *err)
{
trace_arm_event(err);
}

static int __init ras_init(void)
{
int rc = 0;
Expand All @@ -36,6 +41,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(extlog_mem_event);
#endif
EXPORT_TRACEPOINT_SYMBOL_GPL(mc_event);
EXPORT_TRACEPOINT_SYMBOL_GPL(non_standard_event);
EXPORT_TRACEPOINT_SYMBOL_GPL(arm_event);

int __init parse_ras_param(char *str)
{
Expand Down
3 changes: 3 additions & 0 deletions include/linux/ras.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

#include <asm/errno.h>
#include <linux/uuid.h>
#include <linux/cper.h>

#ifdef CONFIG_DEBUG_FS
int ras_userspace_consumers(void);
Expand All @@ -27,11 +28,13 @@ static inline int cec_add_elem(u64 pfn) { return -ENODEV; }
void log_non_standard_event(const guid_t *sec_type,
const guid_t *fru_id, const char *fru_text,
const u8 sev, const u8 *err, const u32 len);
void log_arm_hw_error(struct cper_sec_proc_arm *err);
#else
static void log_non_standard_event(const guid_t *sec_type,
const guid_t *fru_id, const char *fru_text,
const u8 sev, const u8 *err,
const u32 len) { return; }
static void log_arm_hw_error(struct cper_sec_proc_arm *err) { return; }
#endif

#endif /* __RAS_H__ */
45 changes: 45 additions & 0 deletions include/ras/ras_event.h
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,51 @@ TRACE_EVENT(mc_event,
__get_str(driver_detail))
);

/*
* ARM Processor Events Report
*
* This event is generated when hardware detects an ARM processor error
* has occurred. UEFI 2.6 spec section N.2.4.4.
*/
TRACE_EVENT(arm_event,

TP_PROTO(const struct cper_sec_proc_arm *proc),

TP_ARGS(proc),

TP_STRUCT__entry(
__field(u64, mpidr)
__field(u64, midr)
__field(u32, running_state)
__field(u32, psci_state)
__field(u8, affinity)
),

TP_fast_assign(
if (proc->validation_bits & CPER_ARM_VALID_AFFINITY_LEVEL)
__entry->affinity = proc->affinity_level;
else
__entry->affinity = ~0;
if (proc->validation_bits & CPER_ARM_VALID_MPIDR)
__entry->mpidr = proc->mpidr;
else
__entry->mpidr = 0ULL;
__entry->midr = proc->midr;
if (proc->validation_bits & CPER_ARM_VALID_RUNNING_STATE) {
__entry->running_state = proc->running_state;
__entry->psci_state = proc->psci_state;
} else {
__entry->running_state = ~0;
__entry->psci_state = ~0;
}
),

TP_printk("affinity level: %d; MPIDR: %016llx; MIDR: %016llx; "
"running state: %d; PSCI state: %d",
__entry->affinity, __entry->mpidr, __entry->midr,
__entry->running_state, __entry->psci_state)
);

/*
* Non-Standard Section Report
*
Expand Down

0 comments on commit e9279e8

Please sign in to comment.