sbi: sbi_domain_context: Fix trap context for domain context switching
authorYu Chien Peter Lin <peterlin@andestech.com>
Fri, 7 Jun 2024 11:39:28 +0000 (19:39 +0800)
committerAnup Patel <anup@brainfault.org>
Thu, 13 Jun 2024 13:51:27 +0000 (19:21 +0530)
Save/restore sbi_trap_context during domain context switching to
ensure proper trap handling and isolation. This maintains correct
domain-specific state, avoiding context corruption.

Fixes: abea949721bc ("lib: sbi: Introduce trap context")
Signed-off-by: Yu Chien Peter Lin <peterlin@andestech.com>
Reviewed-by: Alvin Chang <alvinga@andestech.com>
Tested-by: Alvin Chang <alvinga@andestech.com>
Reviewed-by: Yong Li <yong.li@intel.com>
Tested-by: Yong Li <yong.li@intel.com>
include/sbi/sbi_domain_context.h
lib/sbi/sbi_domain_context.c

index edba764fa21d1c1a812e7e05272cce0c7ab6631c..0d25884acfef91ae92f579e07da7cdda949e98e9 100755 (executable)
@@ -14,7 +14,7 @@
 /** Context representation for a hart within a domain */
 struct sbi_context {
        /** Trap-related states such as GPRs, mepc, and mstatus */
-       struct sbi_trap_regs regs;
+       struct sbi_trap_context trap_ctx;
 
        /** Supervisor status register */
        unsigned long sstatus;
index 7528591805dc381086d09c0e7835842bfad26608..49a2f769737891d0b2835e0aa5c26db988abedd0 100755 (executable)
@@ -27,7 +27,7 @@ static void switch_to_next_domain_context(struct sbi_context *ctx,
                                          struct sbi_context *dom_ctx)
 {
        u32 hartindex = sbi_hartid_to_hartindex(current_hartid());
-       struct sbi_trap_regs *trap_regs;
+       struct sbi_trap_context *trap_ctx;
        struct sbi_domain *current_dom = ctx->dom;
        struct sbi_domain *target_dom = dom_ctx->dom;
        struct sbi_scratch *scratch = sbi_scratch_thishart_ptr();
@@ -66,10 +66,9 @@ static void switch_to_next_domain_context(struct sbi_context *ctx,
                ctx->senvcfg    = csr_swap(CSR_SENVCFG, dom_ctx->senvcfg);
 
        /* Save current trap state and restore target domain's trap state */
-       trap_regs = (struct sbi_trap_regs *)(csr_read(CSR_MSCRATCH) -
-                                            SBI_TRAP_REGS_SIZE);
-       sbi_memcpy(&ctx->regs, trap_regs, sizeof(*trap_regs));
-       sbi_memcpy(trap_regs, &dom_ctx->regs, sizeof(*trap_regs));
+       trap_ctx = sbi_trap_get_context(scratch);
+       sbi_memcpy(&ctx->trap_ctx, trap_ctx, sizeof(*trap_ctx));
+       sbi_memcpy(trap_ctx, &dom_ctx->trap_ctx, sizeof(*trap_ctx));
 
        /* Mark current context structure initialized because context saved */
        ctx->initialized = true;