|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] RISCV/shutdown: Implement machine_{halt,restart}()
commit 6471badeeec92db1cb8155066551f7509cd82efd
Author: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
AuthorDate: Tue Sep 3 15:01:20 2024 +0100
Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
CommitDate: Wed Sep 4 11:27:50 2024 +0100
RISCV/shutdown: Implement machine_{halt,restart}()
SBI has an API for shutdown so wire it up. However, the spec does allow the
call not to be implemented, so we have to cope with sbi_shutdown()
returning.
There is a reboot-capable SBI extention, but in the short term route
machine_restart() into machine_halt().
Then, use use machine_halt() rather than an infinite loop at the end of
start_xen(). This avoids the Qemu smoke test needing to wait for the full
timeout in order to succeed.
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Acked-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx>
---
xen/arch/riscv/Makefile | 1 +
xen/arch/riscv/include/asm/sbi.h | 3 +++
xen/arch/riscv/sbi.c | 5 +++++
xen/arch/riscv/setup.c | 6 ++----
xen/arch/riscv/shutdown.c | 27 +++++++++++++++++++++++++++
xen/arch/riscv/stubs.c | 12 ------------
6 files changed, 38 insertions(+), 16 deletions(-)
diff --git a/xen/arch/riscv/Makefile b/xen/arch/riscv/Makefile
index 81b77b13d6..d192be7b55 100644
--- a/xen/arch/riscv/Makefile
+++ b/xen/arch/riscv/Makefile
@@ -4,6 +4,7 @@ obj-y += mm.o
obj-$(CONFIG_RISCV_64) += riscv64/
obj-y += sbi.o
obj-y += setup.o
+obj-y += shutdown.o
obj-y += stubs.o
obj-y += traps.o
obj-y += vm_event.o
diff --git a/xen/arch/riscv/include/asm/sbi.h b/xen/arch/riscv/include/asm/sbi.h
index 0e6820a4ed..4d72a2295e 100644
--- a/xen/arch/riscv/include/asm/sbi.h
+++ b/xen/arch/riscv/include/asm/sbi.h
@@ -13,6 +13,7 @@
#define __ASM_RISCV_SBI_H__
#define SBI_EXT_0_1_CONSOLE_PUTCHAR 0x1
+#define SBI_EXT_0_1_SHUTDOWN 0x8
struct sbiret {
long error;
@@ -31,4 +32,6 @@ struct sbiret sbi_ecall(unsigned long ext, unsigned long fid,
*/
void sbi_console_putchar(int ch);
+void sbi_shutdown(void);
+
#endif /* __ASM_RISCV_SBI_H__ */
diff --git a/xen/arch/riscv/sbi.c b/xen/arch/riscv/sbi.c
index 0ae166c861..c7984344bc 100644
--- a/xen/arch/riscv/sbi.c
+++ b/xen/arch/riscv/sbi.c
@@ -42,3 +42,8 @@ void sbi_console_putchar(int ch)
{
sbi_ecall(SBI_EXT_0_1_CONSOLE_PUTCHAR, 0, ch, 0, 0, 0, 0, 0);
}
+
+void sbi_shutdown(void)
+{
+ sbi_ecall(SBI_EXT_0_1_SHUTDOWN, 0, 0, 0, 0, 0, 0, 0);
+}
diff --git a/xen/arch/riscv/setup.c b/xen/arch/riscv/setup.c
index a6a29a1508..bf9078f36a 100644
--- a/xen/arch/riscv/setup.c
+++ b/xen/arch/riscv/setup.c
@@ -4,6 +4,7 @@
#include <xen/compile.h>
#include <xen/init.h>
#include <xen/mm.h>
+#include <xen/shutdown.h>
#include <public/version.h>
@@ -28,8 +29,5 @@ void __init noreturn start_xen(unsigned long bootcpu_id,
printk("All set up\n");
- for ( ;; )
- asm volatile ("wfi");
-
- unreachable();
+ machine_halt();
}
diff --git a/xen/arch/riscv/shutdown.c b/xen/arch/riscv/shutdown.c
new file mode 100644
index 0000000000..3513d9af47
--- /dev/null
+++ b/xen/arch/riscv/shutdown.c
@@ -0,0 +1,27 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+#include <xen/shutdown.h>
+
+#include <asm/sbi.h>
+
+void machine_halt(void)
+{
+ sbi_shutdown();
+
+ /* TODO: Cope with sbi_shutdown() not being implemented. */
+
+ for ( ;; )
+ asm volatile ( "wfi" );
+
+ unreachable();
+}
+
+void machine_restart(unsigned int delay_millisecs)
+{
+ /*
+ * TODO: mdelay(delay_millisecs)
+ * TODO: Probe for #SRST support, where sbi_system_reset() has a
+ * shutdown/reboot parameter.
+ */
+
+ machine_halt();
+}
diff --git a/xen/arch/riscv/stubs.c b/xen/arch/riscv/stubs.c
index 3285d18899..2aa245f272 100644
--- a/xen/arch/riscv/stubs.c
+++ b/xen/arch/riscv/stubs.c
@@ -49,18 +49,6 @@ void domain_set_time_offset(struct domain *d, int64_t
time_offset_seconds)
BUG_ON("unimplemented");
}
-/* shutdown.c */
-
-void machine_restart(unsigned int delay_millisecs)
-{
- BUG_ON("unimplemented");
-}
-
-void machine_halt(void)
-{
- BUG_ON("unimplemented");
-}
-
/* domctl.c */
long arch_do_domctl(struct xen_domctl *domctl, struct domain *d,
--
generated by git-patchbot for /home/xen/git/xen.git#master
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |