Date: Sat, 3 May 2003 20:29:00 -0700 (PDT) From: Marcel Moolenaar <marcel@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 30508 for review Message-ID: <200305040329.h443T03B007724@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=30508 Change 30508 by marcel@marcel_nfs on 2003/05/03 20:28:47 Round of fixes: o Make sure the sio_dbgport softc points at the right softc and avoid a NULL pointer dereference. o Announce for the sio device if it's the console or the debug port or both. Note that both console and debug port is only allowed if GDB_REMOTE_CHAT is defined. o Implement the MD GDB functions for i386 and provide stubs for ia64. o Remove references to the GDB option that I wanted to introduce, but didn't after all. o Warn the user if remote GDB is invoked without there being a debug port. More to come... Affected files ... .. //depot/projects/sio/sys/ddb/db_command.c#3 edit .. //depot/projects/sio/sys/ddb/db_gdb.c#3 edit .. //depot/projects/sio/sys/ddb/ddb.h#3 edit .. //depot/projects/sio/sys/dev/sio/sio.c#5 edit .. //depot/projects/sio/sys/dev/sio/sio_cons.c#4 edit .. //depot/projects/sio/sys/dev/sio/sio_dbg.c#2 edit .. //depot/projects/sio/sys/i386/include/db_machdep.h#4 edit .. //depot/projects/sio/sys/ia64/ia64/db_interface.c#3 edit .. //depot/projects/sio/sys/ia64/include/db_machdep.h#2 edit Differences ... ==== //depot/projects/sio/sys/ddb/db_command.c#3 (text+ko) ==== @@ -69,10 +69,6 @@ static db_cmdfcn_t db_kill; static db_cmdfcn_t db_reset; -#ifdef GDB -static db_cmdfcn_t db_gdb; -#endif - /* XXX this is actually forward-static. */ extern struct command db_show_cmds[]; @@ -420,9 +416,7 @@ { "call", db_fncall, CS_OWN, 0 }, { "show", 0, 0, db_show_cmds }, { "ps", db_ps, 0, 0 }, -#ifdef GDB { "gdb", db_gdb, 0, 0 }, -#endif { "reset", db_reset, 0, 0 }, { "kill", db_kill, CS_OWN, 0 }, { (char *)0, } ==== //depot/projects/sio/sys/ddb/db_gdb.c#3 (text+ko) ==== @@ -180,7 +180,7 @@ } void -db_gdb_cmd(db_expr_t a1 __unused, boolean_t a2 __unused, db_expr_t a3 __unused, +db_gdb(db_expr_t a1 __unused, boolean_t a2 __unused, db_expr_t a3 __unused, char *a4 __unused) { @@ -434,6 +434,11 @@ gdb_reg reg; int c, error, len, regno; + if (dbgport == NULL) { + db_printf("GDB: No debug port configured.\n"); + return (ENXIO); + } + gdb_getregs(®s, raw_regs); /* "TxxPC:xxxxxxxx;FP:xxxxxxxx;SP:xxxxxxxx;" */ ==== //depot/projects/sio/sys/ddb/ddb.h#3 (text+ko) ==== @@ -156,10 +156,19 @@ db_cmdfcn_t db_write_cmd; db_cmdfcn_t db_show_one_thread; -/* Remote GDB support. */ -int gdb_handle_exception(db_regs_t *, int); -void gdb_init(void); -db_cmdfcn_t db_gdb_cmd; +/* + * Remote GDB support. + */ +db_cmdfcn_t db_gdb; + +gdb_reg gdb_getreg(struct gdb_registers *, int); +void gdb_getregs(struct gdb_registers *, db_regs_t *); +int gdb_handle_exception(db_regs_t *, int); +void gdb_init(void); +void gdb_setreg(struct gdb_registers *, int, gdb_reg); +void gdb_setregs(struct gdb_registers *, db_regs_t *); +void gdb_singlestep(struct gdb_registers *, int); +int gdb_signal(int); /* Scare the user with backtrace of curthread to console. */ void db_print_backtrace(void); ==== //depot/projects/sio/sys/dev/sio/sio.c#5 (text+ko) ==== @@ -679,7 +679,7 @@ sio_console.addr_type = com->addr_type; device_set_softc(dev, &sio_console); com = &sio_console; - } else if (com->bst == sio_dbgport->bst && + } else if (sio_dbgport != NULL && com->bst == sio_dbgport->bst && com->bsh == sio_dbgport->bsh) { sio_dbgport->addr_res = com->addr_res; sio_dbgport->addr_rid = com->addr_rid; @@ -811,8 +811,17 @@ termioschars(&com->it_in); com->it_out = com->it_in; - if (com->consdev != NULL) - device_printf(dev, "console\n"); + if (com->consdev != NULL || com->dbgport) { + device_printf(dev, "is "); + if (com->consdev != NULL) { + printf("console"); + if (com->dbgport) + printf("and "); + } + if (com->dbgport) + printf("debug port"); + printf(".\n"); + } if (sio_fast_ih == NULL) { swi_add(&tty_ithd, "tty:sio", siopoll, NULL, SWI_TTY, 0, ==== //depot/projects/sio/sys/dev/sio/sio_cons.c#4 (text+ko) ==== @@ -190,6 +190,7 @@ while ((sio_getreg(&sio_console, com_lsr) & LSR_THRE) == 0 && --to) ; sio_setreg(&sio_console, com_data, c); + sio_barrier(&sio_console); splx(s); } ==== //depot/projects/sio/sys/dev/sio/sio_dbg.c#2 (text+ko) ==== @@ -88,19 +88,22 @@ * serial interface as the console. */ if (sio_console.bst == dd.bst && sio_console.bsh == dd.bsh) { + sio_dbgport = &sio_console; + if (sio_console.consdev != NULL) { #ifdef DBG_REMOTE_CHAT - sio_dbgport = &sio_console; - printf("sio: using console as debug port\n"); - return (0); + printf("sio: using console as debug port\n"); + /* XXX assume settings are the same. */ + return (0); #else - printf("sio: debug port not supported over console\n"); - return (EBUSY); + printf("sio: debug port not supported over console\n"); + return (EBUSY); #endif + } + } else { + bzero(&sio_debugport, sizeof(sio_debugport)); + sio_dbgport = &sio_debugport; } - bzero(&sio_debugport, sizeof(sio_debugport)); - sio_dbgport = &sio_debugport; - /* Minimum fields needed for rudimentary checks. */ sio_dbgport->bst = dd.bst; sio_dbgport->bsh = dd.bsh; @@ -137,10 +140,6 @@ { u_char iir; - /* Don't initialize if the debug port is the console. */ - if (sio_dbgport->consdev != NULL) - return; - /* Disable all interrupt sources. */ sio_setreg(sio_dbgport, com_ier, 0); sio_barrier(sio_dbgport); @@ -182,7 +181,7 @@ { } -void +static void siodbgputc(int c) { int to; @@ -191,6 +190,7 @@ while ((sio_getreg(sio_dbgport, com_lsr) & LSR_THRE) == 0 && --to) ; sio_setreg(sio_dbgport, com_data, c); + sio_barrier(sio_dbgport); } static int ==== //depot/projects/sio/sys/i386/include/db_machdep.h#4 (text+ko) ==== @@ -121,11 +121,4 @@ gdb_reg es; }; -gdb_reg gdb_getreg(struct gdb_registers *, int); -void gdb_getregs(struct gdb_registers *, db_regs_t *); -void gdb_setreg(struct gdb_registers *, int, gdb_reg); -void gdb_setregs(struct gdb_registers *, db_regs_t *); -void gdb_singlestep(struct gdb_registers *, int); -int gdb_signal(int); - #endif /* !_MACHINE_DB_MACHDEP_H_ */ ==== //depot/projects/sio/sys/ia64/ia64/db_interface.c#3 (text+ko) ==== @@ -548,3 +548,38 @@ db_show_mdpcpu(struct pcpu *pc) { } + +/* + * Remote GDB support. + */ +int +gdb_signal(int vector) +{ + return (SIGILL); +} + +gdb_reg +gdb_getreg(struct gdb_registers *regs, int regnum) +{ + return (~0); +} + +void +gdb_setreg(struct gdb_registers *regs, int regnum, gdb_reg val) +{ +} + +void +gdb_getregs(struct gdb_registers *regs, db_regs_t *raw_regs) +{ +} + +void +gdb_setregs(struct gdb_registers *regs, db_regs_t *raw_regs) +{ +} + +void +gdb_singlestep(struct gdb_registers *regs, int set) +{ +} ==== //depot/projects/sio/sys/ia64/include/db_machdep.h#2 (text+ko) ==== @@ -40,8 +40,6 @@ #include <machine/frame.h> #include <machine/ia64_cpu.h> -#define DB_NO_AOUT - struct ia64_bundle; typedef vm_offset_t db_addr_t; /* address - unsigned */ @@ -111,4 +109,21 @@ */ #define DB_ELFSIZE 64 +/* + * Remote GDB support. + */ +#define GDB_REGNUM_FP -1 +#define GDB_REGNUM_PC -1 +#define GDB_REGNUM_SP -1 +typedef uint32_t gdb_reg; +typedef uint32_t gdb_addr; + +#define gdb_dec_addr gdb_dec_int32 +#define gdb_dec_reg gdb_dec_int32 +#define gdb_enc_reg gdb_enc_int32 + +struct gdb_registers { + int dummy; +}; + #endif /* _MACHINE_DB_MACHDEP_H_ */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200305040329.h443T03B007724>