@@ -341,109 +341,75 @@ static inline void *s390_kernel_write(void *dst, const void *src, size_t size)
341
341
return __s390_kernel_write (dst , src , size );
342
342
}
343
343
344
- int __noreturn __put_kernel_bad (void );
344
+ void __noreturn __mvc_kernel_nofault_bad (void );
345
345
346
- #define __put_kernel_asm (val , to , insn ) \
347
- ({ \
348
- int __rc; \
349
- \
350
- asm volatile( \
351
- "0: " insn " %[_val],%[_to]\n" \
352
- "1: xr %[rc],%[rc]\n" \
353
- "2:\n" \
354
- EX_TABLE_UA_FAULT(0b, 2b, %[rc]) \
355
- EX_TABLE_UA_FAULT(1b, 2b, %[rc]) \
356
- : [rc] "=d" (__rc), [_to] "+Q" (*(to)) \
357
- : [_val] "d" (val) \
358
- : "cc"); \
359
- __rc; \
360
- })
346
+ #ifdef CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS
361
347
362
- #define __put_kernel_nofault (dst , src , type , err_label ) \
348
+ #define __mvc_kernel_nofault (dst , src , type , err_label ) \
363
349
do { \
364
- unsigned long __x = (unsigned long)(*((type *)(src))); \
365
- int __pk_err; \
350
+ int __rc; \
366
351
\
367
352
switch (sizeof(type)) { \
368
353
case 1: \
369
- __pk_err = __put_kernel_asm(__x, (type *)(dst), "stc"); \
370
- break; \
371
354
case 2: \
372
- __pk_err = __put_kernel_asm(__x, (type *)(dst), "sth"); \
373
- break; \
374
355
case 4: \
375
- __pk_err = __put_kernel_asm(__x, (type *)(dst), "st"); \
376
- break; \
377
356
case 8: \
378
- __pk_err = __put_kernel_asm(__x, (type *)(dst), "stg"); \
357
+ asm_inline volatile( \
358
+ "0: mvc %O[_dst](%[_len],%R[_dst]),%[_src]\n" \
359
+ "1: lhi %[_rc],0\n" \
360
+ "2:\n" \
361
+ EX_TABLE_UA_FAULT(0b, 2b, %[_rc]) \
362
+ EX_TABLE_UA_FAULT(1b, 2b, %[_rc]) \
363
+ : [_rc] "=d" (__rc), \
364
+ [_dst] "=Q" (*(type *)dst) \
365
+ : [_src] "Q" (*(type *)(src)), \
366
+ [_len] "I" (sizeof(type))); \
367
+ if (__rc) \
368
+ goto err_label; \
379
369
break; \
380
370
default: \
381
- __pk_err = __put_kernel_bad (); \
371
+ __mvc_kernel_nofault_bad (); \
382
372
break; \
383
373
} \
384
- if (unlikely(__pk_err)) \
385
- goto err_label; \
386
374
} while (0)
387
375
388
- int __noreturn __get_kernel_bad (void );
389
-
390
- #define __get_kernel_asm (val , from , insn ) \
391
- ({ \
392
- int __rc; \
393
- \
394
- asm volatile( \
395
- "0: " insn " %[_val],%[_from]\n" \
396
- "1: xr %[rc],%[rc]\n" \
397
- "2:\n" \
398
- EX_TABLE_UA_LOAD_REG(0b, 2b, %[rc], %[_val]) \
399
- EX_TABLE_UA_LOAD_REG(1b, 2b, %[rc], %[_val]) \
400
- : [rc] "=d" (__rc), [_val] "=d" (val) \
401
- : [_from] "Q" (*(from)) \
402
- : "cc"); \
403
- __rc; \
404
- })
376
+ #else /* CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS */
405
377
406
- #define __get_kernel_nofault (dst , src , type , err_label ) \
378
+ #define __mvc_kernel_nofault (dst , src , type , err_label ) \
407
379
do { \
408
- int __gk_err; \
380
+ type *(__dst) = (type *)(dst); \
381
+ int __rc; \
409
382
\
410
383
switch (sizeof(type)) { \
411
- case 1: { \
412
- unsigned char __x; \
413
- \
414
- __gk_err = __get_kernel_asm(__x, (type *)(src), "ic"); \
415
- *((type *)(dst)) = (type)__x; \
416
- break; \
417
- }; \
418
- case 2: { \
419
- unsigned short __x; \
420
- \
421
- __gk_err = __get_kernel_asm(__x, (type *)(src), "lh"); \
422
- *((type *)(dst)) = (type)__x; \
423
- break; \
424
- }; \
425
- case 4: { \
426
- unsigned int __x; \
427
- \
428
- __gk_err = __get_kernel_asm(__x, (type *)(src), "l"); \
429
- *((type *)(dst)) = (type)__x; \
430
- break; \
431
- }; \
432
- case 8: { \
433
- unsigned long __x; \
434
- \
435
- __gk_err = __get_kernel_asm(__x, (type *)(src), "lg"); \
436
- *((type *)(dst)) = (type)__x; \
384
+ case 1: \
385
+ case 2: \
386
+ case 4: \
387
+ case 8: \
388
+ asm_inline volatile( \
389
+ "0: mvc 0(%[_len],%[_dst]),%[_src]\n" \
390
+ "1: lhi %[_rc],0\n" \
391
+ "2:\n" \
392
+ EX_TABLE_UA_FAULT(0b, 2b, %[_rc]) \
393
+ EX_TABLE_UA_FAULT(1b, 2b, %[_rc]) \
394
+ : [_rc] "=d" (__rc), \
395
+ "=m" (*__dst) \
396
+ : [_src] "Q" (*(type *)(src)), \
397
+ [_dst] "a" (__dst), \
398
+ [_len] "I" (sizeof(type))); \
399
+ if (__rc) \
400
+ goto err_label; \
437
401
break; \
438
- }; \
439
402
default: \
440
- __gk_err = __get_kernel_bad (); \
403
+ __mvc_kernel_nofault_bad (); \
441
404
break; \
442
405
} \
443
- if (unlikely(__gk_err)) \
444
- goto err_label; \
445
406
} while (0)
446
407
408
+ #endif /* CONFIG_CC_HAS_ASM_AOR_FORMAT_FLAGS */
409
+
410
+ #define __get_kernel_nofault __mvc_kernel_nofault
411
+ #define __put_kernel_nofault __mvc_kernel_nofault
412
+
447
413
void __cmpxchg_user_key_called_with_bad_pointer (void );
448
414
449
415
#define CMPXCHG_USER_KEY_MAX_LOOPS 128
0 commit comments