Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
s390
char
sclp_quiesce.c
Go to the documentation of this file.
1
/*
2
* signal quiesce handler
3
*
4
* Copyright IBM Corp. 1999, 2004
5
* Author(s): Martin Schwidefsky <
[email protected]
>
6
* Peter Oberparleiter <
[email protected]
>
7
*/
8
9
#include <linux/module.h>
10
#include <linux/types.h>
11
#include <
linux/cpumask.h
>
12
#include <
linux/smp.h
>
13
#include <
linux/init.h
>
14
#include <linux/reboot.h>
15
#include <
linux/atomic.h
>
16
#include <asm/ptrace.h>
17
#include <asm/smp.h>
18
19
#include "
sclp.h
"
20
21
static
void
(*old_machine_restart)(
char
*);
22
static
void
(*old_machine_halt)(
void
);
23
static
void
(*old_machine_power_off)(
void
);
24
25
/* Shutdown handler. Signal completion of shutdown by loading special PSW. */
26
static
void
do_machine_quiesce(
void
)
27
{
28
psw_t quiesce_psw;
29
30
smp_send_stop
();
31
quiesce_psw.mask =
32
PSW_MASK_BASE
|
PSW_MASK_EA
|
PSW_MASK_BA
|
PSW_MASK_WAIT
;
33
quiesce_psw.addr = 0xfff;
34
__load_psw(quiesce_psw);
35
}
36
37
/* Handler for quiesce event. Start shutdown procedure. */
38
static
void
sclp_quiesce_handler(
struct
evbuf_header
*
evbuf
)
39
{
40
if
(
_machine_restart
!= (
void
*) do_machine_quiesce) {
41
old_machine_restart =
_machine_restart
;
42
old_machine_halt =
_machine_halt
;
43
old_machine_power_off =
_machine_power_off
;
44
_machine_restart
= (
void
*) do_machine_quiesce;
45
_machine_halt
= do_machine_quiesce;
46
_machine_power_off
= do_machine_quiesce;
47
}
48
ctrl_alt_del
();
49
}
50
51
/* Undo machine restart/halt/power_off modification on resume */
52
static
void
sclp_quiesce_pm_event(
struct
sclp_register
*
reg
,
53
enum
sclp_pm_event
sclp_pm_event
)
54
{
55
switch
(sclp_pm_event) {
56
case
SCLP_PM_EVENT_RESTORE
:
57
if
(old_machine_restart) {
58
_machine_restart
= old_machine_restart;
59
_machine_halt
= old_machine_halt;
60
_machine_power_off
= old_machine_power_off;
61
old_machine_restart =
NULL
;
62
old_machine_halt =
NULL
;
63
old_machine_power_off =
NULL
;
64
}
65
break
;
66
case
SCLP_PM_EVENT_FREEZE
:
67
case
SCLP_PM_EVENT_THAW
:
68
break
;
69
}
70
}
71
72
static
struct
sclp_register
sclp_quiesce_event = {
73
.receive_mask =
EVTYP_SIGQUIESCE_MASK
,
74
.receiver_fn = sclp_quiesce_handler,
75
.pm_event_fn = sclp_quiesce_pm_event
76
};
77
78
/* Initialize quiesce driver. */
79
static
int
__init
sclp_quiesce_init(
void
)
80
{
81
return
sclp_register
(&sclp_quiesce_event);
82
}
83
84
module_init
(sclp_quiesce_init);
Generated on Thu Jan 10 2013 14:17:31 for Linux Kernel by
1.8.2