* [RFA] x86-64-linux-nat.c cleanup
@ 2002-04-09 13:00 Michal Ludvig
2002-04-09 13:04 ` Michal Ludvig
2002-04-09 13:49 ` Andrew Cagney
0 siblings, 2 replies; 3+ messages in thread
From: Michal Ludvig @ 2002-04-09 13:00 UTC (permalink / raw)
To: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 390 bytes --]
Hi all,
because x86-64 ptrace() now conforms to standards, I removed our
versions of child_resume and child_xfer_memory from x86-64-linux.nat.c
and started to use those from infptrace.c. This is an obvious change,
but quite large, so I'm sending it for approval first.
So, can I commit?
Michal Ludvig
--
* SuSE CR, s.r.o * mludvig@suse.cz
* +420 2 9654 5373 * http://www.suse.cz
[-- Attachment #2: x8664-07.diff --]
[-- Type: text/plain, Size: 7828 bytes --]
Index: x86-64-linux-nat.c
===================================================================
RCS file: /cvs/src/src/gdb/x86-64-linux-nat.c,v
retrieving revision 1.8
diff -c -3 -p -r1.8 x86-64-linux-nat.c
*** x86-64-linux-nat.c 4 Apr 2002 13:18:59 -0000 1.8
--- x86-64-linux-nat.c 9 Apr 2002 19:52:17 -0000
*************** x86_64_linux_dr_get_status (void)
*** 128,135 ****
(0 <= (regno) && (regno) < x86_64_num_gregs)
#define GETFPREGS_SUPPLIES(regno) \
(FP0_REGNUM <= (regno) && (regno) <= MXCSR_REGNUM)
-
- #define PTRACE_XFER_TYPE unsigned long
\f
/* Transfering the general-purpose registers between GDB, inferiors
--- 128,133 ----
*************** static const unsigned char linux_syscall
*** 344,507 ****
/* Offset to saved processor registers from <asm/ucontext.h> */
#define LINUX_UCONTEXT_SIGCONTEXT_OFFSET (36)
- /* Resume execution of the inferior process.
- If STEP is nonzero, single-step it.
- If SIGNAL is nonzero, give it that signal. */
-
- void
- child_resume (ptid_t ptid, int step, enum target_signal signal)
- {
- int pid = PIDGET (ptid);
- int request = PTRACE_CONT;
-
- if (pid == -1)
- /* Resume all threads. */
- /* I think this only gets used in the non-threaded case, where "resume
- all threads" and "resume inferior_ptid" are the same. */
- pid = PIDGET (inferior_ptid);
-
- if (step)
- {
- CORE_ADDR pc = read_pc_pid (pid_to_ptid (pid));
- unsigned char buf[LINUX_SYSCALL_LEN];
-
- request = PTRACE_SINGLESTEP;
-
- /* Returning from a signal trampoline is done by calling a
- special system call (sigreturn or rt_sigreturn, see
- i386-linux-tdep.c for more information). This system call
- restores the registers that were saved when the signal was
- raised, including %eflags. That means that single-stepping
- won't work. Instead, we'll have to modify the signal context
- that's about to be restored, and set the trace flag there. */
-
- /* First check if PC is at a system call. */
- if (read_memory_nobpt (pc, (char *) buf, LINUX_SYSCALL_LEN) == 0
- && memcmp (buf, linux_syscall, LINUX_SYSCALL_LEN) == 0)
- {
- int syscall =
- read_register_pid (LINUX_SYSCALL_REGNUM, pid_to_ptid (pid));
-
- /* Then check the system call number. */
- if (syscall == SYS_rt_sigreturn)
- {
- CORE_ADDR sp = read_register (SP_REGNUM);
- CORE_ADDR addr = sp;
- unsigned long int eflags;
-
- addr +=
- sizeof (struct siginfo) + LINUX_UCONTEXT_SIGCONTEXT_OFFSET;
-
- /* Set the trace flag in the context that's about to be
- restored. */
- addr += LINUX_SIGCONTEXT_EFLAGS_OFFSET;
- read_memory (addr, (char *) &eflags, 8);
- eflags |= 0x0100;
- write_memory (addr, (char *) &eflags, 8);
- }
- }
- }
-
- if (ptrace (request, pid, 0, target_signal_to_host (signal)) == -1)
- perror_with_name ("ptrace");
- }
- \f
-
- /* Copy LEN bytes to or from inferior's memory starting at MEMADDR
- to debugger memory starting at MYADDR. Copy to inferior if
- WRITE is nonzero. TARGET is ignored.
-
- Returns the length copied, which is either the LEN argument or zero.
- This xfer function does not do partial moves, since child_ops
- doesn't allow memory operations to cross below us in the target stack
- anyway. */
-
- int
- child_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
- struct mem_attrib *attrib, struct target_ops *target)
- {
- register int i;
- /* Round starting address down to longword boundary. */
- register CORE_ADDR addr = memaddr & -sizeof (PTRACE_XFER_TYPE);
- /* Round ending address up; get number of longwords that makes. */
- register int count
- = (((memaddr + len) - addr) + sizeof (PTRACE_XFER_TYPE) - 1)
- / sizeof (PTRACE_XFER_TYPE);
- /* Allocate buffer of that many longwords. */
- /* FIXME (alloca): This code, cloned from infptrace.c, is unsafe
- because it uses alloca to allocate a buffer of arbitrary size.
- For very large xfers, this could crash GDB's stack. */
- register PTRACE_XFER_TYPE *buffer
- = (PTRACE_XFER_TYPE *) alloca (count * sizeof (PTRACE_XFER_TYPE));
-
- if (write)
- {
- /* Fill start and end extra bytes of buffer with existing memory data. */
- if (addr != memaddr || len < (int) sizeof (PTRACE_XFER_TYPE))
- {
- /* Need part of initial word -- fetch it. */
- buffer[0] = ptrace (PT_READ_I, PIDGET (inferior_ptid),
- (PTRACE_ARG3_TYPE) addr, 0);
- }
-
- if (count > 1) /* FIXME, avoid if even boundary */
- {
- buffer[count - 1] = ptrace (PT_READ_I, PIDGET (inferior_ptid),
- ((PTRACE_ARG3_TYPE)
- (addr +
- (count -
- 1) * sizeof (PTRACE_XFER_TYPE))), 0);
- }
-
- /* Copy data to be written over corresponding part of buffer */
-
- memcpy ((char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)),
- myaddr, len);
-
- /* Write the entire buffer. */
-
- for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE))
- {
- errno = 0;
- ptrace (PT_WRITE_D, PIDGET (inferior_ptid),
- (PTRACE_ARG3_TYPE) addr, buffer[i]);
- if (errno)
- {
- /* Using the appropriate one (I or D) is necessary for
- Gould NP1, at least. */
- errno = 0;
- ptrace (PT_WRITE_I, PIDGET (inferior_ptid),
- (PTRACE_ARG3_TYPE) addr, buffer[i]);
- }
- if (errno)
- return 0;
- }
- #ifdef CLEAR_INSN_CACHE
- CLEAR_INSN_CACHE ();
- #endif
- }
- else
- {
- /* Read all the longwords */
- for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE))
- {
- errno = 0;
- buffer[i] = ptrace (PT_READ_I, PIDGET (inferior_ptid),
- (PTRACE_ARG3_TYPE) addr, 0);
- if (errno)
- return 0;
- }
-
- /* Copy appropriate bytes out of the buffer. */
- memcpy (myaddr,
- (char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)),
- len);
- }
- return len;
- }
-
/* Interpreting register set info found in core files. */
-
/* Provide registers to GDB from a core file.
CORE_REG_SECT points to an array of bytes, which are the contents
--- 342,348 ----
Index: config/i386/nm-x86-64.h
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/nm-x86-64.h,v
retrieving revision 1.3
diff -c -3 -p -r1.3 nm-x86-64.h
*** config/i386/nm-x86-64.h 24 Feb 2002 22:56:05 -0000 1.3
--- config/i386/nm-x86-64.h 9 Apr 2002 19:52:17 -0000
*************** extern int kernel_u_size (void);
*** 65,74 ****
to get the offset in the core file of the register values. */
#define KERNEL_U_ADDR 0x0
- /* FIXME use special child_xfer_memory. */
- #define CHILD_XFER_MEMORY
-
#define PTRACE_ARG3_TYPE void*
\f
/* We define this if link.h is available, because with ELF we use SVR4 style
--- 65,72 ----
to get the offset in the core file of the register values. */
#define KERNEL_U_ADDR 0x0
#define PTRACE_ARG3_TYPE void*
+ #define PTRACE_XFER_TYPE unsigned long
\f
/* We define this if link.h is available, because with ELF we use SVR4 style
*************** extern int kernel_u_size (void);
*** 81,89 ****
/* Override copies of {fetch,store}_inferior_registers in `infptrace.c'. */
#define FETCH_INFERIOR_REGISTERS
-
- /* Override child_resume in `infptrace.c'. */
- #define CHILD_RESUME
#undef PREPARE_TO_PROCEED
--- 79,84 ----
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [RFA] x86-64-linux-nat.c cleanup
2002-04-09 13:00 [RFA] x86-64-linux-nat.c cleanup Michal Ludvig
@ 2002-04-09 13:04 ` Michal Ludvig
2002-04-09 13:49 ` Andrew Cagney
1 sibling, 0 replies; 3+ messages in thread
From: Michal Ludvig @ 2002-04-09 13:04 UTC (permalink / raw)
To: Michal Ludvig; +Cc: gdb-patches
Oops, sorry, I forgot to include the ChangeLog (it's too late :-)
2002-04-09 Michal Ludvig <mludvig@suse.cz>
* x86-64-linux-nat.c (child_resume, child_xfer_memory): Delete.
(PTRACE_XFER_TYPE): Moved to config/i386/nm-x86-64.h.
* config/i386/nm-x86-64.h (CHILD_XFER_MEMORY, CHILD_RESUME):
Delete.
(PTRACE_XFER_TYPE): Moved here from config/i386/nm-x86-64.h.
-- ML
Michal Ludvig wrote:
> Hi all,
> because x86-64 ptrace() now conforms to standards, I removed our
> versions of child_resume and child_xfer_memory from x86-64-linux.nat.c
> and started to use those from infptrace.c. This is an obvious change,
> but quite large, so I'm sending it for approval first.
> So, can I commit?
>
> Michal Ludvig
>
>
> ------------------------------------------------------------------------
>
> Index: x86-64-linux-nat.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/x86-64-linux-nat.c,v
> retrieving revision 1.8
> diff -c -3 -p -r1.8 x86-64-linux-nat.c
> *** x86-64-linux-nat.c 4 Apr 2002 13:18:59 -0000 1.8
> --- x86-64-linux-nat.c 9 Apr 2002 19:52:17 -0000
> *************** x86_64_linux_dr_get_status (void)
> *** 128,135 ****
> (0 <= (regno) && (regno) < x86_64_num_gregs)
> #define GETFPREGS_SUPPLIES(regno) \
> (FP0_REGNUM <= (regno) && (regno) <= MXCSR_REGNUM)
> -
> - #define PTRACE_XFER_TYPE unsigned long
> \f
>
> /* Transfering the general-purpose registers between GDB, inferiors
> --- 128,133 ----
> *************** static const unsigned char linux_syscall
> *** 344,507 ****
> /* Offset to saved processor registers from <asm/ucontext.h> */
> #define LINUX_UCONTEXT_SIGCONTEXT_OFFSET (36)
>
> - /* Resume execution of the inferior process.
> - If STEP is nonzero, single-step it.
> - If SIGNAL is nonzero, give it that signal. */
> -
> - void
> - child_resume (ptid_t ptid, int step, enum target_signal signal)
> - {
> - int pid = PIDGET (ptid);
> - int request = PTRACE_CONT;
> -
> - if (pid == -1)
> - /* Resume all threads. */
> - /* I think this only gets used in the non-threaded case, where "resume
> - all threads" and "resume inferior_ptid" are the same. */
> - pid = PIDGET (inferior_ptid);
> -
> - if (step)
> - {
> - CORE_ADDR pc = read_pc_pid (pid_to_ptid (pid));
> - unsigned char buf[LINUX_SYSCALL_LEN];
> -
> - request = PTRACE_SINGLESTEP;
> -
> - /* Returning from a signal trampoline is done by calling a
> - special system call (sigreturn or rt_sigreturn, see
> - i386-linux-tdep.c for more information). This system call
> - restores the registers that were saved when the signal was
> - raised, including %eflags. That means that single-stepping
> - won't work. Instead, we'll have to modify the signal context
> - that's about to be restored, and set the trace flag there. */
> -
> - /* First check if PC is at a system call. */
> - if (read_memory_nobpt (pc, (char *) buf, LINUX_SYSCALL_LEN) == 0
> - && memcmp (buf, linux_syscall, LINUX_SYSCALL_LEN) == 0)
> - {
> - int syscall =
> - read_register_pid (LINUX_SYSCALL_REGNUM, pid_to_ptid (pid));
> -
> - /* Then check the system call number. */
> - if (syscall == SYS_rt_sigreturn)
> - {
> - CORE_ADDR sp = read_register (SP_REGNUM);
> - CORE_ADDR addr = sp;
> - unsigned long int eflags;
> -
> - addr +=
> - sizeof (struct siginfo) + LINUX_UCONTEXT_SIGCONTEXT_OFFSET;
> -
> - /* Set the trace flag in the context that's about to be
> - restored. */
> - addr += LINUX_SIGCONTEXT_EFLAGS_OFFSET;
> - read_memory (addr, (char *) &eflags, 8);
> - eflags |= 0x0100;
> - write_memory (addr, (char *) &eflags, 8);
> - }
> - }
> - }
> -
> - if (ptrace (request, pid, 0, target_signal_to_host (signal)) == -1)
> - perror_with_name ("ptrace");
> - }
> - \f
> -
> - /* Copy LEN bytes to or from inferior's memory starting at MEMADDR
> - to debugger memory starting at MYADDR. Copy to inferior if
> - WRITE is nonzero. TARGET is ignored.
> -
> - Returns the length copied, which is either the LEN argument or zero.
> - This xfer function does not do partial moves, since child_ops
> - doesn't allow memory operations to cross below us in the target stack
> - anyway. */
> -
> - int
> - child_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
> - struct mem_attrib *attrib, struct target_ops *target)
> - {
> - register int i;
> - /* Round starting address down to longword boundary. */
> - register CORE_ADDR addr = memaddr & -sizeof (PTRACE_XFER_TYPE);
> - /* Round ending address up; get number of longwords that makes. */
> - register int count
> - = (((memaddr + len) - addr) + sizeof (PTRACE_XFER_TYPE) - 1)
> - / sizeof (PTRACE_XFER_TYPE);
> - /* Allocate buffer of that many longwords. */
> - /* FIXME (alloca): This code, cloned from infptrace.c, is unsafe
> - because it uses alloca to allocate a buffer of arbitrary size.
> - For very large xfers, this could crash GDB's stack. */
> - register PTRACE_XFER_TYPE *buffer
> - = (PTRACE_XFER_TYPE *) alloca (count * sizeof (PTRACE_XFER_TYPE));
> -
> - if (write)
> - {
> - /* Fill start and end extra bytes of buffer with existing memory data. */
> - if (addr != memaddr || len < (int) sizeof (PTRACE_XFER_TYPE))
> - {
> - /* Need part of initial word -- fetch it. */
> - buffer[0] = ptrace (PT_READ_I, PIDGET (inferior_ptid),
> - (PTRACE_ARG3_TYPE) addr, 0);
> - }
> -
> - if (count > 1) /* FIXME, avoid if even boundary */
> - {
> - buffer[count - 1] = ptrace (PT_READ_I, PIDGET (inferior_ptid),
> - ((PTRACE_ARG3_TYPE)
> - (addr +
> - (count -
> - 1) * sizeof (PTRACE_XFER_TYPE))), 0);
> - }
> -
> - /* Copy data to be written over corresponding part of buffer */
> -
> - memcpy ((char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)),
> - myaddr, len);
> -
> - /* Write the entire buffer. */
> -
> - for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE))
> - {
> - errno = 0;
> - ptrace (PT_WRITE_D, PIDGET (inferior_ptid),
> - (PTRACE_ARG3_TYPE) addr, buffer[i]);
> - if (errno)
> - {
> - /* Using the appropriate one (I or D) is necessary for
> - Gould NP1, at least. */
> - errno = 0;
> - ptrace (PT_WRITE_I, PIDGET (inferior_ptid),
> - (PTRACE_ARG3_TYPE) addr, buffer[i]);
> - }
> - if (errno)
> - return 0;
> - }
> - #ifdef CLEAR_INSN_CACHE
> - CLEAR_INSN_CACHE ();
> - #endif
> - }
> - else
> - {
> - /* Read all the longwords */
> - for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE))
> - {
> - errno = 0;
> - buffer[i] = ptrace (PT_READ_I, PIDGET (inferior_ptid),
> - (PTRACE_ARG3_TYPE) addr, 0);
> - if (errno)
> - return 0;
> - }
> -
> - /* Copy appropriate bytes out of the buffer. */
> - memcpy (myaddr,
> - (char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)),
> - len);
> - }
> - return len;
> - }
> -
> /* Interpreting register set info found in core files. */
> -
> /* Provide registers to GDB from a core file.
>
> CORE_REG_SECT points to an array of bytes, which are the contents
> --- 342,348 ----
> Index: config/i386/nm-x86-64.h
> ===================================================================
> RCS file: /cvs/src/src/gdb/config/i386/nm-x86-64.h,v
> retrieving revision 1.3
> diff -c -3 -p -r1.3 nm-x86-64.h
> *** config/i386/nm-x86-64.h 24 Feb 2002 22:56:05 -0000 1.3
> --- config/i386/nm-x86-64.h 9 Apr 2002 19:52:17 -0000
> *************** extern int kernel_u_size (void);
> *** 65,74 ****
> to get the offset in the core file of the register values. */
> #define KERNEL_U_ADDR 0x0
>
> - /* FIXME use special child_xfer_memory. */
> - #define CHILD_XFER_MEMORY
> -
> #define PTRACE_ARG3_TYPE void*
> \f
>
> /* We define this if link.h is available, because with ELF we use SVR4 style
> --- 65,72 ----
> to get the offset in the core file of the register values. */
> #define KERNEL_U_ADDR 0x0
>
> #define PTRACE_ARG3_TYPE void*
> + #define PTRACE_XFER_TYPE unsigned long
> \f
>
> /* We define this if link.h is available, because with ELF we use SVR4 style
> *************** extern int kernel_u_size (void);
> *** 81,89 ****
>
> /* Override copies of {fetch,store}_inferior_registers in `infptrace.c'. */
> #define FETCH_INFERIOR_REGISTERS
> -
> - /* Override child_resume in `infptrace.c'. */
> - #define CHILD_RESUME
>
> #undef PREPARE_TO_PROCEED
>
> --- 79,84 ----
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [RFA] x86-64-linux-nat.c cleanup
2002-04-09 13:00 [RFA] x86-64-linux-nat.c cleanup Michal Ludvig
2002-04-09 13:04 ` Michal Ludvig
@ 2002-04-09 13:49 ` Andrew Cagney
1 sibling, 0 replies; 3+ messages in thread
From: Andrew Cagney @ 2002-04-09 13:49 UTC (permalink / raw)
To: Michal Ludvig; +Cc: gdb-patches
> Hi all,
> because x86-64 ptrace() now conforms to standards, I removed our versions of child_resume and child_xfer_memory from x86-64-linux.nat.c and started to use those from infptrace.c. This is an obvious change, but quite large, so I'm sending it for approval first.
> So, can I commit?
>
> Michal Ludvig
Yes, 5.2 branch if you think it helps as well.
Andrew
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2002-04-09 20:49 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-04-09 13:00 [RFA] x86-64-linux-nat.c cleanup Michal Ludvig
2002-04-09 13:04 ` Michal Ludvig
2002-04-09 13:49 ` Andrew Cagney
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox