| /* | |
| * Copyright (C) 2000, 2002 Jeff Dike (jdike@karaya.com) | |
| * Licensed under the GPL | |
| */ | |
| #include "linux/module.h" | |
| #include "linux/sched.h" | |
| #include "asm/smp.h" | |
| #include "user_util.h" | |
| #include "kern_util.h" | |
| #include "kern.h" | |
| #include "os.h" | |
| #include "mode.h" | |
| #include "choose-mode.h" | |
| void (*pm_power_off)(void); | |
| #ifdef CONFIG_SMP | |
| static void kill_idlers(int me) | |
| { | |
| #ifdef CONFIG_MODE_TT | |
| struct task_struct *p; | |
| int i; | |
| for(i = 0; i < ARRAY_SIZE(idle_threads); i++){ | |
| p = idle_threads[i]; | |
| if((p != NULL) && (p->thread.mode.tt.extern_pid != me)) | |
| os_kill_process(p->thread.mode.tt.extern_pid, 0); | |
| } | |
| #endif | |
| } | |
| #endif | |
| static void kill_off_processes(void) | |
| { | |
| CHOOSE_MODE(kill_off_processes_tt(), kill_off_processes_skas()); | |
| #ifdef CONFIG_SMP | |
| kill_idlers(os_getpid()); | |
| #endif | |
| } | |
| void uml_cleanup(void) | |
| { | |
| kmalloc_ok = 0; | |
| do_uml_exitcalls(); | |
| kill_off_processes(); | |
| } | |
| void machine_restart(char * __unused) | |
| { | |
| uml_cleanup(); | |
| CHOOSE_MODE(reboot_tt(), reboot_skas()); | |
| } | |
| void machine_power_off(void) | |
| { | |
| uml_cleanup(); | |
| CHOOSE_MODE(halt_tt(), halt_skas()); | |
| } | |
| void machine_halt(void) | |
| { | |
| machine_power_off(); | |
| } |