kgdb cleanup and improvement
PATCH 1/1 kgdb cleanup and improvement
Some misc improvements. Various bits are contributed by Kip Walker.
. reverse an earlier change of CONFIG and gcc option. . Add detach 'D', which lets kernel run free . Make 'kill' and 'restart' to restart the machine . Support "call foo()" (really useful)
- add 'G' support, increase stack reserve
. remove useless code.
2.4 patch is attached.
Jun
arch/mips/kernel/gdb-stub.c renamed from arch/mips/kernel/gdb-stub.c.orig +37 -46
@@ -127,6 +127,8 @@#include <linux/mm.h> #include <linux/console.h> #include <linux/init.h> +#include <linux/slab.h> +#include <linux/reboot.h> #include <asm/asm.h> #include <asm/mipsregs.h>
@@ -595,30 +597,10 @@char *ptr;unsigned long *stack; -#if 0 -printk ("in handle_exception()\n" ); -show_gdbregs (regs); -#endif - -/* -* First check trap type. If this is CPU_UNUSABLE and CPU_ID is 1, -* the simply switch the FPU on and return since this is no error -* condition. kernel/traps.c does the same. -* FIXME: This doesn't work yet, so we don't catch CPU_UNUSABLE -* traps for now. -*/ - trap = (regs->cp0_cause &0x7c ) >>2 ; -/* printk("trap=%d\n",trap); */ -if (trap ==11 ) { -if (((regs->cp0_cause >>CAUSEB_CE ) &3 ) ==1 ) { - regs->cp0_status |=ST0_CU1 ; -return ; - } - } -/* * If we're in breakpoint() increment the PC */ + trap = (regs->cp0_cause &0x7c ) >>2 ;if (trap ==9 && regs->cp0_epc == (unsigned long )breakinst) regs->cp0_epc +=4 ;
@@ -707,6 +689,11 @@ output_buffer[3 ] =0 ;break ; +case 'D' : +/* detach; let CPU run */ +putpacket (output_buffer); +return ; +case 'd' :/* toggle debug flag */ break ;
@@ -726,26 +713,21 @@/* * set the value of the CPU registers - return OK -* FIXME: Needs to be written */ case 'G' : { -#if 0 -unsigned long *newsp, psr; - ptr = &input_buffer[1 ]; -hex2mem (ptr, (char *)registers,16 *4 ,0 );/* G & O regs */ - -/* -* See if the stack pointer has moved. If so, then copy the -* saved locals and ins to the new location. -*/ - - newsp = (unsigned long *)registers[SP ]; -if (sp != newsp) - sp =memcpy (newsp, sp,16 *4 ); - -#endif +hex2mem (ptr, (char *)®s->reg0,32 *4 ,0 ); + ptr +=32 *8 ; +hex2mem (ptr, (char *)®s->cp0_status,6 *4 ,0 ); + ptr +=6 *8 ; +hex2mem (ptr, (char *)®s->fpr0,32 *4 ,0 ); + ptr +=32 *8 ; +hex2mem (ptr, (char *)®s->cp1_fsr,2 *4 ,0 ); + ptr +=2 *8 ; +hex2mem (ptr, (char *)®s->frame_ptr,2 *4 ,0 ); + ptr +=2 *8 ; +hex2mem (ptr, (char *)®s->cp0_index,16 *4 ,0 );strcpy (output_buffer,"OK" ); }break ;
@@ -811,19 +793,14 @@/* -* kill the program -*/ -case 'k' : -break ;/* do nothing */ - - -/* -* Reset the whole machine (FIXME: system dependent) +* kill the program; let us try to restart the machine +* Reset the whole machine. */ +case 'k' :case 'r' : +machine_restart ("kgdb restarts machine" );break ; -/* * Step to next instruction */
@@ -922,6 +899,20 @@ ); } +/* +* malloc is needed by gdb client in "call func()", even a private one +* will make gdb happy +*/ +static void *malloc (size_t size) +{ +return kmalloc (size,GFP_ATOMIC ); +} + +static void free (void *where) +{ +kfree (where); +} +#ifdef CONFIG_GDB_CONSOLE void gdb_putsn (const char *str,int l)
arch/mips/kernel/gdb-low.S renamed from arch/mips/kernel/gdb-low.S.orig +11 -1
@@ -14,6 +14,16 @@ #include <asm/gdb-stub.h> /* + * [jsun] We reserves about 2x GDB_FR_SIZE in stack. The lower (addressed) + * part is used to store registers and passed to exception handler. + * The upper part is reserved for "call func" feature where gdb client + * saves some of the regs, setups call frame and passes args. + * + * A trace shows about 200 bytes are used to store about half of all regs. + * The rest should be big enough for frame setup and passing args. + */ + +/* * The low level trap handler */ .align 5
@@ -38,7 +48,7 @@ nop 1: move k0,sp - subu sp,k1,GDB_FR_SIZE + subu sp,k1,GDB_FR_SIZE*2 # see comment above sw k0,GDB_FR_REG29(sp) sw v0,GDB_FR_REG2(sp)
arch/mips/Makefile renamed from arch/mips/Makefile.orig +2 -2
@@ -41,8 +41,8 @@ LINKFLAGS += -G 0 -static # -N MODFLAGS += -mlong-calls -ifdef CONFIG_DEBUG -GCCFLAGS += -gstabs+ +ifdef CONFIG_REMOTE_DEBUG +GCCFLAGS += -g ifdef CONFIG_SB1XXX_CORELIS GCCFLAGS += -mno-sched-prolog -fno-omit-frame-pointer endif
arch/mips64/Makefile renamed from arch/mips64/Makefile.orig +2 -2
@@ -39,8 +39,8 @@ LINKFLAGS += -G 0 -static # -N MODFLAGS += -mlong-calls -ifdef CONFIG_DEBUG -GCCFLAGS += -gstabs+ +ifdef CONFIG_REMOTE_DEBUG +GCCFLAGS += -g ifdef CONFIG_SB1XXX_CORELIS GCCFLAGS += -mno-sched-prolog -fno-omit-frame-pointer endif