On Mon, 2020-04-06 at 18:09 +1000, Jordan Niethe wrote: > Define specific __get_user_instr() and __get_user_instr_inatomic() > macros for reading instructions from user space. > > Signed-off-by: Jordan Niethe <jniet...@gmail.com> > --- > arch/powerpc/include/asm/uaccess.h | 5 +++++ > arch/powerpc/kernel/align.c | 2 +- > arch/powerpc/kernel/hw_breakpoint.c | 2 +- > arch/powerpc/kernel/vecemu.c | 2 +- > 4 files changed, 8 insertions(+), 3 deletions(-) > > diff --git a/arch/powerpc/include/asm/uaccess.h > b/arch/powerpc/include/asm/uaccess.h > index 2f500debae21..c0a35e4586a5 100644 > --- a/arch/powerpc/include/asm/uaccess.h > +++ b/arch/powerpc/include/asm/uaccess.h > @@ -105,6 +105,11 @@ static inline int __access_ok(unsigned long addr, > unsigned long size, > #define __put_user_inatomic(x, ptr) \ > __put_user_nosleep((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr))) > > +#define __get_user_instr(x, ptr) \ > + __get_user_nocheck((x).val, (u32 *)(ptr), sizeof(u32), true) > + > +#define __get_user_instr_inatomic(x, ptr) \ > + __get_user_nosleep((x).val, (u32 *)(ptr), sizeof(u32))
should we use ppc_inst_val() ? -- Bala > extern long __put_user_bad(void); > > /* > diff --git a/arch/powerpc/kernel/align.c b/arch/powerpc/kernel/align.c > index 66a6d1de7799..65cdfd41e3a1 100644 > --- a/arch/powerpc/kernel/align.c > +++ b/arch/powerpc/kernel/align.c > @@ -304,7 +304,7 @@ int fix_alignment(struct pt_regs *regs) > */ > CHECK_FULL_REGS(regs); > > - if (unlikely(__get_user(instr.val, (unsigned int __user *)regs->nip))) > + if (unlikely(__get_user_instr(instr, (void __user *)regs->nip))) > return -EFAULT; > if ((regs->msr & MSR_LE) != (MSR_KERNEL & MSR_LE)) { > /* We don't handle PPC little-endian any more... */ > diff --git a/arch/powerpc/kernel/hw_breakpoint.c > b/arch/powerpc/kernel/hw_breakpoint.c > index 542f65ccf68b..cebab14e2788 100644 > --- a/arch/powerpc/kernel/hw_breakpoint.c > +++ b/arch/powerpc/kernel/hw_breakpoint.c > @@ -249,7 +249,7 @@ static bool stepping_handler(struct pt_regs *regs, struct > perf_event *bp, > struct instruction_op op; > unsigned long addr = info->address; > > - if (__get_user_inatomic(instr.val, (unsigned int *)regs->nip)) > + if (__get_user_instr_inatomic(instr, (void __user *)regs->nip)) > goto fail; > > ret = analyse_instr(&op, regs, instr); > diff --git a/arch/powerpc/kernel/vecemu.c b/arch/powerpc/kernel/vecemu.c > index bbf536e10902..c82ede46d71b 100644 > --- a/arch/powerpc/kernel/vecemu.c > +++ b/arch/powerpc/kernel/vecemu.c > @@ -266,7 +266,7 @@ int emulate_altivec(struct pt_regs *regs) > unsigned int va, vb, vc, vd; > vector128 *vrs; > > - if (get_user(instr.val, (unsigned int __user *) regs->nip)) > + if (__get_user_instr(instr, (void __user *) regs->nip)) > return -EFAULT; > > word = ppc_inst_val(instr);