[U-Boot-Users] [PATCH] MPC85xx KGDB support

Chen Gong g.chen at freescale.com
Fri Nov 2 04:16:10 CET 2007


---
 cpu/mpc85xx/Makefile         |    4 +-
 drivers/serial.c             |   28 +++++++++++++++++++
 include/configs/MPC8548CDS.h |    3 +-
 lib_ppc/kgdb.c               |   62 +++++++++++++++++++++++++++++++++---------
 4 files changed, 81 insertions(+), 16 deletions(-)

diff --git a/cpu/mpc85xx/Makefile b/cpu/mpc85xx/Makefile
index 32091fa..f5cb148 100644
--- a/cpu/mpc85xx/Makefile
+++ b/cpu/mpc85xx/Makefile
@@ -28,7 +28,7 @@ include $(TOPDIR)/config.mk
 
 LIB	= $(obj)lib$(CPU).a
 
-START	= start.o resetvec.o
+START	= start.o resetvec.o kgdb.o
 COBJS	= traps.o cpu.o cpu_init.o speed.o interrupts.o \
 	  pci.o serial_scc.o commproc.o ether_fcc.o spd_sdram.o qe_io.o
 
@@ -39,7 +39,7 @@ START	:= $(addprefix $(obj),$(START))
 all:	$(obj).depend $(START) $(LIB)
 
 $(LIB):	$(OBJS)
-	$(AR) $(ARFLAGS) $@ $(OBJS)
+	$(AR) $(ARFLAGS) $@ $(OBJS) $(obj)kgdb.o
 
 #########################################################################
 
diff --git a/drivers/serial.c b/drivers/serial.c
index 76425d8..42585d7 100644
--- a/drivers/serial.c
+++ b/drivers/serial.c
@@ -307,6 +307,34 @@ serial_setbrg(void)
 }
 #endif
 
+#if defined(CONFIG_CMD_KGDB)
+void kgdb_serial_init (void)
+{
+	/* here presume you have been initialzed appropriate COM# */
+	_serial_puts("[on serial] ",CONFIG_KGDB_SER_INDEX);
+}
+
+void putDebugChar (int c)
+{
+	_serial_putc(c, CONFIG_KGDB_SER_INDEX);
+}
+
+void putDebugStr (const char *str)
+{
+	_serial_puts(str, CONFIG_KGDB_SER_INDEX);
+}
+
+int getDebugChar (void)
+{
+	return _serial_getc(CONFIG_KGDB_SER_INDEX);
+}
+
+void kgdb_interruptible (int yes)
+{
+	return;
+}
+#endif
+
 #if defined(CONFIG_SERIAL_MULTI)
 
 DECLARE_ESERIAL_FUNCTIONS(1);
diff --git a/include/configs/MPC8548CDS.h b/include/configs/MPC8548CDS.h
index 6083715..396feeb 100644
--- a/include/configs/MPC8548CDS.h
+++ b/include/configs/MPC8548CDS.h
@@ -482,6 +482,7 @@ extern unsigned long get_clock_freq(void);
 #define CONFIG_CMD_PING
 #define CONFIG_CMD_I2C
 #define CONFIG_CMD_MII
+#define CONFIG_CMD_KGDB
 
 #if defined(CONFIG_PCI)
     #define CONFIG_CMD_PCI
@@ -529,7 +530,7 @@ extern unsigned long get_clock_freq(void);
 #define BOOTFLAG_WARM	0x02		/* Software reboot */
 
 #if defined(CONFIG_CMD_KGDB)
-#define CONFIG_KGDB_BAUDRATE	230400	/* speed to run kgdb serial port */
+#define CONFIG_KGDB_BAUDRATE	115200	/* speed to run kgdb serial port */
 #define CONFIG_KGDB_SER_INDEX	2	/* which serial port to use */
 #endif
 
diff --git a/lib_ppc/kgdb.c b/lib_ppc/kgdb.c
index 78c2f0c..7acdebc 100644
--- a/lib_ppc/kgdb.c
+++ b/lib_ppc/kgdb.c
@@ -60,20 +60,46 @@ static struct hard_trap_info
 	unsigned int tt;		/* Trap type code for powerpc */
 	unsigned char signo;		/* Signal that we map this trap into */
 } hard_trap_info[] = {
-	{ 0x200, SIGSEGV },			/* machine check */
-	{ 0x300, SIGSEGV },			/* address error (store) */
-	{ 0x400, SIGBUS },			/* instruction bus error */
-	{ 0x500, SIGINT },			/* interrupt */
-	{ 0x600, SIGBUS },			/* alingment */
-	{ 0x700, SIGTRAP },			/* breakpoint trap */
-	{ 0x800, SIGFPE },			/* fpu unavail */
-	{ 0x900, SIGALRM },			/* decrementer */
-	{ 0xa00, SIGILL },			/* reserved */
-	{ 0xb00, SIGILL },			/* reserved */
-	{ 0xc00, SIGCHLD },			/* syscall */
-	{ 0xd00, SIGTRAP },			/* single-step/watch */
-	{ 0xe00, SIGFPE },			/* fp assist */
+#if defined(CONFIG_40x) || defined(CONFIG_BOOKE)
+	{ 0x100, SIGINT  },             /* critical input interrupt */
+	{ 0x200, SIGSEGV },             /* machine check */
+	{ 0x300, SIGSEGV },             /* data storage */
+	{ 0x400, SIGBUS  },             /* instruction storage */
+	{ 0x500, SIGINT  },             /* interrupt */
+	{ 0x600, SIGBUS  },             /* alignment */
+	{ 0x700, SIGILL  },             /* program */
+	{ 0x800, SIGILL  },             /* reserved */
+	{ 0x900, SIGILL  },             /* reserved */
+	{ 0xa00, SIGILL  },             /* reserved */
+	{ 0xb00, SIGILL  },             /* reserved */
+	{ 0xc00, SIGCHLD },             /* syscall */
+	{ 0xd00, SIGILL  },             /* reserved */
+	{ 0xe00, SIGILL  },             /* reserved */
+	{ 0xf00, SIGILL  },             /* reserved */
+	/*
+         * 0x1000  PIT
+         * 0x1010  FIT
+         * 0x1020  watchdog
+         * 0x1100  data TLB miss
+         * 0x1200  instruction TLB miss
+         */
+	{ 0x2002, SIGTRAP},             /* debug */
+#else
+	{ 0x200, SIGSEGV },		/* machine check */
+	{ 0x300, SIGSEGV },		/* address error (store) */
+	{ 0x400, SIGBUS },		/* instruction bus error */
+	{ 0x500, SIGINT },		/* interrupt */
+	{ 0x600, SIGBUS },		/* alingment */
+	{ 0x700, SIGTRAP },		/* breakpoint trap */
+	{ 0x800, SIGFPE },		/* fpu unavail */
+	{ 0x900, SIGALRM },		/* decrementer */
+	{ 0xa00, SIGILL },		/* reserved */
+	{ 0xb00, SIGILL },		/* reserved */
+	{ 0xc00, SIGCHLD },		/* syscall */
+	{ 0xd00, SIGTRAP },		/* single-step/watch */
+	{ 0xe00, SIGFPE },		/* fp assist */
 	{ 0, 0}				/* Must be last */
+#endif
 };
 
 static int
@@ -100,7 +126,12 @@ kgdb_enter(struct pt_regs *regs, kgdb_data *kdp)
 		/* Skip over breakpoint trap insn */
 		regs->nip += 4;
 	}
+#if defined(CONFIG_40x) || defined(CONFIG_BOOKE)
+	mtspr(SPRN_DBCR0, mfspr(SPRN_DBCR0) & ~DBCR_IC);
+	regs->msr &= ~MSR_DE;
+#else
 	regs->msr &= ~MSR_SE;
+#endif
 
 	/* reply to host that an exception has occurred */
 	kdp->sigval = computeSignal(regs->trap);
@@ -130,7 +161,12 @@ kgdb_exit(struct pt_regs *regs, kgdb_data *kdp)
 		break;
 
 	case KGDBEXIT_SINGLE:
+#if defined(CONFIG_40x) || defined(CONFIG_BOOKE)
+		mtspr(SPRN_DBCR0, mfspr(SPRN_DBCR0) | DBCR_IC);
+		regs->msr |= MSR_DE;
+#else
 		regs->msr |= MSR_SE;
+#endif
 #if 0
 		set_msr(msr | MSR_SE);
 #endif
-- 
1.5.2





More information about the U-Boot mailing list