Message ID | 20190228183220.15626-5-sudeep.holla@arm.com |
---|---|
State | Superseded |
Headers | show |
Series | ptrace: consolidate PTRACE_SYSEMU handling and add support for arm64 | expand |
On 2019/3/1 2:32, Sudeep Holla wrote: > Now that we have a new hook ptrace_syscall_enter that can be called from > syscall entry code and it handles PTRACE_SYSEMU in generic code, we > can do some cleanup using the same in do_syscall_trace_enter. > > Cc: Oleg Nesterov <oleg@redhat.com> > Cc: Paul Mackerras <paulus@samba.org> > Cc: Michael Ellerman <mpe@ellerman.id.au> > Signed-off-by: Sudeep Holla <sudeep.holla@arm.com> > --- > arch/powerpc/kernel/ptrace.c | 50 ++++++++++++++++-------------------- > 1 file changed, 22 insertions(+), 28 deletions(-) > > diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c > index cb7e1439cafb..978cd2aac29e 100644 > --- a/arch/powerpc/kernel/ptrace.c > +++ b/arch/powerpc/kernel/ptrace.c > @@ -3264,37 +3264,31 @@ long do_syscall_trace_enter(struct pt_regs *regs) > { > u32 flags; > > -user_exit(); We'd better keep the user_exit() at here in case both context tracking and SYSCALL_EMU are enabled. > - > -flags = READ_ONCE(current_thread_info()->flags) & > -(_TIF_SYSCALL_EMU | _TIF_SYSCALL_TRACE); > +if (unlikely(ptrace_syscall_enter(regs))) { > +/* > + * A nonzero return code from tracehook_report_syscall_entry() > + * tells us to prevent the syscall execution, but we are not > + * going to execute it anyway. > + * > + * Returning -1 will skip the syscall execution. We want to > + * avoid clobbering any registers, so we don't goto the skip > + * label below. > + */ > +return -1; > +} > > -if (flags) { > -int rc = tracehook_report_syscall_entry(regs); > +user_exit(); > > -if (unlikely(flags & _TIF_SYSCALL_EMU)) { > -/* > - * A nonzero return code from > - * tracehook_report_syscall_entry() tells us to prevent > - * the syscall execution, but we are not going to > - * execute it anyway. > - * > - * Returning -1 will skip the syscall execution. We want > - * to avoid clobbering any registers, so we don't goto > - * the skip label below. > - */ > -return -1; > -} > +flags = READ_ONCE(current_thread_info()->flags) & _TIF_SYSCALL_TRACE; > > -if (rc) { > -/* > - * The tracer decided to abort the syscall. Note that > - * the tracer may also just change regs->gpr[0] to an > - * invalid syscall number, that is handled below on the > - * exit path. > - */ > -goto skip; > -} > +if (flags && tracehook_report_syscall_entry(regs)) { > +/* > + * The tracer decided to abort the syscall. Note that > + * the tracer may also just change regs->gpr[0] to an > + * invalid syscall number, that is handled below on the > + * exit path. > + */ > +goto skip; > } > > /* Run seccomp after ptrace; allow it to set gpr[3]. */ > IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.
On Mon, Mar 04, 2019 at 09:36:27AM +0000, Haibo Xu (Arm Technology China) wrote: > On 2019/3/1 2:32, Sudeep Holla wrote: > > Now that we have a new hook ptrace_syscall_enter that can be called from > > syscall entry code and it handles PTRACE_SYSEMU in generic code, we > > can do some cleanup using the same in do_syscall_trace_enter. > > > > Cc: Oleg Nesterov <oleg@redhat.com> > > Cc: Paul Mackerras <paulus@samba.org> > > Cc: Michael Ellerman <mpe@ellerman.id.au> > > Signed-off-by: Sudeep Holla <sudeep.holla@arm.com> > > --- > > arch/powerpc/kernel/ptrace.c | 50 ++++++++++++++++-------------------- > > 1 file changed, 22 insertions(+), 28 deletions(-) > > > > diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c > > index cb7e1439cafb..978cd2aac29e 100644 > > --- a/arch/powerpc/kernel/ptrace.c > > +++ b/arch/powerpc/kernel/ptrace.c > > @@ -3264,37 +3264,31 @@ long do_syscall_trace_enter(struct pt_regs *regs) > > { > > u32 flags; > > > > - user_exit(); > > We'd better keep the user_exit() at here in case both context tracking and > SYSCALL_EMU are enabled. > Ah right, spurious change will fix it. -- Regards, Sudeep
diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c index cb7e1439cafb..978cd2aac29e 100644 --- a/arch/powerpc/kernel/ptrace.c +++ b/arch/powerpc/kernel/ptrace.c @@ -3264,37 +3264,31 @@ long do_syscall_trace_enter(struct pt_regs *regs) { u32 flags; - user_exit(); - - flags = READ_ONCE(current_thread_info()->flags) & - (_TIF_SYSCALL_EMU | _TIF_SYSCALL_TRACE); + if (unlikely(ptrace_syscall_enter(regs))) { + /* + * A nonzero return code from tracehook_report_syscall_entry() + * tells us to prevent the syscall execution, but we are not + * going to execute it anyway. + * + * Returning -1 will skip the syscall execution. We want to + * avoid clobbering any registers, so we don't goto the skip + * label below. + */ + return -1; + } - if (flags) { - int rc = tracehook_report_syscall_entry(regs); + user_exit(); - if (unlikely(flags & _TIF_SYSCALL_EMU)) { - /* - * A nonzero return code from - * tracehook_report_syscall_entry() tells us to prevent - * the syscall execution, but we are not going to - * execute it anyway. - * - * Returning -1 will skip the syscall execution. We want - * to avoid clobbering any registers, so we don't goto - * the skip label below. - */ - return -1; - } + flags = READ_ONCE(current_thread_info()->flags) & _TIF_SYSCALL_TRACE; - if (rc) { - /* - * The tracer decided to abort the syscall. Note that - * the tracer may also just change regs->gpr[0] to an - * invalid syscall number, that is handled below on the - * exit path. - */ - goto skip; - } + if (flags && tracehook_report_syscall_entry(regs)) { + /* + * The tracer decided to abort the syscall. Note that + * the tracer may also just change regs->gpr[0] to an + * invalid syscall number, that is handled below on the + * exit path. + */ + goto skip; } /* Run seccomp after ptrace; allow it to set gpr[3]. */
Now that we have a new hook ptrace_syscall_enter that can be called from syscall entry code and it handles PTRACE_SYSEMU in generic code, we can do some cleanup using the same in do_syscall_trace_enter. Cc: Oleg Nesterov <oleg@redhat.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Michael Ellerman <mpe@ellerman.id.au> Signed-off-by: Sudeep Holla <sudeep.holla@arm.com> --- arch/powerpc/kernel/ptrace.c | 50 ++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 28 deletions(-) -- 2.17.1