/* * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include #include #include #include #ifdef PLATFORM_TEST_RAS_FFH 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; /* * 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%" PRIx64 "\n", probe_data, read_mpidr_el1(), status); ERROR(" exception reason=%u syndrome=0x%" PRIx64 "\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; } void plat_handle_uncontainable_ea(void) { /* Do not change the string, CI expects it. Wait forever */ INFO("Injected Uncontainable Error\n"); while (true) { wfe(); } } #endif struct ras_interrupt fvp_ras_interrupts[] = { }; struct err_record_info fvp_err_records[] = { #ifdef PLATFORM_TEST_RAS_FFH /* Record for injected fault */ ERR_RECORD_SYSREG_V1(0, 2, ras_err_ser_probe_sysreg, injected_fault_handler, NULL), #endif }; REGISTER_ERR_RECORD_INFO(fvp_err_records); REGISTER_RAS_INTERRUPTS(fvp_ras_interrupts);