[PATCH] Trap and Emulate changes

Anup Patel apatel at ventanamicro.com
Thu Feb 12 06:58:41 PST 2026


On Wed, Feb 11, 2026 at 3:30 PM <dave.patel at riscstar.com> wrote:
>
> From: Dave Patel <dave.patel at riscstar.com>
>
> Signed-off-by: Dave Patel <dave.patel at riscstar.com>
> ---
>  lib/sbi/sbi_illegal_insn.c | 25 ++++++++++++++++++++++++-
>  1 file changed, 24 insertions(+), 1 deletion(-)
>
> diff --git a/lib/sbi/sbi_illegal_insn.c b/lib/sbi/sbi_illegal_insn.c
> index fa82264a..88079e39 100644
> --- a/lib/sbi/sbi_illegal_insn.c
> +++ b/lib/sbi/sbi_illegal_insn.c
> @@ -110,10 +110,33 @@ static int system_opcode_insn(ulong insn, struct sbi_trap_regs *regs)
>         return 0;
>  }
>
> +static int sbi_get_emulated_irq_insn(ulong insn, struct sbi_trap_regs *regs)
> +{
> +       ulong rs1_val   = GET_RS1(insn, regs);
> +       ulong rs2_val   = GET_RS2(insn, regs);
> +       //ulong prev_mode = sbi_mstatus_prev_mode(regs->mstatus);
> +       ulong irq_val;
> +
> +       /*
> +       // This is were the emualted irq vlaue is fetched
> +       if (prev_mode == PRV_S && sbi_emulate_irq_read(&irq_val))
> +               return truly_illegal_insn(insn, regs);
> +       */
> +
> +       // For testing
> +       irq_val = rs1_val + rs2_val;
> +
> +       SET_RD(insn, regs, irq_val);
> +
> +       regs->mepc += 4;
> +
> +       return 0;
> +}
> +
>  static const illegal_insn_func illegal_insn_table[32] = {
>         truly_illegal_insn, /* 0 */
>         truly_illegal_insn, /* 1 */
> -       truly_illegal_insn, /* 2 */
> +       sbi_get_emulated_irq_insn,   /* 2 */

We can't pick arbitrary instruction encoding for
trap-n-emulation of an interrupt controller.

If the goal is to trap-n-emulate an MMIO device
then use PMP based access faults.

Regards
Anup



More information about the opensbi mailing list