* [PATCH] kgdb cleanup and improvement
@ 2003-02-18 20:38 Jun Sun
0 siblings, 0 replies; only message in thread
From: Jun Sun @ 2003-02-18 20:38 UTC (permalink / raw)
To: linux-mips; +Cc: jsun
[-- Attachment #1: Type: text/plain, Size: 355 bytes --]
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
[-- Attachment #2: 030218.a-2.4-kgdb-update.patch --]
[-- Type: text/plain, Size: 4898 bytes --]
diff -Nru linux/arch/mips/kernel/gdb-stub.c.orig linux/arch/mips/kernel/gdb-stub.c
--- linux/arch/mips/kernel/gdb-stub.c.orig Fri Feb 14 10:31:01 2003
+++ linux/arch/mips/kernel/gdb-stub.c Tue Feb 18 12:20:16 2003
@@ -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)
diff -Nru linux/arch/mips/kernel/gdb-low.S.orig linux/arch/mips/kernel/gdb-low.S
--- linux/arch/mips/kernel/gdb-low.S.orig Mon Aug 5 16:53:33 2002
+++ linux/arch/mips/kernel/gdb-low.S Tue Feb 18 12:11:59 2003
@@ -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)
diff -Nru linux/arch/mips/Makefile.orig linux/arch/mips/Makefile
--- linux/arch/mips/Makefile.orig Tue Feb 18 12:28:17 2003
+++ linux/arch/mips/Makefile Tue Feb 18 12:26:48 2003
@@ -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
diff -Nru linux/arch/mips64/Makefile.orig linux/arch/mips64/Makefile
--- linux/arch/mips64/Makefile.orig Thu Feb 13 11:34:55 2003
+++ linux/arch/mips64/Makefile Fri Feb 14 15:47:08 2003
@@ -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
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2003-02-18 20:38 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-02-18 20:38 [PATCH] kgdb cleanup and improvement Jun Sun
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox