[PATCH v2 3/5] lib: sbi: Add domain parameter to hart protection (un)configure()

Anup Patel anup.patel at oss.qualcomm.com
Sun Jul 26 21:25:02 PDT 2026


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 <anup.patel at oss.qualcomm.com>
Reviewed-by: Rahul Pathak <rahul.pathak at oss.qualcomm.com>
---
 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




More information about the opensbi mailing list