2 * May be copied or modified under the terms of the GNU General Public
3 * License. See linux/COPYING for more information.
5 * Contains extracts from code by Glenn Engel, Jim Kingdon,
6 * David Grothe <dave@gcom.com>, Tigran Aivazian <tigran@sco.com>,
7 * Amit S. Kale <akale@veritas.com>, William Gatliff <bgat@open-widgets.com>,
8 * Ben Lee, Steve Chamberlain and Benoit Miller <fulg@iname.com>.
10 * This version by Henry Bell <henry.bell@st.com>
11 * Minor modifications by Jeremy Siegel <jsiegel@mvista.com>
13 * Contains low-level support for remote debug using GDB.
15 * To enable debugger support, two things need to happen. A call to
16 * set_debug_traps() is necessary in order to allow any breakpoints
17 * or error conditions to be properly intercepted and reported to gdb.
18 * A breakpoint also needs to be generated to begin communication. This
19 * is most easily accomplished by a call to breakpoint() which does
20 * a trapa if the initialisation phase has been successfully completed.
22 * In this case, set_debug_traps() is not used to "take over" exceptions;
23 * other kernel code is modified instead to enter the kgdb functions here
24 * when appropriate (see entry.S for breakpoint traps and NMI interrupts,
25 * see traps.c for kernel error exceptions).
27 * The following gdb commands are supported:
29 * Command Function Return value
31 * g return the value of the CPU registers hex data or ENN
32 * G set the value of the CPU registers OK or ENN
34 * mAA..AA,LLLL Read LLLL bytes at address AA..AA hex data or ENN
35 * MAA..AA,LLLL: Write LLLL bytes at address AA.AA OK or ENN
36 * XAA..AA,LLLL: Same, but data is binary (not hex) OK or ENN
38 * c Resume at current address SNN ( signal NN)
39 * cAA..AA Continue at address AA..AA SNN
40 * CNN; Resume at current address with signal SNN
41 * CNN;AA..AA Resume at address AA..AA with signal SNN
43 * s Step one instruction SNN
44 * sAA..AA Step one instruction from AA..AA SNN
45 * SNN; Step one instruction with signal SNN
46 * SNNAA..AA Step one instruction from AA..AA w/NN SNN
53 * Hct Set thread t for operations, OK or ENN
54 * c = 'c' (step, cont), c = 'g' (other
57 * qC Query current thread ID QCpid
58 * qfThreadInfo Get list of current threads (first) m<id>
59 * qsThreadInfo " " " " " (subsequent)
60 * qOffsets Get section offsets Text=x;Data=y;Bss=z
62 * TXX Find if thread XX is alive OK or ENN
63 * ? What was the last sigval ? SNN (signal NN)
64 * O Output to GDB console
66 * Remote communication protocol.
68 * A debug packet whose contents are <data> is encapsulated for
69 * transmission in the form:
71 * $ <data> # CSUM1 CSUM2
73 * <data> must be ASCII alphanumeric and cannot include characters
74 * '$' or '#'. If <data> starts with two characters followed by
75 * ':', then the existing stubs interpret this as a sequence number.
77 * CSUM1 and CSUM2 are ascii hex representation of an 8-bit
78 * checksum of <data>, the most significant nibble is sent first.
79 * the hex digits 0-9,a-f are used.
81 * Receiver responds with:
83 * + - if CSUM is correct and ready for next packet
84 * - - if CSUM is incorrect
86 * Responses can be run-length encoded to save space. A '*' means that
87 * the next character is an ASCII encoding giving a repeat count which
88 * stands for that many repetitions of the character preceding the '*'.
89 * The encoding is n+29, yielding a printable character where n >=3
90 * (which is where RLE starts to win). Don't use an n > 126.
92 * So "0* " means the same as "0000".
95 #include <linux/string.h>
96 #include <linux/kernel.h>
97 #include <linux/sched.h>
98 #include <linux/smp.h>
99 #include <linux/spinlock.h>
100 #include <linux/delay.h>
101 #include <linux/linkage.h>
102 #include <linux/init.h>
103 #include <linux/console.h>
104 #include <linux/sysrq.h>
105 #include <linux/module.h>
106 #include <asm/system.h>
107 #include <asm/cacheflush.h>
108 #include <asm/current.h>
109 #include <asm/signal.h>
110 #include <asm/pgtable.h>
111 #include <asm/ptrace.h>
112 #include <asm/kgdb.h>
115 /* Function pointers for linkage */
116 kgdb_debug_hook_t
*kgdb_debug_hook
;
117 kgdb_bus_error_hook_t
*kgdb_bus_err_hook
;
119 int (*kgdb_getchar
)(void);
120 EXPORT_SYMBOL_GPL(kgdb_getchar
);
121 void (*kgdb_putchar
)(int);
122 EXPORT_SYMBOL_GPL(kgdb_putchar
);
124 static void put_debug_char(int c
)
130 static int get_debug_char(void)
134 return (*kgdb_getchar
)();
137 /* Num chars in in/out bound buffers, register packets need NUMREGBYTES * 2 */
139 #define NUMREGBYTES (MAXREG*4)
140 #define OUTBUFMAX (NUMREGBYTES*2+512)
143 R0
= 0, R1
, R2
, R3
, R4
, R5
, R6
, R7
,
144 R8
, R9
, R10
, R11
, R12
, R13
, R14
, R15
,
145 PC
, PR
, GBR
, VBR
, MACH
, MACL
, SR
,
150 static unsigned int registers
[MAXREG
];
151 struct kgdb_regs trap_registers
;
153 char kgdb_in_gdb_mode
;
154 char in_nmi
; /* Set during NMI to prevent reentry */
155 int kgdb_nofault
; /* Boolean to ignore bus errs (i.e. in GDB) */
157 /* Default values for SCI (can override via kernel args in setup.c) */
158 #ifndef CONFIG_KGDB_DEFPORT
159 #define CONFIG_KGDB_DEFPORT 1
162 #ifndef CONFIG_KGDB_DEFBAUD
163 #define CONFIG_KGDB_DEFBAUD 115200
166 #if defined(CONFIG_KGDB_DEFPARITY_E)
167 #define CONFIG_KGDB_DEFPARITY 'E'
168 #elif defined(CONFIG_KGDB_DEFPARITY_O)
169 #define CONFIG_KGDB_DEFPARITY 'O'
170 #else /* CONFIG_KGDB_DEFPARITY_N */
171 #define CONFIG_KGDB_DEFPARITY 'N'
174 #ifdef CONFIG_KGDB_DEFBITS_7
175 #define CONFIG_KGDB_DEFBITS '7'
176 #else /* CONFIG_KGDB_DEFBITS_8 */
177 #define CONFIG_KGDB_DEFBITS '8'
180 /* SCI/UART settings, used in kgdb_console_setup() */
181 int kgdb_portnum
= CONFIG_KGDB_DEFPORT
;
182 EXPORT_SYMBOL_GPL(kgdb_portnum
);
183 int kgdb_baud
= CONFIG_KGDB_DEFBAUD
;
184 EXPORT_SYMBOL_GPL(kgdb_baud
);
185 char kgdb_parity
= CONFIG_KGDB_DEFPARITY
;
186 EXPORT_SYMBOL_GPL(kgdb_parity
);
187 char kgdb_bits
= CONFIG_KGDB_DEFBITS
;
188 EXPORT_SYMBOL_GPL(kgdb_bits
);
190 /* Jump buffer for setjmp/longjmp */
191 static jmp_buf rem_com_env
;
193 /* TRA differs sh3/4 */
194 #if defined(CONFIG_CPU_SH3)
195 #define TRA 0xffffffd0
196 #elif defined(CONFIG_CPU_SH4)
197 #define TRA 0xff000020
200 /* Macros for single step instruction identification */
201 #define OPCODE_BT(op) (((op) & 0xff00) == 0x8900)
202 #define OPCODE_BF(op) (((op) & 0xff00) == 0x8b00)
203 #define OPCODE_BTF_DISP(op) (((op) & 0x80) ? (((op) | 0xffffff80) << 1) : \
204 (((op) & 0x7f ) << 1))
205 #define OPCODE_BFS(op) (((op) & 0xff00) == 0x8f00)
206 #define OPCODE_BTS(op) (((op) & 0xff00) == 0x8d00)
207 #define OPCODE_BRA(op) (((op) & 0xf000) == 0xa000)
208 #define OPCODE_BRA_DISP(op) (((op) & 0x800) ? (((op) | 0xfffff800) << 1) : \
209 (((op) & 0x7ff) << 1))
210 #define OPCODE_BRAF(op) (((op) & 0xf0ff) == 0x0023)
211 #define OPCODE_BRAF_REG(op) (((op) & 0x0f00) >> 8)
212 #define OPCODE_BSR(op) (((op) & 0xf000) == 0xb000)
213 #define OPCODE_BSR_DISP(op) (((op) & 0x800) ? (((op) | 0xfffff800) << 1) : \
214 (((op) & 0x7ff) << 1))
215 #define OPCODE_BSRF(op) (((op) & 0xf0ff) == 0x0003)
216 #define OPCODE_BSRF_REG(op) (((op) >> 8) & 0xf)
217 #define OPCODE_JMP(op) (((op) & 0xf0ff) == 0x402b)
218 #define OPCODE_JMP_REG(op) (((op) >> 8) & 0xf)
219 #define OPCODE_JSR(op) (((op) & 0xf0ff) == 0x400b)
220 #define OPCODE_JSR_REG(op) (((op) >> 8) & 0xf)
221 #define OPCODE_RTS(op) ((op) == 0xb)
222 #define OPCODE_RTE(op) ((op) == 0x2b)
224 #define SR_T_BIT_MASK 0x1
225 #define STEP_OPCODE 0xc320
226 #define BIOS_CALL_TRAP 0x3f
228 /* Exception codes as per SH-4 core manual */
229 #define ADDRESS_ERROR_LOAD_VEC 7
230 #define ADDRESS_ERROR_STORE_VEC 8
232 #define INVALID_INSN_VEC 12
233 #define INVALID_SLOT_VEC 13
235 #define USER_BREAK_VEC 15
236 #define SERIAL_BREAK_VEC 58
239 static int stepped_address
;
240 static short stepped_opcode
;
241 static char in_buffer
[BUFMAX
];
242 static char out_buffer
[OUTBUFMAX
];
244 static void kgdb_to_gdb(const char *s
);
246 /* Convert ch to hex */
247 static int hex(const char ch
)
249 if ((ch
>= 'a') && (ch
<= 'f'))
250 return (ch
- 'a' + 10);
251 if ((ch
>= '0') && (ch
<= '9'))
253 if ((ch
>= 'A') && (ch
<= 'F'))
254 return (ch
- 'A' + 10);
258 /* Convert the memory pointed to by mem into hex, placing result in buf.
259 Returns a pointer to the last char put in buf (null) */
260 static char *mem_to_hex(const char *mem
, char *buf
, const int count
)
264 unsigned short s_val
;
267 /* Check for 16 or 32 */
268 if (count
== 2 && ((long) mem
& 1) == 0) {
269 s_val
= *(unsigned short *) mem
;
270 mem
= (char *) &s_val
;
271 } else if (count
== 4 && ((long) mem
& 3) == 0) {
272 l_val
= *(unsigned long *) mem
;
273 mem
= (char *) &l_val
;
275 for (i
= 0; i
< count
; i
++) {
277 *buf
++ = highhex(ch
);
284 /* Convert the hex array pointed to by buf into binary, to be placed in mem.
285 Return a pointer to the character after the last byte written */
286 static char *hex_to_mem(const char *buf
, char *mem
, const int count
)
291 for (i
= 0; i
< count
; i
++) {
292 ch
= hex(*buf
++) << 4;
293 ch
= ch
+ hex(*buf
++);
299 /* While finding valid hex chars, convert to an integer, then return it */
300 static int hex_to_int(char **ptr
, int *int_value
)
308 hex_value
= hex(**ptr
);
309 if (hex_value
>= 0) {
310 *int_value
= (*int_value
<< 4) | hex_value
;
319 /* Copy the binary array pointed to by buf into mem. Fix $, #,
320 and 0x7d escaped with 0x7d. Return a pointer to the character
321 after the last byte written. */
322 static char *ebin_to_mem(const char *buf
, char *mem
, int count
)
324 for (; count
> 0; count
--, buf
++) {
326 *mem
++ = *(++buf
) ^ 0x20;
333 /* Scan for the start char '$', read the packet and check the checksum */
334 static void get_packet(char *buffer
, int buflen
)
336 unsigned char checksum
;
337 unsigned char xmitcsum
;
343 /* Ignore everything until the start character */
344 while ((ch
= get_debug_char()) != '$');
350 /* Now, read until a # or end of buffer is found */
351 while (count
< (buflen
- 1)) {
352 ch
= get_debug_char();
357 checksum
= checksum
+ ch
;
364 /* Continue to read checksum following # */
366 xmitcsum
= hex(get_debug_char()) << 4;
367 xmitcsum
+= hex(get_debug_char());
370 if (checksum
!= xmitcsum
)
371 put_debug_char('-'); /* Failed checksum */
373 /* Ack successful transfer */
376 /* If a sequence char is present, reply
378 if (buffer
[2] == ':') {
379 put_debug_char(buffer
[0]);
380 put_debug_char(buffer
[1]);
382 /* Remove sequence chars from buffer */
383 count
= strlen(buffer
);
384 for (i
= 3; i
<= count
; i
++)
385 buffer
[i
- 3] = buffer
[i
];
390 while (checksum
!= xmitcsum
); /* Keep trying while we fail */
393 /* Send the packet in the buffer with run-length encoding */
394 static void put_packet(char *buffer
)
406 /* Continue while we still have chars left */
408 /* Check for runs up to 99 chars long */
409 for (runlen
= 1; runlen
< 99; runlen
++) {
410 if (src
[0] != src
[runlen
])
415 /* Got a useful amount, send encoding */
416 encode
= runlen
+ ' ' - 4;
417 put_debug_char(*src
); checksum
+= *src
;
418 put_debug_char('*'); checksum
+= '*';
419 put_debug_char(encode
); checksum
+= encode
;
422 /* Otherwise just send the current char */
423 put_debug_char(*src
); checksum
+= *src
;
428 /* '#' Separator, put high and low components of checksum */
430 put_debug_char(highhex(checksum
));
431 put_debug_char(lowhex(checksum
));
433 while ((get_debug_char()) != '+'); /* While no ack */
436 /* A bus error has occurred - perform a longjmp to return execution and
437 allow handling of the error */
438 static void kgdb_handle_bus_error(void)
440 longjmp(rem_com_env
, 1);
443 /* Translate SH-3/4 exception numbers to unix-like signal values */
444 static int compute_signal(const int excep_code
)
448 switch (excep_code
) {
450 case INVALID_INSN_VEC
:
451 case INVALID_SLOT_VEC
:
454 case ADDRESS_ERROR_LOAD_VEC
:
455 case ADDRESS_ERROR_STORE_VEC
:
459 case SERIAL_BREAK_VEC
:
470 sigval
= SIGBUS
; /* "software generated" */
477 /* Make a local copy of the registers passed into the handler (bletch) */
478 static void kgdb_regs_to_gdb_regs(const struct kgdb_regs
*regs
,
481 gdb_regs
[R0
] = regs
->regs
[R0
];
482 gdb_regs
[R1
] = regs
->regs
[R1
];
483 gdb_regs
[R2
] = regs
->regs
[R2
];
484 gdb_regs
[R3
] = regs
->regs
[R3
];
485 gdb_regs
[R4
] = regs
->regs
[R4
];
486 gdb_regs
[R5
] = regs
->regs
[R5
];
487 gdb_regs
[R6
] = regs
->regs
[R6
];
488 gdb_regs
[R7
] = regs
->regs
[R7
];
489 gdb_regs
[R8
] = regs
->regs
[R8
];
490 gdb_regs
[R9
] = regs
->regs
[R9
];
491 gdb_regs
[R10
] = regs
->regs
[R10
];
492 gdb_regs
[R11
] = regs
->regs
[R11
];
493 gdb_regs
[R12
] = regs
->regs
[R12
];
494 gdb_regs
[R13
] = regs
->regs
[R13
];
495 gdb_regs
[R14
] = regs
->regs
[R14
];
496 gdb_regs
[R15
] = regs
->regs
[R15
];
497 gdb_regs
[PC
] = regs
->pc
;
498 gdb_regs
[PR
] = regs
->pr
;
499 gdb_regs
[GBR
] = regs
->gbr
;
500 gdb_regs
[MACH
] = regs
->mach
;
501 gdb_regs
[MACL
] = regs
->macl
;
502 gdb_regs
[SR
] = regs
->sr
;
503 gdb_regs
[VBR
] = regs
->vbr
;
506 /* Copy local gdb registers back to kgdb regs, for later copy to kernel */
507 static void gdb_regs_to_kgdb_regs(const int *gdb_regs
,
508 struct kgdb_regs
*regs
)
510 regs
->regs
[R0
] = gdb_regs
[R0
];
511 regs
->regs
[R1
] = gdb_regs
[R1
];
512 regs
->regs
[R2
] = gdb_regs
[R2
];
513 regs
->regs
[R3
] = gdb_regs
[R3
];
514 regs
->regs
[R4
] = gdb_regs
[R4
];
515 regs
->regs
[R5
] = gdb_regs
[R5
];
516 regs
->regs
[R6
] = gdb_regs
[R6
];
517 regs
->regs
[R7
] = gdb_regs
[R7
];
518 regs
->regs
[R8
] = gdb_regs
[R8
];
519 regs
->regs
[R9
] = gdb_regs
[R9
];
520 regs
->regs
[R10
] = gdb_regs
[R10
];
521 regs
->regs
[R11
] = gdb_regs
[R11
];
522 regs
->regs
[R12
] = gdb_regs
[R12
];
523 regs
->regs
[R13
] = gdb_regs
[R13
];
524 regs
->regs
[R14
] = gdb_regs
[R14
];
525 regs
->regs
[R15
] = gdb_regs
[R15
];
526 regs
->pc
= gdb_regs
[PC
];
527 regs
->pr
= gdb_regs
[PR
];
528 regs
->gbr
= gdb_regs
[GBR
];
529 regs
->mach
= gdb_regs
[MACH
];
530 regs
->macl
= gdb_regs
[MACL
];
531 regs
->sr
= gdb_regs
[SR
];
532 regs
->vbr
= gdb_regs
[VBR
];
535 /* Calculate the new address for after a step */
536 static short *get_step_address(void)
538 short op
= *(short *) trap_registers
.pc
;
543 if (trap_registers
.sr
& SR_T_BIT_MASK
)
544 addr
= trap_registers
.pc
+ 4 + OPCODE_BTF_DISP(op
);
546 addr
= trap_registers
.pc
+ 2;
550 else if (OPCODE_BTS(op
)) {
551 if (trap_registers
.sr
& SR_T_BIT_MASK
)
552 addr
= trap_registers
.pc
+ 4 + OPCODE_BTF_DISP(op
);
554 addr
= trap_registers
.pc
+ 4; /* Not in delay slot */
558 else if (OPCODE_BF(op
)) {
559 if (!(trap_registers
.sr
& SR_T_BIT_MASK
))
560 addr
= trap_registers
.pc
+ 4 + OPCODE_BTF_DISP(op
);
562 addr
= trap_registers
.pc
+ 2;
566 else if (OPCODE_BFS(op
)) {
567 if (!(trap_registers
.sr
& SR_T_BIT_MASK
))
568 addr
= trap_registers
.pc
+ 4 + OPCODE_BTF_DISP(op
);
570 addr
= trap_registers
.pc
+ 4; /* Not in delay slot */
574 else if (OPCODE_BRA(op
))
575 addr
= trap_registers
.pc
+ 4 + OPCODE_BRA_DISP(op
);
578 else if (OPCODE_BRAF(op
))
579 addr
= trap_registers
.pc
+ 4
580 + trap_registers
.regs
[OPCODE_BRAF_REG(op
)];
583 else if (OPCODE_BSR(op
))
584 addr
= trap_registers
.pc
+ 4 + OPCODE_BSR_DISP(op
);
587 else if (OPCODE_BSRF(op
))
588 addr
= trap_registers
.pc
+ 4
589 + trap_registers
.regs
[OPCODE_BSRF_REG(op
)];
592 else if (OPCODE_JMP(op
))
593 addr
= trap_registers
.regs
[OPCODE_JMP_REG(op
)];
596 else if (OPCODE_JSR(op
))
597 addr
= trap_registers
.regs
[OPCODE_JSR_REG(op
)];
600 else if (OPCODE_RTS(op
))
601 addr
= trap_registers
.pr
;
604 else if (OPCODE_RTE(op
))
605 addr
= trap_registers
.regs
[15];
609 addr
= trap_registers
.pc
+ 2;
611 flush_icache_range(addr
, addr
+ 2);
612 return (short *) addr
;
615 /* Set up a single-step. Replace the instruction immediately after the
616 current instruction (i.e. next in the expected flow of control) with a
617 trap instruction, so that returning will cause only a single instruction
618 to be executed. Note that this model is slightly broken for instructions
619 with delay slots (e.g. B[TF]S, BSR, BRA etc), where both the branch
620 and the instruction in the delay slot will be executed. */
621 static void do_single_step(void)
623 unsigned short *addr
= 0;
625 /* Determine where the target instruction will send us to */
626 addr
= get_step_address();
627 stepped_address
= (int)addr
;
630 stepped_opcode
= *(short *)addr
;
633 /* Flush and return */
634 flush_icache_range((long) addr
, (long) addr
+ 2);
637 /* Undo a single step */
638 static void undo_single_step(void)
640 /* If we have stepped, put back the old instruction */
641 /* Use stepped_address in case we stopped elsewhere */
642 if (stepped_opcode
!= 0) {
643 *(short*)stepped_address
= stepped_opcode
;
644 flush_icache_range(stepped_address
, stepped_address
+ 2);
649 /* Send a signal message */
650 static void send_signal_msg(const int signum
)
653 out_buffer
[1] = highhex(signum
);
654 out_buffer
[2] = lowhex(signum
);
656 put_packet(out_buffer
);
659 /* Reply that all was well */
660 static void send_ok_msg(void)
662 strcpy(out_buffer
, "OK");
663 put_packet(out_buffer
);
666 /* Reply that an error occurred */
667 static void send_err_msg(void)
669 strcpy(out_buffer
, "E01");
670 put_packet(out_buffer
);
673 /* Empty message indicates unrecognised command */
674 static void send_empty_msg(void)
679 /* Read memory due to 'm' message */
680 static void read_mem_msg(void)
686 /* Jmp, disable bus error handler */
687 if (setjmp(rem_com_env
) == 0) {
691 /* Walk through, have m<addr>,<length> */
693 if (hex_to_int(&ptr
, &addr
) && (*ptr
++ == ','))
694 if (hex_to_int(&ptr
, &length
)) {
696 if (length
* 2 > OUTBUFMAX
)
697 length
= OUTBUFMAX
/ 2;
698 mem_to_hex((char *) addr
, out_buffer
, length
);
703 put_packet(out_buffer
);
707 /* Restore bus error handler */
711 /* Write memory due to 'M' or 'X' message */
712 static void write_mem_msg(int binary
)
718 if (setjmp(rem_com_env
) == 0) {
722 /* Walk through, have M<addr>,<length>:<data> */
724 if (hex_to_int(&ptr
, &addr
) && (*ptr
++ == ','))
725 if (hex_to_int(&ptr
, &length
) && (*ptr
++ == ':')) {
727 ebin_to_mem(ptr
, (char*)addr
, length
);
729 hex_to_mem(ptr
, (char*)addr
, length
);
730 flush_icache_range(addr
, addr
+ length
);
739 /* Restore bus error handler */
743 /* Continue message */
744 static void continue_msg(void)
746 /* Try to read optional parameter, PC unchanged if none */
747 char *ptr
= &in_buffer
[1];
750 if (hex_to_int(&ptr
, &addr
))
751 trap_registers
.pc
= addr
;
754 /* Continue message with signal */
755 static void continue_with_sig_msg(void)
758 char *ptr
= &in_buffer
[1];
761 /* Report limitation */
762 kgdb_to_gdb("Cannot force signal in kgdb, continuing anyway.\n");
765 hex_to_int(&ptr
, &signal
);
769 /* Optional address */
770 if (hex_to_int(&ptr
, &addr
))
771 trap_registers
.pc
= addr
;
775 static void step_msg(void)
781 /* Step message with signal */
782 static void step_with_sig_msg(void)
784 continue_with_sig_msg();
788 /* Send register contents */
789 static void send_regs_msg(void)
791 kgdb_regs_to_gdb_regs(&trap_registers
, registers
);
792 mem_to_hex((char *) registers
, out_buffer
, NUMREGBYTES
);
793 put_packet(out_buffer
);
796 /* Set register contents - currently can't set other thread's registers */
797 static void set_regs_msg(void)
799 kgdb_regs_to_gdb_regs(&trap_registers
, registers
);
800 hex_to_mem(&in_buffer
[1], (char *) registers
, NUMREGBYTES
);
801 gdb_regs_to_kgdb_regs(registers
, &trap_registers
);
805 #ifdef CONFIG_SH_KGDB_CONSOLE
807 * Bring up the ports..
809 static int __init
kgdb_serial_setup(void)
811 struct console dummy
;
812 return kgdb_console_setup(&dummy
, 0);
815 #define kgdb_serial_setup() 0
818 /* The command loop, read and act on requests */
819 static void kgdb_command_loop(const int excep_code
, const int trapa_value
)
823 /* Enter GDB mode (e.g. after detach) */
824 if (!kgdb_in_gdb_mode
) {
825 /* Do serial setup, notify user, issue preemptive ack */
826 printk(KERN_NOTICE
"KGDB: Waiting for GDB\n");
827 kgdb_in_gdb_mode
= 1;
831 /* Reply to host that an exception has occurred */
832 sigval
= compute_signal(excep_code
);
833 send_signal_msg(sigval
);
835 /* TRAP_VEC exception indicates a software trap inserted in place of
836 code by GDB so back up PC by one instruction, as this instruction
837 will later be replaced by its original one. Do NOT do this for
838 trap 0xff, since that indicates a compiled-in breakpoint which
839 will not be replaced (and we would retake the trap forever) */
840 if ((excep_code
== TRAP_VEC
) && (trapa_value
!= (0x3c << 2)))
841 trap_registers
.pc
-= 2;
843 /* Undo any stepping we may have done */
848 get_packet(in_buffer
, BUFMAX
);
850 /* Examine first char of buffer to see what we need to do */
851 switch (in_buffer
[0]) {
852 case '?': /* Send which signal we've received */
853 send_signal_msg(sigval
);
856 case 'g': /* Return the values of the CPU registers */
860 case 'G': /* Set the value of the CPU registers */
864 case 'm': /* Read LLLL bytes address AA..AA */
868 case 'M': /* Write LLLL bytes address AA..AA, ret OK */
869 write_mem_msg(0); /* 0 = data in hex */
872 case 'X': /* Write LLLL bytes esc bin address AA..AA */
873 if (kgdb_bits
== '8')
874 write_mem_msg(1); /* 1 = data in binary */
879 case 'C': /* Continue, signum included, we ignore it */
880 continue_with_sig_msg();
883 case 'c': /* Continue at address AA..AA (optional) */
887 case 'S': /* Step, signum included, we ignore it */
891 case 's': /* Step one instruction from AA..AA */
895 case 'k': /* 'Kill the program' with a kernel ? */
898 case 'D': /* Detach from program, send reply OK */
899 kgdb_in_gdb_mode
= 0;
911 /* There has been an exception, most likely a breakpoint. */
912 static void handle_exception(struct pt_regs
*regs
)
914 int excep_code
, vbr_val
;
916 int trapa_value
= ctrl_inl(TRA
);
918 /* Copy kernel regs (from stack) */
919 for (count
= 0; count
< 16; count
++)
920 trap_registers
.regs
[count
] = regs
->regs
[count
];
921 trap_registers
.pc
= regs
->pc
;
922 trap_registers
.pr
= regs
->pr
;
923 trap_registers
.sr
= regs
->sr
;
924 trap_registers
.gbr
= regs
->gbr
;
925 trap_registers
.mach
= regs
->mach
;
926 trap_registers
.macl
= regs
->macl
;
928 asm("stc vbr, %0":"=r"(vbr_val
));
929 trap_registers
.vbr
= vbr_val
;
931 /* Get excode for command loop call, user access */
932 asm("stc r2_bank, %0":"=r"(excep_code
));
934 /* Act on the exception */
935 kgdb_command_loop(excep_code
, trapa_value
);
937 /* Copy back the (maybe modified) registers */
938 for (count
= 0; count
< 16; count
++)
939 regs
->regs
[count
] = trap_registers
.regs
[count
];
940 regs
->pc
= trap_registers
.pc
;
941 regs
->pr
= trap_registers
.pr
;
942 regs
->sr
= trap_registers
.sr
;
943 regs
->gbr
= trap_registers
.gbr
;
944 regs
->mach
= trap_registers
.mach
;
945 regs
->macl
= trap_registers
.macl
;
947 vbr_val
= trap_registers
.vbr
;
948 asm("ldc %0, vbr": :"r"(vbr_val
));
951 asmlinkage
void kgdb_handle_exception(unsigned long r4
, unsigned long r5
,
952 unsigned long r6
, unsigned long r7
,
953 struct pt_regs __regs
)
955 struct pt_regs
*regs
= RELOC_HIDE(&__regs
, 0);
956 handle_exception(regs
);
959 /* Initialise the KGDB data structures and serial configuration */
960 int __init
kgdb_init(void)
965 kgdb_in_gdb_mode
= 0;
967 if (kgdb_serial_setup() != 0) {
968 printk(KERN_NOTICE
"KGDB: serial setup error\n");
972 /* Init ptr to exception handler */
973 kgdb_debug_hook
= handle_exception
;
974 kgdb_bus_err_hook
= kgdb_handle_bus_error
;
976 /* Enter kgdb now if requested, or just report init done */
977 printk(KERN_NOTICE
"KGDB: stub is initialized.\n");
982 /* Make function available for "user messages"; console will use it too. */
984 char gdbmsgbuf
[BUFMAX
];
985 #define MAXOUT ((BUFMAX-2)/2)
987 static void kgdb_msg_write(const char *s
, unsigned count
)
996 /* Fill and send buffers... */
998 bufptr
= gdbmsgbuf
+ 1;
1000 /* Calculate how many this time */
1001 wcount
= (count
> MAXOUT
) ? MAXOUT
: count
;
1003 /* Pack in hex chars */
1004 for (i
= 0; i
< wcount
; i
++)
1005 bufptr
= pack_hex_byte(bufptr
, s
[i
]);
1013 put_packet(gdbmsgbuf
);
1017 static void kgdb_to_gdb(const char *s
)
1019 kgdb_msg_write(s
, strlen(s
));
1022 #ifdef CONFIG_SH_KGDB_CONSOLE
1023 void kgdb_console_write(struct console
*co
, const char *s
, unsigned count
)
1025 /* Bail if we're not talking to GDB */
1026 if (!kgdb_in_gdb_mode
)
1029 kgdb_msg_write(s
, count
);
1033 #ifdef CONFIG_KGDB_SYSRQ
1034 static void sysrq_handle_gdb(int key
, struct tty_struct
*tty
)
1036 printk("Entering GDB stub\n");
1040 static struct sysrq_key_op sysrq_gdb_op
= {
1041 .handler
= sysrq_handle_gdb
,
1043 .action_msg
= "GDB",
1046 static int gdb_register_sysrq(void)
1048 printk("Registering GDB sysrq handler\n");
1049 register_sysrq_key('g', &sysrq_gdb_op
);
1052 module_init(gdb_register_sysrq
);