X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fgdbserver%2Flow-lynx.c;h=d16201ed9827b615901bb06f570e57099c551401;hb=fba45db2faf619e71856ee38ec63949c0ef6903e;hp=349f702c60fa163941763044a05fdaeeff6398cd;hpb=b292fca800177d0aef7d73a8c99951a974861050;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbserver/low-lynx.c b/gdb/gdbserver/low-lynx.c index 349f702c60..d16201ed98 100644 --- a/gdb/gdbserver/low-lynx.c +++ b/gdb/gdbserver/low-lynx.c @@ -1,21 +1,22 @@ /* Low level interface to ptrace, for the remote server for GDB. Copyright (C) 1986, 1987, 1993 Free Software Foundation, Inc. -This file is part of GDB. + This file is part of GDB. -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. -This program 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 General Public License for more details. + This program 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 General Public License for more details. -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. */ + 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., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include "server.h" #include "frame.h" @@ -43,7 +44,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include -char registers[REGISTER_BYTES]; +static char my_registers[REGISTER_BYTES]; +char *registers = my_registers; #include @@ -51,9 +53,7 @@ char registers[REGISTER_BYTES]; ALLARGS is a vector of program-name and args. */ int -create_inferior (program, allargs) - char *program; - char **allargs; +create_inferior (char *program, char **allargs) { int pid; @@ -66,18 +66,18 @@ create_inferior (program, allargs) int pgrp; /* Switch child to it's own process group so that signals won't - directly affect gdbserver. */ + directly affect gdbserver. */ - pgrp = getpid(); - setpgrp(0, pgrp); + pgrp = getpid (); + setpgrp (0, pgrp); ioctl (0, TIOCSPGRP, &pgrp); - ptrace (PTRACE_TRACEME); + ptrace (PTRACE_TRACEME, 0, (PTRACE_ARG3_TYPE) 0, 0); execv (program, allargs); fprintf (stderr, "GDBserver (process %d): Cannot exec %s: %s.\n", - getpid(), program, + getpid (), program, errno < sys_nerr ? sys_errlist[errno] : "unknown error"); fflush (stderr); _exit (0177); @@ -89,7 +89,7 @@ create_inferior (program, allargs) /* Kill the inferior process. Make us have no inferior. */ void -kill_inferior () +kill_inferior (void) { if (inferior_pid == 0) return; @@ -99,42 +99,81 @@ kill_inferior () inferior_pid = 0; } +/* Return nonzero if the given thread is still alive. */ +int +mythread_alive (int pid) +{ + /* Arggh. Apparently pthread_kill only works for threads within + the process that calls pthread_kill. + + We want to avoid the lynx signal extensions as they simply don't + map well to the generic gdb interface we want to keep. + + All we want to do is determine if a particular thread is alive; + it appears as if we can just make a harmless thread specific + ptrace call to do that. */ + return (ptrace (PTRACE_THREADUSER, + BUILDPID (PIDGET (inferior_pid), pid), 0, 0) != -1); +} + /* Wait for process, returns status */ unsigned char -mywait (status) - char *status; +mywait (char *status) { int pid; union wait w; - enable_async_io(); + while (1) + { + enable_async_io (); + + pid = wait (&w); + + disable_async_io (); - pid = wait (&w); + if (pid != PIDGET (inferior_pid)) + perror_with_name ("wait"); - disable_async_io(); + thread_from_wait = w.w_tid; + inferior_pid = BUILDPID (inferior_pid, w.w_tid); - if (pid != PIDGET(inferior_pid)) - perror_with_name ("wait"); + if (WIFSTOPPED (w) + && WSTOPSIG (w) == SIGTRAP) + { + int realsig; - inferior_pid = BUILDPID (inferior_pid, w.w_tid); + realsig = ptrace (PTRACE_GETTRACESIG, inferior_pid, + (PTRACE_ARG3_TYPE) 0, 0); + + if (realsig == SIGNEWTHREAD) + { + /* It's a new thread notification. Nothing to do here since + the machine independent code in wait_for_inferior will + add the thread to the thread list and restart the thread + when pid != inferior_pid and pid is not in the thread list. + We don't even want to muck with realsig -- the code in + wait_for_inferior expects SIGTRAP. */ + ; + } + } + break; + } if (WIFEXITED (w)) { - fprintf (stderr, "\nChild exited with status %d\n", WEXITSTATUS (w)); - fprintf (stderr, "GDBserver exiting\n"); - exit (0); + *status = 'W'; + return ((unsigned char) WEXITSTATUS (w)); } else if (!WIFSTOPPED (w)) { - fprintf (stderr, "\nChild terminated with signal = %x \n", WTERMSIG (w)); - *status = 'T'; + *status = 'X'; return ((unsigned char) WTERMSIG (w)); } fetch_inferior_registers (0); - *status = 'S'; + *status = 'T'; return ((unsigned char) WSTOPSIG (w)); } @@ -143,12 +182,12 @@ mywait (status) If SIGNAL is nonzero, give it that signal. */ void -myresume (step, signal) - int step; - int signal; +myresume (int step, int signal) { errno = 0; - ptrace (step ? PTRACE_SINGLESTEP : PTRACE_CONT, inferior_pid, 1, signal); + ptrace (step ? PTRACE_SINGLESTEP_ONE : PTRACE_CONT, + BUILDPID (inferior_pid, cont_thread == -1 ? 0 : cont_thread), + 1, signal); if (errno) perror_with_name ("ptrace"); } @@ -166,22 +205,22 @@ myresume (step, signal) static int regmap[] = { - X(eax), - X(ecx), - X(edx), - X(ebx), - X(esp), /* sp */ - X(ebp), /* fp */ - X(esi), - X(edi), - X(eip), /* pc */ - X(flags), /* ps */ - X(cs), - X(ss), - X(ds), - X(es), - X(ecode), /* Lynx doesn't give us either fs or gs, so */ - X(fault), /* we just substitute these two in the hopes + X (eax), + X (ecx), + X (edx), + X (ebx), + X (esp), /* sp */ + X (ebp), /* fp */ + X (esi), + X (edi), + X (eip), /* pc */ + X (flags), /* ps */ + X (cs), + X (ss), + X (ds), + X (es), + X (ecode), /* Lynx doesn't give us either fs or gs, so */ + X (fault), /* we just substitute these two in the hopes that they are useful. */ }; #endif @@ -191,39 +230,39 @@ static int regmap[] = static int regmap[] = { - X(regs[0]), /* d0 */ - X(regs[1]), /* d1 */ - X(regs[2]), /* d2 */ - X(regs[3]), /* d3 */ - X(regs[4]), /* d4 */ - X(regs[5]), /* d5 */ - X(regs[6]), /* d6 */ - X(regs[7]), /* d7 */ - X(regs[8]), /* a0 */ - X(regs[9]), /* a1 */ - X(regs[10]), /* a2 */ - X(regs[11]), /* a3 */ - X(regs[12]), /* a4 */ - X(regs[13]), /* a5 */ - X(regs[14]), /* fp */ + X (regs[0]), /* d0 */ + X (regs[1]), /* d1 */ + X (regs[2]), /* d2 */ + X (regs[3]), /* d3 */ + X (regs[4]), /* d4 */ + X (regs[5]), /* d5 */ + X (regs[6]), /* d6 */ + X (regs[7]), /* d7 */ + X (regs[8]), /* a0 */ + X (regs[9]), /* a1 */ + X (regs[10]), /* a2 */ + X (regs[11]), /* a3 */ + X (regs[12]), /* a4 */ + X (regs[13]), /* a5 */ + X (regs[14]), /* fp */ 0, /* sp */ - X(status), /* ps */ - X(pc), - - X(fregs[0*3]), /* fp0 */ - X(fregs[1*3]), /* fp1 */ - X(fregs[2*3]), /* fp2 */ - X(fregs[3*3]), /* fp3 */ - X(fregs[4*3]), /* fp4 */ - X(fregs[5*3]), /* fp5 */ - X(fregs[6*3]), /* fp6 */ - X(fregs[7*3]), /* fp7 */ - - X(fcregs[0]), /* fpcontrol */ - X(fcregs[1]), /* fpstatus */ - X(fcregs[2]), /* fpiaddr */ - X(ssw), /* fpcode */ - X(fault), /* fpflags */ + X (status), /* ps */ + X (pc), + + X (fregs[0 * 3]), /* fp0 */ + X (fregs[1 * 3]), /* fp1 */ + X (fregs[2 * 3]), /* fp2 */ + X (fregs[3 * 3]), /* fp3 */ + X (fregs[4 * 3]), /* fp4 */ + X (fregs[5 * 3]), /* fp5 */ + X (fregs[6 * 3]), /* fp6 */ + X (fregs[7 * 3]), /* fp7 */ + + X (fcregs[0]), /* fpcontrol */ + X (fcregs[1]), /* fpstatus */ + X (fcregs[2]), /* fpiaddr */ + X (ssw), /* fpcode */ + X (fault), /* fpflags */ }; #endif @@ -235,67 +274,67 @@ static int regmap[] = static int regmap[] = { -1, /* g0 */ - X(g1), - X(g2), - X(g3), - X(g4), + X (g1), + X (g2), + X (g3), + X (g4), -1, /* g5->g7 aren't saved by Lynx */ -1, -1, - X(o[0]), - X(o[1]), - X(o[2]), - X(o[3]), - X(o[4]), - X(o[5]), - X(o[6]), /* sp */ - X(o[7]), /* ra */ - - -1,-1,-1,-1,-1,-1,-1,-1, /* l0 -> l7 */ - - -1,-1,-1,-1,-1,-1,-1,-1, /* i0 -> i7 */ - - FX(f.fregs[0]), /* f0 */ - FX(f.fregs[1]), - FX(f.fregs[2]), - FX(f.fregs[3]), - FX(f.fregs[4]), - FX(f.fregs[5]), - FX(f.fregs[6]), - FX(f.fregs[7]), - FX(f.fregs[8]), - FX(f.fregs[9]), - FX(f.fregs[10]), - FX(f.fregs[11]), - FX(f.fregs[12]), - FX(f.fregs[13]), - FX(f.fregs[14]), - FX(f.fregs[15]), - FX(f.fregs[16]), - FX(f.fregs[17]), - FX(f.fregs[18]), - FX(f.fregs[19]), - FX(f.fregs[20]), - FX(f.fregs[21]), - FX(f.fregs[22]), - FX(f.fregs[23]), - FX(f.fregs[24]), - FX(f.fregs[25]), - FX(f.fregs[26]), - FX(f.fregs[27]), - FX(f.fregs[28]), - FX(f.fregs[29]), - FX(f.fregs[30]), - FX(f.fregs[31]), - - X(y), - X(psr), - X(wim), - X(tbr), - X(pc), - X(npc), - FX(fsr), /* fpsr */ + X (o[0]), + X (o[1]), + X (o[2]), + X (o[3]), + X (o[4]), + X (o[5]), + X (o[6]), /* sp */ + X (o[7]), /* ra */ + + -1, -1, -1, -1, -1, -1, -1, -1, /* l0 -> l7 */ + + -1, -1, -1, -1, -1, -1, -1, -1, /* i0 -> i7 */ + + FX (f.fregs[0]), /* f0 */ + FX (f.fregs[1]), + FX (f.fregs[2]), + FX (f.fregs[3]), + FX (f.fregs[4]), + FX (f.fregs[5]), + FX (f.fregs[6]), + FX (f.fregs[7]), + FX (f.fregs[8]), + FX (f.fregs[9]), + FX (f.fregs[10]), + FX (f.fregs[11]), + FX (f.fregs[12]), + FX (f.fregs[13]), + FX (f.fregs[14]), + FX (f.fregs[15]), + FX (f.fregs[16]), + FX (f.fregs[17]), + FX (f.fregs[18]), + FX (f.fregs[19]), + FX (f.fregs[20]), + FX (f.fregs[21]), + FX (f.fregs[22]), + FX (f.fregs[23]), + FX (f.fregs[24]), + FX (f.fregs[25]), + FX (f.fregs[26]), + FX (f.fregs[27]), + FX (f.fregs[28]), + FX (f.fregs[29]), + FX (f.fregs[30]), + FX (f.fregs[31]), + + X (y), + X (psr), + X (wim), + X (tbr), + X (pc), + X (npc), + FX (fsr), /* fpsr */ -1, /* cpsr */ }; #endif @@ -307,8 +346,7 @@ static int regmap[] = It also handles knows where to find the I & L regs on the stack. */ void -fetch_inferior_registers (regno) - int regno; +fetch_inferior_registers (int regno) { #if 0 int whatregs = 0; @@ -328,31 +366,33 @@ fetch_inferior_registers (regno) if (whatregs & WHATREGS_GEN) { - struct econtext ec; /* general regs */ + struct econtext ec; /* general regs */ char buf[MAX_REGISTER_RAW_SIZE]; int retval; int i; errno = 0; - retval = ptrace (PTRACE_GETREGS, inferior_pid, (PTRACE_ARG3_TYPE) &ec, + retval = ptrace (PTRACE_GETREGS, + BUILDPID (inferior_pid, general_thread), + (PTRACE_ARG3_TYPE) & ec, 0); if (errno) perror_with_name ("Sparc fetch_inferior_registers(ptrace)"); - + memset (buf, 0, REGISTER_RAW_SIZE (G0_REGNUM)); supply_register (G0_REGNUM, buf); - supply_register (TBR_REGNUM, (char *)&ec.tbr); + supply_register (TBR_REGNUM, (char *) &ec.tbr); memcpy (®isters[REGISTER_BYTE (G1_REGNUM)], &ec.g1, 4 * REGISTER_RAW_SIZE (G1_REGNUM)); for (i = G1_REGNUM; i <= G1_REGNUM + 3; i++) register_valid[i] = 1; - supply_register (PS_REGNUM, (char *)&ec.psr); - supply_register (Y_REGNUM, (char *)&ec.y); - supply_register (PC_REGNUM, (char *)&ec.pc); - supply_register (NPC_REGNUM, (char *)&ec.npc); - supply_register (WIM_REGNUM, (char *)&ec.wim); + supply_register (PS_REGNUM, (char *) &ec.psr); + supply_register (Y_REGNUM, (char *) &ec.y); + supply_register (PC_REGNUM, (char *) &ec.pc); + supply_register (NPC_REGNUM, (char *) &ec.npc); + supply_register (WIM_REGNUM, (char *) &ec.wim); memcpy (®isters[REGISTER_BYTE (O0_REGNUM)], ec.o, 8 * REGISTER_RAW_SIZE (O0_REGNUM)); @@ -368,13 +408,13 @@ fetch_inferior_registers (regno) sp = read_register (SP_REGNUM); target_xfer_memory (sp + FRAME_SAVED_I0, - ®isters[REGISTER_BYTE(I0_REGNUM)], + ®isters[REGISTER_BYTE (I0_REGNUM)], 8 * REGISTER_RAW_SIZE (I0_REGNUM), 0); for (i = I0_REGNUM; i <= I7_REGNUM; i++) register_valid[i] = 1; target_xfer_memory (sp + FRAME_SAVED_L0, - ®isters[REGISTER_BYTE(L0_REGNUM)], + ®isters[REGISTER_BYTE (L0_REGNUM)], 8 * REGISTER_RAW_SIZE (L0_REGNUM), 0); for (i = L0_REGNUM; i <= L0_REGNUM + 7; i++) register_valid[i] = 1; @@ -382,22 +422,22 @@ fetch_inferior_registers (regno) if (whatregs & WHATREGS_FLOAT) { - struct fcontext fc; /* fp regs */ + struct fcontext fc; /* fp regs */ int retval; int i; errno = 0; - retval = ptrace (PTRACE_GETFPREGS, inferior_pid, (PTRACE_ARG3_TYPE) &fc, + retval = ptrace (PTRACE_GETFPREGS, BUILDPID (inferior_pid, general_thread), (PTRACE_ARG3_TYPE) & fc, 0); if (errno) perror_with_name ("Sparc fetch_inferior_registers(ptrace)"); - + memcpy (®isters[REGISTER_BYTE (FP0_REGNUM)], fc.f.fregs, 32 * REGISTER_RAW_SIZE (FP0_REGNUM)); for (i = FP0_REGNUM; i <= FP0_REGNUM + 31; i++) register_valid[i] = 1; - supply_register (FPS_REGNUM, (char *)&fc.fsr); + supply_register (FPS_REGNUM, (char *) &fc.fsr); } #endif } @@ -410,8 +450,7 @@ fetch_inferior_registers (regno) this point. */ void -store_inferior_registers (regno) - int regno; +store_inferior_registers (int regno) { #if 0 int whatregs = 0; @@ -429,7 +468,7 @@ store_inferior_registers (regno) if (whatregs & WHATREGS_GEN) { - struct econtext ec; /* general regs */ + struct econtext ec; /* general regs */ int retval; ec.tbr = read_register (TBR_REGNUM); @@ -446,7 +485,7 @@ store_inferior_registers (regno) 8 * REGISTER_RAW_SIZE (O0_REGNUM)); errno = 0; - retval = ptrace (PTRACE_SETREGS, inferior_pid, (PTRACE_ARG3_TYPE) &ec, + retval = ptrace (PTRACE_SETREGS, BUILDPID (inferior_pid, general_thread), (PTRACE_ARG3_TYPE) & ec, 0); if (errno) perror_with_name ("Sparc fetch_inferior_registers(ptrace)"); @@ -461,8 +500,8 @@ store_inferior_registers (regno) if (regno == -1 || regno == SP_REGNUM) { - if (!register_valid[L0_REGNUM+5]) - abort(); + if (!register_valid[L0_REGNUM + 5]) + abort (); target_xfer_memory (sp + FRAME_SAVED_I0, ®isters[REGISTER_BYTE (I0_REGNUM)], 8 * REGISTER_RAW_SIZE (I0_REGNUM), 1); @@ -474,7 +513,7 @@ store_inferior_registers (regno) else if (regno >= L0_REGNUM && regno <= I7_REGNUM) { if (!register_valid[regno]) - abort(); + abort (); if (regno >= L0_REGNUM && regno <= L0_REGNUM + 7) regoffset = REGISTER_BYTE (regno) - REGISTER_BYTE (L0_REGNUM) + FRAME_SAVED_L0; @@ -488,27 +527,27 @@ store_inferior_registers (regno) if (whatregs & WHATREGS_FLOAT) { - struct fcontext fc; /* fp regs */ + struct fcontext fc; /* fp regs */ int retval; /* We read fcontext first so that we can get good values for fq_t... */ errno = 0; - retval = ptrace (PTRACE_GETFPREGS, inferior_pid, (PTRACE_ARG3_TYPE) &fc, + retval = ptrace (PTRACE_GETFPREGS, BUILDPID (inferior_pid, general_thread), (PTRACE_ARG3_TYPE) & fc, 0); if (errno) perror_with_name ("Sparc fetch_inferior_registers(ptrace)"); - + memcpy (fc.f.fregs, ®isters[REGISTER_BYTE (FP0_REGNUM)], 32 * REGISTER_RAW_SIZE (FP0_REGNUM)); fc.fsr = read_register (FPS_REGNUM); errno = 0; - retval = ptrace (PTRACE_SETFPREGS, inferior_pid, (PTRACE_ARG3_TYPE) &fc, + retval = ptrace (PTRACE_SETFPREGS, BUILDPID (inferior_pid, general_thread), (PTRACE_ARG3_TYPE) & fc, 0); if (errno) perror_with_name ("Sparc fetch_inferior_registers(ptrace)"); - } + } #endif } #endif /* SPARC */ @@ -519,20 +558,20 @@ store_inferior_registers (regno) saved context block. */ static unsigned long -lynx_registers_addr() +lynx_registers_addr (void) { CORE_ADDR stblock; - int ecpoff = offsetof(st_t, ecp); + int ecpoff = offsetof (st_t, ecp); CORE_ADDR ecp; errno = 0; - stblock = (CORE_ADDR) ptrace (PTRACE_THREADUSER, inferior_pid, - (PTRACE_ARG3_TYPE)0, 0); + stblock = (CORE_ADDR) ptrace (PTRACE_THREADUSER, BUILDPID (inferior_pid, general_thread), + (PTRACE_ARG3_TYPE) 0, 0); if (errno) perror_with_name ("PTRACE_THREADUSER"); - ecp = (CORE_ADDR) ptrace (PTRACE_PEEKTHREAD, inferior_pid, - (PTRACE_ARG3_TYPE)ecpoff, 0); + ecp = (CORE_ADDR) ptrace (PTRACE_PEEKTHREAD, BUILDPID (inferior_pid, general_thread), + (PTRACE_ARG3_TYPE) ecpoff, 0); if (errno) perror_with_name ("lynx_registers_addr(PTRACE_PEEKTHREAD)"); @@ -544,14 +583,13 @@ lynx_registers_addr() marking them as valid so we won't fetch them again. */ void -fetch_inferior_registers (ignored) - int ignored; +fetch_inferior_registers (int ignored) { int regno; unsigned long reg; unsigned long ecp; - ecp = lynx_registers_addr(); + ecp = lynx_registers_addr (); for (regno = 0; regno < NUM_REGS; regno++) { @@ -562,12 +600,12 @@ fetch_inferior_registers (ignored) #endif errno = 0; - reg = ptrace (ptrace_fun, inferior_pid, + reg = ptrace (ptrace_fun, BUILDPID (inferior_pid, general_thread), (PTRACE_ARG3_TYPE) (ecp + regmap[regno]), 0); if (errno) perror_with_name ("fetch_inferior_registers(PTRACE_PEEKTHREAD)"); - - *(unsigned long *)®isters[REGISTER_BYTE (regno)] = reg; + + *(unsigned long *) ®isters[REGISTER_BYTE (regno)] = reg; } } @@ -576,14 +614,13 @@ fetch_inferior_registers (ignored) Otherwise, REGNO specifies which register (so we can save time). */ void -store_inferior_registers (ignored) - int ignored; +store_inferior_registers (int ignored) { int regno; unsigned long reg; unsigned long ecp; - ecp = lynx_registers_addr(); + ecp = lynx_registers_addr (); for (regno = 0; regno < NUM_REGS; regno++) { @@ -593,10 +630,10 @@ store_inferior_registers (ignored) ptrace_fun = regno == SP_REGNUM ? PTRACE_POKEUSP : PTRACE_POKEUSER; #endif - reg = *(unsigned long *)®isters[REGISTER_BYTE (regno)]; + reg = *(unsigned long *) ®isters[REGISTER_BYTE (regno)]; errno = 0; - ptrace (ptrace_fun, inferior_pid, + ptrace (ptrace_fun, BUILDPID (inferior_pid, general_thread), (PTRACE_ARG3_TYPE) (ecp + regmap[regno]), reg); if (errno) perror_with_name ("PTRACE_POKEUSER"); @@ -615,10 +652,7 @@ store_inferior_registers (ignored) to debugger memory starting at MYADDR. */ void -read_inferior_memory (memaddr, myaddr, len) - CORE_ADDR memaddr; - char *myaddr; - int len; +read_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len) { register int i; /* Round starting address down to longword boundary. */ @@ -632,7 +666,7 @@ read_inferior_memory (memaddr, myaddr, len) /* Read all the longwords */ for (i = 0; i < count; i++, addr += sizeof (int)) { - buffer[i] = ptrace (PTRACE_PEEKTEXT, inferior_pid, addr, 0); + buffer[i] = ptrace (PTRACE_PEEKTEXT, BUILDPID (inferior_pid, general_thread), addr, 0); } /* Copy appropriate bytes out of the buffer. */ @@ -645,10 +679,7 @@ read_inferior_memory (memaddr, myaddr, len) returns the value of errno. */ int -write_inferior_memory (memaddr, myaddr, len) - CORE_ADDR memaddr; - char *myaddr; - int len; +write_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len) { register int i; /* Round starting address down to longword boundary. */ @@ -662,12 +693,12 @@ write_inferior_memory (memaddr, myaddr, len) /* Fill start and end extra bytes of buffer with existing memory data. */ - buffer[0] = ptrace (PTRACE_PEEKTEXT, inferior_pid, addr, 0); + buffer[0] = ptrace (PTRACE_PEEKTEXT, BUILDPID (inferior_pid, general_thread), addr, 0); if (count > 1) { buffer[count - 1] - = ptrace (PTRACE_PEEKTEXT, inferior_pid, + = ptrace (PTRACE_PEEKTEXT, BUILDPID (inferior_pid, general_thread), addr + (count - 1) * sizeof (int), 0); } @@ -682,12 +713,15 @@ write_inferior_memory (memaddr, myaddr, len) while (1) { errno = 0; - ptrace (PTRACE_POKETEXT, inferior_pid, addr, buffer[i]); + ptrace (PTRACE_POKETEXT, BUILDPID (inferior_pid, general_thread), addr, buffer[i]); if (errno) { - fprintf(stderr, "ptrace (PTRACE_POKETEXT): errno=%d, inferior_pid=0x%x, addr=0x%x, buffer[i] = 0x%x\n", errno, inferior_pid, addr, buffer[i]); - fprintf(stderr, "Sleeping for 1 second\n"); - sleep(1); + fprintf (stderr, "\ +ptrace (PTRACE_POKETEXT): errno=%d, pid=0x%x, addr=0x%x, buffer[i] = 0x%x\n", + errno, BUILDPID (inferior_pid, general_thread), + addr, buffer[i]); + fprintf (stderr, "Sleeping for 1 second\n"); + sleep (1); } else break; @@ -696,3 +730,8 @@ write_inferior_memory (memaddr, myaddr, len) return 0; } + +void +initialize_low (void) +{ +}