Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * drivers/s390/char/sclp_quiesce.c | |
3 | * signal quiesce handler | |
4 | * | |
5 | * (C) Copyright IBM Corp. 1999,2004 | |
6 | * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com> | |
7 | * Peter Oberparleiter <peter.oberparleiter@de.ibm.com> | |
8 | */ | |
9 | ||
1da177e4 LT |
10 | #include <linux/module.h> |
11 | #include <linux/types.h> | |
12 | #include <linux/cpumask.h> | |
13 | #include <linux/smp.h> | |
14 | #include <linux/init.h> | |
83cc5ed3 | 15 | #include <linux/reboot.h> |
1da177e4 LT |
16 | #include <asm/atomic.h> |
17 | #include <asm/ptrace.h> | |
18 | #include <asm/sigp.h> | |
188596fa | 19 | #include <asm/smp.h> |
1da177e4 LT |
20 | |
21 | #include "sclp.h" | |
22 | ||
1da177e4 LT |
23 | /* Shutdown handler. Signal completion of shutdown by loading special PSW. */ |
24 | static void | |
25 | do_machine_quiesce(void) | |
26 | { | |
27 | psw_t quiesce_psw; | |
28 | ||
c6b5b847 | 29 | smp_send_stop(); |
1da177e4 LT |
30 | quiesce_psw.mask = PSW_BASE_BITS | PSW_MASK_WAIT; |
31 | quiesce_psw.addr = 0xfff; | |
32 | __load_psw(quiesce_psw); | |
33 | } | |
1da177e4 | 34 | |
1da177e4 LT |
35 | /* Handler for quiesce event. Start shutdown procedure. */ |
36 | static void | |
37 | sclp_quiesce_handler(struct evbuf_header *evbuf) | |
38 | { | |
39 | _machine_restart = (void *) do_machine_quiesce; | |
40 | _machine_halt = do_machine_quiesce; | |
41 | _machine_power_off = do_machine_quiesce; | |
42 | ctrl_alt_del(); | |
43 | } | |
44 | ||
45 | static struct sclp_register sclp_quiesce_event = { | |
6d4740c8 | 46 | .receive_mask = EVTYP_SIGQUIESCE_MASK, |
1da177e4 LT |
47 | .receiver_fn = sclp_quiesce_handler |
48 | }; | |
49 | ||
50 | /* Initialize quiesce driver. */ | |
51 | static int __init | |
52 | sclp_quiesce_init(void) | |
53 | { | |
a12c53f4 | 54 | return sclp_register(&sclp_quiesce_event); |
1da177e4 LT |
55 | } |
56 | ||
57 | module_init(sclp_quiesce_init); |