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