13
13
#include <linux/mm.h>
14
14
#include <asm/asm-extable.h>
15
15
#include <asm/ctlreg.h>
16
+ #include <asm/skey.h>
16
17
17
18
#ifdef CONFIG_DEBUG_ENTRY
18
19
void debug_user_asce (int exit )
@@ -156,14 +157,15 @@ int __cmpxchg_user_key1(unsigned long address, unsigned char *uval,
156
157
bool sacf_flag ;
157
158
int rc = 0 ;
158
159
160
+ skey_regions_initialize ();
159
161
shift = (3 ^ (address & 3 )) << 3 ;
160
162
address ^= address & 3 ;
161
163
_old = (unsigned int )old << shift ;
162
164
_new = (unsigned int )new << shift ;
163
165
mask = ~(0xff << shift );
164
166
sacf_flag = enable_sacf_uaccess ();
165
167
asm_inline volatile (
166
- " spka 0(%[key])\n"
168
+ "20: spka 0(%[key])\n"
167
169
" sacf 256\n"
168
170
" llill %[count],%[max_loops]\n"
169
171
"0: l %[prev],%[address]\n"
@@ -181,10 +183,12 @@ int __cmpxchg_user_key1(unsigned long address, unsigned char *uval,
181
183
" brct %[count],2b\n"
182
184
"5: sacf 768\n"
183
185
" spka %[default_key]\n"
186
+ "21:\n"
184
187
EX_TABLE_UA_LOAD_REG (0b , 5b , %[rc ], %[prev ])
185
188
EX_TABLE_UA_LOAD_REG (1b , 5b , %[rc ], %[prev ])
186
189
EX_TABLE_UA_LOAD_REG (3b , 5b , %[rc ], %[prev ])
187
190
EX_TABLE_UA_LOAD_REG (4b , 5b , %[rc ], %[prev ])
191
+ SKEY_REGION (20b , 21b )
188
192
: [rc ] "+ & d " (rc),
189
193
[prev ] "= & d " (prev),
190
194
[address ] "+ Q " (*(int *)address),
@@ -212,14 +216,15 @@ int __cmpxchg_user_key2(unsigned long address, unsigned short *uval,
212
216
bool sacf_flag ;
213
217
int rc = 0 ;
214
218
219
+ skey_regions_initialize ();
215
220
shift = (2 ^ (address & 2 )) << 3 ;
216
221
address ^= address & 2 ;
217
222
_old = (unsigned int )old << shift ;
218
223
_new = (unsigned int )new << shift ;
219
224
mask = ~(0xffff << shift );
220
225
sacf_flag = enable_sacf_uaccess ();
221
226
asm_inline volatile (
222
- " spka 0(%[key])\n"
227
+ "20: spka 0(%[key])\n"
223
228
" sacf 256\n"
224
229
" llill %[count],%[max_loops]\n"
225
230
"0: l %[prev],%[address]\n"
@@ -237,10 +242,12 @@ int __cmpxchg_user_key2(unsigned long address, unsigned short *uval,
237
242
" brct %[count],2b\n"
238
243
"5: sacf 768\n"
239
244
" spka %[default_key]\n"
245
+ "21:\n"
240
246
EX_TABLE_UA_LOAD_REG (0b , 5b , %[rc ], %[prev ])
241
247
EX_TABLE_UA_LOAD_REG (1b , 5b , %[rc ], %[prev ])
242
248
EX_TABLE_UA_LOAD_REG (3b , 5b , %[rc ], %[prev ])
243
249
EX_TABLE_UA_LOAD_REG (4b , 5b , %[rc ], %[prev ])
250
+ SKEY_REGION (20b , 21b )
244
251
: [rc ] "+ & d " (rc),
245
252
[prev ] "= & d " (prev),
246
253
[address ] "+ Q " (*(int *)address),
@@ -267,15 +274,18 @@ int __cmpxchg_user_key4(unsigned long address, unsigned int *uval,
267
274
bool sacf_flag ;
268
275
int rc = 0 ;
269
276
277
+ skey_regions_initialize ();
270
278
sacf_flag = enable_sacf_uaccess ();
271
279
asm_inline volatile (
272
- " spka 0(%[key])\n"
280
+ "20: spka 0(%[key])\n"
273
281
" sacf 256\n"
274
282
"0: cs %[prev],%[new],%[address]\n"
275
283
"1: sacf 768\n"
276
284
" spka %[default_key]\n"
285
+ "21:\n"
277
286
EX_TABLE_UA_LOAD_REG (0b , 1b , %[rc ], %[prev ])
278
287
EX_TABLE_UA_LOAD_REG (1b , 1b , %[rc ], %[prev ])
288
+ SKEY_REGION (20b , 21b )
279
289
: [rc ] "+ & d " (rc),
280
290
[prev ] "+ & d " (prev),
281
291
[address ] "+ Q " (*(int *)address)
@@ -296,15 +306,18 @@ int __cmpxchg_user_key8(unsigned long address, unsigned long *uval,
296
306
bool sacf_flag ;
297
307
int rc = 0 ;
298
308
309
+ skey_regions_initialize ();
299
310
sacf_flag = enable_sacf_uaccess ();
300
311
asm_inline volatile (
301
- " spka 0(%[key])\n"
312
+ "20: spka 0(%[key])\n"
302
313
" sacf 256\n"
303
314
"0: csg %[prev],%[new],%[address]\n"
304
315
"1: sacf 768\n"
305
316
" spka %[default_key]\n"
317
+ "21:\n"
306
318
EX_TABLE_UA_LOAD_REG (0b , 1b , %[rc ], %[prev ])
307
319
EX_TABLE_UA_LOAD_REG (1b , 1b , %[rc ], %[prev ])
320
+ SKEY_REGION (20b , 21b )
308
321
: [rc ] "+ & d " (rc),
309
322
[prev ] "+ & d " (prev),
310
323
[address ] "+ QS " (*(long *)address)
@@ -325,15 +338,18 @@ int __cmpxchg_user_key16(unsigned long address, __uint128_t *uval,
325
338
bool sacf_flag ;
326
339
int rc = 0 ;
327
340
341
+ skey_regions_initialize ();
328
342
sacf_flag = enable_sacf_uaccess ();
329
343
asm_inline volatile (
330
- " spka 0(%[key])\n"
344
+ "20: spka 0(%[key])\n"
331
345
" sacf 256\n"
332
346
"0: cdsg %[prev],%[new],%[address]\n"
333
347
"1: sacf 768\n"
334
348
" spka %[default_key]\n"
349
+ "21:\n"
335
350
EX_TABLE_UA_LOAD_REGPAIR (0b , 1b , %[rc ], %[prev ])
336
351
EX_TABLE_UA_LOAD_REGPAIR (1b , 1b , %[rc ], %[prev ])
352
+ SKEY_REGION (20b , 21b )
337
353
: [rc ] "+ & d " (rc),
338
354
[prev ] "+ & d " (prev),
339
355
[address ] "+ QS " (*(__int128_t *)address)
0 commit comments