X-Git-Url: https://repo.jachan.dev/binutils.git/blobdiff_plain/44ff4c96a41453391514afcd9bd306c68b3355fa..9c38eb65ac759526a693246efbc70d6f4b590a9d:/gdb/infptrace.c diff --git a/gdb/infptrace.c b/gdb/infptrace.c index 9e9f508c15..aafbd85f64 100644 --- a/gdb/infptrace.c +++ b/gdb/infptrace.c @@ -1,5 +1,5 @@ /* Low level Unix child interface to ptrace, for GDB when running under Unix. - Copyright (C) 1988, 1989, 1990, 1991 Free Software Foundation, Inc. + Copyright 1988, 1989, 1990, 1991, 1992 Free Software Foundation, Inc. This file is part of GDB. @@ -17,9 +17,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include #include "defs.h" -#include "param.h" #include "frame.h" #include "inferior.h" #include "target.h" @@ -32,9 +30,14 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include -#ifndef USG + +#ifndef NO_PTRACE_H +#ifdef PTRACE_IN_WRONG_PLACE +#include +#else #include #endif +#endif /* NO_PTRACE_H */ #if !defined (PT_KILL) #define PT_KILL 8 @@ -56,22 +59,32 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #endif #include "gdbcore.h" +#ifndef NO_SYS_FILE #include +#endif #include +#if defined (FIVE_ARG_PTRACE +/* Deal with HPUX 8.0 braindamage. */ +#define ptrace(a,b,c,d) ptrace(a,b,c,d,0) +#endif + #if !defined (FETCH_INFERIOR_REGISTERS) #include /* Probably need to poke the user structure */ #if defined (KERNEL_U_ADDR_BSD) #include /* For struct nlist */ #endif /* KERNEL_U_ADDR_BSD. */ #endif /* !FETCH_INFERIOR_REGISTERS */ + /* This function simply calls ptrace with the given arguments. It exists so that all calls to ptrace are isolated in this machine-dependent file. */ int call_ptrace (request, pid, addr, data) - int request, pid, *addr, data; + int request, pid; + PTRACE_ARG3_TYPE addr; + int data; { return ptrace (request, pid, addr, data); } @@ -82,23 +95,16 @@ call_ptrace (request, pid, addr, data) #define ptrace call_ptrace #endif -/* This is used when GDB is exiting. It gives less chance of error.*/ - void -kill_inferior_fast () +kill_inferior () { if (inferior_pid == 0) return; - ptrace (PT_KILL, inferior_pid, 0, 0); + /* ptrace PT_KILL only works if process is stopped!!! So stop it with + a real signal first, if we can. */ + kill (inferior_pid, SIGKILL); + ptrace (PT_KILL, inferior_pid, (PTRACE_ARG3_TYPE) 0, 0); wait ((int *)0); -} - -void -kill_inferior (args, from_tty) - char *args; - int from_tty; -{ - kill_inferior_fast (); target_mourn_inferior (); } @@ -113,31 +119,32 @@ child_resume (step, signal) { errno = 0; - /* An address of (int *)1 tells ptrace to continue from where it was. - (If GDB wanted it to start some other way, we have already written - a new PC value to the child.) */ + /* An address of (PTRACE_ARG3_TYPE)1 tells ptrace to continue from where + it was. (If GDB wanted it to start some other way, we have already + written a new PC value to the child.) + + If this system does not support PT_STEP, a higher level function will + have called single_step() to transmute the step request into a + continue request (by setting breakpoints on all possible successor + instructions), so we don't have to worry about that here. */ if (step) - ptrace (PT_STEP, inferior_pid, (int *)1, signal); + ptrace (PT_STEP, inferior_pid, (PTRACE_ARG3_TYPE) 1, signal); else - ptrace (PT_CONTINUE, inferior_pid, (int *)1, signal); + ptrace (PT_CONTINUE, inferior_pid, (PTRACE_ARG3_TYPE) 1, signal); if (errno) perror_with_name ("ptrace"); } #ifdef ATTACH_DETACH -/* Nonzero if we are debugging an attached process rather than - an inferior. */ -extern int attach_flag; - /* Start debugging the process whose number is PID. */ int attach (pid) int pid; { errno = 0; - ptrace (PT_ATTACH, pid, 0, 0); + ptrace (PT_ATTACH, pid, (PTRACE_ARG3_TYPE) 0, 0); if (errno) perror_with_name ("ptrace"); attach_flag = 1; @@ -153,7 +160,7 @@ detach (signal) int signal; { errno = 0; - ptrace (PT_DETACH, inferior_pid, 1, signal); + ptrace (PT_DETACH, inferior_pid, (PTRACE_ARG3_TYPE) 1, signal); if (errno) perror_with_name ("ptrace"); attach_flag = 0; @@ -167,7 +174,6 @@ detach (signal) #if defined (KERNEL_U_ADDR_BSD) /* Get kernel_u_addr using BSD-style nlist(). */ CORE_ADDR kernel_u_addr; -#include /* For struct nlist */ void _initialize_kernel_u_addr () @@ -213,7 +219,8 @@ void _initialize_kernel_u_addr () #if !defined (U_REGS_OFFSET) #define U_REGS_OFFSET \ ptrace (PT_READ_U, inferior_pid, \ - (int *)(offsetof (struct user, u_ar0)), 0) - KERNEL_U_ADDR + (PTRACE_ARG3_TYPE) (offsetof (struct user, u_ar0)), 0) \ + - KERNEL_U_ADDR #endif /* Registers we shouldn't try to fetch. */ @@ -248,7 +255,8 @@ fetch_register (regno) for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof (int)) { errno = 0; - *(int *) &buf[i] = ptrace (PT_READ_U, inferior_pid, (int *)regaddr, 0); + *(int *) &buf[i] = ptrace (PT_READ_U, inferior_pid, + (PTRACE_ARG3_TYPE) regaddr, 0); regaddr += sizeof (int); if (errno != 0) { @@ -282,7 +290,7 @@ fetch_inferior_registers (regno) If REGNO is -1, do this for all registers. Otherwise, REGNO specifies which register (so we can save time). */ -int +void store_inferior_registers (regno) int regno; { @@ -290,7 +298,6 @@ store_inferior_registers (regno) char buf[80]; extern char registers[]; register int i; - int result = 0; unsigned int offset = U_REGS_OFFSET; @@ -300,13 +307,12 @@ store_inferior_registers (regno) for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof(int)) { errno = 0; - ptrace (PT_WRITE_U, inferior_pid, (int *)regaddr, + ptrace (PT_WRITE_U, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, *(int *) ®isters[REGISTER_BYTE (regno) + i]); if (errno != 0) { sprintf (buf, "writing register number %d(%d)", regno, i); perror_with_name (buf); - result = -1; } regaddr += sizeof(int); } @@ -321,19 +327,17 @@ store_inferior_registers (regno) for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof(int)) { errno = 0; - ptrace (PT_WRITE_U, inferior_pid, (int *)regaddr, + ptrace (PT_WRITE_U, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, *(int *) ®isters[REGISTER_BYTE (regno) + i]); if (errno != 0) { sprintf (buf, "writing register number %d(%d)", regno, i); perror_with_name (buf); - result = -1; } regaddr += sizeof(int); } } } - return result; } #endif /* !defined (FETCH_INFERIOR_REGISTERS). */ @@ -358,7 +362,7 @@ child_xfer_memory (memaddr, myaddr, len, write, target) char *myaddr; int len; int write; - struct target_ops target; /* ignored */ + struct target_ops *target; /* ignored */ { register int i; /* Round starting address down to longword boundary. */ @@ -375,32 +379,36 @@ child_xfer_memory (memaddr, myaddr, len, write, target) if (addr != memaddr || len < (int)sizeof (int)) { /* Need part of initial word -- fetch it. */ - buffer[0] = ptrace (PT_READ_I, inferior_pid, (int *)addr, 0); + buffer[0] = ptrace (PT_READ_I, inferior_pid, (PTRACE_ARG3_TYPE) addr, + 0); } if (count > 1) /* FIXME, avoid if even boundary */ { buffer[count - 1] = ptrace (PT_READ_I, inferior_pid, - (int *)(addr + (count - 1) * sizeof (int)), 0); + (PTRACE_ARG3_TYPE) (addr + (count - 1) * sizeof (int)), + 0); } /* Copy data to be written over corresponding part of buffer */ - bcopy (myaddr, (char *) buffer + (memaddr & (sizeof (int) - 1)), len); + memcpy ((char *) buffer + (memaddr & (sizeof (int) - 1)), myaddr, len); /* Write the entire buffer. */ for (i = 0; i < count; i++, addr += sizeof (int)) { errno = 0; - ptrace (PT_WRITE_D, inferior_pid, (int *)addr, buffer[i]); + ptrace (PT_WRITE_D, inferior_pid, (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, inferior_pid, (int *)addr, buffer[i]); + ptrace (PT_WRITE_I, inferior_pid, (PTRACE_ARG3_TYPE) addr, + buffer[i]); } if (errno) return 0; @@ -412,14 +420,15 @@ child_xfer_memory (memaddr, myaddr, len, write, target) for (i = 0; i < count; i++, addr += sizeof (int)) { errno = 0; - buffer[i] = ptrace (PT_READ_I, inferior_pid, (int *)addr, 0); + buffer[i] = ptrace (PT_READ_I, inferior_pid, + (PTRACE_ARG3_TYPE) addr, 0); if (errno) return 0; QUIT; } /* Copy appropriate bytes out of the buffer. */ - bcopy ((char *) buffer + (memaddr & (sizeof (int) - 1)), myaddr, len); + memcpy (myaddr, (char *) buffer + (memaddr & (sizeof (int) - 1)), len); } return len; }