Martin Michlmayr wrote: > * Thiemo Seufer <ths@xxxxxxxxxxxx> [2006-05-15 18:25]: > > +{ > > + volatile unsigned int *reg = (unsigned int *)QEMU_RESTART_REG; > > This should be a tab. Updated. Support for qemu system shutdown. Signed-off-by: Thiemo Seufer <ths@xxxxxxxxxxxx> diff -urpN linux-orig/arch/mips/qemu/Makefile linux-work/arch/mips/qemu/Makefile --- linux-orig/arch/mips/qemu/Makefile 2006-04-24 12:02:26.000000000 +0100 +++ linux-work/arch/mips/qemu/Makefile 2006-05-15 03:07:31.000000000 +0100 @@ -2,7 +2,7 @@ # Makefile for Qemu specific kernel interface routines under Linux. # -obj-y = q-firmware.o q-irq.o q-mem.o q-setup.o +obj-y = q-firmware.o q-irq.o q-mem.o q-setup.o q-reset.o obj-$(CONFIG_VT) += q-vga.o obj-$(CONFIG_SMP) += q-smp.o diff -urpN linux-orig/arch/mips/qemu/q-reset.c linux-work/arch/mips/qemu/q-reset.c --- linux-orig/arch/mips/qemu/q-reset.c 1970-01-01 01:00:00.000000000 +0100 +++ linux-work/arch/mips/qemu/q-reset.c 2006-05-15 03:06:44.000000000 +0100 @@ -0,0 +1,34 @@ +#include <linux/config.h> + +#include <asm/io.h> +#include <asm/reboot.h> +#include <asm/cacheflush.h> +#include <asm/qemu.h> + +static void qemu_machine_restart(char *command) +{ + volatile unsigned int *reg = (unsigned int *)QEMU_RESTART_REG; + + set_c0_status(ST0_BEV | ST0_ERL); + change_c0_config(CONF_CM_CMASK, CONF_CM_UNCACHED); + flush_cache_all(); + write_c0_wired(0); + *reg = 42; + while (1) + cpu_wait(); +} + +static void qemu_machine_halt(void) +{ + volatile unsigned int *reg = (unsigned int *)QEMU_HALT_REG; + + *reg = 42; + while (1) + cpu_wait(); +} + +void qemu_reboot_setup(void) +{ + _machine_restart = qemu_machine_restart; + _machine_halt = qemu_machine_halt; +} diff -urpN linux-orig/arch/mips/qemu/q-setup.c linux-work/arch/mips/qemu/q-setup.c --- linux-orig/arch/mips/qemu/q-setup.c 2006-04-24 12:02:26.000000000 +0100 +++ linux-work/arch/mips/qemu/q-setup.c 2006-05-15 03:06:44.000000000 +0100 @@ -3,6 +3,7 @@ #include <asm/time.h> extern void qvga_init(void); +extern void qemu_reboot_setup(void); #define QEMU_PORT_BASE 0xb4000000 @@ -27,4 +28,6 @@ void __init plat_setup(void) qvga_init(); #endif board_timer_setup = qemu_timer_setup; + + qemu_reboot_setup(); } diff -urpN linux-orig/include/asm-mips/qemu.h linux-work/include/asm-mips/qemu.h --- linux-orig/include/asm-mips/qemu.h 2006-04-24 12:02:35.000000000 +0100 +++ linux-work/include/asm-mips/qemu.h 2006-05-15 03:06:44.000000000 +0100 @@ -21,4 +21,10 @@ */ #define QEMU_C0_COUNTER_CLOCK 100000000 +/* + * Magic qemu system control location. + */ +#define QEMU_RESTART_REG 0xBFBF0000 +#define QEMU_HALT_REG 0xBFBF0004 + #endif /* __ASM_QEMU_H */