| --- a/plat/arm/board/fvp/aarch64/fvp_ras.c |
| +++ b/plat/arm/board/fvp/aarch64/fvp_ras.c |
| @@ -5,11 +5,46 @@ |
| */ |
| |
| #include <lib/extensions/ras.h> |
| +#include <services/sdei.h> |
| + |
| +static int injected_fault_handler(const struct err_record_info *info, |
| + int probe_data, const struct err_handler_data *const data) |
| +{ |
| + uint64_t status; |
| + int ret __unused; |
| + |
| + /* |
| + * The faulting error record is already selected by the SER probe |
| + * function. |
| + */ |
| + status = read_erxstatus_el1(); |
| + |
| + ERROR("Fault reported by system error record %d on 0x%lx: status=0x%llx\n", |
| + probe_data, read_mpidr_el1(), status); |
| + ERROR(" exception reason=%u syndrome=0x%llx\n", data->ea_reason, |
| + data->flags); |
| + |
| + /* Clear error */ |
| + write_erxstatus_el1(status); |
| + |
| + ret = sdei_dispatch_event(5000); |
| + if (ret < 0) { |
| + ERROR("Can't dispatch event to SDEI\n"); |
| + panic(); |
| + } else { |
| + INFO("SDEI event dispatched\n"); |
| + } |
| + |
| + return 0; |
| +} |
| |
| struct ras_interrupt fvp_ras_interrupts[] = { |
| }; |
| |
| struct err_record_info fvp_err_records[] = { |
| + /* Record for injected fault */ |
| + ERR_RECORD_SYSREG_V1(0, 2, ras_err_ser_probe_sysreg, |
| + injected_fault_handler, NULL), |
| }; |
| |
| REGISTER_ERR_RECORD_INFO(fvp_err_records); |