1 /* gdb-stub.c: FRV GDB stub
3 * Copyright (C) 2003,4 Red Hat, Inc. All Rights Reserved.
4 * Written by David Howells (dhowells@redhat.com)
5 * - Derived from Linux/MIPS version, Copyright (C) 1995 Andreas Busse
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version
10 * 2 of the License, or (at your option) any later version.
14 * To enable debugger support, two things need to happen. One, a
15 * call to set_debug_traps() is necessary in order to allow any breakpoints
16 * or error conditions to be properly intercepted and reported to gdb.
17 * Two, a breakpoint needs to be generated to begin communication. This
18 * is most easily accomplished by a call to breakpoint(). Breakpoint()
19 * simulates a breakpoint by executing a BREAK instruction.
22 * The following gdb commands are supported:
24 * command function Return value
26 * g return the value of the CPU registers hex data or ENN
27 * G set the value of the CPU registers OK or ENN
29 * mAA..AA,LLLL Read LLLL bytes at address AA..AA hex data or ENN
30 * MAA..AA,LLLL: Write LLLL bytes at address AA.AA OK or ENN
32 * c Resume at current address SNN ( signal NN)
33 * cAA..AA Continue at address AA..AA SNN
35 * s Step one instruction SNN
36 * sAA..AA Step one instruction from AA..AA SNN
40 * ? What was the last sigval ? SNN (signal NN)
42 * bBB..BB Set baud rate to BB..BB OK or BNN, then sets
45 * All commands and responses are sent with a packet which includes a
46 * checksum. A packet consists of
48 * $<packet info>#<checksum>.
51 * <packet info> :: <characters representing the command or response>
52 * <checksum> :: < two hex digits computed as modulo 256 sum of <packetinfo>>
54 * When a packet is received, it is first acknowledged with either '+' or '-'.
55 * '+' indicates a successful transfer. '-' indicates a failed transfer.
60 * $m0,10#2a +$00010203040506070809101112131415#42
67 * For reference -- the following are the steps that one
68 * company took (RidgeRun Inc) to get remote gdb debugging
69 * going. In this scenario the host machine was a PC and the
70 * target platform was a Galileo EVB64120A MIPS evaluation
74 * First download gdb-5.0.tar.gz from the internet.
75 * and then build/install the package.
78 * $ tar zxf gdb-5.0.tar.gz
80 * $ ./configure --target=frv-elf-gdb
85 * Configure linux for remote debugging and build it.
89 * $ make menuconfig <go to "Kernel Hacking" and turn on remote debugging>
90 * $ make dep; make vmlinux
93 * Download the kernel to the remote target and start
94 * the kernel running. It will promptly halt and wait
95 * for the host gdb session to connect. It does this
96 * since the "Kernel Hacking" option has defined
97 * CONFIG_REMOTE_DEBUG which in turn enables your calls
103 * Start the gdb session on the host.
106 * $ frv-elf-gdb vmlinux
107 * (gdb) set remotebaud 115200
108 * (gdb) target remote /dev/ttyS1
109 * ...at this point you are connected to
110 * the remote target and can use gdb
111 * in the normal fasion. Setting
112 * breakpoints, single stepping,
113 * printing variables, etc.
117 #include <linux/string.h>
118 #include <linux/kernel.h>
119 #include <linux/signal.h>
120 #include <linux/sched.h>
121 #include <linux/mm.h>
122 #include <linux/console.h>
123 #include <linux/init.h>
124 #include <linux/slab.h>
125 #include <linux/nmi.h>
127 #include <asm/asm-offsets.h>
128 #include <asm/pgtable.h>
129 #include <asm/system.h>
130 #include <asm/gdb-stub.h>
132 #define LEDS(x) do { /* *(u32*)0xe1200004 = ~(x); mb(); */ } while(0)
134 #undef GDBSTUB_DEBUG_PROTOCOL
136 extern void debug_to_serial(const char *p, int n);
137 extern void gdbstub_console_write(struct console *co, const char *p, unsigned n);
139 extern volatile uint32_t __break_error_detect[3]; /* ESFR1, ESR15, EAR15 */
143 } __attribute__((aligned(8)));
147 unsigned long hsr0, pcsr, esr0, ear0, epcr0;
149 unsigned long tplr, tppr, tpxr, cxnr;
153 struct __debug_amr iamr[16];
154 struct __debug_amr damr[16];
157 struct __debug_amr tlb[64*2];
161 static struct __debug_mmu __debug_mmu;
164 * BUFMAX defines the maximum number of characters in inbound/outbound buffers
165 * at least NUMREGBYTES*2 are needed for register packets
169 #define BREAK_INSN 0x801000c0 /* use "break" as bkpt */
171 static const char gdbstub_banner[] = "Linux/FR-V GDB Stub (c) RedHat 2003\n";
173 volatile u8 gdbstub_rx_buffer[PAGE_SIZE] __attribute__((aligned(PAGE_SIZE)));
174 volatile u32 gdbstub_rx_inp = 0;
175 volatile u32 gdbstub_rx_outp = 0;
176 volatile u8 gdbstub_rx_overflow = 0;
177 u8 gdbstub_rx_unget = 0;
179 /* set with GDB whilst running to permit step through exceptions */
180 extern volatile u32 __attribute__((section(".bss"))) gdbstub_trace_through_exceptions;
182 static char input_buffer[BUFMAX];
183 static char output_buffer[BUFMAX];
185 static const char hexchars[] = "0123456789abcdef";
187 static const char *regnames[] = {
188 "PSR ", "ISR ", "CCR ", "CCCR",
189 "LR ", "LCR ", "PC ", "_stt",
190 "sys ", "GR8*", "GNE0", "GNE1",
192 "TBR ", "SP ", "FP ", "GR3 ",
193 "GR4 ", "GR5 ", "GR6 ", "GR7 ",
194 "GR8 ", "GR9 ", "GR10", "GR11",
195 "GR12", "GR13", "GR14", "GR15",
196 "GR16", "GR17", "GR18", "GR19",
197 "GR20", "GR21", "GR22", "GR23",
198 "GR24", "GR25", "GR26", "GR27",
199 "EFRM", "CURR", "GR30", "BFRM"
202 struct gdbstub_bkpt {
203 unsigned long addr; /* address of breakpoint */
204 unsigned len; /* size of breakpoint */
205 uint32_t originsns[7]; /* original instructions */
208 static struct gdbstub_bkpt gdbstub_bkpts[256];
214 static void gdbstub_recv_packet(char *buffer);
215 static int gdbstub_send_packet(char *buffer);
216 static int gdbstub_compute_signal(unsigned long tbr);
217 static int hex(unsigned char ch);
218 static int hexToInt(char **ptr, unsigned long *intValue);
219 static unsigned char *mem2hex(const void *mem, char *buf, int count, int may_fault);
220 static char *hex2mem(const char *buf, void *_mem, int count);
223 * Convert ch from a hex digit to an int
225 static int hex(unsigned char ch)
227 if (ch >= 'a' && ch <= 'f')
229 if (ch >= '0' && ch <= '9')
231 if (ch >= 'A' && ch <= 'F')
236 void gdbstub_printk(const char *fmt, ...)
238 static char buf[1024];
242 /* Emit the output into the temporary buffer */
244 len = vsnprintf(buf, sizeof(buf), fmt, args);
246 debug_to_serial(buf, len);
249 static inline char *gdbstub_strcpy(char *dst, const char *src)
252 while ((dst[loop] = src[loop]))
257 static void gdbstub_purge_cache(void)
259 asm volatile(" dcef @(gr0,gr0),#1 \n"
260 " icei @(gr0,gr0),#1 \n"
266 /*****************************************************************************/
268 * scan for the sequence $<data>#<checksum>
270 static void gdbstub_recv_packet(char *buffer)
272 unsigned char checksum;
273 unsigned char xmitcsum;
275 int count, i, ret, error;
278 /* wait around for the start character, ignore all other characters */
280 gdbstub_rx_char(&ch, 0);
288 /* now, read until a # or end of buffer is found */
289 while (count < BUFMAX) {
290 ret = gdbstub_rx_char(&ch, 0);
302 gdbstub_proto("### GDB Rx Error - Skipping packet ###\n");
303 gdbstub_proto("### GDB Tx NAK\n");
304 gdbstub_tx_char('-');
308 if (count >= BUFMAX || error)
313 /* read the checksum */
314 ret = gdbstub_rx_char(&ch, 0);
317 xmitcsum = hex(ch) << 4;
319 ret = gdbstub_rx_char(&ch, 0);
326 gdbstub_proto("### GDB Rx Error - Skipping packet\n");
327 gdbstub_proto("### GDB Tx NAK\n");
328 gdbstub_tx_char('-');
332 /* check the checksum */
333 if (checksum != xmitcsum) {
334 gdbstub_proto("### GDB Tx NAK\n");
335 gdbstub_tx_char('-'); /* failed checksum */
339 gdbstub_proto("### GDB Rx '$%s#%02x' ###\n", buffer, checksum);
340 gdbstub_proto("### GDB Tx ACK\n");
341 gdbstub_tx_char('+'); /* successful transfer */
343 /* if a sequence char is present, reply the sequence ID */
344 if (buffer[2] == ':') {
345 gdbstub_tx_char(buffer[0]);
346 gdbstub_tx_char(buffer[1]);
348 /* remove sequence chars from buffer */
350 while (buffer[count]) count++;
351 for (i=3; i <= count; i++)
352 buffer[i - 3] = buffer[i];
357 } /* end gdbstub_recv_packet() */
359 /*****************************************************************************/
361 * send the packet in buffer.
362 * - return 0 if successfully ACK'd
363 * - return 1 if abandoned due to new incoming packet
365 static int gdbstub_send_packet(char *buffer)
367 unsigned char checksum;
371 /* $<packet info>#<checksum> */
372 gdbstub_proto("### GDB Tx '%s' ###\n", buffer);
375 gdbstub_tx_char('$');
379 while ((ch = buffer[count]) != 0) {
385 gdbstub_tx_char('#');
386 gdbstub_tx_char(hexchars[checksum >> 4]);
387 gdbstub_tx_char(hexchars[checksum & 0xf]);
389 } while (gdbstub_rx_char(&ch,0),
390 #ifdef GDBSTUB_DEBUG_PROTOCOL
391 ch=='-' && (gdbstub_proto("### GDB Rx NAK\n"),0),
392 ch!='-' && ch!='+' && (gdbstub_proto("### GDB Rx ??? %02x\n",ch),0),
397 gdbstub_proto("### GDB Rx ACK\n");
401 gdbstub_proto("### GDB Tx Abandoned\n");
402 gdbstub_rx_unget = ch;
404 } /* end gdbstub_send_packet() */
407 * While we find nice hex chars, build an int.
408 * Return number of chars processed.
410 static int hexToInt(char **ptr, unsigned long *_value)
420 *_value = (*_value << 4) | ((uint8_t) ch & 0xf);
429 /*****************************************************************************/
431 * probe an address to see whether it maps to anything
433 static inline int gdbstub_addr_probe(const void *vaddr)
438 asm("lrad %1,%0,#1,#0,#0" : "=r"(paddr) : "r"(vaddr));
439 if (!(paddr & xAMPRx_V))
444 } /* end gdbstub_addr_probe() */
447 static unsigned long __saved_dampr, __saved_damlr;
449 static inline unsigned long gdbstub_virt_to_pte(unsigned long vaddr)
455 unsigned long val, dampr5;
457 pgd = (pgd_t *) __get_DAMLR(3) + pgd_index(vaddr);
458 pud = pud_offset(pgd, vaddr);
459 pmd = pmd_offset(pud, vaddr);
461 if (pmd_bad(*pmd) || !pmd_present(*pmd))
464 /* make sure dampr5 maps to the correct pmd */
465 dampr5 = __get_DAMPR(5);
467 __set_DAMPR(5, val | xAMPRx_L | xAMPRx_SS_16Kb | xAMPRx_S | xAMPRx_C | xAMPRx_V);
469 /* now its safe to access pmd */
470 pte = (pte_t *)__get_DAMLR(5) + __pte_index(vaddr);
471 if (pte_present(*pte))
476 /* restore original dampr5 */
477 __set_DAMPR(5, dampr5);
483 static inline int gdbstub_addr_map(const void *vaddr)
488 __saved_dampr = __get_DAMPR(2);
489 __saved_damlr = __get_DAMLR(2);
491 if (gdbstub_addr_probe(vaddr))
494 pte = gdbstub_virt_to_pte((unsigned long) vaddr);
497 __set_DAMLR(2, (unsigned long) vaddr & PAGE_MASK);
504 static inline void gdbstub_addr_unmap(void)
507 __set_DAMPR(2, __saved_dampr);
508 __set_DAMLR(2, __saved_damlr);
513 * access potentially dodgy memory through a potentially dodgy pointer
515 static inline int gdbstub_read_dword(const void *addr, uint32_t *_res)
520 if (!gdbstub_addr_map(addr))
523 asm volatile(" movgs gr0,brr \n"
526 : "=r"(res), "=r"(brr)
527 : "m"(*(uint32_t *) addr));
529 gdbstub_addr_unmap();
533 static inline int gdbstub_write_dword(void *addr, uint32_t val)
537 if (!gdbstub_addr_map(addr))
540 asm volatile(" movgs gr0,brr \n"
544 : "r"(val), "m"(*(uint32_t *) addr));
545 gdbstub_addr_unmap();
549 static inline int gdbstub_read_word(const void *addr, uint16_t *_res)
554 if (!gdbstub_addr_map(addr))
557 asm volatile(" movgs gr0,brr \n"
560 : "=r"(res), "=r"(brr)
561 : "m"(*(uint16_t *) addr));
563 gdbstub_addr_unmap();
567 static inline int gdbstub_write_word(void *addr, uint16_t val)
571 if (!gdbstub_addr_map(addr))
574 asm volatile(" movgs gr0,brr \n"
578 : "r"(val), "m"(*(uint16_t *) addr));
579 gdbstub_addr_unmap();
583 static inline int gdbstub_read_byte(const void *addr, uint8_t *_res)
588 if (!gdbstub_addr_map(addr))
591 asm volatile(" movgs gr0,brr \n"
594 : "=r"(res), "=r"(brr)
595 : "m"(*(uint8_t *) addr));
597 gdbstub_addr_unmap();
601 static inline int gdbstub_write_byte(void *addr, uint8_t val)
605 if (!gdbstub_addr_map(addr))
608 asm volatile(" movgs gr0,brr \n"
612 : "r"(val), "m"(*(uint8_t *) addr));
613 gdbstub_addr_unmap();
617 static void __gdbstub_console_write(struct console *co, const char *p, unsigned n)
627 while (n > 0 && qty < 20) {
628 mem2hex(p, outbuf + qty, 2, 0);
639 gdbstub_send_packet(outbuf);
644 void debug_to_serial(const char *p, int n)
646 gdbstub_console_write(NULL,p,n);
650 #ifdef CONFIG_GDB_CONSOLE
652 static struct console gdbstub_console = {
654 .write = gdbstub_console_write, /* in break.S */
655 .flags = CON_PRINTBUFFER,
661 /*****************************************************************************/
663 * Convert the memory pointed to by mem into hex, placing result in buf.
664 * - if successful, return a pointer to the last char put in buf (NUL)
665 * - in case of mem fault, return NULL
666 * may_fault is non-zero if we are reading from arbitrary memory, but is currently
669 static unsigned char *mem2hex(const void *_mem, char *buf, int count, int may_fault)
671 const uint8_t *mem = _mem;
672 uint8_t ch[4] __attribute__((aligned(4)));
674 if ((uint32_t)mem&1 && count>=1) {
675 if (!gdbstub_read_byte(mem,ch))
677 *buf++ = hexchars[ch[0] >> 4];
678 *buf++ = hexchars[ch[0] & 0xf];
683 if ((uint32_t)mem&3 && count>=2) {
684 if (!gdbstub_read_word(mem,(uint16_t *)ch))
686 *buf++ = hexchars[ch[0] >> 4];
687 *buf++ = hexchars[ch[0] & 0xf];
688 *buf++ = hexchars[ch[1] >> 4];
689 *buf++ = hexchars[ch[1] & 0xf];
695 if (!gdbstub_read_dword(mem,(uint32_t *)ch))
697 *buf++ = hexchars[ch[0] >> 4];
698 *buf++ = hexchars[ch[0] & 0xf];
699 *buf++ = hexchars[ch[1] >> 4];
700 *buf++ = hexchars[ch[1] & 0xf];
701 *buf++ = hexchars[ch[2] >> 4];
702 *buf++ = hexchars[ch[2] & 0xf];
703 *buf++ = hexchars[ch[3] >> 4];
704 *buf++ = hexchars[ch[3] & 0xf];
710 if (!gdbstub_read_word(mem,(uint16_t *)ch))
712 *buf++ = hexchars[ch[0] >> 4];
713 *buf++ = hexchars[ch[0] & 0xf];
714 *buf++ = hexchars[ch[1] >> 4];
715 *buf++ = hexchars[ch[1] & 0xf];
721 if (!gdbstub_read_byte(mem,ch))
723 *buf++ = hexchars[ch[0] >> 4];
724 *buf++ = hexchars[ch[0] & 0xf];
730 } /* end mem2hex() */
732 /*****************************************************************************/
734 * convert the hex array pointed to by buf into binary to be placed in mem
735 * return a pointer to the character AFTER the last byte of buffer consumed
737 static char *hex2mem(const char *buf, void *_mem, int count)
746 if ((u32)mem&1 && count>=1) {
747 ch.b[0] = hex(*buf++) << 4;
748 ch.b[0] |= hex(*buf++);
749 if (!gdbstub_write_byte(mem,ch.b[0]))
755 if ((u32)mem&3 && count>=2) {
756 ch.b[0] = hex(*buf++) << 4;
757 ch.b[0] |= hex(*buf++);
758 ch.b[1] = hex(*buf++) << 4;
759 ch.b[1] |= hex(*buf++);
760 if (!gdbstub_write_word(mem,ch.w))
767 ch.b[0] = hex(*buf++) << 4;
768 ch.b[0] |= hex(*buf++);
769 ch.b[1] = hex(*buf++) << 4;
770 ch.b[1] |= hex(*buf++);
771 ch.b[2] = hex(*buf++) << 4;
772 ch.b[2] |= hex(*buf++);
773 ch.b[3] = hex(*buf++) << 4;
774 ch.b[3] |= hex(*buf++);
775 if (!gdbstub_write_dword(mem,ch.l))
782 ch.b[0] = hex(*buf++) << 4;
783 ch.b[0] |= hex(*buf++);
784 ch.b[1] = hex(*buf++) << 4;
785 ch.b[1] |= hex(*buf++);
786 if (!gdbstub_write_word(mem,ch.w))
793 ch.b[0] = hex(*buf++) << 4;
794 ch.b[0] |= hex(*buf++);
795 if (!gdbstub_write_byte(mem,ch.b[0]))
800 } /* end hex2mem() */
802 /*****************************************************************************/
804 * This table contains the mapping between FRV TBR.TT exception codes,
805 * and signals, which are primarily what GDB understands. It also
806 * indicates which hardware traps we need to commandeer when
807 * initializing the stub.
809 static const struct brr_to_sig_map {
810 unsigned long brr_mask; /* BRR bitmask */
811 unsigned long tbr_tt; /* TBR.TT code (in BRR.EBTT) */
812 unsigned int signo; /* Signal that we map this into */
813 } brr_to_sig_map[] = {
814 { BRR_EB, TBR_TT_INSTR_ACC_ERROR, SIGSEGV },
815 { BRR_EB, TBR_TT_ILLEGAL_INSTR, SIGILL },
816 { BRR_EB, TBR_TT_PRIV_INSTR, SIGILL },
817 { BRR_EB, TBR_TT_MP_EXCEPTION, SIGFPE },
818 { BRR_EB, TBR_TT_DATA_ACC_ERROR, SIGSEGV },
819 { BRR_EB, TBR_TT_DATA_STR_ERROR, SIGSEGV },
820 { BRR_EB, TBR_TT_DIVISION_EXCEP, SIGFPE },
821 { BRR_EB, TBR_TT_COMPOUND_EXCEP, SIGSEGV },
822 { BRR_EB, TBR_TT_INTERRUPT_13, SIGALRM }, /* watchdog */
823 { BRR_EB, TBR_TT_INTERRUPT_14, SIGINT }, /* GDB serial */
824 { BRR_EB, TBR_TT_INTERRUPT_15, SIGQUIT }, /* NMI */
825 { BRR_CB, 0, SIGUSR1 },
826 { BRR_TB, 0, SIGUSR2 },
827 { BRR_DBNEx, 0, SIGTRAP },
828 { BRR_DBx, 0, SIGTRAP }, /* h/w watchpoint */
829 { BRR_IBx, 0, SIGTRAP }, /* h/w breakpoint */
830 { BRR_CBB, 0, SIGTRAP },
831 { BRR_SB, 0, SIGTRAP },
832 { BRR_ST, 0, SIGTRAP }, /* single step */
833 { 0, 0, SIGHUP } /* default */
836 /*****************************************************************************/
838 * convert the FRV BRR register contents into a UNIX signal number
840 static inline int gdbstub_compute_signal(unsigned long brr)
842 const struct brr_to_sig_map *map;
843 unsigned long tbr = (brr & BRR_EBTT) >> 12;
845 for (map = brr_to_sig_map; map->brr_mask; map++)
846 if (map->brr_mask & brr)
847 if (!map->tbr_tt || map->tbr_tt == tbr)
851 } /* end gdbstub_compute_signal() */
853 /*****************************************************************************/
855 * set a software breakpoint or a hardware breakpoint or watchpoint
857 static int gdbstub_set_breakpoint(unsigned long type, unsigned long addr, unsigned long len)
860 int bkpt, loop, xloop;
864 unsigned long mask0, mask1;
869 //gdbstub_printk("setbkpt(%ld,%08lx,%ld)\n", type, addr, len);
872 /* set software breakpoint */
874 if (addr & 3 || len > 7*4)
877 for (bkpt = 255; bkpt >= 0; bkpt--)
878 if (!gdbstub_bkpts[bkpt].addr)
883 for (loop = 0; loop < len/4; loop++)
884 if (!gdbstub_read_dword(&((uint32_t *) addr)[loop],
885 &gdbstub_bkpts[bkpt].originsns[loop]))
888 for (loop = 0; loop < len/4; loop++)
889 if (!gdbstub_write_dword(&((uint32_t *) addr)[loop],
892 /* need to undo the changes if possible */
893 for (xloop = 0; xloop < loop; xloop++)
894 gdbstub_write_dword(&((uint32_t *) addr)[xloop],
895 gdbstub_bkpts[bkpt].originsns[xloop]);
899 gdbstub_bkpts[bkpt].addr = addr;
900 gdbstub_bkpts[bkpt].len = len;
903 gdbstub_printk("Set BKPT[%02x]: %08lx #%d {%04x, %04x} -> { %04x, %04x }\n",
905 gdbstub_bkpts[bkpt].addr,
906 gdbstub_bkpts[bkpt].len,
907 gdbstub_bkpts[bkpt].originsns[0],
908 gdbstub_bkpts[bkpt].originsns[1],
909 ((uint32_t *) addr)[0],
910 ((uint32_t *) addr)[1]
915 /* set hardware breakpoint */
917 if (addr & 3 || len != 4)
920 if (!(__debug_regs->dcr & DCR_IBE0)) {
921 //gdbstub_printk("set h/w break 0: %08lx\n", addr);
922 __debug_regs->dcr |= DCR_IBE0;
923 __debug_regs->ibar[0] = addr;
924 asm volatile("movgs %0,ibar0" : : "r"(addr));
928 if (!(__debug_regs->dcr & DCR_IBE1)) {
929 //gdbstub_printk("set h/w break 1: %08lx\n", addr);
930 __debug_regs->dcr |= DCR_IBE1;
931 __debug_regs->ibar[1] = addr;
932 asm volatile("movgs %0,ibar1" : : "r"(addr));
936 if (!(__debug_regs->dcr & DCR_IBE2)) {
937 //gdbstub_printk("set h/w break 2: %08lx\n", addr);
938 __debug_regs->dcr |= DCR_IBE2;
939 __debug_regs->ibar[2] = addr;
940 asm volatile("movgs %0,ibar2" : : "r"(addr));
944 if (!(__debug_regs->dcr & DCR_IBE3)) {
945 //gdbstub_printk("set h/w break 3: %08lx\n", addr);
946 __debug_regs->dcr |= DCR_IBE3;
947 __debug_regs->ibar[3] = addr;
948 asm volatile("movgs %0,ibar3" : : "r"(addr));
954 /* set data read/write/access watchpoint */
958 if ((addr & ~7) != ((addr + len - 1) & ~7))
963 memset(dbmr.bytes, 0xff, sizeof(dbmr.bytes));
964 for (loop = 0; loop < len; loop++)
965 dbmr.bytes[tmp + loop] = 0;
969 if (!(__debug_regs->dcr & (DCR_DRBE0|DCR_DWBE0))) {
970 //gdbstub_printk("set h/w watchpoint 0 type %ld: %08lx\n", type, addr);
971 tmp = type==2 ? DCR_DWBE0 : type==3 ? DCR_DRBE0 : DCR_DRBE0|DCR_DWBE0;
973 __debug_regs->dcr |= tmp;
974 __debug_regs->dbar[0] = addr;
975 __debug_regs->dbmr[0][0] = dbmr.mask0;
976 __debug_regs->dbmr[0][1] = dbmr.mask1;
977 __debug_regs->dbdr[0][0] = 0;
978 __debug_regs->dbdr[0][1] = 0;
980 asm volatile(" movgs %0,dbar0 \n"
981 " movgs %1,dbmr00 \n"
982 " movgs %2,dbmr01 \n"
983 " movgs gr0,dbdr00 \n"
984 " movgs gr0,dbdr01 \n"
985 : : "r"(addr), "r"(dbmr.mask0), "r"(dbmr.mask1));
989 if (!(__debug_regs->dcr & (DCR_DRBE1|DCR_DWBE1))) {
990 //gdbstub_printk("set h/w watchpoint 1 type %ld: %08lx\n", type, addr);
991 tmp = type==2 ? DCR_DWBE1 : type==3 ? DCR_DRBE1 : DCR_DRBE1|DCR_DWBE1;
993 __debug_regs->dcr |= tmp;
994 __debug_regs->dbar[1] = addr;
995 __debug_regs->dbmr[1][0] = dbmr.mask0;
996 __debug_regs->dbmr[1][1] = dbmr.mask1;
997 __debug_regs->dbdr[1][0] = 0;
998 __debug_regs->dbdr[1][1] = 0;
1000 asm volatile(" movgs %0,dbar1 \n"
1001 " movgs %1,dbmr10 \n"
1002 " movgs %2,dbmr11 \n"
1003 " movgs gr0,dbdr10 \n"
1004 " movgs gr0,dbdr11 \n"
1005 : : "r"(addr), "r"(dbmr.mask0), "r"(dbmr.mask1));
1015 } /* end gdbstub_set_breakpoint() */
1017 /*****************************************************************************/
1019 * clear a breakpoint or watchpoint
1021 int gdbstub_clear_breakpoint(unsigned long type, unsigned long addr, unsigned long len)
1028 unsigned long mask0, mask1;
1033 //gdbstub_printk("clearbkpt(%ld,%08lx,%ld)\n", type, addr, len);
1036 /* clear software breakpoint */
1038 for (bkpt = 255; bkpt >= 0; bkpt--)
1039 if (gdbstub_bkpts[bkpt].addr == addr && gdbstub_bkpts[bkpt].len == len)
1044 gdbstub_bkpts[bkpt].addr = 0;
1046 for (loop = 0; loop < len/4; loop++)
1047 if (!gdbstub_write_dword(&((uint32_t *) addr)[loop],
1048 gdbstub_bkpts[bkpt].originsns[loop]))
1052 /* clear hardware breakpoint */
1054 if (addr & 3 || len != 4)
1057 #define __get_ibar(X) ({ unsigned long x; asm volatile("movsg ibar"#X",%0" : "=r"(x)); x; })
1059 if (__debug_regs->dcr & DCR_IBE0 && __get_ibar(0) == addr) {
1060 //gdbstub_printk("clear h/w break 0: %08lx\n", addr);
1061 __debug_regs->dcr &= ~DCR_IBE0;
1062 __debug_regs->ibar[0] = 0;
1063 asm volatile("movgs gr0,ibar0");
1067 if (__debug_regs->dcr & DCR_IBE1 && __get_ibar(1) == addr) {
1068 //gdbstub_printk("clear h/w break 1: %08lx\n", addr);
1069 __debug_regs->dcr &= ~DCR_IBE1;
1070 __debug_regs->ibar[1] = 0;
1071 asm volatile("movgs gr0,ibar1");
1075 if (__debug_regs->dcr & DCR_IBE2 && __get_ibar(2) == addr) {
1076 //gdbstub_printk("clear h/w break 2: %08lx\n", addr);
1077 __debug_regs->dcr &= ~DCR_IBE2;
1078 __debug_regs->ibar[2] = 0;
1079 asm volatile("movgs gr0,ibar2");
1083 if (__debug_regs->dcr & DCR_IBE3 && __get_ibar(3) == addr) {
1084 //gdbstub_printk("clear h/w break 3: %08lx\n", addr);
1085 __debug_regs->dcr &= ~DCR_IBE3;
1086 __debug_regs->ibar[3] = 0;
1087 asm volatile("movgs gr0,ibar3");
1093 /* clear data read/write/access watchpoint */
1097 if ((addr & ~7) != ((addr + len - 1) & ~7))
1102 memset(dbmr.bytes, 0xff, sizeof(dbmr.bytes));
1103 for (loop = 0; loop < len; loop++)
1104 dbmr.bytes[tmp + loop] = 0;
1108 #define __get_dbar(X) ({ unsigned long x; asm volatile("movsg dbar"#X",%0" : "=r"(x)); x; })
1109 #define __get_dbmr0(X) ({ unsigned long x; asm volatile("movsg dbmr"#X"0,%0" : "=r"(x)); x; })
1110 #define __get_dbmr1(X) ({ unsigned long x; asm volatile("movsg dbmr"#X"1,%0" : "=r"(x)); x; })
1112 /* consider DBAR 0 */
1113 tmp = type==2 ? DCR_DWBE0 : type==3 ? DCR_DRBE0 : DCR_DRBE0|DCR_DWBE0;
1115 if ((__debug_regs->dcr & (DCR_DRBE0|DCR_DWBE0)) != tmp ||
1116 __get_dbar(0) != addr ||
1117 __get_dbmr0(0) != dbmr.mask0 ||
1118 __get_dbmr1(0) != dbmr.mask1)
1121 //gdbstub_printk("clear h/w watchpoint 0 type %ld: %08lx\n", type, addr);
1122 __debug_regs->dcr &= ~(DCR_DRBE0|DCR_DWBE0);
1123 __debug_regs->dbar[0] = 0;
1124 __debug_regs->dbmr[0][0] = 0;
1125 __debug_regs->dbmr[0][1] = 0;
1126 __debug_regs->dbdr[0][0] = 0;
1127 __debug_regs->dbdr[0][1] = 0;
1129 asm volatile(" movgs gr0,dbar0 \n"
1130 " movgs gr0,dbmr00 \n"
1131 " movgs gr0,dbmr01 \n"
1132 " movgs gr0,dbdr00 \n"
1133 " movgs gr0,dbdr01 \n");
1137 /* consider DBAR 0 */
1138 tmp = type==2 ? DCR_DWBE1 : type==3 ? DCR_DRBE1 : DCR_DRBE1|DCR_DWBE1;
1140 if ((__debug_regs->dcr & (DCR_DRBE1|DCR_DWBE1)) != tmp ||
1141 __get_dbar(1) != addr ||
1142 __get_dbmr0(1) != dbmr.mask0 ||
1143 __get_dbmr1(1) != dbmr.mask1)
1146 //gdbstub_printk("clear h/w watchpoint 1 type %ld: %08lx\n", type, addr);
1147 __debug_regs->dcr &= ~(DCR_DRBE1|DCR_DWBE1);
1148 __debug_regs->dbar[1] = 0;
1149 __debug_regs->dbmr[1][0] = 0;
1150 __debug_regs->dbmr[1][1] = 0;
1151 __debug_regs->dbdr[1][0] = 0;
1152 __debug_regs->dbdr[1][1] = 0;
1154 asm volatile(" movgs gr0,dbar1 \n"
1155 " movgs gr0,dbmr10 \n"
1156 " movgs gr0,dbmr11 \n"
1157 " movgs gr0,dbdr10 \n"
1158 " movgs gr0,dbdr11 \n");
1167 } /* end gdbstub_clear_breakpoint() */
1169 /*****************************************************************************/
1171 * check a for an internal software breakpoint, and wind the PC back if necessary
1173 static void gdbstub_check_breakpoint(void)
1175 unsigned long addr = __debug_frame->pc - 4;
1178 for (bkpt = 255; bkpt >= 0; bkpt--)
1179 if (gdbstub_bkpts[bkpt].addr == addr)
1182 __debug_frame->pc = addr;
1184 //gdbstub_printk("alter pc [%d] %08lx\n", bkpt, __debug_frame->pc);
1186 } /* end gdbstub_check_breakpoint() */
1188 /*****************************************************************************/
1192 static void __maybe_unused gdbstub_show_regs(void)
1197 gdbstub_printk("\n");
1199 gdbstub_printk("Frame: @%p [%s]\n",
1201 __debug_frame->psr & PSR_S ? "kernel" : "user");
1203 reg = (unsigned long *) __debug_frame;
1204 for (loop = 0; loop < NR_PT_REGS; loop++) {
1205 printk("%s %08lx", regnames[loop + 0], reg[loop + 0]);
1207 if (loop == NR_PT_REGS - 1 || loop % 5 == 4)
1213 gdbstub_printk("Process %s (pid: %d)\n", current->comm, current->pid);
1214 } /* end gdbstub_show_regs() */
1216 /*****************************************************************************/
1218 * dump debugging regs
1220 static void __maybe_unused gdbstub_dump_debugregs(void)
1222 gdbstub_printk("DCR %08lx ", __debug_status.dcr);
1223 gdbstub_printk("BRR %08lx\n", __debug_status.brr);
1225 gdbstub_printk("IBAR0 %08lx ", __get_ibar(0));
1226 gdbstub_printk("IBAR1 %08lx ", __get_ibar(1));
1227 gdbstub_printk("IBAR2 %08lx ", __get_ibar(2));
1228 gdbstub_printk("IBAR3 %08lx\n", __get_ibar(3));
1230 gdbstub_printk("DBAR0 %08lx ", __get_dbar(0));
1231 gdbstub_printk("DBMR00 %08lx ", __get_dbmr0(0));
1232 gdbstub_printk("DBMR01 %08lx\n", __get_dbmr1(0));
1234 gdbstub_printk("DBAR1 %08lx ", __get_dbar(1));
1235 gdbstub_printk("DBMR10 %08lx ", __get_dbmr0(1));
1236 gdbstub_printk("DBMR11 %08lx\n", __get_dbmr1(1));
1238 gdbstub_printk("\n");
1239 } /* end gdbstub_dump_debugregs() */
1241 /*****************************************************************************/
1243 * dump the MMU state into a structure so that it can be accessed with GDB
1245 void gdbstub_get_mmu_state(void)
1247 asm volatile("movsg hsr0,%0" : "=r"(__debug_mmu.regs.hsr0));
1248 asm volatile("movsg pcsr,%0" : "=r"(__debug_mmu.regs.pcsr));
1249 asm volatile("movsg esr0,%0" : "=r"(__debug_mmu.regs.esr0));
1250 asm volatile("movsg ear0,%0" : "=r"(__debug_mmu.regs.ear0));
1251 asm volatile("movsg epcr0,%0" : "=r"(__debug_mmu.regs.epcr0));
1253 /* read the protection / SAT registers */
1254 __debug_mmu.iamr[0].L = __get_IAMLR(0);
1255 __debug_mmu.iamr[0].P = __get_IAMPR(0);
1256 __debug_mmu.iamr[1].L = __get_IAMLR(1);
1257 __debug_mmu.iamr[1].P = __get_IAMPR(1);
1258 __debug_mmu.iamr[2].L = __get_IAMLR(2);
1259 __debug_mmu.iamr[2].P = __get_IAMPR(2);
1260 __debug_mmu.iamr[3].L = __get_IAMLR(3);
1261 __debug_mmu.iamr[3].P = __get_IAMPR(3);
1262 __debug_mmu.iamr[4].L = __get_IAMLR(4);
1263 __debug_mmu.iamr[4].P = __get_IAMPR(4);
1264 __debug_mmu.iamr[5].L = __get_IAMLR(5);
1265 __debug_mmu.iamr[5].P = __get_IAMPR(5);
1266 __debug_mmu.iamr[6].L = __get_IAMLR(6);
1267 __debug_mmu.iamr[6].P = __get_IAMPR(6);
1268 __debug_mmu.iamr[7].L = __get_IAMLR(7);
1269 __debug_mmu.iamr[7].P = __get_IAMPR(7);
1270 __debug_mmu.iamr[8].L = __get_IAMLR(8);
1271 __debug_mmu.iamr[8].P = __get_IAMPR(8);
1272 __debug_mmu.iamr[9].L = __get_IAMLR(9);
1273 __debug_mmu.iamr[9].P = __get_IAMPR(9);
1274 __debug_mmu.iamr[10].L = __get_IAMLR(10);
1275 __debug_mmu.iamr[10].P = __get_IAMPR(10);
1276 __debug_mmu.iamr[11].L = __get_IAMLR(11);
1277 __debug_mmu.iamr[11].P = __get_IAMPR(11);
1278 __debug_mmu.iamr[12].L = __get_IAMLR(12);
1279 __debug_mmu.iamr[12].P = __get_IAMPR(12);
1280 __debug_mmu.iamr[13].L = __get_IAMLR(13);
1281 __debug_mmu.iamr[13].P = __get_IAMPR(13);
1282 __debug_mmu.iamr[14].L = __get_IAMLR(14);
1283 __debug_mmu.iamr[14].P = __get_IAMPR(14);
1284 __debug_mmu.iamr[15].L = __get_IAMLR(15);
1285 __debug_mmu.iamr[15].P = __get_IAMPR(15);
1287 __debug_mmu.damr[0].L = __get_DAMLR(0);
1288 __debug_mmu.damr[0].P = __get_DAMPR(0);
1289 __debug_mmu.damr[1].L = __get_DAMLR(1);
1290 __debug_mmu.damr[1].P = __get_DAMPR(1);
1291 __debug_mmu.damr[2].L = __get_DAMLR(2);
1292 __debug_mmu.damr[2].P = __get_DAMPR(2);
1293 __debug_mmu.damr[3].L = __get_DAMLR(3);
1294 __debug_mmu.damr[3].P = __get_DAMPR(3);
1295 __debug_mmu.damr[4].L = __get_DAMLR(4);
1296 __debug_mmu.damr[4].P = __get_DAMPR(4);
1297 __debug_mmu.damr[5].L = __get_DAMLR(5);
1298 __debug_mmu.damr[5].P = __get_DAMPR(5);
1299 __debug_mmu.damr[6].L = __get_DAMLR(6);
1300 __debug_mmu.damr[6].P = __get_DAMPR(6);
1301 __debug_mmu.damr[7].L = __get_DAMLR(7);
1302 __debug_mmu.damr[7].P = __get_DAMPR(7);
1303 __debug_mmu.damr[8].L = __get_DAMLR(8);
1304 __debug_mmu.damr[8].P = __get_DAMPR(8);
1305 __debug_mmu.damr[9].L = __get_DAMLR(9);
1306 __debug_mmu.damr[9].P = __get_DAMPR(9);
1307 __debug_mmu.damr[10].L = __get_DAMLR(10);
1308 __debug_mmu.damr[10].P = __get_DAMPR(10);
1309 __debug_mmu.damr[11].L = __get_DAMLR(11);
1310 __debug_mmu.damr[11].P = __get_DAMPR(11);
1311 __debug_mmu.damr[12].L = __get_DAMLR(12);
1312 __debug_mmu.damr[12].P = __get_DAMPR(12);
1313 __debug_mmu.damr[13].L = __get_DAMLR(13);
1314 __debug_mmu.damr[13].P = __get_DAMPR(13);
1315 __debug_mmu.damr[14].L = __get_DAMLR(14);
1316 __debug_mmu.damr[14].P = __get_DAMPR(14);
1317 __debug_mmu.damr[15].L = __get_DAMLR(15);
1318 __debug_mmu.damr[15].P = __get_DAMPR(15);
1322 /* read the DAT entries from the TLB */
1323 struct __debug_amr *p;
1326 asm volatile("movsg tplr,%0" : "=r"(__debug_mmu.regs.tplr));
1327 asm volatile("movsg tppr,%0" : "=r"(__debug_mmu.regs.tppr));
1328 asm volatile("movsg tpxr,%0" : "=r"(__debug_mmu.regs.tpxr));
1329 asm volatile("movsg cxnr,%0" : "=r"(__debug_mmu.regs.cxnr));
1331 p = __debug_mmu.tlb;
1334 asm volatile("movgs %0,tpxr" :: "r"(0 << TPXR_WAY_SHIFT));
1335 for (loop = 0; loop < 64; loop++) {
1336 asm volatile("tlbpr %0,gr0,#1,#0" :: "r"(loop << PAGE_SHIFT));
1337 asm volatile("movsg tplr,%0" : "=r"(p->L));
1338 asm volatile("movsg tppr,%0" : "=r"(p->P));
1343 asm volatile("movgs %0,tpxr" :: "r"(1 << TPXR_WAY_SHIFT));
1344 for (loop = 0; loop < 64; loop++) {
1345 asm volatile("tlbpr %0,gr0,#1,#0" :: "r"(loop << PAGE_SHIFT));
1346 asm volatile("movsg tplr,%0" : "=r"(p->L));
1347 asm volatile("movsg tppr,%0" : "=r"(p->P));
1351 asm volatile("movgs %0,tplr" :: "r"(__debug_mmu.regs.tplr));
1352 asm volatile("movgs %0,tppr" :: "r"(__debug_mmu.regs.tppr));
1353 asm volatile("movgs %0,tpxr" :: "r"(__debug_mmu.regs.tpxr));
1357 } /* end gdbstub_get_mmu_state() */
1359 /*****************************************************************************/
1361 * handle event interception and GDB remote protocol processing
1363 * PSR.ET==0, PSR.S==1 and the CPU is in debug mode
1364 * __debug_frame points to the saved registers
1365 * __frame points to the kernel mode exception frame, if it was in kernel
1366 * mode when the break happened
1368 void gdbstub(int sigval)
1370 unsigned long addr, length, loop, dbar, temp, temp2, temp3;
1373 int flush_cache = 0;
1378 #ifndef CONFIG_GDBSTUB_IMMEDIATE
1379 /* return immediately if GDB immediate activation option not set */
1386 save_user_regs(&__debug_frame0->uc);
1389 gdbstub_printk("--> gdbstub() %08x %p %08x %08x\n",
1393 __debug_regs->bpsr);
1394 // gdbstub_show_regs();
1399 /* if we were interrupted by input on the serial gdbstub serial port,
1400 * restore the context prior to the interrupt so that we return to that
1403 temp = (unsigned long) __entry_kerneltrap_table;
1404 temp2 = (unsigned long) __entry_usertrap_table;
1405 temp3 = __debug_frame->pc & ~15;
1407 if (temp3 == temp + TBR_TT_INTERRUPT_15 ||
1408 temp3 == temp2 + TBR_TT_INTERRUPT_15
1410 asm volatile("movsg pcsr,%0" : "=r"(__debug_frame->pc));
1411 __debug_frame->psr |= PSR_ET;
1412 __debug_frame->psr &= ~PSR_S;
1413 if (__debug_frame->psr & PSR_PS)
1414 __debug_frame->psr |= PSR_S;
1415 __debug_status.brr = (__debug_frame->tbr & TBR_TT) << 12;
1416 __debug_status.brr |= BRR_EB;
1420 /* handle the decrement timer going off (FR451 only) */
1421 if (temp3 == temp + TBR_TT_DECREMENT_TIMER ||
1422 temp3 == temp2 + TBR_TT_DECREMENT_TIMER
1424 asm volatile("movgs %0,timerd" :: "r"(10000000));
1425 asm volatile("movsg pcsr,%0" : "=r"(__debug_frame->pc));
1426 __debug_frame->psr |= PSR_ET;
1427 __debug_frame->psr &= ~PSR_S;
1428 if (__debug_frame->psr & PSR_PS)
1429 __debug_frame->psr |= PSR_S;
1430 __debug_status.brr = (__debug_frame->tbr & TBR_TT) << 12;
1431 __debug_status.brr |= BRR_EB;
1437 /* after a BREAK insn, the PC lands on the far side of it */
1438 if (__debug_status.brr & BRR_SB)
1439 gdbstub_check_breakpoint();
1443 /* handle attempts to write console data via GDB "O" commands */
1444 if (__debug_frame->pc == (unsigned long) gdbstub_console_write + 4) {
1445 __gdbstub_console_write((struct console *) __debug_frame->gr8,
1446 (const char *) __debug_frame->gr9,
1447 (unsigned) __debug_frame->gr10);
1451 if (gdbstub_rx_unget) {
1453 goto packet_waiting;
1457 sigval = gdbstub_compute_signal(__debug_status.brr);
1461 /* send a message to the debugger's user saying what happened if it may
1462 * not be clear cut (we can't map exceptions onto signals properly)
1464 if (sigval != SIGINT && sigval != SIGTRAP && sigval != SIGILL) {
1465 static const char title[] = "Break ";
1466 static const char crlf[] = "\r\n";
1467 unsigned long brr = __debug_status.brr;
1470 ptr = output_buffer;
1472 ptr = mem2hex(title, ptr, sizeof(title) - 1,0);
1474 hx = hexchars[(brr & 0xf0000000) >> 28];
1475 *ptr++ = hexchars[hx >> 4]; *ptr++ = hexchars[hx & 0xf];
1476 hx = hexchars[(brr & 0x0f000000) >> 24];
1477 *ptr++ = hexchars[hx >> 4]; *ptr++ = hexchars[hx & 0xf];
1478 hx = hexchars[(brr & 0x00f00000) >> 20];
1479 *ptr++ = hexchars[hx >> 4]; *ptr++ = hexchars[hx & 0xf];
1480 hx = hexchars[(brr & 0x000f0000) >> 16];
1481 *ptr++ = hexchars[hx >> 4]; *ptr++ = hexchars[hx & 0xf];
1482 hx = hexchars[(brr & 0x0000f000) >> 12];
1483 *ptr++ = hexchars[hx >> 4]; *ptr++ = hexchars[hx & 0xf];
1484 hx = hexchars[(brr & 0x00000f00) >> 8];
1485 *ptr++ = hexchars[hx >> 4]; *ptr++ = hexchars[hx & 0xf];
1486 hx = hexchars[(brr & 0x000000f0) >> 4];
1487 *ptr++ = hexchars[hx >> 4]; *ptr++ = hexchars[hx & 0xf];
1488 hx = hexchars[(brr & 0x0000000f)];
1489 *ptr++ = hexchars[hx >> 4]; *ptr++ = hexchars[hx & 0xf];
1491 ptr = mem2hex(crlf, ptr, sizeof(crlf) - 1, 0);
1493 gdbstub_send_packet(output_buffer); /* send it off... */
1498 /* tell the debugger that an exception has occurred */
1499 ptr = output_buffer;
1501 /* Send trap type (converted to signal) */
1503 *ptr++ = hexchars[sigval >> 4];
1504 *ptr++ = hexchars[sigval & 0xf];
1507 *ptr++ = hexchars[GDB_REG_PC >> 4];
1508 *ptr++ = hexchars[GDB_REG_PC & 0xf];
1510 ptr = mem2hex(&__debug_frame->pc, ptr, 4, 0);
1514 * Send frame pointer
1516 *ptr++ = hexchars[GDB_REG_FP >> 4];
1517 *ptr++ = hexchars[GDB_REG_FP & 0xf];
1519 ptr = mem2hex(&__debug_frame->fp, ptr, 4, 0);
1523 * Send stack pointer
1525 *ptr++ = hexchars[GDB_REG_SP >> 4];
1526 *ptr++ = hexchars[GDB_REG_SP & 0xf];
1528 ptr = mem2hex(&__debug_frame->sp, ptr, 4, 0);
1532 gdbstub_send_packet(output_buffer); /* send it off... */
1537 gdbstub_get_mmu_state();
1539 /* wait for input from remote GDB */
1541 output_buffer[0] = 0;
1544 gdbstub_recv_packet(input_buffer);
1545 LEDS(0x5600 | input_buffer[0]);
1547 switch (input_buffer[0]) {
1548 /* request repeat of last signal number */
1550 output_buffer[0] = 'S';
1551 output_buffer[1] = hexchars[sigval >> 4];
1552 output_buffer[2] = hexchars[sigval & 0xf];
1553 output_buffer[3] = 0;
1557 /* toggle debug flag */
1560 /* return the value of the CPU registers
1561 * - GR0, GR1, GR2, GR3, GR4, GR5, GR6, GR7,
1562 * - GR8, GR9, GR10, GR11, GR12, GR13, GR14, GR15,
1563 * - GR16, GR17, GR18, GR19, GR20, GR21, GR22, GR23,
1564 * - GR24, GR25, GR26, GR27, GR28, GR29, GR30, GR31,
1565 * - GR32, GR33, GR34, GR35, GR36, GR37, GR38, GR39,
1566 * - GR40, GR41, GR42, GR43, GR44, GR45, GR46, GR47,
1567 * - GR48, GR49, GR50, GR51, GR52, GR53, GR54, GR55,
1568 * - GR56, GR57, GR58, GR59, GR60, GR61, GR62, GR63,
1569 * - FP0, FP1, FP2, FP3, FP4, FP5, FP6, FP7,
1570 * - FP8, FP9, FP10, FP11, FP12, FP13, FP14, FP15,
1571 * - FP16, FP17, FP18, FP19, FP20, FP21, FP22, FP23,
1572 * - FP24, FP25, FP26, FP27, FP28, FP29, FP30, FP31,
1573 * - FP32, FP33, FP34, FP35, FP36, FP37, FP38, FP39,
1574 * - FP40, FP41, FP42, FP43, FP44, FP45, FP46, FP47,
1575 * - FP48, FP49, FP50, FP51, FP52, FP53, FP54, FP55,
1576 * - FP56, FP57, FP58, FP59, FP60, FP61, FP62, FP63,
1577 * - PC, PSR, CCR, CCCR,
1578 * - _X132, _X133, _X134
1579 * - TBR, BRR, DBAR0, DBAR1, DBAR2, DBAR3,
1580 * - _X141, _X142, _X143, _X144,
1585 ptr = output_buffer;
1587 /* deal with GR0, GR1-GR27, GR28-GR31, GR32-GR63 */
1588 ptr = mem2hex(&zero, ptr, 4, 0);
1590 for (loop = 1; loop <= 27; loop++)
1591 ptr = mem2hex(&__debug_user_context->i.gr[loop], ptr, 4, 0);
1592 temp = (unsigned long) __frame;
1593 ptr = mem2hex(&temp, ptr, 4, 0);
1594 ptr = mem2hex(&__debug_user_context->i.gr[29], ptr, 4, 0);
1595 ptr = mem2hex(&__debug_user_context->i.gr[30], ptr, 4, 0);
1597 ptr = mem2hex(&__debug_user_context->i.gr[31], ptr, 4, 0);
1599 temp = (unsigned long) __debug_frame;
1600 ptr = mem2hex(&temp, ptr, 4, 0);
1603 for (loop = 32; loop <= 63; loop++)
1604 ptr = mem2hex(&__debug_user_context->i.gr[loop], ptr, 4, 0);
1606 /* deal with FR0-FR63 */
1607 for (loop = 0; loop <= 63; loop++)
1608 ptr = mem2hex(&__debug_user_context->f.fr[loop], ptr, 4, 0);
1610 /* deal with special registers */
1611 ptr = mem2hex(&__debug_frame->pc, ptr, 4, 0);
1612 ptr = mem2hex(&__debug_frame->psr, ptr, 4, 0);
1613 ptr = mem2hex(&__debug_frame->ccr, ptr, 4, 0);
1614 ptr = mem2hex(&__debug_frame->cccr, ptr, 4, 0);
1615 ptr = mem2hex(&zero, ptr, 4, 0);
1616 ptr = mem2hex(&zero, ptr, 4, 0);
1617 ptr = mem2hex(&zero, ptr, 4, 0);
1618 ptr = mem2hex(&__debug_frame->tbr, ptr, 4, 0);
1619 ptr = mem2hex(&__debug_status.brr , ptr, 4, 0);
1621 asm volatile("movsg dbar0,%0" : "=r"(dbar));
1622 ptr = mem2hex(&dbar, ptr, 4, 0);
1623 asm volatile("movsg dbar1,%0" : "=r"(dbar));
1624 ptr = mem2hex(&dbar, ptr, 4, 0);
1625 asm volatile("movsg dbar2,%0" : "=r"(dbar));
1626 ptr = mem2hex(&dbar, ptr, 4, 0);
1627 asm volatile("movsg dbar3,%0" : "=r"(dbar));
1628 ptr = mem2hex(&dbar, ptr, 4, 0);
1630 asm volatile("movsg scr0,%0" : "=r"(dbar));
1631 ptr = mem2hex(&dbar, ptr, 4, 0);
1632 asm volatile("movsg scr1,%0" : "=r"(dbar));
1633 ptr = mem2hex(&dbar, ptr, 4, 0);
1634 asm volatile("movsg scr2,%0" : "=r"(dbar));
1635 ptr = mem2hex(&dbar, ptr, 4, 0);
1636 asm volatile("movsg scr3,%0" : "=r"(dbar));
1637 ptr = mem2hex(&dbar, ptr, 4, 0);
1639 ptr = mem2hex(&__debug_frame->lr, ptr, 4, 0);
1640 ptr = mem2hex(&__debug_frame->lcr, ptr, 4, 0);
1642 ptr = mem2hex(&__debug_frame->iacc0, ptr, 8, 0);
1644 ptr = mem2hex(&__debug_user_context->f.fsr[0], ptr, 4, 0);
1646 for (loop = 0; loop <= 7; loop++)
1647 ptr = mem2hex(&__debug_user_context->f.acc[loop], ptr, 4, 0);
1649 ptr = mem2hex(&__debug_user_context->f.accg, ptr, 8, 0);
1651 for (loop = 0; loop <= 1; loop++)
1652 ptr = mem2hex(&__debug_user_context->f.msr[loop], ptr, 4, 0);
1654 ptr = mem2hex(&__debug_frame->gner0, ptr, 4, 0);
1655 ptr = mem2hex(&__debug_frame->gner1, ptr, 4, 0);
1657 ptr = mem2hex(&__debug_user_context->f.fner[0], ptr, 4, 0);
1658 ptr = mem2hex(&__debug_user_context->f.fner[1], ptr, 4, 0);
1662 /* set the values of the CPU registers */
1664 ptr = &input_buffer[1];
1666 /* deal with GR0, GR1-GR27, GR28-GR31, GR32-GR63 */
1667 ptr = hex2mem(ptr, &temp, 4);
1669 for (loop = 1; loop <= 27; loop++)
1670 ptr = hex2mem(ptr, &__debug_user_context->i.gr[loop], 4);
1672 ptr = hex2mem(ptr, &temp, 4);
1673 __frame = (struct pt_regs *) temp;
1674 ptr = hex2mem(ptr, &__debug_frame->gr29, 4);
1675 ptr = hex2mem(ptr, &__debug_frame->gr30, 4);
1677 ptr = hex2mem(ptr, &__debug_frame->gr31, 4);
1679 ptr = hex2mem(ptr, &temp, 4);
1682 for (loop = 32; loop <= 63; loop++)
1683 ptr = hex2mem(ptr, &__debug_user_context->i.gr[loop], 4);
1685 /* deal with FR0-FR63 */
1686 for (loop = 0; loop <= 63; loop++)
1687 ptr = mem2hex(&__debug_user_context->f.fr[loop], ptr, 4, 0);
1689 /* deal with special registers */
1690 ptr = hex2mem(ptr, &__debug_frame->pc, 4);
1691 ptr = hex2mem(ptr, &__debug_frame->psr, 4);
1692 ptr = hex2mem(ptr, &__debug_frame->ccr, 4);
1693 ptr = hex2mem(ptr, &__debug_frame->cccr,4);
1695 for (loop = 132; loop <= 140; loop++)
1696 ptr = hex2mem(ptr, &temp, 4);
1698 ptr = hex2mem(ptr, &temp, 4);
1699 asm volatile("movgs %0,scr0" :: "r"(temp));
1700 ptr = hex2mem(ptr, &temp, 4);
1701 asm volatile("movgs %0,scr1" :: "r"(temp));
1702 ptr = hex2mem(ptr, &temp, 4);
1703 asm volatile("movgs %0,scr2" :: "r"(temp));
1704 ptr = hex2mem(ptr, &temp, 4);
1705 asm volatile("movgs %0,scr3" :: "r"(temp));
1707 ptr = hex2mem(ptr, &__debug_frame->lr, 4);
1708 ptr = hex2mem(ptr, &__debug_frame->lcr, 4);
1710 ptr = hex2mem(ptr, &__debug_frame->iacc0, 8);
1712 ptr = hex2mem(ptr, &__debug_user_context->f.fsr[0], 4);
1714 for (loop = 0; loop <= 7; loop++)
1715 ptr = hex2mem(ptr, &__debug_user_context->f.acc[loop], 4);
1717 ptr = hex2mem(ptr, &__debug_user_context->f.accg, 8);
1719 for (loop = 0; loop <= 1; loop++)
1720 ptr = hex2mem(ptr, &__debug_user_context->f.msr[loop], 4);
1722 ptr = hex2mem(ptr, &__debug_frame->gner0, 4);
1723 ptr = hex2mem(ptr, &__debug_frame->gner1, 4);
1725 ptr = hex2mem(ptr, &__debug_user_context->f.fner[0], 4);
1726 ptr = hex2mem(ptr, &__debug_user_context->f.fner[1], 4);
1728 gdbstub_strcpy(output_buffer,"OK");
1731 /* mAA..AA,LLLL Read LLLL bytes at address AA..AA */
1733 ptr = &input_buffer[1];
1735 if (hexToInt(&ptr, &addr) &&
1737 hexToInt(&ptr, &length)
1739 if (mem2hex((char *)addr, output_buffer, length, 1))
1741 gdbstub_strcpy (output_buffer, "E03");
1744 gdbstub_strcpy(output_buffer,"E01");
1748 /* MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK */
1750 ptr = &input_buffer[1];
1752 if (hexToInt(&ptr, &addr) &&
1754 hexToInt(&ptr, &length) &&
1757 if (hex2mem(ptr, (char *)addr, length)) {
1758 gdbstub_strcpy(output_buffer, "OK");
1761 gdbstub_strcpy(output_buffer, "E03");
1765 gdbstub_strcpy(output_buffer, "E02");
1770 /* PNN,=RRRRRRRR: Write value R to reg N return OK */
1772 ptr = &input_buffer[1];
1774 if (!hexToInt(&ptr, &addr) ||
1776 !hexToInt(&ptr, &temp)
1778 gdbstub_strcpy(output_buffer, "E01");
1786 case GDB_REG_GR(1) ... GDB_REG_GR(63):
1787 __debug_user_context->i.gr[addr - GDB_REG_GR(0)] = temp;
1789 case GDB_REG_FR(0) ... GDB_REG_FR(63):
1790 __debug_user_context->f.fr[addr - GDB_REG_FR(0)] = temp;
1793 __debug_user_context->i.pc = temp;
1796 __debug_user_context->i.psr = temp;
1799 __debug_user_context->i.ccr = temp;
1802 __debug_user_context->i.cccr = temp;
1805 __debug_status.brr = temp;
1808 __debug_user_context->i.lr = temp;
1811 __debug_user_context->i.lcr = temp;
1814 __debug_user_context->f.fsr[0] = temp;
1816 case GDB_REG_ACC(0) ... GDB_REG_ACC(7):
1817 __debug_user_context->f.acc[addr - GDB_REG_ACC(0)] = temp;
1819 case GDB_REG_ACCG(0):
1820 *(uint32_t *) &__debug_user_context->f.accg[0] = temp;
1822 case GDB_REG_ACCG(4):
1823 *(uint32_t *) &__debug_user_context->f.accg[4] = temp;
1825 case GDB_REG_MSR(0) ... GDB_REG_MSR(1):
1826 __debug_user_context->f.msr[addr - GDB_REG_MSR(0)] = temp;
1828 case GDB_REG_GNER(0) ... GDB_REG_GNER(1):
1829 __debug_user_context->i.gner[addr - GDB_REG_GNER(0)] = temp;
1831 case GDB_REG_FNER(0) ... GDB_REG_FNER(1):
1832 __debug_user_context->f.fner[addr - GDB_REG_FNER(0)] = temp;
1840 gdbstub_strcpy(output_buffer, "OK");
1843 gdbstub_strcpy(output_buffer, "E02");
1847 /* cAA..AA Continue at address AA..AA(optional) */
1849 /* try to read optional parameter, pc unchanged if no parm */
1850 ptr = &input_buffer[1];
1851 if (hexToInt(&ptr, &addr))
1852 __debug_frame->pc = addr;
1855 /* kill the program */
1857 goto done; /* just continue */
1860 /* reset the whole machine (FIXME: system dependent) */
1865 /* step to next instruction */
1867 __debug_regs->dcr |= DCR_SE;
1868 __debug_status.dcr |= DCR_SE;
1871 /* set baud rate (bBB) */
1873 ptr = &input_buffer[1];
1874 if (!hexToInt(&ptr, &temp)) {
1875 gdbstub_strcpy(output_buffer,"B01");
1880 /* ack before changing speed */
1881 gdbstub_send_packet("OK");
1882 gdbstub_set_baud(temp);
1886 /* set breakpoint */
1888 ptr = &input_buffer[1];
1890 if (!hexToInt(&ptr,&temp) || *ptr++ != ',' ||
1891 !hexToInt(&ptr,&addr) || *ptr++ != ',' ||
1892 !hexToInt(&ptr,&length)
1894 gdbstub_strcpy(output_buffer,"E01");
1899 gdbstub_strcpy(output_buffer,"E03");
1903 if (gdbstub_set_breakpoint(temp, addr, length) < 0) {
1904 gdbstub_strcpy(output_buffer,"E03");
1909 flush_cache = 1; /* soft bkpt by modified memory */
1911 gdbstub_strcpy(output_buffer,"OK");
1914 /* clear breakpoint */
1916 ptr = &input_buffer[1];
1918 if (!hexToInt(&ptr,&temp) || *ptr++ != ',' ||
1919 !hexToInt(&ptr,&addr) || *ptr++ != ',' ||
1920 !hexToInt(&ptr,&length)
1922 gdbstub_strcpy(output_buffer,"E01");
1927 gdbstub_strcpy(output_buffer,"E03");
1931 if (gdbstub_clear_breakpoint(temp, addr, length) < 0) {
1932 gdbstub_strcpy(output_buffer,"E03");
1937 flush_cache = 1; /* soft bkpt by modified memory */
1939 gdbstub_strcpy(output_buffer,"OK");
1943 gdbstub_proto("### GDB Unsupported Cmd '%s'\n",input_buffer);
1947 /* reply to the request */
1949 gdbstub_send_packet(output_buffer);
1953 restore_user_regs(&__debug_frame0->uc);
1955 //gdbstub_dump_debugregs();
1956 //gdbstub_printk("<-- gdbstub() %08x\n", __debug_frame->pc);
1958 /* need to flush the instruction cache before resuming, as we may have
1959 * deposited a breakpoint, and the icache probably has no way of
1960 * knowing that a data ref to some location may have changed something
1961 * that is in the instruction cache. NB: We flush both caches, just to
1965 /* note: flushing the icache will clobber EAR0 on the FR451 */
1967 gdbstub_purge_cache();
1971 } /* end gdbstub() */
1973 /*****************************************************************************/
1975 * initialise the GDB stub
1977 void __init gdbstub_init(void)
1979 #ifdef CONFIG_GDBSTUB_IMMEDIATE
1984 gdbstub_printk("%s", gdbstub_banner);
1988 /* try to talk to GDB (or anyone insane enough to want to type GDB protocol by hand) */
1989 gdbstub_proto("### GDB Tx ACK\n");
1990 gdbstub_tx_char('+'); /* 'hello world' */
1992 #ifdef CONFIG_GDBSTUB_IMMEDIATE
1993 gdbstub_printk("GDB Stub waiting for packet\n");
1996 * In case GDB is started before us, ack any packets
1997 * (presumably "$?#xx") sitting there.
1999 do { gdbstub_rx_char(&ch, 0); } while (ch != '$');
2000 do { gdbstub_rx_char(&ch, 0); } while (ch != '#');
2001 do { ret = gdbstub_rx_char(&ch, 0); } while (ret != 0); /* eat first csum byte */
2002 do { ret = gdbstub_rx_char(&ch, 0); } while (ret != 0); /* eat second csum byte */
2004 gdbstub_proto("### GDB Tx NAK\n");
2005 gdbstub_tx_char('-'); /* nak it */
2008 gdbstub_printk("GDB Stub set\n");
2013 ptr = output_buffer;
2015 ptr = mem2hex(gdbstub_banner, ptr, sizeof(gdbstub_banner) - 1, 0);
2016 gdbstub_send_packet(output_buffer);
2018 #if defined(CONFIG_GDB_CONSOLE) && defined(CONFIG_GDBSTUB_IMMEDIATE)
2019 register_console(&gdbstub_console);
2022 } /* end gdbstub_init() */
2024 /*****************************************************************************/
2026 * register the console at a more appropriate time
2028 #if defined (CONFIG_GDB_CONSOLE) && !defined(CONFIG_GDBSTUB_IMMEDIATE)
2029 static int __init gdbstub_postinit(void)
2031 printk("registering console\n");
2032 register_console(&gdbstub_console);
2034 } /* end gdbstub_postinit() */
2036 __initcall(gdbstub_postinit);
2039 /*****************************************************************************/
2041 * send an exit message to GDB
2043 void gdbstub_exit(int status)
2045 unsigned char checksum;
2049 sprintf(output_buffer,"W%02x",status&0xff);
2051 gdbstub_tx_char('$');
2055 while ((ch = output_buffer[count]) != 0) {
2056 gdbstub_tx_char(ch);
2061 gdbstub_tx_char('#');
2062 gdbstub_tx_char(hexchars[checksum >> 4]);
2063 gdbstub_tx_char(hexchars[checksum & 0xf]);
2065 /* make sure the output is flushed, or else RedBoot might clobber it */
2066 gdbstub_tx_char('-');
2069 } /* end gdbstub_exit() */
2071 /*****************************************************************************/
2073 * GDB wants to call malloc() and free() to allocate memory for calling kernel
2074 * functions directly from its command line
2076 static void *malloc(size_t size) __maybe_unused;
2077 static void *malloc(size_t size)
2079 return kmalloc(size, GFP_ATOMIC);
2082 static void free(void *p) __maybe_unused;
2083 static void free(void *p)
2088 static uint32_t ___get_HSR0(void) __maybe_unused;
2089 static uint32_t ___get_HSR0(void)
2091 return __get_HSR(0);
2094 static uint32_t ___set_HSR0(uint32_t x) __maybe_unused;
2095 static uint32_t ___set_HSR0(uint32_t x)
2098 return __get_HSR(0);