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 kill_off_processes(); 42 do_uml_exitcalls(); 43 } 44 45 void machine_restart(char * __unused) 46 { 47 do_uml_exitcalls(); 48 kill_off_processes(); 49 CHOOSE_MODE(reboot_tt(), reboot_skas()); 50 } 51 52 EXPORT_SYMBOL(machine_restart); 53 54 void machine_power_off(void) 55 { 56 do_uml_exitcalls(); 57 kill_off_processes(); 58 CHOOSE_MODE(halt_tt(), halt_skas()); 59 } 60 61 EXPORT_SYMBOL(machine_power_off); 62 63 void machine_halt(void) 64 { 65 machine_power_off(); 66 } 67 68 EXPORT_SYMBOL(machine_halt); 69 70 /* 71 * Overrides for Emacs so that we follow Linus's tabbing style. 72 * Emacs will notice this stuff at the end of the file and automatically 73 * adjust the settings for this buffer only. This must remain at the end 74 * of the file. 75 * --------------------------------------------------------------------------- 76 * Local variables: 77 * c-file-style: "linux" 78 * End: 79 */ 80