diff options
author | Anup Patel <anup.patel@wdc.com> | 2020-01-03 06:19:23 +0300 |
---|---|---|
committer | Anup Patel <anup.patel@wdc.com> | 2020-01-07 09:40:35 +0300 |
commit | c3e406f1609af8f14e93419aa6722e646a8f4f56 (patch) | |
tree | 4eb54d27eac89ff77138dbba888181d1c182ef71 | |
parent | e746673a796d7e176ceeb56d160779be8386ffd9 (diff) | |
download | opensbi-c3e406f1609af8f14e93419aa6722e646a8f4f56.tar.xz |
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 <anup.patel@wdc.com>
Reviewed-by: Atish Patra <atish.patra@wdc.com>
-rw-r--r-- | include/sbi/sbi_init.h | 2 | ||||
-rw-r--r-- | lib/sbi/sbi_init.c | 22 |
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(); +} |