[PATCH v2 2/5] lib: sbi: Introduce sbi_hart_protection_reconfigure() function
Anup Patel <[email protected]> Mon, 27 Jul 2026 09:55:01 +0530
| Newsgroups | org.infradead.lists.opensbi |
|---|---|
| Message-ID | <[email protected]> |
Instead of assuming that hart protection reconfiguration is unconfigure followed by configure, introduce a separate sbi_hart_protection_reconfigure() function and use it in switch_to_next_domain_context(). Signed-off-by: Anup Patel <[email protected]> --- include/sbi/sbi_hart_protection.h | 7 +++++++ lib/sbi/sbi_domain_context.c | 3 +-- lib/sbi/sbi_hart_protection.c | 28 ++++++++++++++++++++++------ 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/include/sbi/sbi_hart_protection.h b/include/sbi/sbi_hart_protection.h index d65f32ca..6698ceb0 100644 --- a/include/sbi/sbi_hart_protection.h +++ b/include/sbi/sbi_hart_protection.h @@ -77,6 +77,13 @@ int sbi_hart_protection_configure(struct sbi_scratch *scratch); */ void sbi_hart_protection_unconfigure(struct sbi_scratch *scratch); +/** + * Re-configure protection for current HART + * + * @param scratch pointer to scratch space of current HART + */ +int sbi_hart_protection_reconfigure(struct sbi_scratch *scratch); + /** * Create temporary mapping to access address range on current HART * diff --git a/lib/sbi/sbi_domain_context.c b/lib/sbi/sbi_domain_context.c index cc4cc04d..7d9817d6 100644 --- a/lib/sbi/sbi_domain_context.c +++ b/lib/sbi/sbi_domain_context.c @@ -171,8 +171,7 @@ static int switch_to_next_domain_context(struct hart_context *ctx, * is also required for some of the above CSR updates (such * as satp CSR). */ - sbi_hart_protection_unconfigure(scratch); - sbi_hart_protection_configure(scratch); + sbi_hart_protection_reconfigure(scratch); /* Mark current context structure initialized because context saved */ ctx->initialized = true; diff --git a/lib/sbi/sbi_hart_protection.c b/lib/sbi/sbi_hart_protection.c index fbebfd1a..9a8427b9 100644 --- a/lib/sbi/sbi_hart_protection.c +++ b/lib/sbi/sbi_hart_protection.c @@ -49,10 +49,9 @@ void sbi_hart_protection_unregister(struct sbi_hart_protection *hprot) sbi_list_del(&hprot->head); } -int sbi_hart_protection_configure(struct sbi_scratch *scratch) +static int __hart_protection_configure(struct sbi_scratch *scratch, + struct sbi_hart_protection *hprot) { - struct sbi_hart_protection *hprot = sbi_hart_protection_best(); - if (!hprot) return 0; if (!hprot->configure) @@ -61,16 +60,33 @@ int sbi_hart_protection_configure(struct sbi_scratch *scratch) return hprot->configure(scratch); } -void sbi_hart_protection_unconfigure(struct sbi_scratch *scratch) +static void __hart_protection_unconfigure(struct sbi_scratch *scratch, + struct sbi_hart_protection *hprot) { - struct sbi_hart_protection *hprot = sbi_hart_protection_best(); - if (!hprot || !hprot->unconfigure) return; hprot->unconfigure(scratch); } +int sbi_hart_protection_configure(struct sbi_scratch *scratch) +{ + return __hart_protection_configure(scratch, sbi_hart_protection_best()); +} + +void sbi_hart_protection_unconfigure(struct sbi_scratch *scratch) +{ + __hart_protection_unconfigure(scratch, sbi_hart_protection_best()); +} + +int sbi_hart_protection_reconfigure(struct sbi_scratch *scratch) +{ + struct sbi_hart_protection *hprot = sbi_hart_protection_best(); + + __hart_protection_unconfigure(scratch, hprot); + return __hart_protection_configure(scratch, hprot); +} + int sbi_hart_protection_map_range(unsigned long base, unsigned long size) { struct sbi_hart_protection *hprot = sbi_hart_protection_best(); -- 2.43.0 -- opensbi mailing list [email protected] http://lists.infradead.org/mailman/listinfo/opensbi