summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sbi/sbi_init.h2
-rw-r--r--lib/sbi/sbi_init.c22
2 files changed, 24 insertions, 0 deletions
diff --git a/include/sbi/sbi_init.h b/include/sbi/sbi_init.h
index 033286f..c976276 100644
--- a/include/sbi/sbi_init.h
+++ b/include/sbi/sbi_init.h
@@ -16,4 +16,6 @@ struct sbi_scratch;
void __noreturn sbi_init(struct sbi_scratch *scratch);
+void __noreturn sbi_exit(struct sbi_scratch *scratch);
+
#endif
diff --git a/lib/sbi/sbi_init.c b/lib/sbi/sbi_init.c
index 80e4a19..b4c242f 100644
--- a/lib/sbi/sbi_init.c
+++ b/lib/sbi/sbi_init.c
@@ -183,3 +183,25 @@ void __noreturn sbi_init(struct sbi_scratch *scratch)
else
init_warmboot(scratch, hartid);
}
+
+/**
+ * Exit OpenSBI library for current HART and stop HART
+ *
+ * The function expects following:
+ * 1. The 'mscratch' CSR is pointing to sbi_scratch of current HART
+ * 2. Stack pointer (SP) is setup for current HART
+ *
+ * @param scratch pointer to sbi_scratch of current HART
+ */
+void __noreturn sbi_exit(struct sbi_scratch *scratch)
+{
+ u32 hartid = sbi_current_hartid();
+ const struct sbi_platform *plat = sbi_platform_ptr(scratch);
+
+ if (sbi_platform_hart_disabled(plat, hartid))
+ sbi_hart_hang();
+
+ sbi_hart_unmark_available(hartid);
+
+ sbi_hart_hang();
+}