[PATCH v2 3/5] lib: sbi: Add domain parameter to hart protection (un)configure()
Anup Patel <[email protected]> Mon, 27 Jul 2026 09:55:02 +0530
| Newsgroups | org.infradead.lists.opensbi |
|---|---|
| Message-ID | <[email protected]> |
The switch_to_next_domain_context() already has the pointers to current and next domains so pass them as parameters to hart protection configure() and unconfigure() callbacks. Signed-off-by: Anup Patel <[email protected]> Reviewed-by: Rahul Pathak <[email protected]> --- include/sbi/sbi_hart_protection.h | 25 +++++++++++++++++++------ lib/sbi/sbi_domain_context.c | 2 +- lib/sbi/sbi_hart_pmp.c | 11 ++++++----- lib/sbi/sbi_hart_protection.c | 28 +++++++++++++++++----------- lib/sbi/sbi_init.c | 6 +++--- platform/generic/eswin/eic770x.c | 7 ++++--- 6 files changed, 50 insertions(+), 29 deletions(-) diff --git a/include/sbi/sbi_hart_protection.h b/include/sbi/sbi_hart_protection.h index 6698ceb0..5e170f05 100644 --- a/include/sbi/sbi_hart_protection.h +++ b/include/sbi/sbi_hart_protection.h @@ -11,6 +11,7 @@ #include <sbi/sbi_list.h> struct sbi_scratch; +struct sbi_domain; /** Representation of hart protection mechanism */ struct sbi_hart_protection { @@ -24,10 +25,10 @@ struct sbi_hart_protection { unsigned long rating; /** Configure protection for current HART (Mandatory) */ - int (*configure)(struct sbi_scratch *scratch); + int (*configure)(struct sbi_scratch *scratch, struct sbi_domain *dom); - /** Unconfigure protection for current HART (Mandatory) */ - void (*unconfigure)(struct sbi_scratch *scratch); + /** Unconfigure protection for current HART (Optional) */ + void (*unconfigure)(struct sbi_scratch *scratch, struct sbi_domain *dom); /** Create temporary mapping to access address range on current HART (Optional) */ int (*map_range)(struct sbi_scratch *scratch, @@ -65,24 +66,36 @@ void sbi_hart_protection_unregister(struct sbi_hart_protection *hprot); * Configure protection for current HART * * @param scratch pointer to scratch space of current HART + * @param dom pointer to the domain for which HART protection + * is being configured * * @return 0 on success and negative error code on failure */ -int sbi_hart_protection_configure(struct sbi_scratch *scratch); +int sbi_hart_protection_configure(struct sbi_scratch *scratch, + struct sbi_domain *dom); /** * Unconfigure protection for current HART * * @param scratch pointer to scratch space of current HART + * @param dom pointer to the domain for which HART protection + * is being unconfigured */ -void sbi_hart_protection_unconfigure(struct sbi_scratch *scratch); +void sbi_hart_protection_unconfigure(struct sbi_scratch *scratch, + struct sbi_domain *dom); /** * Re-configure protection for current HART * * @param scratch pointer to scratch space of current HART + * @param current_dom pointer to the current domain for which + * HART protection is being unconfigured + * @param next_dom pointer to the next domain for which HART + * protection is being configured */ -int sbi_hart_protection_reconfigure(struct sbi_scratch *scratch); +int sbi_hart_protection_reconfigure(struct sbi_scratch *scratch, + struct sbi_domain *current_dom, + struct sbi_domain *next_dom); /** * 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 7d9817d6..0861d541 100644 --- a/lib/sbi/sbi_domain_context.c +++ b/lib/sbi/sbi_domain_context.c @@ -171,7 +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_reconfigure(scratch); + sbi_hart_protection_reconfigure(scratch, current_dom, target_dom); /* Mark current context structure initialized because context saved */ ctx->initialized = true; diff --git a/lib/sbi/sbi_hart_pmp.c b/lib/sbi/sbi_hart_pmp.c index 4528258d..5ede3cc1 100644 --- a/lib/sbi/sbi_hart_pmp.c +++ b/lib/sbi/sbi_hart_pmp.c @@ -228,10 +228,10 @@ static bool is_valid_pmp_idx(unsigned int pmp_count, unsigned int pmp_idx) return false; } -static int sbi_hart_smepmp_configure(struct sbi_scratch *scratch) +static int sbi_hart_smepmp_configure(struct sbi_scratch *scratch, + struct sbi_domain *dom) { struct sbi_domain_memregion *reg; - struct sbi_domain *dom = sbi_domain_thishart_ptr(); unsigned int pmp_log2gran, pmp_bits; unsigned int pmp_idx, pmp_count; unsigned long pmp_addr_max; @@ -366,10 +366,10 @@ static int sbi_hart_smepmp_unmap_range(struct sbi_scratch *scratch, return sbi_hart_pmp_disable(SBI_SMEPMP_RESV_ENTRY); } -static int sbi_hart_oldpmp_configure(struct sbi_scratch *scratch) +static int sbi_hart_oldpmp_configure(struct sbi_scratch *scratch, + struct sbi_domain *dom) { struct sbi_domain_memregion *reg; - struct sbi_domain *dom = sbi_domain_thishart_ptr(); unsigned long pmp_addr, pmp_addr_max; unsigned int pmp_log2gran, pmp_bits; unsigned int pmp_idx, pmp_count; @@ -407,7 +407,8 @@ static int sbi_hart_oldpmp_configure(struct sbi_scratch *scratch) return 0; } -static void sbi_hart_pmp_unconfigure(struct sbi_scratch *scratch) +static void sbi_hart_pmp_unconfigure(struct sbi_scratch *scratch, + struct sbi_domain *dom) { int i, pmp_count = sbi_hart_pmp_count(scratch); diff --git a/lib/sbi/sbi_hart_protection.c b/lib/sbi/sbi_hart_protection.c index 9a8427b9..36880a9c 100644 --- a/lib/sbi/sbi_hart_protection.c +++ b/lib/sbi/sbi_hart_protection.c @@ -50,41 +50,47 @@ void sbi_hart_protection_unregister(struct sbi_hart_protection *hprot) } static int __hart_protection_configure(struct sbi_scratch *scratch, - struct sbi_hart_protection *hprot) + struct sbi_hart_protection *hprot, + struct sbi_domain *dom) { if (!hprot) return 0; if (!hprot->configure) return SBI_ENOSYS; - return hprot->configure(scratch); + return hprot->configure(scratch, dom); } static void __hart_protection_unconfigure(struct sbi_scratch *scratch, - struct sbi_hart_protection *hprot) + struct sbi_hart_protection *hprot, + struct sbi_domain *dom) { if (!hprot || !hprot->unconfigure) return; - hprot->unconfigure(scratch); + hprot->unconfigure(scratch, dom); } -int sbi_hart_protection_configure(struct sbi_scratch *scratch) +int sbi_hart_protection_configure(struct sbi_scratch *scratch, + struct sbi_domain *dom) { - return __hart_protection_configure(scratch, sbi_hart_protection_best()); + return __hart_protection_configure(scratch, sbi_hart_protection_best(), dom); } -void sbi_hart_protection_unconfigure(struct sbi_scratch *scratch) +void sbi_hart_protection_unconfigure(struct sbi_scratch *scratch, + struct sbi_domain *dom) { - __hart_protection_unconfigure(scratch, sbi_hart_protection_best()); + __hart_protection_unconfigure(scratch, sbi_hart_protection_best(), dom); } -int sbi_hart_protection_reconfigure(struct sbi_scratch *scratch) +int sbi_hart_protection_reconfigure(struct sbi_scratch *scratch, + struct sbi_domain *current_dom, + struct sbi_domain *next_dom) { struct sbi_hart_protection *hprot = sbi_hart_protection_best(); - __hart_protection_unconfigure(scratch, hprot); - return __hart_protection_configure(scratch, hprot); + __hart_protection_unconfigure(scratch, hprot, current_dom); + return __hart_protection_configure(scratch, hprot, next_dom); } int sbi_hart_protection_map_range(unsigned long base, unsigned long size) diff --git a/lib/sbi/sbi_init.c b/lib/sbi/sbi_init.c index d4aca242..02e26924 100644 --- a/lib/sbi/sbi_init.c +++ b/lib/sbi/sbi_init.c @@ -435,7 +435,7 @@ static void __noreturn init_coldboot(struct sbi_scratch *scratch, u32 hartid) * Configure hart protection at last because if SMEPMP is * detected, M-mode access to the S/U space will be rescinded. */ - rc = sbi_hart_protection_configure(scratch); + rc = sbi_hart_protection_configure(scratch, sbi_domain_thishart_ptr()); if (rc) { sbi_printf("%s: hart protection configure failed (error %d)\n", __func__, rc); @@ -518,7 +518,7 @@ static void __noreturn init_warm_startup(struct sbi_scratch *scratch, * Configure hart protection at last because if SMEPMP is * detected, M-mode access to the S/U space will be rescinded. */ - rc = sbi_hart_protection_configure(scratch); + rc = sbi_hart_protection_configure(scratch, sbi_domain_thishart_ptr()); if (rc) sbi_hart_hang(); @@ -539,7 +539,7 @@ static void __noreturn init_warm_resume(struct sbi_scratch *scratch, if (rc) sbi_hart_hang(); - rc = sbi_hart_protection_configure(scratch); + rc = sbi_hart_protection_configure(scratch, sbi_domain_thishart_ptr()); if (rc) sbi_hart_hang(); diff --git a/platform/generic/eswin/eic770x.c b/platform/generic/eswin/eic770x.c index 3fe3d090..da4d0e34 100644 --- a/platform/generic/eswin/eic770x.c +++ b/platform/generic/eswin/eic770x.c @@ -380,9 +380,9 @@ static int eswin_eic7700_final_init(bool cold_boot) return 0; } -static int eswin_eic7700_pmp_configure(struct sbi_scratch *scratch) +static int eswin_eic7700_pmp_configure(struct sbi_scratch *scratch, + struct sbi_domain *dom) { - struct sbi_domain *dom = sbi_domain_thishart_ptr(); struct sbi_domain_memregion *reg, *prev = NULL; unsigned int pmp_idx, pmp_max; unsigned int i, j; @@ -453,7 +453,8 @@ no_more_pmp: return SBI_EFAIL; } -static void eswin_eic7700_pmp_unconfigure(struct sbi_scratch *scratch) +static void eswin_eic7700_pmp_unconfigure(struct sbi_scratch *scratch, + struct sbi_domain *dom) { /* Enable P550 internal + System Port */ sbi_hart_pmp_set(PMP_FREE_A_START + PMP_FREE_A_COUNT - 1, 0, 0, -- 2.43.0 -- opensbi mailing list [email protected] http://lists.infradead.org/mailman/listinfo/opensbi