[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