File: /usr/src/linux/include/asm-s390x/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_restart,
63             ec_halt,
64             ec_power_off,
65     	ec_bit_last
66     } ec_bit_sig;
67     
68     /* Signals which come with a parameter area */
69     typedef enum
70     {
71             ec_callback_sync,
72             ec_callback_async
73     } ec_cmd_sig;
74     
75     /* state information for signals */
76     typedef enum
77     {
78     	ec_pending,
79     	ec_executing,
80     	ec_done
81     } ec_state;
82     
83     /* header for the queuing of callbacks */
84     typedef struct ec_ext_call
85     {
86     	ec_cmd_sig cmd;
87     	atomic_t status;
88     	struct ec_ext_call *next;
89     	void (*func)(void *info);
90     	void *info;
91     } ec_ext_call;
92     
93     /*
94      * Signal processor
95      */
96     extern __inline__ sigp_ccode
97     signal_processor(__u16 cpu_addr, sigp_order_code order_code)
98     {
99     	sigp_ccode ccode;
100     
101     	__asm__ __volatile__(
102     		"    sgr    1,1\n"        /* parameter=0 in gpr 1 */
103     		"    sigp   1,%1,0(%2)\n"
104     		"    ipm    %0\n"
105     		"    srl    %0,28"
106     		: "=d" (ccode)
107     		: "d" (__cpu_logical_map[cpu_addr]), "a" (order_code)
108     		: "cc" , "memory", "1" );
109     	return ccode;
110     }
111     
112     /*
113      * Signal processor with parameter
114      */
115     extern __inline__ sigp_ccode
116     signal_processor_p(__u64 parameter,__u16 cpu_addr,sigp_order_code order_code)
117     {
118     	sigp_ccode ccode;
119     	
120     	__asm__ __volatile__(
121     		"    lgr    1,%1\n"       /* parameter in gpr 1 */
122     		"    sigp   1,%2,0(%3)\n"
123     		"    ipm    %0\n"
124     		"    srl    %0,28\n"
125     		: "=d" (ccode)
126     		: "d" (parameter), "d" (__cpu_logical_map[cpu_addr]),
127                       "a" (order_code)
128     		: "cc" , "memory", "1" );
129     	return ccode;
130     }
131     
132     /*
133      * Signal processor with parameter and return status
134      */
135     extern __inline__ sigp_ccode
136     signal_processor_ps(__u32 *statusptr, __u64 parameter,
137     		    __u16 cpu_addr, sigp_order_code order_code)
138     {
139     	sigp_ccode ccode;
140     	
141     	__asm__ __volatile__(
142     		"    sgr    2,2\n"        /* clear status so it doesn't contain rubbish if not saved. */
143     		"    lgr    3,%2\n"       /* parameter in gpr 3 */
144     		"    sigp   2,%3,0(%4)\n"
145     		"    stg    2,%1\n"
146     		"    ipm    %0\n"
147     		"    srl    %0,28\n"
148     		: "=d" (ccode), "=m" (*statusptr)
149     		: "d" (parameter), "d" (__cpu_logical_map[cpu_addr]),
150                       "a" (order_code)
151     		: "cc" , "memory", "2" , "3"
152     		);
153        return ccode;
154     }
155     
156     #endif __SIGP__
157     
158     
159