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 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/asm-offsets.h>
128 #include <asm/pgtable.h>
129 #include <asm/system.h>
130 #include <asm/gdb-stub.h>
131 
132 #define LEDS(x) do { /* *(u32*)0xe1200004 = ~(x); mb(); */ } while(0)
133 
134 #undef GDBSTUB_DEBUG_PROTOCOL
135 
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);
138 
139 extern volatile uint32_t __break_error_detect[3]; /* ESFR1, ESR15, EAR15 */
140 
141 struct __debug_amr {
142 	unsigned long L, P;
143 } __attribute__((aligned(8)));
144 
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;
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 
161 static 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 
171 static const char gdbstub_banner[] = "Linux/FR-V GDB Stub (c) RedHat 2003\n";
172 
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;
178 
179 /* set with GDB whilst running to permit step through exceptions */
180 extern volatile u32 __attribute__((section(".bss"))) gdbstub_trace_through_exceptions;
181 
182 static char	input_buffer[BUFMAX];
183 static char	output_buffer[BUFMAX];
184 
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"
198 };
199 
200 struct gdbstub_bkpt {
201 	unsigned long	addr;		/* address of breakpoint */
202 	unsigned	len;		/* size of breakpoint */
203 	uint32_t	originsns[7];	/* original instructions */
204 };
205 
206 static struct gdbstub_bkpt gdbstub_bkpts[256];
207 
208 /*
209  * local prototypes
210  */
211 
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);
219 
220 /*
221  * Convert ch from a hex digit to an int
222  */
hex(unsigned char ch)223 static int hex(unsigned char ch)
224 {
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;
232 }
233 
gdbstub_printk(const char * fmt,...)234 void gdbstub_printk(const char *fmt, ...)
235 {
236 	static char buf[1024];
237 	va_list args;
238 	int len;
239 
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);
245 }
246 
gdbstub_strcpy(char * dst,const char * src)247 static inline char *gdbstub_strcpy(char *dst, const char *src)
248 {
249 	int loop = 0;
250 	while ((dst[loop] = src[loop]))
251 	       loop++;
252 	return dst;
253 }
254 
gdbstub_purge_cache(void)255 static void gdbstub_purge_cache(void)
256 {
257 	asm volatile("	dcef	@(gr0,gr0),#1	\n"
258 		     "	icei	@(gr0,gr0),#1	\n"
259 		     "	membar			\n"
260 		     "	bar			\n"
261 		     );
262 }
263 
264 /*****************************************************************************/
265 /*
266  * scan for the sequence $<data>#<checksum>
267  */
gdbstub_recv_packet(char * buffer)268 static void gdbstub_recv_packet(char *buffer)
269 {
270 	unsigned char checksum;
271 	unsigned char xmitcsum;
272 	unsigned char ch;
273 	int count, i, ret, error;
274 
275 	for (;;) {
276 		/* wait around for the start character, ignore all other characters */
277 		do {
278 			gdbstub_rx_char(&ch, 0);
279 		} while (ch != '$');
280 
281 		checksum = 0;
282 		xmitcsum = -1;
283 		count = 0;
284 		error = 0;
285 
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;
291 
292 			if (ch == '#')
293 				break;
294 			checksum += ch;
295 			buffer[count] = ch;
296 			count++;
297 		}
298 
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;
304 		}
305 
306 		if (count >= BUFMAX || error)
307 			continue;
308 
309 		buffer[count] = 0;
310 
311 		/* read the checksum */
312 		ret = gdbstub_rx_char(&ch, 0);
313 		if (ret < 0)
314 			error = ret;
315 		xmitcsum = hex(ch) << 4;
316 
317 		ret = gdbstub_rx_char(&ch, 0);
318 		if (ret < 0)
319 			error = ret;
320 		xmitcsum |= hex(ch);
321 
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;
328 		}
329 
330 		/* check the checksum */
331 		if (checksum != xmitcsum) {
332 			gdbstub_proto("### GDB Tx NAK\n");
333 			gdbstub_tx_char('-');	/* failed checksum */
334 			continue;
335 		}
336 
337 		gdbstub_proto("### GDB Rx '$%s#%02x' ###\n", buffer, checksum);
338 		gdbstub_proto("### GDB Tx ACK\n");
339 		gdbstub_tx_char('+'); /* successful transfer */
340 
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]);
345 
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];
351 		}
352 
353 		break;
354 	}
355 } /* end gdbstub_recv_packet() */
356 
357 /*****************************************************************************/
358 /*
359  * send the packet in buffer.
360  * - return 0 if successfully ACK'd
361  * - return 1 if abandoned due to new incoming packet
362  */
gdbstub_send_packet(char * buffer)363 static int gdbstub_send_packet(char *buffer)
364 {
365 	unsigned char checksum;
366 	int count;
367 	unsigned char ch;
368 
369 	/* $<packet info>#<checksum> */
370 	gdbstub_proto("### GDB Tx '%s' ###\n", buffer);
371 
372 	do {
373 		gdbstub_tx_char('$');
374 		checksum = 0;
375 		count = 0;
376 
377 		while ((ch = buffer[count]) != 0) {
378 			gdbstub_tx_char(ch);
379 			checksum += ch;
380 			count += 1;
381 		}
382 
383 		gdbstub_tx_char('#');
384 		gdbstub_tx_char(hex_asc_hi(checksum));
385 		gdbstub_tx_char(hex_asc_lo(checksum));
386 
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!='$');
393 
394 	if (ch=='+') {
395 		gdbstub_proto("### GDB Rx ACK\n");
396 		return 0;
397 	}
398 
399 	gdbstub_proto("### GDB Tx Abandoned\n");
400 	gdbstub_rx_unget = ch;
401 	return 1;
402 } /* end gdbstub_send_packet() */
403 
404 /*
405  * While we find nice hex chars, build an int.
406  * Return number of chars processed.
407  */
hexToInt(char ** ptr,unsigned long * _value)408 static int hexToInt(char **ptr, unsigned long *_value)
409 {
410 	int count = 0, ch;
411 
412 	*_value = 0;
413 	while (**ptr) {
414 		ch = hex(**ptr);
415 		if (ch < 0)
416 			break;
417 
418 		*_value = (*_value << 4) | ((uint8_t) ch & 0xf);
419 		count++;
420 
421 		(*ptr)++;
422 	}
423 
424 	return count;
425 }
426 
427 /*****************************************************************************/
428 /*
429  * probe an address to see whether it maps to anything
430  */
gdbstub_addr_probe(const void * vaddr)431 static inline int gdbstub_addr_probe(const void *vaddr)
432 {
433 #ifdef CONFIG_MMU
434 	unsigned long paddr;
435 
436 	asm("lrad %1,%0,#1,#0,#0" : "=r"(paddr) : "r"(vaddr));
437 	if (!(paddr & xAMPRx_V))
438 		return 0;
439 #endif
440 
441 	return 1;
442 } /* end gdbstub_addr_probe() */
443 
444 #ifdef CONFIG_MMU
445 static unsigned long __saved_dampr, __saved_damlr;
446 
gdbstub_virt_to_pte(unsigned long vaddr)447 static inline unsigned long gdbstub_virt_to_pte(unsigned long vaddr)
448 {
449 	pgd_t *pgd;
450 	pud_t *pud;
451 	pmd_t *pmd;
452 	pte_t *pte;
453 	unsigned long val, dampr5;
454 
455 	pgd = (pgd_t *) __get_DAMLR(3) + pgd_index(vaddr);
456 	pud = pud_offset(pgd, vaddr);
457 	pmd = pmd_offset(pud, vaddr);
458 
459 	if (pmd_bad(*pmd) || !pmd_present(*pmd))
460 		return 0;
461 
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);
466 
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;
473 
474 	/* restore original dampr5 */
475 	__set_DAMPR(5, dampr5);
476 
477 	return val;
478 }
479 #endif
480 
gdbstub_addr_map(const void * vaddr)481 static inline int gdbstub_addr_map(const void *vaddr)
482 {
483 #ifdef CONFIG_MMU
484 	unsigned long pte;
485 
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;
497 	}
498 #endif
499 	return 0;
500 }
501 
gdbstub_addr_unmap(void)502 static inline void gdbstub_addr_unmap(void)
503 {
504 #ifdef CONFIG_MMU
505 	__set_DAMPR(2, __saved_dampr);
506 	__set_DAMLR(2, __saved_damlr);
507 #endif
508 }
509 
510 /*
511  * access potentially dodgy memory through a potentially dodgy pointer
512  */
gdbstub_read_dword(const void * addr,uint32_t * _res)513 static inline int gdbstub_read_dword(const void *addr, uint32_t *_res)
514 {
515 	unsigned long brr;
516 	uint32_t res;
517 
518 	if (!gdbstub_addr_map(addr))
519 		return 0;
520 
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);
529 }
530 
gdbstub_write_dword(void * addr,uint32_t val)531 static inline int gdbstub_write_dword(void *addr, uint32_t val)
532 {
533 	unsigned long brr;
534 
535 	if (!gdbstub_addr_map(addr))
536 		return 0;
537 
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);
545 }
546 
gdbstub_read_word(const void * addr,uint16_t * _res)547 static inline int gdbstub_read_word(const void *addr, uint16_t *_res)
548 {
549 	unsigned long brr;
550 	uint16_t res;
551 
552 	if (!gdbstub_addr_map(addr))
553 		return 0;
554 
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);
563 }
564 
gdbstub_write_word(void * addr,uint16_t val)565 static inline int gdbstub_write_word(void *addr, uint16_t val)
566 {
567 	unsigned long brr;
568 
569 	if (!gdbstub_addr_map(addr))
570 		return 0;
571 
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);
579 }
580 
gdbstub_read_byte(const void * addr,uint8_t * _res)581 static inline int gdbstub_read_byte(const void *addr, uint8_t *_res)
582 {
583 	unsigned long brr;
584 	uint8_t res;
585 
586 	if (!gdbstub_addr_map(addr))
587 		return 0;
588 
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);
597 }
598 
gdbstub_write_byte(void * addr,uint8_t val)599 static inline int gdbstub_write_byte(void *addr, uint8_t val)
600 {
601 	unsigned long brr;
602 
603 	if (!gdbstub_addr_map(addr))
604 		return 0;
605 
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);
613 }
614 
__gdbstub_console_write(struct console * co,const char * p,unsigned n)615 static void __gdbstub_console_write(struct console *co, const char *p, unsigned n)
616 {
617 	char outbuf[26];
618 	int qty;
619 
620 	outbuf[0] = 'O';
621 
622 	while (n > 0) {
623 		qty = 1;
624 
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';
631 			}
632 			p++;
633 			n--;
634 		}
635 
636 		outbuf[qty] = 0;
637 		gdbstub_send_packet(outbuf);
638 	}
639 }
640 
641 #if 0
642 void debug_to_serial(const char *p, int n)
643 {
644 	gdbstub_console_write(NULL,p,n);
645 }
646 #endif
647 
648 #ifdef CONFIG_GDB_CONSOLE
649 
650 static struct console gdbstub_console = {
651 	.name	= "gdb",
652 	.write	= gdbstub_console_write,	/* in break.S */
653 	.flags	= CON_PRINTBUFFER,
654 	.index	= -1,
655 };
656 
657 #endif
658 
659 /*****************************************************************************/
660 /*
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.
666  */
mem2hex(const void * _mem,char * buf,int count,int may_fault)667 static unsigned char *mem2hex(const void *_mem, char *buf, int count, int may_fault)
668 {
669 	const uint8_t *mem = _mem;
670 	uint8_t ch[4] __attribute__((aligned(4)));
671 
672 	if ((uint32_t)mem&1 && count>=1) {
673 		if (!gdbstub_read_byte(mem,ch))
674 			return NULL;
675 		buf = pack_hex_byte(buf, ch[0]);
676 		mem++;
677 		count--;
678 	}
679 
680 	if ((uint32_t)mem&3 && count>=2) {
681 		if (!gdbstub_read_word(mem,(uint16_t *)ch))
682 			return NULL;
683 		buf = pack_hex_byte(buf, ch[0]);
684 		buf = pack_hex_byte(buf, ch[1]);
685 		mem += 2;
686 		count -= 2;
687 	}
688 
689 	while (count>=4) {
690 		if (!gdbstub_read_dword(mem,(uint32_t *)ch))
691 			return NULL;
692 		buf = pack_hex_byte(buf, ch[0]);
693 		buf = pack_hex_byte(buf, ch[1]);
694 		buf = pack_hex_byte(buf, ch[2]);
695 		buf = pack_hex_byte(buf, ch[3]);
696 		mem += 4;
697 		count -= 4;
698 	}
699 
700 	if (count>=2) {
701 		if (!gdbstub_read_word(mem,(uint16_t *)ch))
702 			return NULL;
703 		buf = pack_hex_byte(buf, ch[0]);
704 		buf = pack_hex_byte(buf, ch[1]);
705 		mem += 2;
706 		count -= 2;
707 	}
708 
709 	if (count>=1) {
710 		if (!gdbstub_read_byte(mem,ch))
711 			return NULL;
712 		buf = pack_hex_byte(buf, ch[0]);
713 	}
714 
715 	*buf = 0;
716 
717 	return buf;
718 } /* end mem2hex() */
719 
720 /*****************************************************************************/
721 /*
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
724  */
hex2mem(const char * buf,void * _mem,int count)725 static char *hex2mem(const char *buf, void *_mem, int count)
726 {
727 	uint8_t *mem = _mem;
728 	union {
729 		uint32_t l;
730 		uint16_t w;
731 		uint8_t  b[4];
732 	} ch;
733 
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--;
741 	}
742 
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;
752 	}
753 
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;
767 	}
768 
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;
778 	}
779 
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;
785 	}
786 
787 	return (char *) buf;
788 } /* end hex2mem() */
789 
790 /*****************************************************************************/
791 /*
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.
796  */
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 */
822 };
823 
824 /*****************************************************************************/
825 /*
826  * convert the FRV BRR register contents into a UNIX signal number
827  */
gdbstub_compute_signal(unsigned long brr)828 static inline int gdbstub_compute_signal(unsigned long brr)
829 {
830 	const struct brr_to_sig_map *map;
831 	unsigned long tbr = (brr & BRR_EBTT) >> 12;
832 
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;
837 
838 	return map->signo;
839 } /* end gdbstub_compute_signal() */
840 
841 /*****************************************************************************/
842 /*
843  * set a software breakpoint or a hardware breakpoint or watchpoint
844  */
gdbstub_set_breakpoint(unsigned long type,unsigned long addr,unsigned long len)845 static int gdbstub_set_breakpoint(unsigned long type, unsigned long addr, unsigned long len)
846 {
847 	unsigned long tmp;
848 	int bkpt, loop, xloop;
849 
850 	union {
851 		struct {
852 			unsigned long mask0, mask1;
853 		};
854 		uint8_t bytes[8];
855 	} dbmr;
856 
857 	//gdbstub_printk("setbkpt(%ld,%08lx,%ld)\n", type, addr, len);
858 
859 	switch (type) {
860 		/* set software breakpoint */
861 	case 0:
862 		if (addr & 3 || len > 7*4)
863 			return -EINVAL;
864 
865 		for (bkpt = 255; bkpt >= 0; bkpt--)
866 			if (!gdbstub_bkpts[bkpt].addr)
867 				break;
868 		if (bkpt < 0)
869 			return -ENOSPC;
870 
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;
875 
876 		for (loop = 0; loop < len/4; loop++)
877 			if (!gdbstub_write_dword(&((uint32_t *) addr)[loop],
878 						 BREAK_INSN)
879 			    ) {
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;
885 			}
886 
887 		gdbstub_bkpts[bkpt].addr = addr;
888 		gdbstub_bkpts[bkpt].len = len;
889 
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]
899 			       );
900 #endif
901 		return 0;
902 
903 		/* set hardware breakpoint */
904 	case 1:
905 		if (addr & 3 || len != 4)
906 			return -EINVAL;
907 
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;
914 		}
915 
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;
922 		}
923 
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;
930 		}
931 
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;
938 		}
939 
940 		return -ENOSPC;
941 
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;
948 
949 		tmp = addr & 7;
950 
951 		memset(dbmr.bytes, 0xff, sizeof(dbmr.bytes));
952 		for (loop = 0; loop < len; loop++)
953 			dbmr.bytes[tmp + loop] = 0;
954 
955 		addr &= ~7;
956 
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;
960 
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;
967 
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;
975 		}
976 
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;
980 
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;
987 
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  */
gdbstub_clear_breakpoint(unsigned long type,unsigned long addr,unsigned long len)1009 int 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 			__debug_regs->ibar[0] = 0;
1051 			asm volatile("movgs gr0,ibar0");
1052 			return 0;
1053 		}
1054 
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;
1061 		}
1062 
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;
1069 		}
1070 
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;
1077 		}
1078 
1079 		return -EINVAL;
1080 
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;
1087 
1088 		tmp = addr & 7;
1089 
1090 		memset(dbmr.bytes, 0xff, sizeof(dbmr.bytes));
1091 		for (loop = 0; loop < len; loop++)
1092 			dbmr.bytes[tmp + loop] = 0;
1093 
1094 		addr &= ~7;
1095 
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; })
1099 
1100 		/* consider DBAR 0 */
1101 		tmp = type==2 ? DCR_DWBE0 : type==3 ? DCR_DRBE0 : DCR_DRBE0|DCR_DWBE0;
1102 
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;
1108 
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;
1116 
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;
1123 
1124 	skip_dbar0:
1125 		/* consider DBAR 0 */
1126 		tmp = type==2 ? DCR_DWBE1 : type==3 ? DCR_DRBE1 : DCR_DRBE1|DCR_DWBE1;
1127 
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;
1133 
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;
1141 
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;
1148 
1149 	skip_dbar1:
1150 		return -ENOSPC;
1151 
1152 	default:
1153 		return -EINVAL;
1154 	}
1155 } /* end gdbstub_clear_breakpoint() */
1156 
1157 /*****************************************************************************/
1158 /*
1159  * check a for an internal software breakpoint, and wind the PC back if necessary
1160  */
gdbstub_check_breakpoint(void)1161 static void gdbstub_check_breakpoint(void)
1162 {
1163 	unsigned long addr = __debug_frame->pc - 4;
1164 	int bkpt;
1165 
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;
1171 
1172 	//gdbstub_printk("alter pc [%d] %08lx\n", bkpt, __debug_frame->pc);
1173 
1174 } /* end gdbstub_check_breakpoint() */
1175 
1176 /*****************************************************************************/
1177 /*
1178  *
1179  */
gdbstub_show_regs(void)1180 static void __maybe_unused gdbstub_show_regs(void)
1181 {
1182 	unsigned long *reg;
1183 	int loop;
1184 
1185 	gdbstub_printk("\n");
1186 
1187 	gdbstub_printk("Frame: @%p [%s]\n",
1188 		       __debug_frame,
1189 		       __debug_frame->psr & PSR_S ? "kernel" : "user");
1190 
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]);
1194 
1195 		if (loop == NR_PT_REGS - 1 || loop % 5 == 4)
1196 			printk("\n");
1197 		else
1198 			printk(" | ");
1199 	}
1200 
1201 	gdbstub_printk("Process %s (pid: %d)\n", current->comm, current->pid);
1202 } /* end gdbstub_show_regs() */
1203 
1204 /*****************************************************************************/
1205 /*
1206  * dump debugging regs
1207  */
gdbstub_dump_debugregs(void)1208 static void __maybe_unused gdbstub_dump_debugregs(void)
1209 {
1210 	gdbstub_printk("DCR    %08lx  ", __debug_status.dcr);
1211 	gdbstub_printk("BRR    %08lx\n", __debug_status.brr);
1212 
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));
1217 
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));
1221 
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));
1225 
1226 	gdbstub_printk("\n");
1227 } /* end gdbstub_dump_debugregs() */
1228 
1229 /*****************************************************************************/
1230 /*
1231  * dump the MMU state into a structure so that it can be accessed with GDB
1232  */
gdbstub_get_mmu_state(void)1233 void gdbstub_get_mmu_state(void)
1234 {
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));
1240 
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);
1274 
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);
1307 
1308 #ifdef CONFIG_MMU
1309 	do {
1310 		/* read the DAT entries from the TLB */
1311 		struct __debug_amr *p;
1312 		int loop;
1313 
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));
1318 
1319 		p = __debug_mmu.tlb;
1320 
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++;
1328 		}
1329 
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++;
1337 		}
1338 
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
1344 
1345 } /* end gdbstub_get_mmu_state() */
1346 
1347 /*
1348  * handle general query commands of the form 'qXXXXX'
1349  */
gdbstub_handle_query(void)1350 static void gdbstub_handle_query(void)
1351 {
1352 	if (strcmp(input_buffer, "qAttached") == 0) {
1353 		/* return current thread ID */
1354 		sprintf(output_buffer, "1");
1355 		return;
1356 	}
1357 
1358 	if (strcmp(input_buffer, "qC") == 0) {
1359 		/* return current thread ID */
1360 		sprintf(output_buffer, "QC 0");
1361 		return;
1362 	}
1363 
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;
1368 	}
1369 
1370 	if (strcmp(input_buffer, "qSymbol::") == 0) {
1371 		sprintf(output_buffer, "OK");
1372 		return;
1373 	}
1374 
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;
1380 	}
1381 
1382 	gdbstub_strcpy(output_buffer,"E01");
1383 }
1384 
1385 /*****************************************************************************/
1386 /*
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
1393  */
gdbstub(int sigval)1394 void gdbstub(int sigval)
1395 {
1396 	unsigned long addr, length, loop, dbar, temp, temp2, temp3;
1397 	uint32_t zero;
1398 	char *ptr;
1399 	int flush_cache = 0;
1400 
1401 	LEDS(0x5000);
1402 
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
1410 	}
1411 
1412 	save_user_regs(&__debug_frame0->uc);
1413 
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
1422 
1423 	LEDS(0x5001);
1424 
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
1428 	 */
1429 	temp = (unsigned long) __entry_kerneltrap_table;
1430 	temp2 = (unsigned long) __entry_usertrap_table;
1431 	temp3 = __debug_frame->pc & ~15;
1432 
1433 	if (temp3 == temp + TBR_TT_INTERRUPT_15 ||
1434 	    temp3 == temp2 + TBR_TT_INTERRUPT_15
1435 	    ) {
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;
1444 	}
1445 
1446 	/* handle the decrement timer going off (FR451 only) */
1447 	if (temp3 == temp + TBR_TT_DECREMENT_TIMER ||
1448 	    temp3 == temp2 + TBR_TT_DECREMENT_TIMER
1449 	    ) {
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;
1459 	}
1460 
1461 	LEDS(0x5002);
1462 
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();
1466 
1467 	LEDS(0x5003);
1468 
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;
1475 	}
1476 
1477 	if (gdbstub_rx_unget) {
1478 		sigval = SIGINT;
1479 		goto packet_waiting;
1480 	}
1481 
1482 	if (!sigval)
1483 		sigval = gdbstub_compute_signal(__debug_status.brr);
1484 
1485 	LEDS(0x5004);
1486 
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)
1489 	 */
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;
1495 
1496 		ptr = output_buffer;
1497 		*ptr++ = 'O';
1498 		ptr = mem2hex(title, ptr, sizeof(title) - 1,0);
1499 
1500 		hx = hex_asc_hi(brr >> 24);
1501 		ptr = pack_hex_byte(ptr, hx);
1502 		hx = hex_asc_lo(brr >> 24);
1503 		ptr = pack_hex_byte(ptr, hx);
1504 		hx = hex_asc_hi(brr >> 16);
1505 		ptr = pack_hex_byte(ptr, hx);
1506 		hx = hex_asc_lo(brr >> 16);
1507 		ptr = pack_hex_byte(ptr, hx);
1508 		hx = hex_asc_hi(brr >> 8);
1509 		ptr = pack_hex_byte(ptr, hx);
1510 		hx = hex_asc_lo(brr >> 8);
1511 		ptr = pack_hex_byte(ptr, hx);
1512 		hx = hex_asc_hi(brr);
1513 		ptr = pack_hex_byte(ptr, hx);
1514 		hx = hex_asc_lo(brr);
1515 		ptr = pack_hex_byte(ptr, hx);
1516 
1517 		ptr = mem2hex(crlf, ptr, sizeof(crlf) - 1, 0);
1518 		*ptr = 0;
1519 		gdbstub_send_packet(output_buffer);	/* send it off... */
1520 	}
1521 
1522 	LEDS(0x5005);
1523 
1524 	/* tell the debugger that an exception has occurred */
1525 	ptr = output_buffer;
1526 
1527 	/* Send trap type (converted to signal) */
1528 	*ptr++ = 'T';
1529 	ptr = pack_hex_byte(ptr, sigval);
1530 
1531 	/* Send Error PC */
1532 	ptr = pack_hex_byte(ptr, GDB_REG_PC);
1533 	*ptr++ = ':';
1534 	ptr = mem2hex(&__debug_frame->pc, ptr, 4, 0);
1535 	*ptr++ = ';';
1536 
1537 	/*
1538 	 * Send frame pointer
1539 	 */
1540 	ptr = pack_hex_byte(ptr, GDB_REG_FP);
1541 	*ptr++ = ':';
1542 	ptr = mem2hex(&__debug_frame->fp, ptr, 4, 0);
1543 	*ptr++ = ';';
1544 
1545 	/*
1546 	 * Send stack pointer
1547 	 */
1548 	ptr = pack_hex_byte(ptr, GDB_REG_SP);
1549 	*ptr++ = ':';
1550 	ptr = mem2hex(&__debug_frame->sp, ptr, 4, 0);
1551 	*ptr++ = ';';
1552 
1553 	*ptr++ = 0;
1554 	gdbstub_send_packet(output_buffer);	/* send it off... */
1555 
1556 	LEDS(0x5006);
1557 
1558  packet_waiting:
1559 	gdbstub_get_mmu_state();
1560 
1561 	/* wait for input from remote GDB */
1562 	while (1) {
1563 		output_buffer[0] = 0;
1564 
1565 		LEDS(0x5007);
1566 		gdbstub_recv_packet(input_buffer);
1567 		LEDS(0x5600 | input_buffer[0]);
1568 
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;
1577 
1578 		case 'd':
1579 			/* toggle debug flag */
1580 			break;
1581 
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
1604 			 */
1605 		case 'g':
1606 			zero = 0;
1607 			ptr = output_buffer;
1608 
1609 			/* deal with GR0, GR1-GR27, GR28-GR31, GR32-GR63 */
1610 			ptr = mem2hex(&zero, ptr, 4, 0);
1611 
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
1624 
1625 			for (loop = 32; loop <= 63; loop++)
1626 				ptr = mem2hex(&__debug_user_context->i.gr[loop], ptr, 4, 0);
1627 
1628 			/* deal with FR0-FR63 */
1629 			for (loop = 0; loop <= 63; loop++)
1630 				ptr = mem2hex(&__debug_user_context->f.fr[loop], ptr, 4, 0);
1631 
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);
1642 
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);
1651 
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);
1660 
1661 			ptr = mem2hex(&__debug_frame->lr, ptr, 4, 0);
1662 			ptr = mem2hex(&__debug_frame->lcr, ptr, 4, 0);
1663 
1664 			ptr = mem2hex(&__debug_frame->iacc0, ptr, 8, 0);
1665 
1666 			ptr = mem2hex(&__debug_user_context->f.fsr[0], ptr, 4, 0);
1667 
1668 			for (loop = 0; loop <= 7; loop++)
1669 				ptr = mem2hex(&__debug_user_context->f.acc[loop], ptr, 4, 0);
1670 
1671 			ptr = mem2hex(&__debug_user_context->f.accg, ptr, 8, 0);
1672 
1673 			for (loop = 0; loop <= 1; loop++)
1674 				ptr = mem2hex(&__debug_user_context->f.msr[loop], ptr, 4, 0);
1675 
1676 			ptr = mem2hex(&__debug_frame->gner0, ptr, 4, 0);
1677 			ptr = mem2hex(&__debug_frame->gner1, ptr, 4, 0);
1678 
1679 			ptr = mem2hex(&__debug_user_context->f.fner[0], ptr, 4, 0);
1680 			ptr = mem2hex(&__debug_user_context->f.fner[1], ptr, 4, 0);
1681 
1682 			break;
1683 
1684 			/* set the values of the CPU registers */
1685 		case 'G':
1686 			ptr = &input_buffer[1];
1687 
1688 			/* deal with GR0, GR1-GR27, GR28-GR31, GR32-GR63 */
1689 			ptr = hex2mem(ptr, &temp, 4);
1690 
1691 			for (loop = 1; loop <= 27; loop++)
1692 				ptr = hex2mem(ptr, &__debug_user_context->i.gr[loop], 4);
1693 
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
1703 
1704 			for (loop = 32; loop <= 63; loop++)
1705 				ptr = hex2mem(ptr, &__debug_user_context->i.gr[loop], 4);
1706 
1707 			/* deal with FR0-FR63 */
1708 			for (loop = 0; loop <= 63; loop++)
1709 				ptr = mem2hex(&__debug_user_context->f.fr[loop], ptr, 4, 0);
1710 
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);
1716 
1717 			for (loop = 132; loop <= 140; loop++)
1718 				ptr = hex2mem(ptr, &temp, 4);
1719 
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));
1728 
1729 			ptr = hex2mem(ptr, &__debug_frame->lr,  4);
1730 			ptr = hex2mem(ptr, &__debug_frame->lcr, 4);
1731 
1732 			ptr = hex2mem(ptr, &__debug_frame->iacc0, 8);
1733 
1734 			ptr = hex2mem(ptr, &__debug_user_context->f.fsr[0], 4);
1735 
1736 			for (loop = 0; loop <= 7; loop++)
1737 				ptr = hex2mem(ptr, &__debug_user_context->f.acc[loop], 4);
1738 
1739 			ptr = hex2mem(ptr, &__debug_user_context->f.accg, 8);
1740 
1741 			for (loop = 0; loop <= 1; loop++)
1742 				ptr = hex2mem(ptr, &__debug_user_context->f.msr[loop], 4);
1743 
1744 			ptr = hex2mem(ptr, &__debug_frame->gner0, 4);
1745 			ptr = hex2mem(ptr, &__debug_frame->gner1, 4);
1746 
1747 			ptr = hex2mem(ptr, &__debug_user_context->f.fner[0], 4);
1748 			ptr = hex2mem(ptr, &__debug_user_context->f.fner[1], 4);
1749 
1750 			gdbstub_strcpy(output_buffer,"OK");
1751 			break;
1752 
1753 			/* mAA..AA,LLLL  Read LLLL bytes at address AA..AA */
1754 		case 'm':
1755 			ptr = &input_buffer[1];
1756 
1757 			if (hexToInt(&ptr, &addr) &&
1758 			    *ptr++ == ',' &&
1759 			    hexToInt(&ptr, &length)
1760 			    ) {
1761 				if (mem2hex((char *)addr, output_buffer, length, 1))
1762 					break;
1763 				gdbstub_strcpy (output_buffer, "E03");
1764 			}
1765 			else {
1766 				gdbstub_strcpy(output_buffer,"E01");
1767 			}
1768 			break;
1769 
1770 			/* MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK */
1771 		case 'M':
1772 			ptr = &input_buffer[1];
1773 
1774 			if (hexToInt(&ptr, &addr) &&
1775 			    *ptr++ == ',' &&
1776 			    hexToInt(&ptr, &length) &&
1777 			    *ptr++ == ':'
1778 			    ) {
1779 				if (hex2mem(ptr, (char *)addr, length)) {
1780 					gdbstub_strcpy(output_buffer, "OK");
1781 				}
1782 				else {
1783 					gdbstub_strcpy(output_buffer, "E03");
1784 				}
1785 			}
1786 			else
1787 				gdbstub_strcpy(output_buffer, "E02");
1788 
1789 			flush_cache = 1;
1790 			break;
1791 
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;
1797 
1798 			/* PNN,=RRRRRRRR: Write value R to reg N return OK */
1799 		case 'P':
1800 			ptr = &input_buffer[1];
1801 
1802 			if (!hexToInt(&ptr, &addr) ||
1803 			    *ptr++ != '=' ||
1804 			    !hexToInt(&ptr, &temp)
1805 			    ) {
1806 				gdbstub_strcpy(output_buffer, "E01");
1807 				break;
1808 			}
1809 
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;
1865 			}
1866 
1867 			if (temp2) {
1868 				gdbstub_strcpy(output_buffer, "OK");
1869 			}
1870 			else {
1871 				gdbstub_strcpy(output_buffer, "E02");
1872 			}
1873 			break;
1874 
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;
1882 
1883 			/* kill the program */
1884 		case 'k' :
1885 			goto done;	/* just continue */
1886 
1887 			/* detach */
1888 		case 'D':
1889 			gdbstub_strcpy(output_buffer, "OK");
1890 			break;
1891 
1892 			/* reset the whole machine (FIXME: system dependent) */
1893 		case 'r':
1894 			break;
1895 
1896 
1897 			/* step to next instruction */
1898 		case 's':
1899 			__debug_regs->dcr |= DCR_SE;
1900 			__debug_status.dcr |= DCR_SE;
1901 			goto done;
1902 
1903 			/* extended command */
1904 		case 'v':
1905 			if (strcmp(input_buffer, "vCont?") == 0) {
1906 				output_buffer[0] = 0;
1907 				break;
1908 			}
1909 			goto unsupported_cmd;
1910 
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;
1917 			}
1918 
1919 			if (temp) {
1920 				/* ack before changing speed */
1921 				gdbstub_send_packet("OK");
1922 				gdbstub_set_baud(temp);
1923 			}
1924 			break;
1925 
1926 			/* set breakpoint */
1927 		case 'Z':
1928 			ptr = &input_buffer[1];
1929 
1930 			if (!hexToInt(&ptr,&temp) || *ptr++ != ',' ||
1931 			    !hexToInt(&ptr,&addr) || *ptr++ != ',' ||
1932 			    !hexToInt(&ptr,&length)
1933 			    ) {
1934 				gdbstub_strcpy(output_buffer,"E01");
1935 				break;
1936 			}
1937 
1938 			if (temp >= 5) {
1939 				gdbstub_strcpy(output_buffer,"E03");
1940 				break;
1941 			}
1942 
1943 			if (gdbstub_set_breakpoint(temp, addr, length) < 0) {
1944 				gdbstub_strcpy(output_buffer,"E03");
1945 				break;
1946 			}
1947 
1948 			if (temp == 0)
1949 				flush_cache = 1; /* soft bkpt by modified memory */
1950 
1951 			gdbstub_strcpy(output_buffer,"OK");
1952 			break;
1953 
1954 			/* clear breakpoint */
1955 		case 'z':
1956 			ptr = &input_buffer[1];
1957 
1958 			if (!hexToInt(&ptr,&temp) || *ptr++ != ',' ||
1959 			    !hexToInt(&ptr,&addr) || *ptr++ != ',' ||
1960 			    !hexToInt(&ptr,&length)
1961 			    ) {
1962 				gdbstub_strcpy(output_buffer,"E01");
1963 				break;
1964 			}
1965 
1966 			if (temp >= 5) {
1967 				gdbstub_strcpy(output_buffer,"E03");
1968 				break;
1969 			}
1970 
1971 			if (gdbstub_clear_breakpoint(temp, addr, length) < 0) {
1972 				gdbstub_strcpy(output_buffer,"E03");
1973 				break;
1974 			}
1975 
1976 			if (temp == 0)
1977 				flush_cache = 1; /* soft bkpt by modified memory */
1978 
1979 			gdbstub_strcpy(output_buffer,"OK");
1980 			break;
1981 
1982 			/* Thread-setting packet */
1983 		case 'H':
1984 			gdbstub_strcpy(output_buffer, "OK");
1985 			break;
1986 
1987 		case 'q':
1988 			gdbstub_handle_query();
1989 			break;
1990 
1991 		default:
1992 		unsupported_cmd:
1993 			gdbstub_proto("### GDB Unsupported Cmd '%s'\n",input_buffer);
1994 			gdbstub_strcpy(output_buffer,"E01");
1995 			break;
1996 		}
1997 
1998 		/* reply to the request */
1999 		LEDS(0x5009);
2000 		gdbstub_send_packet(output_buffer);
2001 	}
2002 
2003  done:
2004 	restore_user_regs(&__debug_frame0->uc);
2005 
2006 	//gdbstub_dump_debugregs();
2007 	//gdbstub_printk("<-- gdbstub() %08x\n", __debug_frame->pc);
2008 
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...
2014 	 */
2015 
2016 	/* note: flushing the icache will clobber EAR0 on the FR451 */
2017 	if (flush_cache)
2018 		gdbstub_purge_cache();
2019 
2020 	LEDS(0x5666);
2021 
2022 } /* end gdbstub() */
2023 
2024 /*****************************************************************************/
2025 /*
2026  * initialise the GDB stub
2027  */
gdbstub_init(void)2028 void __init gdbstub_init(void)
2029 {
2030 #ifdef CONFIG_GDBSTUB_IMMEDIATE
2031 	unsigned char ch;
2032 	int ret;
2033 #endif
2034 
2035 	gdbstub_printk("%s", gdbstub_banner);
2036 
2037 	gdbstub_io_init();
2038 
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' */
2042 
2043 #ifdef CONFIG_GDBSTUB_IMMEDIATE
2044 	gdbstub_printk("GDB Stub waiting for packet\n");
2045 
2046 	/*
2047 	 * In case GDB is started before us, ack any packets
2048 	 * (presumably "$?#xx") sitting there.
2049 	 */
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 */
2054 
2055 	gdbstub_proto("### GDB Tx NAK\n");
2056 	gdbstub_tx_char('-'); /* nak it */
2057 
2058 #else
2059 	gdbstub_printk("GDB Stub set\n");
2060 #endif
2061 
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
2072 
2073 } /* end gdbstub_init() */
2074 
2075 /*****************************************************************************/
2076 /*
2077  * register the console at a more appropriate time
2078  */
2079 #if defined (CONFIG_GDB_CONSOLE) && !defined(CONFIG_GDBSTUB_IMMEDIATE)
gdbstub_postinit(void)2080 static int __init gdbstub_postinit(void)
2081 {
2082 	printk("registering console\n");
2083 	register_console(&gdbstub_console);
2084 	return 0;
2085 } /* end gdbstub_postinit() */
2086 
2087 __initcall(gdbstub_postinit);
2088 #endif
2089 
2090 /*****************************************************************************/
2091 /*
2092  * send an exit message to GDB
2093  */
gdbstub_exit(int status)2094 void gdbstub_exit(int status)
2095 {
2096 	unsigned char checksum;
2097 	int count;
2098 	unsigned char ch;
2099 
2100 	sprintf(output_buffer,"W%02x",status&0xff);
2101 
2102 	gdbstub_tx_char('$');
2103 	checksum = 0;
2104 	count = 0;
2105 
2106 	while ((ch = output_buffer[count]) != 0) {
2107 		gdbstub_tx_char(ch);
2108 		checksum += ch;
2109 		count += 1;
2110 	}
2111 
2112 	gdbstub_tx_char('#');
2113 	gdbstub_tx_char(hex_asc_hi(checksum));
2114 	gdbstub_tx_char(hex_asc_lo(checksum));
2115 
2116 	/* make sure the output is flushed, or else RedBoot might clobber it */
2117 	gdbstub_tx_char('-');
2118 	gdbstub_tx_flush();
2119 
2120 } /* end gdbstub_exit() */
2121 
2122 /*****************************************************************************/
2123 /*
2124  * GDB wants to call malloc() and free() to allocate memory for calling kernel
2125  * functions directly from its command line
2126  */
2127 static void *malloc(size_t size) __maybe_unused;
malloc(size_t size)2128 static void *malloc(size_t size)
2129 {
2130 	return kmalloc(size, GFP_ATOMIC);
2131 }
2132 
2133 static void free(void *p) __maybe_unused;
free(void * p)2134 static void free(void *p)
2135 {
2136 	kfree(p);
2137 }
2138 
2139 static uint32_t ___get_HSR0(void) __maybe_unused;
___get_HSR0(void)2140 static uint32_t ___get_HSR0(void)
2141 {
2142 	return __get_HSR(0);
2143 }
2144 
2145 static uint32_t ___set_HSR0(uint32_t x) __maybe_unused;
___set_HSR0(uint32_t x)2146 static uint32_t ___set_HSR0(uint32_t x)
2147 {
2148 	__set_HSR(0, x);
2149 	return __get_HSR(0);
2150 }
2151