Message ID | 20171227034637.GD32108@altlinux.org |
---|---|
State | New |
Headers | show |
Series | update sys/ptrace.h [BZ #22433] | expand |
On 27/12/2017 01:46, Dmitry V. Levin wrote: > Clone generic linux/sys/ptrace.h, add the following x86-specific > __ptrace_request constants: PTRACE_GET_THREAD_AREA, > PTRACE_SET_THREAD_AREA, PTRACE_ARCH_PRCTL, PTRACE_SYSEMU, > PTRACE_SYSEMU_SINGLESTEP, and PTRACE_SINGLEBLOCK. > > [BZ #22433] > * sysdeps/unix/sysv/linux/x86/sys/ptrace.h: New file. Wouldn't be better to avoid code duplication to add a ptrace-arch.h as an empty one for generic case and add a x86 with the arch-specific bits? > --- > ChangeLog | 3 + > sysdeps/unix/sysv/linux/x86/sys/ptrace.h | 194 +++++++++++++++++++++++++++++++ > 2 files changed, 197 insertions(+) > create mode 100644 sysdeps/unix/sysv/linux/x86/sys/ptrace.h > > diff --git a/sysdeps/unix/sysv/linux/x86/sys/ptrace.h b/sysdeps/unix/sysv/linux/x86/sys/ptrace.h > new file mode 100644 > index 0000000..69c5221 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/x86/sys/ptrace.h > @@ -0,0 +1,194 @@ > +/* `ptrace' debugger support interface. Linux/x86 version. > + Copyright (C) 1996-2017 Free Software Foundation, Inc. > + > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + <http://www.gnu.org/licenses/>. */ > + > +#ifndef _SYS_PTRACE_H > +#define _SYS_PTRACE_H 1 > + > +#include <features.h> > +#include <bits/types.h> > + > +__BEGIN_DECLS > + > +/* Type of the REQUEST argument to `ptrace.' */ > +enum __ptrace_request > +{ > + /* Indicate that the process making this request should be traced. > + All signals received by this process can be intercepted by its > + parent, and its parent can use the other `ptrace' requests. */ > + PTRACE_TRACEME = 0, > +#define PT_TRACE_ME PTRACE_TRACEME > + > + /* Return the word in the process's text space at address ADDR. */ > + PTRACE_PEEKTEXT = 1, > +#define PT_READ_I PTRACE_PEEKTEXT > + > + /* Return the word in the process's data space at address ADDR. */ > + PTRACE_PEEKDATA = 2, > +#define PT_READ_D PTRACE_PEEKDATA > + > + /* Return the word in the process's user area at offset ADDR. */ > + PTRACE_PEEKUSER = 3, > +#define PT_READ_U PTRACE_PEEKUSER > + > + /* Write the word DATA into the process's text space at address ADDR. */ > + PTRACE_POKETEXT = 4, > +#define PT_WRITE_I PTRACE_POKETEXT > + > + /* Write the word DATA into the process's data space at address ADDR. */ > + PTRACE_POKEDATA = 5, > +#define PT_WRITE_D PTRACE_POKEDATA > + > + /* Write the word DATA into the process's user area at offset ADDR. */ > + PTRACE_POKEUSER = 6, > +#define PT_WRITE_U PTRACE_POKEUSER > + > + /* Continue the process. */ > + PTRACE_CONT = 7, > +#define PT_CONTINUE PTRACE_CONT > + > + /* Kill the process. */ > + PTRACE_KILL = 8, > +#define PT_KILL PTRACE_KILL > + > + /* Single step the process. */ > + PTRACE_SINGLESTEP = 9, > +#define PT_STEP PTRACE_SINGLESTEP > + > + /* Get all general purpose registers used by a processes. */ > + PTRACE_GETREGS = 12, > +#define PT_GETREGS PTRACE_GETREGS > + > + /* Set all general purpose registers used by a processes. */ > + PTRACE_SETREGS = 13, > +#define PT_SETREGS PTRACE_SETREGS > + > + /* Get all floating point registers used by a processes. */ > + PTRACE_GETFPREGS = 14, > +#define PT_GETFPREGS PTRACE_GETFPREGS > + > + /* Set all floating point registers used by a processes. */ > + PTRACE_SETFPREGS = 15, > +#define PT_SETFPREGS PTRACE_SETFPREGS > + > + /* Attach to a process that is already running. */ > + PTRACE_ATTACH = 16, > +#define PT_ATTACH PTRACE_ATTACH > + > + /* Detach from a process attached to with PTRACE_ATTACH. */ > + PTRACE_DETACH = 17, > +#define PT_DETACH PTRACE_DETACH > + > + /* Get all extended floating point registers used by a processes. */ > + PTRACE_GETFPXREGS = 18, > +#define PT_GETFPXREGS PTRACE_GETFPXREGS > + > + /* Set all extended floating point registers used by a processes. */ > + PTRACE_SETFPXREGS = 19, > +#define PT_SETFPXREGS PTRACE_SETFPXREGS > + > + /* Continue and stop at the next entry to or return from syscall. */ > + PTRACE_SYSCALL = 24, > +#define PT_SYSCALL PTRACE_SYSCALL > + > + /* Get a TLS entry in the GDT. */ > + PTRACE_GET_THREAD_AREA = 25, > +#define PT_GET_THREAD_AREA PTRACE_GET_THREAD_AREA > + > + /* Change a TLS entry in the GDT. */ > + PTRACE_SET_THREAD_AREA = 26, > +#define PT_SET_THREAD_AREA PTRACE_SET_THREAD_AREA > + > +#ifdef __x86_64__ > + /* Access TLS data. */ > + PTRACE_ARCH_PRCTL = 30, > +# define PT_ARCH_PRCTL PTRACE_ARCH_PRCTL > +#endif > + > + /* Continue and stop at the next syscall, it will not be executed. */ > + PTRACE_SYSEMU = 31, > +#define PT_SYSEMU PTRACE_SYSEMU > + > + /* Single step the process, the next syscall will not be executed. */ > + PTRACE_SYSEMU_SINGLESTEP = 32, > +#define PT_SYSEMU_SINGLESTEP PTRACE_SYSEMU_SINGLESTEP > + > + /* Execute process until next taken branch. */ > + PTRACE_SINGLEBLOCK = 33, > +#define PT_STEPBLOCK PTRACE_SINGLEBLOCK > + > + /* Set ptrace filter options. */ > + PTRACE_SETOPTIONS = 0x4200, > +#define PT_SETOPTIONS PTRACE_SETOPTIONS > + > + /* Get last ptrace message. */ > + PTRACE_GETEVENTMSG = 0x4201, > +#define PT_GETEVENTMSG PTRACE_GETEVENTMSG > + > + /* Get siginfo for process. */ > + PTRACE_GETSIGINFO = 0x4202, > +#define PT_GETSIGINFO PTRACE_GETSIGINFO > + > + /* Set new siginfo for process. */ > + PTRACE_SETSIGINFO = 0x4203, > +#define PT_SETSIGINFO PTRACE_SETSIGINFO > + > + /* Get register content. */ > + PTRACE_GETREGSET = 0x4204, > +#define PTRACE_GETREGSET PTRACE_GETREGSET > + > + /* Set register content. */ > + PTRACE_SETREGSET = 0x4205, > +#define PTRACE_SETREGSET PTRACE_SETREGSET > + > + /* Like PTRACE_ATTACH, but do not force tracee to trap and do not affect > + signal or group stop state. */ > + PTRACE_SEIZE = 0x4206, > +#define PTRACE_SEIZE PTRACE_SEIZE > + > + /* Trap seized tracee. */ > + PTRACE_INTERRUPT = 0x4207, > +#define PTRACE_INTERRUPT PTRACE_INTERRUPT > + > + /* Wait for next group event. */ > + PTRACE_LISTEN = 0x4208, > +#define PTRACE_LISTEN PTRACE_LISTEN > + > + /* Retrieve siginfo_t structures without removing signals from a queue. */ > + PTRACE_PEEKSIGINFO = 0x4209, > +#define PTRACE_PEEKSIGINFO PTRACE_PEEKSIGINFO > + > + /* Get the mask of blocked signals. */ > + PTRACE_GETSIGMASK = 0x420a, > +#define PTRACE_GETSIGMASK PTRACE_GETSIGMASK > + > + /* Change the mask of blocked signals. */ > + PTRACE_SETSIGMASK = 0x420b, > +#define PTRACE_SETSIGMASK PTRACE_SETSIGMASK > + > + /* Get seccomp BPF filters. */ > + PTRACE_SECCOMP_GET_FILTER = 0x420c > +#define PTRACE_SECCOMP_GET_FILTER PTRACE_SECCOMP_GET_FILTER > +}; > + > + > +#include <bits/ptrace-shared.h> > + > +__END_DECLS > + > +#endif /* _SYS_PTRACE_H */ >
On Fri, Dec 29, 2017 at 11:13:03AM -0200, Adhemerval Zanella wrote: > On 27/12/2017 01:46, Dmitry V. Levin wrote: > > Clone generic linux/sys/ptrace.h, add the following x86-specific > > __ptrace_request constants: PTRACE_GET_THREAD_AREA, > > PTRACE_SET_THREAD_AREA, PTRACE_ARCH_PRCTL, PTRACE_SYSEMU, > > PTRACE_SYSEMU_SINGLESTEP, and PTRACE_SINGLEBLOCK. > > > > [BZ #22433] > > * sysdeps/unix/sysv/linux/x86/sys/ptrace.h: New file. > > Wouldn't be better to avoid code duplication to add a ptrace-arch.h as an > empty one for generic case and add a x86 with the arch-specific bits? Maybe, but there are two complications. First, this x86/bits/ptrace-arch.h would have to contain a part of enum __ptrace_request definition - are we OK with distributing such ugly looking arch-specific bits? Second, there are exceptions, e.g. ia64/sys/ptrace.h includes additional headers and defines struct __pt_all_user_regs, s390/sys/ptrace.h and sparc/sys/ptrace.h undefine potentially conflicting PTRACE_* macros - we would have to #include more arch-specific bits to accommodate them.
On 29/12/2017 11:36, Dmitry V. Levin wrote: > On Fri, Dec 29, 2017 at 11:13:03AM -0200, Adhemerval Zanella wrote: >> On 27/12/2017 01:46, Dmitry V. Levin wrote: >>> Clone generic linux/sys/ptrace.h, add the following x86-specific >>> __ptrace_request constants: PTRACE_GET_THREAD_AREA, >>> PTRACE_SET_THREAD_AREA, PTRACE_ARCH_PRCTL, PTRACE_SYSEMU, >>> PTRACE_SYSEMU_SINGLESTEP, and PTRACE_SINGLEBLOCK. >>> >>> [BZ #22433] >>> * sysdeps/unix/sysv/linux/x86/sys/ptrace.h: New file. >> >> Wouldn't be better to avoid code duplication to add a ptrace-arch.h as an >> empty one for generic case and add a x86 with the arch-specific bits? > > Maybe, but there are two complications. > > First, this x86/bits/ptrace-arch.h would have to contain a part of > enum __ptrace_request definition - are we OK with distributing > such ugly looking arch-specific bits? > > Second, there are exceptions, e.g. ia64/sys/ptrace.h includes additional > headers and defines struct __pt_all_user_regs, s390/sys/ptrace.h and > sparc/sys/ptrace.h undefine potentially conflicting PTRACE_* macros - > we would have to #include more arch-specific bits to accommodate them. > > Indeed breaking down the enum on arch-specific bits does not seems a good refactor way. It seems ptrace.h justify to be a quite arch-specific header. The patch LGTM then.
diff --git a/sysdeps/unix/sysv/linux/x86/sys/ptrace.h b/sysdeps/unix/sysv/linux/x86/sys/ptrace.h new file mode 100644 index 0000000..69c5221 --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86/sys/ptrace.h @@ -0,0 +1,194 @@ +/* `ptrace' debugger support interface. Linux/x86 version. + Copyright (C) 1996-2017 Free Software Foundation, Inc. + + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#ifndef _SYS_PTRACE_H +#define _SYS_PTRACE_H 1 + +#include <features.h> +#include <bits/types.h> + +__BEGIN_DECLS + +/* Type of the REQUEST argument to `ptrace.' */ +enum __ptrace_request +{ + /* Indicate that the process making this request should be traced. + All signals received by this process can be intercepted by its + parent, and its parent can use the other `ptrace' requests. */ + PTRACE_TRACEME = 0, +#define PT_TRACE_ME PTRACE_TRACEME + + /* Return the word in the process's text space at address ADDR. */ + PTRACE_PEEKTEXT = 1, +#define PT_READ_I PTRACE_PEEKTEXT + + /* Return the word in the process's data space at address ADDR. */ + PTRACE_PEEKDATA = 2, +#define PT_READ_D PTRACE_PEEKDATA + + /* Return the word in the process's user area at offset ADDR. */ + PTRACE_PEEKUSER = 3, +#define PT_READ_U PTRACE_PEEKUSER + + /* Write the word DATA into the process's text space at address ADDR. */ + PTRACE_POKETEXT = 4, +#define PT_WRITE_I PTRACE_POKETEXT + + /* Write the word DATA into the process's data space at address ADDR. */ + PTRACE_POKEDATA = 5, +#define PT_WRITE_D PTRACE_POKEDATA + + /* Write the word DATA into the process's user area at offset ADDR. */ + PTRACE_POKEUSER = 6, +#define PT_WRITE_U PTRACE_POKEUSER + + /* Continue the process. */ + PTRACE_CONT = 7, +#define PT_CONTINUE PTRACE_CONT + + /* Kill the process. */ + PTRACE_KILL = 8, +#define PT_KILL PTRACE_KILL + + /* Single step the process. */ + PTRACE_SINGLESTEP = 9, +#define PT_STEP PTRACE_SINGLESTEP + + /* Get all general purpose registers used by a processes. */ + PTRACE_GETREGS = 12, +#define PT_GETREGS PTRACE_GETREGS + + /* Set all general purpose registers used by a processes. */ + PTRACE_SETREGS = 13, +#define PT_SETREGS PTRACE_SETREGS + + /* Get all floating point registers used by a processes. */ + PTRACE_GETFPREGS = 14, +#define PT_GETFPREGS PTRACE_GETFPREGS + + /* Set all floating point registers used by a processes. */ + PTRACE_SETFPREGS = 15, +#define PT_SETFPREGS PTRACE_SETFPREGS + + /* Attach to a process that is already running. */ + PTRACE_ATTACH = 16, +#define PT_ATTACH PTRACE_ATTACH + + /* Detach from a process attached to with PTRACE_ATTACH. */ + PTRACE_DETACH = 17, +#define PT_DETACH PTRACE_DETACH + + /* Get all extended floating point registers used by a processes. */ + PTRACE_GETFPXREGS = 18, +#define PT_GETFPXREGS PTRACE_GETFPXREGS + + /* Set all extended floating point registers used by a processes. */ + PTRACE_SETFPXREGS = 19, +#define PT_SETFPXREGS PTRACE_SETFPXREGS + + /* Continue and stop at the next entry to or return from syscall. */ + PTRACE_SYSCALL = 24, +#define PT_SYSCALL PTRACE_SYSCALL + + /* Get a TLS entry in the GDT. */ + PTRACE_GET_THREAD_AREA = 25, +#define PT_GET_THREAD_AREA PTRACE_GET_THREAD_AREA + + /* Change a TLS entry in the GDT. */ + PTRACE_SET_THREAD_AREA = 26, +#define PT_SET_THREAD_AREA PTRACE_SET_THREAD_AREA + +#ifdef __x86_64__ + /* Access TLS data. */ + PTRACE_ARCH_PRCTL = 30, +# define PT_ARCH_PRCTL PTRACE_ARCH_PRCTL +#endif + + /* Continue and stop at the next syscall, it will not be executed. */ + PTRACE_SYSEMU = 31, +#define PT_SYSEMU PTRACE_SYSEMU + + /* Single step the process, the next syscall will not be executed. */ + PTRACE_SYSEMU_SINGLESTEP = 32, +#define PT_SYSEMU_SINGLESTEP PTRACE_SYSEMU_SINGLESTEP + + /* Execute process until next taken branch. */ + PTRACE_SINGLEBLOCK = 33, +#define PT_STEPBLOCK PTRACE_SINGLEBLOCK + + /* Set ptrace filter options. */ + PTRACE_SETOPTIONS = 0x4200, +#define PT_SETOPTIONS PTRACE_SETOPTIONS + + /* Get last ptrace message. */ + PTRACE_GETEVENTMSG = 0x4201, +#define PT_GETEVENTMSG PTRACE_GETEVENTMSG + + /* Get siginfo for process. */ + PTRACE_GETSIGINFO = 0x4202, +#define PT_GETSIGINFO PTRACE_GETSIGINFO + + /* Set new siginfo for process. */ + PTRACE_SETSIGINFO = 0x4203, +#define PT_SETSIGINFO PTRACE_SETSIGINFO + + /* Get register content. */ + PTRACE_GETREGSET = 0x4204, +#define PTRACE_GETREGSET PTRACE_GETREGSET + + /* Set register content. */ + PTRACE_SETREGSET = 0x4205, +#define PTRACE_SETREGSET PTRACE_SETREGSET + + /* Like PTRACE_ATTACH, but do not force tracee to trap and do not affect + signal or group stop state. */ + PTRACE_SEIZE = 0x4206, +#define PTRACE_SEIZE PTRACE_SEIZE + + /* Trap seized tracee. */ + PTRACE_INTERRUPT = 0x4207, +#define PTRACE_INTERRUPT PTRACE_INTERRUPT + + /* Wait for next group event. */ + PTRACE_LISTEN = 0x4208, +#define PTRACE_LISTEN PTRACE_LISTEN + + /* Retrieve siginfo_t structures without removing signals from a queue. */ + PTRACE_PEEKSIGINFO = 0x4209, +#define PTRACE_PEEKSIGINFO PTRACE_PEEKSIGINFO + + /* Get the mask of blocked signals. */ + PTRACE_GETSIGMASK = 0x420a, +#define PTRACE_GETSIGMASK PTRACE_GETSIGMASK + + /* Change the mask of blocked signals. */ + PTRACE_SETSIGMASK = 0x420b, +#define PTRACE_SETSIGMASK PTRACE_SETSIGMASK + + /* Get seccomp BPF filters. */ + PTRACE_SECCOMP_GET_FILTER = 0x420c +#define PTRACE_SECCOMP_GET_FILTER PTRACE_SECCOMP_GET_FILTER +}; + + +#include <bits/ptrace-shared.h> + +__END_DECLS + +#endif /* _SYS_PTRACE_H */