annotate gdb_remote.c @ 478:2e4a4188cfb0

Fix DMA fill so that it does not cause observable changes to the FIFO. Get DMA copy mostly correct from an observable ffect perspective. DMA copy probably does not reflect internal implementation still given that evidence seems to suggest no FIFO usage at all.
author Mike Pavone <pavone@retrodev.com>
date Tue, 17 Sep 2013 00:11:45 -0700
parents 140af5509ce7
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 }