X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fremote.c;h=962a58db49bff27d90f95e2bebdb679b38c178c1;hb=e073c4747aebd9b65de341f6201fa479e57ea275;hp=d6df76adb91f702dd9cde9bc26b535f16ff2d6ad;hpb=8aa91c1e237baa3e8223d6304cdcd66380f83119;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/remote.c b/gdb/remote.c index d6df76adb9..962a58db49 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -1,7 +1,8 @@ /* Remote target communications for serial-line targets in custom GDB protocol Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, - 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 + Free Software Foundation, Inc. This file is part of GDB. @@ -106,9 +107,6 @@ static void extended_remote_restart (void); static void extended_remote_mourn (void); -static void extended_remote_create_inferior (char *, char *, char **); -static void extended_remote_async_create_inferior (char *, char *, char **); - static void remote_mourn_1 (struct target_ops *); static void remote_send (char *buf, long sizeof_buf); @@ -151,10 +149,6 @@ static void init_remote_ops (void); static void init_extended_remote_ops (void); -static void init_remote_cisco_ops (void); - -static struct target_ops remote_cisco_ops; - static void remote_stop (void); static int ishex (int ch, int *val); @@ -295,7 +289,7 @@ init_remote_state (struct gdbarch *gdbarch) little. */ if (rs->sizeof_g_packet > ((rs->remote_packet_size - 32) / 2)) rs->remote_packet_size = (rs->sizeof_g_packet * 2 + 32); - + /* This one is filled in when a ``g'' packet is received. */ rs->actual_register_packet_size = 0; @@ -372,10 +366,6 @@ static int remote_break; starts. */ static struct serial *remote_desc = NULL; -/* This is set by the target (thru the 'S' message) - to denote that the target is in kernel mode. */ -static int cisco_kernel_mode = 0; - /* This variable sets the number of bits in an address that are to be sent in a memory ("M" or "m") packet. Normally, after stripping leading zeros, the entire address would be sent. This variable @@ -781,42 +771,6 @@ show_remote_protocol_qSymbol_packet_cmd (char *args, int from_tty, show_packet_config_cmd (&remote_protocol_qSymbol); } -/* Should we try the 'e' (step over range) request? */ -static struct packet_config remote_protocol_e; - -static void -set_remote_protocol_e_packet_cmd (char *args, int from_tty, - struct cmd_list_element *c) -{ - update_packet_config (&remote_protocol_e); -} - -static void -show_remote_protocol_e_packet_cmd (char *args, int from_tty, - struct cmd_list_element *c) -{ - show_packet_config_cmd (&remote_protocol_e); -} - - -/* Should we try the 'E' (step over range / w signal #) request? */ -static struct packet_config remote_protocol_E; - -static void -set_remote_protocol_E_packet_cmd (char *args, int from_tty, - struct cmd_list_element *c) -{ - update_packet_config (&remote_protocol_E); -} - -static void -show_remote_protocol_E_packet_cmd (char *args, int from_tty, - struct cmd_list_element *c) -{ - show_packet_config_cmd (&remote_protocol_E); -} - - /* Should we try the 'P' (set register) request? */ static struct packet_config remote_protocol_P; @@ -967,7 +921,7 @@ static struct packet_config remote_protocol_binary_download; This variable (NOT available to the user: auto-detect only!) determines whether GDB will use the new, simpler "ThreadInfo" query or the older, more complex syntax for thread queries. - This is an auto-detect variable (set to true at each connect, + This is an auto-detect variable (set to true at each connect, and set to false when the target fails to recognize it). */ static int use_threadinfo_query; @@ -988,6 +942,23 @@ show_remote_protocol_binary_download_cmd (char *args, int from_tty, show_packet_config_cmd (&remote_protocol_binary_download); } +/* Should we try the 'qPart:auxv' (target auxiliary vector read) request? */ +static struct packet_config remote_protocol_qPart_auxv; + +static void +set_remote_protocol_qPart_auxv_packet_cmd (char *args, int from_tty, + struct cmd_list_element *c) +{ + update_packet_config (&remote_protocol_qPart_auxv); +} + +static void +show_remote_protocol_qPart_auxv_packet_cmd (char *args, int from_tty, + struct cmd_list_element *c) +{ + show_packet_config_cmd (&remote_protocol_qPart_auxv); +} + /* Tokens for use by the asynchronous signal handlers for SIGINT */ static void *sigint_remote_twice_token; @@ -996,8 +967,8 @@ static void *sigint_remote_token; /* These are pointers to hook functions that may be set in order to modify resume/wait behavior for a particular architecture. */ -void (*target_resume_hook) (void); -void (*target_wait_loop_hook) (void); +void (*deprecated_target_resume_hook) (void); +void (*deprecated_target_wait_loop_hook) (void); @@ -1161,10 +1132,6 @@ static int remote_unpack_thread_info_response (char *pkt, static int remote_get_threadinfo (threadref * threadid, int fieldset, /*TAG mask */ struct gdb_ext_thread_info *info); -static int adapt_remote_get_threadinfo (gdb_threadref * ref, - int selection, - struct gdb_ext_thread_info *info); - static char *pack_threadlist_request (char *pkt, int startflag, int threadcount, threadref * nextthread); @@ -1466,7 +1433,7 @@ pack_threadinfo_request (char *pkt, int mode, threadref *id) fetch registers and its stack */ #define TAG_DISPLAY 4 /* A short thing maybe to put on a window */ #define TAG_THREADNAME 8 /* string, maps 1-to-1 with a thread is */ -#define TAG_MOREDISPLAY 16 /* Whatever the kernel wants to say about +#define TAG_MOREDISPLAY 16 /* Whatever the kernel wants to say about the process */ static int @@ -1576,19 +1543,6 @@ remote_get_threadinfo (threadref *threadid, int fieldset, /* TAG mask */ return result; } -/* Unfortunately, 61 bit thread-ids are bigger than the internal - representation of a threadid. */ - -static int -adapt_remote_get_threadinfo (gdb_threadref *ref, int selection, - struct gdb_ext_thread_info *info) -{ - threadref lclref; - - int_to_threadref (&lclref, *ref); - return remote_get_threadinfo (&lclref, selection, info); -} - /* Format: i'Q':8,i"L":8,initflag:8,batchsize:16,lastthreadid:32 */ static char * @@ -1767,8 +1721,8 @@ remote_current_thread (ptid_t oldpid) return oldpid; } -/* Find new threads for info threads command. - * Original version, using John Metzler's thread protocol. +/* Find new threads for info threads command. + * Original version, using John Metzler's thread protocol. */ static void @@ -1804,7 +1758,7 @@ remote_threads_info (void) bufp = buf; getpkt (bufp, (rs->remote_packet_size), 0); if (bufp[0] != '\0') /* q packet recognized */ - { + { while (*bufp++ == 'm') /* reply contains one or more TID */ { do @@ -1828,12 +1782,12 @@ remote_threads_info (void) return; } -/* +/* * Collect a descriptive string about the given thread. * The target may say anything it wants to about the thread * (typically info about its blocked / runnable state, name, etc.). * This string will appear in the info threads display. - * + * * Optional: targets are not required to implement this function. */ @@ -1993,9 +1947,9 @@ get_offsets (void) if (symfile_objfile == NULL) return; - offs = ((struct section_offsets *) + offs = ((struct section_offsets *) alloca (SIZEOF_N_SECTION_OFFSETS (symfile_objfile->num_sections))); - memcpy (offs, symfile_objfile->section_offsets, + memcpy (offs, symfile_objfile->section_offsets, SIZEOF_N_SECTION_OFFSETS (symfile_objfile->num_sections)); offs->offsets[SECT_OFF_TEXT (symfile_objfile)] = text_addr; @@ -2010,123 +1964,6 @@ get_offsets (void) objfile_relocate (symfile_objfile, offs); } -/* - * Cisco version of section offsets: - * - * Instead of having GDB query the target for the section offsets, - * Cisco lets the target volunteer the information! It's also in - * a different format, so here are the functions that will decode - * a section offset packet from a Cisco target. - */ - -/* - * Function: remote_cisco_section_offsets - * - * Returns: zero for success, non-zero for failure - */ - -static int -remote_cisco_section_offsets (bfd_vma text_addr, - bfd_vma data_addr, - bfd_vma bss_addr, - bfd_signed_vma *text_offs, - bfd_signed_vma *data_offs, - bfd_signed_vma *bss_offs) -{ - bfd_vma text_base, data_base, bss_base; - struct minimal_symbol *start; - asection *sect; - bfd *abfd; - int len; - - if (symfile_objfile == NULL) - return -1; /* no can do nothin' */ - - start = lookup_minimal_symbol ("_start", NULL, NULL); - if (start == NULL) - return -1; /* Can't find "_start" symbol */ - - data_base = bss_base = 0; - text_base = SYMBOL_VALUE_ADDRESS (start); - - abfd = symfile_objfile->obfd; - for (sect = abfd->sections; - sect != 0; - sect = sect->next) - { - const char *p = bfd_get_section_name (abfd, sect); - len = strlen (p); - if (strcmp (p + len - 4, "data") == 0) /* ends in "data" */ - if (data_base == 0 || - data_base > bfd_get_section_vma (abfd, sect)) - data_base = bfd_get_section_vma (abfd, sect); - if (strcmp (p + len - 3, "bss") == 0) /* ends in "bss" */ - if (bss_base == 0 || - bss_base > bfd_get_section_vma (abfd, sect)) - bss_base = bfd_get_section_vma (abfd, sect); - } - *text_offs = text_addr - text_base; - *data_offs = data_addr - data_base; - *bss_offs = bss_addr - bss_base; - if (remote_debug) - { - char tmp[128]; - - sprintf (tmp, "VMA: text = 0x"); - sprintf_vma (tmp + strlen (tmp), text_addr); - sprintf (tmp + strlen (tmp), " data = 0x"); - sprintf_vma (tmp + strlen (tmp), data_addr); - sprintf (tmp + strlen (tmp), " bss = 0x"); - sprintf_vma (tmp + strlen (tmp), bss_addr); - fputs_filtered (tmp, gdb_stdlog); - fprintf_filtered (gdb_stdlog, - "Reloc offset: text = 0x%s data = 0x%s bss = 0x%s\n", - paddr_nz (*text_offs), - paddr_nz (*data_offs), - paddr_nz (*bss_offs)); - } - - return 0; -} - -/* - * Function: remote_cisco_objfile_relocate - * - * Relocate the symbol file for a remote target. - */ - -void -remote_cisco_objfile_relocate (bfd_signed_vma text_off, bfd_signed_vma data_off, - bfd_signed_vma bss_off) -{ - struct section_offsets *offs; - - if (text_off != 0 || data_off != 0 || bss_off != 0) - { - /* FIXME: This code assumes gdb-stabs.h is being used; it's - broken for xcoff, dwarf, sdb-coff, etc. But there is no - simple canonical representation for this stuff. */ - - offs = (struct section_offsets *) - alloca (SIZEOF_N_SECTION_OFFSETS (symfile_objfile->num_sections)); - memcpy (offs, symfile_objfile->section_offsets, - SIZEOF_N_SECTION_OFFSETS (symfile_objfile->num_sections)); - - offs->offsets[SECT_OFF_TEXT (symfile_objfile)] = text_off; - offs->offsets[SECT_OFF_DATA (symfile_objfile)] = data_off; - offs->offsets[SECT_OFF_BSS (symfile_objfile)] = bss_off; - - /* First call the standard objfile_relocate. */ - objfile_relocate (symfile_objfile, offs); - - /* Now we need to fix up the section entries already attached to - the exec target. These entries will control memory transfers - from the exec file. */ - - exec_set_section_offsets (text_off, data_off, bss_off); - } -} - /* Stub for catch_errors. */ static int @@ -2201,8 +2038,6 @@ static void init_all_packet_configs (void) { int i; - update_packet_config (&remote_protocol_e); - update_packet_config (&remote_protocol_E); update_packet_config (&remote_protocol_P); update_packet_config (&remote_protocol_qSymbol); update_packet_config (&remote_protocol_vcont); @@ -2211,6 +2046,7 @@ init_all_packet_configs (void) /* Force remote_write_bytes to check whether target supports binary downloading. */ update_packet_config (&remote_protocol_binary_download); + update_packet_config (&remote_protocol_qPart_auxv); } /* Symbol look-up. */ @@ -2244,7 +2080,7 @@ remote_check_symbols (struct objfile *objfile) if (sym == NULL) sprintf (msg, "qSymbol::%s", &reply[8]); else - sprintf (msg, "qSymbol:%s:%s", + sprintf (msg, "qSymbol:%s:%s", paddr_nz (SYMBOL_VALUE_ADDRESS (sym)), &reply[8]); putpkt (msg); @@ -2287,6 +2123,9 @@ remote_open_1 (char *name, int from_tty, struct target_ops *target, if (!async_p) wait_forever_enabled_p = 1; + reopen_exec_file (); + reread_symbols (); + target_preopen (from_tty); unpush_target (target); @@ -2299,7 +2138,12 @@ remote_open_1 (char *name, int from_tty, struct target_ops *target, { if (serial_setbaudrate (remote_desc, baud_rate)) { + /* The requested speed could not be set. Error out to + top level after closing remote_desc. Take care to + set remote_desc to NULL to avoid closing remote_desc + more than once. */ serial_close (remote_desc); + remote_desc = NULL; perror_with_name (name); } } @@ -2319,7 +2163,7 @@ remote_open_1 (char *name, int from_tty, struct target_ops *target, push_target (target); /* Switch to using remote target now */ init_all_packet_configs (); - + general_thread = -2; continue_thread = -2; @@ -2395,10 +2239,10 @@ remote_open_1 (char *name, int from_tty, struct target_ops *target, getpkt (buf, (rs->remote_packet_size), 0); } #ifdef SOLIB_CREATE_INFERIOR_HOOK - /* FIXME: need a master target_open vector from which all - remote_opens can be called, so that stuff like this can + /* FIXME: need a master target_open vector from which all + remote_opens can be called, so that stuff like this can go there. Failing that, the following code must be copied - to the open function for any remote target that wants to + to the open function for any remote target that wants to support svr4 shared libraries. */ /* Set up to detect and load shared libraries. */ @@ -2578,7 +2422,7 @@ remote_vcont_resume (ptid_t ptid, int step, enum target_signal siggnal) { struct remote_state *rs = get_remote_state (); int pid = PIDGET (ptid); - char *buf = NULL; + char *buf = NULL, *outbuf; struct cleanup *old_cleanup; buf = xmalloc (rs->remote_packet_size); @@ -2603,40 +2447,45 @@ remote_vcont_resume (ptid_t ptid, int step, enum target_signal siggnal) don't have any PID numbers the inferior will understand. Make sure to only send forms that do not specify a PID. */ if (step && siggnal != TARGET_SIGNAL_0) - sprintf (buf, "vCont;S%02x", siggnal); + outbuf = xstrprintf ("vCont;S%02x", siggnal); else if (step) - sprintf (buf, "vCont;s"); + outbuf = xstrprintf ("vCont;s"); else if (siggnal != TARGET_SIGNAL_0) - sprintf (buf, "vCont;C%02x", siggnal); + outbuf = xstrprintf ("vCont;C%02x", siggnal); else - sprintf (buf, "vCont;c"); + outbuf = xstrprintf ("vCont;c"); } else if (pid == -1) { /* Resume all threads, with preference for INFERIOR_PTID. */ if (step && siggnal != TARGET_SIGNAL_0) - sprintf (buf, "vCont;S%02x:%x;c", siggnal, PIDGET (inferior_ptid)); + outbuf = xstrprintf ("vCont;S%02x:%x;c", siggnal, + PIDGET (inferior_ptid)); else if (step) - sprintf (buf, "vCont;s:%x;c", PIDGET (inferior_ptid)); + outbuf = xstrprintf ("vCont;s:%x;c", PIDGET (inferior_ptid)); else if (siggnal != TARGET_SIGNAL_0) - sprintf (buf, "vCont;C%02x:%x;c", siggnal, PIDGET (inferior_ptid)); + outbuf = xstrprintf ("vCont;C%02x:%x;c", siggnal, + PIDGET (inferior_ptid)); else - sprintf (buf, "vCont;c"); + outbuf = xstrprintf ("vCont;c"); } else { /* Scheduler locking; resume only PTID. */ if (step && siggnal != TARGET_SIGNAL_0) - sprintf (buf, "vCont;S%02x:%x", siggnal, pid); + outbuf = xstrprintf ("vCont;S%02x:%x", siggnal, pid); else if (step) - sprintf (buf, "vCont;s:%x", pid); + outbuf = xstrprintf ("vCont;s:%x", pid); else if (siggnal != TARGET_SIGNAL_0) - sprintf (buf, "vCont;C%02x:%x", siggnal, pid); + outbuf = xstrprintf ("vCont;C%02x:%x", siggnal, pid); else - sprintf (buf, "vCont;c:%x", pid); + outbuf = xstrprintf ("vCont;c:%x", pid); } - putpkt (buf); + gdb_assert (outbuf && strlen (outbuf) < rs->remote_packet_size); + make_cleanup (xfree, outbuf); + + putpkt (outbuf); do_cleanups (old_cleanup); @@ -2662,8 +2511,8 @@ remote_resume (ptid_t ptid, int step, enum target_signal siggnal) /* A hook for when we need to do something at the last moment before resumption. */ - if (target_resume_hook) - (*target_resume_hook) (); + if (deprecated_target_resume_hook) + (*deprecated_target_resume_hook) (); /* The vCont packet doesn't need to specify threads via Hc. */ if (remote_vcont_resume (ptid, step, siggnal)) @@ -2675,60 +2524,6 @@ remote_resume (ptid_t ptid, int step, enum target_signal siggnal) else set_thread (pid, 0); /* run this thread */ - /* The s/S/c/C packets do not return status. So if the target does - not support the S or C packets, the debug agent returns an empty - string which is detected in remote_wait(). This protocol defect - is fixed in the e/E packets. */ - - if (step && step_range_end) - { - /* If the target does not support the 'E' packet, we try the 'S' - packet. Ideally we would fall back to the 'e' packet if that - too is not supported. But that would require another copy of - the code to issue the 'e' packet (and fall back to 's' if not - supported) in remote_wait(). */ - - if (siggnal != TARGET_SIGNAL_0) - { - if (remote_protocol_E.support != PACKET_DISABLE) - { - p = buf; - *p++ = 'E'; - *p++ = tohex (((int) siggnal >> 4) & 0xf); - *p++ = tohex (((int) siggnal) & 0xf); - *p++ = ','; - p += hexnumstr (p, (ULONGEST) step_range_start); - *p++ = ','; - p += hexnumstr (p, (ULONGEST) step_range_end); - *p++ = 0; - - putpkt (buf); - getpkt (buf, (rs->remote_packet_size), 0); - - if (packet_ok (buf, &remote_protocol_E) == PACKET_OK) - return; - } - } - else - { - if (remote_protocol_e.support != PACKET_DISABLE) - { - p = buf; - *p++ = 'e'; - p += hexnumstr (p, (ULONGEST) step_range_start); - *p++ = ','; - p += hexnumstr (p, (ULONGEST) step_range_end); - *p++ = 0; - - putpkt (buf); - getpkt (buf, (rs->remote_packet_size), 0); - - if (packet_ok (buf, &remote_protocol_e) == PACKET_OK) - return; - } - } - } - if (siggnal != TARGET_SIGNAL_0) { buf[0] = step ? 'S' : 'C'; @@ -2969,7 +2764,7 @@ remote_console_output (char *msg) /* Wait until the remote machine stops, then return, storing status in STATUS just as `wait' would. - Returns "pid", which in the case of a multi-threaded + Returns "pid", which in the case of a multi-threaded remote OS, is the thread-id. */ static ptid_t @@ -2993,8 +2788,8 @@ remote_wait (ptid_t ptid, struct target_waitstatus *status) /* This is a hook for when we need to do something (perhaps the collection of trace data) every time the target stops. */ - if (target_wait_loop_hook) - (*target_wait_loop_hook) (); + if (deprecated_target_wait_loop_hook) + (*deprecated_target_wait_loop_hook) (); remote_stopped_by_watchpoint_p = 0; @@ -3027,7 +2822,7 @@ remote_wait (ptid_t ptid, struct target_waitstatus *status) LONGEST pnum = 0; /* If the packet contains a register number save it in pnum - and set p1 to point to the character following it. + and set p1 to point to the character following it. Otherwise p1 points to p. */ /* If this packet is an awatch packet, don't parse the 'a' @@ -3039,7 +2834,7 @@ remote_wait (ptid_t ptid, struct target_waitstatus *status) pnum = strtol (p, &p_temp, 16); p1 = (unsigned char *) p_temp; } - else + else p1 = p; if (p1 == p) /* No register number present here */ @@ -3103,70 +2898,10 @@ Packet: '%s'\n", if (buf[3] == 'p') { - /* Export Cisco kernel mode as a convenience variable - (so that it can be used in the GDB prompt if desired). */ - - if (cisco_kernel_mode == 1) - set_internalvar (lookup_internalvar ("cisco_kernel_mode"), - value_from_string ("PDEBUG-")); - cisco_kernel_mode = 0; thread_num = strtol ((const char *) &buf[4], NULL, 16); record_currthread (thread_num); } - else if (buf[3] == 'k') - { - /* Export Cisco kernel mode as a convenience variable - (so that it can be used in the GDB prompt if desired). */ - - if (cisco_kernel_mode == 1) - set_internalvar (lookup_internalvar ("cisco_kernel_mode"), - value_from_string ("KDEBUG-")); - cisco_kernel_mode = 1; - } goto got_status; - case 'N': /* Cisco special: status and offsets */ - { - bfd_vma text_addr, data_addr, bss_addr; - bfd_signed_vma text_off, data_off, bss_off; - unsigned char *p1; - - status->kind = TARGET_WAITKIND_STOPPED; - status->value.sig = (enum target_signal) - (((fromhex (buf[1])) << 4) + (fromhex (buf[2]))); - - if (symfile_objfile == NULL) - { - warning ("Relocation packet received with no symbol file. \ -Packet Dropped"); - goto got_status; - } - - /* Relocate object file. Buffer format is NAATT;DD;BB - * where AA is the signal number, TT is the new text - * address, DD * is the new data address, and BB is the - * new bss address. */ - - p = &buf[3]; - text_addr = strtoul (p, (char **) &p1, 16); - if (p1 == p || *p1 != ';') - warning ("Malformed relocation packet: Packet '%s'", buf); - p = p1 + 1; - data_addr = strtoul (p, (char **) &p1, 16); - if (p1 == p || *p1 != ';') - warning ("Malformed relocation packet: Packet '%s'", buf); - p = p1 + 1; - bss_addr = strtoul (p, (char **) &p1, 16); - if (p1 == p) - warning ("Malformed relocation packet: Packet '%s'", buf); - - if (remote_cisco_section_offsets (text_addr, data_addr, bss_addr, - &text_off, &data_off, &bss_off) - == 0) - if (text_off != 0 || data_off != 0 || bss_off != 0) - remote_cisco_objfile_relocate (text_off, data_off, bss_off); - - goto got_status; - } case 'W': /* Target exited */ { /* The remote process exited. */ @@ -3244,8 +2979,8 @@ remote_async_wait (ptid_t ptid, struct target_waitstatus *status) /* This is a hook for when we need to do something (perhaps the collection of trace data) every time the target stops. */ - if (target_wait_loop_hook) - (*target_wait_loop_hook) (); + if (deprecated_target_wait_loop_hook) + (*deprecated_target_wait_loop_hook) (); switch (buf[0]) { @@ -3276,19 +3011,19 @@ remote_async_wait (ptid_t ptid, struct target_waitstatus *status) long pnum = 0; /* If the packet contains a register number, save it in pnum - and set p1 to point to the character following it. + and set p1 to point to the character following it. Otherwise p1 points to p. */ /* If this packet is an awatch packet, don't parse the 'a' as a register number. */ - + if (!strncmp (p, "awatch", strlen ("awatch")) != 0) { /* Read the register number. */ pnum = strtol (p, &p_temp, 16); p1 = (unsigned char *) p_temp; } - else + else p1 = p; if (p1 == p) /* No register number present here */ @@ -3319,7 +3054,7 @@ remote_async_wait (ptid_t ptid, struct target_waitstatus *status) p = p_temp; } } - + else { struct packet_reg *reg = packet_reg_from_pnum (rs, pnum); @@ -3352,70 +3087,10 @@ remote_async_wait (ptid_t ptid, struct target_waitstatus *status) if (buf[3] == 'p') { - /* Export Cisco kernel mode as a convenience variable - (so that it can be used in the GDB prompt if desired). */ - - if (cisco_kernel_mode == 1) - set_internalvar (lookup_internalvar ("cisco_kernel_mode"), - value_from_string ("PDEBUG-")); - cisco_kernel_mode = 0; thread_num = strtol ((const char *) &buf[4], NULL, 16); record_currthread (thread_num); } - else if (buf[3] == 'k') - { - /* Export Cisco kernel mode as a convenience variable - (so that it can be used in the GDB prompt if desired). */ - - if (cisco_kernel_mode == 1) - set_internalvar (lookup_internalvar ("cisco_kernel_mode"), - value_from_string ("KDEBUG-")); - cisco_kernel_mode = 1; - } goto got_status; - case 'N': /* Cisco special: status and offsets */ - { - bfd_vma text_addr, data_addr, bss_addr; - bfd_signed_vma text_off, data_off, bss_off; - unsigned char *p1; - - status->kind = TARGET_WAITKIND_STOPPED; - status->value.sig = (enum target_signal) - (((fromhex (buf[1])) << 4) + (fromhex (buf[2]))); - - if (symfile_objfile == NULL) - { - warning ("Relocation packet recieved with no symbol file. \ -Packet Dropped"); - goto got_status; - } - - /* Relocate object file. Buffer format is NAATT;DD;BB - * where AA is the signal number, TT is the new text - * address, DD * is the new data address, and BB is the - * new bss address. */ - - p = &buf[3]; - text_addr = strtoul (p, (char **) &p1, 16); - if (p1 == p || *p1 != ';') - warning ("Malformed relocation packet: Packet '%s'", buf); - p = p1 + 1; - data_addr = strtoul (p, (char **) &p1, 16); - if (p1 == p || *p1 != ';') - warning ("Malformed relocation packet: Packet '%s'", buf); - p = p1 + 1; - bss_addr = strtoul (p, (char **) &p1, 16); - if (p1 == p) - warning ("Malformed relocation packet: Packet '%s'", buf); - - if (remote_cisco_section_offsets (text_addr, data_addr, bss_addr, - &text_off, &data_off, &bss_off) - == 0) - if (text_off != 0 || data_off != 0 || bss_off != 0) - remote_cisco_objfile_relocate (text_off, data_off, bss_off); - - goto got_status; - } case 'W': /* Target exited */ { /* The remote process exited. */ @@ -3558,9 +3233,23 @@ remote_fetch_registers (int regnum) struct packet_reg *r = &rs->regs[i]; if (r->in_g_packet) { - supply_register (r->regnum, regs + r->offset); - if (buf[r->offset * 2] == 'x') - set_register_cached (i, -1); + if (r->offset * 2 >= strlen (buf)) + /* A short packet that didn't include the register's + value, this implies that the register is zero (and + not that the register is unavailable). Supply that + zero value. */ + regcache_raw_supply (current_regcache, r->regnum, NULL); + else if (buf[r->offset * 2] == 'x') + { + gdb_assert (r->offset * 2 < strlen (buf)); + /* The register isn't available, mark it as such (at + the same time setting the value to zero). */ + regcache_raw_supply (current_regcache, r->regnum, NULL); + set_register_cached (i, -1); + } + else + regcache_raw_supply (current_regcache, r->regnum, + regs + r->offset); } } } @@ -3766,7 +3455,7 @@ check_binary_download (CORE_ADDR addr) { char *buf = alloca (rs->remote_packet_size); char *p; - + p = buf; *p++ = 'X'; p += hexnumstr (p, (ULONGEST) addr); @@ -3774,7 +3463,7 @@ check_binary_download (CORE_ADDR addr) p += hexnumstr (p, (ULONGEST) 0); *p++ = ':'; *p = '\0'; - + putpkt_binary (buf, (int) (p - buf)); getpkt (buf, (rs->remote_packet_size), 0); @@ -3856,14 +3545,14 @@ remote_write_bytes (CORE_ADDR memaddr, char *myaddr, int len) default: internal_error (__FILE__, __LINE__, "bad switch"); } - + /* Append "". */ memaddr = remote_address_masked (memaddr); p += hexnumstr (p, (ULONGEST) memaddr); /* Append ",". */ *p++ = ','; - + /* Append . Retain the location/size of . It may need to be adjusted once the packet body has been created. */ plen = p; @@ -3873,7 +3562,7 @@ remote_write_bytes (CORE_ADDR memaddr, char *myaddr, int len) /* Append ":". */ *p++ = ':'; *p = '\0'; - + /* Append the packet body. */ payload_start = p; switch (remote_protocol_binary_download.support) @@ -3902,7 +3591,7 @@ remote_write_bytes (CORE_ADDR memaddr, char *myaddr, int len) } if (nr_bytes < todo) { - /* Escape chars have filled up the buffer prematurely, + /* Escape chars have filled up the buffer prematurely, and we have actually sent fewer bytes than planned. Fix-up the length field of the packet. Use the same number of characters as before. */ @@ -3923,10 +3612,10 @@ remote_write_bytes (CORE_ADDR memaddr, char *myaddr, int len) default: internal_error (__FILE__, __LINE__, "bad switch"); } - + putpkt_binary (buf, (int) (p - buf)); getpkt (buf, sizeof_buf, 0); - + if (buf[0] == 'E') { /* There is no correspondance between what the remote protocol @@ -3936,7 +3625,7 @@ remote_write_bytes (CORE_ADDR memaddr, char *myaddr, int len) errno = EIO; return 0; } - + /* Return NR_BYTES, not TODO, in case escape chars caused us to send fewer bytes than we'd planned. */ return nr_bytes; @@ -4242,8 +3931,6 @@ putpkt_binary (char *buf, int cnt) } } -static int remote_cisco_mode; - /* Come here after finding the start of the frame. Collect the rest into BUF, verifying the checksum, length, and handling run-length compression. No more than sizeof_buf-1 characters are read so that @@ -4290,7 +3977,7 @@ read_frame (char *buf, check_0 = readchar (remote_timeout); if (check_0 >= 0) check_1 = readchar (remote_timeout); - + if (check_0 == SERIAL_TIMEOUT || check_1 == SERIAL_TIMEOUT) { if (remote_debug) @@ -4325,28 +4012,13 @@ read_frame (char *buf, int repeat; csum += c; - if (remote_cisco_mode == 0) - { - c = readchar (remote_timeout); - csum += c; - repeat = c - ' ' + 3; /* Compute repeat count */ - } - else - { - /* Cisco's run-length encoding variant uses two - hex chars to represent the repeat count. */ - - c = readchar (remote_timeout); - csum += c; - repeat = fromhex (c) << 4; - c = readchar (remote_timeout); - csum += c; - repeat += fromhex (c); - } + c = readchar (remote_timeout); + csum += c; + repeat = c - ' ' + 3; /* Compute repeat count */ /* The character before ``*'' is repeated. */ - if (repeat > 0 && repeat <= 255 + if (repeat > 0 && repeat <= 255 && bc > 0 && bc + repeat - 1 < sizeof_buf - 1) { @@ -4547,7 +4219,7 @@ extended_remote_mourn (void) { /* We do _not_ want to mourn the target like this; this will remove the extended remote target from the target stack, - and the next time the user says "run" it'll fail. + and the next time the user says "run" it'll fail. FIXME: What is the right thing to do here? */ #if 0 @@ -4565,13 +4237,14 @@ remote_mourn_1 (struct target_ops *target) /* In the extended protocol we want to be able to do things like "run" and have them basically work as expected. So we need - a special create_inferior function. + a special create_inferior function. FIXME: One day add support for changing the exec file we're debugging, arguments and an environment. */ static void -extended_remote_create_inferior (char *exec_file, char *args, char **env) +extended_remote_create_inferior (char *exec_file, char *args, char **env, + int from_tty) { /* Rip out the breakpoints; we'll reinsert them after restarting the remote server. */ @@ -4593,7 +4266,8 @@ extended_remote_create_inferior (char *exec_file, char *args, char **env) /* Async version of extended_remote_create_inferior. */ static void -extended_remote_async_create_inferior (char *exec_file, char *args, char **env) +extended_remote_async_create_inferior (char *exec_file, char *args, char **env, + int from_tty) { /* Rip out the breakpoints; we'll reinsert them after restarting the remote server. */ @@ -4662,19 +4336,19 @@ remote_insert_breakpoint (CORE_ADDR addr, char *contents_cache) struct remote_state *rs = get_remote_state (); #ifdef DEPRECATED_REMOTE_BREAKPOINT int val; -#endif +#endif int bp_size; /* Try the "Z" s/w breakpoint packet if it is not already disabled. If it succeeds, then set the support to PACKET_ENABLE. If it fails, and the user has explicitly requested the Z support then report an error, otherwise, mark it disabled and go on. */ - + if (remote_protocol_Z[Z_PACKET_SOFTWARE_BP].support != PACKET_DISABLE) { char *buf = alloca (rs->remote_packet_size); char *p = buf; - + addr = remote_address_masked (addr); *(p++) = 'Z'; *(p++) = '0'; @@ -4682,7 +4356,7 @@ remote_insert_breakpoint (CORE_ADDR addr, char *contents_cache) p += hexnumstr (p, (ULONGEST) addr); BREAKPOINT_FROM_PC (&addr, &bp_size); sprintf (p, ",%d", bp_size); - + putpkt (buf); getpkt (buf, (rs->remote_packet_size), 0); @@ -4697,7 +4371,7 @@ remote_insert_breakpoint (CORE_ADDR addr, char *contents_cache) } } -#ifdef DEPRECATED_REMOTE_BREAKPOINT +#ifdef DEPRECATED_REMOTE_BREAKPOINT val = target_read_memory (addr, contents_cache, sizeof big_break_insn); if (val == 0) @@ -4726,7 +4400,7 @@ remote_remove_breakpoint (CORE_ADDR addr, char *contents_cache) { char *buf = alloca (rs->remote_packet_size); char *p = buf; - + *(p++) = 'z'; *(p++) = '0'; *(p++) = ','; @@ -4735,7 +4409,7 @@ remote_remove_breakpoint (CORE_ADDR addr, char *contents_cache) p += hexnumstr (p, (ULONGEST) addr); BREAKPOINT_FROM_PC (&addr, &bp_size); sprintf (p, ",%d", bp_size); - + putpkt (buf); getpkt (buf, (rs->remote_packet_size), 0); @@ -4781,13 +4455,13 @@ remote_insert_watchpoint (CORE_ADDR addr, int len, int type) error ("Can't set hardware watchpoints without the '%s' (%s) packet\n", remote_protocol_Z[packet].name, remote_protocol_Z[packet].title); - + sprintf (buf, "Z%x,", packet); p = strchr (buf, '\0'); addr = remote_address_masked (addr); p += hexnumstr (p, (ULONGEST) addr); sprintf (p, ",%x", len); - + putpkt (buf); getpkt (buf, (rs->remote_packet_size), 0); @@ -4816,7 +4490,7 @@ remote_remove_watchpoint (CORE_ADDR addr, int len, int type) error ("Can't clear hardware watchpoints without the '%s' (%s) packet\n", remote_protocol_Z[packet].name, remote_protocol_Z[packet].title); - + sprintf (buf, "z%x,", packet); p = strchr (buf, '\0'); addr = remote_address_masked (addr); @@ -4873,10 +4547,13 @@ remote_stopped_by_watchpoint (void) return remote_stopped_by_watchpoint_p; } +extern int stepped_after_stopped_by_watchpoint; + static CORE_ADDR remote_stopped_data_address (void) { - if (remote_stopped_by_watchpoint ()) + if (remote_stopped_by_watchpoint () + || stepped_after_stopped_by_watchpoint) return remote_watch_data_address; return (CORE_ADDR)0; } @@ -4889,21 +4566,21 @@ remote_insert_hw_breakpoint (CORE_ADDR addr, char *shadow) struct remote_state *rs = get_remote_state (); char *buf = alloca (rs->remote_packet_size); char *p = buf; - + /* The length field should be set to the size of a breakpoint instruction. */ - BREAKPOINT_FROM_PC (&addr, &len); + BREAKPOINT_FROM_PC (&addr, &len); if (remote_protocol_Z[Z_PACKET_HARDWARE_BP].support == PACKET_DISABLE) error ("Can't set hardware breakpoint without the '%s' (%s) packet\n", remote_protocol_Z[Z_PACKET_HARDWARE_BP].name, remote_protocol_Z[Z_PACKET_HARDWARE_BP].title); - + *(p++) = 'Z'; *(p++) = '1'; *(p++) = ','; - + addr = remote_address_masked (addr); p += hexnumstr (p, (ULONGEST) addr); sprintf (p, ",%x", len); @@ -4924,7 +4601,7 @@ remote_insert_hw_breakpoint (CORE_ADDR addr, char *shadow) } -static int +static int remote_remove_hw_breakpoint (CORE_ADDR addr, char *shadow) { int len; @@ -4941,18 +4618,18 @@ remote_remove_hw_breakpoint (CORE_ADDR addr, char *shadow) error ("Can't clear hardware breakpoint without the '%s' (%s) packet\n", remote_protocol_Z[Z_PACKET_HARDWARE_BP].name, remote_protocol_Z[Z_PACKET_HARDWARE_BP].title); - + *(p++) = 'z'; *(p++) = '1'; *(p++) = ','; - + addr = remote_address_masked (addr); p += hexnumstr (p, (ULONGEST) addr); sprintf (p, ",%x", len); putpkt(buf); getpkt (buf, (rs->remote_packet_size), 0); - + switch (packet_ok (buf, &remote_protocol_Z[Z_PACKET_HARDWARE_BP])) { case PACKET_ERROR: @@ -5052,7 +4729,7 @@ compare_sections_command (char *args, int from_tty) if (!(s->flags & SEC_LOAD)) continue; /* skip non-loadable section */ - size = bfd_get_section_size_before_reloc (s); + size = bfd_get_section_size (s); if (size == 0) continue; /* skip zero-length section */ @@ -5126,6 +4803,41 @@ remote_xfer_partial (struct target_ops *ops, enum target_object object, case TARGET_OBJECT_AVR: query_type = 'R'; break; + + case TARGET_OBJECT_AUXV: + if (remote_protocol_qPart_auxv.support != PACKET_DISABLE) + { + unsigned int total = 0; + while (len > 0) + { + LONGEST n = min ((rs->remote_packet_size - 2) / 2, len); + snprintf (buf2, rs->remote_packet_size, + "qPart:auxv:read::%s,%s", + phex_nz (offset, sizeof offset), + phex_nz (n, sizeof n)); + i = putpkt (buf2); + if (i < 0) + return total > 0 ? total : i; + buf2[0] = '\0'; + getpkt (buf2, rs->remote_packet_size, 0); + if (packet_ok (buf2, &remote_protocol_qPart_auxv) != PACKET_OK) + return total > 0 ? total : -1; + if (buf2[0] == 'O' && buf2[1] == 'K' && buf2[2] == '\0') + break; /* Got EOF indicator. */ + /* Got some data. */ + i = hex2bin (buf2, readbuf, len); + if (i > 0) + { + readbuf = (void *) ((char *) readbuf + i); + offset += i; + len -= i; + total += i; + } + } + return total; + } + return -1; + default: return -1; } @@ -5480,404 +5192,6 @@ Specify the serial device it is connected to (e.g. /dev/ttya).", extended_remote_ops.to_mourn_inferior = extended_remote_mourn; } -/* - * Command: info remote-process - * - * This implements Cisco's version of the "info proc" command. - * - * This query allows the target stub to return an arbitrary string - * (or strings) giving arbitrary information about the target process. - * This is optional; the target stub isn't required to implement it. - * - * Syntax: qfProcessInfo request first string - * qsProcessInfo request subsequent string - * reply: 'O' - * 'l' last reply (empty) - */ - -static void -remote_info_process (char *args, int from_tty) -{ - struct remote_state *rs = get_remote_state (); - char *buf = alloca (rs->remote_packet_size); - - if (remote_desc == 0) - error ("Command can only be used when connected to the remote target."); - - putpkt ("qfProcessInfo"); - getpkt (buf, (rs->remote_packet_size), 0); - if (buf[0] == 0) - return; /* Silently: target does not support this feature. */ - - if (buf[0] == 'E') - error ("info proc: target error."); - - while (buf[0] == 'O') /* Capitol-O packet */ - { - remote_console_output (&buf[1]); - putpkt ("qsProcessInfo"); - getpkt (buf, (rs->remote_packet_size), 0); - } -} - -/* - * Target Cisco - */ - -static void -remote_cisco_open (char *name, int from_tty) -{ - int ex; - if (name == 0) - error ("To open a remote debug connection, you need to specify what \n" - "device is attached to the remote system (e.g. host:port)."); - - /* See FIXME above */ - wait_forever_enabled_p = 1; - - target_preopen (from_tty); - - unpush_target (&remote_cisco_ops); - - remote_desc = remote_serial_open (name); - if (!remote_desc) - perror_with_name (name); - - /* - * If a baud rate was specified on the gdb command line it will - * be greater than the initial value of -1. If it is, use it otherwise - * default to 9600 - */ - - baud_rate = (baud_rate > 0) ? baud_rate : 9600; - if (serial_setbaudrate (remote_desc, baud_rate)) - { - serial_close (remote_desc); - perror_with_name (name); - } - - serial_raw (remote_desc); - - /* If there is something sitting in the buffer we might take it as a - response to a command, which would be bad. */ - serial_flush_input (remote_desc); - - if (from_tty) - { - puts_filtered ("Remote debugging using "); - puts_filtered (name); - puts_filtered ("\n"); - } - - remote_cisco_mode = 1; - - push_target (&remote_cisco_ops); /* Switch to using cisco target now */ - - init_all_packet_configs (); - - general_thread = -2; - continue_thread = -2; - - /* Probe for ability to use "ThreadInfo" query, as required. */ - use_threadinfo_query = 1; - use_threadextra_query = 1; - - /* Without this, some commands which require an active target (such - as kill) won't work. This variable serves (at least) double duty - as both the pid of the target process (if it has such), and as a - flag indicating that a target is active. These functions should - be split out into seperate variables, especially since GDB will - someday have a notion of debugging several processes. */ - inferior_ptid = pid_to_ptid (MAGIC_NULL_PID); - - /* Start the remote connection; if error, discard this target. See - the comments in remote_open_1() for further details such as the - need to re-throw the exception. */ - ex = catch_exceptions (uiout, - remote_start_remote_dummy, NULL, - "Couldn't establish connection to remote" - " target\n", - RETURN_MASK_ALL); - if (ex < 0) - { - pop_target (); - throw_exception (ex); - } -} - -static void -remote_cisco_close (int quitting) -{ - remote_cisco_mode = 0; - remote_close (quitting); -} - -static void -remote_cisco_mourn (void) -{ - remote_mourn_1 (&remote_cisco_ops); -} - -enum -{ - READ_MORE, - FATAL_ERROR, - ENTER_DEBUG, - DISCONNECT_TELNET -} -minitelnet_return; - -/* Shared between readsocket() and readtty(). The size is arbitrary, - however all targets are known to support a 400 character packet. */ -static char tty_input[400]; - -static int escape_count; -static int echo_check; -extern int quit_flag; - -static int -readsocket (void) -{ - int data; - - /* Loop until the socket doesn't have any more data */ - - while ((data = readchar (0)) >= 0) - { - /* Check for the escape sequence */ - if (data == '|') - { - /* If this is the fourth escape, get out */ - if (++escape_count == 4) - { - return ENTER_DEBUG; - } - else - { /* This is a '|', but not the fourth in a row. - Continue without echoing it. If it isn't actually - one of four in a row, it'll be echoed later. */ - continue; - } - } - else - /* Not a '|' */ - { - /* Ensure any pending '|'s are flushed. */ - - for (; escape_count > 0; escape_count--) - putchar ('|'); - } - - if (data == '\r') /* If this is a return character, */ - continue; /* - just supress it. */ - - if (echo_check != -1) /* Check for echo of user input. */ - { - if (tty_input[echo_check] == data) - { - gdb_assert (echo_check <= sizeof (tty_input)); - echo_check++; /* Character matched user input: */ - continue; /* Continue without echoing it. */ - } - else if ((data == '\n') && (tty_input[echo_check] == '\r')) - { /* End of the line (and of echo checking). */ - echo_check = -1; /* No more echo supression */ - continue; /* Continue without echoing. */ - } - else - { /* Failed check for echo of user input. - We now have some suppressed output to flush! */ - int j; - - for (j = 0; j < echo_check; j++) - putchar (tty_input[j]); - echo_check = -1; - } - } - putchar (data); /* Default case: output the char. */ - } - - if (data == SERIAL_TIMEOUT) /* Timeout returned from readchar. */ - return READ_MORE; /* Try to read some more */ - else - return FATAL_ERROR; /* Trouble, bail out */ -} - -static int -readtty (void) -{ - int tty_bytecount; - - /* First, read a buffer full from the terminal */ - tty_bytecount = read (fileno (stdin), tty_input, sizeof (tty_input) - 1); - if (tty_bytecount == -1) - { - perror ("readtty: read failed"); - return FATAL_ERROR; - } - - /* Remove a quoted newline. */ - if (tty_input[tty_bytecount - 1] == '\n' && - tty_input[tty_bytecount - 2] == '\\') /* line ending in backslash */ - { - tty_input[--tty_bytecount] = 0; /* remove newline */ - tty_input[--tty_bytecount] = 0; /* remove backslash */ - } - - /* Turn trailing newlines into returns */ - if (tty_input[tty_bytecount - 1] == '\n') - tty_input[tty_bytecount - 1] = '\r'; - - /* If the line consists of a ~, enter debugging mode. */ - if ((tty_input[0] == '~') && (tty_bytecount == 2)) - return ENTER_DEBUG; - - /* Make this a zero terminated string and write it out */ - tty_input[tty_bytecount] = 0; - if (serial_write (remote_desc, tty_input, tty_bytecount)) - { - perror_with_name ("readtty: write failed"); - return FATAL_ERROR; - } - - return READ_MORE; -} - -static int -minitelnet (void) -{ - fd_set input; /* file descriptors for select */ - int tablesize; /* max number of FDs for select */ - int status; - int quit_count = 0; - - escape_count = 0; - echo_check = -1; - - tablesize = 8 * sizeof (input); - - for (;;) - { - /* Check for anything from our socket - doesn't block. Note that - this must be done *before* the select as there may be - buffered I/O waiting to be processed. */ - - if ((status = readsocket ()) == FATAL_ERROR) - { - error ("Debugging terminated by communications error"); - } - else if (status != READ_MORE) - { - return (status); - } - - fflush (stdout); /* Flush output before blocking */ - - /* Now block on more socket input or TTY input */ - - FD_ZERO (&input); - FD_SET (fileno (stdin), &input); - FD_SET (deprecated_serial_fd (remote_desc), &input); - - status = select (tablesize, &input, 0, 0, 0); - if ((status == -1) && (errno != EINTR)) - { - error ("Communications error on select %d", errno); - } - - /* Handle Control-C typed */ - - if (quit_flag) - { - if ((++quit_count) == 2) - { - if (query ("Interrupt GDB? ")) - { - printf_filtered ("Interrupted by user.\n"); - throw_exception (RETURN_QUIT); - } - quit_count = 0; - } - quit_flag = 0; - - if (remote_break) - serial_send_break (remote_desc); - else - serial_write (remote_desc, "\003", 1); - - continue; - } - - /* Handle console input */ - - if (FD_ISSET (fileno (stdin), &input)) - { - quit_count = 0; - echo_check = 0; - status = readtty (); - if (status == READ_MORE) - continue; - - return status; /* telnet session ended */ - } - } -} - -static ptid_t -remote_cisco_wait (ptid_t ptid, struct target_waitstatus *status) -{ - if (minitelnet () != ENTER_DEBUG) - { - error ("Debugging session terminated by protocol error"); - } - putpkt ("?"); - return remote_wait (ptid, status); -} - -static void -init_remote_cisco_ops (void) -{ - remote_cisco_ops.to_shortname = "cisco"; - remote_cisco_ops.to_longname = "Remote serial target in cisco-specific protocol"; - remote_cisco_ops.to_doc = - "Use a remote machine via TCP, using a cisco-specific protocol.\n\ -Specify the serial device it is connected to (e.g. host:2020)."; - remote_cisco_ops.to_open = remote_cisco_open; - remote_cisco_ops.to_close = remote_cisco_close; - remote_cisco_ops.to_detach = remote_detach; - remote_cisco_ops.to_disconnect = remote_disconnect; - remote_cisco_ops.to_resume = remote_resume; - remote_cisco_ops.to_wait = remote_cisco_wait; - remote_cisco_ops.to_fetch_registers = remote_fetch_registers; - remote_cisco_ops.to_store_registers = remote_store_registers; - remote_cisco_ops.to_prepare_to_store = remote_prepare_to_store; - remote_cisco_ops.to_xfer_memory = remote_xfer_memory; - remote_cisco_ops.to_files_info = remote_files_info; - remote_cisco_ops.to_insert_breakpoint = remote_insert_breakpoint; - remote_cisco_ops.to_remove_breakpoint = remote_remove_breakpoint; - remote_cisco_ops.to_remove_hw_breakpoint = remote_remove_hw_breakpoint; - remote_cisco_ops.to_insert_hw_breakpoint = remote_insert_hw_breakpoint; - remote_cisco_ops.to_insert_watchpoint = remote_insert_watchpoint; - remote_cisco_ops.to_remove_watchpoint = remote_remove_watchpoint; - remote_cisco_ops.to_stopped_by_watchpoint = remote_stopped_by_watchpoint; - remote_cisco_ops.to_stopped_data_address = remote_stopped_data_address; - remote_cisco_ops.to_can_use_hw_breakpoint = remote_check_watch_resources; - remote_cisco_ops.to_kill = remote_kill; - remote_cisco_ops.to_load = generic_load; - remote_cisco_ops.to_mourn_inferior = remote_cisco_mourn; - remote_cisco_ops.to_thread_alive = remote_thread_alive; - remote_cisco_ops.to_find_new_threads = remote_threads_info; - remote_cisco_ops.to_pid_to_str = remote_pid_to_str; - remote_cisco_ops.to_extra_thread_info = remote_threads_extra_info; - remote_cisco_ops.to_stratum = process_stratum; - remote_cisco_ops.to_has_all_memory = 1; - remote_cisco_ops.to_has_memory = 1; - remote_cisco_ops.to_has_stack = 1; - remote_cisco_ops.to_has_registers = 1; - remote_cisco_ops.to_has_execution = 1; - remote_cisco_ops.to_magic = OPS_MAGIC; -} - static int remote_can_async_p (void) { @@ -6015,12 +5329,11 @@ show_remote_cmd (char *args, int from_tty) /* FIXME: cagney/2002-06-15: This function should iterate over remote_show_cmdlist for a list of sub commands to show. */ show_remote_protocol_Z_packet_cmd (args, from_tty, NULL); - show_remote_protocol_e_packet_cmd (args, from_tty, NULL); - show_remote_protocol_E_packet_cmd (args, from_tty, NULL); show_remote_protocol_P_packet_cmd (args, from_tty, NULL); show_remote_protocol_qSymbol_packet_cmd (args, from_tty, NULL); show_remote_protocol_vcont_packet_cmd (args, from_tty, NULL); show_remote_protocol_binary_download_cmd (args, from_tty, NULL); + show_remote_protocol_qPart_auxv_packet_cmd (args, from_tty, NULL); } static void @@ -6054,13 +5367,12 @@ _initialize_remote (void) struct cmd_list_element *tmpcmd; /* architecture specific data */ - remote_gdbarch_data_handle = register_gdbarch_data (init_remote_state); + remote_gdbarch_data_handle = gdbarch_data_register_post_init (init_remote_state); /* Old tacky stuff. NOTE: This comes after the remote protocol so that the remote protocol has been initialized. */ - register_gdbarch_swap (&remote_address_size, - sizeof (&remote_address_size), NULL); - register_gdbarch_swap (NULL, 0, build_remote_gdbarch_data); + DEPRECATED_REGISTER_GDBARCH_SWAP (remote_address_size); + deprecated_register_gdbarch_swap (NULL, 0, build_remote_gdbarch_data); init_remote_ops (); add_target (&remote_ops); @@ -6074,12 +5386,9 @@ _initialize_remote (void) init_extended_async_remote_ops (); add_target (&extended_async_remote_ops); - init_remote_cisco_ops (); - add_target (&remote_cisco_ops); - /* Hook into new objfile notification. */ - remote_new_objfile_chain = target_new_objfile_hook; - target_new_objfile_hook = remote_new_objfile; + remote_new_objfile_chain = deprecated_target_new_objfile_hook; + deprecated_target_new_objfile_hook = remote_new_objfile; #if 0 init_remote_threadtests (); @@ -6190,9 +5499,6 @@ in a memory packet.\n", &showlist); #endif - add_info ("remote-process", remote_info_process, - "Query the remote system for process info."); - add_packet_config_cmd (&remote_protocol_vcont, "vCont", "verbose-resume", set_remote_protocol_vcont_packet_cmd, @@ -6207,28 +5513,6 @@ in a memory packet.\n", &remote_set_cmdlist, &remote_show_cmdlist, 0); - add_packet_config_cmd (&remote_protocol_e, - "e", "step-over-range", - set_remote_protocol_e_packet_cmd, - show_remote_protocol_e_packet_cmd, - &remote_set_cmdlist, &remote_show_cmdlist, - 0); - /* Disable by default. The ``e'' packet has nasty interactions with - the threading code - it relies on global state. */ - remote_protocol_e.detect = AUTO_BOOLEAN_FALSE; - update_packet_config (&remote_protocol_e); - - add_packet_config_cmd (&remote_protocol_E, - "E", "step-over-range-w-signal", - set_remote_protocol_E_packet_cmd, - show_remote_protocol_E_packet_cmd, - &remote_set_cmdlist, &remote_show_cmdlist, - 0); - /* Disable by default. The ``e'' packet has nasty interactions with - the threading code - it relies on global state. */ - remote_protocol_E.detect = AUTO_BOOLEAN_FALSE; - update_packet_config (&remote_protocol_E); - add_packet_config_cmd (&remote_protocol_P, "P", "set-register", set_remote_protocol_P_packet_cmd, @@ -6271,6 +5555,13 @@ in a memory packet.\n", &remote_set_cmdlist, &remote_show_cmdlist, 0); + add_packet_config_cmd (&remote_protocol_qPart_auxv, + "qPart_auxv", "read-aux-vector", + set_remote_protocol_qPart_auxv_packet_cmd, + show_remote_protocol_qPart_auxv_packet_cmd, + &remote_set_cmdlist, &remote_show_cmdlist, + 0); + /* Keep the old ``set remote Z-packet ...'' working. */ add_setshow_auto_boolean_cmd ("Z-packet", class_obscure, &remote_Z_packet_detect, "\