@@ -329,20 +329,17 @@ __read_mem_aligned(unsigned long *dest, unsigned long ea, int nb, struct pt_regs
329329static nokprobe_inline int
330330read_mem_aligned (unsigned long * dest , unsigned long ea , int nb , struct pt_regs * regs )
331331{
332- int err ;
332+ void __user * uea = ( void __user * ) ea ;
333333
334334 if (is_kernel_addr (ea ))
335335 return __read_mem_aligned (dest , ea , nb , regs );
336336
337- if (user_read_access_begin ((void __user * )ea , nb )) {
338- err = __read_mem_aligned (dest , ea , nb , regs );
339- user_read_access_end ();
340- } else {
341- err = - EFAULT ;
342- regs -> dar = ea ;
343- }
337+ scoped_user_read_access_size (uea , nb , efault )
338+ return __read_mem_aligned (dest , (unsigned long )uea , nb , regs );
344339
345- return err ;
340+ efault :
341+ regs -> dar = ea ;
342+ return - EFAULT ;
346343}
347344
348345/*
@@ -385,20 +382,17 @@ static __always_inline int __copy_mem_in(u8 *dest, unsigned long ea, int nb, str
385382
386383static nokprobe_inline int copy_mem_in (u8 * dest , unsigned long ea , int nb , struct pt_regs * regs )
387384{
388- int err ;
385+ void __user * uea = ( void __user * ) ea ;
389386
390387 if (is_kernel_addr (ea ))
391388 return __copy_mem_in (dest , ea , nb , regs );
392389
393- if (user_read_access_begin ((void __user * )ea , nb )) {
394- err = __copy_mem_in (dest , ea , nb , regs );
395- user_read_access_end ();
396- } else {
397- err = - EFAULT ;
398- regs -> dar = ea ;
399- }
390+ scoped_user_read_access_size (uea , nb , efault )
391+ return __copy_mem_in (dest , (unsigned long )uea , nb , regs );
400392
401- return err ;
393+ efault :
394+ regs -> dar = ea ;
395+ return - EFAULT ;
402396}
403397
404398static nokprobe_inline int read_mem_unaligned (unsigned long * dest ,
@@ -465,20 +459,17 @@ __write_mem_aligned(unsigned long val, unsigned long ea, int nb, struct pt_regs
465459static nokprobe_inline int
466460write_mem_aligned (unsigned long val , unsigned long ea , int nb , struct pt_regs * regs )
467461{
468- int err ;
462+ void __user * uea = ( void __user * ) ea ;
469463
470464 if (is_kernel_addr (ea ))
471465 return __write_mem_aligned (val , ea , nb , regs );
472466
473- if (user_write_access_begin ((void __user * )ea , nb )) {
474- err = __write_mem_aligned (val , ea , nb , regs );
475- user_write_access_end ();
476- } else {
477- err = - EFAULT ;
478- regs -> dar = ea ;
479- }
467+ scoped_user_write_access_size (uea , nb , efault )
468+ return __write_mem_aligned (val , (unsigned long )uea , nb , regs );
480469
481- return err ;
470+ efault :
471+ regs -> dar = ea ;
472+ return - EFAULT ;
482473}
483474
484475/*
@@ -521,20 +512,17 @@ static __always_inline int __copy_mem_out(u8 *dest, unsigned long ea, int nb, st
521512
522513static nokprobe_inline int copy_mem_out (u8 * dest , unsigned long ea , int nb , struct pt_regs * regs )
523514{
524- int err ;
515+ void __user * uea = ( void __user * ) ea ;
525516
526517 if (is_kernel_addr (ea ))
527518 return __copy_mem_out (dest , ea , nb , regs );
528519
529- if (user_write_access_begin ((void __user * )ea , nb )) {
530- err = __copy_mem_out (dest , ea , nb , regs );
531- user_write_access_end ();
532- } else {
533- err = - EFAULT ;
534- regs -> dar = ea ;
535- }
520+ scoped_user_write_access_size (uea , nb , efault )
521+ return __copy_mem_out (dest , (unsigned long )uea , nb , regs );
536522
537- return err ;
523+ efault :
524+ regs -> dar = ea ;
525+ return - EFAULT ;
538526}
539527
540528static nokprobe_inline int write_mem_unaligned (unsigned long val ,
@@ -1065,6 +1053,7 @@ static __always_inline int __emulate_dcbz(unsigned long ea)
10651053
10661054int emulate_dcbz (unsigned long ea , struct pt_regs * regs )
10671055{
1056+ void __user * uea = (void __user * )ea ;
10681057 int err ;
10691058 unsigned long size = l1_dcache_bytes ();
10701059
@@ -1073,20 +1062,20 @@ int emulate_dcbz(unsigned long ea, struct pt_regs *regs)
10731062 if (!address_ok (regs , ea , size ))
10741063 return - EFAULT ;
10751064
1076- if (is_kernel_addr (ea )) {
1077- err = __emulate_dcbz (ea );
1078- } else if (user_write_access_begin ((void __user * )ea , size )) {
1065+ if (is_kernel_addr (ea ))
10791066 err = __emulate_dcbz (ea );
1080- user_write_access_end ();
1081- } else {
1082- err = - EFAULT ;
1083- }
1067+ else
1068+ scoped_user_write_access_size (uea , size , efault )
1069+ err = __emulate_dcbz ((unsigned long )uea );
10841070
10851071 if (err )
10861072 regs -> dar = ea ;
10871073
1088-
10891074 return err ;
1075+
1076+ efault :
1077+ regs -> dar = ea ;
1078+ return - EFAULT ;
10901079}
10911080NOKPROBE_SYMBOL (emulate_dcbz );
10921081
0 commit comments