ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / include / asm-s390 / sigp.h
1 /*
2  *  include/asm-s390/sigp.h
3  *
4  *  S390 version
5  *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
6  *    Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com),
7  *               Martin Schwidefsky (schwidefsky@de.ibm.com)
8  *
9  *  sigp.h by D.J. Barrow (c) IBM 1999
10  *  contains routines / structures for signalling other S/390 processors in an
11  *  SMP configuration.
12  */
13
14 #ifndef __SIGP__
15 #define __SIGP__
16
17 #include <asm/ptrace.h>
18 #include <asm/atomic.h>
19
20 /* get real cpu address from logical cpu number */
21 extern volatile int __cpu_logical_map[];
22
23 typedef enum
24 {
25         sigp_unassigned=0x0,
26         sigp_sense,
27         sigp_external_call,
28         sigp_emergency_signal,
29         sigp_start,
30         sigp_stop,
31         sigp_restart,
32         sigp_unassigned1,
33         sigp_unassigned2,
34         sigp_stop_and_store_status,
35         sigp_unassigned3,
36         sigp_initial_cpu_reset,
37         sigp_cpu_reset,
38         sigp_set_prefix,
39         sigp_store_status_at_address,
40         sigp_store_extended_status_at_address
41 } sigp_order_code;
42
43 typedef __u32 sigp_status_word;
44
45 typedef enum
46 {
47         sigp_order_code_accepted=0,
48         sigp_status_stored,
49         sigp_busy,
50         sigp_not_operational
51 } sigp_ccode;
52
53
54 /*
55  * Definitions for the external call
56  */
57
58 /* 'Bit' signals, asynchronous */
59 typedef enum
60 {
61         ec_schedule=0,
62         ec_call_function,
63         ec_bit_last
64 } ec_bit_sig;
65
66 /*
67  * Signal processor
68  */
69 extern __inline__ sigp_ccode
70 signal_processor(__u16 cpu_addr, sigp_order_code order_code)
71 {
72         sigp_ccode ccode;
73
74         __asm__ __volatile__(
75 #ifndef __s390x__
76                 "    sr     1,1\n"        /* parameter=0 in gpr 1 */
77                 "    sigp   1,%1,0(%2)\n"
78                 "    ipm    %0\n"
79                 "    srl    %0,28\n"
80 #else /* __s390x__ */
81                 "    sgr    1,1\n"        /* parameter=0 in gpr 1 */
82                 "    sigp   1,%1,0(%2)\n"
83                 "    ipm    %0\n"
84                 "    srl    %0,28"
85 #endif /* __s390x__ */
86                 : "=d" (ccode)
87                 : "d" (__cpu_logical_map[cpu_addr]), "a" (order_code)
88                 : "cc" , "memory", "1" );
89         return ccode;
90 }
91
92 /*
93  * Signal processor with parameter
94  */
95 extern __inline__ sigp_ccode
96 signal_processor_p(unsigned long parameter,__u16 cpu_addr,
97                    sigp_order_code order_code)
98 {
99         sigp_ccode ccode;
100         
101         __asm__ __volatile__(
102 #ifndef __s390x__
103                 "    lr     1,%1\n"       /* parameter in gpr 1 */
104                 "    sigp   1,%2,0(%3)\n"
105                 "    ipm    %0\n"
106                 "    srl    %0,28\n"
107 #else /* __s390x__ */
108                 "    lgr    1,%1\n"       /* parameter in gpr 1 */
109                 "    sigp   1,%2,0(%3)\n"
110                 "    ipm    %0\n"
111                 "    srl    %0,28\n"
112 #endif /* __s390x__ */
113                 : "=d" (ccode)
114                 : "d" (parameter), "d" (__cpu_logical_map[cpu_addr]),
115                   "a" (order_code)
116                 : "cc" , "memory", "1" );
117         return ccode;
118 }
119
120 /*
121  * Signal processor with parameter and return status
122  */
123 extern __inline__ sigp_ccode
124 signal_processor_ps(unsigned long *statusptr, unsigned long parameter,
125                     __u16 cpu_addr, sigp_order_code order_code)
126 {
127         sigp_ccode ccode;
128         
129         __asm__ __volatile__(
130 #ifndef __s390x__
131                 "    sr     2,2\n"        /* clear status so it doesn't contain rubbish if not saved. */
132                 "    lr     3,%2\n"       /* parameter in gpr 3 */
133                 "    sigp   2,%3,0(%4)\n"
134                 "    st     2,%1\n"
135                 "    ipm    %0\n"
136                 "    srl    %0,28\n"
137 #else /* __s390x__ */
138                 "    sgr    2,2\n"        /* clear status so it doesn't contain rubbish if not saved. */
139                 "    lgr    3,%2\n"       /* parameter in gpr 3 */
140                 "    sigp   2,%3,0(%4)\n"
141                 "    stg    2,%1\n"
142                 "    ipm    %0\n"
143                 "    srl    %0,28\n"
144 #endif /* __s390x__ */
145                 : "=d" (ccode), "=m" (*statusptr)
146                 : "d" (parameter), "d" (__cpu_logical_map[cpu_addr]),
147                   "a" (order_code)
148                 : "cc" , "memory", "2" , "3"
149                 );
150    return ccode;
151 }
152
153 #endif /* __SIGP__ */
154
155