| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /* 
 | 
					
						
							| 
									
										
										
										
											2007-10-16 01:27:00 -07:00
										 |  |  |  * Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  |  * Licensed under the GPL | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "linux/sched.h"
 | 
					
						
							| 
									
										
										
										
											2008-02-04 22:30:46 -08:00
										 |  |  | #include "kern_util.h"
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #include "os.h"
 | 
					
						
							| 
									
										
										
										
											2007-10-16 01:26:58 -07:00
										 |  |  | #include "skas.h"
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-08 01:03:46 -08:00
										 |  |  | void (*pm_power_off)(void); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | static void kill_off_processes(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2008-02-04 22:31:14 -08:00
										 |  |  | 	if (proc_mm) | 
					
						
							| 
									
										
										
										
											2007-10-16 01:26:58 -07:00
										 |  |  | 		/*
 | 
					
						
							|  |  |  | 		 * FIXME: need to loop over userspace_pids | 
					
						
							|  |  |  | 		 */ | 
					
						
							|  |  |  | 		os_kill_ptraced_process(userspace_pid[0], 1); | 
					
						
							|  |  |  | 	else { | 
					
						
							|  |  |  | 		struct task_struct *p; | 
					
						
							|  |  |  | 		int pid, me; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		me = os_getpid(); | 
					
						
							| 
									
										
										
										
											2008-02-04 22:31:14 -08:00
										 |  |  | 		for_each_process(p) { | 
					
						
							|  |  |  | 			if (p->mm == NULL) | 
					
						
							| 
									
										
										
										
											2007-10-16 01:26:58 -07:00
										 |  |  | 				continue; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-16 01:27:06 -07:00
										 |  |  | 			pid = p->mm->context.id.u.pid; | 
					
						
							| 
									
										
										
										
											2007-10-16 01:26:58 -07:00
										 |  |  | 			os_kill_ptraced_process(pid, 1); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void uml_cleanup(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2007-10-16 01:27:00 -07:00
										 |  |  | 	kmalloc_ok = 0; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	do_uml_exitcalls(); | 
					
						
							| 
									
										
										
										
											2005-06-25 14:55:23 -07:00
										 |  |  | 	kill_off_processes(); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void machine_restart(char * __unused) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2007-10-16 01:27:00 -07:00
										 |  |  | 	uml_cleanup(); | 
					
						
							| 
									
										
										
										
											2007-10-16 01:26:56 -07:00
										 |  |  | 	reboot_skas(); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void machine_power_off(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2007-10-16 01:27:00 -07:00
										 |  |  | 	uml_cleanup(); | 
					
						
							| 
									
										
										
										
											2007-10-16 01:26:56 -07:00
										 |  |  | 	halt_skas(); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void machine_halt(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	machine_power_off(); | 
					
						
							|  |  |  | } |