From ecab71e19a951a0e42dbbb81b0e4d43840551f7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20L=C3=A9ger?= Date: Fri, 10 Jan 2025 14:15:55 +0100 Subject: [PATCH] lib: sbi: sse: return SBI_ENOTSUPP for unsupported events MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If a standard event was not found in the list of events that are handled by harts but belongs to the standard event list defined by the specification, return SBI_ENOTSUPP. Without that, we can not distinguish a non implemented standard event from a non valid one. Signed-off-by: Clément Léger Reviewed-by: Samuel Holland Reviewed-by: Atish Patra --- lib/sbi/sbi_sse.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/lib/sbi/sbi_sse.c b/lib/sbi/sbi_sse.c index 005eb56e..9f22375f 100644 --- a/lib/sbi/sbi_sse.c +++ b/lib/sbi/sbi_sse.c @@ -190,6 +190,31 @@ struct sse_event_info local_software_event = { static SBI_SLIST_HEAD(supported_events, sse_event_info) = SBI_SLIST_HEAD_INIT(&local_software_event); +/* + * This array is used to distinguish between standard event and platform + * events in order to return SBI_ERR_NOT_SUPPORTED for them. + */ +static const uint32_t standard_events[] = { + SBI_SSE_EVENT_LOCAL_RAS, + SBI_SSE_EVENT_LOCAL_DOUBLE_TRAP, + SBI_SSE_EVENT_GLOBAL_RAS, + SBI_SSE_EVENT_LOCAL_PMU, + SBI_SSE_EVENT_LOCAL_SOFTWARE, + SBI_SSE_EVENT_GLOBAL_SOFTWARE, +}; + +static bool sse_is_standard_event(uint32_t event_id) +{ + int i; + + for (i = 0; i < array_size(standard_events); i++) { + if (event_id == standard_events[i]) + return true; + } + + return false; +} + static struct sse_event_info *sse_event_info_get(uint32_t event_id) { struct sse_event_info *info; @@ -295,6 +320,11 @@ static int sse_event_get(uint32_t event_id, struct sbi_sse_event **eret) } } + /* Check if the event is a standard one but not supported */ + if (sse_is_standard_event(event_id)) + return SBI_ENOTSUPP; + + /* If not supported nor a standard event, it is invalid */ return SBI_EINVAL; }