blob: f3bd18bbf07f140b9d89a2b3235a3729fe8ada7d [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
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"
Paolo 'Blaisorblade' Giarrusso72e55252006-02-01 03:06:29 -08008#include "asm/smp.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -07009#include "kern_util.h"
10#include "kern.h"
11#include "os.h"
Jeff Dike77bf4402007-10-16 01:26:58 -070012#include "skas.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070013
Eric W. Biederman5e382912006-01-08 01:03:46 -080014void (*pm_power_off)(void);
15
Linus Torvalds1da177e2005-04-16 15:20:36 -070016static void kill_off_processes(void)
17{
Jeff Dike77bf4402007-10-16 01:26:58 -070018 if(proc_mm)
19 /*
20 * FIXME: need to loop over userspace_pids
21 */
22 os_kill_ptraced_process(userspace_pid[0], 1);
23 else {
24 struct task_struct *p;
25 int pid, me;
26
27 me = os_getpid();
28 for_each_process(p){
29 if(p->mm == NULL)
30 continue;
31
32 pid = p->mm->context.skas.id.u.pid;
33 os_kill_ptraced_process(pid, 1);
34 }
35 }
Linus Torvalds1da177e2005-04-16 15:20:36 -070036}
37
38void uml_cleanup(void)
39{
Jeff Dike026549d2005-06-25 14:55:23 -070040 kmalloc_ok = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -070041 do_uml_exitcalls();
Jeff Dike026549d2005-06-25 14:55:23 -070042 kill_off_processes();
Linus Torvalds1da177e2005-04-16 15:20:36 -070043}
44
45void machine_restart(char * __unused)
46{
Jeff Dike026549d2005-06-25 14:55:23 -070047 uml_cleanup();
Jeff Dike6aa802c2007-10-16 01:26:56 -070048 reboot_skas();
Linus Torvalds1da177e2005-04-16 15:20:36 -070049}
50
Linus Torvalds1da177e2005-04-16 15:20:36 -070051void machine_power_off(void)
52{
Jeff Dike026549d2005-06-25 14:55:23 -070053 uml_cleanup();
Jeff Dike6aa802c2007-10-16 01:26:56 -070054 halt_skas();
Linus Torvalds1da177e2005-04-16 15:20:36 -070055}
56
Linus Torvalds1da177e2005-04-16 15:20:36 -070057void machine_halt(void)
58{
59 machine_power_off();
60}