All of lore.kernel.org
 help / color / mirror / Atom feed
From: barbalace at igi.cnr.it <barbalace@igi.cnr.it>
To: u-boot@lists.denx.de
Subject: [U-Boot] PATCH arm920t kgdb serial support
Date: Tue, 05 May 2009 19:35:30 +0200	[thread overview]
Message-ID: <4A0078E2.2060707@igi.cnr.it> (raw)

diff -r -u u-boot/common/kgdb.c u-boot-UniPd-denx.de/common/kgdb.c
--- u-boot/common/kgdb.c    2007-11-06 18:07:07.000000000 +0100
+++ u-boot-UniPd-denx.de/common/kgdb.c    2009-05-05 18:44:25.000000000 
+0200
@@ -458,6 +458,7 @@
 
             goto doexit;
 
+#ifdef _PPC
         case 'S':    /* SSS  single step with signal SS */
             *ptr = '\0';    /* ignore the signal number for now */
             /* fall through */
@@ -469,7 +470,7 @@
                 kd.exaddr = addr;
                 kd.extype |= KGDBEXIT_WITHADDR;
             }
-
+#endif
         doexit:
 /* Need to flush the instruction cache here, as we may have deposited a
  * breakpoint, and the icache probably has no way of knowing that a 
data ref to
@@ -496,8 +497,13 @@
             } else {
                 kgdb_error(KGDBERR_BADPARAMS);
             }
+
+        case 'q':
+            if (!(strcmp(ptr, "Supported"))) {
+                sprintf(remcomOutBuffer, "PacketSize=%d", BUFMAX);
+            }
             break;
       }            /* switch */

diff -r -u u-boot/cpu/arm920t/Makefile 
u-boot-UniPd-denx.de/cpu/arm920t/Makefile
--- u-boot/cpu/arm920t/Makefile    2007-11-07 17:18:30.000000000 +0100
+++ u-boot-UniPd-denx.de/cpu/arm920t/Makefile    2009-01-15 
17:01:58.000000000 +0100
@@ -26,7 +26,8 @@
 LIB    = $(obj)lib$(CPU).a
 
 START    = start.o
-COBJS    = cpu.o interrupts.o
+COBJS    = cpu.o interrupts.o
+SOBJS    = kgdb.o
 
 SRCS    := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c)
 OBJS    := $(addprefix $(obj),$(COBJS) $(SOBJS))
diff -r -u u-boot/cpu/arm920t/interrupts.c 
u-boot-UniPd-denx.de/cpu/arm920t/interrupts.c
--- u-boot/cpu/arm920t/interrupts.c    2007-11-06 18:11:29.000000000 +0100
+++ u-boot-UniPd-denx.de/cpu/arm920t/interrupts.c    2009-05-05 
18:52:15.000000000 +0200
@@ -33,6 +33,10 @@
 #include <arm920t.h>
 #include <asm/proc-armv/ptrace.h>
 
+#if defined(CONFIG_CMD_KGDB)
+int (*debugger_exception_handler)(struct pt_regs *) = 0;
+#endif
+
 #ifdef CONFIG_USE_IRQ
 /* enable IRQ interrupts */
 void enable_interrupts (void)
@@ -119,9 +123,16 @@
 
 void do_undefined_instruction (struct pt_regs *pt_regs)
 {
+#if defined(CONFIG_CMD_KGDB)
+    pt_regs->ARM_pc -= 4;
+    if (debugger_exception_handler && 
(*debugger_exception_handler)(pt_regs)) {
+        return;
+    }
+#else
     printf ("undefined instruction\n");
     show_regs (pt_regs);
     bad_mode ();
+#endif
 }
 
 void do_software_interrupt (struct pt_regs *pt_regs)
diff -r -u u-boot/cpu/arm920t/s3c24x0/serial.c 
u-boot-UniPd-denx.de/cpu/arm920t/s3c24x0/serial.c
--- u-boot/cpu/arm920t/s3c24x0/serial.c    2007-11-06 18:13:13.000000000 
+0100
+++ u-boot-UniPd-denx.de/cpu/arm920t/s3c24x0/serial.c    2009-05-05 
19:00:14.000000000 +0200
@@ -306,6 +306,114 @@
 
 #endif /* CONFIG_SERIAL_MULTI */
 
+#if defined(CONFIG_CMD_KGDB)
+/*
+  according to CONFIG_KGDB_SER_INDEX kgdb uses serial port
+  number 0 or number 1
+  - if CONFIG_KGDB_SER_INDEX = 1 => serial port number 0 :
+  configuration has been already done
+  - if CONFIG_KGDB_SER_INDEX = 2 => serial port number 1 :
+  configure port 1 for serial I/O with rate = CONFIG_KGDB_BAUDRATE
+*/
+#if (CONFIG_KGDB_SER_INDEX & 2)
+void kgdb_serial_init (void)
+{
+    volatile char val;
+    unsigned short br_reg;
+
+    get_clocks ();
+    br_reg = (((((gd->cpu_clk / 16) / 18) * 10) / CONFIG_KGDB_BAUDRATE) +
+          5) / 10;
+    /*
+     * Init onboard 16550 UART
+     */
+    out8 (ACTING_UART1_BASE + UART_LCR, 0x80);    /* set DLAB bit */
+    out8 (ACTING_UART1_BASE + UART_DLL, (br_reg & 0x00ff));    /* set 
divisor for 9600 baud */
+    out8 (ACTING_UART1_BASE + UART_DLM, ((br_reg & 0xff00) >> 8));    
/* set divisor for 9600 baud */
+    out8 (ACTING_UART1_BASE + UART_LCR, 0x03);    /* line control 8 
bits no parity */
+    out8 (ACTING_UART1_BASE + UART_FCR, 0x00);    /* disable FIFO */
+    out8 (ACTING_UART1_BASE + UART_MCR, 0x00);    /* no modem control 
DTR RTS */
+    val = in8 (ACTING_UART1_BASE + UART_LSR);    /* clear line status */
+    val = in8 (ACTING_UART1_BASE + UART_RBR);    /* read receive buffer */
+    out8 (ACTING_UART1_BASE + UART_SCR, 0x00);    /* set scratchpad */
+    out8 (ACTING_UART1_BASE + UART_IER, 0x00);    /* set interrupt 
enable reg */
+}
+
+void putDebugChar (const char c)
+{
+    if (c == '\n')
+        serial_putc ('\r');
+
+    out8 (ACTING_UART1_BASE + UART_THR, c);    /* put character out */
+
+    /* check THRE bit, wait for transfer done */
+    while ((in8 (ACTING_UART1_BASE + UART_LSR) & 0x20) != 0x20);
+}
+
+void putDebugStr (const char *s)
+{
+    while (*s) {
+        serial_putc (*s++);
+    }
+}
+
+int getDebugChar (void)
+{
+    unsigned char status = 0;
+
+    while (1) {
+        status = in8 (ACTING_UART1_BASE + UART_LSR);
+        if ((status & asyncLSRDataReady1) != 0x0) {
+            break;
+        }
+        if ((status & ( asyncLSRFramingError1 |
+                asyncLSROverrunError1 |
+                asyncLSRParityError1  |
+                asyncLSRBreakInterrupt1 )) != 0) {
+            out8 (ACTING_UART1_BASE + UART_LSR,
+                  asyncLSRFramingError1 |
+                  asyncLSROverrunError1 |
+                  asyncLSRParityError1  |
+                  asyncLSRBreakInterrupt1);
+        }
+    }
+    return (0x000000ff & (int) in8 (ACTING_UART1_BASE));
+}
+
+void kgdb_interruptible (int yes)
+{
+    return;
+}
+
+#else    /* ! (CONFIG_KGDB_SER_INDEX & 2) */
+
+void kgdb_serial_init (void)
+{
+    serial_printf ("[on serial] ");
+}
+
+void putDebugChar (int c)
+{
+    serial_putc (c);
+}
+
+void putDebugStr (const char *str)
+{
+    serial_puts (str);
+}
+
+int getDebugChar (void)
+{
+    return serial_getc ();
+}
+
+void kgdb_interruptible (int yes)
+{
+    return;
+}
+#endif    /* (CONFIG_KGDB_SER_INDEX & 2) */
+#endif
+
 #endif /* defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) ||
       defined(CONFIG_S3C2440) || defined (CONFIG_S3C2442) ||
       defined (CONFIG_TRAB) */
diff -r -u u-boot/cpu/arm920t/start.S 
u-boot-UniPd-denx.de/cpu/arm920t/start.S
--- u-boot/cpu/arm920t/start.S    2008-01-21 11:27:32.000000000 +0100
+++ u-boot-UniPd-denx.de/cpu/arm920t/start.S    2009-05-05 
19:15:15.000000000 +0200
@@ -780,7 +780,7 @@
     sub    sp, sp, #S_FRAME_SIZE
     stmia    sp, {r0 - r12}            @ Calling r0-r12
     add     r7, sp, #S_PC
-    stmdb   r7, {sp, lr}^                   @ Calling SP, LR
+    stmdb   r7, {sp, lr}^                   @ NOTE: Save USER SP and LR
     str     lr, [r7, #0]                    @ Save calling PC
     mrs     r6, spsr
     str     r6, [r7, #4]                    @ Save CPSR
@@ -788,6 +788,56 @@
     mov    r0, sp
     .endm
 
+#if defined (CONFIG_CMD_KGDB)
+    /*
+     * U-BOOT runs in SVC32 mode and so is not simple to access SVC's 
sp and
+     * lr registers, there isn't an appropriate instruction like in ARM11.
+     * kgdb needs the exact content of this registers to work.
+     * ARM9 guarantee access to USR32 mode registers from any other 
mode but
+     * there is no direct way to access SVC, UND, etc.. registers from 
other
+     * privileged modes.
+     * This solution work well with SVC <-> UND doesn't work with USR 
<-> UND
+     * because writing mode bits is a privileged action and can't return.
+     */
+    .macro    und_save_regs
+    sub    sp, sp, #S_FRAME_SIZE
+    stmia    sp, {r0 - r12}            @ Calling r0-r12
+    add     r7, sp, #S_PC
+    str     lr, [r7, #0]                    @ Save calling PC
+    mrs     r6, spsr
+    str     r6, [r7, #4]                    @ Save CPSR
+    str     r0, [r7, #8]                    @ Save OLD_R0
+
+    mrs     r0, cpsr            @ move cpsr in r0
+    msr     cpsr_c, r6            @ move in the previous mode and save 
sp and lr in
+    mov     r1, sp                @ r1 and
+    mov     r2, lr                @ r2 then
+        msr     cpsr_c, r0            @ return in the correct mode and
+
+    stmdb   r7, {r1, r2}            @ save registers on the stack
+    mov    r0, sp
+    .endm
+
+    .macro    und_restore_regs
+    add    r7, sp, #S_PC            @ set r7 to point program counter
+    ldr    r6, [r7, #4]            @ load spsr in r6
+    ldmdb    r7, {r1, r2}            @ load sp in r1 and lr in r2
+
+    mrs     r0, cpsr            @ move cpsr in r0
+    msr     cpsr_c, r6            @ move in the previous mode and 
restore r1 and r2 in
+    mov     sp, r1                @ sp and
+    mov     lr, r2                @ lr then
+        msr     cpsr_c, r0            @ return in the correct mode and
+
+    ldmia    sp, {r0 - r12}            @ Calling r0 - lr
+    mov    r0, r0
+    ldr    lr, [sp, #S_PC]            @ Get PC
+    add    sp, sp, #S_FRAME_SIZE
+    movs    pc, lr                @ return & move spsr_svc into cpsr
+    .endm
+
+#endif /* CONFIG_CMD_KGDB */
+
     .macro    irq_restore_user_regs
     ldmia    sp, {r0 - lr}^            @ Calling r0 - lr
     mov    r0, r0
@@ -823,12 +873,24 @@
 /*
  * exception handlers
  */
+
+#if defined(CONFIG_CMD_KGDB)
+    .align  5
+undefined_instruction:
+    get_irq_stack
+    und_save_regs
+    bl     do_undefined_instruction
+    und_restore_regs
+
+#else /* CONFIG_CMD_KGDB */
     .align  5
 undefined_instruction:
     get_bad_stack
     bad_save_user_regs
     bl     do_undefined_instruction
 
+#endif /* CONFIG_CMD_KGDB */
+
     .align    5
 software_interrupt:
     get_bad_stack
@@ -854,7 +916,6 @@
     bl     do_not_used
 
 #ifdef CONFIG_USE_IRQ
-
     .align    5
 irq:
     get_irq_stack
@@ -871,7 +932,6 @@
     irq_restore_user_regs
 
 #else
-
     .align    5
 irq:
     get_bad_stack
diff -r -u u-boot/include/_exports.h u-boot-UniPd-denx.de/include/_exports.h
--- u-boot/include/_exports.h    2007-11-06 18:07:07.000000000 +0100
+++ u-boot-UniPd-denx.de/include/_exports.h    2009-05-05 
19:19:56.000000000 +0200
@@ -24,3 +24,6 @@
 EXPORT_FUNC(i2c_write)
 EXPORT_FUNC(i2c_read)
 #endif
+#ifdef CONFIG_CMD_KGDB
+EXPORT_FUNC(kgdb_breakpoint)
+#endif
diff -r -u u-boot/include/exports.h u-boot-UniPd-denx.de/include/exports.h
--- u-boot/include/exports.h    2007-11-06 18:07:07.000000000 +0100
+++ u-boot-UniPd-denx.de/include/exports.h    2009-05-05 
19:17:07.000000000 +0200
@@ -25,6 +25,9 @@
 void setenv (char *varname, char *varvalue);
 long simple_strtol(const char *cp,char **endp,unsigned int base);
 int strcmp(const char * cs,const char * ct);
+#ifdef CONFIG_CMD_KGDB
+void kgdb_breakpoint(int argc, char *argv[]);
+#endif
 #ifdef CONFIG_HAS_UID
 void forceenv (char *varname, char *varvalue);
 #endif
@@ -45,7 +48,7 @@
     XF_MAX
 };
 
-#define XF_VERSION    4
+#define XF_VERSION    5
 
 #if defined(CONFIG_I386)
 extern gd_t *global_data;
diff -r -u u-boot/lib_arm/Makefile u-boot-UniPd-denx.de/lib_arm/Makefile
--- u-boot/lib_arm/Makefile    2007-11-06 18:07:08.000000000 +0100
+++ u-boot-UniPd-denx.de/lib_arm/Makefile    2009-01-15 
13:03:04.000000000 +0100
@@ -28,7 +28,7 @@
 SOBJS    = _ashldi3.o _ashrdi3.o _divsi3.o _modsi3.o _udivsi3.o _umodsi3.o
 
 COBJS    = armlinux.o board.o \
-      cache.o div0.o
+      cache.o div0.o kgdb.o
 
 SRCS     := $(SOBJS:.o=.S) $(COBJS:.o=.c)
 OBJS    := $(addprefix $(obj),$(SOBJS) $(COBJS))
diff -r -u u-boot/lib_arm/board.c u-boot-UniPd-denx.de/lib_arm/board.c
--- u-boot/lib_arm/board.c    2007-11-06 18:07:08.000000000 +0100
+++ u-boot-UniPd-denx.de/lib_arm/board.c    2009-05-05 
19:18:01.000000000 +0200
@@ -345,6 +345,11 @@
     serial_initialize();
 #endif
 
+#if defined(CONFIG_CMD_KGDB)
+    puts ("KGDB:  ");
+    kgdb_init ();
+#endif
+
     /* IP Address */
     gd->bd->bi_ip_addr = getenv_IPaddr ("ipaddr");
 
Signed-off-by: Eng. Antonio Barbalace

             reply	other threads:[~2009-05-05 17:35 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-05-05 17:35 barbalace at igi.cnr.it [this message]
2009-05-05 18:53 ` [U-Boot] PATCH arm920t kgdb serial support Wolfgang Denk
  -- strict thread matches above, loose matches on Subject: below --
2009-05-05 19:21 [U-Boot] [PATCH] " barbalace at igi.cnr.it
2009-05-05 19:30 ` Scott Wood

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4A0078E2.2060707@igi.cnr.it \
    --to=barbalace@igi.cnr.it \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.