summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorNick Kossifidis <[email protected]>2019-02-17 03:52:44 +0200
committerAnup Patel <[email protected]>2019-02-18 09:21:58 +0530
commitb44878b773698f08b4c08b9e43e26917950a7618 (patch)
treeee925d00abb500a2831adcba885d51f4c3c46f8c /lib
parent16426420b5d6bbf16c035503dd7d9eabd91e3f04 (diff)
lib: Send IPI for all harts to hang on system shutdown
In case the platform specific method for shutting down the system fails (or is not implemented), at least make sure that all harts hang instead of just the current hart. Signed-off-by: Nick Kossifidis <[email protected]>
Diffstat (limited to 'lib')
-rw-r--r--lib/sbi_system.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/lib/sbi_system.c b/lib/sbi_system.c
index 7b73aa42..f23d0464 100644
--- a/lib/sbi_system.c
+++ b/lib/sbi_system.c
@@ -5,11 +5,13 @@
*
* Authors:
* Anup Patel <[email protected]>
+ * Nick Kossifidis <[email protected]>
*/
#include <sbi/sbi_hart.h>
#include <sbi/sbi_platform.h>
#include <sbi/sbi_system.h>
+#include <sbi/sbi_ipi.h>
int sbi_system_early_init(struct sbi_scratch *scratch, bool cold_boot)
{
@@ -34,6 +36,12 @@ void __attribute__((noreturn)) sbi_system_reboot(struct sbi_scratch *scratch,
void __attribute__((noreturn)) sbi_system_shutdown(struct sbi_scratch *scratch,
u32 type)
{
+ /* First try the platform-specific method */
sbi_platform_system_shutdown(sbi_platform_ptr(scratch), type);
+
+ /* If that fails (or is not implemented) send an IPI on every
+ * hart to hang and then hang the current hart */
+ sbi_ipi_send_many(scratch, NULL, SBI_IPI_EVENT_HALT);
+
sbi_hart_hang();
}