Allow gdbstub to connect over any serial device.

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2448 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
pbrook 2007-02-22 01:48:01 +00:00
parent 7bcc17dc02
commit cfc3475a8d
4 changed files with 32 additions and 30 deletions

View File

@ -1216,10 +1216,26 @@ static void gdb_chr_event(void *opaque, int event)
} }
} }
int gdbserver_start(CharDriverState *chr) int gdbserver_start(const char *port)
{ {
GDBState *s; GDBState *s;
char gdbstub_port_name[128];
int port_num;
char *p;
CharDriverState *chr;
if (!port || !*port)
return -1;
port_num = strtol(port, &p, 10);
if (*p == 0) {
/* A numeric value is interpreted as a port number. */
snprintf(gdbstub_port_name, sizeof(gdbstub_port_name),
"tcp::%d,nowait,nodelay,server", port_num);
port = gdbstub_port_name;
}
chr = qemu_chr_open(port);
if (!chr) if (!chr)
return -1; return -1;
@ -1234,18 +1250,4 @@ int gdbserver_start(CharDriverState *chr)
qemu_add_vm_stop_handler(gdb_vm_stopped, s); qemu_add_vm_stop_handler(gdb_vm_stopped, s);
return 0; return 0;
} }
int gdbserver_start_port(int port)
{
CharDriverState *chr;
char gdbstub_port_name[128];
snprintf(gdbstub_port_name, sizeof(gdbstub_port_name),
"tcp::%d,nowait,nodelay,server", port);
chr = qemu_chr_open(gdbstub_port_name);
if (!chr)
return -EIO;
return gdbserver_start(chr);
}
#endif #endif

View File

@ -1,7 +1,7 @@
#ifndef GDBSTUB_H #ifndef GDBSTUB_H
#define GDBSTUB_H #define GDBSTUB_H
#define DEFAULT_GDBSTUB_PORT 1234 #define DEFAULT_GDBSTUB_PORT "1234"
typedef void (*gdb_syscall_complete_cb)(CPUState *env, typedef void (*gdb_syscall_complete_cb)(CPUState *env,
target_ulong ret, target_ulong err); target_ulong ret, target_ulong err);
@ -13,8 +13,7 @@ int gdb_handlesig (CPUState *, int);
void gdb_exit(CPUState *, int); void gdb_exit(CPUState *, int);
int gdbserver_start(int); int gdbserver_start(int);
#else #else
int gdbserver_start(CharDriverState *chr); int gdbserver_start(const char *port);
int gdbserver_start_port(int port);
#endif #endif
#endif #endif

View File

@ -423,14 +423,14 @@ static void do_cont(void)
} }
#ifdef CONFIG_GDBSTUB #ifdef CONFIG_GDBSTUB
static void do_gdbserver(int has_port, int port) static void do_gdbserver(const char *port)
{ {
if (!has_port) if (!port)
port = DEFAULT_GDBSTUB_PORT; port = DEFAULT_GDBSTUB_PORT;
if (gdbserver_start_port(port) < 0) { if (gdbserver_start(port) < 0) {
qemu_printf("Could not open gdbserver socket on port %d\n", port); qemu_printf("Could not open gdbserver socket on port '%s'\n", port);
} else { } else {
qemu_printf("Waiting gdb connection on port %d\n", port); qemu_printf("Waiting gdb connection on port '%s'\n", port);
} }
} }
#endif #endif
@ -1216,7 +1216,7 @@ static term_cmd_t term_cmds[] = {
{ "c|cont", "", do_cont, { "c|cont", "", do_cont,
"", "resume emulation", }, "", "resume emulation", },
#ifdef CONFIG_GDBSTUB #ifdef CONFIG_GDBSTUB
{ "gdbserver", "i?", do_gdbserver, { "gdbserver", "s?", do_gdbserver,
"[port]", "start gdbserver session (default port=1234)", }, "[port]", "start gdbserver session (default port=1234)", },
#endif #endif
{ "x", "/l", do_memory_dump, { "x", "/l", do_memory_dump,

13
vl.c
View File

@ -6422,8 +6422,8 @@ void help(void)
"-parallel dev redirect the parallel port to char device 'dev'\n" "-parallel dev redirect the parallel port to char device 'dev'\n"
"-pidfile file Write PID to 'file'\n" "-pidfile file Write PID to 'file'\n"
"-S freeze CPU at startup (use 'c' to start execution)\n" "-S freeze CPU at startup (use 'c' to start execution)\n"
"-s wait gdb connection to port %d\n" "-s wait gdb connection to port\n"
"-p port change gdb connection port\n" "-p port set gdb connection port [default=%s]\n"
"-d item1,... output log to %s (use -d ? for a list of log items)\n" "-d item1,... output log to %s (use -d ? for a list of log items)\n"
"-hdachs c,h,s[,t] force hard disk 0 physical geometry and the optional BIOS\n" "-hdachs c,h,s[,t] force hard disk 0 physical geometry and the optional BIOS\n"
" translation (t=none or lba) (usually qemu can guess them)\n" " translation (t=none or lba) (usually qemu can guess them)\n"
@ -6829,7 +6829,8 @@ static BOOL WINAPI qemu_ctrl_handler(DWORD type)
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
#ifdef CONFIG_GDBSTUB #ifdef CONFIG_GDBSTUB
int use_gdbstub, gdbstub_port; int use_gdbstub;
const char *gdbstub_port;
#endif #endif
int i, cdrom_index; int i, cdrom_index;
int snapshot, linux_boot; int snapshot, linux_boot;
@ -7143,7 +7144,7 @@ int main(int argc, char **argv)
use_gdbstub = 1; use_gdbstub = 1;
break; break;
case QEMU_OPTION_p: case QEMU_OPTION_p:
gdbstub_port = atoi(optarg); gdbstub_port = optarg;
break; break;
#endif #endif
case QEMU_OPTION_L: case QEMU_OPTION_L:
@ -7571,8 +7572,8 @@ int main(int argc, char **argv)
if (use_gdbstub) { if (use_gdbstub) {
/* XXX: use standard host:port notation and modify options /* XXX: use standard host:port notation and modify options
accordingly. */ accordingly. */
if (gdbserver_start_port(gdbstub_port) < 0) { if (gdbserver_start(gdbstub_port) < 0) {
fprintf(stderr, "qemu: could not open gdbstub device on port '%d'\n", fprintf(stderr, "qemu: could not open gdbstub device on port '%s'\n",
gdbstub_port); gdbstub_port);
exit(1); exit(1);
} }