1 /* 2 * Copyright (c) 2018-2025, Arm Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 #include <inttypes.h> 8 #include <stdint.h> 9 10 #include <lib/extensions/ras.h> 11 #include <services/sdei.h> 12 13 #if PLATFORM_TEST_RAS_FFH 14 static int injected_fault_handler(const struct err_record_info *info, 15 int probe_data, const struct err_handler_data *const data) 16 { 17 uint64_t status; 18 int ret; 19 20 /* 21 * The faulting error record is already selected by the SER probe 22 * function. 23 */ 24 status = read_erxstatus_el1(); 25 26 ERROR("Fault reported by system error record %d on 0x%lx: status=0x%" PRIx64 "\n", 27 probe_data, read_mpidr_el1(), status); 28 ERROR(" exception reason=%u syndrome=0x%" PRIx64 "\n", data->ea_reason, 29 data->flags); 30 31 /* Clear error */ 32 write_erxstatus_el1(status); 33 34 ret = sdei_dispatch_event(5000); 35 if (ret < 0) { 36 ERROR("Can't dispatch event to SDEI\n"); 37 panic(); 38 } else { 39 INFO("SDEI event dispatched\n"); 40 } 41 42 return 0; 43 } 44 45 void plat_handle_uncontainable_ea(void) 46 { 47 /* Do not change the string, CI expects it. Wait forever */ 48 INFO("Injected Uncontainable Error\n"); 49 while (true) { 50 wfe(); 51 } 52 } 53 #endif 54 55 struct ras_interrupt fvp_ras_interrupts[] = { 56 }; 57 58 struct err_record_info fvp_err_records[] = { 59 #if PLATFORM_TEST_RAS_FFH 60 /* Record for injected fault */ 61 ERR_RECORD_SYSREG_V1(0, 2, ras_err_ser_probe_sysreg, 62 injected_fault_handler, NULL), 63 #endif 64 }; 65 66 REGISTER_ERR_RECORD_INFO(fvp_err_records); 67 REGISTER_RAS_INTERRUPTS(fvp_ras_interrupts); 68