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