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