From 48725e95b4d02281bee268f6a9f8b5a77eb001fb Mon Sep 17 00:00:00 2001 From: Anup Patel Date: Mon, 27 Jul 2026 09:55:01 +0530 Subject: [PATCH] lib: sbi: Introduce sbi_hart_protection_reconfigure() function 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 Reviewed-by: Rahul Pathak Link: https://lore.kernel.org/r/20260727042504.1743250-3-anup.patel@oss.qualcomm.com Signed-off-by: Anup Patel --- 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();