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 ( ) ;
}