trace, RAS: Add eMCA trace event interface
Add trace interface to elaborate all H/W error related information. Signed-off-by: Chen, Gong <gong.chen@linux.intel.com> Acked-by: Borislav Petkov <bp@suse.de> Signed-off-by: Tony Luck <tony.luck@intel.com>
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
#include <asm/mce.h>
|
||||
|
||||
#include "apei/apei-internal.h"
|
||||
#include <ras/ras_event.h>
|
||||
|
||||
#define EXT_ELOG_ENTRY_MASK GENMASK_ULL(51, 0) /* elog entry address mask */
|
||||
|
||||
@@ -137,8 +138,12 @@ static int extlog_print(struct notifier_block *nb, unsigned long val,
|
||||
struct mce *mce = (struct mce *)data;
|
||||
int bank = mce->bank;
|
||||
int cpu = mce->extcpu;
|
||||
struct acpi_generic_status *estatus;
|
||||
int rc;
|
||||
struct acpi_generic_status *estatus, *tmp;
|
||||
struct acpi_generic_data *gdata;
|
||||
const uuid_le *fru_id = &NULL_UUID_LE;
|
||||
char *fru_text = "";
|
||||
uuid_le *sec_type;
|
||||
static u32 err_seq;
|
||||
|
||||
estatus = extlog_elog_entry_check(cpu, bank);
|
||||
if (estatus == NULL)
|
||||
@@ -148,7 +153,23 @@ static int extlog_print(struct notifier_block *nb, unsigned long val,
|
||||
/* clear record status to enable BIOS to update it again */
|
||||
estatus->block_status = 0;
|
||||
|
||||
rc = print_extlog_rcd(NULL, (struct acpi_generic_status *)elog_buf, cpu);
|
||||
tmp = (struct acpi_generic_status *)elog_buf;
|
||||
print_extlog_rcd(NULL, tmp, cpu);
|
||||
|
||||
/* log event via trace */
|
||||
err_seq++;
|
||||
gdata = (struct acpi_generic_data *)(tmp + 1);
|
||||
if (gdata->validation_bits & CPER_SEC_VALID_FRU_ID)
|
||||
fru_id = (uuid_le *)gdata->fru_id;
|
||||
if (gdata->validation_bits & CPER_SEC_VALID_FRU_TEXT)
|
||||
fru_text = gdata->fru_text;
|
||||
sec_type = (uuid_le *)gdata->section_type;
|
||||
if (!uuid_le_cmp(*sec_type, CPER_SEC_PLATFORM_MEM)) {
|
||||
struct cper_sec_mem_err *mem = (void *)(gdata + 1);
|
||||
if (gdata->error_data_length >= sizeof(*mem))
|
||||
trace_extlog_mem_event(mem, err_seq, fru_id, fru_text,
|
||||
(u8)gdata->error_severity);
|
||||
}
|
||||
|
||||
return NOTIFY_STOP;
|
||||
}
|
||||
|
Reference in New Issue
Block a user