Manish Pandey | d648077 | 2023-02-27 13:23:06 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (c) 2023, Arm Limited. All rights reserved. |
| 3 | * |
| 4 | * SPDX-License-Identifier: BSD-3-Clause |
| 5 | */ |
| 6 | #include <stdbool.h> |
| 7 | |
| 8 | #include <arch_helpers.h> |
| 9 | #include <debug.h> |
| 10 | #include <serror.h> |
| 11 | |
Manish V Badarkhe | 46d0228 | 2024-11-18 16:58:37 +0000 | [diff] [blame^] | 12 | static serr_exception_handler_t custom_serror_handler; |
Manish Pandey | d648077 | 2023-02-27 13:23:06 +0000 | [diff] [blame] | 13 | |
Manish V Badarkhe | 46d0228 | 2024-11-18 16:58:37 +0000 | [diff] [blame^] | 14 | void register_custom_serror_handler(serr_exception_handler_t handler) |
Manish Pandey | d648077 | 2023-02-27 13:23:06 +0000 | [diff] [blame] | 15 | { |
| 16 | custom_serror_handler = handler; |
| 17 | } |
| 18 | |
| 19 | void unregister_custom_serror_handler(void) |
| 20 | { |
| 21 | custom_serror_handler = NULL; |
| 22 | } |
| 23 | |
| 24 | bool tftf_serror_handler(void) |
| 25 | { |
Javier Almansa Sobrino | 7c78f7b | 2024-10-25 11:44:32 +0100 | [diff] [blame] | 26 | uint64_t elr_elx = IS_IN_EL2() ? read_elr_el2() : read_elr_el1(); |
| 27 | bool resume = false; |
Manish V Badarkhe | 46d0228 | 2024-11-18 16:58:37 +0000 | [diff] [blame^] | 28 | bool incr_elr_elx = false; |
Javier Almansa Sobrino | 7c78f7b | 2024-10-25 11:44:32 +0100 | [diff] [blame] | 29 | |
Manish Pandey | d648077 | 2023-02-27 13:23:06 +0000 | [diff] [blame] | 30 | if (custom_serror_handler == NULL) { |
| 31 | return false; |
| 32 | } |
| 33 | |
Manish V Badarkhe | 46d0228 | 2024-11-18 16:58:37 +0000 | [diff] [blame^] | 34 | resume = custom_serror_handler(&incr_elr_elx); |
Javier Almansa Sobrino | 7c78f7b | 2024-10-25 11:44:32 +0100 | [diff] [blame] | 35 | |
Manish V Badarkhe | 46d0228 | 2024-11-18 16:58:37 +0000 | [diff] [blame^] | 36 | if (resume && incr_elr_elx) { |
Javier Almansa Sobrino | 7c78f7b | 2024-10-25 11:44:32 +0100 | [diff] [blame] | 37 | /* Move ELR to next instruction to allow tftf to continue */ |
| 38 | if (IS_IN_EL2()) { |
| 39 | write_elr_el2(elr_elx + 4U); |
| 40 | } else { |
| 41 | write_elr_el1(elr_elx + 4U); |
| 42 | } |
| 43 | } |
| 44 | |
| 45 | return resume; |
Manish Pandey | d648077 | 2023-02-27 13:23:06 +0000 | [diff] [blame] | 46 | } |