MIPS: Yosemite, Emma: Fix off-by-two in arcs_cmdline buffer size check
[linux-2.6/linux-mips.git] / arch / frv / kernel / gdb-stub.c
bloba6d5381c94fee5cb871099bea62b9db848b3efaa
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
38 * k kill
40 * ? What was the last sigval ? SNN (signal NN)
42 * bBB..BB Set baud rate to BB..BB OK or BNN, then sets
43 * baud rate
45 * All commands and responses are sent with a packet which includes a
46 * checksum. A packet consists of
48 * $<packet info>#<checksum>.
50 * where
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.
57 * Example:
59 * Host: Reply:
60 * $m0,10#2a +$00010203040506070809101112131415#42
63 * ==============
64 * MORE EXAMPLES:
65 * ==============
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
71 * board.
73 * Step 1:
74 * First download gdb-5.0.tar.gz from the internet.
75 * and then build/install the package.
77 * Example:
78 * $ tar zxf gdb-5.0.tar.gz
79 * $ cd gdb-5.0
80 * $ ./configure --target=frv-elf-gdb
81 * $ make
82 * $ frv-elf-gdb
84 * Step 2:
85 * Configure linux for remote debugging and build it.
87 * Example:
88 * $ cd ~/linux
89 * $ make menuconfig <go to "Kernel Hacking" and turn on remote debugging>
90 * $ make vmlinux
92 * Step 3:
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
98 * to:
99 * set_debug_traps();
100 * breakpoint();
102 * Step 4:
103 * Start the gdb session on the host.
105 * Example:
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 */
141 struct __debug_amr {
142 unsigned long L, P;
143 } __attribute__((aligned(8)));
145 struct __debug_mmu {
146 struct {
147 unsigned long hsr0, pcsr, esr0, ear0, epcr0;
148 #ifdef CONFIG_MMU
149 unsigned long tplr, tppr, tpxr, cxnr;
150 #endif
151 } regs;
153 struct __debug_amr iamr[16];
154 struct __debug_amr damr[16];
156 #ifdef CONFIG_MMU
157 struct __debug_amr tlb[64*2];
158 #endif
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
167 #define BUFMAX 2048
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 *regnames[] = {
186 "PSR ", "ISR ", "CCR ", "CCCR",
187 "LR ", "LCR ", "PC ", "_stt",
188 "sys ", "GR8*", "GNE0", "GNE1",
189 "IACH", "IACL",
190 "TBR ", "SP ", "FP ", "GR3 ",
191 "GR4 ", "GR5 ", "GR6 ", "GR7 ",
192 "GR8 ", "GR9 ", "GR10", "GR11",
193 "GR12", "GR13", "GR14", "GR15",
194 "GR16", "GR17", "GR18", "GR19",
195 "GR20", "GR21", "GR22", "GR23",
196 "GR24", "GR25", "GR26", "GR27",
197 "EFRM", "CURR", "GR30", "BFRM"
200 struct gdbstub_bkpt {
201 unsigned long addr; /* address of breakpoint */
202 unsigned len; /* size of breakpoint */
203 uint32_t originsns[7]; /* original instructions */
206 static struct gdbstub_bkpt gdbstub_bkpts[256];
209 * local prototypes
212 static void gdbstub_recv_packet(char *buffer);
213 static int gdbstub_send_packet(char *buffer);
214 static int gdbstub_compute_signal(unsigned long tbr);
215 static int hex(unsigned char ch);
216 static int hexToInt(char **ptr, unsigned long *intValue);
217 static unsigned char *mem2hex(const void *mem, char *buf, int count, int may_fault);
218 static char *hex2mem(const char *buf, void *_mem, int count);
221 * Convert ch from a hex digit to an int
223 static int hex(unsigned char ch)
225 if (ch >= 'a' && ch <= 'f')
226 return ch-'a'+10;
227 if (ch >= '0' && ch <= '9')
228 return ch-'0';
229 if (ch >= 'A' && ch <= 'F')
230 return ch-'A'+10;
231 return -1;
234 void gdbstub_printk(const char *fmt, ...)
236 static char buf[1024];
237 va_list args;
238 int len;
240 /* Emit the output into the temporary buffer */
241 va_start(args, fmt);
242 len = vsnprintf(buf, sizeof(buf), fmt, args);
243 va_end(args);
244 debug_to_serial(buf, len);
247 static inline char *gdbstub_strcpy(char *dst, const char *src)
249 int loop = 0;
250 while ((dst[loop] = src[loop]))
251 loop++;
252 return dst;
255 static void gdbstub_purge_cache(void)
257 asm volatile(" dcef @(gr0,gr0),#1 \n"
258 " icei @(gr0,gr0),#1 \n"
259 " membar \n"
260 " bar \n"
264 /*****************************************************************************/
266 * scan for the sequence $<data>#<checksum>
268 static void gdbstub_recv_packet(char *buffer)
270 unsigned char checksum;
271 unsigned char xmitcsum;
272 unsigned char ch;
273 int count, i, ret, error;
275 for (;;) {
276 /* wait around for the start character, ignore all other characters */
277 do {
278 gdbstub_rx_char(&ch, 0);
279 } while (ch != '$');
281 checksum = 0;
282 xmitcsum = -1;
283 count = 0;
284 error = 0;
286 /* now, read until a # or end of buffer is found */
287 while (count < BUFMAX) {
288 ret = gdbstub_rx_char(&ch, 0);
289 if (ret < 0)
290 error = ret;
292 if (ch == '#')
293 break;
294 checksum += ch;
295 buffer[count] = ch;
296 count++;
299 if (error == -EIO) {
300 gdbstub_proto("### GDB Rx Error - Skipping packet ###\n");
301 gdbstub_proto("### GDB Tx NAK\n");
302 gdbstub_tx_char('-');
303 continue;
306 if (count >= BUFMAX || error)
307 continue;
309 buffer[count] = 0;
311 /* read the checksum */
312 ret = gdbstub_rx_char(&ch, 0);
313 if (ret < 0)
314 error = ret;
315 xmitcsum = hex(ch) << 4;
317 ret = gdbstub_rx_char(&ch, 0);
318 if (ret < 0)
319 error = ret;
320 xmitcsum |= hex(ch);
322 if (error) {
323 if (error == -EIO)
324 gdbstub_proto("### GDB Rx Error - Skipping packet\n");
325 gdbstub_proto("### GDB Tx NAK\n");
326 gdbstub_tx_char('-');
327 continue;
330 /* check the checksum */
331 if (checksum != xmitcsum) {
332 gdbstub_proto("### GDB Tx NAK\n");
333 gdbstub_tx_char('-'); /* failed checksum */
334 continue;
337 gdbstub_proto("### GDB Rx '$%s#%02x' ###\n", buffer, checksum);
338 gdbstub_proto("### GDB Tx ACK\n");
339 gdbstub_tx_char('+'); /* successful transfer */
341 /* if a sequence char is present, reply the sequence ID */
342 if (buffer[2] == ':') {
343 gdbstub_tx_char(buffer[0]);
344 gdbstub_tx_char(buffer[1]);
346 /* remove sequence chars from buffer */
347 count = 0;
348 while (buffer[count]) count++;
349 for (i=3; i <= count; i++)
350 buffer[i - 3] = buffer[i];
353 break;
355 } /* end gdbstub_recv_packet() */
357 /*****************************************************************************/
359 * send the packet in buffer.
360 * - return 0 if successfully ACK'd
361 * - return 1 if abandoned due to new incoming packet
363 static int gdbstub_send_packet(char *buffer)
365 unsigned char checksum;
366 int count;
367 unsigned char ch;
369 /* $<packet info>#<checksum> */
370 gdbstub_proto("### GDB Tx '%s' ###\n", buffer);
372 do {
373 gdbstub_tx_char('$');
374 checksum = 0;
375 count = 0;
377 while ((ch = buffer[count]) != 0) {
378 gdbstub_tx_char(ch);
379 checksum += ch;
380 count += 1;
383 gdbstub_tx_char('#');
384 gdbstub_tx_char(hex_asc_hi(checksum));
385 gdbstub_tx_char(hex_asc_lo(checksum));
387 } while (gdbstub_rx_char(&ch,0),
388 #ifdef GDBSTUB_DEBUG_PROTOCOL
389 ch=='-' && (gdbstub_proto("### GDB Rx NAK\n"),0),
390 ch!='-' && ch!='+' && (gdbstub_proto("### GDB Rx ??? %02x\n",ch),0),
391 #endif
392 ch!='+' && ch!='$');
394 if (ch=='+') {
395 gdbstub_proto("### GDB Rx ACK\n");
396 return 0;
399 gdbstub_proto("### GDB Tx Abandoned\n");
400 gdbstub_rx_unget = ch;
401 return 1;
402 } /* end gdbstub_send_packet() */
405 * While we find nice hex chars, build an int.
406 * Return number of chars processed.
408 static int hexToInt(char **ptr, unsigned long *_value)
410 int count = 0, ch;
412 *_value = 0;
413 while (**ptr) {
414 ch = hex(**ptr);
415 if (ch < 0)
416 break;
418 *_value = (*_value << 4) | ((uint8_t) ch & 0xf);
419 count++;
421 (*ptr)++;
424 return count;
427 /*****************************************************************************/
429 * probe an address to see whether it maps to anything
431 static inline int gdbstub_addr_probe(const void *vaddr)
433 #ifdef CONFIG_MMU
434 unsigned long paddr;
436 asm("lrad %1,%0,#1,#0,#0" : "=r"(paddr) : "r"(vaddr));
437 if (!(paddr & xAMPRx_V))
438 return 0;
439 #endif
441 return 1;
442 } /* end gdbstub_addr_probe() */
444 #ifdef CONFIG_MMU
445 static unsigned long __saved_dampr, __saved_damlr;
447 static inline unsigned long gdbstub_virt_to_pte(unsigned long vaddr)
449 pgd_t *pgd;
450 pud_t *pud;
451 pmd_t *pmd;
452 pte_t *pte;
453 unsigned long val, dampr5;
455 pgd = (pgd_t *) __get_DAMLR(3) + pgd_index(vaddr);
456 pud = pud_offset(pgd, vaddr);
457 pmd = pmd_offset(pud, vaddr);
459 if (pmd_bad(*pmd) || !pmd_present(*pmd))
460 return 0;
462 /* make sure dampr5 maps to the correct pmd */
463 dampr5 = __get_DAMPR(5);
464 val = pmd_val(*pmd);
465 __set_DAMPR(5, val | xAMPRx_L | xAMPRx_SS_16Kb | xAMPRx_S | xAMPRx_C | xAMPRx_V);
467 /* now its safe to access pmd */
468 pte = (pte_t *)__get_DAMLR(5) + __pte_index(vaddr);
469 if (pte_present(*pte))
470 val = pte_val(*pte);
471 else
472 val = 0;
474 /* restore original dampr5 */
475 __set_DAMPR(5, dampr5);
477 return val;
479 #endif
481 static inline int gdbstub_addr_map(const void *vaddr)
483 #ifdef CONFIG_MMU
484 unsigned long pte;
486 __saved_dampr = __get_DAMPR(2);
487 __saved_damlr = __get_DAMLR(2);
488 #endif
489 if (gdbstub_addr_probe(vaddr))
490 return 1;
491 #ifdef CONFIG_MMU
492 pte = gdbstub_virt_to_pte((unsigned long) vaddr);
493 if (pte) {
494 __set_DAMPR(2, pte);
495 __set_DAMLR(2, (unsigned long) vaddr & PAGE_MASK);
496 return 1;
498 #endif
499 return 0;
502 static inline void gdbstub_addr_unmap(void)
504 #ifdef CONFIG_MMU
505 __set_DAMPR(2, __saved_dampr);
506 __set_DAMLR(2, __saved_damlr);
507 #endif
511 * access potentially dodgy memory through a potentially dodgy pointer
513 static inline int gdbstub_read_dword(const void *addr, uint32_t *_res)
515 unsigned long brr;
516 uint32_t res;
518 if (!gdbstub_addr_map(addr))
519 return 0;
521 asm volatile(" movgs gr0,brr \n"
522 " ld%I2 %M2,%0 \n"
523 " movsg brr,%1 \n"
524 : "=r"(res), "=r"(brr)
525 : "m"(*(uint32_t *) addr));
526 *_res = res;
527 gdbstub_addr_unmap();
528 return likely(!brr);
531 static inline int gdbstub_write_dword(void *addr, uint32_t val)
533 unsigned long brr;
535 if (!gdbstub_addr_map(addr))
536 return 0;
538 asm volatile(" movgs gr0,brr \n"
539 " st%I2 %1,%M2 \n"
540 " movsg brr,%0 \n"
541 : "=r"(brr)
542 : "r"(val), "m"(*(uint32_t *) addr));
543 gdbstub_addr_unmap();
544 return likely(!brr);
547 static inline int gdbstub_read_word(const void *addr, uint16_t *_res)
549 unsigned long brr;
550 uint16_t res;
552 if (!gdbstub_addr_map(addr))
553 return 0;
555 asm volatile(" movgs gr0,brr \n"
556 " lduh%I2 %M2,%0 \n"
557 " movsg brr,%1 \n"
558 : "=r"(res), "=r"(brr)
559 : "m"(*(uint16_t *) addr));
560 *_res = res;
561 gdbstub_addr_unmap();
562 return likely(!brr);
565 static inline int gdbstub_write_word(void *addr, uint16_t val)
567 unsigned long brr;
569 if (!gdbstub_addr_map(addr))
570 return 0;
572 asm volatile(" movgs gr0,brr \n"
573 " sth%I2 %1,%M2 \n"
574 " movsg brr,%0 \n"
575 : "=r"(brr)
576 : "r"(val), "m"(*(uint16_t *) addr));
577 gdbstub_addr_unmap();
578 return likely(!brr);
581 static inline int gdbstub_read_byte(const void *addr, uint8_t *_res)
583 unsigned long brr;
584 uint8_t res;
586 if (!gdbstub_addr_map(addr))
587 return 0;
589 asm volatile(" movgs gr0,brr \n"
590 " ldub%I2 %M2,%0 \n"
591 " movsg brr,%1 \n"
592 : "=r"(res), "=r"(brr)
593 : "m"(*(uint8_t *) addr));
594 *_res = res;
595 gdbstub_addr_unmap();
596 return likely(!brr);
599 static inline int gdbstub_write_byte(void *addr, uint8_t val)
601 unsigned long brr;
603 if (!gdbstub_addr_map(addr))
604 return 0;
606 asm volatile(" movgs gr0,brr \n"
607 " stb%I2 %1,%M2 \n"
608 " movsg brr,%0 \n"
609 : "=r"(brr)
610 : "r"(val), "m"(*(uint8_t *) addr));
611 gdbstub_addr_unmap();
612 return likely(!brr);
615 static void __gdbstub_console_write(struct console *co, const char *p, unsigned n)
617 char outbuf[26];
618 int qty;
620 outbuf[0] = 'O';
622 while (n > 0) {
623 qty = 1;
625 while (n > 0 && qty < 20) {
626 mem2hex(p, outbuf + qty, 2, 0);
627 qty += 2;
628 if (*p == 0x0a) {
629 outbuf[qty++] = '0';
630 outbuf[qty++] = 'd';
632 p++;
633 n--;
636 outbuf[qty] = 0;
637 gdbstub_send_packet(outbuf);
641 #if 0
642 void debug_to_serial(const char *p, int n)
644 gdbstub_console_write(NULL,p,n);
646 #endif
648 #ifdef CONFIG_GDB_CONSOLE
650 static struct console gdbstub_console = {
651 .name = "gdb",
652 .write = gdbstub_console_write, /* in break.S */
653 .flags = CON_PRINTBUFFER,
654 .index = -1,
657 #endif
659 /*****************************************************************************/
661 * Convert the memory pointed to by mem into hex, placing result in buf.
662 * - if successful, return a pointer to the last char put in buf (NUL)
663 * - in case of mem fault, return NULL
664 * may_fault is non-zero if we are reading from arbitrary memory, but is currently
665 * not used.
667 static unsigned char *mem2hex(const void *_mem, char *buf, int count, int may_fault)
669 const uint8_t *mem = _mem;
670 uint8_t ch[4] __attribute__((aligned(4)));
672 if ((uint32_t)mem&1 && count>=1) {
673 if (!gdbstub_read_byte(mem,ch))
674 return NULL;
675 buf = hex_byte_pack(buf, ch[0]);
676 mem++;
677 count--;
680 if ((uint32_t)mem&3 && count>=2) {
681 if (!gdbstub_read_word(mem,(uint16_t *)ch))
682 return NULL;
683 buf = hex_byte_pack(buf, ch[0]);
684 buf = hex_byte_pack(buf, ch[1]);
685 mem += 2;
686 count -= 2;
689 while (count>=4) {
690 if (!gdbstub_read_dword(mem,(uint32_t *)ch))
691 return NULL;
692 buf = hex_byte_pack(buf, ch[0]);
693 buf = hex_byte_pack(buf, ch[1]);
694 buf = hex_byte_pack(buf, ch[2]);
695 buf = hex_byte_pack(buf, ch[3]);
696 mem += 4;
697 count -= 4;
700 if (count>=2) {
701 if (!gdbstub_read_word(mem,(uint16_t *)ch))
702 return NULL;
703 buf = hex_byte_pack(buf, ch[0]);
704 buf = hex_byte_pack(buf, ch[1]);
705 mem += 2;
706 count -= 2;
709 if (count>=1) {
710 if (!gdbstub_read_byte(mem,ch))
711 return NULL;
712 buf = hex_byte_pack(buf, ch[0]);
715 *buf = 0;
717 return buf;
718 } /* end mem2hex() */
720 /*****************************************************************************/
722 * convert the hex array pointed to by buf into binary to be placed in mem
723 * return a pointer to the character AFTER the last byte of buffer consumed
725 static char *hex2mem(const char *buf, void *_mem, int count)
727 uint8_t *mem = _mem;
728 union {
729 uint32_t l;
730 uint16_t w;
731 uint8_t b[4];
732 } ch;
734 if ((u32)mem&1 && count>=1) {
735 ch.b[0] = hex(*buf++) << 4;
736 ch.b[0] |= hex(*buf++);
737 if (!gdbstub_write_byte(mem,ch.b[0]))
738 return NULL;
739 mem++;
740 count--;
743 if ((u32)mem&3 && count>=2) {
744 ch.b[0] = hex(*buf++) << 4;
745 ch.b[0] |= hex(*buf++);
746 ch.b[1] = hex(*buf++) << 4;
747 ch.b[1] |= hex(*buf++);
748 if (!gdbstub_write_word(mem,ch.w))
749 return NULL;
750 mem += 2;
751 count -= 2;
754 while (count>=4) {
755 ch.b[0] = hex(*buf++) << 4;
756 ch.b[0] |= hex(*buf++);
757 ch.b[1] = hex(*buf++) << 4;
758 ch.b[1] |= hex(*buf++);
759 ch.b[2] = hex(*buf++) << 4;
760 ch.b[2] |= hex(*buf++);
761 ch.b[3] = hex(*buf++) << 4;
762 ch.b[3] |= hex(*buf++);
763 if (!gdbstub_write_dword(mem,ch.l))
764 return NULL;
765 mem += 4;
766 count -= 4;
769 if (count>=2) {
770 ch.b[0] = hex(*buf++) << 4;
771 ch.b[0] |= hex(*buf++);
772 ch.b[1] = hex(*buf++) << 4;
773 ch.b[1] |= hex(*buf++);
774 if (!gdbstub_write_word(mem,ch.w))
775 return NULL;
776 mem += 2;
777 count -= 2;
780 if (count>=1) {
781 ch.b[0] = hex(*buf++) << 4;
782 ch.b[0] |= hex(*buf++);
783 if (!gdbstub_write_byte(mem,ch.b[0]))
784 return NULL;
787 return (char *) buf;
788 } /* end hex2mem() */
790 /*****************************************************************************/
792 * This table contains the mapping between FRV TBR.TT exception codes,
793 * and signals, which are primarily what GDB understands. It also
794 * indicates which hardware traps we need to commandeer when
795 * initializing the stub.
797 static const struct brr_to_sig_map {
798 unsigned long brr_mask; /* BRR bitmask */
799 unsigned long tbr_tt; /* TBR.TT code (in BRR.EBTT) */
800 unsigned int signo; /* Signal that we map this into */
801 } brr_to_sig_map[] = {
802 { BRR_EB, TBR_TT_INSTR_ACC_ERROR, SIGSEGV },
803 { BRR_EB, TBR_TT_ILLEGAL_INSTR, SIGILL },
804 { BRR_EB, TBR_TT_PRIV_INSTR, SIGILL },
805 { BRR_EB, TBR_TT_MP_EXCEPTION, SIGFPE },
806 { BRR_EB, TBR_TT_DATA_ACC_ERROR, SIGSEGV },
807 { BRR_EB, TBR_TT_DATA_STR_ERROR, SIGSEGV },
808 { BRR_EB, TBR_TT_DIVISION_EXCEP, SIGFPE },
809 { BRR_EB, TBR_TT_COMPOUND_EXCEP, SIGSEGV },
810 { BRR_EB, TBR_TT_INTERRUPT_13, SIGALRM }, /* watchdog */
811 { BRR_EB, TBR_TT_INTERRUPT_14, SIGINT }, /* GDB serial */
812 { BRR_EB, TBR_TT_INTERRUPT_15, SIGQUIT }, /* NMI */
813 { BRR_CB, 0, SIGUSR1 },
814 { BRR_TB, 0, SIGUSR2 },
815 { BRR_DBNEx, 0, SIGTRAP },
816 { BRR_DBx, 0, SIGTRAP }, /* h/w watchpoint */
817 { BRR_IBx, 0, SIGTRAP }, /* h/w breakpoint */
818 { BRR_CBB, 0, SIGTRAP },
819 { BRR_SB, 0, SIGTRAP },
820 { BRR_ST, 0, SIGTRAP }, /* single step */
821 { 0, 0, SIGHUP } /* default */
824 /*****************************************************************************/
826 * convert the FRV BRR register contents into a UNIX signal number
828 static inline int gdbstub_compute_signal(unsigned long brr)
830 const struct brr_to_sig_map *map;
831 unsigned long tbr = (brr & BRR_EBTT) >> 12;
833 for (map = brr_to_sig_map; map->brr_mask; map++)
834 if (map->brr_mask & brr)
835 if (!map->tbr_tt || map->tbr_tt == tbr)
836 break;
838 return map->signo;
839 } /* end gdbstub_compute_signal() */
841 /*****************************************************************************/
843 * set a software breakpoint or a hardware breakpoint or watchpoint
845 static int gdbstub_set_breakpoint(unsigned long type, unsigned long addr, unsigned long len)
847 unsigned long tmp;
848 int bkpt, loop, xloop;
850 union {
851 struct {
852 unsigned long mask0, mask1;
854 uint8_t bytes[8];
855 } dbmr;
857 //gdbstub_printk("setbkpt(%ld,%08lx,%ld)\n", type, addr, len);
859 switch (type) {
860 /* set software breakpoint */
861 case 0:
862 if (addr & 3 || len > 7*4)
863 return -EINVAL;
865 for (bkpt = 255; bkpt >= 0; bkpt--)
866 if (!gdbstub_bkpts[bkpt].addr)
867 break;
868 if (bkpt < 0)
869 return -ENOSPC;
871 for (loop = 0; loop < len/4; loop++)
872 if (!gdbstub_read_dword(&((uint32_t *) addr)[loop],
873 &gdbstub_bkpts[bkpt].originsns[loop]))
874 return -EFAULT;
876 for (loop = 0; loop < len/4; loop++)
877 if (!gdbstub_write_dword(&((uint32_t *) addr)[loop],
878 BREAK_INSN)
880 /* need to undo the changes if possible */
881 for (xloop = 0; xloop < loop; xloop++)
882 gdbstub_write_dword(&((uint32_t *) addr)[xloop],
883 gdbstub_bkpts[bkpt].originsns[xloop]);
884 return -EFAULT;
887 gdbstub_bkpts[bkpt].addr = addr;
888 gdbstub_bkpts[bkpt].len = len;
890 #if 0
891 gdbstub_printk("Set BKPT[%02x]: %08lx #%d {%04x, %04x} -> { %04x, %04x }\n",
892 bkpt,
893 gdbstub_bkpts[bkpt].addr,
894 gdbstub_bkpts[bkpt].len,
895 gdbstub_bkpts[bkpt].originsns[0],
896 gdbstub_bkpts[bkpt].originsns[1],
897 ((uint32_t *) addr)[0],
898 ((uint32_t *) addr)[1]
900 #endif
901 return 0;
903 /* set hardware breakpoint */
904 case 1:
905 if (addr & 3 || len != 4)
906 return -EINVAL;
908 if (!(__debug_regs->dcr & DCR_IBE0)) {
909 //gdbstub_printk("set h/w break 0: %08lx\n", addr);
910 __debug_regs->dcr |= DCR_IBE0;
911 __debug_regs->ibar[0] = addr;
912 asm volatile("movgs %0,ibar0" : : "r"(addr));
913 return 0;
916 if (!(__debug_regs->dcr & DCR_IBE1)) {
917 //gdbstub_printk("set h/w break 1: %08lx\n", addr);
918 __debug_regs->dcr |= DCR_IBE1;
919 __debug_regs->ibar[1] = addr;
920 asm volatile("movgs %0,ibar1" : : "r"(addr));
921 return 0;
924 if (!(__debug_regs->dcr & DCR_IBE2)) {
925 //gdbstub_printk("set h/w break 2: %08lx\n", addr);
926 __debug_regs->dcr |= DCR_IBE2;
927 __debug_regs->ibar[2] = addr;
928 asm volatile("movgs %0,ibar2" : : "r"(addr));
929 return 0;
932 if (!(__debug_regs->dcr & DCR_IBE3)) {
933 //gdbstub_printk("set h/w break 3: %08lx\n", addr);
934 __debug_regs->dcr |= DCR_IBE3;
935 __debug_regs->ibar[3] = addr;
936 asm volatile("movgs %0,ibar3" : : "r"(addr));
937 return 0;
940 return -ENOSPC;
942 /* set data read/write/access watchpoint */
943 case 2:
944 case 3:
945 case 4:
946 if ((addr & ~7) != ((addr + len - 1) & ~7))
947 return -EINVAL;
949 tmp = addr & 7;
951 memset(dbmr.bytes, 0xff, sizeof(dbmr.bytes));
952 for (loop = 0; loop < len; loop++)
953 dbmr.bytes[tmp + loop] = 0;
955 addr &= ~7;
957 if (!(__debug_regs->dcr & (DCR_DRBE0|DCR_DWBE0))) {
958 //gdbstub_printk("set h/w watchpoint 0 type %ld: %08lx\n", type, addr);
959 tmp = type==2 ? DCR_DWBE0 : type==3 ? DCR_DRBE0 : DCR_DRBE0|DCR_DWBE0;
961 __debug_regs->dcr |= tmp;
962 __debug_regs->dbar[0] = addr;
963 __debug_regs->dbmr[0][0] = dbmr.mask0;
964 __debug_regs->dbmr[0][1] = dbmr.mask1;
965 __debug_regs->dbdr[0][0] = 0;
966 __debug_regs->dbdr[0][1] = 0;
968 asm volatile(" movgs %0,dbar0 \n"
969 " movgs %1,dbmr00 \n"
970 " movgs %2,dbmr01 \n"
971 " movgs gr0,dbdr00 \n"
972 " movgs gr0,dbdr01 \n"
973 : : "r"(addr), "r"(dbmr.mask0), "r"(dbmr.mask1));
974 return 0;
977 if (!(__debug_regs->dcr & (DCR_DRBE1|DCR_DWBE1))) {
978 //gdbstub_printk("set h/w watchpoint 1 type %ld: %08lx\n", type, addr);
979 tmp = type==2 ? DCR_DWBE1 : type==3 ? DCR_DRBE1 : DCR_DRBE1|DCR_DWBE1;
981 __debug_regs->dcr |= tmp;
982 __debug_regs->dbar[1] = addr;
983 __debug_regs->dbmr[1][0] = dbmr.mask0;
984 __debug_regs->dbmr[1][1] = dbmr.mask1;
985 __debug_regs->dbdr[1][0] = 0;
986 __debug_regs->dbdr[1][1] = 0;
988 asm volatile(" movgs %0,dbar1 \n"
989 " movgs %1,dbmr10 \n"
990 " movgs %2,dbmr11 \n"
991 " movgs gr0,dbdr10 \n"
992 " movgs gr0,dbdr11 \n"
993 : : "r"(addr), "r"(dbmr.mask0), "r"(dbmr.mask1));
994 return 0;
997 return -ENOSPC;
999 default:
1000 return -EINVAL;
1003 } /* end gdbstub_set_breakpoint() */
1005 /*****************************************************************************/
1007 * clear a breakpoint or watchpoint
1009 int gdbstub_clear_breakpoint(unsigned long type, unsigned long addr, unsigned long len)
1011 unsigned long tmp;
1012 int bkpt, loop;
1014 union {
1015 struct {
1016 unsigned long mask0, mask1;
1018 uint8_t bytes[8];
1019 } dbmr;
1021 //gdbstub_printk("clearbkpt(%ld,%08lx,%ld)\n", type, addr, len);
1023 switch (type) {
1024 /* clear software breakpoint */
1025 case 0:
1026 for (bkpt = 255; bkpt >= 0; bkpt--)
1027 if (gdbstub_bkpts[bkpt].addr == addr && gdbstub_bkpts[bkpt].len == len)
1028 break;
1029 if (bkpt < 0)
1030 return -ENOENT;
1032 gdbstub_bkpts[bkpt].addr = 0;
1034 for (loop = 0; loop < len/4; loop++)
1035 if (!gdbstub_write_dword(&((uint32_t *) addr)[loop],
1036 gdbstub_bkpts[bkpt].originsns[loop]))
1037 return -EFAULT;
1038 return 0;
1040 /* clear hardware breakpoint */
1041 case 1:
1042 if (addr & 3 || len != 4)
1043 return -EINVAL;
1045 #define __get_ibar(X) ({ unsigned long x; asm volatile("movsg ibar"#X",%0" : "=r"(x)); x; })
1047 if (__debug_regs->dcr & DCR_IBE0 && __get_ibar(0) == addr) {
1048 //gdbstub_printk("clear h/w break 0: %08lx\n", addr);
1049 __debug_regs->dcr &= ~DCR_IBE0;
1050 __debug_regs->ibar[0] = 0;
1051 asm volatile("movgs gr0,ibar0");
1052 return 0;
1055 if (__debug_regs->dcr & DCR_IBE1 && __get_ibar(1) == addr) {
1056 //gdbstub_printk("clear h/w break 1: %08lx\n", addr);
1057 __debug_regs->dcr &= ~DCR_IBE1;
1058 __debug_regs->ibar[1] = 0;
1059 asm volatile("movgs gr0,ibar1");
1060 return 0;
1063 if (__debug_regs->dcr & DCR_IBE2 && __get_ibar(2) == addr) {
1064 //gdbstub_printk("clear h/w break 2: %08lx\n", addr);
1065 __debug_regs->dcr &= ~DCR_IBE2;
1066 __debug_regs->ibar[2] = 0;
1067 asm volatile("movgs gr0,ibar2");
1068 return 0;
1071 if (__debug_regs->dcr & DCR_IBE3 && __get_ibar(3) == addr) {
1072 //gdbstub_printk("clear h/w break 3: %08lx\n", addr);
1073 __debug_regs->dcr &= ~DCR_IBE3;
1074 __debug_regs->ibar[3] = 0;
1075 asm volatile("movgs gr0,ibar3");
1076 return 0;
1079 return -EINVAL;
1081 /* clear data read/write/access watchpoint */
1082 case 2:
1083 case 3:
1084 case 4:
1085 if ((addr & ~7) != ((addr + len - 1) & ~7))
1086 return -EINVAL;
1088 tmp = addr & 7;
1090 memset(dbmr.bytes, 0xff, sizeof(dbmr.bytes));
1091 for (loop = 0; loop < len; loop++)
1092 dbmr.bytes[tmp + loop] = 0;
1094 addr &= ~7;
1096 #define __get_dbar(X) ({ unsigned long x; asm volatile("movsg dbar"#X",%0" : "=r"(x)); x; })
1097 #define __get_dbmr0(X) ({ unsigned long x; asm volatile("movsg dbmr"#X"0,%0" : "=r"(x)); x; })
1098 #define __get_dbmr1(X) ({ unsigned long x; asm volatile("movsg dbmr"#X"1,%0" : "=r"(x)); x; })
1100 /* consider DBAR 0 */
1101 tmp = type==2 ? DCR_DWBE0 : type==3 ? DCR_DRBE0 : DCR_DRBE0|DCR_DWBE0;
1103 if ((__debug_regs->dcr & (DCR_DRBE0|DCR_DWBE0)) != tmp ||
1104 __get_dbar(0) != addr ||
1105 __get_dbmr0(0) != dbmr.mask0 ||
1106 __get_dbmr1(0) != dbmr.mask1)
1107 goto skip_dbar0;
1109 //gdbstub_printk("clear h/w watchpoint 0 type %ld: %08lx\n", type, addr);
1110 __debug_regs->dcr &= ~(DCR_DRBE0|DCR_DWBE0);
1111 __debug_regs->dbar[0] = 0;
1112 __debug_regs->dbmr[0][0] = 0;
1113 __debug_regs->dbmr[0][1] = 0;
1114 __debug_regs->dbdr[0][0] = 0;
1115 __debug_regs->dbdr[0][1] = 0;
1117 asm volatile(" movgs gr0,dbar0 \n"
1118 " movgs gr0,dbmr00 \n"
1119 " movgs gr0,dbmr01 \n"
1120 " movgs gr0,dbdr00 \n"
1121 " movgs gr0,dbdr01 \n");
1122 return 0;
1124 skip_dbar0:
1125 /* consider DBAR 0 */
1126 tmp = type==2 ? DCR_DWBE1 : type==3 ? DCR_DRBE1 : DCR_DRBE1|DCR_DWBE1;
1128 if ((__debug_regs->dcr & (DCR_DRBE1|DCR_DWBE1)) != tmp ||
1129 __get_dbar(1) != addr ||
1130 __get_dbmr0(1) != dbmr.mask0 ||
1131 __get_dbmr1(1) != dbmr.mask1)
1132 goto skip_dbar1;
1134 //gdbstub_printk("clear h/w watchpoint 1 type %ld: %08lx\n", type, addr);
1135 __debug_regs->dcr &= ~(DCR_DRBE1|DCR_DWBE1);
1136 __debug_regs->dbar[1] = 0;
1137 __debug_regs->dbmr[1][0] = 0;
1138 __debug_regs->dbmr[1][1] = 0;
1139 __debug_regs->dbdr[1][0] = 0;
1140 __debug_regs->dbdr[1][1] = 0;
1142 asm volatile(" movgs gr0,dbar1 \n"
1143 " movgs gr0,dbmr10 \n"
1144 " movgs gr0,dbmr11 \n"
1145 " movgs gr0,dbdr10 \n"
1146 " movgs gr0,dbdr11 \n");
1147 return 0;
1149 skip_dbar1:
1150 return -ENOSPC;
1152 default:
1153 return -EINVAL;
1155 } /* end gdbstub_clear_breakpoint() */
1157 /*****************************************************************************/
1159 * check a for an internal software breakpoint, and wind the PC back if necessary
1161 static void gdbstub_check_breakpoint(void)
1163 unsigned long addr = __debug_frame->pc - 4;
1164 int bkpt;
1166 for (bkpt = 255; bkpt >= 0; bkpt--)
1167 if (gdbstub_bkpts[bkpt].addr == addr)
1168 break;
1169 if (bkpt >= 0)
1170 __debug_frame->pc = addr;
1172 //gdbstub_printk("alter pc [%d] %08lx\n", bkpt, __debug_frame->pc);
1174 } /* end gdbstub_check_breakpoint() */
1176 /*****************************************************************************/
1180 static void __maybe_unused gdbstub_show_regs(void)
1182 unsigned long *reg;
1183 int loop;
1185 gdbstub_printk("\n");
1187 gdbstub_printk("Frame: @%p [%s]\n",
1188 __debug_frame,
1189 __debug_frame->psr & PSR_S ? "kernel" : "user");
1191 reg = (unsigned long *) __debug_frame;
1192 for (loop = 0; loop < NR_PT_REGS; loop++) {
1193 printk("%s %08lx", regnames[loop + 0], reg[loop + 0]);
1195 if (loop == NR_PT_REGS - 1 || loop % 5 == 4)
1196 printk("\n");
1197 else
1198 printk(" | ");
1201 gdbstub_printk("Process %s (pid: %d)\n", current->comm, current->pid);
1202 } /* end gdbstub_show_regs() */
1204 /*****************************************************************************/
1206 * dump debugging regs
1208 static void __maybe_unused gdbstub_dump_debugregs(void)
1210 gdbstub_printk("DCR %08lx ", __debug_status.dcr);
1211 gdbstub_printk("BRR %08lx\n", __debug_status.brr);
1213 gdbstub_printk("IBAR0 %08lx ", __get_ibar(0));
1214 gdbstub_printk("IBAR1 %08lx ", __get_ibar(1));
1215 gdbstub_printk("IBAR2 %08lx ", __get_ibar(2));
1216 gdbstub_printk("IBAR3 %08lx\n", __get_ibar(3));
1218 gdbstub_printk("DBAR0 %08lx ", __get_dbar(0));
1219 gdbstub_printk("DBMR00 %08lx ", __get_dbmr0(0));
1220 gdbstub_printk("DBMR01 %08lx\n", __get_dbmr1(0));
1222 gdbstub_printk("DBAR1 %08lx ", __get_dbar(1));
1223 gdbstub_printk("DBMR10 %08lx ", __get_dbmr0(1));
1224 gdbstub_printk("DBMR11 %08lx\n", __get_dbmr1(1));
1226 gdbstub_printk("\n");
1227 } /* end gdbstub_dump_debugregs() */
1229 /*****************************************************************************/
1231 * dump the MMU state into a structure so that it can be accessed with GDB
1233 void gdbstub_get_mmu_state(void)
1235 asm volatile("movsg hsr0,%0" : "=r"(__debug_mmu.regs.hsr0));
1236 asm volatile("movsg pcsr,%0" : "=r"(__debug_mmu.regs.pcsr));
1237 asm volatile("movsg esr0,%0" : "=r"(__debug_mmu.regs.esr0));
1238 asm volatile("movsg ear0,%0" : "=r"(__debug_mmu.regs.ear0));
1239 asm volatile("movsg epcr0,%0" : "=r"(__debug_mmu.regs.epcr0));
1241 /* read the protection / SAT registers */
1242 __debug_mmu.iamr[0].L = __get_IAMLR(0);
1243 __debug_mmu.iamr[0].P = __get_IAMPR(0);
1244 __debug_mmu.iamr[1].L = __get_IAMLR(1);
1245 __debug_mmu.iamr[1].P = __get_IAMPR(1);
1246 __debug_mmu.iamr[2].L = __get_IAMLR(2);
1247 __debug_mmu.iamr[2].P = __get_IAMPR(2);
1248 __debug_mmu.iamr[3].L = __get_IAMLR(3);
1249 __debug_mmu.iamr[3].P = __get_IAMPR(3);
1250 __debug_mmu.iamr[4].L = __get_IAMLR(4);
1251 __debug_mmu.iamr[4].P = __get_IAMPR(4);
1252 __debug_mmu.iamr[5].L = __get_IAMLR(5);
1253 __debug_mmu.iamr[5].P = __get_IAMPR(5);
1254 __debug_mmu.iamr[6].L = __get_IAMLR(6);
1255 __debug_mmu.iamr[6].P = __get_IAMPR(6);
1256 __debug_mmu.iamr[7].L = __get_IAMLR(7);
1257 __debug_mmu.iamr[7].P = __get_IAMPR(7);
1258 __debug_mmu.iamr[8].L = __get_IAMLR(8);
1259 __debug_mmu.iamr[8].P = __get_IAMPR(8);
1260 __debug_mmu.iamr[9].L = __get_IAMLR(9);
1261 __debug_mmu.iamr[9].P = __get_IAMPR(9);
1262 __debug_mmu.iamr[10].L = __get_IAMLR(10);
1263 __debug_mmu.iamr[10].P = __get_IAMPR(10);
1264 __debug_mmu.iamr[11].L = __get_IAMLR(11);
1265 __debug_mmu.iamr[11].P = __get_IAMPR(11);
1266 __debug_mmu.iamr[12].L = __get_IAMLR(12);
1267 __debug_mmu.iamr[12].P = __get_IAMPR(12);
1268 __debug_mmu.iamr[13].L = __get_IAMLR(13);
1269 __debug_mmu.iamr[13].P = __get_IAMPR(13);
1270 __debug_mmu.iamr[14].L = __get_IAMLR(14);
1271 __debug_mmu.iamr[14].P = __get_IAMPR(14);
1272 __debug_mmu.iamr[15].L = __get_IAMLR(15);
1273 __debug_mmu.iamr[15].P = __get_IAMPR(15);
1275 __debug_mmu.damr[0].L = __get_DAMLR(0);
1276 __debug_mmu.damr[0].P = __get_DAMPR(0);
1277 __debug_mmu.damr[1].L = __get_DAMLR(1);
1278 __debug_mmu.damr[1].P = __get_DAMPR(1);
1279 __debug_mmu.damr[2].L = __get_DAMLR(2);
1280 __debug_mmu.damr[2].P = __get_DAMPR(2);
1281 __debug_mmu.damr[3].L = __get_DAMLR(3);
1282 __debug_mmu.damr[3].P = __get_DAMPR(3);
1283 __debug_mmu.damr[4].L = __get_DAMLR(4);
1284 __debug_mmu.damr[4].P = __get_DAMPR(4);
1285 __debug_mmu.damr[5].L = __get_DAMLR(5);
1286 __debug_mmu.damr[5].P = __get_DAMPR(5);
1287 __debug_mmu.damr[6].L = __get_DAMLR(6);
1288 __debug_mmu.damr[6].P = __get_DAMPR(6);
1289 __debug_mmu.damr[7].L = __get_DAMLR(7);
1290 __debug_mmu.damr[7].P = __get_DAMPR(7);
1291 __debug_mmu.damr[8].L = __get_DAMLR(8);
1292 __debug_mmu.damr[8].P = __get_DAMPR(8);
1293 __debug_mmu.damr[9].L = __get_DAMLR(9);
1294 __debug_mmu.damr[9].P = __get_DAMPR(9);
1295 __debug_mmu.damr[10].L = __get_DAMLR(10);
1296 __debug_mmu.damr[10].P = __get_DAMPR(10);
1297 __debug_mmu.damr[11].L = __get_DAMLR(11);
1298 __debug_mmu.damr[11].P = __get_DAMPR(11);
1299 __debug_mmu.damr[12].L = __get_DAMLR(12);
1300 __debug_mmu.damr[12].P = __get_DAMPR(12);
1301 __debug_mmu.damr[13].L = __get_DAMLR(13);
1302 __debug_mmu.damr[13].P = __get_DAMPR(13);
1303 __debug_mmu.damr[14].L = __get_DAMLR(14);
1304 __debug_mmu.damr[14].P = __get_DAMPR(14);
1305 __debug_mmu.damr[15].L = __get_DAMLR(15);
1306 __debug_mmu.damr[15].P = __get_DAMPR(15);
1308 #ifdef CONFIG_MMU
1309 do {
1310 /* read the DAT entries from the TLB */
1311 struct __debug_amr *p;
1312 int loop;
1314 asm volatile("movsg tplr,%0" : "=r"(__debug_mmu.regs.tplr));
1315 asm volatile("movsg tppr,%0" : "=r"(__debug_mmu.regs.tppr));
1316 asm volatile("movsg tpxr,%0" : "=r"(__debug_mmu.regs.tpxr));
1317 asm volatile("movsg cxnr,%0" : "=r"(__debug_mmu.regs.cxnr));
1319 p = __debug_mmu.tlb;
1321 /* way 0 */
1322 asm volatile("movgs %0,tpxr" :: "r"(0 << TPXR_WAY_SHIFT));
1323 for (loop = 0; loop < 64; loop++) {
1324 asm volatile("tlbpr %0,gr0,#1,#0" :: "r"(loop << PAGE_SHIFT));
1325 asm volatile("movsg tplr,%0" : "=r"(p->L));
1326 asm volatile("movsg tppr,%0" : "=r"(p->P));
1327 p++;
1330 /* way 1 */
1331 asm volatile("movgs %0,tpxr" :: "r"(1 << TPXR_WAY_SHIFT));
1332 for (loop = 0; loop < 64; loop++) {
1333 asm volatile("tlbpr %0,gr0,#1,#0" :: "r"(loop << PAGE_SHIFT));
1334 asm volatile("movsg tplr,%0" : "=r"(p->L));
1335 asm volatile("movsg tppr,%0" : "=r"(p->P));
1336 p++;
1339 asm volatile("movgs %0,tplr" :: "r"(__debug_mmu.regs.tplr));
1340 asm volatile("movgs %0,tppr" :: "r"(__debug_mmu.regs.tppr));
1341 asm volatile("movgs %0,tpxr" :: "r"(__debug_mmu.regs.tpxr));
1342 } while(0);
1343 #endif
1345 } /* end gdbstub_get_mmu_state() */
1348 * handle general query commands of the form 'qXXXXX'
1350 static void gdbstub_handle_query(void)
1352 if (strcmp(input_buffer, "qAttached") == 0) {
1353 /* return current thread ID */
1354 sprintf(output_buffer, "1");
1355 return;
1358 if (strcmp(input_buffer, "qC") == 0) {
1359 /* return current thread ID */
1360 sprintf(output_buffer, "QC 0");
1361 return;
1364 if (strcmp(input_buffer, "qOffsets") == 0) {
1365 /* return relocation offset of text and data segments */
1366 sprintf(output_buffer, "Text=0;Data=0;Bss=0");
1367 return;
1370 if (strcmp(input_buffer, "qSymbol::") == 0) {
1371 sprintf(output_buffer, "OK");
1372 return;
1375 if (strcmp(input_buffer, "qSupported") == 0) {
1376 /* query of supported features */
1377 sprintf(output_buffer, "PacketSize=%u;ReverseContinue-;ReverseStep-",
1378 sizeof(input_buffer));
1379 return;
1382 gdbstub_strcpy(output_buffer,"E01");
1385 /*****************************************************************************/
1387 * handle event interception and GDB remote protocol processing
1388 * - on entry:
1389 * PSR.ET==0, PSR.S==1 and the CPU is in debug mode
1390 * __debug_frame points to the saved registers
1391 * __frame points to the kernel mode exception frame, if it was in kernel
1392 * mode when the break happened
1394 void gdbstub(int sigval)
1396 unsigned long addr, length, loop, dbar, temp, temp2, temp3;
1397 uint32_t zero;
1398 char *ptr;
1399 int flush_cache = 0;
1401 LEDS(0x5000);
1403 if (sigval < 0) {
1404 #ifndef CONFIG_GDBSTUB_IMMEDIATE
1405 /* return immediately if GDB immediate activation option not set */
1406 return;
1407 #else
1408 sigval = SIGINT;
1409 #endif
1412 save_user_regs(&__debug_frame0->uc);
1414 #if 0
1415 gdbstub_printk("--> gdbstub() %08x %p %08x %08x\n",
1416 __debug_frame->pc,
1417 __debug_frame,
1418 __debug_regs->brr,
1419 __debug_regs->bpsr);
1420 // gdbstub_show_regs();
1421 #endif
1423 LEDS(0x5001);
1425 /* if we were interrupted by input on the serial gdbstub serial port,
1426 * restore the context prior to the interrupt so that we return to that
1427 * directly
1429 temp = (unsigned long) __entry_kerneltrap_table;
1430 temp2 = (unsigned long) __entry_usertrap_table;
1431 temp3 = __debug_frame->pc & ~15;
1433 if (temp3 == temp + TBR_TT_INTERRUPT_15 ||
1434 temp3 == temp2 + TBR_TT_INTERRUPT_15
1436 asm volatile("movsg pcsr,%0" : "=r"(__debug_frame->pc));
1437 __debug_frame->psr |= PSR_ET;
1438 __debug_frame->psr &= ~PSR_S;
1439 if (__debug_frame->psr & PSR_PS)
1440 __debug_frame->psr |= PSR_S;
1441 __debug_status.brr = (__debug_frame->tbr & TBR_TT) << 12;
1442 __debug_status.brr |= BRR_EB;
1443 sigval = SIGINT;
1446 /* handle the decrement timer going off (FR451 only) */
1447 if (temp3 == temp + TBR_TT_DECREMENT_TIMER ||
1448 temp3 == temp2 + TBR_TT_DECREMENT_TIMER
1450 asm volatile("movgs %0,timerd" :: "r"(10000000));
1451 asm volatile("movsg pcsr,%0" : "=r"(__debug_frame->pc));
1452 __debug_frame->psr |= PSR_ET;
1453 __debug_frame->psr &= ~PSR_S;
1454 if (__debug_frame->psr & PSR_PS)
1455 __debug_frame->psr |= PSR_S;
1456 __debug_status.brr = (__debug_frame->tbr & TBR_TT) << 12;
1457 __debug_status.brr |= BRR_EB;
1458 sigval = SIGXCPU;
1461 LEDS(0x5002);
1463 /* after a BREAK insn, the PC lands on the far side of it */
1464 if (__debug_status.brr & BRR_SB)
1465 gdbstub_check_breakpoint();
1467 LEDS(0x5003);
1469 /* handle attempts to write console data via GDB "O" commands */
1470 if (__debug_frame->pc == (unsigned long) gdbstub_console_write + 4) {
1471 __gdbstub_console_write((struct console *) __debug_frame->gr8,
1472 (const char *) __debug_frame->gr9,
1473 (unsigned) __debug_frame->gr10);
1474 goto done;
1477 if (gdbstub_rx_unget) {
1478 sigval = SIGINT;
1479 goto packet_waiting;
1482 if (!sigval)
1483 sigval = gdbstub_compute_signal(__debug_status.brr);
1485 LEDS(0x5004);
1487 /* send a message to the debugger's user saying what happened if it may
1488 * not be clear cut (we can't map exceptions onto signals properly)
1490 if (sigval != SIGINT && sigval != SIGTRAP && sigval != SIGILL) {
1491 static const char title[] = "Break ";
1492 static const char crlf[] = "\r\n";
1493 unsigned long brr = __debug_status.brr;
1494 char hx;
1496 ptr = output_buffer;
1497 *ptr++ = 'O';
1498 ptr = mem2hex(title, ptr, sizeof(title) - 1,0);
1500 hx = hex_asc_hi(brr >> 24);
1501 ptr = hex_byte_pack(ptr, hx);
1502 hx = hex_asc_lo(brr >> 24);
1503 ptr = hex_byte_pack(ptr, hx);
1504 hx = hex_asc_hi(brr >> 16);
1505 ptr = hex_byte_pack(ptr, hx);
1506 hx = hex_asc_lo(brr >> 16);
1507 ptr = hex_byte_pack(ptr, hx);
1508 hx = hex_asc_hi(brr >> 8);
1509 ptr = hex_byte_pack(ptr, hx);
1510 hx = hex_asc_lo(brr >> 8);
1511 ptr = hex_byte_pack(ptr, hx);
1512 hx = hex_asc_hi(brr);
1513 ptr = hex_byte_pack(ptr, hx);
1514 hx = hex_asc_lo(brr);
1515 ptr = hex_byte_pack(ptr, hx);
1517 ptr = mem2hex(crlf, ptr, sizeof(crlf) - 1, 0);
1518 *ptr = 0;
1519 gdbstub_send_packet(output_buffer); /* send it off... */
1522 LEDS(0x5005);
1524 /* tell the debugger that an exception has occurred */
1525 ptr = output_buffer;
1527 /* Send trap type (converted to signal) */
1528 *ptr++ = 'T';
1529 ptr = hex_byte_pack(ptr, sigval);
1531 /* Send Error PC */
1532 ptr = hex_byte_pack(ptr, GDB_REG_PC);
1533 *ptr++ = ':';
1534 ptr = mem2hex(&__debug_frame->pc, ptr, 4, 0);
1535 *ptr++ = ';';
1538 * Send frame pointer
1540 ptr = hex_byte_pack(ptr, GDB_REG_FP);
1541 *ptr++ = ':';
1542 ptr = mem2hex(&__debug_frame->fp, ptr, 4, 0);
1543 *ptr++ = ';';
1546 * Send stack pointer
1548 ptr = hex_byte_pack(ptr, GDB_REG_SP);
1549 *ptr++ = ':';
1550 ptr = mem2hex(&__debug_frame->sp, ptr, 4, 0);
1551 *ptr++ = ';';
1553 *ptr++ = 0;
1554 gdbstub_send_packet(output_buffer); /* send it off... */
1556 LEDS(0x5006);
1558 packet_waiting:
1559 gdbstub_get_mmu_state();
1561 /* wait for input from remote GDB */
1562 while (1) {
1563 output_buffer[0] = 0;
1565 LEDS(0x5007);
1566 gdbstub_recv_packet(input_buffer);
1567 LEDS(0x5600 | input_buffer[0]);
1569 switch (input_buffer[0]) {
1570 /* request repeat of last signal number */
1571 case '?':
1572 output_buffer[0] = 'S';
1573 output_buffer[1] = hex_asc_hi(sigval);
1574 output_buffer[2] = hex_asc_lo(sigval);
1575 output_buffer[3] = 0;
1576 break;
1578 case 'd':
1579 /* toggle debug flag */
1580 break;
1582 /* return the value of the CPU registers
1583 * - GR0, GR1, GR2, GR3, GR4, GR5, GR6, GR7,
1584 * - GR8, GR9, GR10, GR11, GR12, GR13, GR14, GR15,
1585 * - GR16, GR17, GR18, GR19, GR20, GR21, GR22, GR23,
1586 * - GR24, GR25, GR26, GR27, GR28, GR29, GR30, GR31,
1587 * - GR32, GR33, GR34, GR35, GR36, GR37, GR38, GR39,
1588 * - GR40, GR41, GR42, GR43, GR44, GR45, GR46, GR47,
1589 * - GR48, GR49, GR50, GR51, GR52, GR53, GR54, GR55,
1590 * - GR56, GR57, GR58, GR59, GR60, GR61, GR62, GR63,
1591 * - FP0, FP1, FP2, FP3, FP4, FP5, FP6, FP7,
1592 * - FP8, FP9, FP10, FP11, FP12, FP13, FP14, FP15,
1593 * - FP16, FP17, FP18, FP19, FP20, FP21, FP22, FP23,
1594 * - FP24, FP25, FP26, FP27, FP28, FP29, FP30, FP31,
1595 * - FP32, FP33, FP34, FP35, FP36, FP37, FP38, FP39,
1596 * - FP40, FP41, FP42, FP43, FP44, FP45, FP46, FP47,
1597 * - FP48, FP49, FP50, FP51, FP52, FP53, FP54, FP55,
1598 * - FP56, FP57, FP58, FP59, FP60, FP61, FP62, FP63,
1599 * - PC, PSR, CCR, CCCR,
1600 * - _X132, _X133, _X134
1601 * - TBR, BRR, DBAR0, DBAR1, DBAR2, DBAR3,
1602 * - _X141, _X142, _X143, _X144,
1603 * - LR, LCR
1605 case 'g':
1606 zero = 0;
1607 ptr = output_buffer;
1609 /* deal with GR0, GR1-GR27, GR28-GR31, GR32-GR63 */
1610 ptr = mem2hex(&zero, ptr, 4, 0);
1612 for (loop = 1; loop <= 27; loop++)
1613 ptr = mem2hex(&__debug_user_context->i.gr[loop], ptr, 4, 0);
1614 temp = (unsigned long) __frame;
1615 ptr = mem2hex(&temp, ptr, 4, 0);
1616 ptr = mem2hex(&__debug_user_context->i.gr[29], ptr, 4, 0);
1617 ptr = mem2hex(&__debug_user_context->i.gr[30], ptr, 4, 0);
1618 #ifdef CONFIG_MMU
1619 ptr = mem2hex(&__debug_user_context->i.gr[31], ptr, 4, 0);
1620 #else
1621 temp = (unsigned long) __debug_frame;
1622 ptr = mem2hex(&temp, ptr, 4, 0);
1623 #endif
1625 for (loop = 32; loop <= 63; loop++)
1626 ptr = mem2hex(&__debug_user_context->i.gr[loop], ptr, 4, 0);
1628 /* deal with FR0-FR63 */
1629 for (loop = 0; loop <= 63; loop++)
1630 ptr = mem2hex(&__debug_user_context->f.fr[loop], ptr, 4, 0);
1632 /* deal with special registers */
1633 ptr = mem2hex(&__debug_frame->pc, ptr, 4, 0);
1634 ptr = mem2hex(&__debug_frame->psr, ptr, 4, 0);
1635 ptr = mem2hex(&__debug_frame->ccr, ptr, 4, 0);
1636 ptr = mem2hex(&__debug_frame->cccr, ptr, 4, 0);
1637 ptr = mem2hex(&zero, ptr, 4, 0);
1638 ptr = mem2hex(&zero, ptr, 4, 0);
1639 ptr = mem2hex(&zero, ptr, 4, 0);
1640 ptr = mem2hex(&__debug_frame->tbr, ptr, 4, 0);
1641 ptr = mem2hex(&__debug_status.brr , ptr, 4, 0);
1643 asm volatile("movsg dbar0,%0" : "=r"(dbar));
1644 ptr = mem2hex(&dbar, ptr, 4, 0);
1645 asm volatile("movsg dbar1,%0" : "=r"(dbar));
1646 ptr = mem2hex(&dbar, ptr, 4, 0);
1647 asm volatile("movsg dbar2,%0" : "=r"(dbar));
1648 ptr = mem2hex(&dbar, ptr, 4, 0);
1649 asm volatile("movsg dbar3,%0" : "=r"(dbar));
1650 ptr = mem2hex(&dbar, ptr, 4, 0);
1652 asm volatile("movsg scr0,%0" : "=r"(dbar));
1653 ptr = mem2hex(&dbar, ptr, 4, 0);
1654 asm volatile("movsg scr1,%0" : "=r"(dbar));
1655 ptr = mem2hex(&dbar, ptr, 4, 0);
1656 asm volatile("movsg scr2,%0" : "=r"(dbar));
1657 ptr = mem2hex(&dbar, ptr, 4, 0);
1658 asm volatile("movsg scr3,%0" : "=r"(dbar));
1659 ptr = mem2hex(&dbar, ptr, 4, 0);
1661 ptr = mem2hex(&__debug_frame->lr, ptr, 4, 0);
1662 ptr = mem2hex(&__debug_frame->lcr, ptr, 4, 0);
1664 ptr = mem2hex(&__debug_frame->iacc0, ptr, 8, 0);
1666 ptr = mem2hex(&__debug_user_context->f.fsr[0], ptr, 4, 0);
1668 for (loop = 0; loop <= 7; loop++)
1669 ptr = mem2hex(&__debug_user_context->f.acc[loop], ptr, 4, 0);
1671 ptr = mem2hex(&__debug_user_context->f.accg, ptr, 8, 0);
1673 for (loop = 0; loop <= 1; loop++)
1674 ptr = mem2hex(&__debug_user_context->f.msr[loop], ptr, 4, 0);
1676 ptr = mem2hex(&__debug_frame->gner0, ptr, 4, 0);
1677 ptr = mem2hex(&__debug_frame->gner1, ptr, 4, 0);
1679 ptr = mem2hex(&__debug_user_context->f.fner[0], ptr, 4, 0);
1680 ptr = mem2hex(&__debug_user_context->f.fner[1], ptr, 4, 0);
1682 break;
1684 /* set the values of the CPU registers */
1685 case 'G':
1686 ptr = &input_buffer[1];
1688 /* deal with GR0, GR1-GR27, GR28-GR31, GR32-GR63 */
1689 ptr = hex2mem(ptr, &temp, 4);
1691 for (loop = 1; loop <= 27; loop++)
1692 ptr = hex2mem(ptr, &__debug_user_context->i.gr[loop], 4);
1694 ptr = hex2mem(ptr, &temp, 4);
1695 __frame = (struct pt_regs *) temp;
1696 ptr = hex2mem(ptr, &__debug_frame->gr29, 4);
1697 ptr = hex2mem(ptr, &__debug_frame->gr30, 4);
1698 #ifdef CONFIG_MMU
1699 ptr = hex2mem(ptr, &__debug_frame->gr31, 4);
1700 #else
1701 ptr = hex2mem(ptr, &temp, 4);
1702 #endif
1704 for (loop = 32; loop <= 63; loop++)
1705 ptr = hex2mem(ptr, &__debug_user_context->i.gr[loop], 4);
1707 /* deal with FR0-FR63 */
1708 for (loop = 0; loop <= 63; loop++)
1709 ptr = mem2hex(&__debug_user_context->f.fr[loop], ptr, 4, 0);
1711 /* deal with special registers */
1712 ptr = hex2mem(ptr, &__debug_frame->pc, 4);
1713 ptr = hex2mem(ptr, &__debug_frame->psr, 4);
1714 ptr = hex2mem(ptr, &__debug_frame->ccr, 4);
1715 ptr = hex2mem(ptr, &__debug_frame->cccr,4);
1717 for (loop = 132; loop <= 140; loop++)
1718 ptr = hex2mem(ptr, &temp, 4);
1720 ptr = hex2mem(ptr, &temp, 4);
1721 asm volatile("movgs %0,scr0" :: "r"(temp));
1722 ptr = hex2mem(ptr, &temp, 4);
1723 asm volatile("movgs %0,scr1" :: "r"(temp));
1724 ptr = hex2mem(ptr, &temp, 4);
1725 asm volatile("movgs %0,scr2" :: "r"(temp));
1726 ptr = hex2mem(ptr, &temp, 4);
1727 asm volatile("movgs %0,scr3" :: "r"(temp));
1729 ptr = hex2mem(ptr, &__debug_frame->lr, 4);
1730 ptr = hex2mem(ptr, &__debug_frame->lcr, 4);
1732 ptr = hex2mem(ptr, &__debug_frame->iacc0, 8);
1734 ptr = hex2mem(ptr, &__debug_user_context->f.fsr[0], 4);
1736 for (loop = 0; loop <= 7; loop++)
1737 ptr = hex2mem(ptr, &__debug_user_context->f.acc[loop], 4);
1739 ptr = hex2mem(ptr, &__debug_user_context->f.accg, 8);
1741 for (loop = 0; loop <= 1; loop++)
1742 ptr = hex2mem(ptr, &__debug_user_context->f.msr[loop], 4);
1744 ptr = hex2mem(ptr, &__debug_frame->gner0, 4);
1745 ptr = hex2mem(ptr, &__debug_frame->gner1, 4);
1747 ptr = hex2mem(ptr, &__debug_user_context->f.fner[0], 4);
1748 ptr = hex2mem(ptr, &__debug_user_context->f.fner[1], 4);
1750 gdbstub_strcpy(output_buffer,"OK");
1751 break;
1753 /* mAA..AA,LLLL Read LLLL bytes at address AA..AA */
1754 case 'm':
1755 ptr = &input_buffer[1];
1757 if (hexToInt(&ptr, &addr) &&
1758 *ptr++ == ',' &&
1759 hexToInt(&ptr, &length)
1761 if (mem2hex((char *)addr, output_buffer, length, 1))
1762 break;
1763 gdbstub_strcpy (output_buffer, "E03");
1765 else {
1766 gdbstub_strcpy(output_buffer,"E01");
1768 break;
1770 /* MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK */
1771 case 'M':
1772 ptr = &input_buffer[1];
1774 if (hexToInt(&ptr, &addr) &&
1775 *ptr++ == ',' &&
1776 hexToInt(&ptr, &length) &&
1777 *ptr++ == ':'
1779 if (hex2mem(ptr, (char *)addr, length)) {
1780 gdbstub_strcpy(output_buffer, "OK");
1782 else {
1783 gdbstub_strcpy(output_buffer, "E03");
1786 else
1787 gdbstub_strcpy(output_buffer, "E02");
1789 flush_cache = 1;
1790 break;
1792 /* pNN: Read value of reg N and return it */
1793 case 'p':
1794 /* return no value, indicating that we don't support
1795 * this command and that gdb should use 'g' instead */
1796 break;
1798 /* PNN,=RRRRRRRR: Write value R to reg N return OK */
1799 case 'P':
1800 ptr = &input_buffer[1];
1802 if (!hexToInt(&ptr, &addr) ||
1803 *ptr++ != '=' ||
1804 !hexToInt(&ptr, &temp)
1806 gdbstub_strcpy(output_buffer, "E01");
1807 break;
1810 temp2 = 1;
1811 switch (addr) {
1812 case GDB_REG_GR(0):
1813 break;
1814 case GDB_REG_GR(1) ... GDB_REG_GR(63):
1815 __debug_user_context->i.gr[addr - GDB_REG_GR(0)] = temp;
1816 break;
1817 case GDB_REG_FR(0) ... GDB_REG_FR(63):
1818 __debug_user_context->f.fr[addr - GDB_REG_FR(0)] = temp;
1819 break;
1820 case GDB_REG_PC:
1821 __debug_user_context->i.pc = temp;
1822 break;
1823 case GDB_REG_PSR:
1824 __debug_user_context->i.psr = temp;
1825 break;
1826 case GDB_REG_CCR:
1827 __debug_user_context->i.ccr = temp;
1828 break;
1829 case GDB_REG_CCCR:
1830 __debug_user_context->i.cccr = temp;
1831 break;
1832 case GDB_REG_BRR:
1833 __debug_status.brr = temp;
1834 break;
1835 case GDB_REG_LR:
1836 __debug_user_context->i.lr = temp;
1837 break;
1838 case GDB_REG_LCR:
1839 __debug_user_context->i.lcr = temp;
1840 break;
1841 case GDB_REG_FSR0:
1842 __debug_user_context->f.fsr[0] = temp;
1843 break;
1844 case GDB_REG_ACC(0) ... GDB_REG_ACC(7):
1845 __debug_user_context->f.acc[addr - GDB_REG_ACC(0)] = temp;
1846 break;
1847 case GDB_REG_ACCG(0):
1848 *(uint32_t *) &__debug_user_context->f.accg[0] = temp;
1849 break;
1850 case GDB_REG_ACCG(4):
1851 *(uint32_t *) &__debug_user_context->f.accg[4] = temp;
1852 break;
1853 case GDB_REG_MSR(0) ... GDB_REG_MSR(1):
1854 __debug_user_context->f.msr[addr - GDB_REG_MSR(0)] = temp;
1855 break;
1856 case GDB_REG_GNER(0) ... GDB_REG_GNER(1):
1857 __debug_user_context->i.gner[addr - GDB_REG_GNER(0)] = temp;
1858 break;
1859 case GDB_REG_FNER(0) ... GDB_REG_FNER(1):
1860 __debug_user_context->f.fner[addr - GDB_REG_FNER(0)] = temp;
1861 break;
1862 default:
1863 temp2 = 0;
1864 break;
1867 if (temp2) {
1868 gdbstub_strcpy(output_buffer, "OK");
1870 else {
1871 gdbstub_strcpy(output_buffer, "E02");
1873 break;
1875 /* cAA..AA Continue at address AA..AA(optional) */
1876 case 'c':
1877 /* try to read optional parameter, pc unchanged if no parm */
1878 ptr = &input_buffer[1];
1879 if (hexToInt(&ptr, &addr))
1880 __debug_frame->pc = addr;
1881 goto done;
1883 /* kill the program */
1884 case 'k' :
1885 goto done; /* just continue */
1887 /* detach */
1888 case 'D':
1889 gdbstub_strcpy(output_buffer, "OK");
1890 break;
1892 /* reset the whole machine (FIXME: system dependent) */
1893 case 'r':
1894 break;
1897 /* step to next instruction */
1898 case 's':
1899 __debug_regs->dcr |= DCR_SE;
1900 __debug_status.dcr |= DCR_SE;
1901 goto done;
1903 /* extended command */
1904 case 'v':
1905 if (strcmp(input_buffer, "vCont?") == 0) {
1906 output_buffer[0] = 0;
1907 break;
1909 goto unsupported_cmd;
1911 /* set baud rate (bBB) */
1912 case 'b':
1913 ptr = &input_buffer[1];
1914 if (!hexToInt(&ptr, &temp)) {
1915 gdbstub_strcpy(output_buffer,"B01");
1916 break;
1919 if (temp) {
1920 /* ack before changing speed */
1921 gdbstub_send_packet("OK");
1922 gdbstub_set_baud(temp);
1924 break;
1926 /* set breakpoint */
1927 case 'Z':
1928 ptr = &input_buffer[1];
1930 if (!hexToInt(&ptr,&temp) || *ptr++ != ',' ||
1931 !hexToInt(&ptr,&addr) || *ptr++ != ',' ||
1932 !hexToInt(&ptr,&length)
1934 gdbstub_strcpy(output_buffer,"E01");
1935 break;
1938 if (temp >= 5) {
1939 gdbstub_strcpy(output_buffer,"E03");
1940 break;
1943 if (gdbstub_set_breakpoint(temp, addr, length) < 0) {
1944 gdbstub_strcpy(output_buffer,"E03");
1945 break;
1948 if (temp == 0)
1949 flush_cache = 1; /* soft bkpt by modified memory */
1951 gdbstub_strcpy(output_buffer,"OK");
1952 break;
1954 /* clear breakpoint */
1955 case 'z':
1956 ptr = &input_buffer[1];
1958 if (!hexToInt(&ptr,&temp) || *ptr++ != ',' ||
1959 !hexToInt(&ptr,&addr) || *ptr++ != ',' ||
1960 !hexToInt(&ptr,&length)
1962 gdbstub_strcpy(output_buffer,"E01");
1963 break;
1966 if (temp >= 5) {
1967 gdbstub_strcpy(output_buffer,"E03");
1968 break;
1971 if (gdbstub_clear_breakpoint(temp, addr, length) < 0) {
1972 gdbstub_strcpy(output_buffer,"E03");
1973 break;
1976 if (temp == 0)
1977 flush_cache = 1; /* soft bkpt by modified memory */
1979 gdbstub_strcpy(output_buffer,"OK");
1980 break;
1982 /* Thread-setting packet */
1983 case 'H':
1984 gdbstub_strcpy(output_buffer, "OK");
1985 break;
1987 case 'q':
1988 gdbstub_handle_query();
1989 break;
1991 default:
1992 unsupported_cmd:
1993 gdbstub_proto("### GDB Unsupported Cmd '%s'\n",input_buffer);
1994 gdbstub_strcpy(output_buffer,"E01");
1995 break;
1998 /* reply to the request */
1999 LEDS(0x5009);
2000 gdbstub_send_packet(output_buffer);
2003 done:
2004 restore_user_regs(&__debug_frame0->uc);
2006 //gdbstub_dump_debugregs();
2007 //gdbstub_printk("<-- gdbstub() %08x\n", __debug_frame->pc);
2009 /* need to flush the instruction cache before resuming, as we may have
2010 * deposited a breakpoint, and the icache probably has no way of
2011 * knowing that a data ref to some location may have changed something
2012 * that is in the instruction cache. NB: We flush both caches, just to
2013 * be sure...
2016 /* note: flushing the icache will clobber EAR0 on the FR451 */
2017 if (flush_cache)
2018 gdbstub_purge_cache();
2020 LEDS(0x5666);
2022 } /* end gdbstub() */
2024 /*****************************************************************************/
2026 * initialise the GDB stub
2028 void __init gdbstub_init(void)
2030 #ifdef CONFIG_GDBSTUB_IMMEDIATE
2031 unsigned char ch;
2032 int ret;
2033 #endif
2035 gdbstub_printk("%s", gdbstub_banner);
2037 gdbstub_io_init();
2039 /* try to talk to GDB (or anyone insane enough to want to type GDB protocol by hand) */
2040 gdbstub_proto("### GDB Tx ACK\n");
2041 gdbstub_tx_char('+'); /* 'hello world' */
2043 #ifdef CONFIG_GDBSTUB_IMMEDIATE
2044 gdbstub_printk("GDB Stub waiting for packet\n");
2047 * In case GDB is started before us, ack any packets
2048 * (presumably "$?#xx") sitting there.
2050 do { gdbstub_rx_char(&ch, 0); } while (ch != '$');
2051 do { gdbstub_rx_char(&ch, 0); } while (ch != '#');
2052 do { ret = gdbstub_rx_char(&ch, 0); } while (ret != 0); /* eat first csum byte */
2053 do { ret = gdbstub_rx_char(&ch, 0); } while (ret != 0); /* eat second csum byte */
2055 gdbstub_proto("### GDB Tx NAK\n");
2056 gdbstub_tx_char('-'); /* nak it */
2058 #else
2059 gdbstub_printk("GDB Stub set\n");
2060 #endif
2062 #if 0
2063 /* send banner */
2064 ptr = output_buffer;
2065 *ptr++ = 'O';
2066 ptr = mem2hex(gdbstub_banner, ptr, sizeof(gdbstub_banner) - 1, 0);
2067 gdbstub_send_packet(output_buffer);
2068 #endif
2069 #if defined(CONFIG_GDB_CONSOLE) && defined(CONFIG_GDBSTUB_IMMEDIATE)
2070 register_console(&gdbstub_console);
2071 #endif
2073 } /* end gdbstub_init() */
2075 /*****************************************************************************/
2077 * register the console at a more appropriate time
2079 #if defined (CONFIG_GDB_CONSOLE) && !defined(CONFIG_GDBSTUB_IMMEDIATE)
2080 static int __init gdbstub_postinit(void)
2082 printk("registering console\n");
2083 register_console(&gdbstub_console);
2084 return 0;
2085 } /* end gdbstub_postinit() */
2087 __initcall(gdbstub_postinit);
2088 #endif
2090 /*****************************************************************************/
2092 * send an exit message to GDB
2094 void gdbstub_exit(int status)
2096 unsigned char checksum;
2097 int count;
2098 unsigned char ch;
2100 sprintf(output_buffer,"W%02x",status&0xff);
2102 gdbstub_tx_char('$');
2103 checksum = 0;
2104 count = 0;
2106 while ((ch = output_buffer[count]) != 0) {
2107 gdbstub_tx_char(ch);
2108 checksum += ch;
2109 count += 1;
2112 gdbstub_tx_char('#');
2113 gdbstub_tx_char(hex_asc_hi(checksum));
2114 gdbstub_tx_char(hex_asc_lo(checksum));
2116 /* make sure the output is flushed, or else RedBoot might clobber it */
2117 gdbstub_tx_char('-');
2118 gdbstub_tx_flush();
2120 } /* end gdbstub_exit() */
2122 /*****************************************************************************/
2124 * GDB wants to call malloc() and free() to allocate memory for calling kernel
2125 * functions directly from its command line
2127 static void *malloc(size_t size) __maybe_unused;
2128 static void *malloc(size_t size)
2130 return kmalloc(size, GFP_ATOMIC);
2133 static void free(void *p) __maybe_unused;
2134 static void free(void *p)
2136 kfree(p);
2139 static uint32_t ___get_HSR0(void) __maybe_unused;
2140 static uint32_t ___get_HSR0(void)
2142 return __get_HSR(0);
2145 static uint32_t ___set_HSR0(uint32_t x) __maybe_unused;
2146 static uint32_t ___set_HSR0(uint32_t x)
2148 __set_HSR(0, x);
2149 return __get_HSR(0);