From cac7dc8d716c37e9365ecc62471b31bf90c1978d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6nke=20Holz?= Date: Thu, 4 Jan 2024 18:16:55 +0100 Subject: [PATCH] Kernel/riscv64: Add support for legacy "System Shutdown" SBI extension --- Kernel/Arch/riscv64/SBI.cpp | 18 ++++++++++++++++++ Kernel/Arch/riscv64/SBI.h | 5 +++++ 2 files changed, 23 insertions(+) diff --git a/Kernel/Arch/riscv64/SBI.cpp b/Kernel/Arch/riscv64/SBI.cpp index e636d83dac..dcd6902912 100644 --- a/Kernel/Arch/riscv64/SBI.cpp +++ b/Kernel/Arch/riscv64/SBI.cpp @@ -86,6 +86,17 @@ SBIErrorOr get_mimpid() namespace Legacy { +static long sbi_legacy_ecall0(LegacyEID extension_id) +{ + register unsigned long a0 asm("a0"); + register unsigned long a7 asm("a7") = to_underlying(extension_id); + asm volatile("ecall" + : "=r"(a0) + : "r"(a7) + : "memory"); + return static_cast(a0); +} + static long sbi_legacy_ecall1(LegacyEID extension_id, unsigned long arg0) { register unsigned long a0 asm("a0") = arg0; @@ -115,6 +126,13 @@ LegacySBIErrorOr console_putchar(int ch) return err; } +void shutdown() +{ + sbi_legacy_ecall0(LegacyEID::SystemShutdown); + + VERIFY_NOT_REACHED(); +} + } namespace Timer { diff --git a/Kernel/Arch/riscv64/SBI.h b/Kernel/Arch/riscv64/SBI.h index 218e7d434e..20fad2f3fe 100644 --- a/Kernel/Arch/riscv64/SBI.h +++ b/Kernel/Arch/riscv64/SBI.h @@ -133,6 +133,11 @@ LegacySBIErrorOr set_timer(u64 stime_value); // Write data present in ch to debug console. LegacySBIErrorOr console_putchar(int ch); +// System Shutdown (EID #0x08) +// Puts all the harts to shutdown state from supervisor point of view. +// This SBI call doesn’t return irrespective whether it succeeds or fails. +[[noreturn]] void shutdown(); + } // Chapter 6. Timer Extension (EID #0x54494D45 "TIME")