1 /* 2 * Copyright (C) 2000, 2002 Jeff Dike (jdike@karaya.com) 3 * Licensed under the GPL 4 */ 5 6 #include "linux/module.h" 7 #include "linux/sched.h" 8 #include "user_util.h" 9 #include "kern_util.h" 10 #include "kern.h" 11 #include "os.h" 12 #include "mode.h" 13 #include "choose-mode.h" 14 15 #ifdef CONFIG_SMP 16 static void kill_idlers(int me) 17 { 18 #ifdef CONFIG_MODE_TT 19 struct task_struct *p; 20 int i; 21 22 for(i = 0; i < sizeof(idle_threads)/sizeof(idle_threads[0]); i++){ 23 p = idle_threads[i]; 24 if((p != NULL) && (p->thread.mode.tt.extern_pid != me)) 25 os_kill_process(p->thread.mode.tt.extern_pid, 0); 26 } 27 #endif 28 } 29 #endif 30 31 static void kill_off_processes(void) 32 { 33 CHOOSE_MODE(kill_off_processes_tt(), kill_off_processes_skas()); 34 #ifdef CONFIG_SMP 35 kill_idlers(os_getpid()); 36 #endif 37 } 38 39 void uml_cleanup(void) 40 { 41 kmalloc_ok = 0; 42 do_uml_exitcalls(); 43 kill_off_processes(); 44 } 45 46 void machine_restart(char * __unused) 47 { 48 uml_cleanup(); 49 CHOOSE_MODE(reboot_tt(), reboot_skas()); 50 } 51 52 void machine_power_off(void) 53 { 54 uml_cleanup(); 55 CHOOSE_MODE(halt_tt(), halt_skas()); 56 } 57 58 void machine_halt(void) 59 { 60 machine_power_off(); 61 } 62 63 /* 64 * Overrides for Emacs so that we follow Linus's tabbing style. 65 * Emacs will notice this stuff at the end of the file and automatically 66 * adjust the settings for this buffer only. This must remain at the end 67 * of the file. 68 * --------------------------------------------------------------------------- 69 * Local variables: 70 * c-file-style: "linux" 71 * End: 72 */ 73