From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10882 invoked by alias); 9 Apr 2002 20:00:42 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 10863 invoked from network); 9 Apr 2002 20:00:38 -0000 Received: from unknown (HELO kerberos.suse.cz) (195.47.106.10) by sources.redhat.com with SMTP; 9 Apr 2002 20:00:38 -0000 Received: from chimera.suse.cz (chimera.suse.cz [10.20.0.2]) by kerberos.suse.cz (SuSE SMTP server) with ESMTP id 2D8B459D357 for ; Tue, 9 Apr 2002 22:00:37 +0200 (CEST) Received: from suse.cz (leviathan.suse.cz [10.20.1.56]) by chimera.suse.cz (8.11.0/8.11.0/SuSE Linux 8.11.0-0.4) with ESMTP id g39K0bf32610 for ; Tue, 9 Apr 2002 22:00:37 +0200 X-Authentication-Warning: chimera.suse.cz: Host leviathan.suse.cz [10.20.1.56] claimed to be suse.cz Message-ID: <3CB34860.3000704@suse.cz> Date: Tue, 09 Apr 2002 13:00:00 -0000 From: Michal Ludvig Organization: SuSE CR User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.9+) Gecko/20020327 X-Accept-Language: cs, cz, en MIME-Version: 1.0 To: gdb-patches@sources.redhat.com Subject: [RFA] x86-64-linux-nat.c cleanup Content-Type: multipart/mixed; boundary="------------000105020902050503050303" X-SW-Source: 2002-04/txt/msg00367.txt.bz2 This is a multi-part message in MIME format. --------------000105020902050503050303 Content-Type: text/plain; charset=ISO-8859-2; format=flowed Content-Transfer-Encoding: 7bit Content-length: 390 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 --------------000105020902050503050303 Content-Type: text/plain; name="x8664-07.diff" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline; filename="x8664-07.diff" Content-length: 8063 Index: x86-64-linux-nat.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 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 <=3D (regno) && (regno) < x86_64_num_gregs) #define GETFPREGS_SUPPLIES(regno) \ (FP0_REGNUM <=3D (regno) && (regno) <=3D MXCSR_REGNUM) -=20 - #define PTRACE_XFER_TYPE unsigned long =0C =20=20 /* Transfering the general-purpose registers between GDB, inferiors --- 128,133 ---- *************** static const unsigned char linux_syscall *** 344,507 **** /* Offset to saved processor registers from */ #define LINUX_UCONTEXT_SIGCONTEXT_OFFSET (36) =20=20 - /* Resume execution of the inferior process. - If STEP is nonzero, single-step it. - If SIGNAL is nonzero, give it that signal. */ -=20 - void - child_resume (ptid_t ptid, int step, enum target_signal signal) - { - int pid =3D PIDGET (ptid); - int request =3D PTRACE_CONT; -=20 - if (pid =3D=3D -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 =3D PIDGET (inferior_ptid); -=20 - if (step) - { - CORE_ADDR pc =3D read_pc_pid (pid_to_ptid (pid)); - unsigned char buf[LINUX_SYSCALL_LEN]; -=20 - request =3D PTRACE_SINGLESTEP; -=20 - /* 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. */ -=20 - /* First check if PC is at a system call. */ - if (read_memory_nobpt (pc, (char *) buf, LINUX_SYSCALL_LEN) =3D=3D 0 - && memcmp (buf, linux_syscall, LINUX_SYSCALL_LEN) =3D=3D 0) - { - int syscall =3D - read_register_pid (LINUX_SYSCALL_REGNUM, pid_to_ptid (pid)); -=20 - /* Then check the system call number. */ - if (syscall =3D=3D SYS_rt_sigreturn) - { - CORE_ADDR sp =3D read_register (SP_REGNUM); - CORE_ADDR addr =3D sp; - unsigned long int eflags; -=20 - addr +=3D - sizeof (struct siginfo) + LINUX_UCONTEXT_SIGCONTEXT_OFFSET; -=20 - /* Set the trace flag in the context that's about to be - restored. */ - addr +=3D LINUX_SIGCONTEXT_EFLAGS_OFFSET; - read_memory (addr, (char *) &eflags, 8); - eflags |=3D 0x0100; - write_memory (addr, (char *) &eflags, 8); - } - } - } -=20 - if (ptrace (request, pid, 0, target_signal_to_host (signal)) =3D=3D -1) - perror_with_name ("ptrace"); - } - =0C -=20 - /* 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. -=20 - 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. */ -=20 - 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 =3D memaddr & -sizeof (PTRACE_XFER_TYPE); - /* Round ending address up; get number of longwords that makes. */ - register int count - =3D (((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 - =3D (PTRACE_XFER_TYPE *) alloca (count * sizeof (PTRACE_XFER_TYPE)); -=20 - if (write) - { - /* Fill start and end extra bytes of buffer with existing memory da= ta. */ - if (addr !=3D memaddr || len < (int) sizeof (PTRACE_XFER_TYPE)) - { - /* Need part of initial word -- fetch it. */ - buffer[0] =3D ptrace (PT_READ_I, PIDGET (inferior_ptid), - (PTRACE_ARG3_TYPE) addr, 0); - } -=20 - if (count > 1) /* FIXME, avoid if even boundary */ - { - buffer[count - 1] =3D ptrace (PT_READ_I, PIDGET (inferior_ptid), - ((PTRACE_ARG3_TYPE) - (addr + - (count - - 1) * sizeof (PTRACE_XFER_TYPE))), 0); - } -=20 - /* Copy data to be written over corresponding part of buffer */ -=20 - memcpy ((char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1= )), - myaddr, len); -=20 - /* Write the entire buffer. */ -=20 - for (i =3D 0; i < count; i++, addr +=3D sizeof (PTRACE_XFER_TYPE)) - { - errno =3D 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 =3D 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 =3D 0; i < count; i++, addr +=3D sizeof (PTRACE_XFER_TYPE)) - { - errno =3D 0; - buffer[i] =3D ptrace (PT_READ_I, PIDGET (inferior_ptid), - (PTRACE_ARG3_TYPE) addr, 0); - if (errno) - return 0; - } -=20 - /* Copy appropriate bytes out of the buffer. */ - memcpy (myaddr, - (char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)), - len); - } - return len; - } -=20 /* Interpreting register set info found in core files. */ -=20 /* Provide registers to GDB from a core file. =20=20 CORE_REG_SECT points to an array of bytes, which are the contents --- 342,348 ---- Index: config/i386/nm-x86-64.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 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 =20=20 - /* FIXME use special child_xfer_memory. */ - #define CHILD_XFER_MEMORY -=20 #define PTRACE_ARG3_TYPE void* =0C =20=20 /* We define this if link.h is available, because with ELF we use SVR4 st= yle --- 65,72 ---- to get the offset in the core file of the register values. */ #define KERNEL_U_ADDR 0x0 =20=20 #define PTRACE_ARG3_TYPE void* + #define PTRACE_XFER_TYPE unsigned long =0C =20=20 /* We define this if link.h is available, because with ELF we use SVR4 st= yle *************** extern int kernel_u_size (void); *** 81,89 **** =20=20 /* Override copies of {fetch,store}_inferior_registers in `infptrace.c'. = */ #define FETCH_INFERIOR_REGISTERS -=20 - /* Override child_resume in `infptrace.c'. */ - #define CHILD_RESUME =20=20 #undef PREPARE_TO_PROCEED =20=20 --- 79,84 ---- --------------000105020902050503050303--