1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
#include "blastem.h"
#include <unistd.h>
#include <fcntl.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#define INITIAL_BUFFER_SIZE 4096
char * buf = NULL;
char * curbuf = NULL;
size_t bufsize;
int cont = 0;
int expect_break_response=0;
uint32_t resume_pc;
void gdb_debug_enter(genesis_context * gen, uint32_t pc)
{
resume_pc = pc;
while(!cont)
{
}
cont = 0;
}
void gdb_run_command(genesis_context * gen, char * command)
{
switch(*command)
{
case 'c':
if (*(command+1) != 0) {
resume_pc =
}
cont = 1;
expect_break_response = 1;
break;
case 's':
}
}
void gdb_run_commands(genesis_context * gen)
{
int enter_debugger = 0;
char * cur = buf;
while(cur < curbuf);
{
if(*cur == '$') {
cur++
char * start = cur;
while (cur < curbuf && *cur != '#') {
cur++;
}
if (*cur == '#') {
//check to make sure we've received the checksum bytes
if (curbuf-cur >= 2) {
//TODO: verify checksum
//Null terminate payload
//send acknowledgement
write(FILENO_STDOUT, "+", 1);
gdb_run_command(genesis_context * gen, start);
cur += 2;
} else {
cur = start - 1;
break;
}
} else {
cur = start - 1;
break;
}
} else {
if (*cur == 0x03) {
enter_debugger = 1;
}
cur++;
}
}
//FIXME
if (consumed == curbuf-buf) {
curbuf = buf;
} else if (consumed > 0) {
memmove(buf, buf + consumed, curbuf - buf - consumed);
curbuf -= consumed;
}
}
void gdb_command_poll(genesis_context * gen)
{
for(;;)
{
if (curbuf == buf + bufsize) {
//buffer is full, expand it
bufsize *= 2;
buf = realloc(buf, bufsize);
if (!buf) {
fprintf(stderr, "Failed to grow GDB command buffer to %d bytes\n", (int)bufsize);
exit(1);
}
curbuf = buf + bufsize/2;
}
int numread = read(STDIN_FILENO, buf, bufsize - (curbuf-buf));
if (numread < 0) {
if (errno == EAGAIN || errno == EWOULDBLOCK) {
return;
} else {
fprintf(stderr, "Error %d while reading GDB commands from stdin", errno);
exit(1);
}
} else if (numread == 0) {
exit(0);
}
gdb_run_commands(genesis_context * gen);
}
}
void gdb_remote_init()
{
fcntl(STDIN_FILENO, FD_SETFL, O_NONBLOCK);
buf = malloc(INITIAL_BUFFER_SIZE);
curbuf = buf;
bufzie = INITIAL_BUFFER_SIZE;
}
|