summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZishun Yi <[email protected]>2026-04-30 02:17:47 +0800
committerAnup Patel <[email protected]>2026-06-09 22:12:48 +0530
commit73bc794b40fc917feb146afd34970cf44563b561 (patch)
tree859e5f3b7adcd6769a81224e7671fab2fba861db
parent243035c565ac22a3d694247bd7fc324743999978 (diff)
lib: sbi_domain_context: Flush TLB after SATP mode switch
When switching between domains with different satp.MODE values (e.g. Sv39 to Sv48), the RISC-V ISA permits hardware to use cached translations from the old virtual-address width if no SFENCE.VMA intervenes. This constrained-unpredictable behavior is clarified in riscv-isa-manual PR #2219. The hart protection re-configuration will anyway do full SFENCE / HFENCE so move the hart protection re-configuration after register context switch in switch_to_next_domain_context() to ensure translations from the new domain's address width are used. Link: https://github.com/riscv/riscv-isa-manual/pull/2219 Signed-off-by: Zishun Yi <[email protected]> Reviewed-by: Anup Patel <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Anup Patel <[email protected]>
-rw-r--r--lib/sbi/sbi_domain_context.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/lib/sbi/sbi_domain_context.c b/lib/sbi/sbi_domain_context.c
index fad402a8..cc4cc04d 100644
--- a/lib/sbi/sbi_domain_context.c
+++ b/lib/sbi/sbi_domain_context.c
@@ -129,10 +129,6 @@ static int switch_to_next_domain_context(struct hart_context *ctx,
sbi_hartmask_set_hartindex(hartindex, &target_dom->assigned_harts);
spin_unlock(&target_dom->assigned_harts_lock);
- /* Reconfigure PMP settings for the new domain */
- sbi_hart_protection_unconfigure(scratch);
- sbi_hart_protection_configure(scratch);
-
/* Save current CSR context and restore target domain's CSR context */
ctx->sstatus = csr_swap(CSR_SSTATUS, dom_ctx->sstatus);
ctx->sie = csr_swap(CSR_SIE, dom_ctx->sie);
@@ -168,6 +164,16 @@ static int switch_to_next_domain_context(struct hart_context *ctx,
sbi_memcpy(&ctx->trap_ctx, trap_ctx, sizeof(*trap_ctx));
sbi_memcpy(trap_ctx, &dom_ctx->trap_ctx, sizeof(*trap_ctx));
+ /*
+ * Re-configure PMP settings for the new domain
+ *
+ * This will internally perform full SFENCE / HFENCE which
+ * is also required for some of the above CSR updates (such
+ * as satp CSR).
+ */
+ sbi_hart_protection_unconfigure(scratch);
+ sbi_hart_protection_configure(scratch);
+
/* Mark current context structure initialized because context saved */
ctx->initialized = true;