/* * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include #include #include #include #include #include #include /* Handler that receives External Aborts on RAS-capable systems */ int ras_ea_handler(unsigned int ea_reason, uint64_t syndrome, void *cookie, void *handle, uint64_t flags) { unsigned int i, n_handled = 0, ret; int probe_data; struct err_record_info *info; const struct err_handler_data err_data = { .version = ERR_HANDLER_VERSION, .ea_reason = ea_reason, .syndrome = syndrome, .flags = flags, .cookie = cookie, .handle = handle }; for_each_err_record_info(i, info) { assert(info->probe != NULL); assert(info->handler != NULL); /* Continue probing until the record group signals no error */ while (1) { if (info->probe(info, &probe_data) == 0) break; /* Handle error */ ret = info->handler(info, probe_data, &err_data); if (ret != 0) return ret; n_handled++; } } return (n_handled != 0); }