Skip to content

Commit 872cb29

Browse files
Christophe Leroy (CS GROUP)maddy-kerneldev
authored andcommitted
powerpc/sstep: Convert to scoped user access
Commit 861574d ("powerpc/uaccess: Implement masked user access") provides optimised user access by avoiding the cost of access_ok(). Convert single step emulation functions to scoped user access to benefit from masked user access. Scoped user access also make the code simpler. Signed-off-by: Christophe Leroy (CS GROUP) <chleroy@kernel.org> Signed-off-by: Madhavan Srinivasan <maddy@linux.ibm.com> Link: https://patch.msgid.link/8f2d85bddacff18046096dc255fd94f6a0f8b230.1773137010.git.chleroy@kernel.org
1 parent 007a794 commit 872cb29

1 file changed

Lines changed: 33 additions & 44 deletions

File tree

arch/powerpc/lib/sstep.c

Lines changed: 33 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -329,20 +329,17 @@ __read_mem_aligned(unsigned long *dest, unsigned long ea, int nb, struct pt_regs
329329
static nokprobe_inline int
330330
read_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

386383
static 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

404398
static 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
465459
static nokprobe_inline int
466460
write_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

522513
static 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

540528
static nokprobe_inline int write_mem_unaligned(unsigned long val,
@@ -1065,6 +1053,7 @@ static __always_inline int __emulate_dcbz(unsigned long ea)
10651053

10661054
int 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
}
10911080
NOKPROBE_SYMBOL(emulate_dcbz);
10921081

0 commit comments

Comments
 (0)