2 * gdbserv-state.c -- part of GDB remote server
4 * Copyright (C) 2000, 2002, 2006 Red Hat.
5 * This file is part of SID and is licensed under the GPL.
6 * See the file COPYING.SID for conditions for redistribution.
14 #include "gdbserv-state.h"
15 #include "gdbserv-utils.h"
17 FILE *gdbserv_state_trace = NULL;
20 state2str (struct gdbserv *gdbserv)
22 switch (gdbserv->state)
24 case GDBSERV_STATE_UNINITIALIZED: return "UNINITIALIZED";
25 case GDBSERV_STATE_RESETTING: return "RESETTING";
26 case GDBSERV_STATE_STUMBLING: return "STUMBLING";
27 case GDBSERV_STATE_STEPPING: return "STEPPING";
28 case GDBSERV_STATE_RUNNING: return "RUNNING";
29 case GDBSERV_STATE_BROKEN: return "BROKEN";
30 case GDBSERV_STATE_EXITING: return "EXITING";
31 case GDBSERV_STATE_EXITED: return "EXITED";
37 gdbserv_client_data (struct gdbserv *gdbserv)
39 return gdbserv->client->data;
43 gdbserv_target_data (struct gdbserv *gdbserv)
45 return gdbserv->target->data;
49 gdbserv_fromclient_attach (struct gdbserv_client *gdbclient,
50 gdbserv_target_attach *to_target_attach,
51 void *target_attach_data)
53 struct gdbserv *gdbserv = malloc (sizeof (struct gdbserv));
54 if (gdbserv_state_trace)
55 fprintf (gdbserv_state_trace, "<gdbserv_fromclient_attach %s>\n",
57 gdbserv->client = gdbclient;
58 gdbserv_input_attach (gdbserv);
59 gdbserv_output_attach (gdbserv);
60 gdbserv->target = to_target_attach (gdbserv, target_attach_data);
61 if (gdbserv->target == NULL)
63 gdbserv_output_detach (gdbserv);
64 gdbserv_input_detach (gdbserv);
70 gdbserv->state = GDBSERV_STATE_RESETTING;
76 gdbserv_fromclient_detach (struct gdbserv *gdbserv)
78 if (gdbserv_state_trace)
79 fprintf (gdbserv_state_trace, "<gdbserv_fromclient_detach %s>\n",
81 gdbserv->target->detach (gdbserv);
82 gdbserv_input_detach (gdbserv);
83 gdbserv_output_detach (gdbserv);
89 gdbserv_fromclient_break (struct gdbserv *gdbserv)
91 if (gdbserv_state_trace)
92 fprintf (gdbserv_state_trace, "<gdbserv_fromclient_break %s>\n",
94 switch (gdbserv->state)
96 case GDBSERV_STATE_RUNNING:
97 case GDBSERV_STATE_STEPPING:
98 case GDBSERV_STATE_STUMBLING:
99 gdbserv->target->break_program (gdbserv);
100 /* NOTE: no state change - we might break the program at the
101 same time as it stops itself */
110 gdbserv_fromclient_data (struct gdbserv *gdbserv,
115 if (gdbserv_state_trace)
116 fprintf (gdbserv_state_trace, "<gdbserv_fromclient_data %s>\n",
117 state2str (gdbserv));
119 gdbserv_input_data_packet (gdbserv, buf, len);
124 gdbserv_data_packet (struct gdbserv *gdbserv)
126 const char *exec_direction = "forward";
127 char packet_type = gdbserv_input_char (gdbserv);
128 if (gdbserv_state_trace)
129 fprintf (gdbserv_state_trace, "<gdbserv_data_packet:%c>\n", packet_type);
131 /* NB: default is for this to send an empty packet */
133 /* Check for a 'b' (backward) prefix for S, s, C and c. This indicates that
134 the direction of execution is to be backward. */
135 if (packet_type == 'b')
137 char next = gdbserv_input_peek (gdbserv);
140 case 'S': case 's': case 'C': case 'c':
141 exec_direction = "backward";
142 packet_type = gdbserv_input_char (gdbserv);
154 unsigned long sigval = gdbserv->target->compute_signal (gdbserv, gdbserv->target->get_trap_number (gdbserv));
155 gdbserv_output_char (gdbserv, 'S');
156 gdbserv_output_byte (gdbserv, sigval);
160 case 'd': /* toggle debug flag */
161 gdbserv_output_string (gdbserv, "");
164 case 'q': /* general query packet */
165 if (gdbserv_input_string_match (gdbserv, "Rcmd,") >= 0
166 && gdbserv->target->process_rcmd)
168 /* Format: qRcmd,<hex-encoded-command> */
171 /* create a buffer sufficent to hold the decoded
172 command. There are two hex digits per encoded byte. */
173 sizeof_cmd = gdbserv_input_size (gdbserv) / 2;
176 gdbserv_output_string (gdbserv, "E11");
179 cmd = alloca (sizeof_cmd + 1);
180 /* Decode/read the command into the buffer, check that the
181 command exactly fits - not to many, not to few bytes of
183 if (gdbserv_input_bytes (gdbserv, cmd, sizeof_cmd) < sizeof_cmd
184 || gdbserv_input_size (gdbserv) != 0)
186 gdbserv_output_string (gdbserv, "E12");
189 /* Process the command. Guarentee that that it is NUL
191 cmd[sizeof_cmd] = '\0';
192 gdbserv->target->process_rcmd (gdbserv, cmd, sizeof_cmd);
194 else if (gdbserv->target->process_get_gen)
196 gdbserv->target->process_get_gen (gdbserv);
200 if (gdbserv_state_trace)
201 fprintf (gdbserv_state_trace, "<general_query>\n");
205 case 'Q': /* general set packet */
206 if (gdbserv->target->process_set_gen)
207 gdbserv->target->process_set_gen (gdbserv);
210 if (gdbserv_state_trace)
211 fprintf (gdbserv_state_trace, "<general_set>\n");
215 case 'g': /* return the value of the CPU registers. */
216 if (gdbserv->target->gg_reg_nr != NULL
217 && gdbserv->target->get_reg != NULL
218 && gdbserv->target->sizeof_reg != NULL
219 && gdbserv->target->output_reg != NULL)
223 for (i = 0, reg_nr = gdbserv->target->gg_reg_nr (gdbserv, i);
225 i++, reg_nr = gdbserv->target->gg_reg_nr (gdbserv, i))
227 struct gdbserv_reg reg;
228 long sizeof_reg = gdbserv->target->sizeof_reg (gdbserv, reg_nr);
229 long len = (sizeof_reg < 0 ? -sizeof_reg : sizeof_reg);
231 gdbserv->target->get_reg (gdbserv, reg_nr, ®);
233 memset (®, sizeof (reg), 0);
234 gdbserv->target->output_reg (gdbserv, ®, len);
237 else if (gdbserv->target->process_get_regs != NULL)
239 gdbserv->target->process_get_regs (gdbserv);
243 case 'G': /* set the value of the CPU registers - return OK */
244 if (gdbserv->target->gg_reg_nr != NULL
245 && gdbserv->target->set_reg != NULL
246 && gdbserv->target->sizeof_reg != NULL
247 && gdbserv->target->input_reg != NULL)
251 for (i = 0, reg_nr = gdbserv->target->gg_reg_nr (gdbserv, i);
253 i++, reg_nr = gdbserv->target->gg_reg_nr (gdbserv, i))
255 struct gdbserv_reg reg;
256 long sizeof_reg = gdbserv->target->sizeof_reg (gdbserv, reg_nr);
257 long len = (sizeof_reg < 0 ? -sizeof_reg : sizeof_reg);
258 gdbserv->target->input_reg (gdbserv, ®, len);
260 /* only supply registers that are useful. */
261 gdbserv->target->set_reg (gdbserv, reg_nr, ®);
263 gdbserv_output_string (gdbserv, "OK");
265 else if (gdbserv->target->process_set_regs != NULL)
267 gdbserv->target->process_set_regs (gdbserv);
271 case 'A': /* UNOFFICIAL: set program arguments */
272 gdbserv->target->process_set_args (gdbserv);
276 case 'p': /* UNOFFICIAL/BROKEN: read single reg */
278 char *ptr = &packet[1];
280 struct gdbserv_reg reg;
281 if (__gdbserv_hex_to_ulong (&ptr, ®nr)
283 && gdbserv->target->process_get_reg (gdbserv, regnr, ®))
285 /* FIXME: Return single register */
286 gdbserv_output_string (gdbserv, "P01");
290 gdbserv_output_string (gdbserv, "P01");
296 case 'P': /* write single reg */
297 if (gdbserv->target->set_reg != NULL
298 && gdbserv->target->input_reg != NULL)
301 struct gdbserv_reg reg;
302 if (gdbserv_input_hex_ulong (gdbserv, ®nr) < 0)
304 gdbserv_output_string (gdbserv, "E01");
306 else if (gdbserv_input_char (gdbserv) != '=')
308 gdbserv_output_string (gdbserv, "E02");
310 else if (gdbserv->target->input_reg (gdbserv, ®, 0) < 0)
312 gdbserv_output_string (gdbserv, "E03");
316 gdbserv->target->set_reg (gdbserv, regnr, ®);
317 gdbserv_output_string (gdbserv, "OK");
320 else if (gdbserv->target->process_set_reg != NULL)
323 if (gdbserv_input_hex_ulong (gdbserv, ®nr) < 0)
325 gdbserv_output_string (gdbserv, "E01");
327 else if (gdbserv_input_char (gdbserv) != '=')
329 gdbserv_output_string (gdbserv, "E02");
331 else if (gdbserv->target->process_set_reg (gdbserv, regnr) < 0)
333 gdbserv_output_string (gdbserv, "E03");
337 gdbserv_output_string (gdbserv, "OK");
342 case 'm': /* mAA..AA,LLLL Read LLLL bytes at address AA..AA */
343 case 'M': /* MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK */
344 case 'X': /* XAA..AA,LLLL: Write LLLL binary bytes at AA.AA return OK */
345 if ((packet_type == 'm' && gdbserv->target->get_mem != NULL)
346 || ((packet_type == 'M' || packet_type == 'X')
347 && gdbserv->target->set_mem != NULL))
349 struct gdbserv_reg addr;
351 if (gdbserv_input_reg_beb (gdbserv, &addr, 0) < 0)
353 gdbserv_output_string (gdbserv, "E01");
355 else if (gdbserv_input_char (gdbserv) != ',')
357 gdbserv_output_string (gdbserv, "E02");
359 else if (gdbserv_input_hex_ulong (gdbserv, &len) < 0)
361 gdbserv_output_string (gdbserv, "E03");
363 else if (packet_type == 'm')
365 void *data = alloca (len);
366 long nr_read = gdbserv->target->get_mem (gdbserv, &addr, data, len);
367 gdbserv_output_bytes (gdbserv, data, nr_read);
369 else if (gdbserv_input_char (gdbserv) == ':')
371 if (packet_type == 'X')
373 void *data = alloca (len);
374 if (gdbserv_input_escaped_binary (gdbserv, data, len) != len)
375 gdbserv_output_string (gdbserv, "E05");
376 else if (gdbserv->target->set_mem (gdbserv, &addr, data, len) != len)
377 gdbserv_output_string (gdbserv, "E07");
379 gdbserv_output_string (gdbserv, "OK");
383 void *data = alloca (len);
384 if (gdbserv_input_bytes (gdbserv, data, len) != len)
385 gdbserv_output_string (gdbserv, "E06");
386 else if (gdbserv->target->set_mem (gdbserv, &addr, data, len) != len)
387 gdbserv_output_string (gdbserv, "E09");
389 gdbserv_output_string (gdbserv, "OK");
391 gdbserv_output_string (gdbserv, "OK");
395 gdbserv_output_string (gdbserv, "E04");
398 /* Deprecated / SID Interface. */
399 else if ((packet_type == 'm'
400 && gdbserv->target->process_get_mem != NULL)
401 || ((packet_type == 'M' || packet_type == 'X')
402 && gdbserv->target->process_set_mem != NULL))
404 struct gdbserv_reg addr;
405 struct gdbserv_reg len;
406 if (gdbserv_input_reg_beb (gdbserv, &addr, 0) < 0)
408 gdbserv_output_string (gdbserv, "E01");
410 else if (gdbserv_input_char (gdbserv) != ',')
412 gdbserv_output_string (gdbserv, "E02");
414 else if (gdbserv_input_reg_beb (gdbserv, &len, 0) < 0)
416 gdbserv_output_string (gdbserv, "E03");
418 else if (packet_type == 'm')
420 gdbserv->target->process_get_mem (gdbserv, &addr, &len);
422 else if (gdbserv_input_char (gdbserv) == ':')
424 if (packet_type == 'X')
425 gdbserv->target->process_set_mem (gdbserv, &addr, &len, 1);
427 gdbserv->target->process_set_mem (gdbserv, &addr, &len, 0);
428 gdbserv_output_string (gdbserv, "OK");
432 gdbserv_output_string (gdbserv, "E04");
438 case 's': /* sAA..AA Step from address AA..AA(optional) */
440 case 'c': /* cAA..AA Continue at address AA..AA(optional) */
441 /* try to read optional parameter, pc unchanged if no parm */
444 struct gdbserv_reg addr;
445 unsigned long sigval = 0;
447 if (packet_type == 'C' || packet_type == 'S')
449 gdbserv_input_hex_ulong (gdbserv, &sigval);
450 if (gdbserv_input_peek (gdbserv) == ';')
451 gdbserv_input_char (gdbserv);
454 // If there was a first address argument, set it as as the PC
455 if (gdbserv_input_reg_beb (gdbserv, &addr, 0) >= 0)
456 gdbserv->target->process_set_pc (gdbserv, &addr);
458 /* Need to flush the instruction cache here, as we may have
459 deposited a breakpoint, and the icache probably has no way of
460 knowing that a data ref to some location may have changed
461 something that is in the instruction cache. */
463 gdbserv->target->flush_i_cache (gdbserv);
465 /* If we have a function to handle signals, call it. */
466 if (sigval != 0 && gdbserv->target->process_signal != NULL)
468 /* If 0 is returned, we either ignored the signal or invoked a user
469 handler. Otherwise, the user program should die. */
470 if (! gdbserv->target->process_signal (gdbserv, sigval))
474 /* if we didn't have a function to handle signals, nuke the
478 gdbserv->target->sigkill_program (gdbserv);
482 /* Set the direction. */
483 gdbserv->target->set_exec_direction (gdbserv, exec_direction);
485 /* Set machine state to force a single step. */
486 if (packet_type == 's' || packet_type == 'S')
488 gdbserv->target->singlestep_program (gdbserv);
489 gdbserv->state = GDBSERV_STATE_STEPPING;
493 gdbserv->target->continue_program (gdbserv);
494 gdbserv->state = GDBSERV_STATE_RUNNING;
500 case 'e': /* eAA..AA,BB..BB Step out of address range [AA .. BB) */
501 /* try to read optional parameter, pc unchanged if no parm */
504 struct gdbserv_reg addr;
505 struct gdbserv_reg addr_limit;
506 unsigned long sigval = 0;
509 if (packet_type == 'E')
511 gdbserv_input_hex_ulong (gdbserv, &sigval);
512 if (gdbserv_input_peek (gdbserv) == ',')
513 gdbserv_input_char (gdbserv);
516 if (gdbserv_input_reg_beb (gdbserv, &addr, 0) < 0)
518 gdbserv_output_string (gdbserv, "E01");
522 if (gdbserv_input_peek (gdbserv) == ',')
523 gdbserv_input_char (gdbserv);
525 if (gdbserv_input_reg_beb (gdbserv, &addr_limit, 0) < 0)
527 gdbserv_output_string (gdbserv, "E02");
531 gdbserv->target->flush_i_cache (gdbserv);
533 /* If we have a function to handle signals, call it. */
534 if (sigval != 0 && gdbserv->target->process_signal != NULL)
536 /* If 0 is returned, we either ignored the signal or invoked a user
537 handler. Otherwise, the user program should die. */
538 if (! gdbserv->target->process_signal (gdbserv, sigval))
542 /* if we didn't have a function to handle signals, nuke the
546 gdbserv->target->sigkill_program (gdbserv);
550 rc = gdbserv->target->rangestep_program (gdbserv, & addr, & addr_limit);
551 if (rc == GDBSERV_TARGET_RC_OK)
553 gdbserv->state = GDBSERV_STATE_RUNNING;
554 gdbserv_output_string (gdbserv, "OK");
558 gdbserv_output_string (gdbserv, ""); /* act as if unsupported */
564 /* kill the program */
567 gdbserv->target->exit_program (gdbserv);
568 gdbserv->state = GDBSERV_STATE_EXITING;
574 /* breakpoint [Zz]<type>,<address>,<length> */
575 if (gdbserv->target->remove_breakpoint != NULL
576 && gdbserv->target->set_breakpoint != NULL)
578 enum gdbserv_target_bp bp;
579 enum gdbserv_target_rc rc;
581 struct gdbserv_reg addr;
582 struct gdbserv_reg len;
583 if (gdbserv_input_hex_ulong (gdbserv, &type) < 0
584 || gdbserv_input_char (gdbserv) != ','
585 || gdbserv_input_reg_beb (gdbserv, &addr, 0) < 0
586 || gdbserv_input_char (gdbserv) != ','
587 || gdbserv_input_reg_beb (gdbserv, &len, 0) < 0)
589 /* Signal parse error */
590 gdbserv_output_string (gdbserv, "E01");
595 case 0: bp = GDBSERV_TARGET_BP_SOFTWARE; break;
596 case 1: bp = GDBSERV_TARGET_BP_HARDWARE; break;
597 case 2: bp = GDBSERV_TARGET_BP_WRITE; break;
598 case 3: bp = GDBSERV_TARGET_BP_READ; break;
599 case 4: bp = GDBSERV_TARGET_BP_ACCESS; break;
600 default: bp = GDBSERV_TARGET_BP_UNKNOWN; break;
602 if (bp == GDBSERV_TARGET_BP_UNKNOWN)
604 /* only recognize software breakpoints */
605 gdbserv_output_string (gdbserv, "E02");
608 if (packet_type == 'z')
609 rc = gdbserv->target->remove_breakpoint (gdbserv, bp, &addr, &len);
611 rc = gdbserv->target->set_breakpoint (gdbserv, bp, &addr, &len);
614 case GDBSERV_TARGET_RC_OK:
615 gdbserv_output_string (gdbserv, "OK");
617 case GDBSERV_TARGET_RC_ERROR:
618 gdbserv_output_string (gdbserv, "E03");
620 case GDBSERV_TARGET_RC_UNKNOWN:
621 /* Behave as if operation isn't supported. */
628 case 'r': /* Reset */
629 if (gdbserv->target->reset_program)
631 gdbserv->target->reset_program (gdbserv);
632 gdbserv->state = GDBSERV_STATE_RESETTING;
634 gdbserv_output_string (gdbserv, "");
638 case 'R': /* Rnn restart server */
639 if (gdbserv->target->restart_program)
641 gdbserv->target->restart_program (gdbserv);
642 gdbserv->state = GDBSERV_STATE_RESETTING;
647 gdbserv_output_string (gdbserv, "");
653 /* cycle-step [ <addr> ] [ "," <nnn> ] */
654 if (gdbserv->target->cyclestep_program)
656 gdbserv->target->cyclestep_program (gdbserv);
657 gdbserv->state = GDBSERV_STATE_STEPPING;
660 gdbserv_output_string (gdbserv, "");
665 if (gdbserv->target->process_target_packet)
666 gdbserv->target->process_target_packet (gdbserv);
669 if (gdbserv_state_trace)
670 fprintf (gdbserv_state_trace, "<target_packet>\n");
671 gdbserv_output_string (gdbserv, "");
676 gdbserv_output_packet (gdbserv);
680 gdbserv_fromtarget_reset (struct gdbserv *gdbserv)
682 enum gdbserv_state nextstate;
683 if (gdbserv_state_trace)
684 fprintf (gdbserv_state_trace, "<gdbserv_fromtarget_reset %s>\n",
685 state2str (gdbserv));
686 switch (gdbserv->state)
688 case GDBSERV_STATE_RESETTING:
689 /* After a reset / power-on GDB is always expecting the remote
690 target to stop and receive further commands. Hence NO NOTIFY
692 gdbserv->target->singlestep_program (gdbserv);
693 nextstate = GDBSERV_STATE_STUMBLING;
696 nextstate = gdbserv->state;
698 gdbserv->state = nextstate;
702 gdbserv_fromtarget_break (struct gdbserv *gdbserv,
705 enum gdbserv_state nextstate;
706 if (gdbserv_state_trace)
707 fprintf (gdbserv_state_trace, "<gdbserv_fromtarget_break %s>\n",
708 state2str (gdbserv));
709 switch (gdbserv->state)
711 case GDBSERV_STATE_STUMBLING:
712 /* Server has gone through a reset. GDB expects the client to
713 be ready for further commands */
714 nextstate = GDBSERV_STATE_BROKEN;
716 case GDBSERV_STATE_RUNNING:
717 case GDBSERV_STATE_STEPPING:
718 gdbserv_output_discard (gdbserv);
719 gdbserv_output_char (gdbserv, 'T');
720 gdbserv_output_byte (gdbserv, sigval);
721 /* When the target knows how, expedite the supply of register
722 values back to GDB. Do this by appending them to the end of
723 the T packet response. */
724 if (gdbserv->target->expedited_reg_nr != NULL
725 && gdbserv->target->get_reg != NULL
726 && gdbserv->target->output_reg != NULL)
730 for (i = 0, reg_nr = gdbserv->target->expedited_reg_nr (gdbserv, i);
732 i++, reg_nr = gdbserv->target->expedited_reg_nr (gdbserv, i))
734 struct gdbserv_reg reg;
735 gdbserv_output_char (gdbserv, ';');
736 gdbserv_output_byte (gdbserv, reg_nr);
737 gdbserv_output_char (gdbserv, ':');
738 gdbserv->target->get_reg (gdbserv, reg_nr, ®);
739 gdbserv->target->output_reg (gdbserv, ®, 0);
741 gdbserv_output_char (gdbserv, ';');
743 /* Deprecated / SID Interface. */
744 else if (gdbserv->target->process_get_exp_regs)
745 gdbserv->target->process_get_exp_regs (gdbserv);
746 gdbserv_output_packet (gdbserv);
747 nextstate = GDBSERV_STATE_BROKEN;
750 nextstate = gdbserv->state;
752 gdbserv->state = nextstate;
756 gdbserv_fromtarget_exit (struct gdbserv *gdbserv,
759 enum gdbserv_state nextstate;
760 if (gdbserv_state_trace)
761 fprintf (gdbserv_state_trace, "<gdbserv_fromtarget_exit %s>\n",
762 state2str (gdbserv));
763 switch (gdbserv->state)
765 case GDBSERV_STATE_RUNNING:
766 case GDBSERV_STATE_STEPPING:
767 gdbserv_output_char (gdbserv, 'W');
768 gdbserv_output_byte (gdbserv, sigval);
769 gdbserv_output_packet (gdbserv);
770 nextstate = GDBSERV_STATE_EXITED;
773 nextstate = gdbserv->state;
775 gdbserv->state = nextstate;