-/* taken from arch/ppc/kernel/ppc-stub.c */
+/* taken from arch/powerpc/kernel/ppc-stub.c */
/****************************************************************************
****************************************************************************/
#include <common.h>
+#include <asm/ptrace.h>
#include <kgdb.h>
#include <command.h>
-#if defined(CONFIG_CMD_KGDB)
-
#undef KGDB_DEBUG
/*
static char remcomRegBuffer[BUFMAX];
static int initialized = 0;
-static int kgdb_active = 0, first_entry = 1;
+static int kgdb_active;
static struct pt_regs entry_regs;
-static u_int error_jmp_buf[BUFMAX/2];
+static long error_jmp_buf[BUFMAX/2];
static int longjmp_on_fault = 0;
#ifdef KGDB_DEBUG
static int kdebug = 1;
static unsigned char *
mem2hex(char *mem, char *buf, int count)
{
+ char *tmp;
unsigned char ch;
+ /*
+ * We use the upper half of buf as an intermediate buffer for the
+ * raw memory copy. Hex conversion will work against this one.
+ */
+ tmp = buf + count;
longjmp_on_fault = 1;
+
+ memcpy(tmp, mem, count);
+
while (count-- > 0) {
- ch = *mem++;
+ ch = *tmp++;
*buf++ = hexchars[ch >> 4];
*buf++ = hexchars[ch & 0xf];
}
static char *
hex2mem(char *buf, char *mem, int count)
{
- int i, hexValue;
- unsigned char ch;
- char *mem_start = mem;
+ int hexValue;
+ char *tmp_raw, *tmp_hex;
+
+ /*
+ * We use the upper half of buf as an intermediate buffer for the
+ * raw memory that is converted from hex.
+ */
+ tmp_raw = buf + count * 2;
+ tmp_hex = tmp_raw - 1;
longjmp_on_fault = 1;
- for (i=0; i<count; i++) {
- if ((hexValue = hex(*buf++)) < 0)
+ while (tmp_hex >= buf) {
+ tmp_raw--;
+ hexValue = hex(*tmp_hex--);
+ if (hexValue < 0)
kgdb_error(KGDBERR_NOTHEXDIG);
- ch = hexValue << 4;
- if ((hexValue = hex(*buf++)) < 0)
+ *tmp_raw = hexValue;
+ hexValue = hex(*tmp_hex--);
+ if (hexValue < 0)
kgdb_error(KGDBERR_NOTHEXDIG);
- ch |= hexValue;
- *mem++ = ch;
+ *tmp_raw |= hexValue << 4;
+
}
- kgdb_flush_cache_range((void *)mem_start, (void *)(mem - 1));
+
+ memcpy(mem, tmp_raw, count);
+
+ kgdb_flush_cache_range((void *)mem, (void *)(mem+count));
longjmp_on_fault = 0;
return buf;
return (0);
}
- /* probably should check which exception occured as well */
+ /* probably should check which exception occurred as well */
if (longjmp_on_fault) {
longjmp_on_fault = 0;
- kgdb_longjmp((long*)error_jmp_buf, KGDBERR_MEMFAULT);
+ kgdb_longjmp(error_jmp_buf, KGDBERR_MEMFAULT);
panic("kgdb longjump failed!\n");
}
printf("kgdb: handle_exception; trap [0x%x]\n", kgdb_trap(regs));
- if (kgdb_setjmp((long*)error_jmp_buf) != 0)
+ if (kgdb_setjmp(error_jmp_buf) != 0)
panic("kgdb: error or fault in entry init!\n");
kgdb_enter(regs, &kd);
- if (first_entry) {
- /*
- * the first time we enter kgdb, we save the processor
- * state so that we can return to the monitor if the
- * remote end quits gdb (or at least, tells us to quit
- * with the 'k' packet)
- */
- entry_regs = *regs;
- first_entry = 0;
- }
+ entry_regs = *regs;
ptr = remcomOutBuffer;
printf("kgdb: remcomInBuffer: %s\n", remcomInBuffer);
#endif
- errnum = kgdb_setjmp((long*)error_jmp_buf);
+ errnum = kgdb_setjmp(error_jmp_buf);
if (errnum == 0) switch (remcomInBuffer[0]) {
case 'k': /* kill the program, actually return to monitor */
kd.extype = KGDBEXIT_KILL;
*regs = entry_regs;
- first_entry = 1;
goto doexit;
case 'C': /* CSS continue with signal SS */
* kgdb_init must be called *after* the
* monitor is relocated into ram
*/
-void
-kgdb_init(void)
+int kgdb_init(void)
{
+ puts("KGDB: ");
+
kgdb_serial_init();
debugger_exception_handler = handle_exception;
initialized = 1;
putDebugStr("kgdb ready\n");
puts("ready\n");
+
+ return 0;
}
void
kgdb_error(int errnum)
{
longjmp_on_fault = 0;
- kgdb_longjmp((long*)error_jmp_buf, errnum);
+ kgdb_longjmp(error_jmp_buf, errnum);
panic("kgdb_error: longjmp failed!\n");
}
}
int
-do_kgdb(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+do_kgdb(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
{
printf("Entering KGDB mode via exception handler...\n\n");
kgdb_breakpoint(argc - 1, argv + 1);
}
U_BOOT_CMD(
- kgdb, CFG_MAXARGS, 1, do_kgdb,
- "kgdb - enter gdb remote debug mode\n",
+ kgdb, CONFIG_SYS_MAXARGS, 1, do_kgdb,
+ "enter gdb remote debug mode",
"[arg0 arg1 .. argN]\n"
" - executes a breakpoint so that kgdb mode is\n"
" entered via the exception handler. To return\n"
" program if it is executed (see the \"hello_world\"\n"
" example program in the U-Boot examples directory)."
);
-#else
-
-int kgdb_not_configured = 1;
-
-#endif