2 * Copyright 2013 Tilera Corporation. All Rights Reserved.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
14 * TILE-Gx KGDB support.
17 #include <linux/ptrace.h>
18 #include <linux/kgdb.h>
19 #include <linux/kdebug.h>
20 #include <linux/uaccess.h>
21 #include <linux/module.h>
22 #include <asm/cacheflush.h>
24 static tile_bundle_bits singlestep_insn
= TILEGX_BPT_BUNDLE
| DIE_SSTEPBP
;
25 static unsigned long stepped_addr
;
26 static tile_bundle_bits stepped_instr
;
28 struct dbg_reg_def_t dbg_reg_def
[DBG_MAX_REG_NUM
] = {
29 { "r0", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[0])},
30 { "r1", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[1])},
31 { "r2", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[2])},
32 { "r3", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[3])},
33 { "r4", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[4])},
34 { "r5", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[5])},
35 { "r6", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[6])},
36 { "r7", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[7])},
37 { "r8", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[8])},
38 { "r9", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[9])},
39 { "r10", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[10])},
40 { "r11", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[11])},
41 { "r12", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[12])},
42 { "r13", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[13])},
43 { "r14", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[14])},
44 { "r15", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[15])},
45 { "r16", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[16])},
46 { "r17", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[17])},
47 { "r18", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[18])},
48 { "r19", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[19])},
49 { "r20", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[20])},
50 { "r21", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[21])},
51 { "r22", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[22])},
52 { "r23", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[23])},
53 { "r24", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[24])},
54 { "r25", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[25])},
55 { "r26", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[26])},
56 { "r27", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[27])},
57 { "r28", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[28])},
58 { "r29", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[29])},
59 { "r30", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[30])},
60 { "r31", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[31])},
61 { "r32", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[32])},
62 { "r33", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[33])},
63 { "r34", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[34])},
64 { "r35", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[35])},
65 { "r36", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[36])},
66 { "r37", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[37])},
67 { "r38", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[38])},
68 { "r39", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[39])},
69 { "r40", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[40])},
70 { "r41", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[41])},
71 { "r42", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[42])},
72 { "r43", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[43])},
73 { "r44", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[44])},
74 { "r45", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[45])},
75 { "r46", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[46])},
76 { "r47", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[47])},
77 { "r48", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[48])},
78 { "r49", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[49])},
79 { "r50", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[50])},
80 { "r51", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[51])},
81 { "r52", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, regs
[52])},
82 { "tp", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, tp
)},
83 { "sp", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, sp
)},
84 { "lr", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, lr
)},
85 { "sn", GDB_SIZEOF_REG
, -1},
86 { "idn0", GDB_SIZEOF_REG
, -1},
87 { "idn1", GDB_SIZEOF_REG
, -1},
88 { "udn0", GDB_SIZEOF_REG
, -1},
89 { "udn1", GDB_SIZEOF_REG
, -1},
90 { "udn2", GDB_SIZEOF_REG
, -1},
91 { "udn3", GDB_SIZEOF_REG
, -1},
92 { "zero", GDB_SIZEOF_REG
, -1},
93 { "pc", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, pc
)},
94 { "faultnum", GDB_SIZEOF_REG
, offsetof(struct pt_regs
, faultnum
)},
97 char *dbg_get_reg(int regno
, void *mem
, struct pt_regs
*regs
)
99 if (regno
>= DBG_MAX_REG_NUM
|| regno
< 0)
102 if (dbg_reg_def
[regno
].offset
!= -1)
103 memcpy(mem
, (void *)regs
+ dbg_reg_def
[regno
].offset
,
104 dbg_reg_def
[regno
].size
);
106 memset(mem
, 0, dbg_reg_def
[regno
].size
);
107 return dbg_reg_def
[regno
].name
;
110 int dbg_set_reg(int regno
, void *mem
, struct pt_regs
*regs
)
112 if (regno
>= DBG_MAX_REG_NUM
|| regno
< 0)
115 if (dbg_reg_def
[regno
].offset
!= -1)
116 memcpy((void *)regs
+ dbg_reg_def
[regno
].offset
, mem
,
117 dbg_reg_def
[regno
].size
);
122 * Similar to pt_regs_to_gdb_regs() except that process is sleeping and so
123 * we may not be able to get all the info.
126 sleeping_thread_to_gdb_regs(unsigned long *gdb_regs
, struct task_struct
*task
)
129 struct pt_regs
*thread_regs
;
130 unsigned long *ptr
= gdb_regs
;
135 /* Initialize to zero. */
136 memset(gdb_regs
, 0, NUMREGBYTES
);
138 thread_regs
= task_pt_regs(task
);
139 for (reg
= 0; reg
<= TREG_LAST_GPR
; reg
++)
140 *(ptr
++) = thread_regs
->regs
[reg
];
142 gdb_regs
[TILEGX_PC_REGNUM
] = thread_regs
->pc
;
143 gdb_regs
[TILEGX_FAULTNUM_REGNUM
] = thread_regs
->faultnum
;
146 void kgdb_arch_set_pc(struct pt_regs
*regs
, unsigned long pc
)
151 static void kgdb_call_nmi_hook(void *ignored
)
153 kgdb_nmicallback(raw_smp_processor_id(), NULL
);
156 void kgdb_roundup_cpus(unsigned long flags
)
159 smp_call_function(kgdb_call_nmi_hook
, NULL
, 0);
164 * Convert a kernel address to the writable kernel text mapping.
166 static unsigned long writable_address(unsigned long addr
)
168 unsigned long ret
= 0;
170 if (core_kernel_text(addr
))
171 ret
= addr
- MEM_SV_START
+ PAGE_OFFSET
;
172 else if (is_module_text_address(addr
))
175 pr_err("Unknown virtual address 0x%lx\n", addr
);
181 * Calculate the new address for after a step.
183 static unsigned long get_step_address(struct pt_regs
*regs
)
190 tile_bundle_bits bundle
;
192 /* Move to the next instruction by default. */
193 addr
= regs
->pc
+ TILEGX_BUNDLE_SIZE_IN_BYTES
;
194 bundle
= *(unsigned long *)instruction_pointer(regs
);
196 /* 0: X mode, Otherwise: Y mode. */
197 if (bundle
& TILEGX_BUNDLE_MODE_MASK
) {
198 if (get_Opcode_Y1(bundle
) == RRR_1_OPCODE_Y1
&&
199 get_RRROpcodeExtension_Y1(bundle
) ==
200 UNARY_RRR_1_OPCODE_Y1
) {
201 opcode
= get_UnaryOpcodeExtension_Y1(bundle
);
204 case JALR_UNARY_OPCODE_Y1
:
205 case JALRP_UNARY_OPCODE_Y1
:
206 case JR_UNARY_OPCODE_Y1
:
207 case JRP_UNARY_OPCODE_Y1
:
208 src_reg
= get_SrcA_Y1(bundle
);
209 dbg_get_reg(src_reg
, &addr
, regs
);
213 } else if (get_Opcode_X1(bundle
) == RRR_0_OPCODE_X1
) {
214 if (get_RRROpcodeExtension_X1(bundle
) ==
215 UNARY_RRR_0_OPCODE_X1
) {
216 opcode
= get_UnaryOpcodeExtension_X1(bundle
);
219 case JALR_UNARY_OPCODE_X1
:
220 case JALRP_UNARY_OPCODE_X1
:
221 case JR_UNARY_OPCODE_X1
:
222 case JRP_UNARY_OPCODE_X1
:
223 src_reg
= get_SrcA_X1(bundle
);
224 dbg_get_reg(src_reg
, &addr
, regs
);
228 } else if (get_Opcode_X1(bundle
) == JUMP_OPCODE_X1
) {
229 opcode
= get_JumpOpcodeExtension_X1(bundle
);
232 case JAL_JUMP_OPCODE_X1
:
233 case J_JUMP_OPCODE_X1
:
234 jump_off
= sign_extend(get_JumpOff_X1(bundle
), 27);
236 (jump_off
<< TILEGX_LOG2_BUNDLE_SIZE_IN_BYTES
);
239 } else if (get_Opcode_X1(bundle
) == BRANCH_OPCODE_X1
) {
241 opcode
= get_BrType_X1(bundle
);
244 case BEQZT_BRANCH_OPCODE_X1
:
245 case BEQZ_BRANCH_OPCODE_X1
:
246 if (get_SrcA_X1(bundle
) == 0)
247 br_off
= get_BrOff_X1(bundle
);
249 case BGEZT_BRANCH_OPCODE_X1
:
250 case BGEZ_BRANCH_OPCODE_X1
:
251 if (get_SrcA_X1(bundle
) >= 0)
252 br_off
= get_BrOff_X1(bundle
);
254 case BGTZT_BRANCH_OPCODE_X1
:
255 case BGTZ_BRANCH_OPCODE_X1
:
256 if (get_SrcA_X1(bundle
) > 0)
257 br_off
= get_BrOff_X1(bundle
);
259 case BLBCT_BRANCH_OPCODE_X1
:
260 case BLBC_BRANCH_OPCODE_X1
:
261 if (!(get_SrcA_X1(bundle
) & 1))
262 br_off
= get_BrOff_X1(bundle
);
264 case BLBST_BRANCH_OPCODE_X1
:
265 case BLBS_BRANCH_OPCODE_X1
:
266 if (get_SrcA_X1(bundle
) & 1)
267 br_off
= get_BrOff_X1(bundle
);
269 case BLEZT_BRANCH_OPCODE_X1
:
270 case BLEZ_BRANCH_OPCODE_X1
:
271 if (get_SrcA_X1(bundle
) <= 0)
272 br_off
= get_BrOff_X1(bundle
);
274 case BLTZT_BRANCH_OPCODE_X1
:
275 case BLTZ_BRANCH_OPCODE_X1
:
276 if (get_SrcA_X1(bundle
) < 0)
277 br_off
= get_BrOff_X1(bundle
);
279 case BNEZT_BRANCH_OPCODE_X1
:
280 case BNEZ_BRANCH_OPCODE_X1
:
281 if (get_SrcA_X1(bundle
) != 0)
282 br_off
= get_BrOff_X1(bundle
);
287 br_off
= sign_extend(br_off
, 17);
289 (br_off
<< TILEGX_LOG2_BUNDLE_SIZE_IN_BYTES
);
297 * Replace the next instruction after the current instruction with a
298 * breakpoint instruction.
300 static void do_single_step(struct pt_regs
*regs
)
302 unsigned long addr_wr
;
304 /* Determine where the target instruction will send us to. */
305 stepped_addr
= get_step_address(regs
);
306 probe_kernel_read((char *)&stepped_instr
, (char *)stepped_addr
,
309 addr_wr
= writable_address(stepped_addr
);
310 probe_kernel_write((char *)addr_wr
, (char *)&singlestep_insn
,
313 flush_icache_range(stepped_addr
, stepped_addr
+ BREAK_INSTR_SIZE
);
316 static void undo_single_step(struct pt_regs
*regs
)
318 unsigned long addr_wr
;
320 if (stepped_instr
== 0)
323 addr_wr
= writable_address(stepped_addr
);
324 probe_kernel_write((char *)addr_wr
, (char *)&stepped_instr
,
328 flush_icache_range(stepped_addr
, stepped_addr
+ BREAK_INSTR_SIZE
);
332 * Calls linux_debug_hook before the kernel dies. If KGDB is enabled,
333 * then try to fall into the debugger.
336 kgdb_notify(struct notifier_block
*self
, unsigned long cmd
, void *ptr
)
340 struct die_args
*args
= (struct die_args
*)ptr
;
341 struct pt_regs
*regs
= args
->regs
;
343 #ifdef CONFIG_KPROBES
345 * Return immediately if the kprobes fault notifier has set
348 if (cmd
== DIE_PAGE_FAULT
)
350 #endif /* CONFIG_KPROBES */
354 case DIE_COMPILED_BPT
:
357 local_irq_save(flags
);
358 kgdb_handle_exception(0, SIGTRAP
, 0, regs
);
359 local_irq_restore(flags
);
362 /* Userspace events, ignore. */
367 local_irq_save(flags
);
368 ret
= kgdb_handle_exception(args
->trapnr
, args
->signr
, args
->err
, regs
);
369 local_irq_restore(flags
);
376 static struct notifier_block kgdb_notifier
= {
377 .notifier_call
= kgdb_notify
,
381 * kgdb_arch_handle_exception - Handle architecture specific GDB packets.
382 * @vector: The error vector of the exception that happened.
383 * @signo: The signal number of the exception that happened.
384 * @err_code: The error code of the exception that happened.
385 * @remcom_in_buffer: The buffer of the packet we have read.
386 * @remcom_out_buffer: The buffer of %BUFMAX bytes to write a packet into.
387 * @regs: The &struct pt_regs of the current process.
389 * This function MUST handle the 'c' and 's' command packets,
390 * as well packets to set / remove a hardware breakpoint, if used.
391 * If there are additional packets which the hardware needs to handle,
392 * they are handled here. The code should return -1 if it wants to
393 * process more packets, and a %0 or %1 if it wants to exit from the
396 int kgdb_arch_handle_exception(int vector
, int signo
, int err_code
,
397 char *remcom_in_buffer
, char *remcom_out_buffer
,
398 struct pt_regs
*regs
)
401 unsigned long address
;
403 /* Undo any stepping we may have done. */
404 undo_single_step(regs
);
406 switch (remcom_in_buffer
[0]) {
412 * Try to read optional parameter, pc unchanged if no parm.
413 * If this was a compiled-in breakpoint, we need to move
414 * to the next instruction or we will just breakpoint
415 * over and over again.
417 ptr
= &remcom_in_buffer
[1];
418 if (kgdb_hex2long(&ptr
, &address
))
420 else if (*(unsigned long *)regs
->pc
== compiled_bpt
)
421 regs
->pc
+= BREAK_INSTR_SIZE
;
423 if (remcom_in_buffer
[0] == 's') {
424 do_single_step(regs
);
425 kgdb_single_step
= 1;
426 atomic_set(&kgdb_cpu_doing_single_step
,
427 raw_smp_processor_id());
429 atomic_set(&kgdb_cpu_doing_single_step
, -1);
434 return -1; /* this means that we do not want to exit from the handler */
437 struct kgdb_arch arch_kgdb_ops
;
440 * kgdb_arch_init - Perform any architecture specific initalization.
442 * This function will handle the initalization of any architecture
443 * specific callbacks.
445 int kgdb_arch_init(void)
447 tile_bundle_bits bundle
= TILEGX_BPT_BUNDLE
;
449 memcpy(arch_kgdb_ops
.gdb_bpt_instr
, &bundle
, BREAK_INSTR_SIZE
);
450 return register_die_notifier(&kgdb_notifier
);
454 * kgdb_arch_exit - Perform any architecture specific uninitalization.
456 * This function will handle the uninitalization of any architecture
457 * specific callbacks, for dynamic registration and unregistration.
459 void kgdb_arch_exit(void)
461 unregister_die_notifier(&kgdb_notifier
);
464 int kgdb_arch_set_breakpoint(struct kgdb_bkpt
*bpt
)
467 unsigned long addr_wr
= writable_address(bpt
->bpt_addr
);
472 err
= probe_kernel_read(bpt
->saved_instr
, (char *)bpt
->bpt_addr
,
477 err
= probe_kernel_write((char *)addr_wr
, arch_kgdb_ops
.gdb_bpt_instr
,
480 flush_icache_range((unsigned long)bpt
->bpt_addr
,
481 (unsigned long)bpt
->bpt_addr
+ BREAK_INSTR_SIZE
);
485 int kgdb_arch_remove_breakpoint(struct kgdb_bkpt
*bpt
)
488 unsigned long addr_wr
= writable_address(bpt
->bpt_addr
);
493 err
= probe_kernel_write((char *)addr_wr
, (char *)bpt
->saved_instr
,
496 flush_icache_range((unsigned long)bpt
->bpt_addr
,
497 (unsigned long)bpt
->bpt_addr
+ BREAK_INSTR_SIZE
);