forked from Mirrors/opensbi

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>
31 lines
764 B
C
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);
|
|
}
|