diff --git a/platform/qemu-virt-m68k/include/platform/virt.h b/platform/qemu-virt-m68k/include/platform/virt.h index f30bfcfaae..6b411cb2b7 100644 --- a/platform/qemu-virt-m68k/include/platform/virt.h +++ b/platform/qemu-virt-m68k/include/platform/virt.h @@ -52,6 +52,16 @@ #define VIRT_CTRL_MMIO_BASE 0xff009000 /* MMIO: 0xff009000 - 0xff009fff */ #define VIRT_CTRL_IRQ_BASE PIC_IRQ(1, 1) /* PIC: #1, IRQ: #1 */ +/* virt-ctrl registers */ +#define VIRT_CTRL_REG_FEATURES 0x00 +#define VIRT_CTRL_REG_CMD 0x04 + +/* virt-ctrl command codes */ +#define VIRT_CTRL_CMD_NOOP 0 +#define VIRT_CTRL_CMD_RESET 1 +#define VIRT_CTRL_CMD_HALT 2 +#define VIRT_CTRL_CMD_PANIC 3 + /* * virtio-mmio size is 0x200 bytes * we use 4 goldfish-pic to attach them, diff --git a/platform/qemu-virt-m68k/platform.c b/platform/qemu-virt-m68k/platform.c index 565e491f38..adf8efac32 100644 --- a/platform/qemu-virt-m68k/platform.c +++ b/platform/qemu-virt-m68k/platform.c @@ -132,3 +132,15 @@ void platform_init(void) { } #endif } + +static void virt_ctrl_system_reset(void) { + writel(VIRT_CTRL_CMD_RESET, VIRT_CTRL_MMIO_BASE + VIRT_CTRL_REG_CMD); +} + +static void virt_ctrl_system_off(void) { + writel(VIRT_CTRL_CMD_HALT, VIRT_CTRL_MMIO_BASE + VIRT_CTRL_REG_CMD); +} + +void platform_halt(platform_halt_action action, platform_halt_reason reason) { + platform_halt_default(action, reason, &virt_ctrl_system_reset, &virt_ctrl_system_off); +}