X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdbserver%2Fremote-utils.cc;h=67c560d1c87bbdd5d42b8b9448bd8b5b9091affb;hb=465e1b0f196faea1fc949863af023b762ef86188;hp=316f04e32ee34862dfceb7ad24e4d3ee28b3f786;hpb=6eeb5c5531f0238d367a2f3f1520ae3e2401f7ea;p=deliverable%2Fbinutils-gdb.git diff --git a/gdbserver/remote-utils.cc b/gdbserver/remote-utils.cc index 316f04e32e..67c560d1c8 100644 --- a/gdbserver/remote-utils.cc +++ b/gdbserver/remote-utils.cc @@ -78,12 +78,6 @@ typedef int socklen_t; #ifndef IN_PROCESS_AGENT -#if USE_WIN32API -# define INVALID_DESCRIPTOR INVALID_SOCKET -#else -# define INVALID_DESCRIPTOR -1 -#endif - /* Extra value for readchar_callback. */ enum { /* The callback is currently not scheduled. */ @@ -108,8 +102,8 @@ struct sym_cache static int remote_is_stdio = 0; -static gdb_fildes_t remote_desc = INVALID_DESCRIPTOR; -static gdb_fildes_t listen_desc = INVALID_DESCRIPTOR; +static int remote_desc = -1; +static int listen_desc = -1; #ifdef USE_WIN32API # define read(fd, buf, len) recv (fd, (char *) buf, len, 0) @@ -119,7 +113,7 @@ static gdb_fildes_t listen_desc = INVALID_DESCRIPTOR; int gdb_connected (void) { - return remote_desc != INVALID_DESCRIPTOR; + return remote_desc != -1; } /* Return true if the remote connection is over stdio. */ @@ -144,7 +138,7 @@ enable_async_notification (int fd) #endif } -static int +static void handle_accept_event (int err, gdb_client_data client_data) { struct sockaddr_storage sockaddr; @@ -213,8 +207,6 @@ handle_accept_event (int err, gdb_client_data client_data) until GDB as selected all-stop/non-stop, and has queried the threads' status ('?'). */ target_async (0); - - return 0; } /* Prepare for a later connection to a remote debugger. @@ -427,7 +419,7 @@ remote_close (void) if (! remote_connection_is_stdio ()) close (remote_desc); #endif - remote_desc = INVALID_DESCRIPTOR; + remote_desc = -1; reset_readchar (); } @@ -710,7 +702,7 @@ putpkt_binary_1 (char *buf, int cnt, int is_notif) /* Check for an input interrupt while we're here. */ if (cc == '\003' && current_thread != NULL) - the_target->pt->request_interrupt (); + the_target->request_interrupt (); } while (cc != '+'); @@ -779,7 +771,7 @@ input_interrupt (int unused) return; } - the_target->pt->request_interrupt (); + the_target->request_interrupt (); } } @@ -790,7 +782,7 @@ check_remote_input_interrupt_request (void) /* This function may be called before establishing communications, therefore we need to validate the remote descriptor. */ - if (remote_desc == INVALID_DESCRIPTOR) + if (remote_desc == -1) return; input_interrupt (0); @@ -930,27 +922,21 @@ reset_readchar (void) readchar_bufcnt = 0; if (readchar_callback != NOT_SCHEDULED) { - delete_callback_event (readchar_callback); + delete_timer (readchar_callback); readchar_callback = NOT_SCHEDULED; } } /* Process remaining data in readchar_buf. */ -static int +static void process_remaining (void *context) { - int res; - /* This is a one-shot event. */ readchar_callback = NOT_SCHEDULED; if (readchar_bufcnt > 0) - res = handle_serial_event (0, NULL); - else - res = 0; - - return res; + handle_serial_event (0, NULL); } /* If there is still data in the buffer, queue another event to process it, @@ -960,7 +946,7 @@ static void reschedule (void) { if (readchar_bufcnt > 0 && readchar_callback == NOT_SCHEDULED) - readchar_callback = append_callback_event (process_remaining, NULL); + readchar_callback = create_timer (0, process_remaining, NULL); } /* Read a packet from the remote machine, with error checking, @@ -986,7 +972,7 @@ getpkt (char *buf) check for an input interrupt. */ if (c == '\003') { - the_target->pt->request_interrupt (); + the_target->request_interrupt (); continue; } @@ -1076,7 +1062,7 @@ getpkt (char *buf) { /* Consume the interrupt character in the buffer. */ readchar (); - the_target->pt->request_interrupt (); + the_target->request_interrupt (); } return bp - buf; @@ -1204,6 +1190,26 @@ prepare_resume_reply (char *buf, ptid_t ptid, else sprintf (buf, "T%02x", status->value.sig); + if (disable_packet_T) + { + /* This is a bit (OK, a lot) of a kludge, however, this isn't + really a user feature, but exists only so GDB can use the + gdbserver to test handling of the 'S' stop reply packet, so + we would rather this code be as simple as possible. + + By this point we've started to build the 'T' stop packet, + and it should look like 'Txx....' where 'x' is a hex digit. + An 'S' stop packet always looks like 'Sxx', so all we do + here is convert the buffer from a T packet to an S packet + and the avoid adding any extra content by breaking out. */ + gdb_assert (*buf == 'T'); + gdb_assert (isxdigit (*(buf + 1))); + gdb_assert (isxdigit (*(buf + 2))); + *buf = 'S'; + *(buf + 3) = '\0'; + break; + } + buf += strlen (buf); saved_thread = current_thread; @@ -1214,7 +1220,7 @@ prepare_resume_reply (char *buf, ptid_t ptid, regcache = get_thread_regcache (current_thread, 1); - if (the_target->pt->stopped_by_watchpoint ()) + if (the_target->stopped_by_watchpoint ()) { CORE_ADDR addr; int i; @@ -1222,7 +1228,7 @@ prepare_resume_reply (char *buf, ptid_t ptid, memcpy (buf, "watch:", 6); buf += 6; - addr = the_target->pt->stopped_data_address (); + addr = the_target->stopped_data_address (); /* Convert each byte of the address into two hexadecimal chars. Note that we take sizeof (void *) instead of