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 + * Nick Kossifidis */ #include #include #include +#include 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(); }