Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(10)

Side by Side Diff: gdb/gdbserver/remote-utils.c

Issue 11969036: Merge GDB 7.5.1 (Closed) Base URL: http://git.chromium.org/native_client/nacl-gdb.git@master
Patch Set: Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « gdb/gdbserver/regcache.c ('k') | gdb/gdbserver/server.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* Remote utility routines for the remote server for GDB. 1 /* Remote utility routines for the remote server for GDB.
2 Copyright (C) 1986, 1989, 1993-2012 Free Software Foundation, Inc. 2 Copyright (C) 1986, 1989, 1993-2012 Free Software Foundation, Inc.
3 3
4 This file is part of GDB. 4 This file is part of GDB.
5 5
6 This program is free software; you can redistribute it and/or modify 6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by 7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or 8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version. 9 (at your option) any later version.
10 10
11 This program is distributed in the hope that it will be useful, 11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details. 14 GNU General Public License for more details.
15 15
16 You should have received a copy of the GNU General Public License 16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
18 18
19 #include "server.h" 19 #include "server.h"
20 #include "terminal.h" 20 #include "terminal.h"
21 #include "target.h" 21 #include "target.h"
22 #include "gdbthread.h"
22 #include <stdio.h> 23 #include <stdio.h>
23 #include <string.h> 24 #include <string.h>
24 #if HAVE_SYS_IOCTL_H 25 #if HAVE_SYS_IOCTL_H
25 #include <sys/ioctl.h> 26 #include <sys/ioctl.h>
26 #endif 27 #endif
27 #if HAVE_SYS_FILE_H 28 #if HAVE_SYS_FILE_H
28 #include <sys/file.h> 29 #include <sys/file.h>
29 #endif 30 #endif
30 #if HAVE_NETINET_IN_H 31 #if HAVE_NETINET_IN_H
31 #include <netinet/in.h> 32 #include <netinet/in.h>
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 struct sym_cache 99 struct sym_cache
99 { 100 {
100 char *name; 101 char *name;
101 CORE_ADDR addr; 102 CORE_ADDR addr;
102 struct sym_cache *next; 103 struct sym_cache *next;
103 }; 104 };
104 105
105 int remote_debug = 0; 106 int remote_debug = 0;
106 struct ui_file *gdb_stdlog; 107 struct ui_file *gdb_stdlog;
107 108
109 static int remote_is_stdio = 0;
110
108 static gdb_fildes_t remote_desc = INVALID_DESCRIPTOR; 111 static gdb_fildes_t remote_desc = INVALID_DESCRIPTOR;
109 static gdb_fildes_t listen_desc = INVALID_DESCRIPTOR; 112 static gdb_fildes_t listen_desc = INVALID_DESCRIPTOR;
110 113
111 /* FIXME headerize? */ 114 /* FIXME headerize? */
112 extern int using_threads; 115 extern int using_threads;
113 extern int debug_threads; 116 extern int debug_threads;
114 117
115 /* If true, then GDB has requested noack mode. */ 118 /* If true, then GDB has requested noack mode. */
116 int noack_mode = 0; 119 int noack_mode = 0;
117 /* If true, then we tell GDB to use noack mode by default. */ 120 /* If true, then we tell GDB to use noack mode by default. */
118 int transport_is_reliable = 0; 121 int transport_is_reliable = 0;
119 122
120 #ifdef USE_WIN32API 123 #ifdef USE_WIN32API
121 # define read(fd, buf, len) recv (fd, (char *) buf, len, 0) 124 # define read(fd, buf, len) recv (fd, (char *) buf, len, 0)
122 # define write(fd, buf, len) send (fd, (char *) buf, len, 0) 125 # define write(fd, buf, len) send (fd, (char *) buf, len, 0)
123 #endif 126 #endif
124 127
125 int 128 int
126 gdb_connected (void) 129 gdb_connected (void)
127 { 130 {
128 return remote_desc != INVALID_DESCRIPTOR; 131 return remote_desc != INVALID_DESCRIPTOR;
129 } 132 }
130 133
134 /* Return true if the remote connection is over stdio. */
135
136 int
137 remote_connection_is_stdio (void)
138 {
139 return remote_is_stdio;
140 }
141
131 static void 142 static void
132 enable_async_notification (int fd) 143 enable_async_notification (int fd)
133 { 144 {
134 #if defined(F_SETFL) && defined (FASYNC) 145 #if defined(F_SETFL) && defined (FASYNC)
135 int save_fcntl_flags; 146 int save_fcntl_flags;
136 147
137 save_fcntl_flags = fcntl (fd, F_GETFL, 0); 148 save_fcntl_flags = fcntl (fd, F_GETFL, 0);
138 fcntl (fd, F_SETFL, save_fcntl_flags | FASYNC); 149 fcntl (fd, F_SETFL, save_fcntl_flags | FASYNC);
139 #if defined (F_SETOWN) 150 #if defined (F_SETOWN)
140 fcntl (fd, F_SETOWN, getpid ()); 151 fcntl (fd, F_SETOWN, getpid ());
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
213 { 224 {
214 char *port_str; 225 char *port_str;
215 #ifdef USE_WIN32API 226 #ifdef USE_WIN32API
216 static int winsock_initialized; 227 static int winsock_initialized;
217 #endif 228 #endif
218 int port; 229 int port;
219 struct sockaddr_in sockaddr; 230 struct sockaddr_in sockaddr;
220 socklen_t tmp; 231 socklen_t tmp;
221 char *port_end; 232 char *port_end;
222 233
234 remote_is_stdio = 0;
235 if (strcmp (name, STDIO_CONNECTION_NAME) == 0)
236 {
237 /* We need to record fact that we're using stdio sooner than the
238 call to remote_open so start_inferior knows the connection is
239 via stdio. */
240 remote_is_stdio = 1;
241 transport_is_reliable = 1;
242 return;
243 }
244
223 port_str = strchr (name, ':'); 245 port_str = strchr (name, ':');
224 if (port_str == NULL) 246 if (port_str == NULL)
225 { 247 {
226 transport_is_reliable = 0; 248 transport_is_reliable = 0;
227 return; 249 return;
228 } 250 }
229 251
230 port = strtoul (port_str + 1, &port_end, 10); 252 port = strtoul (port_str + 1, &port_end, 10);
231 if (port_str[1] == '\0' || *port_end != '\0') 253 if (port_str[1] == '\0' || *port_end != '\0')
232 fatal ("Bad port argument: %s", name); 254 fatal ("Bad port argument: %s", name);
(...skipping 30 matching lines...) Expand all
263 285
264 /* Open a connection to a remote debugger. 286 /* Open a connection to a remote debugger.
265 NAME is the filename used for communication. */ 287 NAME is the filename used for communication. */
266 288
267 void 289 void
268 remote_open (char *name) 290 remote_open (char *name)
269 { 291 {
270 char *port_str; 292 char *port_str;
271 293
272 port_str = strchr (name, ':'); 294 port_str = strchr (name, ':');
295 #ifdef USE_WIN32API
273 if (port_str == NULL) 296 if (port_str == NULL)
297 error ("Only <host>:<port> is supported on this platform.");
298 #endif
299
300 if (strcmp (name, STDIO_CONNECTION_NAME) == 0)
274 { 301 {
275 #ifdef USE_WIN32API 302 fprintf (stderr, "Remote debugging using stdio\n");
276 error ("Only <host>:<port> is supported on this platform."); 303
277 #else 304 /* Use stdin as the handle of the connection.
305 » We only select on reads, for example. */
306 remote_desc = fileno (stdin);
307
308 enable_async_notification (remote_desc);
309
310 /* Register the event loop handler. */
311 add_file_handler (remote_desc, handle_serial_event, NULL);
312 }
313 #ifndef USE_WIN32API
314 else if (port_str == NULL)
315 {
278 struct stat statbuf; 316 struct stat statbuf;
279 317
280 if (stat (name, &statbuf) == 0 318 if (stat (name, &statbuf) == 0
281 && (S_ISCHR (statbuf.st_mode) || S_ISFIFO (statbuf.st_mode))) 319 && (S_ISCHR (statbuf.st_mode) || S_ISFIFO (statbuf.st_mode)))
282 remote_desc = open (name, O_RDWR); 320 remote_desc = open (name, O_RDWR);
283 else 321 else
284 { 322 {
285 errno = EINVAL; 323 errno = EINVAL;
286 remote_desc = -1; 324 remote_desc = -1;
287 } 325 }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
332 ioctl (remote_desc, TIOCSETP, &sg); 370 ioctl (remote_desc, TIOCSETP, &sg);
333 } 371 }
334 #endif 372 #endif
335 373
336 fprintf (stderr, "Remote debugging using %s\n", name); 374 fprintf (stderr, "Remote debugging using %s\n", name);
337 375
338 enable_async_notification (remote_desc); 376 enable_async_notification (remote_desc);
339 377
340 /* Register the event loop handler. */ 378 /* Register the event loop handler. */
341 add_file_handler (remote_desc, handle_serial_event, NULL); 379 add_file_handler (remote_desc, handle_serial_event, NULL);
380 }
342 #endif /* USE_WIN32API */ 381 #endif /* USE_WIN32API */
343 }
344 else 382 else
345 { 383 {
346 int port; 384 int port;
347 socklen_t len; 385 socklen_t len;
348 struct sockaddr_in sockaddr; 386 struct sockaddr_in sockaddr;
349 387
350 len = sizeof (sockaddr); 388 len = sizeof (sockaddr);
351 if (getsockname (listen_desc, 389 if (getsockname (listen_desc,
352 (struct sockaddr *) &sockaddr, &len) < 0 390 (struct sockaddr *) &sockaddr, &len) < 0
353 || len < sizeof (sockaddr)) 391 || len < sizeof (sockaddr))
354 perror_with_name ("Can't determine port"); 392 perror_with_name ("Can't determine port");
355 port = ntohs (sockaddr.sin_port); 393 port = ntohs (sockaddr.sin_port);
356 394
357 fprintf (stderr, "Listening on port %d\n", port); 395 fprintf (stderr, "Listening on port %d\n", port);
358 fflush (stderr); 396 fflush (stderr);
359 397
360 /* Register the event loop handler. */ 398 /* Register the event loop handler. */
361 add_file_handler (listen_desc, handle_accept_event, NULL); 399 add_file_handler (listen_desc, handle_accept_event, NULL);
362 } 400 }
363 } 401 }
364 402
365 void 403 void
366 remote_close (void) 404 remote_close (void)
367 { 405 {
368 delete_file_handler (remote_desc); 406 delete_file_handler (remote_desc);
369 407
370 #ifdef USE_WIN32API 408 #ifdef USE_WIN32API
371 closesocket (remote_desc); 409 closesocket (remote_desc);
372 #else 410 #else
373 close (remote_desc); 411 if (! remote_connection_is_stdio ())
412 close (remote_desc);
374 #endif 413 #endif
375 remote_desc = INVALID_DESCRIPTOR; 414 remote_desc = INVALID_DESCRIPTOR;
376 415
377 reset_readchar (); 416 reset_readchar ();
378 } 417 }
379 418
380 /* Convert hex digit A to a number. */ 419 /* Convert hex digit A to a number. */
381 420
382 static int 421 static int
383 fromhex (int a) 422 fromhex (int a)
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after
722 761
723 /* Since the stub is not sending a process id, then default to 762 /* Since the stub is not sending a process id, then default to
724 what's in the current inferior. */ 763 what's in the current inferior. */
725 pid = ptid_get_pid (((struct inferior_list_entry *) current_inferior)->id); 764 pid = ptid_get_pid (((struct inferior_list_entry *) current_inferior)->id);
726 765
727 if (obuf) 766 if (obuf)
728 *obuf = pp; 767 *obuf = pp;
729 return ptid_build (pid, tid, 0); 768 return ptid_build (pid, tid, 0);
730 } 769 }
731 770
771 /* Write COUNT bytes in BUF to the client.
772 The result is the number of bytes written or -1 if error.
773 This may return less than COUNT. */
774
775 static int
776 write_prim (const void *buf, int count)
777 {
778 if (remote_connection_is_stdio ())
779 return write (fileno (stdout), buf, count);
780 else
781 return write (remote_desc, buf, count);
782 }
783
784 /* Read COUNT bytes from the client and store in BUF.
785 The result is the number of bytes read or -1 if error.
786 This may return less than COUNT. */
787
788 static int
789 read_prim (void *buf, int count)
790 {
791 if (remote_connection_is_stdio ())
792 return read (fileno (stdin), buf, count);
793 else
794 return read (remote_desc, buf, count);
795 }
796
732 /* Send a packet to the remote machine, with error checking. 797 /* Send a packet to the remote machine, with error checking.
733 The data of the packet is in BUF, and the length of the 798 The data of the packet is in BUF, and the length of the
734 packet is in CNT. Returns >= 0 on success, -1 otherwise. */ 799 packet is in CNT. Returns >= 0 on success, -1 otherwise. */
735 800
736 static int 801 static int
737 putpkt_binary_1 (char *buf, int cnt, int is_notif) 802 putpkt_binary_1 (char *buf, int cnt, int is_notif)
738 { 803 {
739 int i; 804 int i;
740 unsigned char csum = 0; 805 unsigned char csum = 0;
741 char *buf2; 806 char *buf2;
(...skipping 17 matching lines...) Expand all
759 *p++ = '#'; 824 *p++ = '#';
760 *p++ = tohex ((csum >> 4) & 0xf); 825 *p++ = tohex ((csum >> 4) & 0xf);
761 *p++ = tohex (csum & 0xf); 826 *p++ = tohex (csum & 0xf);
762 827
763 *p = '\0'; 828 *p = '\0';
764 829
765 /* Send it over and over until we get a positive ack. */ 830 /* Send it over and over until we get a positive ack. */
766 831
767 do 832 do
768 { 833 {
769 if (write (remote_desc, buf2, p - buf2) != p - buf2) 834 if (write_prim (buf2, p - buf2) != p - buf2)
770 { 835 {
771 perror ("putpkt(write)"); 836 perror ("putpkt(write)");
772 free (buf2); 837 free (buf2);
773 return -1; 838 return -1;
774 } 839 }
775 840
776 if (noack_mode || is_notif) 841 if (noack_mode || is_notif)
777 { 842 {
778 /* Don't expect an ack then. */ 843 /* Don't expect an ack then. */
779 if (remote_debug) 844 if (remote_debug)
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
854 /* Protect against spurious interrupts. This has been observed to 919 /* Protect against spurious interrupts. This has been observed to
855 be a problem under NetBSD 1.4 and 1.5. */ 920 be a problem under NetBSD 1.4 and 1.5. */
856 921
857 FD_ZERO (&readset); 922 FD_ZERO (&readset);
858 FD_SET (remote_desc, &readset); 923 FD_SET (remote_desc, &readset);
859 if (select (remote_desc + 1, &readset, 0, 0, &immediate) > 0) 924 if (select (remote_desc + 1, &readset, 0, 0, &immediate) > 0)
860 { 925 {
861 int cc; 926 int cc;
862 char c = 0; 927 char c = 0;
863 928
864 cc = read (remote_desc, &c, 1); 929 cc = read_prim (&c, 1);
865 930
866 if (cc != 1 || c != '\003' || current_inferior == NULL) 931 if (cc != 1 || c != '\003' || current_inferior == NULL)
867 { 932 {
868 fprintf (stderr, "input_interrupt, count = %d c = %d ('%c')\n", 933 fprintf (stderr, "input_interrupt, count = %d c = %d ('%c')\n",
869 cc, c, c); 934 cc, c, c);
870 return; 935 return;
871 } 936 }
872 937
873 (*the_target->request_interrupt) (); 938 (*the_target->request_interrupt) ();
874 } 939 }
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
982 1047
983 /* Returns next char from remote GDB. -1 if error. */ 1048 /* Returns next char from remote GDB. -1 if error. */
984 1049
985 static int 1050 static int
986 readchar (void) 1051 readchar (void)
987 { 1052 {
988 int ch; 1053 int ch;
989 1054
990 if (readchar_bufcnt == 0) 1055 if (readchar_bufcnt == 0)
991 { 1056 {
992 readchar_bufcnt = read (remote_desc, readchar_buf, 1057 readchar_bufcnt = read_prim (readchar_buf, sizeof (readchar_buf));
993 » » » sizeof (readchar_buf));
994 1058
995 if (readchar_bufcnt <= 0) 1059 if (readchar_bufcnt <= 0)
996 { 1060 {
997 if (readchar_bufcnt == 0) 1061 if (readchar_bufcnt == 0)
998 fprintf (stderr, "readchar: Got EOF\n"); 1062 fprintf (stderr, "readchar: Got EOF\n");
999 else 1063 else
1000 perror ("readchar"); 1064 perror ("readchar");
1001 1065
1002 return -1; 1066 return -1;
1003 } 1067 }
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
1105 fprintf (stderr, 1169 fprintf (stderr,
1106 "Bad checksum, sentsum=0x%x, csum=0x%x, " 1170 "Bad checksum, sentsum=0x%x, csum=0x%x, "
1107 "buf=%s [no-ack-mode, Bad medium?]\n", 1171 "buf=%s [no-ack-mode, Bad medium?]\n",
1108 (c1 << 4) + c2, csum, buf); 1172 (c1 << 4) + c2, csum, buf);
1109 /* Not much we can do, GDB wasn't expecting an ack/nac. */ 1173 /* Not much we can do, GDB wasn't expecting an ack/nac. */
1110 break; 1174 break;
1111 } 1175 }
1112 1176
1113 fprintf (stderr, "Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n", 1177 fprintf (stderr, "Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n",
1114 (c1 << 4) + c2, csum, buf); 1178 (c1 << 4) + c2, csum, buf);
1115 if (write (remote_desc, "-", 1) != 1) 1179 if (write_prim ("-", 1) != 1)
1116 return -1; 1180 return -1;
1117 } 1181 }
1118 1182
1119 if (!noack_mode) 1183 if (!noack_mode)
1120 { 1184 {
1121 if (remote_debug) 1185 if (remote_debug)
1122 { 1186 {
1123 fprintf (stderr, "getpkt (\"%s\"); [sending ack] \n", buf); 1187 fprintf (stderr, "getpkt (\"%s\"); [sending ack] \n", buf);
1124 fflush (stderr); 1188 fflush (stderr);
1125 } 1189 }
1126 1190
1127 if (write (remote_desc, "+", 1) != 1) 1191 if (write_prim ("+", 1) != 1)
1128 return -1; 1192 return -1;
1129 1193
1130 if (remote_debug) 1194 if (remote_debug)
1131 { 1195 {
1132 fprintf (stderr, "[sent ack]\n"); 1196 fprintf (stderr, "[sent ack]\n");
1133 fflush (stderr); 1197 fflush (stderr);
1134 } 1198 }
1135 } 1199 }
1136 else 1200 else
1137 { 1201 {
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
1243 disable_async_io (); 1307 disable_async_io ();
1244 putpkt (own_buf); 1308 putpkt (own_buf);
1245 enable_async_io (); 1309 enable_async_io ();
1246 } 1310 }
1247 1311
1248 void 1312 void
1249 prepare_resume_reply (char *buf, ptid_t ptid, 1313 prepare_resume_reply (char *buf, ptid_t ptid,
1250 struct target_waitstatus *status) 1314 struct target_waitstatus *status)
1251 { 1315 {
1252 if (debug_threads) 1316 if (debug_threads)
1253 fprintf (stderr, "Writing resume reply for %s:%d\n\n", 1317 fprintf (stderr, "Writing resume reply for %s:%d\n",
1254 target_pid_to_str (ptid), status->kind); 1318 target_pid_to_str (ptid), status->kind);
1255 1319
1256 switch (status->kind) 1320 switch (status->kind)
1257 { 1321 {
1258 case TARGET_WAITKIND_STOPPED: 1322 case TARGET_WAITKIND_STOPPED:
1259 { 1323 {
1260 struct thread_info *saved_inferior; 1324 struct thread_info *saved_inferior;
1261 const char **regp; 1325 const char **regp;
1262 struct regcache *regcache; 1326 struct regcache *regcache;
1263 1327
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1320 /* In non-stop, don't change the general thread behind 1384 /* In non-stop, don't change the general thread behind
1321 GDB's back. */ 1385 GDB's back. */
1322 if (!non_stop) 1386 if (!non_stop)
1323 general_thread = ptid; 1387 general_thread = ptid;
1324 sprintf (buf, "thread:"); 1388 sprintf (buf, "thread:");
1325 buf += strlen (buf); 1389 buf += strlen (buf);
1326 buf = write_ptid (buf, ptid); 1390 buf = write_ptid (buf, ptid);
1327 strcat (buf, ";"); 1391 strcat (buf, ";");
1328 buf += strlen (buf); 1392 buf += strlen (buf);
1329 1393
1330 » » if (the_target->core_of_thread) 1394 » » core = target_core_of_thread (ptid);
1331 » » core = (*the_target->core_of_thread) (ptid); 1395
1332 if (core != -1) 1396 if (core != -1)
1333 { 1397 {
1334 sprintf (buf, "core:"); 1398 sprintf (buf, "core:");
1335 buf += strlen (buf); 1399 buf += strlen (buf);
1336 sprintf (buf, "%x", core); 1400 sprintf (buf, "%x", core);
1337 strcat (buf, ";"); 1401 strcat (buf, ";");
1338 buf += strlen (buf); 1402 buf += strlen (buf);
1339 } 1403 }
1340 } 1404 }
1341 } 1405 }
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after
1706 char *buf = xmalloc (strlen (msg) * 2 + 2); 1770 char *buf = xmalloc (strlen (msg) * 2 + 2);
1707 1771
1708 buf[0] = 'O'; 1772 buf[0] = 'O';
1709 hexify (buf + 1, msg, 0); 1773 hexify (buf + 1, msg, 0);
1710 1774
1711 putpkt (buf); 1775 putpkt (buf);
1712 free (buf); 1776 free (buf);
1713 } 1777 }
1714 1778
1715 #endif 1779 #endif
OLDNEW
« no previous file with comments | « gdb/gdbserver/regcache.c ('k') | gdb/gdbserver/server.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698