From c3e406f1609af8f14e93419aa6722e646a8f4f56 Mon Sep 17 00:00:00 2001 From: Anup Patel Date: Fri, 3 Jan 2020 08:49:23 +0530 Subject: lib: Add initial sbi_exit() API This patch adds initial implementation of sbi_exit() API which can be used to perform OpenSBI exit sequence for current HART. The sbi_exit() implementation will be further extended by subsequent patches. Signed-off-by: Anup Patel Reviewed-by: Atish Patra --- include/sbi/sbi_init.h | 2 ++ lib/sbi/sbi_init.c | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+) 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(); +} -- cgit v1.2.3