include: sbi: Add trap_context pointer in struct sbi_scratch
authorAnup Patel <apatel@ventanamicro.com>
Mon, 11 Mar 2024 07:09:00 +0000 (12:39 +0530)
committerAnup Patel <anup@brainfault.org>
Tue, 19 Mar 2024 06:01:20 +0000 (11:31 +0530)
To track nested traps, the struct sbi_scratch needs a pointer the
current trap context so add trap_context pointer in struct sbi_context.

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Reviewed-by: Samuel Holland <samuel.holland@sifive.com>
Tested-by: Samuel Holland <samuel.holland@sifive.com>
firmware/fw_base.S
include/sbi/sbi_scratch.h

index c404d8bd1450a9a31338dd7044e2802961cce9de..539fd1dcfb343a4488056a6ec3a697421d437dd3 100644 (file)
@@ -298,7 +298,8 @@ _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 tmp0 in scratch space */
+       /* Clear trap_context and tmp0 in scratch space */
+       REG_S   zero, SBI_SCRATCH_TRAP_CONTEXT_OFFSET(tp)
        REG_S   zero, SBI_SCRATCH_TMP0_OFFSET(tp)
        /* Store firmware options in scratch space */
        MOV_3R  s0, a0, s1, a1, s2, a2
index 55b937f088ba99fd329a7052bfb6e47679c042b5..12e6a983889a4107ab677bbe08145abb69db6297 100644 (file)
 #define SBI_SCRATCH_PLATFORM_ADDR_OFFSET       (9 * __SIZEOF_POINTER__)
 /** Offset of hartid_to_scratch member in sbi_scratch */
 #define SBI_SCRATCH_HARTID_TO_SCRATCH_OFFSET   (10 * __SIZEOF_POINTER__)
+/** Offset of trap_context member in sbi_scratch */
+#define SBI_SCRATCH_TRAP_CONTEXT_OFFSET                (11 * __SIZEOF_POINTER__)
 /** Offset of tmp0 member in sbi_scratch */
-#define SBI_SCRATCH_TMP0_OFFSET                        (11 * __SIZEOF_POINTER__)
+#define SBI_SCRATCH_TMP0_OFFSET                        (12 * __SIZEOF_POINTER__)
 /** Offset of options member in sbi_scratch */
-#define SBI_SCRATCH_OPTIONS_OFFSET             (12 * __SIZEOF_POINTER__)
+#define SBI_SCRATCH_OPTIONS_OFFSET             (13 * __SIZEOF_POINTER__)
 /** Offset of extra space in sbi_scratch */
-#define SBI_SCRATCH_EXTRA_SPACE_OFFSET         (13 * __SIZEOF_POINTER__)
+#define SBI_SCRATCH_EXTRA_SPACE_OFFSET         (14 * __SIZEOF_POINTER__)
 /** Maximum size of sbi_scratch (4KB) */
 #define SBI_SCRATCH_SIZE                       (0x1000)
 
@@ -75,6 +77,8 @@ struct sbi_scratch {
        unsigned long platform_addr;
        /** Address of HART ID to sbi_scratch conversion function */
        unsigned long hartid_to_scratch;
+       /** Address of current trap context */
+       unsigned long trap_context;
        /** Temporary storage */
        unsigned long tmp0;
        /** Options for OpenSBI library */
@@ -125,6 +129,11 @@ _Static_assert(
                == SBI_SCRATCH_HARTID_TO_SCRATCH_OFFSET,
        "struct sbi_scratch definition has changed, please redefine "
        "SBI_SCRATCH_HARTID_TO_SCRATCH_OFFSET");
+_Static_assert(
+       offsetof(struct sbi_scratch, trap_context)
+               == SBI_SCRATCH_TRAP_CONTEXT_OFFSET,
+       "struct sbi_scratch definition has changed, please redefine "
+       "SBI_SCRATCH_TRAP_CONTEXT_OFFSET");
 _Static_assert(
        offsetof(struct sbi_scratch, tmp0)
                == SBI_SCRATCH_TMP0_OFFSET,