[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] RISCV/shutdown: Implement machine_{halt,restart}()
On Tue, 2024-09-03 at 15:19 +0100, Andrew Cooper wrote: > 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 the call return > returning. > > There is a reboot-capable SBI extention, but in the short term route > 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> > --- > CC: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx> LGTM: Reviewed-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx> Thanks for the patch. ~ Oleksii > > As per commit e44f33ccddc2 ("ppc/shutdown: Implement > machine_{halt,restart}()") > > Simply replacing BUG() with a printk() is just swapping one problem > for > another. > --- > 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 | 25 +++++++++++++++++++++++++ > xen/arch/riscv/stubs.c | 12 ------------ > 6 files changed, 36 insertions(+), 16 deletions(-) > create mode 100644 xen/arch/riscv/shutdown.c > > diff --git a/xen/arch/riscv/Makefile b/xen/arch/riscv/Makefile > index 81b77b13d652..d192be7b552a 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 0e6820a4eda3..4d72a2295e72 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 0ae166c8610e..c7984344bc6b 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 a6a29a150869..bf9078f36aff 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 000000000000..270bb26b68a6 > --- /dev/null > +++ b/xen/arch/riscv/shutdown.c > @@ -0,0 +1,25 @@ > +/* SPDX-License-Identifier: GPL-2.0-or-later */ > +#include <xen/shutdown.h> > + > +#include <asm/sbi.h> > + > +void machine_halt(void) > +{ > + sbi_shutdown(); > + > + 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 3285d1889940..2aa245f272b5 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, > > base-commit: 1e6bb29b03680a9d0e12f14c4d406a0d67317ea7
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |