8
8
#include <asm/asm-extable.h>
9
9
#include <asm/chpid.h>
10
10
#include <asm/schid.h>
11
+ #include <asm/asm.h>
11
12
#include <asm/crw.h>
12
13
13
14
#include "ioasm.h"
18
19
static inline int __stsch (struct subchannel_id schid , struct schib * addr )
19
20
{
20
21
unsigned long r1 = * (unsigned int * )& schid ;
21
- int ccode = - EIO ;
22
+ int ccode , exception ;
22
23
24
+ exception = 1 ;
23
25
asm volatile (
24
26
" lgr 1,%[r1]\n"
25
27
" stsch %[addr]\n"
26
- "0: ipm %[cc]\n"
27
- " srl %[cc],28\n"
28
+ "0: lhi %[exc],0\n"
28
29
"1:\n"
30
+ CC_IPM (cc )
29
31
EX_TABLE (0b , 1b )
30
- : [ cc ] " + & d " ( ccode), [addr] "= Q " (*addr)
32
+ : CC_OUT ( cc , ccode ), [addr ] "= Q " (*addr), [exc] " + d " (exception )
31
33
: [r1 ] "d" (r1 )
32
- : " cc ", "1" );
33
- return ccode ;
34
+ : CC_CLOBBER_LIST ( "1" ) );
35
+ return exception ? - EIO : CC_TRANSFORM ( ccode ) ;
34
36
}
35
37
36
38
int stsch (struct subchannel_id schid , struct schib * addr )
@@ -47,19 +49,20 @@ EXPORT_SYMBOL(stsch);
47
49
static inline int __msch (struct subchannel_id schid , struct schib * addr )
48
50
{
49
51
unsigned long r1 = * (unsigned int * )& schid ;
50
- int ccode = - EIO ;
52
+ int ccode , exception ;
51
53
54
+ exception = 1 ;
52
55
asm volatile (
53
56
" lgr 1,%[r1]\n"
54
57
" msch %[addr]\n"
55
- "0: ipm %[cc]\n"
56
- " srl %[cc],28\n"
58
+ "0: lhi %[exc],0\n"
57
59
"1:\n"
60
+ CC_IPM (cc )
58
61
EX_TABLE (0b , 1b )
59
- : [ cc ] "+ & d " (ccode )
62
+ : CC_OUT ( cc , ccode ), [ exc ] "+ d " (exception )
60
63
: [r1 ] "d " (r1), [addr] " Q " (*addr)
61
- : "cc" , "1" );
62
- return ccode ;
64
+ : CC_CLOBBER_LIST ( "1" ) );
65
+ return exception ? - EIO : CC_TRANSFORM ( ccode ) ;
63
66
}
64
67
65
68
int msch (struct subchannel_id schid , struct schib * addr )
@@ -80,12 +83,11 @@ static inline int __tsch(struct subchannel_id schid, struct irb *addr)
80
83
asm volatile (
81
84
" lgr 1,%[r1]\n"
82
85
" tsch %[addr]\n"
83
- " ipm %[cc]\n"
84
- " srl %[cc],28"
85
- : [cc ] "=&d" (ccode ), [addr ] "=Q" (* addr )
86
+ CC_IPM (cc )
87
+ : CC_OUT (cc , ccode ), [addr ] "= Q " (*addr)
86
88
: [r1 ] "d" (r1 )
87
- : "cc" , "1" );
88
- return ccode ;
89
+ : CC_CLOBBER_LIST ( "1" ) );
90
+ return CC_TRANSFORM ( ccode ) ;
89
91
}
90
92
91
93
int tsch (struct subchannel_id schid , struct irb * addr )
@@ -101,19 +103,20 @@ int tsch(struct subchannel_id schid, struct irb *addr)
101
103
static inline int __ssch (struct subchannel_id schid , union orb * addr )
102
104
{
103
105
unsigned long r1 = * (unsigned int * )& schid ;
104
- int ccode = - EIO ;
106
+ int ccode , exception ;
105
107
108
+ exception = 1 ;
106
109
asm volatile (
107
110
" lgr 1,%[r1]\n"
108
111
" ssch %[addr]\n"
109
- "0: ipm %[cc]\n"
110
- " srl %[cc],28\n"
112
+ "0: lhi %[exc],0\n"
111
113
"1:\n"
114
+ CC_IPM (cc )
112
115
EX_TABLE (0b , 1b )
113
- : [ cc ] "+ & d " (ccode )
116
+ : CC_OUT ( cc , ccode ), [ exc ] "+ d " (exception )
114
117
: [r1 ] "d " (r1), [addr] " Q " (*addr)
115
- : "cc" , " memory" , "1" );
116
- return ccode ;
118
+ : CC_CLOBBER_LIST ( " memory" , "1" ) );
119
+ return CC_TRANSFORM ( ccode ) ;
117
120
}
118
121
119
122
int ssch (struct subchannel_id schid , union orb * addr )
@@ -135,12 +138,11 @@ static inline int __csch(struct subchannel_id schid)
135
138
asm volatile (
136
139
" lgr 1,%[r1]\n"
137
140
" csch\n"
138
- " ipm %[cc]\n"
139
- " srl %[cc],28\n"
140
- : [cc ] "=&d" (ccode )
141
+ CC_IPM (cc )
142
+ : CC_OUT (cc , ccode )
141
143
: [r1 ] "d " (r1)
142
- : "cc" , "1" );
143
- return ccode ;
144
+ : CC_CLOBBER_LIST ( "1" ) );
145
+ return CC_TRANSFORM ( ccode ) ;
144
146
}
145
147
146
148
int csch (struct subchannel_id schid )
@@ -160,11 +162,11 @@ int tpi(struct tpi_info *addr)
160
162
161
163
asm volatile (
162
164
" tpi %[addr]\n"
163
- " ipm %[cc]\n"
164
- " srl %[cc],28"
165
- : [cc ] "=&d" (ccode ), [addr ] "=Q" (* addr )
165
+ CC_IPM (cc )
166
+ : CC_OUT (cc , ccode ), [addr ] "= Q " (*addr)
166
167
:
167
- : "cc" );
168
+ : CC_CLOBBER );
169
+ ccode = CC_TRANSFORM (ccode );
168
170
trace_s390_cio_tpi (addr , ccode );
169
171
170
172
return ccode ;
@@ -173,17 +175,19 @@ int tpi(struct tpi_info *addr)
173
175
int chsc (void * chsc_area )
174
176
{
175
177
typedef struct { char _ [4096 ]; } addr_type ;
176
- int cc = - EIO ;
178
+ int cc , exception ;
177
179
180
+ exception = 1 ;
178
181
asm volatile (
179
182
" .insn rre,0xb25f0000,%[chsc_area],0\n"
180
- "0: ipm %[cc]\n"
181
- " srl %[cc],28\n"
183
+ "0: lhi %[exc],0\n"
182
184
"1:\n"
185
+ CC_IPM (cc )
183
186
EX_TABLE (0b , 1b )
184
- : [ cc ] " + & d " ( cc), "+ m " (*(addr_type *)chsc_area)
187
+ : CC_OUT ( cc , cc ), "+m" (* (addr_type * )chsc_area ), [ exc ] " + d " (exception )
185
188
: [chsc_area ] "d" (chsc_area )
186
- : "cc ");
189
+ : CC_CLOBBER );
190
+ cc = exception ? - EIO : CC_TRANSFORM (cc );
187
191
trace_s390_cio_chsc (chsc_area , cc );
188
192
189
193
return cc ;
@@ -198,12 +202,11 @@ static inline int __rsch(struct subchannel_id schid)
198
202
asm volatile (
199
203
" lgr 1,%[r1]\n"
200
204
" rsch\n"
201
- " ipm %[cc]\n"
202
- " srl %[cc],28\n"
203
- : [cc ] "=&d" (ccode )
205
+ CC_IPM (cc )
206
+ : CC_OUT (cc , ccode )
204
207
: [r1 ] "d " (r1)
205
- : "cc" , " memory" , "1" );
206
- return ccode ;
208
+ : CC_CLOBBER_LIST ( " memory" , "1" ) );
209
+ return CC_TRANSFORM ( ccode ) ;
207
210
}
208
211
209
212
int rsch (struct subchannel_id schid )
@@ -224,12 +227,11 @@ static inline int __hsch(struct subchannel_id schid)
224
227
asm volatile (
225
228
" lgr 1,%[r1]\n"
226
229
" hsch\n"
227
- " ipm %[cc]\n"
228
- " srl %[cc],28\n"
229
- : [cc ] "=&d" (ccode )
230
+ CC_IPM (cc )
231
+ : CC_OUT (cc , ccode )
230
232
: [r1 ] "d " (r1)
231
- : "cc" , "1" );
232
- return ccode ;
233
+ : CC_CLOBBER_LIST ( "1" ) );
234
+ return CC_TRANSFORM ( ccode ) ;
233
235
}
234
236
235
237
int hsch (struct subchannel_id schid )
@@ -256,7 +258,7 @@ static inline int __xsch(struct subchannel_id schid)
256
258
: [cc ] "=&d" (ccode )
257
259
: [r1 ] "d" (r1 )
258
260
: "cc" , "1" );
259
- return ccode ;
261
+ return CC_TRANSFORM ( ccode ) ;
260
262
}
261
263
262
264
int xsch (struct subchannel_id schid )
@@ -275,12 +277,11 @@ static inline int __stcrw(struct crw *crw)
275
277
276
278
asm volatile (
277
279
" stcrw %[crw]\n"
278
- " ipm %[cc]\n"
279
- " srl %[cc],28\n"
280
- : [cc ] "=&d" (ccode ), [crw ] "=Q" (* crw )
280
+ CC_IPM (cc )
281
+ : CC_OUT (cc , ccode ), [crw ] "= Q " (*crw)
281
282
:
282
- : "cc" );
283
- return ccode ;
283
+ : CC_CLOBBER );
284
+ return CC_TRANSFORM ( ccode ) ;
284
285
}
285
286
286
287
static inline int _stcrw (struct crw * crw )
0 commit comments