License cleanup: add SPDX GPL-2.0 license identifier to files with no license
[linux-block.git] / arch / mn10300 / kernel / gdb-stub.c
CommitLineData
b2441318 1// SPDX-License-Identifier: GPL-2.0
b920de1b
DH
2/* MN10300 GDB stub
3 *
4 * Originally written by Glenn Engel, Lake Stevens Instrument Division
5 *
6 * Contributed by HP Systems
7 *
8 * Modified for SPARC by Stu Grossman, Cygnus Support.
9 *
10 * Modified for Linux/MIPS (and MIPS in general) by Andreas Busse
11 * Send complaints, suggestions etc. to <andy@waldorf-gmbh.de>
12 *
13 * Copyright (C) 1995 Andreas Busse
14 *
15 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
16 * Modified for Linux/mn10300 by David Howells <dhowells@redhat.com>
17 */
18
19/*
20 * To enable debugger support, two things need to happen. One, a
21 * call to set_debug_traps() is necessary in order to allow any breakpoints
22 * or error conditions to be properly intercepted and reported to gdb.
23 * Two, a breakpoint needs to be generated to begin communication. This
24 * is most easily accomplished by a call to breakpoint(). Breakpoint()
25 * simulates a breakpoint by executing a BREAK instruction.
26 *
27 *
28 * The following gdb commands are supported:
29 *
30 * command function Return value
31 *
32 * g return the value of the CPU registers hex data or ENN
33 * G set the value of the CPU registers OK or ENN
34 *
35 * mAA..AA,LLLL Read LLLL bytes at address AA..AA hex data or ENN
36 * MAA..AA,LLLL: Write LLLL bytes at address AA.AA OK or ENN
37 *
38 * c Resume at current address SNN ( signal NN)
39 * cAA..AA Continue at address AA..AA SNN
40 *
41 * s Step one instruction SNN
42 * sAA..AA Step one instruction from AA..AA SNN
43 *
44 * k kill
45 *
46 * ? What was the last sigval ? SNN (signal NN)
47 *
48 * bBB..BB Set baud rate to BB..BB OK or BNN, then sets
49 * baud rate
50 *
51 * All commands and responses are sent with a packet which includes a
52 * checksum. A packet consists of
53 *
54 * $<packet info>#<checksum>.
55 *
56 * where
57 * <packet info> :: <characters representing the command or response>
58 * <checksum> :: < two hex digits computed as modulo 256 sum of <packetinfo>>
59 *
60 * When a packet is received, it is first acknowledged with either '+' or '-'.
61 * '+' indicates a successful transfer. '-' indicates a failed transfer.
62 *
63 * Example:
64 *
65 * Host: Reply:
66 * $m0,10#2a +$00010203040506070809101112131415#42
67 *
68 *
69 * ==============
70 * MORE EXAMPLES:
71 * ==============
72 *
73 * For reference -- the following are the steps that one
74 * company took (RidgeRun Inc) to get remote gdb debugging
75 * going. In this scenario the host machine was a PC and the
76 * target platform was a Galileo EVB64120A MIPS evaluation
77 * board.
78 *
79 * Step 1:
80 * First download gdb-5.0.tar.gz from the internet.
81 * and then build/install the package.
82 *
83 * Example:
84 * $ tar zxf gdb-5.0.tar.gz
85 * $ cd gdb-5.0
86 * $ ./configure --target=am33_2.0-linux-gnu
87 * $ make
88 * $ install
89 * am33_2.0-linux-gnu-gdb
90 *
91 * Step 2:
92 * Configure linux for remote debugging and build it.
93 *
94 * Example:
95 * $ cd ~/linux
96 * $ make menuconfig <go to "Kernel Hacking" and turn on remote debugging>
97 * $ make dep; make vmlinux
98 *
99 * Step 3:
100 * Download the kernel to the remote target and start
101 * the kernel running. It will promptly halt and wait
102 * for the host gdb session to connect. It does this
103 * since the "Kernel Hacking" option has defined
104 * CONFIG_REMOTE_DEBUG which in turn enables your calls
105 * to:
106 * set_debug_traps();
107 * breakpoint();
108 *
109 * Step 4:
110 * Start the gdb session on the host.
111 *
112 * Example:
113 * $ am33_2.0-linux-gnu-gdb vmlinux
114 * (gdb) set remotebaud 115200
115 * (gdb) target remote /dev/ttyS1
116 * ...at this point you are connected to
117 * the remote target and can use gdb
118 * in the normal fasion. Setting
119 * breakpoints, single stepping,
120 * printing variables, etc.
121 *
122 */
123
124#include <linux/string.h>
125#include <linux/kernel.h>
126#include <linux/signal.h>
127#include <linux/sched.h>
128#include <linux/mm.h>
129#include <linux/console.h>
130#include <linux/init.h>
131#include <linux/bug.h>
132
133#include <asm/pgtable.h>
b920de1b
DH
134#include <asm/gdb-stub.h>
135#include <asm/exceptions.h>
7f386ac3 136#include <asm/debugger.h>
b920de1b
DH
137#include <asm/serial-regs.h>
138#include <asm/busctl-regs.h>
2f2a2132
DH
139#include <unit/leds.h>
140#include <unit/serial.h>
b920de1b
DH
141
142/* define to use F7F7 rather than FF which is subverted by JTAG debugger */
143#undef GDBSTUB_USE_F7F7_AS_BREAKPOINT
144
145/*
146 * BUFMAX defines the maximum number of characters in inbound/outbound buffers
147 * at least NUMREGBYTES*2 are needed for register packets
148 */
149#define BUFMAX 2048
150
151static const char gdbstub_banner[] =
152 "Linux/MN10300 GDB Stub (c) RedHat 2007\n";
153
154u8 gdbstub_rx_buffer[PAGE_SIZE] __attribute__((aligned(PAGE_SIZE)));
155u32 gdbstub_rx_inp;
156u32 gdbstub_rx_outp;
157u8 gdbstub_busy;
158u8 gdbstub_rx_overflow;
159u8 gdbstub_rx_unget;
160
161static u8 gdbstub_flush_caches;
162static char input_buffer[BUFMAX];
163static char output_buffer[BUFMAX];
164static char trans_buffer[BUFMAX];
165
b920de1b
DH
166struct gdbstub_bkpt {
167 u8 *addr; /* address of breakpoint */
168 u8 len; /* size of breakpoint */
169 u8 origbytes[7]; /* original bytes */
170};
171
172static struct gdbstub_bkpt gdbstub_bkpts[256];
173
174/*
175 * local prototypes
176 */
177static void getpacket(char *buffer);
178static int putpacket(char *buffer);
179static int computeSignal(enum exception_code excep);
180static int hex(unsigned char ch);
181static int hexToInt(char **ptr, int *intValue);
182static unsigned char *mem2hex(const void *mem, char *buf, int count,
183 int may_fault);
184static const char *hex2mem(const char *buf, void *_mem, int count,
185 int may_fault);
186
187/*
188 * Convert ch from a hex digit to an int
189 */
190static int hex(unsigned char ch)
191{
192 if (ch >= 'a' && ch <= 'f')
193 return ch - 'a' + 10;
194 if (ch >= '0' && ch <= '9')
195 return ch - '0';
196 if (ch >= 'A' && ch <= 'F')
197 return ch - 'A' + 10;
198 return -1;
199}
200
201#ifdef CONFIG_GDBSTUB_DEBUGGING
202
203void debug_to_serial(const char *p, int n)
204{
205 __debug_to_serial(p, n);
206 /* gdbstub_console_write(NULL, p, n); */
207}
208
209void gdbstub_printk(const char *fmt, ...)
210{
211 va_list args;
212 int len;
213
214 /* Emit the output into the temporary buffer */
215 va_start(args, fmt);
216 len = vsnprintf(trans_buffer, sizeof(trans_buffer), fmt, args);
217 va_end(args);
218 debug_to_serial(trans_buffer, len);
219}
220
221#endif
222
223static inline char *gdbstub_strcpy(char *dst, const char *src)
224{
225 int loop = 0;
226 while ((dst[loop] = src[loop]))
227 loop++;
228 return dst;
229}
230
231/*
232 * scan for the sequence $<data>#<checksum>
233 */
234static void getpacket(char *buffer)
235{
236 unsigned char checksum;
237 unsigned char xmitcsum;
238 unsigned char ch;
239 int count, i, ret, error;
240
241 for (;;) {
242 /*
243 * wait around for the start character,
244 * ignore all other characters
245 */
246 do {
247 gdbstub_io_rx_char(&ch, 0);
248 } while (ch != '$');
249
250 checksum = 0;
251 xmitcsum = -1;
252 count = 0;
253 error = 0;
254
255 /*
256 * now, read until a # or end of buffer is found
257 */
258 while (count < BUFMAX) {
259 ret = gdbstub_io_rx_char(&ch, 0);
260 if (ret < 0)
261 error = ret;
262
263 if (ch == '#')
264 break;
265 checksum += ch;
266 buffer[count] = ch;
267 count++;
268 }
269
270 if (error == -EIO) {
271 gdbstub_proto("### GDB Rx Error - Skipping packet"
272 " ###\n");
273 gdbstub_proto("### GDB Tx NAK\n");
274 gdbstub_io_tx_char('-');
275 continue;
276 }
277
278 if (count >= BUFMAX || error)
279 continue;
280
281 buffer[count] = 0;
282
283 /* read the checksum */
284 ret = gdbstub_io_rx_char(&ch, 0);
285 if (ret < 0)
286 error = ret;
287 xmitcsum = hex(ch) << 4;
288
289 ret = gdbstub_io_rx_char(&ch, 0);
290 if (ret < 0)
291 error = ret;
292 xmitcsum |= hex(ch);
293
294 if (error) {
295 if (error == -EIO)
296 gdbstub_io("### GDB Rx Error -"
297 " Skipping packet\n");
298 gdbstub_io("### GDB Tx NAK\n");
299 gdbstub_io_tx_char('-');
300 continue;
301 }
302
303 /* check the checksum */
304 if (checksum != xmitcsum) {
305 gdbstub_io("### GDB Tx NAK\n");
306 gdbstub_io_tx_char('-'); /* failed checksum */
307 continue;
308 }
309
310 gdbstub_proto("### GDB Rx '$%s#%02x' ###\n", buffer, checksum);
311 gdbstub_io("### GDB Tx ACK\n");
312 gdbstub_io_tx_char('+'); /* successful transfer */
313
314 /*
315 * if a sequence char is present,
316 * reply the sequence ID
317 */
318 if (buffer[2] == ':') {
319 gdbstub_io_tx_char(buffer[0]);
320 gdbstub_io_tx_char(buffer[1]);
321
322 /*
323 * remove sequence chars from buffer
324 */
325 count = 0;
326 while (buffer[count])
327 count++;
328 for (i = 3; i <= count; i++)
329 buffer[i - 3] = buffer[i];
330 }
331
332 break;
333 }
334}
335
336/*
337 * send the packet in buffer.
338 * - return 0 if successfully ACK'd
339 * - return 1 if abandoned due to new incoming packet
340 */
341static int putpacket(char *buffer)
342{
343 unsigned char checksum;
344 unsigned char ch;
345 int count;
346
347 /*
348 * $<packet info>#<checksum>.
349 */
350 gdbstub_proto("### GDB Tx $'%s'#?? ###\n", buffer);
351
352 do {
353 gdbstub_io_tx_char('$');
354 checksum = 0;
355 count = 0;
356
357 while ((ch = buffer[count]) != 0) {
358 gdbstub_io_tx_char(ch);
359 checksum += ch;
360 count += 1;
361 }
362
363 gdbstub_io_tx_char('#');
26824972
HH
364 gdbstub_io_tx_char(hex_asc_hi(checksum));
365 gdbstub_io_tx_char(hex_asc_lo(checksum));
b920de1b
DH
366
367 } while (gdbstub_io_rx_char(&ch, 0),
368 ch == '-' && (gdbstub_io("### GDB Rx NAK\n"), 0),
369 ch != '-' && ch != '+' &&
370 (gdbstub_io("### GDB Rx ??? %02x\n", ch), 0),
371 ch != '+' && ch != '$');
372
373 if (ch == '+') {
374 gdbstub_io("### GDB Rx ACK\n");
375 return 0;
376 }
377
378 gdbstub_io("### GDB Tx Abandoned\n");
379 gdbstub_rx_unget = ch;
380 return 1;
381}
382
383/*
384 * While we find nice hex chars, build an int.
385 * Return number of chars processed.
386 */
387static int hexToInt(char **ptr, int *intValue)
388{
389 int numChars = 0;
390 int hexValue;
391
392 *intValue = 0;
393
394 while (**ptr) {
395 hexValue = hex(**ptr);
396 if (hexValue < 0)
397 break;
398
399 *intValue = (*intValue << 4) | hexValue;
400 numChars++;
401
402 (*ptr)++;
403 }
404
405 return (numChars);
406}
407
9ee21723 408#ifdef CONFIG_GDBSTUB_ALLOW_SINGLE_STEP
b920de1b
DH
409/*
410 * We single-step by setting breakpoints. When an exception
411 * is handled, we need to restore the instructions hoisted
412 * when the breakpoints were set.
413 *
414 * This is where we save the original instructions.
415 */
416static struct gdb_bp_save {
417 u8 *addr;
418 u8 opcode[2];
419} step_bp[2];
420
421static const unsigned char gdbstub_insn_sizes[256] =
422{
423 /* 1 2 3 4 5 6 7 8 9 a b c d e f */
424 1, 3, 3, 3, 1, 3, 3, 3, 1, 3, 3, 3, 1, 3, 3, 3, /* 0 */
425 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 1 */
426 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, /* 2 */
427 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, /* 3 */
428 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, /* 4 */
429 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, /* 5 */
430 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6 */
431 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 7 */
432 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, /* 8 */
433 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, /* 9 */
434 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, /* a */
435 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, /* b */
436 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 2, /* c */
437 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* d */
438 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* e */
439 0, 2, 2, 2, 2, 2, 2, 4, 0, 3, 0, 4, 0, 6, 7, 1 /* f */
440};
441
442static int __gdbstub_mark_bp(u8 *addr, int ix)
443{
368dd5ac
AT
444 /* vmalloc area */
445 if (((u8 *) VMALLOC_START <= addr) && (addr < (u8 *) VMALLOC_END))
b920de1b 446 goto okay;
368dd5ac
AT
447 /* SRAM, SDRAM */
448 if (((u8 *) 0x80000000UL <= addr) && (addr < (u8 *) 0xa0000000UL))
b920de1b
DH
449 goto okay;
450 return 0;
451
452okay:
453 if (gdbstub_read_byte(addr + 0, &step_bp[ix].opcode[0]) < 0 ||
454 gdbstub_read_byte(addr + 1, &step_bp[ix].opcode[1]) < 0)
455 return 0;
456
457 step_bp[ix].addr = addr;
458 return 1;
459}
460
461static inline void __gdbstub_restore_bp(void)
462{
463#ifdef GDBSTUB_USE_F7F7_AS_BREAKPOINT
464 if (step_bp[0].addr) {
465 gdbstub_write_byte(step_bp[0].opcode[0], step_bp[0].addr + 0);
466 gdbstub_write_byte(step_bp[0].opcode[1], step_bp[0].addr + 1);
467 }
468 if (step_bp[1].addr) {
469 gdbstub_write_byte(step_bp[1].opcode[0], step_bp[1].addr + 0);
470 gdbstub_write_byte(step_bp[1].opcode[1], step_bp[1].addr + 1);
471 }
472#else
473 if (step_bp[0].addr)
474 gdbstub_write_byte(step_bp[0].opcode[0], step_bp[0].addr + 0);
475 if (step_bp[1].addr)
476 gdbstub_write_byte(step_bp[1].opcode[0], step_bp[1].addr + 0);
477#endif
478
479 gdbstub_flush_caches = 1;
480
481 step_bp[0].addr = NULL;
482 step_bp[0].opcode[0] = 0;
483 step_bp[0].opcode[1] = 0;
484 step_bp[1].addr = NULL;
485 step_bp[1].opcode[0] = 0;
486 step_bp[1].opcode[1] = 0;
487}
488
489/*
490 * emulate single stepping by means of breakpoint instructions
491 */
492static int gdbstub_single_step(struct pt_regs *regs)
493{
494 unsigned size;
495 uint32_t x;
496 uint8_t cur, *pc, *sp;
497
498 step_bp[0].addr = NULL;
499 step_bp[0].opcode[0] = 0;
500 step_bp[0].opcode[1] = 0;
501 step_bp[1].addr = NULL;
502 step_bp[1].opcode[0] = 0;
503 step_bp[1].opcode[1] = 0;
504 x = 0;
505
506 pc = (u8 *) regs->pc;
507 sp = (u8 *) (regs + 1);
508 if (gdbstub_read_byte(pc, &cur) < 0)
509 return -EFAULT;
510
511 gdbstub_bkpt("Single Step from %p { %02x }\n", pc, cur);
512
513 gdbstub_flush_caches = 1;
514
515 size = gdbstub_insn_sizes[cur];
516 if (size > 0) {
517 if (!__gdbstub_mark_bp(pc + size, 0))
518 goto fault;
519 } else {
520 switch (cur) {
521 /* Bxx (d8,PC) */
499c59c4 522 case 0xc0 ... 0xca:
b920de1b
DH
523 if (gdbstub_read_byte(pc + 1, (u8 *) &x) < 0)
524 goto fault;
525 if (!__gdbstub_mark_bp(pc + 2, 0))
526 goto fault;
527 if ((x < 0 || x > 2) &&
528 !__gdbstub_mark_bp(pc + (s8) x, 1))
529 goto fault;
530 break;
531
532 /* LXX (d8,PC) */
499c59c4 533 case 0xd0 ... 0xda:
b920de1b
DH
534 if (!__gdbstub_mark_bp(pc + 1, 0))
535 goto fault;
536 if (regs->pc != regs->lar &&
537 !__gdbstub_mark_bp((u8 *) regs->lar, 1))
538 goto fault;
539 break;
540
541 /* SETLB - loads the next for bytes into the LIR
542 * register */
543 case 0xdb:
544 if (!__gdbstub_mark_bp(pc + 1, 0))
545 goto fault;
546 break;
547
548 /* JMP (d16,PC) or CALL (d16,PC) */
549 case 0xcc:
550 case 0xcd:
551 if (gdbstub_read_byte(pc + 1, ((u8 *) &x) + 0) < 0 ||
552 gdbstub_read_byte(pc + 2, ((u8 *) &x) + 1) < 0)
553 goto fault;
554 if (!__gdbstub_mark_bp(pc + (s16) x, 0))
555 goto fault;
556 break;
557
558 /* JMP (d32,PC) or CALL (d32,PC) */
559 case 0xdc:
560 case 0xdd:
561 if (gdbstub_read_byte(pc + 1, ((u8 *) &x) + 0) < 0 ||
562 gdbstub_read_byte(pc + 2, ((u8 *) &x) + 1) < 0 ||
563 gdbstub_read_byte(pc + 3, ((u8 *) &x) + 2) < 0 ||
564 gdbstub_read_byte(pc + 4, ((u8 *) &x) + 3) < 0)
565 goto fault;
566 if (!__gdbstub_mark_bp(pc + (s32) x, 0))
567 goto fault;
568 break;
569
570 /* RETF */
571 case 0xde:
572 if (!__gdbstub_mark_bp((u8 *) regs->mdr, 0))
573 goto fault;
574 break;
575
576 /* RET */
577 case 0xdf:
578 if (gdbstub_read_byte(pc + 2, (u8 *) &x) < 0)
579 goto fault;
580 sp += (s8)x;
581 if (gdbstub_read_byte(sp + 0, ((u8 *) &x) + 0) < 0 ||
582 gdbstub_read_byte(sp + 1, ((u8 *) &x) + 1) < 0 ||
583 gdbstub_read_byte(sp + 2, ((u8 *) &x) + 2) < 0 ||
584 gdbstub_read_byte(sp + 3, ((u8 *) &x) + 3) < 0)
585 goto fault;
586 if (!__gdbstub_mark_bp((u8 *) x, 0))
587 goto fault;
588 break;
589
590 case 0xf0:
591 if (gdbstub_read_byte(pc + 1, &cur) < 0)
592 goto fault;
593
594 if (cur >= 0xf0 && cur <= 0xf7) {
595 /* JMP (An) / CALLS (An) */
596 switch (cur & 3) {
597 case 0: x = regs->a0; break;
598 case 1: x = regs->a1; break;
599 case 2: x = regs->a2; break;
600 case 3: x = regs->a3; break;
601 }
602 if (!__gdbstub_mark_bp((u8 *) x, 0))
603 goto fault;
604 } else if (cur == 0xfc) {
605 /* RETS */
606 if (gdbstub_read_byte(
607 sp + 0, ((u8 *) &x) + 0) < 0 ||
608 gdbstub_read_byte(
609 sp + 1, ((u8 *) &x) + 1) < 0 ||
610 gdbstub_read_byte(
611 sp + 2, ((u8 *) &x) + 2) < 0 ||
612 gdbstub_read_byte(
613 sp + 3, ((u8 *) &x) + 3) < 0)
614 goto fault;
615 if (!__gdbstub_mark_bp((u8 *) x, 0))
616 goto fault;
617 } else if (cur == 0xfd) {
618 /* RTI */
619 if (gdbstub_read_byte(
620 sp + 4, ((u8 *) &x) + 0) < 0 ||
621 gdbstub_read_byte(
622 sp + 5, ((u8 *) &x) + 1) < 0 ||
623 gdbstub_read_byte(
624 sp + 6, ((u8 *) &x) + 2) < 0 ||
625 gdbstub_read_byte(
626 sp + 7, ((u8 *) &x) + 3) < 0)
627 goto fault;
628 if (!__gdbstub_mark_bp((u8 *) x, 0))
629 goto fault;
630 } else {
631 if (!__gdbstub_mark_bp(pc + 2, 0))
632 goto fault;
633 }
634
635 break;
636
637 /* potential 3-byte conditional branches */
638 case 0xf8:
639 if (gdbstub_read_byte(pc + 1, &cur) < 0)
640 goto fault;
641 if (!__gdbstub_mark_bp(pc + 3, 0))
642 goto fault;
643
644 if (cur >= 0xe8 && cur <= 0xeb) {
645 if (gdbstub_read_byte(
646 pc + 2, ((u8 *) &x) + 0) < 0)
647 goto fault;
648 if ((x < 0 || x > 3) &&
649 !__gdbstub_mark_bp(pc + (s8) x, 1))
650 goto fault;
651 }
652 break;
653
654 case 0xfa:
655 if (gdbstub_read_byte(pc + 1, &cur) < 0)
656 goto fault;
657
658 if (cur == 0xff) {
659 /* CALLS (d16,PC) */
660 if (gdbstub_read_byte(
661 pc + 2, ((u8 *) &x) + 0) < 0 ||
662 gdbstub_read_byte(
663 pc + 3, ((u8 *) &x) + 1) < 0)
664 goto fault;
665 if (!__gdbstub_mark_bp(pc + (s16) x, 0))
666 goto fault;
667 } else {
668 if (!__gdbstub_mark_bp(pc + 4, 0))
669 goto fault;
670 }
671 break;
672
673 case 0xfc:
674 if (gdbstub_read_byte(pc + 1, &cur) < 0)
675 goto fault;
676 if (cur == 0xff) {
677 /* CALLS (d32,PC) */
678 if (gdbstub_read_byte(
679 pc + 2, ((u8 *) &x) + 0) < 0 ||
680 gdbstub_read_byte(
681 pc + 3, ((u8 *) &x) + 1) < 0 ||
682 gdbstub_read_byte(
683 pc + 4, ((u8 *) &x) + 2) < 0 ||
684 gdbstub_read_byte(
685 pc + 5, ((u8 *) &x) + 3) < 0)
686 goto fault;
687 if (!__gdbstub_mark_bp(
688 pc + (s32) x, 0))
689 goto fault;
690 } else {
691 if (!__gdbstub_mark_bp(
692 pc + 6, 0))
693 goto fault;
694 }
695 break;
696
697 }
698 }
699
700 gdbstub_bkpt("Step: %02x at %p; %02x at %p\n",
701 step_bp[0].opcode[0], step_bp[0].addr,
702 step_bp[1].opcode[0], step_bp[1].addr);
703
704 if (step_bp[0].addr) {
705#ifdef GDBSTUB_USE_F7F7_AS_BREAKPOINT
706 if (gdbstub_write_byte(0xF7, step_bp[0].addr + 0) < 0 ||
707 gdbstub_write_byte(0xF7, step_bp[0].addr + 1) < 0)
708 goto fault;
709#else
710 if (gdbstub_write_byte(0xFF, step_bp[0].addr + 0) < 0)
711 goto fault;
712#endif
713 }
714
715 if (step_bp[1].addr) {
716#ifdef GDBSTUB_USE_F7F7_AS_BREAKPOINT
717 if (gdbstub_write_byte(0xF7, step_bp[1].addr + 0) < 0 ||
718 gdbstub_write_byte(0xF7, step_bp[1].addr + 1) < 0)
719 goto fault;
720#else
721 if (gdbstub_write_byte(0xFF, step_bp[1].addr + 0) < 0)
722 goto fault;
723#endif
724 }
725
726 return 0;
727
728 fault:
729 /* uh-oh - silly address alert, try and restore things */
730 __gdbstub_restore_bp();
731 return -EFAULT;
732}
9ee21723 733#endif /* CONFIG_GDBSTUB_ALLOW_SINGLE_STEP */
b920de1b
DH
734
735#ifdef CONFIG_GDBSTUB_CONSOLE
736
737void gdbstub_console_write(struct console *con, const char *p, unsigned n)
738{
739 static const char gdbstub_cr[] = { 0x0d };
740 char outbuf[26];
741 int qty;
742 u8 busy;
743
744 busy = gdbstub_busy;
745 gdbstub_busy = 1;
746
747 outbuf[0] = 'O';
748
749 while (n > 0) {
750 qty = 1;
751
752 while (n > 0 && qty < 20) {
753 mem2hex(p, outbuf + qty, 2, 0);
754 qty += 2;
755 if (*p == 0x0a) {
756 mem2hex(gdbstub_cr, outbuf + qty, 2, 0);
757 qty += 2;
758 }
759 p++;
760 n--;
761 }
762
763 outbuf[qty] = 0;
764 putpacket(outbuf);
765 }
766
767 gdbstub_busy = busy;
768}
769
770static kdev_t gdbstub_console_dev(struct console *con)
771{
772 return MKDEV(1, 3); /* /dev/null */
773}
774
775static struct console gdbstub_console = {
776 .name = "gdb",
777 .write = gdbstub_console_write,
778 .device = gdbstub_console_dev,
779 .flags = CON_PRINTBUFFER,
780 .index = -1,
781};
782
783#endif
784
785/*
786 * Convert the memory pointed to by mem into hex, placing result in buf.
787 * - if successful, return a pointer to the last char put in buf (NUL)
788 * - in case of mem fault, return NULL
789 * may_fault is non-zero if we are reading from arbitrary memory, but is
790 * currently not used.
791 */
792static
793unsigned char *mem2hex(const void *_mem, char *buf, int count, int may_fault)
794{
795 const u8 *mem = _mem;
796 u8 ch[4];
797
798 if ((u32) mem & 1 && count >= 1) {
799 if (gdbstub_read_byte(mem, ch) != 0)
800 return 0;
50e1499f 801 buf = hex_byte_pack(buf, ch[0]);
b920de1b
DH
802 mem++;
803 count--;
804 }
805
806 if ((u32) mem & 3 && count >= 2) {
807 if (gdbstub_read_word(mem, ch) != 0)
808 return 0;
50e1499f
AS
809 buf = hex_byte_pack(buf, ch[0]);
810 buf = hex_byte_pack(buf, ch[1]);
b920de1b
DH
811 mem += 2;
812 count -= 2;
813 }
814
815 while (count >= 4) {
816 if (gdbstub_read_dword(mem, ch) != 0)
817 return 0;
50e1499f
AS
818 buf = hex_byte_pack(buf, ch[0]);
819 buf = hex_byte_pack(buf, ch[1]);
820 buf = hex_byte_pack(buf, ch[2]);
821 buf = hex_byte_pack(buf, ch[3]);
b920de1b
DH
822 mem += 4;
823 count -= 4;
824 }
825
826 if (count >= 2) {
827 if (gdbstub_read_word(mem, ch) != 0)
828 return 0;
50e1499f
AS
829 buf = hex_byte_pack(buf, ch[0]);
830 buf = hex_byte_pack(buf, ch[1]);
b920de1b
DH
831 mem += 2;
832 count -= 2;
833 }
834
835 if (count >= 1) {
836 if (gdbstub_read_byte(mem, ch) != 0)
837 return 0;
50e1499f 838 buf = hex_byte_pack(buf, ch[0]);
b920de1b
DH
839 }
840
841 *buf = 0;
842 return buf;
843}
844
845/*
846 * convert the hex array pointed to by buf into binary to be placed in mem
847 * return a pointer to the character AFTER the last byte written
848 * may_fault is non-zero if we are reading from arbitrary memory, but is
849 * currently not used.
850 */
851static
852const char *hex2mem(const char *buf, void *_mem, int count, int may_fault)
853{
854 u8 *mem = _mem;
855 union {
856 u32 val;
857 u8 b[4];
858 } ch;
859
860 if ((u32) mem & 1 && count >= 1) {
861 ch.b[0] = hex(*buf++) << 4;
862 ch.b[0] |= hex(*buf++);
863 if (gdbstub_write_byte(ch.val, mem) != 0)
864 return 0;
865 mem++;
866 count--;
867 }
868
869 if ((u32) mem & 3 && count >= 2) {
870 ch.b[0] = hex(*buf++) << 4;
871 ch.b[0] |= hex(*buf++);
872 ch.b[1] = hex(*buf++) << 4;
873 ch.b[1] |= hex(*buf++);
874 if (gdbstub_write_word(ch.val, mem) != 0)
875 return 0;
876 mem += 2;
877 count -= 2;
878 }
879
880 while (count >= 4) {
881 ch.b[0] = hex(*buf++) << 4;
882 ch.b[0] |= hex(*buf++);
883 ch.b[1] = hex(*buf++) << 4;
884 ch.b[1] |= hex(*buf++);
885 ch.b[2] = hex(*buf++) << 4;
886 ch.b[2] |= hex(*buf++);
887 ch.b[3] = hex(*buf++) << 4;
888 ch.b[3] |= hex(*buf++);
889 if (gdbstub_write_dword(ch.val, mem) != 0)
890 return 0;
891 mem += 4;
892 count -= 4;
893 }
894
895 if (count >= 2) {
896 ch.b[0] = hex(*buf++) << 4;
897 ch.b[0] |= hex(*buf++);
898 ch.b[1] = hex(*buf++) << 4;
899 ch.b[1] |= hex(*buf++);
900 if (gdbstub_write_word(ch.val, mem) != 0)
901 return 0;
902 mem += 2;
903 count -= 2;
904 }
905
906 if (count >= 1) {
907 ch.b[0] = hex(*buf++) << 4;
908 ch.b[0] |= hex(*buf++);
909 if (gdbstub_write_byte(ch.val, mem) != 0)
910 return 0;
911 }
912
913 return buf;
914}
915
916/*
917 * This table contains the mapping between MN10300 exception codes, and
918 * signals, which are primarily what GDB understands. It also indicates
919 * which hardware traps we need to commandeer when initializing the stub.
920 */
921static const struct excep_to_sig_map {
922 enum exception_code excep; /* MN10300 exception code */
923 unsigned char signo; /* Signal that we map this into */
924} excep_to_sig_map[] = {
925 { EXCEP_ITLBMISS, SIGSEGV },
926 { EXCEP_DTLBMISS, SIGSEGV },
927 { EXCEP_TRAP, SIGTRAP },
928 { EXCEP_ISTEP, SIGTRAP },
929 { EXCEP_IBREAK, SIGTRAP },
930 { EXCEP_OBREAK, SIGTRAP },
931 { EXCEP_UNIMPINS, SIGILL },
932 { EXCEP_UNIMPEXINS, SIGILL },
933 { EXCEP_MEMERR, SIGSEGV },
934 { EXCEP_MISALIGN, SIGSEGV },
935 { EXCEP_BUSERROR, SIGBUS },
936 { EXCEP_ILLINSACC, SIGSEGV },
937 { EXCEP_ILLDATACC, SIGSEGV },
938 { EXCEP_IOINSACC, SIGSEGV },
939 { EXCEP_PRIVINSACC, SIGSEGV },
940 { EXCEP_PRIVDATACC, SIGSEGV },
941 { EXCEP_FPU_DISABLED, SIGFPE },
942 { EXCEP_FPU_UNIMPINS, SIGFPE },
943 { EXCEP_FPU_OPERATION, SIGFPE },
944 { EXCEP_WDT, SIGALRM },
945 { EXCEP_NMI, SIGQUIT },
946 { EXCEP_IRQ_LEVEL0, SIGINT },
947 { EXCEP_IRQ_LEVEL1, SIGINT },
948 { EXCEP_IRQ_LEVEL2, SIGINT },
949 { EXCEP_IRQ_LEVEL3, SIGINT },
950 { EXCEP_IRQ_LEVEL4, SIGINT },
951 { EXCEP_IRQ_LEVEL5, SIGINT },
952 { EXCEP_IRQ_LEVEL6, SIGINT },
953 { 0, 0}
954};
955
956/*
957 * convert the MN10300 exception code into a UNIX signal number
958 */
959static int computeSignal(enum exception_code excep)
960{
961 const struct excep_to_sig_map *map;
962
963 for (map = excep_to_sig_map; map->signo; map++)
964 if (map->excep == excep)
965 return map->signo;
966
967 return SIGHUP; /* default for things we don't know about */
968}
969
970static u32 gdbstub_fpcr, gdbstub_fpufs_array[32];
971
972/*
973 *
974 */
975static void gdbstub_store_fpu(void)
976{
977#ifdef CONFIG_FPU
978
979 asm volatile(
980 "or %2,epsw\n"
981#ifdef CONFIG_MN10300_PROC_MN103E010
982 "nop\n"
983 "nop\n"
984#endif
985 "mov %1, a1\n"
986 "fmov fs0, (a1+)\n"
987 "fmov fs1, (a1+)\n"
988 "fmov fs2, (a1+)\n"
989 "fmov fs3, (a1+)\n"
990 "fmov fs4, (a1+)\n"
991 "fmov fs5, (a1+)\n"
992 "fmov fs6, (a1+)\n"
993 "fmov fs7, (a1+)\n"
994 "fmov fs8, (a1+)\n"
995 "fmov fs9, (a1+)\n"
996 "fmov fs10, (a1+)\n"
997 "fmov fs11, (a1+)\n"
998 "fmov fs12, (a1+)\n"
999 "fmov fs13, (a1+)\n"
1000 "fmov fs14, (a1+)\n"
1001 "fmov fs15, (a1+)\n"
1002 "fmov fs16, (a1+)\n"
1003 "fmov fs17, (a1+)\n"
1004 "fmov fs18, (a1+)\n"
1005 "fmov fs19, (a1+)\n"
1006 "fmov fs20, (a1+)\n"
1007 "fmov fs21, (a1+)\n"
1008 "fmov fs22, (a1+)\n"
1009 "fmov fs23, (a1+)\n"
1010 "fmov fs24, (a1+)\n"
1011 "fmov fs25, (a1+)\n"
1012 "fmov fs26, (a1+)\n"
1013 "fmov fs27, (a1+)\n"
1014 "fmov fs28, (a1+)\n"
1015 "fmov fs29, (a1+)\n"
1016 "fmov fs30, (a1+)\n"
1017 "fmov fs31, (a1+)\n"
1018 "fmov fpcr, %0\n"
1019 : "=d"(gdbstub_fpcr)
1020 : "g" (&gdbstub_fpufs_array), "i"(EPSW_FE)
1021 : "a1"
1022 );
1023#endif
1024}
1025
1026/*
1027 *
1028 */
1029static void gdbstub_load_fpu(void)
1030{
1031#ifdef CONFIG_FPU
1032
1033 asm volatile(
1034 "or %1,epsw\n"
1035#ifdef CONFIG_MN10300_PROC_MN103E010
1036 "nop\n"
1037 "nop\n"
1038#endif
1039 "mov %0, a1\n"
1040 "fmov (a1+), fs0\n"
1041 "fmov (a1+), fs1\n"
1042 "fmov (a1+), fs2\n"
1043 "fmov (a1+), fs3\n"
1044 "fmov (a1+), fs4\n"
1045 "fmov (a1+), fs5\n"
1046 "fmov (a1+), fs6\n"
1047 "fmov (a1+), fs7\n"
1048 "fmov (a1+), fs8\n"
1049 "fmov (a1+), fs9\n"
1050 "fmov (a1+), fs10\n"
1051 "fmov (a1+), fs11\n"
1052 "fmov (a1+), fs12\n"
1053 "fmov (a1+), fs13\n"
1054 "fmov (a1+), fs14\n"
1055 "fmov (a1+), fs15\n"
1056 "fmov (a1+), fs16\n"
1057 "fmov (a1+), fs17\n"
1058 "fmov (a1+), fs18\n"
1059 "fmov (a1+), fs19\n"
1060 "fmov (a1+), fs20\n"
1061 "fmov (a1+), fs21\n"
1062 "fmov (a1+), fs22\n"
1063 "fmov (a1+), fs23\n"
1064 "fmov (a1+), fs24\n"
1065 "fmov (a1+), fs25\n"
1066 "fmov (a1+), fs26\n"
1067 "fmov (a1+), fs27\n"
1068 "fmov (a1+), fs28\n"
1069 "fmov (a1+), fs29\n"
1070 "fmov (a1+), fs30\n"
1071 "fmov (a1+), fs31\n"
1072 "fmov %2, fpcr\n"
1073 :
1074 : "g" (&gdbstub_fpufs_array), "i"(EPSW_FE), "d"(gdbstub_fpcr)
1075 : "a1"
1076 );
1077#endif
1078}
1079
1080/*
1081 * set a software breakpoint
1082 */
1083int gdbstub_set_breakpoint(u8 *addr, int len)
1084{
1085 int bkpt, loop, xloop;
1086
1087#ifdef GDBSTUB_USE_F7F7_AS_BREAKPOINT
1088 len = (len + 1) & ~1;
1089#endif
1090
1091 gdbstub_bkpt("setbkpt(%p,%d)\n", addr, len);
1092
1093 for (bkpt = 255; bkpt >= 0; bkpt--)
1094 if (!gdbstub_bkpts[bkpt].addr)
1095 break;
1096 if (bkpt < 0)
1097 return -ENOSPC;
1098
1099 for (loop = 0; loop < len; loop++)
1100 if (gdbstub_read_byte(&addr[loop],
1101 &gdbstub_bkpts[bkpt].origbytes[loop]
1102 ) < 0)
1103 return -EFAULT;
1104
1105 gdbstub_flush_caches = 1;
1106
1107#ifdef GDBSTUB_USE_F7F7_AS_BREAKPOINT
1108 for (loop = 0; loop < len; loop++)
1109 if (gdbstub_write_byte(0xF7, &addr[loop]) < 0)
1110 goto restore;
1111#else
1112 for (loop = 0; loop < len; loop++)
1113 if (gdbstub_write_byte(0xFF, &addr[loop]) < 0)
1114 goto restore;
1115#endif
1116
1117 gdbstub_bkpts[bkpt].addr = addr;
1118 gdbstub_bkpts[bkpt].len = len;
1119
1120 gdbstub_bkpt("Set BKPT[%02x]: %p-%p {%02x%02x%02x%02x%02x%02x%02x}\n",
1121 bkpt,
1122 gdbstub_bkpts[bkpt].addr,
1123 gdbstub_bkpts[bkpt].addr + gdbstub_bkpts[bkpt].len - 1,
1124 gdbstub_bkpts[bkpt].origbytes[0],
1125 gdbstub_bkpts[bkpt].origbytes[1],
1126 gdbstub_bkpts[bkpt].origbytes[2],
1127 gdbstub_bkpts[bkpt].origbytes[3],
1128 gdbstub_bkpts[bkpt].origbytes[4],
1129 gdbstub_bkpts[bkpt].origbytes[5],
1130 gdbstub_bkpts[bkpt].origbytes[6]
1131 );
1132
1133 return 0;
1134
1135restore:
1136 for (xloop = 0; xloop < loop; xloop++)
1137 gdbstub_write_byte(gdbstub_bkpts[bkpt].origbytes[xloop],
1138 addr + xloop);
1139 return -EFAULT;
1140}
1141
1142/*
1143 * clear a software breakpoint
1144 */
1145int gdbstub_clear_breakpoint(u8 *addr, int len)
1146{
1147 int bkpt, loop;
1148
1149#ifdef GDBSTUB_USE_F7F7_AS_BREAKPOINT
1150 len = (len + 1) & ~1;
1151#endif
1152
1153 gdbstub_bkpt("clearbkpt(%p,%d)\n", addr, len);
1154
1155 for (bkpt = 255; bkpt >= 0; bkpt--)
1156 if (gdbstub_bkpts[bkpt].addr == addr &&
1157 gdbstub_bkpts[bkpt].len == len)
1158 break;
1159 if (bkpt < 0)
1160 return -ENOENT;
1161
1162 gdbstub_bkpts[bkpt].addr = NULL;
1163
1164 gdbstub_flush_caches = 1;
1165
1166 for (loop = 0; loop < len; loop++)
1167 if (gdbstub_write_byte(gdbstub_bkpts[bkpt].origbytes[loop],
1168 addr + loop) < 0)
1169 return -EFAULT;
1170
1171 return 0;
1172}
1173
1174/*
1175 * This function does all command processing for interfacing to gdb
67ddb405 1176 * - returns 0 if the exception should be skipped, -ERROR otherwise.
b920de1b
DH
1177 */
1178static int gdbstub(struct pt_regs *regs, enum exception_code excep)
1179{
1180 unsigned long *stack;
1181 unsigned long epsw, mdr;
1182 uint32_t zero, ssp;
1183 uint8_t broke;
1184 char *ptr;
1185 int sigval;
1186 int addr;
1187 int length;
1188 int loop;
1189
1190 if (excep == EXCEP_FPU_DISABLED)
67ddb405 1191 return -ENOTSUPP;
b920de1b
DH
1192
1193 gdbstub_flush_caches = 0;
1194
1195 mn10300_set_gdbleds(1);
1196
1197 asm volatile("mov mdr,%0" : "=d"(mdr));
368dd5ac 1198 local_save_flags(epsw);
6142e05f 1199 arch_local_change_intr_mask_level(
67ddb405 1200 NUM2EPSW_IM(CONFIG_DEBUGGER_IRQ_LEVEL + 1));
b920de1b
DH
1201
1202 gdbstub_store_fpu();
1203
1204#ifdef CONFIG_GDBSTUB_IMMEDIATE
1205 /* skip the initial pause loop */
1206 if (regs->pc == (unsigned long) __gdbstub_pause)
1207 regs->pc = (unsigned long) start_kernel;
1208#endif
1209
1210 /* if we were single stepping, restore the opcodes hoisted for the
1211 * breakpoint[s] */
1212 broke = 0;
9ee21723 1213#ifdef CONFIG_GDBSTUB_ALLOW_SINGLE_STEP
b920de1b
DH
1214 if ((step_bp[0].addr && step_bp[0].addr == (u8 *) regs->pc) ||
1215 (step_bp[1].addr && step_bp[1].addr == (u8 *) regs->pc))
1216 broke = 1;
1217
1218 __gdbstub_restore_bp();
9ee21723 1219#endif
b920de1b
DH
1220
1221 if (gdbstub_rx_unget) {
1222 sigval = SIGINT;
1223 if (gdbstub_rx_unget != 3)
1224 goto packet_waiting;
1225 gdbstub_rx_unget = 0;
1226 }
1227
1228 stack = (unsigned long *) regs->sp;
1229 sigval = broke ? SIGTRAP : computeSignal(excep);
1230
1231 /* send information about a BUG() */
1232 if (!user_mode(regs) && excep == EXCEP_SYSCALL15) {
1233 const struct bug_entry *bug;
1234
1235 bug = find_bug(regs->pc);
1236 if (bug)
1237 goto found_bug;
1238 length = snprintf(trans_buffer, sizeof(trans_buffer),
1239 "BUG() at address %lx\n", regs->pc);
1240 goto send_bug_pkt;
1241
1242 found_bug:
1243 length = snprintf(trans_buffer, sizeof(trans_buffer),
1244 "BUG() at address %lx (%s:%d)\n",
1245 regs->pc, bug->file, bug->line);
1246
1247 send_bug_pkt:
1248 ptr = output_buffer;
1249 *ptr++ = 'O';
1250 ptr = mem2hex(trans_buffer, ptr, length, 0);
1251 *ptr = 0;
1252 putpacket(output_buffer);
1253
1254 regs->pc -= 2;
1255 sigval = SIGABRT;
1256 } else if (regs->pc == (unsigned long) __gdbstub_bug_trap) {
1257 regs->pc = regs->mdr;
1258 sigval = SIGABRT;
1259 }
1260
1261 /*
1262 * send a message to the debugger's user saying what happened if it may
1263 * not be clear cut (we can't map exceptions onto signals properly)
1264 */
1265 if (sigval != SIGINT && sigval != SIGTRAP && sigval != SIGILL) {
1266 static const char title[] = "Excep ", tbcberr[] = "BCBERR ";
1267 static const char crlf[] = "\r\n";
1268 char hx;
1269 u32 bcberr = BCBERR;
1270
1271 ptr = output_buffer;
1272 *ptr++ = 'O';
1273 ptr = mem2hex(title, ptr, sizeof(title) - 1, 0);
1274
26824972 1275 hx = hex_asc_hi(excep >> 8);
50e1499f 1276 ptr = hex_byte_pack(ptr, hx);
26824972 1277 hx = hex_asc_lo(excep >> 8);
50e1499f 1278 ptr = hex_byte_pack(ptr, hx);
26824972 1279 hx = hex_asc_hi(excep);
50e1499f 1280 ptr = hex_byte_pack(ptr, hx);
26824972 1281 hx = hex_asc_lo(excep);
50e1499f 1282 ptr = hex_byte_pack(ptr, hx);
b920de1b
DH
1283
1284 ptr = mem2hex(crlf, ptr, sizeof(crlf) - 1, 0);
1285 *ptr = 0;
1286 putpacket(output_buffer); /* send it off... */
1287
1288 /* BCBERR */
1289 ptr = output_buffer;
1290 *ptr++ = 'O';
1291 ptr = mem2hex(tbcberr, ptr, sizeof(tbcberr) - 1, 0);
1292
26824972 1293 hx = hex_asc_hi(bcberr >> 24);
50e1499f 1294 ptr = hex_byte_pack(ptr, hx);
26824972 1295 hx = hex_asc_lo(bcberr >> 24);
50e1499f 1296 ptr = hex_byte_pack(ptr, hx);
26824972 1297 hx = hex_asc_hi(bcberr >> 16);
50e1499f 1298 ptr = hex_byte_pack(ptr, hx);
26824972 1299 hx = hex_asc_lo(bcberr >> 16);
50e1499f 1300 ptr = hex_byte_pack(ptr, hx);
26824972 1301 hx = hex_asc_hi(bcberr >> 8);
50e1499f 1302 ptr = hex_byte_pack(ptr, hx);
26824972 1303 hx = hex_asc_lo(bcberr >> 8);
50e1499f 1304 ptr = hex_byte_pack(ptr, hx);
26824972 1305 hx = hex_asc_hi(bcberr);
50e1499f 1306 ptr = hex_byte_pack(ptr, hx);
26824972 1307 hx = hex_asc_lo(bcberr);
50e1499f 1308 ptr = hex_byte_pack(ptr, hx);
b920de1b
DH
1309
1310 ptr = mem2hex(crlf, ptr, sizeof(crlf) - 1, 0);
1311 *ptr = 0;
1312 putpacket(output_buffer); /* send it off... */
1313 }
1314
1315 /*
1316 * tell the debugger that an exception has occurred
1317 */
1318 ptr = output_buffer;
1319
1320 /*
1321 * Send trap type (converted to signal)
1322 */
1323 *ptr++ = 'T';
50e1499f 1324 ptr = hex_byte_pack(ptr, sigval);
b920de1b
DH
1325
1326 /*
1327 * Send Error PC
1328 */
50e1499f 1329 ptr = hex_byte_pack(ptr, GDB_REGID_PC);
b920de1b
DH
1330 *ptr++ = ':';
1331 ptr = mem2hex(&regs->pc, ptr, 4, 0);
1332 *ptr++ = ';';
1333
1334 /*
1335 * Send frame pointer
1336 */
50e1499f 1337 ptr = hex_byte_pack(ptr, GDB_REGID_FP);
b920de1b
DH
1338 *ptr++ = ':';
1339 ptr = mem2hex(&regs->a3, ptr, 4, 0);
1340 *ptr++ = ';';
1341
1342 /*
1343 * Send stack pointer
1344 */
1345 ssp = (unsigned long) (regs + 1);
50e1499f 1346 ptr = hex_byte_pack(ptr, GDB_REGID_SP);
b920de1b
DH
1347 *ptr++ = ':';
1348 ptr = mem2hex(&ssp, ptr, 4, 0);
1349 *ptr++ = ';';
1350
1351 *ptr++ = 0;
1352 putpacket(output_buffer); /* send it off... */
1353
1354packet_waiting:
1355 /*
1356 * Wait for input from remote GDB
1357 */
1358 while (1) {
1359 output_buffer[0] = 0;
1360 getpacket(input_buffer);
1361
1362 switch (input_buffer[0]) {
1363 /* request repeat of last signal number */
1364 case '?':
1365 output_buffer[0] = 'S';
26824972
HH
1366 output_buffer[1] = hex_asc_hi(sigval);
1367 output_buffer[2] = hex_asc_lo(sigval);
b920de1b
DH
1368 output_buffer[3] = 0;
1369 break;
1370
1371 case 'd':
1372 /* toggle debug flag */
1373 break;
1374
1375 /*
1376 * Return the value of the CPU registers
1377 */
1378 case 'g':
1379 zero = 0;
1380 ssp = (u32) (regs + 1);
1381 ptr = output_buffer;
1382 ptr = mem2hex(&regs->d0, ptr, 4, 0);
1383 ptr = mem2hex(&regs->d1, ptr, 4, 0);
1384 ptr = mem2hex(&regs->d2, ptr, 4, 0);
1385 ptr = mem2hex(&regs->d3, ptr, 4, 0);
1386 ptr = mem2hex(&regs->a0, ptr, 4, 0);
1387 ptr = mem2hex(&regs->a1, ptr, 4, 0);
1388 ptr = mem2hex(&regs->a2, ptr, 4, 0);
1389 ptr = mem2hex(&regs->a3, ptr, 4, 0);
1390
1391 ptr = mem2hex(&ssp, ptr, 4, 0); /* 8 */
1392 ptr = mem2hex(&regs->pc, ptr, 4, 0);
1393 ptr = mem2hex(&regs->mdr, ptr, 4, 0);
1394 ptr = mem2hex(&regs->epsw, ptr, 4, 0);
1395 ptr = mem2hex(&regs->lir, ptr, 4, 0);
1396 ptr = mem2hex(&regs->lar, ptr, 4, 0);
1397 ptr = mem2hex(&regs->mdrq, ptr, 4, 0);
1398
1399 ptr = mem2hex(&regs->e0, ptr, 4, 0); /* 15 */
1400 ptr = mem2hex(&regs->e1, ptr, 4, 0);
1401 ptr = mem2hex(&regs->e2, ptr, 4, 0);
1402 ptr = mem2hex(&regs->e3, ptr, 4, 0);
1403 ptr = mem2hex(&regs->e4, ptr, 4, 0);
1404 ptr = mem2hex(&regs->e5, ptr, 4, 0);
1405 ptr = mem2hex(&regs->e6, ptr, 4, 0);
1406 ptr = mem2hex(&regs->e7, ptr, 4, 0);
1407
1408 ptr = mem2hex(&ssp, ptr, 4, 0);
1409 ptr = mem2hex(&regs, ptr, 4, 0);
1410 ptr = mem2hex(&regs->sp, ptr, 4, 0);
1411 ptr = mem2hex(&regs->mcrh, ptr, 4, 0); /* 26 */
1412 ptr = mem2hex(&regs->mcrl, ptr, 4, 0);
1413 ptr = mem2hex(&regs->mcvf, ptr, 4, 0);
1414
1415 ptr = mem2hex(&gdbstub_fpcr, ptr, 4, 0); /* 29 - FPCR */
1416 ptr = mem2hex(&zero, ptr, 4, 0);
1417 ptr = mem2hex(&zero, ptr, 4, 0);
1418 for (loop = 0; loop < 32; loop++)
1419 ptr = mem2hex(&gdbstub_fpufs_array[loop],
1420 ptr, 4, 0); /* 32 - FS0-31 */
1421
1422 break;
1423
1424 /*
1425 * set the value of the CPU registers - return OK
1426 */
1427 case 'G':
1428 {
1429 const char *ptr;
1430
1431 ptr = &input_buffer[1];
1432 ptr = hex2mem(ptr, &regs->d0, 4, 0);
1433 ptr = hex2mem(ptr, &regs->d1, 4, 0);
1434 ptr = hex2mem(ptr, &regs->d2, 4, 0);
1435 ptr = hex2mem(ptr, &regs->d3, 4, 0);
1436 ptr = hex2mem(ptr, &regs->a0, 4, 0);
1437 ptr = hex2mem(ptr, &regs->a1, 4, 0);
1438 ptr = hex2mem(ptr, &regs->a2, 4, 0);
1439 ptr = hex2mem(ptr, &regs->a3, 4, 0);
1440
1441 ptr = hex2mem(ptr, &ssp, 4, 0); /* 8 */
1442 ptr = hex2mem(ptr, &regs->pc, 4, 0);
1443 ptr = hex2mem(ptr, &regs->mdr, 4, 0);
1444 ptr = hex2mem(ptr, &regs->epsw, 4, 0);
1445 ptr = hex2mem(ptr, &regs->lir, 4, 0);
1446 ptr = hex2mem(ptr, &regs->lar, 4, 0);
1447 ptr = hex2mem(ptr, &regs->mdrq, 4, 0);
1448
1449 ptr = hex2mem(ptr, &regs->e0, 4, 0); /* 15 */
1450 ptr = hex2mem(ptr, &regs->e1, 4, 0);
1451 ptr = hex2mem(ptr, &regs->e2, 4, 0);
1452 ptr = hex2mem(ptr, &regs->e3, 4, 0);
1453 ptr = hex2mem(ptr, &regs->e4, 4, 0);
1454 ptr = hex2mem(ptr, &regs->e5, 4, 0);
1455 ptr = hex2mem(ptr, &regs->e6, 4, 0);
1456 ptr = hex2mem(ptr, &regs->e7, 4, 0);
1457
1458 ptr = hex2mem(ptr, &ssp, 4, 0);
1459 ptr = hex2mem(ptr, &zero, 4, 0);
1460 ptr = hex2mem(ptr, &regs->sp, 4, 0);
1461 ptr = hex2mem(ptr, &regs->mcrh, 4, 0); /* 26 */
1462 ptr = hex2mem(ptr, &regs->mcrl, 4, 0);
1463 ptr = hex2mem(ptr, &regs->mcvf, 4, 0);
1464
1465 ptr = hex2mem(ptr, &zero, 4, 0); /* 29 - FPCR */
1466 ptr = hex2mem(ptr, &zero, 4, 0);
1467 ptr = hex2mem(ptr, &zero, 4, 0);
1468 for (loop = 0; loop < 32; loop++) /* 32 - FS0-31 */
1469 ptr = hex2mem(ptr, &zero, 4, 0);
1470
1471#if 0
1472 /*
1473 * See if the stack pointer has moved. If so, then copy
1474 * the saved locals and ins to the new location.
1475 */
1476 unsigned long *newsp = (unsigned long *) registers[SP];
1477 if (sp != newsp)
1478 sp = memcpy(newsp, sp, 16 * 4);
1479#endif
1480
1481 gdbstub_strcpy(output_buffer, "OK");
1482 }
1483 break;
1484
1485 /*
1486 * mAA..AA,LLLL Read LLLL bytes at address AA..AA
1487 */
1488 case 'm':
1489 ptr = &input_buffer[1];
1490
1491 if (hexToInt(&ptr, &addr) &&
1492 *ptr++ == ',' &&
1493 hexToInt(&ptr, &length)
1494 ) {
1495 if (mem2hex((char *) addr, output_buffer,
1496 length, 1))
1497 break;
1498 gdbstub_strcpy(output_buffer, "E03");
1499 } else {
1500 gdbstub_strcpy(output_buffer, "E01");
1501 }
1502 break;
1503
1504 /*
1505 * MAA..AA,LLLL: Write LLLL bytes at address AA.AA
1506 * return OK
1507 */
1508 case 'M':
1509 ptr = &input_buffer[1];
1510
1511 if (hexToInt(&ptr, &addr) &&
1512 *ptr++ == ',' &&
1513 hexToInt(&ptr, &length) &&
1514 *ptr++ == ':'
1515 ) {
1516 if (hex2mem(ptr, (char *) addr, length, 1))
1517 gdbstub_strcpy(output_buffer, "OK");
1518 else
1519 gdbstub_strcpy(output_buffer, "E03");
1520
1521 gdbstub_flush_caches = 1;
1522 } else {
1523 gdbstub_strcpy(output_buffer, "E02");
1524 }
1525 break;
1526
1527 /*
1528 * cAA..AA Continue at address AA..AA(optional)
1529 */
1530 case 'c':
1531 /* try to read optional parameter, pc unchanged if no
1532 * parm */
1533
1534 ptr = &input_buffer[1];
1535 if (hexToInt(&ptr, &addr))
1536 regs->pc = addr;
1537 goto done;
1538
1539 /*
1540 * kill the program
1541 */
1542 case 'k' :
1543 goto done; /* just continue */
1544
1545 /*
1546 * Reset the whole machine (FIXME: system dependent)
1547 */
1548 case 'r':
1549 break;
1550
1551 /*
1552 * Step to next instruction
1553 */
1554 case 's':
9ee21723 1555 /* Using the T flag doesn't seem to perform single
b920de1b
DH
1556 * stepping (it seems to wind up being caught by the
1557 * JTAG unit), so we have to use breakpoints and
1558 * continue instead.
1559 */
9ee21723 1560#ifdef CONFIG_GDBSTUB_ALLOW_SINGLE_STEP
b920de1b
DH
1561 if (gdbstub_single_step(regs) < 0)
1562 /* ignore any fault error for now */
1563 gdbstub_printk("unable to set single-step"
1564 " bp\n");
1565 goto done;
9ee21723
DH
1566#else
1567 gdbstub_strcpy(output_buffer, "E01");
1568 break;
1569#endif
b920de1b
DH
1570
1571 /*
1572 * Set baud rate (bBB)
1573 */
1574 case 'b':
1575 do {
1576 int baudrate;
1577
1578 ptr = &input_buffer[1];
1579 if (!hexToInt(&ptr, &baudrate)) {
1580 gdbstub_strcpy(output_buffer, "B01");
1581 break;
1582 }
1583
1584 if (baudrate) {
1585 /* ACK before changing speed */
1586 putpacket("OK");
1587 gdbstub_io_set_baud(baudrate);
1588 }
1589 } while (0);
1590 break;
1591
1592 /*
1593 * Set breakpoint
1594 */
1595 case 'Z':
1596 ptr = &input_buffer[1];
1597
1598 if (!hexToInt(&ptr, &loop) || *ptr++ != ',' ||
1599 !hexToInt(&ptr, &addr) || *ptr++ != ',' ||
1600 !hexToInt(&ptr, &length)
1601 ) {
1602 gdbstub_strcpy(output_buffer, "E01");
1603 break;
1604 }
1605
1606 /* only support software breakpoints */
1607 gdbstub_strcpy(output_buffer, "E03");
1608 if (loop != 0 ||
1609 length < 1 ||
1610 length > 7 ||
1611 (unsigned long) addr < 4096)
1612 break;
1613
1614 if (gdbstub_set_breakpoint((u8 *) addr, length) < 0)
1615 break;
1616
1617 gdbstub_strcpy(output_buffer, "OK");
1618 break;
1619
1620 /*
1621 * Clear breakpoint
1622 */
1623 case 'z':
1624 ptr = &input_buffer[1];
1625
1626 if (!hexToInt(&ptr, &loop) || *ptr++ != ',' ||
1627 !hexToInt(&ptr, &addr) || *ptr++ != ',' ||
1628 !hexToInt(&ptr, &length)
1629 ) {
1630 gdbstub_strcpy(output_buffer, "E01");
1631 break;
1632 }
1633
1634 /* only support software breakpoints */
1635 gdbstub_strcpy(output_buffer, "E03");
1636 if (loop != 0 ||
1637 length < 1 ||
1638 length > 7 ||
1639 (unsigned long) addr < 4096)
1640 break;
1641
1642 if (gdbstub_clear_breakpoint((u8 *) addr, length) < 0)
1643 break;
1644
1645 gdbstub_strcpy(output_buffer, "OK");
1646 break;
1647
1648 default:
1649 gdbstub_proto("### GDB Unsupported Cmd '%s'\n",
1650 input_buffer);
1651 break;
1652 }
1653
1654 /* reply to the request */
1655 putpacket(output_buffer);
1656 }
1657
1658done:
1659 /*
1660 * Need to flush the instruction cache here, as we may
1661 * have deposited a breakpoint, and the icache probably
1662 * has no way of knowing that a data ref to some location
1663 * may have changed something that is in the instruction
1664 * cache.
1665 * NB: We flush both caches, just to be sure...
1666 */
1667 if (gdbstub_flush_caches)
7f386ac3 1668 debugger_local_cache_flushinv();
b920de1b
DH
1669
1670 gdbstub_load_fpu();
1671 mn10300_set_gdbleds(0);
1672 if (excep == EXCEP_NMI)
1673 NMICR = NMICR_NMIF;
1674
1675 touch_softlockup_watchdog();
1676
1677 local_irq_restore(epsw);
67ddb405
DH
1678 return 0;
1679}
1680
1681/*
1682 * Determine if we hit a debugger special breakpoint that needs skipping over
1683 * automatically.
1684 */
1685int at_debugger_breakpoint(struct pt_regs *regs)
1686{
1687 return 0;
b920de1b
DH
1688}
1689
1690/*
1691 * handle event interception
1692 */
67ddb405
DH
1693asmlinkage int debugger_intercept(enum exception_code excep,
1694 int signo, int si_code, struct pt_regs *regs)
b920de1b
DH
1695{
1696 static u8 notfirst = 1;
1697 int ret;
1698
1699 if (gdbstub_busy)
1700 gdbstub_printk("--> gdbstub reentered itself\n");
1701 gdbstub_busy = 1;
1702
1703 if (notfirst) {
1704 unsigned long mdr;
1705 asm("mov mdr,%0" : "=d"(mdr));
1706
1707 gdbstub_entry(
67ddb405 1708 "--> debugger_intercept(%p,%04x) [MDR=%lx PC=%lx]\n",
b920de1b
DH
1709 regs, excep, mdr, regs->pc);
1710
1711 gdbstub_entry(
1712 "PC: %08lx EPSW: %08lx SSP: %08lx mode: %s\n",
1713 regs->pc, regs->epsw, (unsigned long) &ret,
1714 user_mode(regs) ? "User" : "Super");
1715 gdbstub_entry(
1716 "d0: %08lx d1: %08lx d2: %08lx d3: %08lx\n",
1717 regs->d0, regs->d1, regs->d2, regs->d3);
1718 gdbstub_entry(
1719 "a0: %08lx a1: %08lx a2: %08lx a3: %08lx\n",
1720 regs->a0, regs->a1, regs->a2, regs->a3);
1721 gdbstub_entry(
1722 "e0: %08lx e1: %08lx e2: %08lx e3: %08lx\n",
1723 regs->e0, regs->e1, regs->e2, regs->e3);
1724 gdbstub_entry(
1725 "e4: %08lx e5: %08lx e6: %08lx e7: %08lx\n",
1726 regs->e4, regs->e5, regs->e6, regs->e7);
1727 gdbstub_entry(
1728 "lar: %08lx lir: %08lx mdr: %08lx usp: %08lx\n",
1729 regs->lar, regs->lir, regs->mdr, regs->sp);
1730 gdbstub_entry(
1731 "cvf: %08lx crl: %08lx crh: %08lx drq: %08lx\n",
1732 regs->mcvf, regs->mcrl, regs->mcrh, regs->mdrq);
1733 gdbstub_entry(
1734 "threadinfo=%p task=%p)\n",
1735 current_thread_info(), current);
1736 } else {
1737 notfirst = 1;
1738 }
1739
1740 ret = gdbstub(regs, excep);
1741
67ddb405 1742 gdbstub_entry("<-- debugger_intercept()\n");
b920de1b
DH
1743 gdbstub_busy = 0;
1744 return ret;
1745}
1746
1747/*
1748 * handle the GDB stub itself causing an exception
1749 */
1750asmlinkage void gdbstub_exception(struct pt_regs *regs,
1751 enum exception_code excep)
1752{
1753 unsigned long mdr;
1754
1755 asm("mov mdr,%0" : "=d"(mdr));
1756 gdbstub_entry("--> gdbstub exception({%p},%04x) [MDR=%lx]\n",
1757 regs, excep, mdr);
1758
1759 while ((unsigned long) regs == 0xffffffff) {}
1760
1761 /* handle guarded memory accesses where we know it might fault */
1762 if (regs->pc == (unsigned) gdbstub_read_byte_guard) {
1763 regs->pc = (unsigned) gdbstub_read_byte_cont;
1764 goto fault;
1765 }
1766
1767 if (regs->pc == (unsigned) gdbstub_read_word_guard) {
1768 regs->pc = (unsigned) gdbstub_read_word_cont;
1769 goto fault;
1770 }
1771
1772 if (regs->pc == (unsigned) gdbstub_read_dword_guard) {
1773 regs->pc = (unsigned) gdbstub_read_dword_cont;
1774 goto fault;
1775 }
1776
1777 if (regs->pc == (unsigned) gdbstub_write_byte_guard) {
1778 regs->pc = (unsigned) gdbstub_write_byte_cont;
1779 goto fault;
1780 }
1781
1782 if (regs->pc == (unsigned) gdbstub_write_word_guard) {
1783 regs->pc = (unsigned) gdbstub_write_word_cont;
1784 goto fault;
1785 }
1786
1787 if (regs->pc == (unsigned) gdbstub_write_dword_guard) {
1788 regs->pc = (unsigned) gdbstub_write_dword_cont;
1789 goto fault;
1790 }
1791
1792 gdbstub_printk("\n### GDB stub caused an exception ###\n");
1793
1794 /* something went horribly wrong */
1795 console_verbose();
1796 show_registers(regs);
1797
1798 panic("GDB Stub caused an unexpected exception - can't continue\n");
1799
1800 /* we caught an attempt by the stub to access silly memory */
1801fault:
1802 gdbstub_entry("<-- gdbstub exception() = EFAULT\n");
1803 regs->d0 = -EFAULT;
1804 return;
1805}
1806
1807/*
1808 * send an exit message to GDB
1809 */
1810void gdbstub_exit(int status)
1811{
1812 unsigned char checksum;
1813 unsigned char ch;
1814 int count;
1815
1816 gdbstub_busy = 1;
1817 output_buffer[0] = 'W';
26824972
HH
1818 output_buffer[1] = hex_asc_hi(status);
1819 output_buffer[2] = hex_asc_lo(status);
b920de1b
DH
1820 output_buffer[3] = 0;
1821
1822 gdbstub_io_tx_char('$');
1823 checksum = 0;
1824 count = 0;
1825
1826 while ((ch = output_buffer[count]) != 0) {
1827 gdbstub_io_tx_char(ch);
1828 checksum += ch;
1829 count += 1;
1830 }
1831
1832 gdbstub_io_tx_char('#');
26824972
HH
1833 gdbstub_io_tx_char(hex_asc_hi(checksum));
1834 gdbstub_io_tx_char(hex_asc_lo(checksum));
b920de1b
DH
1835
1836 /* make sure the output is flushed, or else RedBoot might clobber it */
1837 gdbstub_io_tx_flush();
1838
1839 gdbstub_busy = 0;
1840}
1841
1842/*
1843 * initialise the GDB stub
1844 */
1845asmlinkage void __init gdbstub_init(void)
1846{
1847#ifdef CONFIG_GDBSTUB_IMMEDIATE
1848 unsigned char ch;
1849 int ret;
1850#endif
1851
1852 gdbstub_busy = 1;
1853
1854 printk(KERN_INFO "%s", gdbstub_banner);
1855
1856 gdbstub_io_init();
1857
1858 gdbstub_entry("--> gdbstub_init\n");
1859
1860 /* try to talk to GDB (or anyone insane enough to want to type GDB
1861 * protocol by hand) */
1862 gdbstub_io("### GDB Tx ACK\n");
1863 gdbstub_io_tx_char('+'); /* 'hello world' */
1864
1865#ifdef CONFIG_GDBSTUB_IMMEDIATE
1866 gdbstub_printk("GDB Stub waiting for packet\n");
1867
1868 /* in case GDB is started before us, ACK any packets that are already
1869 * sitting there (presumably "$?#xx")
1870 */
1871 do { gdbstub_io_rx_char(&ch, 0); } while (ch != '$');
1872 do { gdbstub_io_rx_char(&ch, 0); } while (ch != '#');
1873 /* eat first csum byte */
1874 do { ret = gdbstub_io_rx_char(&ch, 0); } while (ret != 0);
1875 /* eat second csum byte */
1876 do { ret = gdbstub_io_rx_char(&ch, 0); } while (ret != 0);
1877
1878 gdbstub_io("### GDB Tx NAK\n");
1879 gdbstub_io_tx_char('-'); /* NAK it */
1880
1881#else
1882 printk("GDB Stub ready\n");
1883#endif
1884
1885 gdbstub_busy = 0;
1886 gdbstub_entry("<-- gdbstub_init\n");
1887}
1888
1889/*
1890 * register the console at a more appropriate time
1891 */
1892#ifdef CONFIG_GDBSTUB_CONSOLE
1893static int __init gdbstub_postinit(void)
1894{
1895 printk(KERN_NOTICE "registering console\n");
1896 register_console(&gdbstub_console);
1897 return 0;
1898}
1899
1900__initcall(gdbstub_postinit);
1901#endif
1902
1903/*
1904 * handle character reception on GDB serial port
1905 * - jump into the GDB stub if BREAK is detected on the serial line
1906 */
1907asmlinkage void gdbstub_rx_irq(struct pt_regs *regs, enum exception_code excep)
1908{
1909 char ch;
1910 int ret;
1911
1912 gdbstub_entry("--> gdbstub_rx_irq\n");
1913
1914 do {
1915 ret = gdbstub_io_rx_char(&ch, 1);
1916 if (ret != -EIO && ret != -EAGAIN) {
1917 if (ret != -EINTR)
1918 gdbstub_rx_unget = ch;
1919 gdbstub(regs, excep);
1920 }
1921 } while (ret != -EAGAIN);
1922
1923 gdbstub_entry("<-- gdbstub_rx_irq\n");
1924}