[prev in list] [next in list] [prev in thread] [next in thread]
List: bochs-cvs
Subject: [Bochs-cvs] CVS: bochs gdbstub.cc,1.21,1.22
From: Stanislav Shwartsman <sshwarts () users ! sourceforge ! net>
Date: 2006-06-17 12:09:57
Message-ID: E1FrZcj-0002pG-60 () sc8-pr-cvs3 ! sourceforge ! net
[Download RAW message or body]
Update of /cvsroot/bochs/bochs
In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv10453
Modified Files:
gdbstub.cc
Log Message:
Move paddr_valid param of dbg_xlate_linear2phy method to return value.
This is much easier to use.
Index: gdbstub.cc
===================================================================
RCS file: /cvsroot/bochs/bochs/gdbstub.cc,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -d -r1.21 -r1.22
--- gdbstub.cc 30 May 2006 19:46:31 -0000 1.21
+++ gdbstub.cc 17 Jun 2006 12:09:54 -0000 1.22
@@ -63,24 +63,23 @@
BX_DEBUG (("put_buffer %s", buffer));
- do
- {
+ do {
put_debug_char('$');
csum = 0;
i = 0;
while (buffer[i] != 0)
- {
+ {
put_debug_char(buffer[i]);
csum = csum + buffer[i];
i++;
- }
+ }
put_debug_char('#');
put_debug_char(hexchars[csum >> 4]);
put_debug_char(hexchars[csum % 16]);
- } while (get_debug_char() != '+');
+ } while (get_debug_char() != '+');
}
static void get_command(char* buffer)
@@ -91,8 +90,7 @@
unsigned int count;
unsigned int i;
- do
- {
+ do{
while ((ch = get_debug_char()) != '$');
checksum = 0;
@@ -100,44 +98,44 @@
count = 0;
while (1)
- {
+ {
ch = get_debug_char();
if (ch == '#') break;
checksum = checksum + ch;
buffer[count] = ch;
count++;
- }
+ }
buffer[count] = 0;
if (ch == '#')
- {
+ {
xmitcsum = hex(get_debug_char()) << 4;
xmitcsum += hex(get_debug_char());
if (checksum != xmitcsum)
- {
- BX_INFO (("Bad checksum"));
- }
- }
+ {
+ BX_INFO(("Bad checksum"));
+ }
+ }
if (checksum != xmitcsum)
- {
+ {
put_debug_char('-');
- }
+ }
else
- {
+ {
put_debug_char('+');
if (buffer[2] == ':')
- {
+ {
put_debug_char(buffer[0]);
put_debug_char(buffer[1]);
count = strlen(buffer);
for (i = 3; i <= count; i++)
- {
+ {
buffer[i - 3] = buffer[i];
- }
- }
- }
- } while (checksum != xmitcsum);
+ }
+ }
+ }
+ } while (checksum != xmitcsum);
}
void hex2mem(char* buf, unsigned char* mem, int count)
@@ -146,12 +144,12 @@
unsigned char ch;
for (i = 0; i<count; i++)
- {
+ {
ch = hex(*buf++) << 4;
ch = ch + hex(*buf++);
*mem = ch;
mem++;
- }
+ }
}
char* mem2hex(char* mem, char* buf, int count)
@@ -160,14 +158,14 @@
unsigned char ch;
for (i = 0; i<count; i++)
- {
+ {
ch = *mem;
mem++;
*buf = hexchars[ch >> 4];
buf++;
*buf = hexchars[ch % 16];
buf++;
- }
+ }
*buf = 0;
return(buf);
}
@@ -211,9 +209,7 @@
static unsigned int nr_breakpoints = 0;
static int stub_trace_flag = 0;
-
static int instr_count = 0;
-
static int saved_eip = 0;
int bx_gdbstub_check(unsigned int eip)
@@ -230,7 +226,7 @@
instr_count++;
if ((instr_count % 500) == 0)
- {
+ {
#if !defined(__CYGWIN__) && !defined(__MINGW32__)
arg = fcntl(socket_fd, F_GETFL);
fcntl(socket_fd, F_SETFL, arg | O_NONBLOCK);
@@ -239,36 +235,36 @@
#else
FD_ZERO(&fds);
FD_SET(socket_fd, &fds);
- r = select(socket_fd + 1, &fds, NULL, NULL, &tv);
+ r = select(socket_fd + 1, &fds, NULL, NULL, &tv);
if (r == 1)
- {
+ {
r = recv(socket_fd, (char *)&ch, 1, 0);
- }
+ }
#endif
if (r == 1)
- {
- BX_INFO (("Got byte %x", (unsigned int)ch));
+ {
+ BX_INFO(("Got byte %x", (unsigned int)ch));
last_stop_reason = GDBSTUB_USER_BREAK;
return(GDBSTUB_USER_BREAK);
- }
- }
+ }
+ }
// why is trace before breakpoints? does that mean it would never
// hit a breakpoint during tracing?
if (stub_trace_flag == 1)
- {
+ {
last_stop_reason = GDBSTUB_TRACE;
return(GDBSTUB_TRACE);
- }
+ }
for (i = 0; i < nr_breakpoints; i++)
- {
+ {
if (eip == breakpoints[i])
- {
- BX_INFO (("found breakpoint at %x", eip));
+ {
+ BX_INFO(("found breakpoint at %x", eip));
last_stop_reason = GDBSTUB_EXECUTION_BREAKPOINT;
return(GDBSTUB_EXECUTION_BREAKPOINT);
- }
- }
+ }
+ }
last_stop_reason = GDBSTUB_STOP_NO_REASON;
return(GDBSTUB_STOP_NO_REASON);
}
@@ -278,19 +274,19 @@
unsigned int i;
if (len != 1)
- {
+ {
return(0);
- }
+ }
for (i = 0; i < MAX_BREAKPOINTS; i++)
- {
+ {
if (breakpoints[i] == addr)
- {
- BX_INFO (("Removing breakpoint at %x", addr));
+ {
+ BX_INFO(("Removing breakpoint at %x", addr));
breakpoints[i] = 0;
return(1);
- }
- }
+ }
+ }
return(0);
}
@@ -298,21 +294,21 @@
{
unsigned int i;
- BX_INFO (("setting breakpoint at %x", addr));
+ BX_INFO(("setting breakpoint at %x", addr));
for (i = 0; i < (unsigned)MAX_BREAKPOINTS; i++)
- {
+ {
if (breakpoints[i] == 0)
- {
+ {
breakpoints[i] = addr;
if (i >= nr_breakpoints)
- {
+ {
nr_breakpoints = i + 1;
- }
+ }
return;
- }
- }
- BX_INFO (("No slot for breakpoint"));
+ }
+ }
+ BX_INFO(("No slot for breakpoint"));
}
static void do_pc_breakpoint(int insert, unsigned long long addr, int len)
@@ -354,43 +350,40 @@
unsigned int rw,
Bit8u* data)
{
- Bit32u phys;
- bx_bool valid;
-
+ bx_phy_address phys;
+
if (((laddress & 0xfff) + len) > 4096)
- {
+ {
valid = access_linear(laddress,
4096 - (laddress & 0xfff),
rw,
data);
if (!valid)
- {
+ {
return(valid);
- }
+ }
valid = access_linear(laddress,
len + (laddress & 0xfff) - 4096,
rw,
(Bit8u *)((unsigned long)data +
4096 - (laddress & 0xfff)));
return(valid);
- }
+ }
- BX_CPU(0)->dbg_xlate_linear2phy(laddress,
- (Bit32u*)&phys,
- (bx_bool*)&valid);
+ bx_bool valid = BX_CPU(0)->dbg_xlate_linear2phy(laddress, (bx_phy_address*)&phys);
if (!valid)
- {
+ {
return(0);
- }
+ }
if (rw == BX_READ)
- {
+ {
valid = BX_MEM(0)->dbg_fetch_mem(phys, len, data);
- }
+ }
else
- {
+ {
valid = BX_MEM(0)->dbg_set_mem(phys, len, data);
- }
+ }
return(valid);
}
@@ -404,22 +397,22 @@
ne = 0;
while (ne == 0)
- {
+ {
get_command(buffer);
BX_DEBUG (("get_buffer %s", buffer));
switch (buffer[0])
- {
+ {
case 'c':
{
char buf[255];
int new_eip;
if (buffer[1] != 0)
- {
+ {
new_eip = atoi(buffer + 1);
- BX_INFO (("continuing at %x", new_eip));
+ BX_INFO(("continuing at %x", new_eip));
for (int i=0; i<BX_SMP_PROCESSORS; i++) {
BX_CPU(i)->invalidate_prefetch_q();
@@ -428,7 +421,7 @@
saved_eip = EIP;
BX_CPU(0)->dword.eip = new_eip;
- }
+ }
stub_trace_flag = 0;
bx_cpu.ispanic = 0;
@@ -441,23 +434,22 @@
DEV_vga_refresh();
if (buffer[1] != 0)
- {
+ {
bx_cpu.invalidate_prefetch_q();
-
BX_CPU_THIS_PTR dword.eip = saved_eip;
- }
+ }
- BX_INFO (("stopped with %x", last_stop_reason));
+ BX_INFO(("stopped with %x", last_stop_reason));
buf[0] = 'S';
if (last_stop_reason == GDBSTUB_EXECUTION_BREAKPOINT ||
last_stop_reason == GDBSTUB_TRACE)
- {
+ {
write_signal(&buf[1], SIGTRAP);
- }
+ }
else
- {
+ {
write_signal(&buf[1], 0);
- }
+ }
put_reply(buf);
break;
}
@@ -466,22 +458,22 @@
{
char buf[255];
- BX_INFO (("stepping"));
+ BX_INFO(("stepping"));
stub_trace_flag = 1;
bx_cpu.cpu_loop(0);
DEV_vga_refresh();
stub_trace_flag = 0;
- BX_INFO (("stopped with %x", last_stop_reason));
+ BX_INFO(("stopped with %x", last_stop_reason));
buf[0] = 'S';
if (last_stop_reason == GDBSTUB_EXECUTION_BREAKPOINT ||
last_stop_reason == GDBSTUB_TRACE)
- {
+ {
write_signal(&buf[1], SIGTRAP);
- }
+ }
else
- {
+ {
write_signal(&buf[1], SIGTRAP);
- }
+ }
put_reply(buf);
break;
}
@@ -498,28 +490,28 @@
hex2mem(ebuf + 1, mem, len);
if (len == 1 && mem[0] == 0xcc)
- {
+ {
insert_breakpoint(addr);
put_reply("OK");
- }
+ }
else if (remove_breakpoint(addr, len))
- {
+ {
put_reply("OK");
- }
+ }
else
- {
+ {
if (access_linear(addr,
len,
BX_WRITE,
mem))
- {
+ {
put_reply("OK");
- }
+ }
else
- {
+ {
put_reply("ENN");
- }
- }
+ }
+ }
break;
}
@@ -531,7 +523,7 @@
addr = strtoull(&buffer[1], &ebuf, 16);
len = strtoul(ebuf + 1, NULL, 16);
- BX_INFO (("addr %x len %x", addr, len));
+ BX_INFO(("addr %x len %x", addr, len));
access_linear(addr,
len,
@@ -551,10 +543,10 @@
++ebuf;
value = read_little_endian_hex(ebuf);
- BX_INFO (("reg %d set to %llx", reg, value));
+ BX_INFO(("reg %d set to %llx", reg, value));
#if !BX_SUPPORT_X86_64
switch (reg)
- {
+ {
case 1:
EAX = value;
break;
@@ -590,10 +582,10 @@
default:
break;
- }
+ }
#else
switch (reg)
- {
+ {
case 0:
RAX = value;
break;
@@ -665,7 +657,7 @@
default:
break;
- }
+ }
#endif
put_reply("OK");
@@ -683,13 +675,13 @@
registers[6] = ESI;
registers[7] = EDI;
if (last_stop_reason == GDBSTUB_EXECUTION_BREAKPOINT)
- {
+ {
registers[8] = EIP + 1;
- }
+ }
else
- {
+ {
registers[8] = EIP;
- }
+ }
registers[9] = BX_CPU_THIS_PTR read_eflags();
registers[10] =
BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value;
@@ -730,9 +722,9 @@
Bit64u rip;
rip = RIP;
if (last_stop_reason == GDBSTUB_EXECUTION_BREAKPOINT)
- {
+ {
++rip;
- }
+ }
PUTREG(buf, rip, 8);
PUTREG(buf, BX_CPU_THIS_PTR read_eflags(), 4);
PUTREG(buf, BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value, 4);
@@ -752,40 +744,39 @@
case 'H':
if (buffer[1] == 'c')
- {
+ {
continue_thread = strtol(&buffer[2], NULL, 16);
put_reply("OK");
- }
+ }
else if (buffer[1] == 'g')
- {
+ {
other_thread = strtol(&buffer[2], NULL, 16);
put_reply("OK");
- }
+ }
else
- {
+ {
put_reply("ENN");
- }
+ }
break;
case 'q':
if (buffer[1] == 'C')
- {
+ {
sprintf(obuf,"%Lx", 1);
put_reply(obuf);
- }
+ }
else if (strncmp(&buffer[1], "Offsets", strlen("Offsets")) == 0)
- {
+ {
sprintf(obuf,
"Text=%x;Data=%x;Bss=%x",
SIM->get_param_num("text_base", gdbstub_list)->get(),
SIM->get_param_num("data_base", gdbstub_list)->get(),
SIM->get_param_num("bss_base", gdbstub_list)->get());
put_reply(obuf);
- }
- else
- {
+ }
+ else {
put_reply("ENN");
- }
+ }
break;
case 'Z':
@@ -795,14 +786,14 @@
do_breakpoint(0, buffer+1);
break;
case 'k':
- BX_PANIC (("Debugger asked us to quit\n"));
+ BX_PANIC(("Debugger asked us to quit\n"));
break;
default:
put_reply("");
break;
- }
- }
+ }
+ }
}
static void wait_for_connect(int portn)
@@ -815,10 +806,10 @@
listen_socket_fd = socket(PF_INET, SOCK_STREAM, 0);
if (listen_socket_fd == -1)
- {
- BX_PANIC (("Failed to create socket\n"));
+ {
+ BX_PANIC(("Failed to create socket\n"));
exit(1);
- }
+ }
/* Allow rapid reuse of this port */
opt = 1;
@@ -828,9 +819,9 @@
r = setsockopt(listen_socket_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
#endif
if (r == -1)
- {
- BX_INFO (("setsockopt(SO_REUSEADDR) failed\n"));
- }
+ {
+ BX_INFO(("setsockopt(SO_REUSEADDR) failed\n"));
+ }
memset (&sockaddr, '\000', sizeof sockaddr);
#if BX_HAVE_SOCKADDR_IN_SIN_LEN
@@ -844,30 +835,30 @@
r = bind(listen_socket_fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
if (r == -1)
- {
- BX_PANIC (("Failed to bind socket\n"));
- }
+ {
+ BX_PANIC(("Failed to bind socket\n"));
+ }
r = listen(listen_socket_fd, 0);
if (r == -1)
- {
- BX_PANIC (("Failed to listen on socket\n"));
- }
+ {
+ BX_PANIC(("Failed to listen on socket\n"));
+ }
sockaddr_len = sizeof sockaddr;
socket_fd = accept(listen_socket_fd, (struct sockaddr *)&sockaddr, &sockaddr_len);
if (socket_fd == -1)
- {
- BX_PANIC (("Failed to accept on socket\n"));
- }
+ {
+ BX_PANIC(("Failed to accept on socket\n"));
+ }
close(listen_socket_fd);
protoent = getprotobyname ("tcp");
if (!protoent)
- {
- BX_INFO (("getprotobyname (\"tcp\") failed\n"));
+ {
+ BX_INFO(("getprotobyname (\"tcp\") failed\n"));
return;
- }
+ }
/* Disable Nagle - allow small packets to be sent without delay. */
opt = 1;
@@ -877,9 +868,9 @@
r = setsockopt (socket_fd, protoent->p_proto, TCP_NODELAY, &opt, sizeof(opt));
#endif
if (r == -1)
- {
- BX_INFO (("setsockopt(TCP_NODELAY) failed\n"));
- }
+ {
+ BX_INFO(("setsockopt(TCP_NODELAY) failed\n"));
+ }
}
void bx_gdbstub_init(int argc, char* argv[])
_______________________________________________
Bochs-cvs mailing list
Bochs-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bochs-cvs
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic