annotate gdb_remote.c @ 467:140af5509ce7

Added copyright notice to source files and added GPL license text in COPYING
author Mike Pavone <pavone@retrodev.com>
date Tue, 10 Sep 2013 23:31:08 -0700
parents 249d24973682
children b7b7a1cab44a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
467
140af5509ce7 Added copyright notice to source files and added GPL license text in COPYING
Mike Pavone <pavone@retrodev.com>
parents: 456
diff changeset
1 /*
140af5509ce7 Added copyright notice to source files and added GPL license text in COPYING
Mike Pavone <pavone@retrodev.com>
parents: 456
diff changeset
2 Copyright 2013 Michael Pavone
140af5509ce7 Added copyright notice to source files and added GPL license text in COPYING
Mike Pavone <pavone@retrodev.com>
parents: 456
diff changeset
3 This file is part of BlastEm.
140af5509ce7 Added copyright notice to source files and added GPL license text in COPYING
Mike Pavone <pavone@retrodev.com>
parents: 456
diff changeset
4 BlastEm is free software distributed under the terms of the GNU General Public License version 3 or greater. See COPYING for full license text.
140af5509ce7 Added copyright notice to source files and added GPL license text in COPYING
Mike Pavone <pavone@retrodev.com>
parents: 456
diff changeset
5 */
456
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
6 #include "blastem.h"
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
7 #include <unistd.h>
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
8 #include <fcntl.h>
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
9 #include <stddef.h>
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
10 #include <stdlib.h>
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
11 #include <stdio.h>
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
12
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
13 #define INITIAL_BUFFER_SIZE 4096
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
14
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
15 char * buf = NULL;
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
16 char * curbuf = NULL;
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
17 size_t bufsize;
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
18 int cont = 0;
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
19 int expect_break_response=0;
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
20 uint32_t resume_pc;
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
21
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
22 void gdb_debug_enter(genesis_context * gen, uint32_t pc)
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
23 {
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
24 resume_pc = pc;
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
25 while(!cont)
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
26 {
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
27 }
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
28 cont = 0;
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
29 }
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
30
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
31 void gdb_run_command(genesis_context * gen, char * command)
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
32 {
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
33 switch(*command)
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
34 {
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
35 case 'c':
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
36 if (*(command+1) != 0) {
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
37 resume_pc =
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
38 }
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
39 cont = 1;
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
40 expect_break_response = 1;
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
41 break;
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
42 case 's':
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
43
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
44 }
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
45 }
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
46
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
47 void gdb_run_commands(genesis_context * gen)
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
48 {
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
49 int enter_debugger = 0;
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
50 char * cur = buf;
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
51 while(cur < curbuf);
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
52 {
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
53 if(*cur == '$') {
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
54 cur++
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
55 char * start = cur;
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
56 while (cur < curbuf && *cur != '#') {
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
57 cur++;
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
58 }
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
59 if (*cur == '#') {
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
60 //check to make sure we've received the checksum bytes
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
61 if (curbuf-cur >= 2) {
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
62 //TODO: verify checksum
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
63 //Null terminate payload
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
64 //send acknowledgement
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
65 write(FILENO_STDOUT, "+", 1);
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
66 gdb_run_command(genesis_context * gen, start);
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
67 cur += 2;
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
68 } else {
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
69 cur = start - 1;
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
70 break;
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
71 }
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
72 } else {
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
73 cur = start - 1;
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
74 break;
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
75 }
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
76 } else {
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
77 if (*cur == 0x03) {
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
78 enter_debugger = 1;
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
79 }
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
80 cur++;
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
81 }
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
82 }
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
83
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
84 //FIXME
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
85 if (consumed == curbuf-buf) {
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
86 curbuf = buf;
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
87 } else if (consumed > 0) {
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
88 memmove(buf, buf + consumed, curbuf - buf - consumed);
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
89 curbuf -= consumed;
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
90 }
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
91 }
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
92
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
93 void gdb_command_poll(genesis_context * gen)
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
94 {
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
95 for(;;)
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
96 {
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
97 if (curbuf == buf + bufsize) {
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
98 //buffer is full, expand it
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
99 bufsize *= 2;
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
100 buf = realloc(buf, bufsize);
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
101 if (!buf) {
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
102 fprintf(stderr, "Failed to grow GDB command buffer to %d bytes\n", (int)bufsize);
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
103 exit(1);
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
104 }
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
105 curbuf = buf + bufsize/2;
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
106 }
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
107 int numread = read(STDIN_FILENO, buf, bufsize - (curbuf-buf));
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
108 if (numread < 0) {
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
109 if (errno == EAGAIN || errno == EWOULDBLOCK) {
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
110 return;
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
111 } else {
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
112 fprintf(stderr, "Error %d while reading GDB commands from stdin", errno);
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
113 exit(1);
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
114 }
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
115 } else if (numread == 0) {
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
116 exit(0);
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
117 }
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
118 gdb_run_commands(genesis_context * gen);
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
119 }
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
120 }
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
121
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
122 void gdb_remote_init()
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
123 {
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
124 fcntl(STDIN_FILENO, FD_SETFL, O_NONBLOCK);
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
125 buf = malloc(INITIAL_BUFFER_SIZE);
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
126 curbuf = buf;
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
127 bufzie = INITIAL_BUFFER_SIZE;
249d24973682 Initial work on GDB remote debugging support
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
128 }