Files
opensbi/lib/sbi/sbi_double_trap.c
Clément Léger b0a7e4b853 lib: sbi: send a double trap SSE event to supervisor
In case the double trap handler is called and the double trap happened
in supervisor mode, send a double trap SSE event.

NOTE: this commit depends on the ratification of the new SSE event
id for double trap [1].

Link: https://lists.riscv.org/g/tech-prs/message/985 [1]
Signed-off-by: Clément Léger <cleger@rivosinc.com>
Reviewed-by: Samuel Holland <samuel.holland@sifive.com>
2024-10-25 23:58:39 +05:30

31 lines
764 B
C

/*
* SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2024 Rivos Inc.
*
* Authors:
* Clément Léger <clement.leger@rivosinc.com>
*/
#include <sbi/sbi_console.h>
#include <sbi/sbi_ecall_interface.h>
#include <sbi/sbi_error.h>
#include <sbi/sbi_sse.h>
#include <sbi/sbi_trap.h>
int sbi_double_trap_handler(struct sbi_trap_context *tcntx)
{
struct sbi_trap_regs *regs = &tcntx->regs;
const struct sbi_trap_info *trap = &tcntx->trap;
bool prev_virt = sbi_regs_from_virt(regs);
if (sbi_mstatus_prev_mode(regs->mstatus) != PRV_S)
return SBI_ERR_INVALID_PARAM;
/* Exception was taken in VS-mode, redirect it to S-mode */
if (prev_virt)
return sbi_trap_redirect(regs, trap);
return sbi_sse_inject_event(SBI_SSE_EVENT_LOCAL_DOUBLE_TRAP);
}