3 Copyright 2000, 2001, 2002 Red Hat, Inc.
5 This file is part of RDA, the Red Hat Debug Agent (and library).
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.
22 Alternative licenses for RDA may be arranged by contacting Red Hat,
32 #include "ptrace-target.h"
41 #include "gdbserv-target.h"
42 #include "gdbserv-utils.h"
43 #include "gdb_proc_service.h"
44 #include "gdbserv-thread-db.h"
46 /* This is unix ptrace gdbserv target that uses the RDA library to implement
47 a remote gdbserver on a unix ptrace host. It controls the process
48 to be debugged on the linux host, allowing GDB to pull the strings
49 from any host on the network (or on a serial port). */
51 /* Track sole connection to a remote gdb client. */
53 static struct gdbserv* ptrace_connect_lock = NULL;
55 /* Close all open file descriptors except for stdin, stdout, and
59 close_open_files (void)
61 long max_open_files = sysconf (_SC_OPEN_MAX);
64 for (fd = 3; fd < max_open_files; fd++)
70 /* ptrace_create_child:
72 Fork the child process and capture it via ptrace.
74 Args: char *exec_path; \* path to executable file *\
75 char **all_args; \* argv array for child. *\
78 /* Local Functions: */
81 ptrace_create_child (struct child_process *process)
88 /*perror_with_name ("fork");*/
89 fprintf (stderr, "PTRACE: fork failed!\n");
96 if (process->debug_backend)
97 fprintf (stderr, "PTRACE_TRACEME\n");
99 ptrace (PTRACE_TRACEME, 0L, 0L, 0L);
102 fprintf (stderr, "PTRACE: child cannot be traced!\n");
105 if (process->executable != NULL && process->argv != NULL)
106 execv (process->executable, process->argv);
108 sleep (-1); /* FIXME ??? */
110 fprintf (stderr, "Cannot exec %s: %s.\n", process->executable,
111 errno > 0 && errno < sys_nerr ?
112 strerror (errno) : "unknown error");
121 /* Decode the waitstatus returned by waitpid, and return the appropriate
122 stop status and stop_signal to gdb. FIXME: this is not specific to
123 ptrace, but there's no better place to put it (server.c?) */
126 handle_waitstatus (struct child_process *process, union wait w)
130 if (process->debug_informational)
131 fprintf (stderr, "\nChild %d exited with retcode = %d\n",
132 process->pid, WEXITSTATUS (w));
133 process->stop_status = 'W';
134 return (process->stop_signal = WEXITSTATUS (w));
136 else if (!WIFSTOPPED (w))
138 if (process->debug_informational)
139 fprintf (stderr, "\nChild %d terminated with signal = %d\n",
140 process->pid, WTERMSIG (w));
141 process->stop_status = 'X';
142 return (process->stop_signal = WTERMSIG (w));
145 #if defined(_MIPSEL) || defined(_MIPSEB)
147 * If we were single_stepping, restore the opcodes hoisted
148 * for the breakpoint[s].
152 ptrace (PTRACE_POKETEXT, process->pid, process->ss_info[0].ss_addr, process->ss_info[0].ss_val);
153 process->ss_info[0].ss_addr = 0;
155 if (process->ss_info[1].ss_addr) {
156 ptrace (PTRACE_POKETEXT, process->pid, process->ss_info[1].ss_addr, process->ss_info[1].ss_val);
157 process->ss_info[1].ss_addr = 0;
163 process->stop_status = 'T';
164 process->stop_signal = WSTOPSIG (w);
165 return process->stop_signal;
169 ptrace_kill_program (struct child_process *process, int signum)
171 if (process->debug_backend)
172 fprintf (stderr, "KILL %d, %d\n", process->pid, signum);
173 kill (process->pid, signum);
182 * Returns 0 for success, errno for failure
186 ptrace_read_user (int pid,
187 ptrace_arg3_type addr,
193 /* Require: addr is on the proper boundary, and
194 len is a proper multiple of PTRACE_XFER_SIZE.
195 Caller's responsibility. */
197 for (i = 0; i < len; i+= PTRACE_XFER_SIZE)
200 *(ptrace_xfer_type *) &((char *)buff)[i] =
201 ptrace (PTRACE_PEEKUSER, pid, addr + i, 0);
210 * Returns 0 for success, errno for failure
214 ptrace_write_user (int pid,
215 ptrace_arg3_type addr,
221 /* Require: addr is on the proper boundary, and
222 len is a proper multiple of PTRACE_XFER_SIZE.
223 Caller's responsibility. */
225 for (i = 0; i < len; i+= PTRACE_XFER_SIZE)
227 #ifdef X86_LINUX_TARGET
229 continue; /* Forbidden address/register, not writable. */
232 ptrace (PTRACE_POKEUSER, pid, addr + i,
233 * (ptrace_xfer_type *) &((char *)buff)[i]);
234 #if defined(_MIPSEL) || defined(MIPS_LINUX_TARGET)
235 /* mips linux kernel 2.4 has a bug where PTRACE_POKEUSER
236 returns -ESRCH even when it succeeds */
246 #if defined (PTRACE_GETREGS) || defined (PT_GETREGS)
248 /* get general regs */
251 ptrace_get_gregs (struct gdbserv *serv, int alt_pid, void *buff)
253 struct child_process *process = gdbserv_target_data (serv);
254 int pid = alt_pid == 0 ? process->pid : alt_pid;
256 /* Require: buff is of the appropriate size for the target arch. */
259 ptrace (PTRACE_GETREGS, pid, 0, (ptrace_arg4_type) buff);
264 #if defined (PTRACE_SETREGS) || defined (PT_SETREGS)
265 /* set general regs */
268 ptrace_set_gregs (struct gdbserv *serv, int alt_pid, const void *buff)
270 struct child_process *process = gdbserv_target_data (serv);
271 int pid = alt_pid == 0 ? process->pid : alt_pid;
273 /* Require: buff is of the appropriate size for the target arch. */
276 ptrace (PTRACE_SETREGS, pid, 0, (ptrace_arg4_type) buff);
282 /* get floating point regs */
285 ptrace_get_fpregs (struct gdbserv *serv, int alt_pid, void *buff)
287 #if defined (PTRACE_GETFPREGS) || defined (PT_GETFPREGS)
288 struct child_process *process = gdbserv_target_data (serv);
289 int pid = alt_pid == 0 ? process->pid : alt_pid;
291 /* Require: buff is of the appropriate size for the target arch. */
294 ptrace (PTRACE_GETFPREGS, pid, 0, (ptrace_arg4_type) buff);
302 /* set floating point regs */
305 ptrace_set_fpregs (struct gdbserv *serv, int alt_pid, const void *buff)
307 #if defined (PTRACE_SETFPREGS) || defined (PT_SETFPREGS)
308 struct child_process *process = gdbserv_target_data (serv);
309 int pid = alt_pid == 0 ? process->pid : alt_pid;
311 /* Require: buff is of the appropriate size for the target arch. */
314 ptrace (PTRACE_SETFPREGS, pid, 0, (ptrace_arg4_type) buff);
322 /* get extended floating point regs */
325 ptrace_get_fpxregs (struct gdbserv *serv, int alt_pid, void *buff)
327 #if defined (PTRACE_GETFPXREGS) || defined (PT_GETFPXREGS)
328 struct child_process *process = gdbserv_target_data (serv);
329 int pid = alt_pid == 0 ? process->pid : alt_pid;
331 /* Require: buff is of the appropriate size for the target arch. */
334 ptrace (PTRACE_GETFPXREGS, pid, 0, (ptrace_arg4_type) buff);
342 /* set extended floating point regs */
345 ptrace_set_fpxregs (struct gdbserv *serv, int alt_pid, const void *buff)
347 #if defined (PTRACE_SETFPXREGS) || defined (PT_SETFPXREGS)
348 struct child_process *process = gdbserv_target_data (serv);
349 int pid = alt_pid == 0 ? process->pid : alt_pid;
351 /* Require: buff is of the appropriate size for the target arch. */
354 ptrace (PTRACE_SETFPXREGS, pid, 0, (ptrace_arg4_type) buff);
364 ptrace_flush_i_cache (struct gdbserv *serv)
366 /* Calls to ptrace() take care of this for us automatically when
367 needed. I.e, nothing to do... */
375 ptrace_sigkill_program (struct gdbserv *serv)
377 struct child_process *process = gdbserv_target_data (serv);
379 ptrace_kill_program (process, SIGKILL);
382 /* exit program vector
385 ptrace_exit_program (struct gdbserv *serv)
387 ptrace_sigkill_program (serv);
388 gdbserv_fromtarget_exit (serv, GDBSERV_SIGQUIT);
391 /* break program vector
395 ptrace_break_program (struct gdbserv *serv)
397 struct child_process *process = gdbserv_target_data (serv);
399 if (process->debug_backend)
400 fprintf (stderr, " -- send SIGINT to child %d\n", process->pid);
401 kill (process->pid, SIGINT);
404 /* get_trap_number vector
408 ptrace_get_trap_number (struct gdbserv *serv)
410 struct child_process *process = gdbserv_target_data (serv);
412 return process->stop_signal;
415 /* compute signal vector
416 * No translation necessary -- using unix native signals .
420 ptrace_compute_signal (struct gdbserv *serv, unsigned long tgtsig)
423 return GDBSERV_SIGNONE;
425 if (tgtsig == SIGHUP)
426 return GDBSERV_SIGHUP;
429 if (tgtsig == SIGINT)
430 return GDBSERV_SIGINT;
433 if (tgtsig == SIGQUIT)
434 return GDBSERV_SIGQUIT;
437 if (tgtsig == SIGILL)
438 return GDBSERV_SIGILL;
441 if (tgtsig == SIGTRAP)
442 return GDBSERV_SIGTRAP;
445 if (tgtsig == SIGABRT)
446 return GDBSERV_SIGABRT;
449 if (tgtsig == SIGIOT)
450 return GDBSERV_SIGABRT;
453 if (tgtsig == SIGEMT)
454 return GDBSERV_SIGEMT;
457 if (tgtsig == SIGFPE)
458 return GDBSERV_SIGFPE;
461 if (tgtsig == SIGKILL)
462 return GDBSERV_SIGKILL;
465 if (tgtsig == SIGBUS)
466 return GDBSERV_SIGBUS;
469 if (tgtsig == SIGSEGV)
470 return GDBSERV_SIGSEGV;
473 if (tgtsig == SIGSYS)
474 return GDBSERV_SIGSYS;
477 if (tgtsig == SIGPIPE)
478 return GDBSERV_SIGPIPE;
481 if (tgtsig == SIGALRM)
482 return GDBSERV_SIGALRM;
485 if (tgtsig == SIGTERM)
486 return GDBSERV_SIGTERM;
489 if (tgtsig == SIGURG)
490 return GDBSERV_SIGURG;
493 if (tgtsig == SIGSTOP)
494 return GDBSERV_SIGSTOP;
497 if (tgtsig == SIGTSTP)
498 return GDBSERV_SIGTSTP;
501 if (tgtsig == SIGCONT)
502 return GDBSERV_SIGCONT;
505 if (tgtsig == SIGCHLD)
506 return GDBSERV_SIGCHLD;
509 if (tgtsig == SIGCLD)
510 return GDBSERV_SIGCHLD;
513 if (tgtsig == SIGTTIN)
514 return GDBSERV_SIGTTIN;
517 if (tgtsig == SIGTTOU)
518 return GDBSERV_SIGTTOU;
522 return GDBSERV_SIGIO;
525 if (tgtsig == SIGXCPU)
526 return GDBSERV_SIGXCPU;
529 if (tgtsig == SIGXFSZ)
530 return GDBSERV_SIGXFSZ;
533 if (tgtsig == SIGVTALRM)
534 return GDBSERV_SIGVTALRM;
537 if (tgtsig == SIGPROF)
538 return GDBSERV_SIGPROF;
541 if (tgtsig == SIGWINCH)
542 return GDBSERV_SIGWINCH;
545 if (tgtsig == SIGLOST)
546 return GDBSERV_SIGLOST;
549 if (tgtsig == SIGUSR1)
550 return GDBSERV_SIGUSR1;
553 if (tgtsig == SIGUSR2)
554 return GDBSERV_SIGUSR2;
557 if (tgtsig == SIGPWR)
558 return GDBSERV_SIGPWR;
561 if (tgtsig == SIGPOLL)
562 return GDBSERV_SIGPOLL;
565 if (tgtsig == SIGWIND)
566 return GDBSERV_SIGWIND;
569 if (tgtsig == SIGPHONE)
570 return GDBSERV_SIGPHONE;
573 if (tgtsig == SIGWAITING)
574 return GDBSERV_SIGWAITING;
577 if (tgtsig == SIGLWP)
578 return GDBSERV_SIGLWP;
581 if (tgtsig == SIGDANGER)
582 return GDBSERV_SIGDANGER;
585 if (tgtsig == SIGGRANT)
586 return GDBSERV_SIGGRANT;
589 if (tgtsig == SIGRETRACT)
590 return GDBSERV_SIGRETRACT;
593 if (tgtsig == SIGMSG)
594 return GDBSERV_SIGMSG;
597 if (tgtsig == SIGSOUND)
598 return GDBSERV_SIGSOUND;
601 if (tgtsig == SIGSAC)
602 return GDBSERV_SIGSAC;
605 if (tgtsig == SIGPRIO)
606 return GDBSERV_SIGPRIO;
609 if (tgtsig == SIGSTKFLT)
610 return GDBSERV_SIGSEGV; /* ? */
613 if (tgtsig == SIGPWR)
614 return GDBSERV_SIGPWR;
616 #if defined (SIGRTMIN) && defined (SIGRTMAX)
617 if (tgtsig == SIGRTMIN)
618 return GDBSERV_SIGRT32;
619 if (tgtsig == SIGRTMIN + 32)
620 return GDBSERV_SIGRT64;
621 if (tgtsig > SIGRTMIN && tgtsig < SIGRTMAX)
622 return GDBSERV_SIGRT33 + tgtsig - 1;
623 return GDBSERV_SIGNONE; /* ? */
631 ptrace_singlestep_program (struct gdbserv *serv)
633 struct child_process *process = gdbserv_target_data (serv);
635 /* FIXME: handle signals! */
636 if (process->debug_backend)
637 fprintf (stderr, "PTRACE_SINGLESTEP %d signal %d\n",
638 process->pid, process->signal_to_send);
639 process->stop_signal = 0;
640 process->stop_status = 0;
643 ptrace (PTRACE_SINGLESTEP, process->pid, 1L, process->signal_to_send);
645 fprintf (stderr, "singlestep: ptrace error %s in %d\n",
646 strerror (errno), process->pid);
647 process->signal_to_send = 0;
655 ptrace_continue_program (struct gdbserv *serv)
657 struct child_process *process = gdbserv_target_data (serv);
659 /* FIXME: handle signals! */
660 if (process->debug_backend)
661 fprintf (stderr, "PTRACE_CONT %d signal %d\n",
662 process->pid, process->signal_to_send);
663 process->stop_signal = 0;
664 process->stop_status = 0;
667 ptrace (PTRACE_CONT, process->pid, 1L, process->signal_to_send);
669 fprintf (stderr, "continue: ptrace error %s in %d\n",
670 strerror (errno), process->pid);
671 process->signal_to_send = 0;
674 /* Set continue-signal vector
678 ptrace_process_signal (struct gdbserv *serv, int sig)
680 struct child_process *process = gdbserv_target_data (serv);
682 /* Save the signal value for later use by continue/singlestep. */
684 case GDBSERV_SIGNONE:
685 process->signal_to_send = 0; break;
688 process->signal_to_send = SIGHUP; break;
692 process->signal_to_send = SIGINT; break;
695 case GDBSERV_SIGQUIT:
696 process->signal_to_send = SIGQUIT; break;
700 process->signal_to_send = SIGILL; break;
703 case GDBSERV_SIGTRAP:
704 process->signal_to_send = SIGTRAP; break;
707 case GDBSERV_SIGABRT:
708 process->signal_to_send = SIGABRT; break;
712 process->signal_to_send = SIGEMT; break;
716 process->signal_to_send = SIGFPE; break;
719 case GDBSERV_SIGKILL:
720 process->signal_to_send = SIGKILL; break;
724 process->signal_to_send = SIGBUS; break;
727 case GDBSERV_SIGSEGV:
728 process->signal_to_send = SIGSEGV; break;
732 process->signal_to_send = SIGSYS; break;
735 case GDBSERV_SIGPIPE:
736 process->signal_to_send = SIGPIPE; break;
739 case GDBSERV_SIGALRM:
740 process->signal_to_send = SIGALRM; break;
743 case GDBSERV_SIGTERM:
744 process->signal_to_send = SIGTERM; break;
748 process->signal_to_send = SIGURG; break;
751 case GDBSERV_SIGSTOP:
752 process->signal_to_send = SIGSTOP; break;
755 case GDBSERV_SIGTSTP:
756 process->signal_to_send = SIGTSTP; break;
759 case GDBSERV_SIGCONT:
760 process->signal_to_send = SIGCONT; break;
763 case GDBSERV_SIGCHLD:
764 process->signal_to_send = SIGCHLD; break;
766 #if defined (SIGCLD) && !defined (SIGCHLD)
767 case GDBSERV_SIGCHLD:
768 process->signal_to_send = SIGCLD; break;
771 case GDBSERV_SIGTTIN:
772 process->signal_to_send = SIGTTIN; break;
775 case GDBSERV_SIGTTOU:
776 process->signal_to_send = SIGTTOU; break;
780 process->signal_to_send = SIGIO; break;
783 case GDBSERV_SIGXCPU:
784 process->signal_to_send = SIGXCPU; break;
787 case GDBSERV_SIGXFSZ:
788 process->signal_to_send = SIGXFSZ; break;
791 case GDBSERV_SIGVTALRM:
792 process->signal_to_send = SIGVTALRM; break;
795 case GDBSERV_SIGPROF:
796 process->signal_to_send = SIGPROF; break;
799 case GDBSERV_SIGWINCH:
800 process->signal_to_send = SIGWINCH; break;
803 case GDBSERV_SIGLOST:
804 process->signal_to_send = SIGLOST; break;
807 case GDBSERV_SIGUSR1:
808 process->signal_to_send = SIGUSR1; break;
811 case GDBSERV_SIGUSR2:
812 process->signal_to_send = SIGUSR2; break;
816 process->signal_to_send = SIGPWR; break;
819 case GDBSERV_SIGPOLL:
820 process->signal_to_send = SIGPOLL; break;
823 case GDBSERV_SIGWIND:
824 process->signal_to_send = SIGWIND; break;
827 case GDBSERV_SIGPHONE:
828 process->signal_to_send = SIGPHONE; break;
831 case GDBSERV_SIGWAITING:
832 process->signal_to_send = SIGWAITING; break;
836 process->signal_to_send = SIGLWP; break;
839 case GDBSERV_SIGDANGER:
840 process->signal_to_send = SIGDANGER; break;
843 case GDBSERV_SIGGRANT:
844 process->signal_to_send = SIGGRANT; break;
847 case GDBSERV_SIGRETRACT:
848 process->signal_to_send = SIGRETRACT; break;
852 process->signal_to_send = SIGMSG; break;
855 case GDBSERV_SIGSOUND:
856 process->signal_to_send = SIGSOUND; break;
860 process->signal_to_send = SIGSAK; break;
863 case GDBSERV_SIGPRIO:
864 process->signal_to_send = SIGPRIO; break;
866 #if defined (SIGRTMIN) && defined (SIGRTMAX)
867 case GDBSERV_SIGRT32:
868 process->signal_to_send = SIGRTMIN; break;
869 case GDBSERV_SIGRT33:
870 process->signal_to_send = SIGRTMIN+1; break;
871 case GDBSERV_SIGRT34:
872 process->signal_to_send = SIGRTMIN+2; break;
873 case GDBSERV_SIGRT35:
874 process->signal_to_send = SIGRTMIN+3; break;
875 case GDBSERV_SIGRT36:
876 process->signal_to_send = SIGRTMIN+4; break;
877 case GDBSERV_SIGRT37:
878 process->signal_to_send = SIGRTMIN+5; break;
879 case GDBSERV_SIGRT38:
880 process->signal_to_send = SIGRTMIN+6; break;
881 case GDBSERV_SIGRT39:
882 process->signal_to_send = SIGRTMIN+7; break;
883 case GDBSERV_SIGRT40:
884 process->signal_to_send = SIGRTMIN+8; break;
885 case GDBSERV_SIGRT41:
886 process->signal_to_send = SIGRTMIN+9; break;
887 case GDBSERV_SIGRT42:
888 process->signal_to_send = SIGRTMIN+10; break;
889 case GDBSERV_SIGRT43:
890 process->signal_to_send = SIGRTMIN+11; break;
891 case GDBSERV_SIGRT44:
892 process->signal_to_send = SIGRTMIN+12; break;
893 case GDBSERV_SIGRT45:
894 process->signal_to_send = SIGRTMIN+13; break;
895 case GDBSERV_SIGRT46:
896 process->signal_to_send = SIGRTMIN+14; break;
897 case GDBSERV_SIGRT47:
898 process->signal_to_send = SIGRTMIN+15; break;
899 case GDBSERV_SIGRT48:
900 process->signal_to_send = SIGRTMIN+16; break;
901 case GDBSERV_SIGRT49:
902 process->signal_to_send = SIGRTMIN+17; break;
903 case GDBSERV_SIGRT50:
904 process->signal_to_send = SIGRTMIN+18; break;
905 case GDBSERV_SIGRT51:
906 process->signal_to_send = SIGRTMIN+19; break;
907 case GDBSERV_SIGRT52:
908 process->signal_to_send = SIGRTMIN+20; break;
909 case GDBSERV_SIGRT53:
910 process->signal_to_send = SIGRTMIN+21; break;
911 case GDBSERV_SIGRT54:
912 process->signal_to_send = SIGRTMIN+22; break;
913 case GDBSERV_SIGRT55:
914 process->signal_to_send = SIGRTMIN+23; break;
915 case GDBSERV_SIGRT56:
916 process->signal_to_send = SIGRTMIN+24; break;
917 case GDBSERV_SIGRT57:
918 process->signal_to_send = SIGRTMIN+25; break;
919 case GDBSERV_SIGRT58:
920 process->signal_to_send = SIGRTMIN+26; break;
921 case GDBSERV_SIGRT59:
922 process->signal_to_send = SIGRTMIN+27; break;
923 case GDBSERV_SIGRT60:
924 process->signal_to_send = SIGRTMIN+28; break;
925 case GDBSERV_SIGRT61:
926 process->signal_to_send = SIGRTMIN+29; break;
927 case GDBSERV_SIGRT62:
928 process->signal_to_send = SIGRTMIN+30; break;
929 case GDBSERV_SIGRT63:
930 process->signal_to_send = SIGRTMIN+31; break;
931 case GDBSERV_SIGRT64:
932 process->signal_to_send = SIGRTMIN+32; break;
935 /* Since we will handle the signal, we don't want gdbserv
936 to handle it by calling kill! Return zero. */
940 /* Read memory vector
944 ptrace_xfer_mem (struct gdbserv *serv,
945 struct gdbserv_reg *addr,
950 struct child_process *process = gdbserv_target_data (serv);
951 ptrace_arg3_type request_base;
952 ptrace_arg3_type xfer_base;
953 ptrace_arg3_type temp_addr;
954 ptrace_xfer_type *buf;
958 /* Get request address. */
959 gdbserv_reg_to_ulong (serv, addr, &request_base);
960 /* Round down to a PTRACE word boundary. */
961 xfer_base = request_base & - PTRACE_XFER_SIZE;
962 /* Round length up to a PTRACE word boundary. */
963 xfer_count = (((request_base + len) - xfer_base) + PTRACE_XFER_SIZE - 1)
965 /* Allocate space for xfer. */
966 buf = (ptrace_xfer_type *) alloca (xfer_count * PTRACE_XFER_SIZE);
968 /* Perform memory xfer. */
971 for (i = 0; i < xfer_count; i++)
973 temp_addr = xfer_base + i * PTRACE_XFER_SIZE;
976 buf[i] = ptrace (PTRACE_PEEKTEXT, process->pid, temp_addr, 0L);
978 if (process->debug_backend)
979 fprintf (stderr, "PTRACE_PEEKTEXT-1 0x%08lx in %d, 0x%08lx\n",
980 (long) temp_addr, process->pid, (long) buf[i]);
985 "xfer_mem(1): ptrace error at 0x%08lx in %d: %s\n",
986 (long) temp_addr, process->pid, strerror (errno));
991 /* Copy results to caller's buffer space. */
992 memcpy (data, (char *) buf + (request_base - xfer_base), len);
996 /* If the xfer buffer overlaps the write-request buffer,
997 we must first read the values that are there before
998 replacing with the desired values (otherwise these bytes
999 would be uninitialized). */
1000 if ((unsigned long long) xfer_base <
1001 (unsigned long long) request_base)
1004 buf[0] = ptrace (PTRACE_PEEKTEXT,
1005 process->pid, xfer_base, 0L);
1006 if (process->debug_backend)
1007 fprintf (stderr, "PTRACE_PEEKTEXT-2 0x%08lx in %d, 0x%08lx\n",
1008 (long) xfer_base, process->pid, (long) buf[0]);
1014 "xfer_mem(2): ptrace error at 0x%08lx in %d: %s\n",
1015 (long) xfer_base, process->pid, strerror (errno));
1019 if ((xfer_count > 0) &&
1020 ((unsigned long long) (xfer_base + xfer_count * PTRACE_XFER_SIZE) >
1021 (unsigned long long) (request_base + len)))
1023 temp_addr = xfer_base + (xfer_count - 1) * PTRACE_XFER_SIZE;
1025 buf[xfer_count - 1] =
1026 ptrace (PTRACE_PEEKTEXT, process->pid, temp_addr, 0L);
1027 if (process->debug_backend)
1028 fprintf (stderr, "PTRACE_PEEKTEXT-3 0x%08lx in %d, 0x%08lx\n",
1029 (long) temp_addr, process->pid,
1030 (long) buf[xfer_count - 1]);
1036 "xfer_mem(3): ptrace error at 0x%08lx in %d: %s\n",
1037 (long) temp_addr, process->pid, strerror (errno));
1042 /* Now copy user buffer to xfer buffer. */
1043 memcpy ((char *) buf + (request_base - xfer_base), data, len);
1044 /* Now write out the data. */
1045 for (i = 0; i < xfer_count; i++)
1047 temp_addr = xfer_base + i * PTRACE_XFER_SIZE;
1050 ptrace (PTRACE_POKETEXT, process->pid, temp_addr, buf[i]);
1052 if (process->debug_backend)
1053 fprintf (stderr, "PTRACE_POKETEXT 0x%08lx in %d, 0x%08lx\n",
1054 (long) temp_addr, process->pid, (long) buf[i]);
1060 "xfer_mem(4): ptrace error at 0x%08lx in %d: %s\n",
1061 (long) temp_addr, process->pid, strerror (errno));
1071 ptrace_set_mem (struct gdbserv *serv,
1072 struct gdbserv_reg *addr,
1076 return ptrace_xfer_mem (serv, addr, data, len, 0);
1080 ptrace_get_mem (struct gdbserv *serv,
1081 struct gdbserv_reg *addr,
1085 return ptrace_xfer_mem (serv, addr, data, len, 1);
1091 /* Detach vector -- shut down this target connection.
1095 ptrace_detach (struct gdbserv *serv, struct gdbserv_target *target)
1097 struct child_process *process = gdbserv_target_data (serv);
1099 assert (ptrace_connect_lock == serv);
1101 if (process->debug_informational)
1102 fprintf (stderr, "ptrace - detached.\n");
1103 ptrace_connect_lock = NULL;
1105 /* Quit out of main loop for this demo. In general, this is not
1106 necessary, as the next incoming connection could again be handled
1107 by ptrace_attach() above. */
1111 /* This function is called from gdbloop_poll when a new incoming
1112 connection is attempted. It may return NULL if the new connection
1113 is to be refused, or a gdbserv_target vector if the connection is
1116 struct gdbserv_target*
1117 ptrace_attach (struct gdbserv *serv, void *data)
1119 struct gdbserv_target *ptrace_target;
1120 struct child_process *process = data;
1125 /* Enable server tracing. */
1126 /* gdbserv_state_trace = stderr;*/
1128 if (ptrace_connect_lock != NULL)
1130 fprintf (stderr, "ptrace: rejected duplicate connection.\n");
1134 if (process->debug_informational)
1135 fprintf (stderr, "ptrace: accepted gdb connection.\n");
1136 ptrace_connect_lock = serv;
1138 process->pid = ptrace_create_child (process);
1142 } while (pid != process->pid);
1144 handle_waitstatus (process, w);
1146 if (process->pid > 0)
1148 if (process->debug_informational)
1149 fprintf (stderr, "ptrace: created child process %d, %s\n",
1150 process->pid, process->executable);
1154 fprintf (stderr, "PTRACE: failed to create child process %s!\n",
1155 process->executable);
1159 ptrace_target = malloc (sizeof (struct gdbserv_target));
1160 memset (ptrace_target, 0, sizeof (*ptrace_target));
1162 /* Callback structure for function pointers that handle processed
1163 control packets. See gdbserv-target.h for docs on the individual
1166 ptrace_target->process_get_gen = NULL;
1167 ptrace_target->process_set_gen = NULL;
1168 ptrace_target->process_rcmd = NULL;
1169 ptrace_target->process_set_args = NULL;
1170 ptrace_target->process_set_reg = NULL;
1171 ptrace_target->process_get_reg = NULL;
1172 ptrace_target->process_set_regs = NULL;
1173 ptrace_target->process_get_regs = NULL;
1174 ptrace_target->input_reg = NULL;
1175 ptrace_target->output_reg = NULL;
1176 ptrace_target->gg_reg_nr = NULL;
1177 ptrace_target->expedited_reg_nr = NULL;
1178 ptrace_target->sizeof_reg = NULL;
1179 ptrace_target->set_reg = NULL;
1180 ptrace_target->get_reg = NULL;
1181 ptrace_target->get_mem = ptrace_get_mem;
1182 ptrace_target->set_mem = ptrace_set_mem;
1183 ptrace_target->process_set_pc = NULL;
1184 ptrace_target->flush_i_cache = ptrace_flush_i_cache;
1185 ptrace_target->process_signal = ptrace_process_signal;
1186 ptrace_target->compute_signal = ptrace_compute_signal;
1187 ptrace_target->get_trap_number = ptrace_get_trap_number;
1188 ptrace_target->exit_program = ptrace_exit_program;
1189 ptrace_target->break_program = ptrace_break_program;
1190 ptrace_target->reset_program = NULL;
1191 ptrace_target->restart_program = NULL;
1192 ptrace_target->singlestep_program = ptrace_singlestep_program;
1193 ptrace_target->cyclestep_program = NULL;
1194 ptrace_target->sigkill_program = ptrace_sigkill_program;
1195 ptrace_target->continue_program = ptrace_continue_program;
1196 ptrace_target->remove_breakpoint = NULL;
1197 ptrace_target->set_breakpoint = NULL;
1198 ptrace_target->process_target_packet = NULL;
1199 ptrace_target->detach = ptrace_detach;
1201 ptrace_target->data = data; /* Save ptr to child_process struct. */
1203 #if defined(_MIPSEL) || defined(_MIPSEB)
1207 return ptrace_target;
1210 /* This function is called from the main loop, and waits for an event
1211 (such as a signal or exception) from the running child process. */
1214 ptrace_check_child_state (struct child_process *process)
1216 struct gdbserv *serv = process->serv;
1220 ret = waitpid (process->pid, (int *) &w, WNOHANG);
1222 if (ret > 0) /* found an event */
1224 ret = handle_waitstatus (process, w);
1225 if (process->debug_backend)
1226 fprintf (stderr, "wait returned %d\n", ret);
1232 /* Exported service functions */
1234 /* Function: continue_lwp
1235 Send PTRACE_CONT to an lwp.
1236 Returns -1 for failure, zero for success. */
1239 continue_lwp (lwpid_t lwpid, int signal)
1241 if (thread_db_noisy)
1242 fprintf (stderr, "<ptrace (PTRACE_CONT, %d, 0, %d)>\n", lwpid, signal);
1244 if (ptrace (PTRACE_CONT, lwpid, 0, signal) < 0)
1246 fprintf (stderr, "<<< ERROR: PTRACE_CONT %d failed >>>\n", lwpid);
1252 /* Function: singlestep_lwp
1253 Send PTRACE_SINGLESTEP to an lwp.
1254 Returns -1 for failure, zero for success. */
1257 singlestep_lwp (lwpid_t lwpid, int signal)
1259 if (thread_db_noisy)
1260 fprintf (stderr, "<ptrace (PTRACE_SINGLESTEP, %d, 0, %d)>\n", lwpid, signal);
1262 if (ptrace (PTRACE_SINGLESTEP, lwpid, 0, signal) < 0)
1264 fprintf (stderr, "<<< ERROR: PTRACE_SINGLESTEP %d failed >>>\n", lwpid);
1270 /* Function: attach_lwp
1271 Send PTRACE_ATTACH to an lwp.
1272 Returns -1 for failure, zero for success. */
1275 attach_lwp (lwpid_t lwpid)
1278 if (ptrace (PTRACE_ATTACH, lwpid, 0, 0) == 0)
1280 if (thread_db_noisy)
1281 fprintf (stderr, "<ptrace (PTRACE_ATTACH, %d, 0, 0)>\n", lwpid);
1286 fprintf (stderr, "<<< ERROR ptrace attach %d failed, %s >>>\n",
1287 lwpid, strerror (errno));
1292 /* Function: stop_lwp
1293 Use SIGSTOP to force an lwp to stop.
1294 Returns -1 for failure, zero for success. */
1297 stop_lwp (lwpid_t lwpid)
1299 if (kill (lwpid, SIGSTOP) == 0)
1301 #if 0 /* Too noisy! */
1302 if (thread_db_noisy)
1303 fprintf (stderr, "<kill (%d, SIGSTOP)>\n", lwpid);
1309 fprintf (stderr, "<<< ERROR -- kill (%d, SIGSTOP) failed >>>\n", lwpid);
1314 /* proc_service callback functions */
1317 ps_pstop (gdb_ps_prochandle_t ph) /* Process stop */
1319 fprintf (stderr, "<ps_pstop [UN-IMPLEMENTED]>\n");
1320 return PS_ERR; /* unimplemented. */
1324 ps_pcontinue (gdb_ps_prochandle_t ph) /* Process continue */
1326 fprintf (stderr, "<ps_pcontinue [UN-IMPLEMENTED]>\n");
1327 return PS_ERR; /* unimplemented. */
1331 ps_lstop (gdb_ps_prochandle_t ph, /* LWP stop */
1334 fprintf (stderr, "<ps_lstop [UN-IMPLEMENTED]>\n");
1335 return PS_ERR; /* unimplemented. */
1339 ps_lcontinue (gdb_ps_prochandle_t ph, /* LWP continue */
1342 if (continue_lwp (lwpid, 0) < 0)
1349 ps_pdread (gdb_ps_prochandle_t ph, /* read from data segment */
1351 gdb_ps_read_buf_t buf,
1355 struct gdbserv_reg addr_reg;
1357 /* Use unsigned long long for maximum portability. */
1358 gdbserv_ulonglong_to_reg (ph->serv, (unsigned long long) addr, &addr_reg);
1360 bytes_read = ptrace_get_mem (ph->serv, &addr_reg, buf, (long) size);
1362 if (bytes_read == (long) size)
1369 ps_pdwrite (gdb_ps_prochandle_t ph, /* write to data segment */
1371 gdb_ps_write_buf_t buf,
1375 struct gdbserv_reg addr_reg;
1377 /* Use unsigned long long for maximum portability. */
1378 gdbserv_ulonglong_to_reg (ph->serv, (unsigned long long) addr, &addr_reg);
1380 bytes_written = ptrace_set_mem (ph->serv, &addr_reg, buf, (long) size);
1382 if (bytes_written == (long) size)
1389 ps_ptread (gdb_ps_prochandle_t ph, /* read from text segment */
1391 gdb_ps_read_buf_t buf,
1395 struct gdbserv_reg addr_reg;
1397 /* Use unsigned long long for maximum portability. */
1398 gdbserv_ulonglong_to_reg (ph->serv, (unsigned long long) addr, &addr_reg);
1400 bytes_read = ptrace_get_mem (ph->serv, &addr_reg, buf, (long) size);
1402 if (bytes_read == (long) size)
1409 ps_ptwrite (gdb_ps_prochandle_t ph, /* write to text segment */
1411 gdb_ps_write_buf_t buf,
1415 struct gdbserv_reg addr_reg;
1417 /* Use unsigned long long for maximum portability. */
1418 gdbserv_ulonglong_to_reg (ph->serv, (unsigned long long) addr, &addr_reg);
1420 bytes_written = ptrace_set_mem (ph->serv, &addr_reg, buf, (long) size);
1422 if (bytes_written == (long) size)