aboutsummaryrefslogtreecommitdiffstats
path: root/arch/frv/kernel/gdb-stub.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-16 18:20:36 -0400
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-16 18:20:36 -0400
commit1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch)
tree0bba044c4ce775e45a88a51686b5d9f90697ea9d /arch/frv/kernel/gdb-stub.c
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history, even though we have it. We can create a separate "historical" git archive of that later if we want to, and in the meantime it's about 3.2GB when imported into git - space that would just make the early git days unnecessarily complicated, when we don't have a lot of good infrastructure for it. Let it rip!
Diffstat (limited to 'arch/frv/kernel/gdb-stub.c')
-rw-r--r--arch/frv/kernel/gdb-stub.c2084
1 files changed, 2084 insertions, 0 deletions
diff --git a/arch/frv/kernel/gdb-stub.c b/arch/frv/kernel/gdb-stub.c
new file mode 100644
index 000000000000..8f860d9c4947
--- /dev/null
+++ b/arch/frv/kernel/gdb-stub.c
@@ -0,0 +1,2084 @@
1/* gdb-stub.c: FRV GDB stub
2 *
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
6 *
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.
11 */
12
13/*
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.
20 *
21 *
22 * The following gdb commands are supported:
23 *
24 * command function Return value
25 *
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
28 *
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
31 *
32 * c Resume at current address SNN ( signal NN)
33 * cAA..AA Continue at address AA..AA SNN
34 *
35 * s Step one instruction SNN
36 * sAA..AA Step one instruction from AA..AA SNN
37 *
38 * k kill
39 *
40 * ? What was the last sigval ? SNN (signal NN)
41 *
42 * bBB..BB Set baud rate to BB..BB OK or BNN, then sets
43 * baud rate
44 *
45 * All commands and responses are sent with a packet which includes a
46 * checksum. A packet consists of
47 *
48 * $<packet info>#<checksum>.
49 *
50 * where
51 * <packet info> :: <characters representing the command or response>
52 * <checksum> :: < two hex digits computed as modulo 256 sum of <packetinfo>>
53 *
54 * When a packet is received, it is first acknowledged with either '+' or '-'.
55 * '+' indicates a successful transfer. '-' indicates a failed transfer.
56 *
57 * Example:
58 *
59 * Host: Reply:
60 * $m0,10#2a +$00010203040506070809101112131415#42
61 *
62 *
63 * ==============
64 * MORE EXAMPLES:
65 * ==============
66 *
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.
72 *
73 * Step 1:
74 * First download gdb-5.0.tar.gz from the internet.
75 * and then build/install the package.
76 *
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
83 *
84 * Step 2:
85 * Configure linux for remote debugging and build it.
86 *
87 * Example:
88 * $ cd ~/linux
89 * $ make menuconfig <go to "Kernel Hacking" and turn on remote debugging>
90 * $ make dep; make vmlinux
91 *
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();
101 *
102 * Step 4:
103 * Start the gdb session on the host.
104 *
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.
114 *
115 */
116
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>
126
127#include <asm/pgtable.h>
128#include <asm/system.h>
129#include <asm/gdb-stub.h>
130
131#define LEDS(x) do { /* *(u32*)0xe1200004 = ~(x); mb(); */ } while(0)
132
133#undef GDBSTUB_DEBUG_PROTOCOL
134
135extern void debug_to_serial(const char *p, int n);
136extern void gdbstub_console_write(struct console *co, const char *p, unsigned n);
137
138extern volatile uint32_t __break_error_detect[3]; /* ESFR1, ESR15, EAR15 */
139extern struct user_context __break_user_context;
140
141struct __debug_amr {
142 unsigned long L, P;
143} __attribute__((aligned(8)));
144
145struct __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;
152
153 struct __debug_amr iamr[16];
154 struct __debug_amr damr[16];
155
156#ifdef CONFIG_MMU
157 struct __debug_amr tlb[64*2];
158#endif
159};
160
161static struct __debug_mmu __debug_mmu;
162
163/*
164 * BUFMAX defines the maximum number of characters in inbound/outbound buffers
165 * at least NUMREGBYTES*2 are needed for register packets
166 */
167#define BUFMAX 2048
168
169#define BREAK_INSN 0x801000c0 /* use "break" as bkpt */
170
171static const char gdbstub_banner[] = "Linux/FR-V GDB Stub (c) RedHat 2003\n";
172
173volatile u8 gdbstub_rx_buffer[PAGE_SIZE] __attribute__((aligned(PAGE_SIZE)));
174volatile u32 gdbstub_rx_inp = 0;
175volatile u32 gdbstub_rx_outp = 0;
176volatile u8 gdbstub_rx_overflow = 0;
177u8 gdbstub_rx_unget = 0;
178
179/* set with GDB whilst running to permit step through exceptions */
180extern volatile u32 __attribute__((section(".bss"))) gdbstub_trace_through_exceptions;
181
182static char input_buffer[BUFMAX];
183static char output_buffer[BUFMAX];
184
185static const char hexchars[] = "0123456789abcdef";
186
187static const char *regnames[] = {
188 "PSR ", "ISR ", "CCR ", "CCCR",
189 "LR ", "LCR ", "PC ", "_stt",
190 "sys ", "GR8*", "GNE0", "GNE1",
191 "IACH", "IACL",
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"
200};
201
202struct gdbstub_bkpt {
203 unsigned long addr; /* address of breakpoint */
204 unsigned len; /* size of breakpoint */
205 uint32_t originsns[7]; /* original instructions */
206};
207
208static struct gdbstub_bkpt gdbstub_bkpts[256];
209
210/*
211 * local prototypes
212 */
213
214static void gdbstub_recv_packet(char *buffer);
215static int gdbstub_send_packet(char *buffer);
216static int gdbstub_compute_signal(unsigned long tbr);
217static int hex(unsigned char ch);
218static int hexToInt(char **ptr, unsigned long *intValue);
219static unsigned char *mem2hex(const void *mem, char *buf, int count, int may_fault);
220static char *hex2mem(const char *buf, void *_mem, int count);
221
222/*
223 * Convert ch from a hex digit to an int
224 */
225static int hex(unsigned char ch)
226{
227 if (ch >= 'a' && ch <= 'f')
228 return ch-'a'+10;
229 if (ch >= '0' && ch <= '9')
230 return ch-'0';
231 if (ch >= 'A' && ch <= 'F')
232 return ch-'A'+10;
233 return -1;
234}
235
236void gdbstub_printk(const char *fmt, ...)
237{
238 static char buf[1024];
239 va_list args;
240 int len;
241
242 /* Emit the output into the temporary buffer */
243 va_start(args, fmt);
244 len = vsnprintf(buf, sizeof(buf), fmt, args);
245 va_end(args);
246 debug_to_serial(buf, len);
247}
248
249static inline char *gdbstub_strcpy(char *dst, const char *src)
250{
251 int loop = 0;
252 while ((dst[loop] = src[loop]))
253 loop++;
254 return dst;
255}
256
257static void gdbstub_purge_cache(void)
258{
259 asm volatile(" dcef @(gr0,gr0),#1 \n"
260 " icei @(gr0,gr0),#1 \n"
261 " membar \n"
262 " bar \n"
263 );
264}
265
266/*****************************************************************************/
267/*
268 * scan for the sequence $<data>#<checksum>
269 */
270static void gdbstub_recv_packet(char *buffer)
271{
272 unsigned char checksum;
273 unsigned char xmitcsum;
274 unsigned char ch;
275 int count, i, ret, error;
276
277 for (;;) {
278 /* wait around for the start character, ignore all other characters */
279 do {
280 gdbstub_rx_char(&ch, 0);
281 } while (ch != '$');
282
283 checksum = 0;
284 xmitcsum = -1;
285 count = 0;
286 error = 0;
287
288 /* now, read until a # or end of buffer is found */
289 while (count < BUFMAX) {
290 ret = gdbstub_rx_char(&ch, 0);
291 if (ret < 0)
292 error = ret;
293
294 if (ch == '#')
295 break;
296 checksum += ch;
297 buffer[count] = ch;
298 count++;
299 }
300
301 if (error == -EIO) {
302 gdbstub_proto("### GDB Rx Error - Skipping packet ###\n");
303 gdbstub_proto("### GDB Tx NAK\n");
304 gdbstub_tx_char('-');
305 continue;
306 }
307
308 if (count >= BUFMAX || error)
309 continue;
310
311 buffer[count] = 0;
312
313 /* read the checksum */
314 ret = gdbstub_rx_char(&ch, 0);
315 if (ret < 0)
316 error = ret;
317 xmitcsum = hex(ch) << 4;
318
319 ret = gdbstub_rx_char(&ch, 0);
320 if (ret < 0)
321 error = ret;
322 xmitcsum |= hex(ch);
323
324 if (error) {
325 if (error == -EIO)
326 gdbstub_proto("### GDB Rx Error - Skipping packet\n");
327 gdbstub_proto("### GDB Tx NAK\n");
328 gdbstub_tx_char('-');
329 continue;
330 }
331
332 /* check the checksum */
333 if (checksum != xmitcsum) {
334 gdbstub_proto("### GDB Tx NAK\n");
335 gdbstub_tx_char('-'); /* failed checksum */
336 continue;
337 }
338
339 gdbstub_proto("### GDB Rx '$%s#%02x' ###\n", buffer, checksum);
340 gdbstub_proto("### GDB Tx ACK\n");
341 gdbstub_tx_char('+'); /* successful transfer */
342
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]);
347
348 /* remove sequence chars from buffer */
349 count = 0;
350 while (buffer[count]) count++;
351 for (i=3; i <= count; i++)
352 buffer[i - 3] = buffer[i];
353 }
354
355 break;
356 }
357} /* end gdbstub_recv_packet() */
358
359/*****************************************************************************/
360/*
361 * send the packet in buffer.
362 * - return 0 if successfully ACK'd
363 * - return 1 if abandoned due to new incoming packet
364 */
365static int gdbstub_send_packet(char *buffer)
366{
367 unsigned char checksum;
368 int count;
369 unsigned char ch;
370
371 /* $<packet info>#<checksum> */
372 gdbstub_proto("### GDB Tx '%s' ###\n", buffer);
373
374 do {
375 gdbstub_tx_char('$');
376 checksum = 0;
377 count = 0;
378
379 while ((ch = buffer[count]) != 0) {
380 gdbstub_tx_char(ch);
381 checksum += ch;
382 count += 1;
383 }
384
385 gdbstub_tx_char('#');
386 gdbstub_tx_char(hexchars[checksum >> 4]);
387 gdbstub_tx_char(hexchars[checksum & 0xf]);
388
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),
393#endif
394 ch!='+' && ch!='$');
395
396 if (ch=='+') {
397 gdbstub_proto("### GDB Rx ACK\n");
398 return 0;
399 }
400
401 gdbstub_proto("### GDB Tx Abandoned\n");
402 gdbstub_rx_unget = ch;
403 return 1;
404} /* end gdbstub_send_packet() */
405
406/*
407 * While we find nice hex chars, build an int.
408 * Return number of chars processed.
409 */
410static int hexToInt(char **ptr, unsigned long *_value)
411{
412 int count = 0, ch;
413
414 *_value = 0;
415 while (**ptr) {
416 ch = hex(**ptr);
417 if (ch < 0)
418 break;
419
420 *_value = (*_value << 4) | ((uint8_t) ch & 0xf);
421 count++;
422
423 (*ptr)++;
424 }
425
426 return count;
427}
428
429/*****************************************************************************/
430/*
431 * probe an address to see whether it maps to anything
432 */
433static inline int gdbstub_addr_probe(const void *vaddr)
434{
435#ifdef CONFIG_MMU
436 unsigned long paddr;
437
438 asm("lrad %1,%0,#1,#0,#0" : "=r"(paddr) : "r"(vaddr));
439 if (!(paddr & xAMPRx_V))
440 return 0;
441#endif
442
443 return 1;
444} /* end gdbstub_addr_probe() */
445
446#ifdef CONFIG_MMU
447static unsigned long __saved_dampr, __saved_damlr;
448
449static inline unsigned long gdbstub_virt_to_pte(unsigned long vaddr)
450{
451 pgd_t *pgd;
452 pud_t *pud;
453 pmd_t *pmd;
454 pte_t *pte;
455 unsigned long val, dampr5;
456
457 pgd = (pgd_t *) __get_DAMLR(3) + pgd_index(vaddr);
458 pud = pud_offset(pgd, vaddr);
459 pmd = pmd_offset(pud, vaddr);
460
461 if (pmd_bad(*pmd) || !pmd_present(*pmd))
462 return 0;
463
464 /* make sure dampr5 maps to the correct pmd */
465 dampr5 = __get_DAMPR(5);
466 val = pmd_val(*pmd);
467 __set_DAMPR(5, val | xAMPRx_L | xAMPRx_SS_16Kb | xAMPRx_S | xAMPRx_C | xAMPRx_V);
468
469 /* now its safe to access pmd */
470 pte = (pte_t *)__get_DAMLR(5) + __pte_index(vaddr);
471 if (pte_present(*pte))
472 val = pte_val(*pte);
473 else
474 val = 0;
475
476 /* restore original dampr5 */
477 __set_DAMPR(5, dampr5);
478
479 return val;
480}
481#endif
482
483static inline int gdbstub_addr_map(const void *vaddr)
484{
485#ifdef CONFIG_MMU
486 unsigned long pte;
487
488 __saved_dampr = __get_DAMPR(2);
489 __saved_damlr = __get_DAMLR(2);
490#endif
491 if (gdbstub_addr_probe(vaddr))
492 return 1;
493#ifdef CONFIG_MMU
494 pte = gdbstub_virt_to_pte((unsigned long) vaddr);
495 if (pte) {
496 __set_DAMPR(2, pte);
497 __set_DAMLR(2, (unsigned long) vaddr & PAGE_MASK);
498 return 1;
499 }
500#endif
501 return 0;
502}
503
504static inline void gdbstub_addr_unmap(void)
505{
506#ifdef CONFIG_MMU
507 __set_DAMPR(2, __saved_dampr);
508 __set_DAMLR(2, __saved_damlr);
509#endif
510}
511
512/*
513 * access potentially dodgy memory through a potentially dodgy pointer
514 */
515static inline int gdbstub_read_dword(const void *addr, uint32_t *_res)
516{
517 unsigned long brr;
518 uint32_t res;
519
520 if (!gdbstub_addr_map(addr))
521 return 0;
522
523 asm volatile(" movgs gr0,brr \n"
524 " ld%I2 %M2,%0 \n"
525 " movsg brr,%1 \n"
526 : "=r"(res), "=r"(brr)
527 : "m"(*(uint32_t *) addr));
528 *_res = res;
529 gdbstub_addr_unmap();
530 return likely(!brr);
531}
532
533static inline int gdbstub_write_dword(void *addr, uint32_t val)
534{
535 unsigned long brr;
536
537 if (!gdbstub_addr_map(addr))
538 return 0;
539
540 asm volatile(" movgs gr0,brr \n"
541 " st%I2 %1,%M2 \n"
542 " movsg brr,%0 \n"
543 : "=r"(brr)
544 : "r"(val), "m"(*(uint32_t *) addr));
545 gdbstub_addr_unmap();
546 return likely(!brr);
547}
548
549static inline int gdbstub_read_word(const void *addr, uint16_t *_res)
550{
551 unsigned long brr;
552 uint16_t res;
553
554 if (!gdbstub_addr_map(addr))
555 return 0;
556
557 asm volatile(" movgs gr0,brr \n"
558 " lduh%I2 %M2,%0 \n"
559 " movsg brr,%1 \n"
560 : "=r"(res), "=r"(brr)
561 : "m"(*(uint16_t *) addr));
562 *_res = res;
563 gdbstub_addr_unmap();
564 return likely(!brr);
565}
566
567static inline int gdbstub_write_word(void *addr, uint16_t val)
568{
569 unsigned long brr;
570
571 if (!gdbstub_addr_map(addr))
572 return 0;
573
574 asm volatile(" movgs gr0,brr \n"
575 " sth%I2 %1,%M2 \n"
576 " movsg brr,%0 \n"
577 : "=r"(brr)
578 : "r"(val), "m"(*(uint16_t *) addr));
579 gdbstub_addr_unmap();
580 return likely(!brr);
581}
582
583static inline int gdbstub_read_byte(const void *addr, uint8_t *_res)
584{
585 unsigned long brr;
586 uint8_t res;
587
588 if (!gdbstub_addr_map(addr))
589 return 0;
590
591 asm volatile(" movgs gr0,brr \n"
592 " ldub%I2 %M2,%0 \n"
593 " movsg brr,%1 \n"
594 : "=r"(res), "=r"(brr)
595 : "m"(*(uint8_t *) addr));
596 *_res = res;
597 gdbstub_addr_unmap();
598 return likely(!brr);
599}
600
601static inline int gdbstub_write_byte(void *addr, uint8_t val)
602{
603 unsigned long brr;
604
605 if (!gdbstub_addr_map(addr))
606 return 0;
607
608 asm volatile(" movgs gr0,brr \n"
609 " stb%I2 %1,%M2 \n"
610 " movsg brr,%0 \n"
611 : "=r"(brr)
612 : "r"(val), "m"(*(uint8_t *) addr));
613 gdbstub_addr_unmap();
614 return likely(!brr);
615}
616
617static void __gdbstub_console_write(struct console *co, const char *p, unsigned n)
618{
619 char outbuf[26];
620 int qty;
621
622 outbuf[0] = 'O';
623
624 while (n > 0) {
625 qty = 1;
626
627 while (n > 0 && qty < 20) {
628 mem2hex(p, outbuf + qty, 2, 0);
629 qty += 2;
630 if (*p == 0x0a) {
631 outbuf[qty++] = '0';
632 outbuf[qty++] = 'd';
633 }
634 p++;
635 n--;
636 }
637
638 outbuf[qty] = 0;
639 gdbstub_send_packet(outbuf);
640 }
641}
642
643#if 0
644void debug_to_serial(const char *p, int n)
645{
646 gdbstub_console_write(NULL,p,n);
647}
648#endif
649
650#ifdef CONFIG_GDBSTUB_CONSOLE
651
652static kdev_t gdbstub_console_dev(struct console *con)
653{
654 return MKDEV(1,3); /* /dev/null */
655}
656
657static struct console gdbstub_console = {
658 .name = "gdb",
659 .write = gdbstub_console_write, /* in break.S */
660 .device = gdbstub_console_dev,
661 .flags = CON_PRINTBUFFER,
662 .index = -1,
663};
664
665#endif
666
667/*****************************************************************************/
668/*
669 * Convert the memory pointed to by mem into hex, placing result in buf.
670 * - if successful, return a pointer to the last char put in buf (NUL)
671 * - in case of mem fault, return NULL
672 * may_fault is non-zero if we are reading from arbitrary memory, but is currently
673 * not used.
674 */
675static unsigned char *mem2hex(const void *_mem, char *buf, int count, int may_fault)
676{
677 const uint8_t *mem = _mem;
678 uint8_t ch[4] __attribute__((aligned(4)));
679
680 if ((uint32_t)mem&1 && count>=1) {
681 if (!gdbstub_read_byte(mem,ch))
682 return NULL;
683 *buf++ = hexchars[ch[0] >> 4];
684 *buf++ = hexchars[ch[0] & 0xf];
685 mem++;
686 count--;
687 }
688
689 if ((uint32_t)mem&3 && count>=2) {
690 if (!gdbstub_read_word(mem,(uint16_t *)ch))
691 return NULL;
692 *buf++ = hexchars[ch[0] >> 4];
693 *buf++ = hexchars[ch[0] & 0xf];
694 *buf++ = hexchars[ch[1] >> 4];
695 *buf++ = hexchars[ch[1] & 0xf];
696 mem += 2;
697 count -= 2;
698 }
699
700 while (count>=4) {
701 if (!gdbstub_read_dword(mem,(uint32_t *)ch))
702 return NULL;
703 *buf++ = hexchars[ch[0] >> 4];
704 *buf++ = hexchars[ch[0] & 0xf];
705 *buf++ = hexchars[ch[1] >> 4];
706 *buf++ = hexchars[ch[1] & 0xf];
707 *buf++ = hexchars[ch[2] >> 4];
708 *buf++ = hexchars[ch[2] & 0xf];
709 *buf++ = hexchars[ch[3] >> 4];
710 *buf++ = hexchars[ch[3] & 0xf];
711 mem += 4;
712 count -= 4;
713 }
714
715 if (count>=2) {
716 if (!gdbstub_read_word(mem,(uint16_t *)ch))
717 return NULL;
718 *buf++ = hexchars[ch[0] >> 4];
719 *buf++ = hexchars[ch[0] & 0xf];
720 *buf++ = hexchars[ch[1] >> 4];
721 *buf++ = hexchars[ch[1] & 0xf];
722 mem += 2;
723 count -= 2;
724 }
725
726 if (count>=1) {
727 if (!gdbstub_read_byte(mem,ch))
728 return NULL;
729 *buf++ = hexchars[ch[0] >> 4];
730 *buf++ = hexchars[ch[0] & 0xf];
731 }
732
733 *buf = 0;
734
735 return buf;
736} /* end mem2hex() */
737
738/*****************************************************************************/
739/*
740 * convert the hex array pointed to by buf into binary to be placed in mem
741 * return a pointer to the character AFTER the last byte of buffer consumed
742 */
743static char *hex2mem(const char *buf, void *_mem, int count)
744{
745 uint8_t *mem = _mem;
746 union {
747 uint32_t l;
748 uint16_t w;
749 uint8_t b[4];
750 } ch;
751
752 if ((u32)mem&1 && count>=1) {
753 ch.b[0] = hex(*buf++) << 4;
754 ch.b[0] |= hex(*buf++);
755 if (!gdbstub_write_byte(mem,ch.b[0]))
756 return NULL;
757 mem++;
758 count--;
759 }
760
761 if ((u32)mem&3 && count>=2) {
762 ch.b[0] = hex(*buf++) << 4;
763 ch.b[0] |= hex(*buf++);
764 ch.b[1] = hex(*buf++) << 4;
765 ch.b[1] |= hex(*buf++);
766 if (!gdbstub_write_word(mem,ch.w))
767 return NULL;
768 mem += 2;
769 count -= 2;
770 }
771
772 while (count>=4) {
773 ch.b[0] = hex(*buf++) << 4;
774 ch.b[0] |= hex(*buf++);
775 ch.b[1] = hex(*buf++) << 4;
776 ch.b[1] |= hex(*buf++);
777 ch.b[2] = hex(*buf++) << 4;
778 ch.b[2] |= hex(*buf++);
779 ch.b[3] = hex(*buf++) << 4;
780 ch.b[3] |= hex(*buf++);
781 if (!gdbstub_write_dword(mem,ch.l))
782 return NULL;
783 mem += 4;
784 count -= 4;
785 }
786
787 if (count>=2) {
788 ch.b[0] = hex(*buf++) << 4;
789 ch.b[0] |= hex(*buf++);
790 ch.b[1] = hex(*buf++) << 4;
791 ch.b[1] |= hex(*buf++);
792 if (!gdbstub_write_word(mem,ch.w))
793 return NULL;
794 mem += 2;
795 count -= 2;
796 }
797
798 if (count>=1) {
799 ch.b[0] = hex(*buf++) << 4;
800 ch.b[0] |= hex(*buf++);
801 if (!gdbstub_write_byte(mem,ch.b[0]))
802 return NULL;
803 }
804
805 return (char *) buf;
806} /* end hex2mem() */
807
808/*****************************************************************************/
809/*
810 * This table contains the mapping between FRV TBR.TT exception codes,
811 * and signals, which are primarily what GDB understands. It also
812 * indicates which hardware traps we need to commandeer when
813 * initializing the stub.
814 */
815static const struct brr_to_sig_map {
816 unsigned long brr_mask; /* BRR bitmask */
817 unsigned long tbr_tt; /* TBR.TT code (in BRR.EBTT) */
818 unsigned int signo; /* Signal that we map this into */
819} brr_to_sig_map[] = {
820 { BRR_EB, TBR_TT_INSTR_ACC_ERROR, SIGSEGV },
821 { BRR_EB, TBR_TT_ILLEGAL_INSTR, SIGILL },
822 { BRR_EB, TBR_TT_PRIV_INSTR, SIGILL },
823 { BRR_EB, TBR_TT_MP_EXCEPTION, SIGFPE },
824 { BRR_EB, TBR_TT_DATA_ACC_ERROR, SIGSEGV },
825 { BRR_EB, TBR_TT_DATA_STR_ERROR, SIGSEGV },
826 { BRR_EB, TBR_TT_DIVISION_EXCEP, SIGFPE },
827 { BRR_EB, TBR_TT_COMPOUND_EXCEP, SIGSEGV },
828 { BRR_EB, TBR_TT_INTERRUPT_13, SIGALRM }, /* watchdog */
829 { BRR_EB, TBR_TT_INTERRUPT_14, SIGINT }, /* GDB serial */
830 { BRR_EB, TBR_TT_INTERRUPT_15, SIGQUIT }, /* NMI */
831 { BRR_CB, 0, SIGUSR1 },
832 { BRR_TB, 0, SIGUSR2 },
833 { BRR_DBNEx, 0, SIGTRAP },
834 { BRR_DBx, 0, SIGTRAP }, /* h/w watchpoint */
835 { BRR_IBx, 0, SIGTRAP }, /* h/w breakpoint */
836 { BRR_CBB, 0, SIGTRAP },
837 { BRR_SB, 0, SIGTRAP },
838 { BRR_ST, 0, SIGTRAP }, /* single step */
839 { 0, 0, SIGHUP } /* default */
840};
841
842/*****************************************************************************/
843/*
844 * convert the FRV BRR register contents into a UNIX signal number
845 */
846static inline int gdbstub_compute_signal(unsigned long brr)
847{
848 const struct brr_to_sig_map *map;
849 unsigned long tbr = (brr & BRR_EBTT) >> 12;
850
851 for (map = brr_to_sig_map; map->brr_mask; map++)
852 if (map->brr_mask & brr)
853 if (!map->tbr_tt || map->tbr_tt == tbr)
854 break;
855
856 return map->signo;
857} /* end gdbstub_compute_signal() */
858
859/*****************************************************************************/
860/*
861 * set a software breakpoint or a hardware breakpoint or watchpoint
862 */
863static int gdbstub_set_breakpoint(unsigned long type, unsigned long addr, unsigned long len)
864{
865 unsigned long tmp;
866 int bkpt, loop, xloop;
867
868 union {
869 struct {
870 unsigned long mask0, mask1;
871 };
872 uint8_t bytes[8];
873 } dbmr;
874
875 //gdbstub_printk("setbkpt(%ld,%08lx,%ld)\n", type, addr, len);
876
877 switch (type) {
878 /* set software breakpoint */
879 case 0:
880 if (addr & 3 || len > 7*4)
881 return -EINVAL;
882
883 for (bkpt = 255; bkpt >= 0; bkpt--)
884 if (!gdbstub_bkpts[bkpt].addr)
885 break;
886 if (bkpt < 0)
887 return -ENOSPC;
888
889 for (loop = 0; loop < len/4; loop++)
890 if (!gdbstub_read_dword(&((uint32_t *) addr)[loop],
891 &gdbstub_bkpts[bkpt].originsns[loop]))
892 return -EFAULT;
893
894 for (loop = 0; loop < len/4; loop++)
895 if (!gdbstub_write_dword(&((uint32_t *) addr)[loop],
896 BREAK_INSN)
897 ) {
898 /* need to undo the changes if possible */
899 for (xloop = 0; xloop < loop; xloop++)
900 gdbstub_write_dword(&((uint32_t *) addr)[xloop],
901 gdbstub_bkpts[bkpt].originsns[xloop]);
902 return -EFAULT;
903 }
904
905 gdbstub_bkpts[bkpt].addr = addr;
906 gdbstub_bkpts[bkpt].len = len;
907
908#if 0
909 gdbstub_printk("Set BKPT[%02x]: %08lx #%d {%04x, %04x} -> { %04x, %04x }\n",
910 bkpt,
911 gdbstub_bkpts[bkpt].addr,
912 gdbstub_bkpts[bkpt].len,
913 gdbstub_bkpts[bkpt].originsns[0],
914 gdbstub_bkpts[bkpt].originsns[1],
915 ((uint32_t *) addr)[0],
916 ((uint32_t *) addr)[1]
917 );
918#endif
919 return 0;
920
921 /* set hardware breakpoint */
922 case 1:
923 if (addr & 3 || len != 4)
924 return -EINVAL;
925
926 if (!(__debug_regs->dcr & DCR_IBE0)) {
927 //gdbstub_printk("set h/w break 0: %08lx\n", addr);
928 __debug_regs->dcr |= DCR_IBE0;
929 asm volatile("movgs %0,ibar0" : : "r"(addr));
930 return 0;
931 }
932
933 if (!(__debug_regs->dcr & DCR_IBE1)) {
934 //gdbstub_printk("set h/w break 1: %08lx\n", addr);
935 __debug_regs->dcr |= DCR_IBE1;
936 asm volatile("movgs %0,ibar1" : : "r"(addr));
937 return 0;
938 }
939
940 if (!(__debug_regs->dcr & DCR_IBE2)) {
941 //gdbstub_printk("set h/w break 2: %08lx\n", addr);
942 __debug_regs->dcr |= DCR_IBE2;
943 asm volatile("movgs %0,ibar2" : : "r"(addr));
944 return 0;
945 }
946
947 if (!(__debug_regs->dcr & DCR_IBE3)) {
948 //gdbstub_printk("set h/w break 3: %08lx\n", addr);
949 __debug_regs->dcr |= DCR_IBE3;
950 asm volatile("movgs %0,ibar3" : : "r"(addr));
951 return 0;
952 }
953
954 return -ENOSPC;
955
956 /* set data read/write/access watchpoint */
957 case 2:
958 case 3:
959 case 4:
960 if ((addr & ~7) != ((addr + len - 1) & ~7))
961 return -EINVAL;
962
963 tmp = addr & 7;
964
965 memset(dbmr.bytes, 0xff, sizeof(dbmr.bytes));
966 for (loop = 0; loop < len; loop++)
967 dbmr.bytes[tmp + loop] = 0;
968
969 addr &= ~7;
970
971 if (!(__debug_regs->dcr & (DCR_DRBE0|DCR_DWBE0))) {
972 //gdbstub_printk("set h/w watchpoint 0 type %ld: %08lx\n", type, addr);
973 tmp = type==2 ? DCR_DWBE0 : type==3 ? DCR_DRBE0 : DCR_DRBE0|DCR_DWBE0;
974 __debug_regs->dcr |= tmp;
975 asm volatile(" movgs %0,dbar0 \n"
976 " movgs %1,dbmr00 \n"
977 " movgs %2,dbmr01 \n"
978 " movgs gr0,dbdr00 \n"
979 " movgs gr0,dbdr01 \n"
980 : : "r"(addr), "r"(dbmr.mask0), "r"(dbmr.mask1));
981 return 0;
982 }
983
984 if (!(__debug_regs->dcr & (DCR_DRBE1|DCR_DWBE1))) {
985 //gdbstub_printk("set h/w watchpoint 1 type %ld: %08lx\n", type, addr);
986 tmp = type==2 ? DCR_DWBE1 : type==3 ? DCR_DRBE1 : DCR_DRBE1|DCR_DWBE1;
987 __debug_regs->dcr |= tmp;
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;
995 }
996
997 return -ENOSPC;
998
999 default:
1000 return -EINVAL;
1001 }
1002
1003} /* end gdbstub_set_breakpoint() */
1004
1005/*****************************************************************************/
1006/*
1007 * clear a breakpoint or watchpoint
1008 */
1009int gdbstub_clear_breakpoint(unsigned long type, unsigned long addr, unsigned long len)
1010{
1011 unsigned long tmp;
1012 int bkpt, loop;
1013
1014 union {
1015 struct {
1016 unsigned long mask0, mask1;
1017 };
1018 uint8_t bytes[8];
1019 } dbmr;
1020
1021 //gdbstub_printk("clearbkpt(%ld,%08lx,%ld)\n", type, addr, len);
1022
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;
1031
1032 gdbstub_bkpts[bkpt].addr = 0;
1033
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;
1039
1040 /* clear hardware breakpoint */
1041 case 1:
1042 if (addr & 3 || len != 4)
1043 return -EINVAL;
1044
1045#define __get_ibar(X) ({ unsigned long x; asm volatile("movsg ibar"#X",%0" : "=r"(x)); x; })
1046
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 asm volatile("movgs gr0,ibar0");
1051 return 0;
1052 }
1053
1054 if (__debug_regs->dcr & DCR_IBE1 && __get_ibar(1) == addr) {
1055 //gdbstub_printk("clear h/w break 1: %08lx\n", addr);
1056 __debug_regs->dcr &= ~DCR_IBE1;
1057 asm volatile("movgs gr0,ibar1");
1058 return 0;
1059 }
1060
1061 if (__debug_regs->dcr & DCR_IBE2 && __get_ibar(2) == addr) {
1062 //gdbstub_printk("clear h/w break 2: %08lx\n", addr);
1063 __debug_regs->dcr &= ~DCR_IBE2;
1064 asm volatile("movgs gr0,ibar2");
1065 return 0;
1066 }
1067
1068 if (__debug_regs->dcr & DCR_IBE3 && __get_ibar(3) == addr) {
1069 //gdbstub_printk("clear h/w break 3: %08lx\n", addr);
1070 __debug_regs->dcr &= ~DCR_IBE3;
1071 asm volatile("movgs gr0,ibar3");
1072 return 0;
1073 }
1074
1075 return -EINVAL;
1076
1077 /* clear data read/write/access watchpoint */
1078 case 2:
1079 case 3:
1080 case 4:
1081 if ((addr & ~7) != ((addr + len - 1) & ~7))
1082 return -EINVAL;
1083
1084 tmp = addr & 7;
1085
1086 memset(dbmr.bytes, 0xff, sizeof(dbmr.bytes));
1087 for (loop = 0; loop < len; loop++)
1088 dbmr.bytes[tmp + loop] = 0;
1089
1090 addr &= ~7;
1091
1092#define __get_dbar(X) ({ unsigned long x; asm volatile("movsg dbar"#X",%0" : "=r"(x)); x; })
1093#define __get_dbmr0(X) ({ unsigned long x; asm volatile("movsg dbmr"#X"0,%0" : "=r"(x)); x; })
1094#define __get_dbmr1(X) ({ unsigned long x; asm volatile("movsg dbmr"#X"1,%0" : "=r"(x)); x; })
1095
1096 /* consider DBAR 0 */
1097 tmp = type==2 ? DCR_DWBE0 : type==3 ? DCR_DRBE0 : DCR_DRBE0|DCR_DWBE0;
1098
1099 if ((__debug_regs->dcr & (DCR_DRBE0|DCR_DWBE0)) != tmp ||
1100 __get_dbar(0) != addr ||
1101 __get_dbmr0(0) != dbmr.mask0 ||
1102 __get_dbmr1(0) != dbmr.mask1)
1103 goto skip_dbar0;
1104
1105 //gdbstub_printk("clear h/w watchpoint 0 type %ld: %08lx\n", type, addr);
1106 __debug_regs->dcr &= ~(DCR_DRBE0|DCR_DWBE0);
1107 asm volatile(" movgs gr0,dbar0 \n"
1108 " movgs gr0,dbmr00 \n"
1109 " movgs gr0,dbmr01 \n"
1110 " movgs gr0,dbdr00 \n"
1111 " movgs gr0,dbdr01 \n");
1112 return 0;
1113
1114 skip_dbar0:
1115 /* consider DBAR 0 */
1116 tmp = type==2 ? DCR_DWBE1 : type==3 ? DCR_DRBE1 : DCR_DRBE1|DCR_DWBE1;
1117
1118 if ((__debug_regs->dcr & (DCR_DRBE1|DCR_DWBE1)) != tmp ||
1119 __get_dbar(1) != addr ||
1120 __get_dbmr0(1) != dbmr.mask0 ||
1121 __get_dbmr1(1) != dbmr.mask1)
1122 goto skip_dbar1;
1123
1124 //gdbstub_printk("clear h/w watchpoint 1 type %ld: %08lx\n", type, addr);
1125 __debug_regs->dcr &= ~(DCR_DRBE1|DCR_DWBE1);
1126 asm volatile(" movgs gr0,dbar1 \n"
1127 " movgs gr0,dbmr10 \n"
1128 " movgs gr0,dbmr11 \n"
1129 " movgs gr0,dbdr10 \n"
1130 " movgs gr0,dbdr11 \n");
1131 return 0;
1132
1133 skip_dbar1:
1134 return -ENOSPC;
1135
1136 default:
1137 return -EINVAL;
1138 }
1139} /* end gdbstub_clear_breakpoint() */
1140
1141/*****************************************************************************/
1142/*
1143 * check a for an internal software breakpoint, and wind the PC back if necessary
1144 */
1145static void gdbstub_check_breakpoint(void)
1146{
1147 unsigned long addr = __debug_frame->pc - 4;
1148 int bkpt;
1149
1150 for (bkpt = 255; bkpt >= 0; bkpt--)
1151 if (gdbstub_bkpts[bkpt].addr == addr)
1152 break;
1153 if (bkpt >= 0)
1154 __debug_frame->pc = addr;
1155
1156 //gdbstub_printk("alter pc [%d] %08lx\n", bkpt, __debug_frame->pc);
1157
1158} /* end gdbstub_check_breakpoint() */
1159
1160/*****************************************************************************/
1161/*
1162 *
1163 */
1164static void __attribute__((unused)) gdbstub_show_regs(void)
1165{
1166 uint32_t *reg;
1167 int loop;
1168
1169 gdbstub_printk("\n");
1170
1171 gdbstub_printk("Frame: @%p [%s]\n",
1172 __debug_frame,
1173 __debug_frame->psr & PSR_S ? "kernel" : "user");
1174
1175 reg = (uint32_t *) __debug_frame;
1176 for (loop = 0; loop < REG__END; loop++) {
1177 printk("%s %08x", regnames[loop + 0], reg[loop + 0]);
1178
1179 if (loop == REG__END - 1 || loop % 5 == 4)
1180 printk("\n");
1181 else
1182 printk(" | ");
1183 }
1184
1185 gdbstub_printk("Process %s (pid: %d)\n", current->comm, current->pid);
1186} /* end gdbstub_show_regs() */
1187
1188/*****************************************************************************/
1189/*
1190 * dump debugging regs
1191 */
1192static void __attribute__((unused)) gdbstub_dump_debugregs(void)
1193{
1194 unsigned long x;
1195
1196 x = __debug_regs->dcr;
1197 gdbstub_printk("DCR %08lx ", x);
1198
1199 x = __debug_regs->brr;
1200 gdbstub_printk("BRR %08lx\n", x);
1201
1202 gdbstub_printk("IBAR0 %08lx ", __get_ibar(0));
1203 gdbstub_printk("IBAR1 %08lx ", __get_ibar(1));
1204 gdbstub_printk("IBAR2 %08lx ", __get_ibar(2));
1205 gdbstub_printk("IBAR3 %08lx\n", __get_ibar(3));
1206
1207 gdbstub_printk("DBAR0 %08lx ", __get_dbar(0));
1208 gdbstub_printk("DBMR00 %08lx ", __get_dbmr0(0));
1209 gdbstub_printk("DBMR01 %08lx\n", __get_dbmr1(0));
1210
1211 gdbstub_printk("DBAR1 %08lx ", __get_dbar(1));
1212 gdbstub_printk("DBMR10 %08lx ", __get_dbmr0(1));
1213 gdbstub_printk("DBMR11 %08lx\n", __get_dbmr1(1));
1214
1215 gdbstub_printk("\n");
1216} /* end gdbstub_dump_debugregs() */
1217
1218/*****************************************************************************/
1219/*
1220 * dump the MMU state into a structure so that it can be accessed with GDB
1221 */
1222void gdbstub_get_mmu_state(void)
1223{
1224 asm volatile("movsg hsr0,%0" : "=r"(__debug_mmu.regs.hsr0));
1225 asm volatile("movsg pcsr,%0" : "=r"(__debug_mmu.regs.pcsr));
1226 asm volatile("movsg esr0,%0" : "=r"(__debug_mmu.regs.esr0));
1227 asm volatile("movsg ear0,%0" : "=r"(__debug_mmu.regs.ear0));
1228 asm volatile("movsg epcr0,%0" : "=r"(__debug_mmu.regs.epcr0));
1229
1230 /* read the protection / SAT registers */
1231 __debug_mmu.iamr[0].L = __get_IAMLR(0);
1232 __debug_mmu.iamr[0].P = __get_IAMPR(0);
1233 __debug_mmu.iamr[1].L = __get_IAMLR(1);
1234 __debug_mmu.iamr[1].P = __get_IAMPR(1);
1235 __debug_mmu.iamr[2].L = __get_IAMLR(2);
1236 __debug_mmu.iamr[2].P = __get_IAMPR(2);
1237 __debug_mmu.iamr[3].L = __get_IAMLR(3);
1238 __debug_mmu.iamr[3].P = __get_IAMPR(3);
1239 __debug_mmu.iamr[4].L = __get_IAMLR(4);
1240 __debug_mmu.iamr[4].P = __get_IAMPR(4);
1241 __debug_mmu.iamr[5].L = __get_IAMLR(5);
1242 __debug_mmu.iamr[5].P = __get_IAMPR(5);
1243 __debug_mmu.iamr[6].L = __get_IAMLR(6);
1244 __debug_mmu.iamr[6].P = __get_IAMPR(6);
1245 __debug_mmu.iamr[7].L = __get_IAMLR(7);
1246 __debug_mmu.iamr[7].P = __get_IAMPR(7);
1247 __debug_mmu.iamr[8].L = __get_IAMLR(8);
1248 __debug_mmu.iamr[8].P = __get_IAMPR(8);
1249 __debug_mmu.iamr[9].L = __get_IAMLR(9);
1250 __debug_mmu.iamr[9].P = __get_IAMPR(9);
1251 __debug_mmu.iamr[10].L = __get_IAMLR(10);
1252 __debug_mmu.iamr[10].P = __get_IAMPR(10);
1253 __debug_mmu.iamr[11].L = __get_IAMLR(11);
1254 __debug_mmu.iamr[11].P = __get_IAMPR(11);
1255 __debug_mmu.iamr[12].L = __get_IAMLR(12);
1256 __debug_mmu.iamr[12].P = __get_IAMPR(12);
1257 __debug_mmu.iamr[13].L = __get_IAMLR(13);
1258 __debug_mmu.iamr[13].P = __get_IAMPR(13);
1259 __debug_mmu.iamr[14].L = __get_IAMLR(14);
1260 __debug_mmu.iamr[14].P = __get_IAMPR(14);
1261 __debug_mmu.iamr[15].L = __get_IAMLR(15);
1262 __debug_mmu.iamr[15].P = __get_IAMPR(15);
1263
1264 __debug_mmu.damr[0].L = __get_DAMLR(0);
1265 __debug_mmu.damr[0].P = __get_DAMPR(0);
1266 __debug_mmu.damr[1].L = __get_DAMLR(1);
1267 __debug_mmu.damr[1].P = __get_DAMPR(1);
1268 __debug_mmu.damr[2].L = __get_DAMLR(2);
1269 __debug_mmu.damr[2].P = __get_DAMPR(2);
1270 __debug_mmu.damr[3].L = __get_DAMLR(3);
1271 __debug_mmu.damr[3].P = __get_DAMPR(3);
1272 __debug_mmu.damr[4].L = __get_DAMLR(4);
1273 __debug_mmu.damr[4].P = __get_DAMPR(4);
1274 __debug_mmu.damr[5].L = __get_DAMLR(5);
1275 __debug_mmu.damr[5].P = __get_DAMPR(5);
1276 __debug_mmu.damr[6].L = __get_DAMLR(6);
1277 __debug_mmu.damr[6].P = __get_DAMPR(6);
1278 __debug_mmu.damr[7].L = __get_DAMLR(7);
1279 __debug_mmu.damr[7].P = __get_DAMPR(7);
1280 __debug_mmu.damr[8].L = __get_DAMLR(8);
1281 __debug_mmu.damr[8].P = __get_DAMPR(8);
1282 __debug_mmu.damr[9].L = __get_DAMLR(9);
1283 __debug_mmu.damr[9].P = __get_DAMPR(9);
1284 __debug_mmu.damr[10].L = __get_DAMLR(10);
1285 __debug_mmu.damr[10].P = __get_DAMPR(10);
1286 __debug_mmu.damr[11].L = __get_DAMLR(11);
1287 __debug_mmu.damr[11].P = __get_DAMPR(11);
1288 __debug_mmu.damr[12].L = __get_DAMLR(12);
1289 __debug_mmu.damr[12].P = __get_DAMPR(12);
1290 __debug_mmu.damr[13].L = __get_DAMLR(13);
1291 __debug_mmu.damr[13].P = __get_DAMPR(13);
1292 __debug_mmu.damr[14].L = __get_DAMLR(14);
1293 __debug_mmu.damr[14].P = __get_DAMPR(14);
1294 __debug_mmu.damr[15].L = __get_DAMLR(15);
1295 __debug_mmu.damr[15].P = __get_DAMPR(15);
1296
1297#ifdef CONFIG_MMU
1298 do {
1299 /* read the DAT entries from the TLB */
1300 struct __debug_amr *p;
1301 int loop;
1302
1303 asm volatile("movsg tplr,%0" : "=r"(__debug_mmu.regs.tplr));
1304 asm volatile("movsg tppr,%0" : "=r"(__debug_mmu.regs.tppr));
1305 asm volatile("movsg tpxr,%0" : "=r"(__debug_mmu.regs.tpxr));
1306 asm volatile("movsg cxnr,%0" : "=r"(__debug_mmu.regs.cxnr));
1307
1308 p = __debug_mmu.tlb;
1309
1310 /* way 0 */
1311 asm volatile("movgs %0,tpxr" :: "r"(0 << TPXR_WAY_SHIFT));
1312 for (loop = 0; loop < 64; loop++) {
1313 asm volatile("tlbpr %0,gr0,#1,#0" :: "r"(loop << PAGE_SHIFT));
1314 asm volatile("movsg tplr,%0" : "=r"(p->L));
1315 asm volatile("movsg tppr,%0" : "=r"(p->P));
1316 p++;
1317 }
1318
1319 /* way 1 */
1320 asm volatile("movgs %0,tpxr" :: "r"(1 << TPXR_WAY_SHIFT));
1321 for (loop = 0; loop < 64; loop++) {
1322 asm volatile("tlbpr %0,gr0,#1,#0" :: "r"(loop << PAGE_SHIFT));
1323 asm volatile("movsg tplr,%0" : "=r"(p->L));
1324 asm volatile("movsg tppr,%0" : "=r"(p->P));
1325 p++;
1326 }
1327
1328 asm volatile("movgs %0,tplr" :: "r"(__debug_mmu.regs.tplr));
1329 asm volatile("movgs %0,tppr" :: "r"(__debug_mmu.regs.tppr));
1330 asm volatile("movgs %0,tpxr" :: "r"(__debug_mmu.regs.tpxr));
1331 } while(0);
1332#endif
1333
1334} /* end gdbstub_get_mmu_state() */
1335
1336/*****************************************************************************/
1337/*
1338 * handle event interception and GDB remote protocol processing
1339 * - on entry:
1340 * PSR.ET==0, PSR.S==1 and the CPU is in debug mode
1341 * __debug_frame points to the saved registers
1342 * __frame points to the kernel mode exception frame, if it was in kernel
1343 * mode when the break happened
1344 */
1345void gdbstub(int sigval)
1346{
1347 unsigned long addr, length, loop, dbar, temp, temp2, temp3;
1348 uint32_t zero;
1349 char *ptr;
1350 int flush_cache = 0;
1351
1352 LEDS(0x5000);
1353
1354 if (sigval < 0) {
1355#ifndef CONFIG_GDBSTUB_IMMEDIATE
1356 /* return immediately if GDB immediate activation option not set */
1357 return;
1358#else
1359 sigval = SIGINT;
1360#endif
1361 }
1362
1363 save_user_regs(&__break_user_context);
1364
1365#if 0
1366 gdbstub_printk("--> gdbstub() %08x %p %08x %08x\n",
1367 __debug_frame->pc,
1368 __debug_frame,
1369 __debug_regs->brr,
1370 __debug_regs->bpsr);
1371// gdbstub_show_regs();
1372#endif
1373
1374 LEDS(0x5001);
1375
1376 /* if we were interrupted by input on the serial gdbstub serial port,
1377 * restore the context prior to the interrupt so that we return to that
1378 * directly
1379 */
1380 temp = (unsigned long) __entry_kerneltrap_table;
1381 temp2 = (unsigned long) __entry_usertrap_table;
1382 temp3 = __debug_frame->pc & ~15;
1383
1384 if (temp3 == temp + TBR_TT_INTERRUPT_15 ||
1385 temp3 == temp2 + TBR_TT_INTERRUPT_15
1386 ) {
1387 asm volatile("movsg pcsr,%0" : "=r"(__debug_frame->pc));
1388 __debug_frame->psr |= PSR_ET;
1389 __debug_frame->psr &= ~PSR_S;
1390 if (__debug_frame->psr & PSR_PS)
1391 __debug_frame->psr |= PSR_S;
1392 __debug_regs->brr = (__debug_frame->tbr & TBR_TT) << 12;
1393 __debug_regs->brr |= BRR_EB;
1394 sigval = SIGINT;
1395 }
1396
1397 /* handle the decrement timer going off (FR451 only) */
1398 if (temp3 == temp + TBR_TT_DECREMENT_TIMER ||
1399 temp3 == temp2 + TBR_TT_DECREMENT_TIMER
1400 ) {
1401 asm volatile("movgs %0,timerd" :: "r"(10000000));
1402 asm volatile("movsg pcsr,%0" : "=r"(__debug_frame->pc));
1403 __debug_frame->psr |= PSR_ET;
1404 __debug_frame->psr &= ~PSR_S;
1405 if (__debug_frame->psr & PSR_PS)
1406 __debug_frame->psr |= PSR_S;
1407 __debug_regs->brr = (__debug_frame->tbr & TBR_TT) << 12;
1408 __debug_regs->brr |= BRR_EB;
1409 sigval = SIGXCPU;;
1410 }
1411
1412 LEDS(0x5002);
1413
1414 /* after a BREAK insn, the PC lands on the far side of it */
1415 if (__debug_regs->brr & BRR_SB)
1416 gdbstub_check_breakpoint();
1417
1418 LEDS(0x5003);
1419
1420 /* handle attempts to write console data via GDB "O" commands */
1421 if (__debug_frame->pc == (unsigned long) gdbstub_console_write + 4) {
1422 __gdbstub_console_write((struct console *) __debug_frame->gr8,
1423 (const char *) __debug_frame->gr9,
1424 (unsigned) __debug_frame->gr10);
1425 goto done;
1426 }
1427
1428 if (gdbstub_rx_unget) {
1429 sigval = SIGINT;
1430 goto packet_waiting;
1431 }
1432
1433 if (!sigval)
1434 sigval = gdbstub_compute_signal(__debug_regs->brr);
1435
1436 LEDS(0x5004);
1437
1438 /* send a message to the debugger's user saying what happened if it may
1439 * not be clear cut (we can't map exceptions onto signals properly)
1440 */
1441 if (sigval != SIGINT && sigval != SIGTRAP && sigval != SIGILL) {
1442 static const char title[] = "Break ";
1443 static const char crlf[] = "\r\n";
1444 unsigned long brr = __debug_regs->brr;
1445 char hx;
1446
1447 ptr = output_buffer;
1448 *ptr++ = 'O';
1449 ptr = mem2hex(title, ptr, sizeof(title) - 1,0);
1450
1451 hx = hexchars[(brr & 0xf0000000) >> 28];
1452 *ptr++ = hexchars[hx >> 4]; *ptr++ = hexchars[hx & 0xf];
1453 hx = hexchars[(brr & 0x0f000000) >> 24];
1454 *ptr++ = hexchars[hx >> 4]; *ptr++ = hexchars[hx & 0xf];
1455 hx = hexchars[(brr & 0x00f00000) >> 20];
1456 *ptr++ = hexchars[hx >> 4]; *ptr++ = hexchars[hx & 0xf];
1457 hx = hexchars[(brr & 0x000f0000) >> 16];
1458 *ptr++ = hexchars[hx >> 4]; *ptr++ = hexchars[hx & 0xf];
1459 hx = hexchars[(brr & 0x0000f000) >> 12];
1460 *ptr++ = hexchars[hx >> 4]; *ptr++ = hexchars[hx & 0xf];
1461 hx = hexchars[(brr & 0x00000f00) >> 8];
1462 *ptr++ = hexchars[hx >> 4]; *ptr++ = hexchars[hx & 0xf];
1463 hx = hexchars[(brr & 0x000000f0) >> 4];
1464 *ptr++ = hexchars[hx >> 4]; *ptr++ = hexchars[hx & 0xf];
1465 hx = hexchars[(brr & 0x0000000f)];
1466 *ptr++ = hexchars[hx >> 4]; *ptr++ = hexchars[hx & 0xf];
1467
1468 ptr = mem2hex(crlf, ptr, sizeof(crlf) - 1, 0);
1469 *ptr = 0;
1470 gdbstub_send_packet(output_buffer); /* send it off... */
1471 }
1472
1473 LEDS(0x5005);
1474
1475 /* tell the debugger that an exception has occurred */
1476 ptr = output_buffer;
1477
1478 /* Send trap type (converted to signal) */
1479 *ptr++ = 'T';
1480 *ptr++ = hexchars[sigval >> 4];
1481 *ptr++ = hexchars[sigval & 0xf];
1482
1483 /* Send Error PC */
1484 *ptr++ = hexchars[GDB_REG_PC >> 4];
1485 *ptr++ = hexchars[GDB_REG_PC & 0xf];
1486 *ptr++ = ':';
1487 ptr = mem2hex(&__debug_frame->pc, ptr, 4, 0);
1488 *ptr++ = ';';
1489
1490 /*
1491 * Send frame pointer
1492 */
1493 *ptr++ = hexchars[GDB_REG_FP >> 4];
1494 *ptr++ = hexchars[GDB_REG_FP & 0xf];
1495 *ptr++ = ':';
1496 ptr = mem2hex(&__debug_frame->fp, ptr, 4, 0);
1497 *ptr++ = ';';
1498
1499 /*
1500 * Send stack pointer
1501 */
1502 *ptr++ = hexchars[GDB_REG_SP >> 4];
1503 *ptr++ = hexchars[GDB_REG_SP & 0xf];
1504 *ptr++ = ':';
1505 ptr = mem2hex(&__debug_frame->sp, ptr, 4, 0);
1506 *ptr++ = ';';
1507
1508 *ptr++ = 0;
1509 gdbstub_send_packet(output_buffer); /* send it off... */
1510
1511 LEDS(0x5006);
1512
1513 packet_waiting:
1514 gdbstub_get_mmu_state();
1515
1516 /* wait for input from remote GDB */
1517 while (1) {
1518 output_buffer[0] = 0;
1519
1520 LEDS(0x5007);
1521 gdbstub_recv_packet(input_buffer);
1522 LEDS(0x5600 | input_buffer[0]);
1523
1524 switch (input_buffer[0]) {
1525 /* request repeat of last signal number */
1526 case '?':
1527 output_buffer[0] = 'S';
1528 output_buffer[1] = hexchars[sigval >> 4];
1529 output_buffer[2] = hexchars[sigval & 0xf];
1530 output_buffer[3] = 0;
1531 break;
1532
1533 case 'd':
1534 /* toggle debug flag */
1535 break;
1536
1537 /* return the value of the CPU registers
1538 * - GR0, GR1, GR2, GR3, GR4, GR5, GR6, GR7,
1539 * - GR8, GR9, GR10, GR11, GR12, GR13, GR14, GR15,
1540 * - GR16, GR17, GR18, GR19, GR20, GR21, GR22, GR23,
1541 * - GR24, GR25, GR26, GR27, GR28, GR29, GR30, GR31,
1542 * - GR32, GR33, GR34, GR35, GR36, GR37, GR38, GR39,
1543 * - GR40, GR41, GR42, GR43, GR44, GR45, GR46, GR47,
1544 * - GR48, GR49, GR50, GR51, GR52, GR53, GR54, GR55,
1545 * - GR56, GR57, GR58, GR59, GR60, GR61, GR62, GR63,
1546 * - FP0, FP1, FP2, FP3, FP4, FP5, FP6, FP7,
1547 * - FP8, FP9, FP10, FP11, FP12, FP13, FP14, FP15,
1548 * - FP16, FP17, FP18, FP19, FP20, FP21, FP22, FP23,
1549 * - FP24, FP25, FP26, FP27, FP28, FP29, FP30, FP31,
1550 * - FP32, FP33, FP34, FP35, FP36, FP37, FP38, FP39,
1551 * - FP40, FP41, FP42, FP43, FP44, FP45, FP46, FP47,
1552 * - FP48, FP49, FP50, FP51, FP52, FP53, FP54, FP55,
1553 * - FP56, FP57, FP58, FP59, FP60, FP61, FP62, FP63,
1554 * - PC, PSR, CCR, CCCR,
1555 * - _X132, _X133, _X134
1556 * - TBR, BRR, DBAR0, DBAR1, DBAR2, DBAR3,
1557 * - _X141, _X142, _X143, _X144,
1558 * - LR, LCR
1559 */
1560 case 'g':
1561 zero = 0;
1562 ptr = output_buffer;
1563
1564 /* deal with GR0, GR1-GR27, GR28-GR31, GR32-GR63 */
1565 ptr = mem2hex(&zero, ptr, 4, 0);
1566
1567 for (loop = 1; loop <= 27; loop++)
1568 ptr = mem2hex((unsigned long *)__debug_frame + REG_GR(loop),
1569 ptr, 4, 0);
1570 temp = (unsigned long) __frame;
1571 ptr = mem2hex(&temp, ptr, 4, 0);
1572 ptr = mem2hex((unsigned long *)__debug_frame + REG_GR(29), ptr, 4, 0);
1573 ptr = mem2hex((unsigned long *)__debug_frame + REG_GR(30), ptr, 4, 0);
1574#ifdef CONFIG_MMU
1575 ptr = mem2hex((unsigned long *)__debug_frame + REG_GR(31), ptr, 4, 0);
1576#else
1577 temp = (unsigned long) __debug_frame;
1578 ptr = mem2hex(&temp, ptr, 4, 0);
1579#endif
1580
1581 for (loop = 32; loop <= 63; loop++)
1582 ptr = mem2hex((unsigned long *)__debug_frame + REG_GR(loop),
1583 ptr, 4, 0);
1584
1585 /* deal with FR0-FR63 */
1586 for (loop = 0; loop <= 63; loop++)
1587 ptr = mem2hex((unsigned long *)&__break_user_context +
1588 __FPMEDIA_FR(loop),
1589 ptr, 4, 0);
1590
1591 /* deal with special registers */
1592 ptr = mem2hex(&__debug_frame->pc, ptr, 4, 0);
1593 ptr = mem2hex(&__debug_frame->psr, ptr, 4, 0);
1594 ptr = mem2hex(&__debug_frame->ccr, ptr, 4, 0);
1595 ptr = mem2hex(&__debug_frame->cccr, ptr, 4, 0);
1596 ptr = mem2hex(&zero, ptr, 4, 0);
1597 ptr = mem2hex(&zero, ptr, 4, 0);
1598 ptr = mem2hex(&zero, ptr, 4, 0);
1599 ptr = mem2hex(&__debug_frame->tbr, ptr, 4, 0);
1600 ptr = mem2hex(&__debug_regs->brr , ptr, 4, 0);
1601
1602 asm volatile("movsg dbar0,%0" : "=r"(dbar));
1603 ptr = mem2hex(&dbar, ptr, 4, 0);
1604 asm volatile("movsg dbar1,%0" : "=r"(dbar));
1605 ptr = mem2hex(&dbar, ptr, 4, 0);
1606 asm volatile("movsg dbar2,%0" : "=r"(dbar));
1607 ptr = mem2hex(&dbar, ptr, 4, 0);
1608 asm volatile("movsg dbar3,%0" : "=r"(dbar));
1609 ptr = mem2hex(&dbar, ptr, 4, 0);
1610
1611 asm volatile("movsg scr0,%0" : "=r"(dbar));
1612 ptr = mem2hex(&dbar, ptr, 4, 0);
1613 asm volatile("movsg scr1,%0" : "=r"(dbar));
1614 ptr = mem2hex(&dbar, ptr, 4, 0);
1615 asm volatile("movsg scr2,%0" : "=r"(dbar));
1616 ptr = mem2hex(&dbar, ptr, 4, 0);
1617 asm volatile("movsg scr3,%0" : "=r"(dbar));
1618 ptr = mem2hex(&dbar, ptr, 4, 0);
1619
1620 ptr = mem2hex(&__debug_frame->lr, ptr, 4, 0);
1621 ptr = mem2hex(&__debug_frame->lcr, ptr, 4, 0);
1622
1623 ptr = mem2hex(&__debug_frame->iacc0, ptr, 8, 0);
1624
1625 ptr = mem2hex(&__break_user_context.f.fsr[0], ptr, 4, 0);
1626
1627 for (loop = 0; loop <= 7; loop++)
1628 ptr = mem2hex(&__break_user_context.f.acc[loop], ptr, 4, 0);
1629
1630 ptr = mem2hex(&__break_user_context.f.accg, ptr, 8, 0);
1631
1632 for (loop = 0; loop <= 1; loop++)
1633 ptr = mem2hex(&__break_user_context.f.msr[loop], ptr, 4, 0);
1634
1635 ptr = mem2hex(&__debug_frame->gner0, ptr, 4, 0);
1636 ptr = mem2hex(&__debug_frame->gner1, ptr, 4, 0);
1637
1638 ptr = mem2hex(&__break_user_context.f.fner[0], ptr, 4, 0);
1639 ptr = mem2hex(&__break_user_context.f.fner[1], ptr, 4, 0);
1640
1641 break;
1642
1643 /* set the values of the CPU registers */
1644 case 'G':
1645 ptr = &input_buffer[1];
1646
1647 /* deal with GR0, GR1-GR27, GR28-GR31, GR32-GR63 */
1648 ptr = hex2mem(ptr, &temp, 4);
1649
1650 for (loop = 1; loop <= 27; loop++)
1651 ptr = hex2mem(ptr, (unsigned long *)__debug_frame + REG_GR(loop),
1652 4);
1653
1654 ptr = hex2mem(ptr, &temp, 4);
1655 __frame = (struct pt_regs *) temp;
1656 ptr = hex2mem(ptr, &__debug_frame->gr29, 4);
1657 ptr = hex2mem(ptr, &__debug_frame->gr30, 4);
1658#ifdef CONFIG_MMU
1659 ptr = hex2mem(ptr, &__debug_frame->gr31, 4);
1660#else
1661 ptr = hex2mem(ptr, &temp, 4);
1662#endif
1663
1664 for (loop = 32; loop <= 63; loop++)
1665 ptr = hex2mem(ptr, (unsigned long *)__debug_frame + REG_GR(loop),
1666 4);
1667
1668 /* deal with FR0-FR63 */
1669 for (loop = 0; loop <= 63; loop++)
1670 ptr = mem2hex((unsigned long *)&__break_user_context +
1671 __FPMEDIA_FR(loop),
1672 ptr, 4, 0);
1673
1674 /* deal with special registers */
1675 ptr = hex2mem(ptr, &__debug_frame->pc, 4);
1676 ptr = hex2mem(ptr, &__debug_frame->psr, 4);
1677 ptr = hex2mem(ptr, &__debug_frame->ccr, 4);
1678 ptr = hex2mem(ptr, &__debug_frame->cccr,4);
1679
1680 for (loop = 132; loop <= 140; loop++)
1681 ptr = hex2mem(ptr, &temp, 4);
1682
1683 ptr = hex2mem(ptr, &temp, 4);
1684 asm volatile("movgs %0,scr0" :: "r"(temp));
1685 ptr = hex2mem(ptr, &temp, 4);
1686 asm volatile("movgs %0,scr1" :: "r"(temp));
1687 ptr = hex2mem(ptr, &temp, 4);
1688 asm volatile("movgs %0,scr2" :: "r"(temp));
1689 ptr = hex2mem(ptr, &temp, 4);
1690 asm volatile("movgs %0,scr3" :: "r"(temp));
1691
1692 ptr = hex2mem(ptr, &__debug_frame->lr, 4);
1693 ptr = hex2mem(ptr, &__debug_frame->lcr, 4);
1694
1695 ptr = hex2mem(ptr, &__debug_frame->iacc0, 8);
1696
1697 ptr = hex2mem(ptr, &__break_user_context.f.fsr[0], 4);
1698
1699 for (loop = 0; loop <= 7; loop++)
1700 ptr = hex2mem(ptr, &__break_user_context.f.acc[loop], 4);
1701
1702 ptr = hex2mem(ptr, &__break_user_context.f.accg, 8);
1703
1704 for (loop = 0; loop <= 1; loop++)
1705 ptr = hex2mem(ptr, &__break_user_context.f.msr[loop], 4);
1706
1707 ptr = hex2mem(ptr, &__debug_frame->gner0, 4);
1708 ptr = hex2mem(ptr, &__debug_frame->gner1, 4);
1709
1710 ptr = hex2mem(ptr, &__break_user_context.f.fner[0], 4);
1711 ptr = hex2mem(ptr, &__break_user_context.f.fner[1], 4);
1712
1713 gdbstub_strcpy(output_buffer,"OK");
1714 break;
1715
1716 /* mAA..AA,LLLL Read LLLL bytes at address AA..AA */
1717 case 'm':
1718 ptr = &input_buffer[1];
1719
1720 if (hexToInt(&ptr, &addr) &&
1721 *ptr++ == ',' &&
1722 hexToInt(&ptr, &length)
1723 ) {
1724 if (mem2hex((char *)addr, output_buffer, length, 1))
1725 break;
1726 gdbstub_strcpy (output_buffer, "E03");
1727 }
1728 else {
1729 gdbstub_strcpy(output_buffer,"E01");
1730 }
1731 break;
1732
1733 /* MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK */
1734 case 'M':
1735 ptr = &input_buffer[1];
1736
1737 if (hexToInt(&ptr, &addr) &&
1738 *ptr++ == ',' &&
1739 hexToInt(&ptr, &length) &&
1740 *ptr++ == ':'
1741 ) {
1742 if (hex2mem(ptr, (char *)addr, length)) {
1743 gdbstub_strcpy(output_buffer, "OK");
1744 }
1745 else {
1746 gdbstub_strcpy(output_buffer, "E03");
1747 }
1748 }
1749 else
1750 gdbstub_strcpy(output_buffer, "E02");
1751
1752 flush_cache = 1;
1753 break;
1754
1755 /* PNN,=RRRRRRRR: Write value R to reg N return OK */
1756 case 'P':
1757 ptr = &input_buffer[1];
1758
1759 if (!hexToInt(&ptr, &addr) ||
1760 *ptr++ != '=' ||
1761 !hexToInt(&ptr, &temp)
1762 ) {
1763 gdbstub_strcpy(output_buffer, "E01");
1764 break;
1765 }
1766
1767 temp2 = 1;
1768 switch (addr) {
1769 case GDB_REG_GR(0):
1770 break;
1771 case GDB_REG_GR(1) ... GDB_REG_GR(63):
1772 __break_user_context.i.gr[addr - GDB_REG_GR(0)] = temp;
1773 break;
1774 case GDB_REG_FR(0) ... GDB_REG_FR(63):
1775 __break_user_context.f.fr[addr - GDB_REG_FR(0)] = temp;
1776 break;
1777 case GDB_REG_PC:
1778 __break_user_context.i.pc = temp;
1779 break;
1780 case GDB_REG_PSR:
1781 __break_user_context.i.psr = temp;
1782 break;
1783 case GDB_REG_CCR:
1784 __break_user_context.i.ccr = temp;
1785 break;
1786 case GDB_REG_CCCR:
1787 __break_user_context.i.cccr = temp;
1788 break;
1789 case GDB_REG_BRR:
1790 __debug_regs->brr = temp;
1791 break;
1792 case GDB_REG_LR:
1793 __break_user_context.i.lr = temp;
1794 break;
1795 case GDB_REG_LCR:
1796 __break_user_context.i.lcr = temp;
1797 break;
1798 case GDB_REG_FSR0:
1799 __break_user_context.f.fsr[0] = temp;
1800 break;
1801 case GDB_REG_ACC(0) ... GDB_REG_ACC(7):
1802 __break_user_context.f.acc[addr - GDB_REG_ACC(0)] = temp;
1803 break;
1804 case GDB_REG_ACCG(0):
1805 *(uint32_t *) &__break_user_context.f.accg[0] = temp;
1806 break;
1807 case GDB_REG_ACCG(4):
1808 *(uint32_t *) &__break_user_context.f.accg[4] = temp;
1809 break;
1810 case GDB_REG_MSR(0) ... GDB_REG_MSR(1):
1811 __break_user_context.f.msr[addr - GDB_REG_MSR(0)] = temp;
1812 break;
1813 case GDB_REG_GNER(0) ... GDB_REG_GNER(1):
1814 __break_user_context.i.gner[addr - GDB_REG_GNER(0)] = temp;
1815 break;
1816 case GDB_REG_FNER(0) ... GDB_REG_FNER(1):
1817 __break_user_context.f.fner[addr - GDB_REG_FNER(0)] = temp;
1818 break;
1819 default:
1820 temp2 = 0;
1821 break;
1822 }
1823
1824 if (temp2) {
1825 gdbstub_strcpy(output_buffer, "OK");
1826 }
1827 else {
1828 gdbstub_strcpy(output_buffer, "E02");
1829 }
1830 break;
1831
1832 /* cAA..AA Continue at address AA..AA(optional) */
1833 case 'c':
1834 /* try to read optional parameter, pc unchanged if no parm */
1835 ptr = &input_buffer[1];
1836 if (hexToInt(&ptr, &addr))
1837 __debug_frame->pc = addr;
1838 goto done;
1839
1840 /* kill the program */
1841 case 'k' :
1842 goto done; /* just continue */
1843
1844
1845 /* reset the whole machine (FIXME: system dependent) */
1846 case 'r':
1847 break;
1848
1849
1850 /* step to next instruction */
1851 case 's':
1852 __debug_regs->dcr |= DCR_SE;
1853 goto done;
1854
1855 /* set baud rate (bBB) */
1856 case 'b':
1857 ptr = &input_buffer[1];
1858 if (!hexToInt(&ptr, &temp)) {
1859 gdbstub_strcpy(output_buffer,"B01");
1860 break;
1861 }
1862
1863 if (temp) {
1864 /* ack before changing speed */
1865 gdbstub_send_packet("OK");
1866 gdbstub_set_baud(temp);
1867 }
1868 break;
1869
1870 /* set breakpoint */
1871 case 'Z':
1872 ptr = &input_buffer[1];
1873
1874 if (!hexToInt(&ptr,&temp) || *ptr++ != ',' ||
1875 !hexToInt(&ptr,&addr) || *ptr++ != ',' ||
1876 !hexToInt(&ptr,&length)
1877 ) {
1878 gdbstub_strcpy(output_buffer,"E01");
1879 break;
1880 }
1881
1882 if (temp >= 5) {
1883 gdbstub_strcpy(output_buffer,"E03");
1884 break;
1885 }
1886
1887 if (gdbstub_set_breakpoint(temp, addr, length) < 0) {
1888 gdbstub_strcpy(output_buffer,"E03");
1889 break;
1890 }
1891
1892 if (temp == 0)
1893 flush_cache = 1; /* soft bkpt by modified memory */
1894
1895 gdbstub_strcpy(output_buffer,"OK");
1896 break;
1897
1898 /* clear breakpoint */
1899 case 'z':
1900 ptr = &input_buffer[1];
1901
1902 if (!hexToInt(&ptr,&temp) || *ptr++ != ',' ||
1903 !hexToInt(&ptr,&addr) || *ptr++ != ',' ||
1904 !hexToInt(&ptr,&length)
1905 ) {
1906 gdbstub_strcpy(output_buffer,"E01");
1907 break;
1908 }
1909
1910 if (temp >= 5) {
1911 gdbstub_strcpy(output_buffer,"E03");
1912 break;
1913 }
1914
1915 if (gdbstub_clear_breakpoint(temp, addr, length) < 0) {
1916 gdbstub_strcpy(output_buffer,"E03");
1917 break;
1918 }
1919
1920 if (temp == 0)
1921 flush_cache = 1; /* soft bkpt by modified memory */
1922
1923 gdbstub_strcpy(output_buffer,"OK");
1924 break;
1925
1926 default:
1927 gdbstub_proto("### GDB Unsupported Cmd '%s'\n",input_buffer);
1928 break;
1929 }
1930
1931 /* reply to the request */
1932 LEDS(0x5009);
1933 gdbstub_send_packet(output_buffer);
1934 }
1935
1936 done:
1937 restore_user_regs(&__break_user_context);
1938
1939 //gdbstub_dump_debugregs();
1940 //gdbstub_printk("<-- gdbstub() %08x\n", __debug_frame->pc);
1941
1942 /* need to flush the instruction cache before resuming, as we may have
1943 * deposited a breakpoint, and the icache probably has no way of
1944 * knowing that a data ref to some location may have changed something
1945 * that is in the instruction cache. NB: We flush both caches, just to
1946 * be sure...
1947 */
1948
1949 /* note: flushing the icache will clobber EAR0 on the FR451 */
1950 if (flush_cache)
1951 gdbstub_purge_cache();
1952
1953 LEDS(0x5666);
1954
1955} /* end gdbstub() */
1956
1957/*****************************************************************************/
1958/*
1959 * initialise the GDB stub
1960 */
1961void __init gdbstub_init(void)
1962{
1963#ifdef CONFIG_GDBSTUB_IMMEDIATE
1964 unsigned char ch;
1965 int ret;
1966#endif
1967
1968 gdbstub_printk("%s", gdbstub_banner);
1969 gdbstub_printk("DCR: %x\n", __debug_regs->dcr);
1970
1971 gdbstub_io_init();
1972
1973 /* try to talk to GDB (or anyone insane enough to want to type GDB protocol by hand) */
1974 gdbstub_proto("### GDB Tx ACK\n");
1975 gdbstub_tx_char('+'); /* 'hello world' */
1976
1977#ifdef CONFIG_GDBSTUB_IMMEDIATE
1978 gdbstub_printk("GDB Stub waiting for packet\n");
1979
1980 /*
1981 * In case GDB is started before us, ack any packets
1982 * (presumably "$?#xx") sitting there.
1983 */
1984 do { gdbstub_rx_char(&ch, 0); } while (ch != '$');
1985 do { gdbstub_rx_char(&ch, 0); } while (ch != '#');
1986 do { ret = gdbstub_rx_char(&ch, 0); } while (ret != 0); /* eat first csum byte */
1987 do { ret = gdbstub_rx_char(&ch, 0); } while (ret != 0); /* eat second csum byte */
1988
1989 gdbstub_proto("### GDB Tx NAK\n");
1990 gdbstub_tx_char('-'); /* nak it */
1991
1992#else
1993 gdbstub_printk("GDB Stub set\n");
1994#endif
1995
1996#if 0
1997 /* send banner */
1998 ptr = output_buffer;
1999 *ptr++ = 'O';
2000 ptr = mem2hex(gdbstub_banner, ptr, sizeof(gdbstub_banner) - 1, 0);
2001 gdbstub_send_packet(output_buffer);
2002#endif
2003#if defined(CONFIG_GDBSTUB_CONSOLE) && defined(CONFIG_GDBSTUB_IMMEDIATE)
2004 register_console(&gdbstub_console);
2005#endif
2006
2007} /* end gdbstub_init() */
2008
2009/*****************************************************************************/
2010/*
2011 * register the console at a more appropriate time
2012 */
2013#if defined (CONFIG_GDBSTUB_CONSOLE) && !defined(CONFIG_GDBSTUB_IMMEDIATE)
2014static int __init gdbstub_postinit(void)
2015{
2016 printk("registering console\n");
2017 register_console(&gdbstub_console);
2018 return 0;
2019} /* end gdbstub_postinit() */
2020
2021__initcall(gdbstub_postinit);
2022#endif
2023
2024/*****************************************************************************/
2025/*
2026 * send an exit message to GDB
2027 */
2028void gdbstub_exit(int status)
2029{
2030 unsigned char checksum;
2031 int count;
2032 unsigned char ch;
2033
2034 sprintf(output_buffer,"W%02x",status&0xff);
2035
2036 gdbstub_tx_char('$');
2037 checksum = 0;
2038 count = 0;
2039
2040 while ((ch = output_buffer[count]) != 0) {
2041 gdbstub_tx_char(ch);
2042 checksum += ch;
2043 count += 1;
2044 }
2045
2046 gdbstub_tx_char('#');
2047 gdbstub_tx_char(hexchars[checksum >> 4]);
2048 gdbstub_tx_char(hexchars[checksum & 0xf]);
2049
2050 /* make sure the output is flushed, or else RedBoot might clobber it */
2051 gdbstub_tx_char('-');
2052 gdbstub_tx_flush();
2053
2054} /* end gdbstub_exit() */
2055
2056/*****************************************************************************/
2057/*
2058 * GDB wants to call malloc() and free() to allocate memory for calling kernel
2059 * functions directly from its command line
2060 */
2061static void *malloc(size_t size) __attribute__((unused));
2062static void *malloc(size_t size)
2063{
2064 return kmalloc(size, GFP_ATOMIC);
2065}
2066
2067static void free(void *p) __attribute__((unused));
2068static void free(void *p)
2069{
2070 kfree(p);
2071}
2072
2073static uint32_t ___get_HSR0(void) __attribute__((unused));
2074static uint32_t ___get_HSR0(void)
2075{
2076 return __get_HSR(0);
2077}
2078
2079static uint32_t ___set_HSR0(uint32_t x) __attribute__((unused));
2080static uint32_t ___set_HSR0(uint32_t x)
2081{
2082 __set_HSR(0, x);
2083 return __get_HSR(0);
2084}