[PATCH 1/7] include: sbi_scratch: Add tmp1 scratch space for RNMI context saving

Anup Patel anup at brainfault.org
Thu Apr 9 00:50:48 PDT 2026


On Wed, Mar 11, 2026 at 12:03 AM Evgeny Voevodin
<evvoevod at tenstorrent.com> wrote:
>
> From: Evgeny Voevodin <evvoevod at tenstorrent.com>
>
> RNMI handlers use MNSCRATCH instead of MSCRATCH and need separate scratch
> space from regular trap handling. Add tmp1 for RNMI context while tmp0
> remains for regular traps.
>
> Signed-off-by: Evgeny Voevodin <evvoevod at tenstorrent.com>

LGTM.

Reviewed-by: Anup Patel <anup at brainfault.org>

Regards,
Anup

> ---
>  firmware/fw_base.S        |  3 ++-
>  include/sbi/sbi_scratch.h | 11 ++++++++---
>  2 files changed, 10 insertions(+), 4 deletions(-)
>
> diff --git a/firmware/fw_base.S b/firmware/fw_base.S
> index 63bb4473..cdb15429 100644
> --- a/firmware/fw_base.S
> +++ b/firmware/fw_base.S
> @@ -258,9 +258,10 @@ _scratch_init:
>         /* Store hartid-to-scratch function address in scratch space */
>         lla     a4, _hartid_to_scratch
>         REG_S   a4, SBI_SCRATCH_HARTID_TO_SCRATCH_OFFSET(tp)
> -       /* Clear trap_context and tmp0 in scratch space */
> +       /* Clear trap_context, tmp0 and tmp1 in scratch space */
>         REG_S   zero, SBI_SCRATCH_TRAP_CONTEXT_OFFSET(tp)
>         REG_S   zero, SBI_SCRATCH_TMP0_OFFSET(tp)
> +       REG_S   zero, SBI_SCRATCH_TMP1_OFFSET(tp)
>         /* Store firmware options in scratch space */
>         MOV_3R  s0, a0, s1, a1, s2, a2
>  #ifdef FW_OPTIONS
> diff --git a/include/sbi/sbi_scratch.h b/include/sbi/sbi_scratch.h
> index 58d54628..a6edeb2d 100644
> --- a/include/sbi/sbi_scratch.h
> +++ b/include/sbi/sbi_scratch.h
> @@ -40,12 +40,14 @@
>  #define SBI_SCRATCH_TRAP_CONTEXT_OFFSET                (11 * __SIZEOF_POINTER__)
>  /** Offset of tmp0 member in sbi_scratch */
>  #define SBI_SCRATCH_TMP0_OFFSET                        (12 * __SIZEOF_POINTER__)
> +/** Offset of tmp1 member in sbi_scratch */
> +#define SBI_SCRATCH_TMP1_OFFSET                        (13 * __SIZEOF_POINTER__)
>  /** Offset of options member in sbi_scratch */
> -#define SBI_SCRATCH_OPTIONS_OFFSET             (13 * __SIZEOF_POINTER__)
> +#define SBI_SCRATCH_OPTIONS_OFFSET             (14 * __SIZEOF_POINTER__)
>  /** Offset of hartindex member in sbi_scratch */
> -#define SBI_SCRATCH_HARTINDEX_OFFSET           (14 * __SIZEOF_POINTER__)
> +#define SBI_SCRATCH_HARTINDEX_OFFSET           (15 * __SIZEOF_POINTER__)
>  /** Offset of extra space in sbi_scratch */
> -#define SBI_SCRATCH_EXTRA_SPACE_OFFSET         (15 * __SIZEOF_POINTER__)
> +#define SBI_SCRATCH_EXTRA_SPACE_OFFSET         (16 * __SIZEOF_POINTER__)
>  /** Maximum size of sbi_scratch (4KB) */
>  #define SBI_SCRATCH_SIZE                       (0x1000)
>
> @@ -83,6 +85,8 @@ struct sbi_scratch {
>         unsigned long trap_context;
>         /** Temporary storage */
>         unsigned long tmp0;
> +       /** Temporary storage */
> +       unsigned long tmp1;
>         /** Options for OpenSBI library */
>         unsigned long options;
>         /** Index of the hart */
> @@ -106,6 +110,7 @@ assert_member_offset(struct sbi_scratch, platform_addr, SBI_SCRATCH_PLATFORM_ADD
>  assert_member_offset(struct sbi_scratch, hartid_to_scratch, SBI_SCRATCH_HARTID_TO_SCRATCH_OFFSET);
>  assert_member_offset(struct sbi_scratch, trap_context, SBI_SCRATCH_TRAP_CONTEXT_OFFSET);
>  assert_member_offset(struct sbi_scratch, tmp0, SBI_SCRATCH_TMP0_OFFSET);
> +assert_member_offset(struct sbi_scratch, tmp1, SBI_SCRATCH_TMP1_OFFSET);
>  assert_member_offset(struct sbi_scratch, options, SBI_SCRATCH_OPTIONS_OFFSET);
>  assert_member_offset(struct sbi_scratch, hartindex, SBI_SCRATCH_HARTINDEX_OFFSET);
>
> --
> 2.43.0
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi



More information about the opensbi mailing list