[PATCH v2 2/5] lib: sbi: Introduce sbi_hart_protection_reconfigure() function

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


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 <anup.patel at oss.qualcomm.com>
---
 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




More information about the opensbi mailing list