| 
									
										
										
										
											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 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-08 03:27:32 +01:00
										 |  |  | #include <linux/sched.h>
 | 
					
						
							|  |  |  | #include <linux/spinlock.h>
 | 
					
						
							|  |  |  | #include <linux/slab.h>
 | 
					
						
							|  |  |  | #include <linux/oom.h>
 | 
					
						
							|  |  |  | #include <kern_util.h>
 | 
					
						
							|  |  |  | #include <os.h>
 | 
					
						
							|  |  |  | #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; | 
					
						
							| 
									
										
										
										
											2011-07-25 17:12:55 -07:00
										 |  |  | 		int pid; | 
					
						
							| 
									
										
										
										
											2007-10-16 01:26:58 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-31 16:26:25 -07:00
										 |  |  | 		read_lock(&tasklist_lock); | 
					
						
							| 
									
										
										
										
											2008-02-04 22:31:14 -08:00
										 |  |  | 		for_each_process(p) { | 
					
						
							| 
									
										
										
										
											2012-05-31 16:26:26 -07:00
										 |  |  | 			struct task_struct *t; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			t = find_lock_task_mm(p); | 
					
						
							|  |  |  | 			if (!t) | 
					
						
							| 
									
										
										
										
											2007-10-16 01:26:58 -07:00
										 |  |  | 				continue; | 
					
						
							| 
									
										
										
										
											2012-05-31 16:26:26 -07:00
										 |  |  | 			pid = t->mm->context.id.u.pid; | 
					
						
							|  |  |  | 			task_unlock(t); | 
					
						
							| 
									
										
										
										
											2007-10-16 01:26:58 -07:00
										 |  |  | 			os_kill_ptraced_process(pid, 1); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2012-05-31 16:26:25 -07:00
										 |  |  | 		read_unlock(&tasklist_lock); | 
					
						
							| 
									
										
										
										
											2007-10-16 01:26:58 -07:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											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(); | 
					
						
							|  |  |  | } |