nios2: add kgdb support
authorLey Foon Tan <lftan@altera.com>
Mon, 16 Feb 2015 11:26:43 +0000 (19:26 +0800)
committerLey Foon Tan <lftan@altera.com>
Mon, 16 Feb 2015 11:26:43 +0000 (19:26 +0800)
Signed-off-by: Ley Foon Tan <lftan@altera.com>
arch/nios2/Kconfig
arch/nios2/include/asm/kgdb.h [new file with mode: 0644]
arch/nios2/kernel/Makefile
arch/nios2/kernel/entry.S
arch/nios2/kernel/kgdb.c [new file with mode: 0644]

index f77991e..4375554 100644 (file)
@@ -8,6 +8,7 @@ config NIOS2
        select GENERIC_IRQ_PROBE
        select GENERIC_IRQ_SHOW
        select HAVE_ARCH_TRACEHOOK
+       select HAVE_ARCH_KGDB
        select IRQ_DOMAIN
        select MODULES_USE_ELF_RELA
        select OF
diff --git a/arch/nios2/include/asm/kgdb.h b/arch/nios2/include/asm/kgdb.h
new file mode 100644 (file)
index 0000000..8fd5e3b
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2015 Altera Corporation
+ * Copyright (C) 2011 Tobias Klauser <tklauser@distanz.ch>
+ *
+ * Based on the code posted by Kazuyasu on the Altera Forum at:
+ * http://www.alteraforum.com/forum/showpost.php?p=77003&postcount=20
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef _ASM_NIOS2_KGDB_H
+#define _ASM_NIOS2_KGDB_H
+
+#define CACHE_FLUSH_IS_SAFE    1
+#define BUFMAX                 2048
+
+enum regnames {
+       GDB_R0 = 0,
+       GDB_AT,
+       GDB_R2,
+       GDB_R3,
+       GDB_R4,
+       GDB_R5,
+       GDB_R6,
+       GDB_R7,
+       GDB_R8,
+       GDB_R9,
+       GDB_R10,
+       GDB_R11,
+       GDB_R12,
+       GDB_R13,
+       GDB_R14,
+       GDB_R15,
+       GDB_R16,
+       GDB_R17,
+       GDB_R18,
+       GDB_R19,
+       GDB_R20,
+       GDB_R21,
+       GDB_R22,
+       GDB_R23,
+       GDB_ET,
+       GDB_BT,
+       GDB_GP,
+       GDB_SP,
+       GDB_FP,
+       GDB_EA,
+       GDB_BA,
+       GDB_RA,
+       GDB_PC,
+       GDB_STATUS,
+       GDB_ESTATUS,
+       GDB_BSTATUS,
+       GDB_IENABLE,
+       GDB_IPENDING,
+       GDB_CPUID,
+       GDB_CTL6,
+       GDB_EXCEPTION,
+       GDB_PTEADDR,
+       GDB_TLBACC,
+       GDB_TLBMISC,
+       GDB_ECCINJ,
+       GDB_BADADDR,
+       GDB_CONFIG,
+       GDB_MPUBASE,
+       GDB_MPUACC,
+       /* do not change the last entry or anything below! */
+       GDB_NUMREGBYTES         /* number of registers */
+};
+
+#define GDB_SIZEOF_REG         sizeof(u32)
+#define DBG_MAX_REG_NUM        (49)
+#define NUMREGBYTES            (DBG_MAX_REG_NUM * sizeof(GDB_SIZEOF_REG))
+
+#define BREAK_INSTR_SIZE       4
+static inline void arch_kgdb_breakpoint(void)
+{
+       __asm__ __volatile__("trap 30\n");
+}
+
+#endif /* _ASM_NIOS2_KGDB_H */
index eaaa894..1aae257 100644 (file)
@@ -21,5 +21,6 @@ obj-y += time.o
 obj-y  += traps.o
 
 obj-$(CONFIG_EARLY_PRINTK)             += early_printk.o
+obj-$(CONFIG_KGDB)                     += kgdb.o
 obj-$(CONFIG_MODULES)                  += module.o
 obj-$(CONFIG_NIOS2_ALIGNMENT_TRAP)     += misaligned.o
index 0bdfd13..7729bd3 100644 (file)
@@ -121,7 +121,11 @@ trap_table:
        .word   instruction_trap        /* 27 */
        .word   instruction_trap        /* 28 */
        .word   instruction_trap        /* 29 */
-       .word   instruction_trap        /* 30 */
+#ifdef CONFIG_KGDB
+       .word   handle_kgdb_breakpoint  /* 30 KGDB breakpoint */
+#else
+       .word   instruction_trap                /* 30 */
+#endif
        .word   handle_breakpoint       /* 31 */
 
 .text
@@ -445,6 +449,12 @@ handle_diverror:
        call    handle_diverror_c
        br      ret_from_exception
 
+#ifdef CONFIG_KGDB
+handle_kgdb_breakpoint:
+       call    kgdb_breakpoint_c
+       br      ret_from_exception
+#endif
+
 /*
  * Beware - when entering resume, prev (the current task) is
  * in r4, next (the new task) is in r5, don't change these
Simple merge