Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/mn10300/kernel/kgdb.c
10817 views
1
/* kgdb support for MN10300
2
*
3
* Copyright (C) 2010 Red Hat, Inc. All Rights Reserved.
4
* Written by David Howells ([email protected])
5
*
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public Licence
8
* as published by the Free Software Foundation; either version
9
* 2 of the Licence, or (at your option) any later version.
10
*/
11
12
#include <linux/slab.h>
13
#include <linux/ptrace.h>
14
#include <linux/kgdb.h>
15
#include <linux/uaccess.h>
16
#include <unit/leds.h>
17
#include <unit/serial.h>
18
#include <asm/debugger.h>
19
#include <asm/serial-regs.h>
20
#include "internal.h"
21
22
/*
23
* Software single-stepping breakpoint save (used by __switch_to())
24
*/
25
static struct thread_info *kgdb_sstep_thread;
26
u8 *kgdb_sstep_bp_addr[2];
27
u8 kgdb_sstep_bp[2];
28
29
/*
30
* Copy kernel exception frame registers to the GDB register file
31
*/
32
void pt_regs_to_gdb_regs(unsigned long *gdb_regs, struct pt_regs *regs)
33
{
34
unsigned long ssp = (unsigned long) (regs + 1);
35
36
gdb_regs[GDB_FR_D0] = regs->d0;
37
gdb_regs[GDB_FR_D1] = regs->d1;
38
gdb_regs[GDB_FR_D2] = regs->d2;
39
gdb_regs[GDB_FR_D3] = regs->d3;
40
gdb_regs[GDB_FR_A0] = regs->a0;
41
gdb_regs[GDB_FR_A1] = regs->a1;
42
gdb_regs[GDB_FR_A2] = regs->a2;
43
gdb_regs[GDB_FR_A3] = regs->a3;
44
gdb_regs[GDB_FR_SP] = (regs->epsw & EPSW_nSL) ? regs->sp : ssp;
45
gdb_regs[GDB_FR_PC] = regs->pc;
46
gdb_regs[GDB_FR_MDR] = regs->mdr;
47
gdb_regs[GDB_FR_EPSW] = regs->epsw;
48
gdb_regs[GDB_FR_LIR] = regs->lir;
49
gdb_regs[GDB_FR_LAR] = regs->lar;
50
gdb_regs[GDB_FR_MDRQ] = regs->mdrq;
51
gdb_regs[GDB_FR_E0] = regs->e0;
52
gdb_regs[GDB_FR_E1] = regs->e1;
53
gdb_regs[GDB_FR_E2] = regs->e2;
54
gdb_regs[GDB_FR_E3] = regs->e3;
55
gdb_regs[GDB_FR_E4] = regs->e4;
56
gdb_regs[GDB_FR_E5] = regs->e5;
57
gdb_regs[GDB_FR_E6] = regs->e6;
58
gdb_regs[GDB_FR_E7] = regs->e7;
59
gdb_regs[GDB_FR_SSP] = ssp;
60
gdb_regs[GDB_FR_MSP] = 0;
61
gdb_regs[GDB_FR_USP] = regs->sp;
62
gdb_regs[GDB_FR_MCRH] = regs->mcrh;
63
gdb_regs[GDB_FR_MCRL] = regs->mcrl;
64
gdb_regs[GDB_FR_MCVF] = regs->mcvf;
65
gdb_regs[GDB_FR_DUMMY0] = 0;
66
gdb_regs[GDB_FR_DUMMY1] = 0;
67
gdb_regs[GDB_FR_FS0] = 0;
68
}
69
70
/*
71
* Extracts kernel SP/PC values understandable by gdb from the values
72
* saved by switch_to().
73
*/
74
void sleeping_thread_to_gdb_regs(unsigned long *gdb_regs, struct task_struct *p)
75
{
76
gdb_regs[GDB_FR_SSP] = p->thread.sp;
77
gdb_regs[GDB_FR_PC] = p->thread.pc;
78
gdb_regs[GDB_FR_A3] = p->thread.a3;
79
gdb_regs[GDB_FR_USP] = p->thread.usp;
80
gdb_regs[GDB_FR_FPCR] = p->thread.fpu_state.fpcr;
81
}
82
83
/*
84
* Fill kernel exception frame registers from the GDB register file
85
*/
86
void gdb_regs_to_pt_regs(unsigned long *gdb_regs, struct pt_regs *regs)
87
{
88
regs->d0 = gdb_regs[GDB_FR_D0];
89
regs->d1 = gdb_regs[GDB_FR_D1];
90
regs->d2 = gdb_regs[GDB_FR_D2];
91
regs->d3 = gdb_regs[GDB_FR_D3];
92
regs->a0 = gdb_regs[GDB_FR_A0];
93
regs->a1 = gdb_regs[GDB_FR_A1];
94
regs->a2 = gdb_regs[GDB_FR_A2];
95
regs->a3 = gdb_regs[GDB_FR_A3];
96
regs->sp = gdb_regs[GDB_FR_SP];
97
regs->pc = gdb_regs[GDB_FR_PC];
98
regs->mdr = gdb_regs[GDB_FR_MDR];
99
regs->epsw = gdb_regs[GDB_FR_EPSW];
100
regs->lir = gdb_regs[GDB_FR_LIR];
101
regs->lar = gdb_regs[GDB_FR_LAR];
102
regs->mdrq = gdb_regs[GDB_FR_MDRQ];
103
regs->e0 = gdb_regs[GDB_FR_E0];
104
regs->e1 = gdb_regs[GDB_FR_E1];
105
regs->e2 = gdb_regs[GDB_FR_E2];
106
regs->e3 = gdb_regs[GDB_FR_E3];
107
regs->e4 = gdb_regs[GDB_FR_E4];
108
regs->e5 = gdb_regs[GDB_FR_E5];
109
regs->e6 = gdb_regs[GDB_FR_E6];
110
regs->e7 = gdb_regs[GDB_FR_E7];
111
regs->sp = gdb_regs[GDB_FR_SSP];
112
/* gdb_regs[GDB_FR_MSP]; */
113
// regs->usp = gdb_regs[GDB_FR_USP];
114
regs->mcrh = gdb_regs[GDB_FR_MCRH];
115
regs->mcrl = gdb_regs[GDB_FR_MCRL];
116
regs->mcvf = gdb_regs[GDB_FR_MCVF];
117
/* gdb_regs[GDB_FR_DUMMY0]; */
118
/* gdb_regs[GDB_FR_DUMMY1]; */
119
120
// regs->fpcr = gdb_regs[GDB_FR_FPCR];
121
// regs->fs0 = gdb_regs[GDB_FR_FS0];
122
}
123
124
struct kgdb_arch arch_kgdb_ops = {
125
.gdb_bpt_instr = { 0xff },
126
.flags = KGDB_HW_BREAKPOINT,
127
};
128
129
static const unsigned char mn10300_kgdb_insn_sizes[256] =
130
{
131
/* 1 2 3 4 5 6 7 8 9 a b c d e f */
132
1, 3, 3, 3, 1, 3, 3, 3, 1, 3, 3, 3, 1, 3, 3, 3, /* 0 */
133
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 1 */
134
2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, /* 2 */
135
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, /* 3 */
136
1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, /* 4 */
137
1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, /* 5 */
138
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6 */
139
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 7 */
140
2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, /* 8 */
141
2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, /* 9 */
142
2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, /* a */
143
2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, /* b */
144
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 2, /* c */
145
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* d */
146
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* e */
147
0, 2, 2, 2, 2, 2, 2, 4, 0, 3, 0, 4, 0, 6, 7, 1 /* f */
148
};
149
150
/*
151
* Attempt to emulate single stepping by means of breakpoint instructions.
152
* Although there is a single-step trace flag in EPSW, its use is not
153
* sufficiently documented and is only intended for use with the JTAG debugger.
154
*/
155
static int kgdb_arch_do_singlestep(struct pt_regs *regs)
156
{
157
unsigned long arg;
158
unsigned size;
159
u8 *pc = (u8 *)regs->pc, *sp = (u8 *)(regs + 1), cur;
160
u8 *x = NULL, *y = NULL;
161
int ret;
162
163
ret = probe_kernel_read(&cur, pc, 1);
164
if (ret < 0)
165
return ret;
166
167
size = mn10300_kgdb_insn_sizes[cur];
168
if (size > 0) {
169
x = pc + size;
170
goto set_x;
171
}
172
173
switch (cur) {
174
/* Bxx (d8,PC) */
175
case 0xc0 ... 0xca:
176
ret = probe_kernel_read(&arg, pc + 1, 1);
177
if (ret < 0)
178
return ret;
179
x = pc + 2;
180
if (arg >= 0 && arg <= 2)
181
goto set_x;
182
y = pc + (s8)arg;
183
goto set_x_and_y;
184
185
/* LXX (d8,PC) */
186
case 0xd0 ... 0xda:
187
x = pc + 1;
188
if (regs->pc == regs->lar)
189
goto set_x;
190
y = (u8 *)regs->lar;
191
goto set_x_and_y;
192
193
/* SETLB - loads the next four bytes into the LIR register
194
* (which mustn't include a breakpoint instruction) */
195
case 0xdb:
196
x = pc + 5;
197
goto set_x;
198
199
/* JMP (d16,PC) or CALL (d16,PC) */
200
case 0xcc:
201
case 0xcd:
202
ret = probe_kernel_read(&arg, pc + 1, 2);
203
if (ret < 0)
204
return ret;
205
x = pc + (s16)arg;
206
goto set_x;
207
208
/* JMP (d32,PC) or CALL (d32,PC) */
209
case 0xdc:
210
case 0xdd:
211
ret = probe_kernel_read(&arg, pc + 1, 4);
212
if (ret < 0)
213
return ret;
214
x = pc + (s32)arg;
215
goto set_x;
216
217
/* RETF */
218
case 0xde:
219
x = (u8 *)regs->mdr;
220
goto set_x;
221
222
/* RET */
223
case 0xdf:
224
ret = probe_kernel_read(&arg, pc + 2, 1);
225
if (ret < 0)
226
return ret;
227
ret = probe_kernel_read(&x, sp + (s8)arg, 4);
228
if (ret < 0)
229
return ret;
230
goto set_x;
231
232
case 0xf0:
233
ret = probe_kernel_read(&cur, pc + 1, 1);
234
if (ret < 0)
235
return ret;
236
237
if (cur >= 0xf0 && cur <= 0xf7) {
238
/* JMP (An) / CALLS (An) */
239
switch (cur & 3) {
240
case 0: x = (u8 *)regs->a0; break;
241
case 1: x = (u8 *)regs->a1; break;
242
case 2: x = (u8 *)regs->a2; break;
243
case 3: x = (u8 *)regs->a3; break;
244
}
245
goto set_x;
246
} else if (cur == 0xfc) {
247
/* RETS */
248
ret = probe_kernel_read(&x, sp, 4);
249
if (ret < 0)
250
return ret;
251
goto set_x;
252
} else if (cur == 0xfd) {
253
/* RTI */
254
ret = probe_kernel_read(&x, sp + 4, 4);
255
if (ret < 0)
256
return ret;
257
goto set_x;
258
} else {
259
x = pc + 2;
260
goto set_x;
261
}
262
break;
263
264
/* potential 3-byte conditional branches */
265
case 0xf8:
266
ret = probe_kernel_read(&cur, pc + 1, 1);
267
if (ret < 0)
268
return ret;
269
x = pc + 3;
270
271
if (cur >= 0xe8 && cur <= 0xeb) {
272
ret = probe_kernel_read(&arg, pc + 2, 1);
273
if (ret < 0)
274
return ret;
275
if (arg >= 0 && arg <= 3)
276
goto set_x;
277
y = pc + (s8)arg;
278
goto set_x_and_y;
279
}
280
goto set_x;
281
282
case 0xfa:
283
ret = probe_kernel_read(&cur, pc + 1, 1);
284
if (ret < 0)
285
return ret;
286
287
if (cur == 0xff) {
288
/* CALLS (d16,PC) */
289
ret = probe_kernel_read(&arg, pc + 2, 2);
290
if (ret < 0)
291
return ret;
292
x = pc + (s16)arg;
293
goto set_x;
294
}
295
296
x = pc + 4;
297
goto set_x;
298
299
case 0xfc:
300
ret = probe_kernel_read(&cur, pc + 1, 1);
301
if (ret < 0)
302
return ret;
303
304
if (cur == 0xff) {
305
/* CALLS (d32,PC) */
306
ret = probe_kernel_read(&arg, pc + 2, 4);
307
if (ret < 0)
308
return ret;
309
x = pc + (s32)arg;
310
goto set_x;
311
}
312
313
x = pc + 6;
314
goto set_x;
315
}
316
317
return 0;
318
319
set_x:
320
kgdb_sstep_bp_addr[0] = x;
321
kgdb_sstep_bp_addr[1] = NULL;
322
ret = probe_kernel_read(&kgdb_sstep_bp[0], x, 1);
323
if (ret < 0)
324
return ret;
325
ret = probe_kernel_write(x, &arch_kgdb_ops.gdb_bpt_instr, 1);
326
if (ret < 0)
327
return ret;
328
kgdb_sstep_thread = current_thread_info();
329
debugger_local_cache_flushinv_one(x);
330
return ret;
331
332
set_x_and_y:
333
kgdb_sstep_bp_addr[0] = x;
334
kgdb_sstep_bp_addr[1] = y;
335
ret = probe_kernel_read(&kgdb_sstep_bp[0], x, 1);
336
if (ret < 0)
337
return ret;
338
ret = probe_kernel_read(&kgdb_sstep_bp[1], y, 1);
339
if (ret < 0)
340
return ret;
341
ret = probe_kernel_write(x, &arch_kgdb_ops.gdb_bpt_instr, 1);
342
if (ret < 0)
343
return ret;
344
ret = probe_kernel_write(y, &arch_kgdb_ops.gdb_bpt_instr, 1);
345
if (ret < 0) {
346
probe_kernel_write(kgdb_sstep_bp_addr[0],
347
&kgdb_sstep_bp[0], 1);
348
} else {
349
kgdb_sstep_thread = current_thread_info();
350
}
351
debugger_local_cache_flushinv_one(x);
352
debugger_local_cache_flushinv_one(y);
353
return ret;
354
}
355
356
/*
357
* Remove emplaced single-step breakpoints, returning true if we hit one of
358
* them.
359
*/
360
static bool kgdb_arch_undo_singlestep(struct pt_regs *regs)
361
{
362
bool hit = false;
363
u8 *x = kgdb_sstep_bp_addr[0], *y = kgdb_sstep_bp_addr[1];
364
u8 opcode;
365
366
if (kgdb_sstep_thread == current_thread_info()) {
367
if (x) {
368
if (x == (u8 *)regs->pc)
369
hit = true;
370
if (probe_kernel_read(&opcode, x,
371
1) < 0 ||
372
opcode != 0xff)
373
BUG();
374
probe_kernel_write(x, &kgdb_sstep_bp[0], 1);
375
debugger_local_cache_flushinv_one(x);
376
}
377
if (y) {
378
if (y == (u8 *)regs->pc)
379
hit = true;
380
if (probe_kernel_read(&opcode, y,
381
1) < 0 ||
382
opcode != 0xff)
383
BUG();
384
probe_kernel_write(y, &kgdb_sstep_bp[1], 1);
385
debugger_local_cache_flushinv_one(y);
386
}
387
}
388
389
kgdb_sstep_bp_addr[0] = NULL;
390
kgdb_sstep_bp_addr[1] = NULL;
391
kgdb_sstep_thread = NULL;
392
return hit;
393
}
394
395
/*
396
* Catch a single-step-pending thread being deleted and make sure the global
397
* single-step state is cleared. At this point the breakpoints should have
398
* been removed by __switch_to().
399
*/
400
void free_thread_info(struct thread_info *ti)
401
{
402
if (kgdb_sstep_thread == ti) {
403
kgdb_sstep_thread = NULL;
404
405
/* However, we may now be running in degraded mode, with most
406
* of the CPUs disabled until such a time as KGDB is reentered,
407
* so force immediate reentry */
408
kgdb_breakpoint();
409
}
410
kfree(ti);
411
}
412
413
/*
414
* Handle unknown packets and [CcsDk] packets
415
* - at this point breakpoints have been installed
416
*/
417
int kgdb_arch_handle_exception(int vector, int signo, int err_code,
418
char *remcom_in_buffer, char *remcom_out_buffer,
419
struct pt_regs *regs)
420
{
421
long addr;
422
char *ptr;
423
424
switch (remcom_in_buffer[0]) {
425
case 'c':
426
case 's':
427
/* try to read optional parameter, pc unchanged if no parm */
428
ptr = &remcom_in_buffer[1];
429
if (kgdb_hex2long(&ptr, &addr))
430
regs->pc = addr;
431
case 'D':
432
case 'k':
433
atomic_set(&kgdb_cpu_doing_single_step, -1);
434
435
if (remcom_in_buffer[0] == 's') {
436
kgdb_arch_do_singlestep(regs);
437
kgdb_single_step = 1;
438
atomic_set(&kgdb_cpu_doing_single_step,
439
raw_smp_processor_id());
440
}
441
return 0;
442
}
443
return -1; /* this means that we do not want to exit from the handler */
444
}
445
446
/*
447
* Handle event interception
448
* - returns 0 if the exception should be skipped, -ERROR otherwise.
449
*/
450
int debugger_intercept(enum exception_code excep, int signo, int si_code,
451
struct pt_regs *regs)
452
{
453
int ret;
454
455
if (kgdb_arch_undo_singlestep(regs)) {
456
excep = EXCEP_TRAP;
457
signo = SIGTRAP;
458
si_code = TRAP_TRACE;
459
}
460
461
ret = kgdb_handle_exception(excep, signo, si_code, regs);
462
463
debugger_local_cache_flushinv();
464
465
return ret;
466
}
467
468
/*
469
* Determine if we've hit a debugger special breakpoint
470
*/
471
int at_debugger_breakpoint(struct pt_regs *regs)
472
{
473
return regs->pc == (unsigned long)&__arch_kgdb_breakpoint;
474
}
475
476
/*
477
* Initialise kgdb
478
*/
479
int kgdb_arch_init(void)
480
{
481
return 0;
482
}
483
484
/*
485
* Do something, perhaps, but don't know what.
486
*/
487
void kgdb_arch_exit(void)
488
{
489
}
490
491
#ifdef CONFIG_SMP
492
void debugger_nmi_interrupt(struct pt_regs *regs, enum exception_code code)
493
{
494
kgdb_nmicallback(arch_smp_processor_id(), regs);
495
debugger_local_cache_flushinv();
496
}
497
498
void kgdb_roundup_cpus(unsigned long flags)
499
{
500
smp_jump_to_debugger();
501
}
502
#endif
503
504