blob: b38bb25dbbb3467ccfa8d4acdf3b53b003bf4e8d [file] [log] [blame]
Jason Wesseldc7d5522008-04-17 20:05:37 +02001/*
Jason Wessel53197fc2010-04-02 11:48:03 -05002 * Kernel Debug Core
Jason Wesseldc7d5522008-04-17 20:05:37 +02003 *
4 * Maintainer: Jason Wessel <jason.wessel@windriver.com>
5 *
6 * Copyright (C) 2000-2001 VERITAS Software Corporation.
7 * Copyright (C) 2002-2004 Timesys Corporation
8 * Copyright (C) 2003-2004 Amit S. Kale <amitkale@linsyssoft.com>
9 * Copyright (C) 2004 Pavel Machek <pavel@suse.cz>
10 * Copyright (C) 2004-2006 Tom Rini <trini@kernel.crashing.org>
11 * Copyright (C) 2004-2006 LinSysSoft Technologies Pvt. Ltd.
Jason Wessel53197fc2010-04-02 11:48:03 -050012 * Copyright (C) 2005-2009 Wind River Systems, Inc.
Jason Wesseldc7d5522008-04-17 20:05:37 +020013 * Copyright (C) 2007 MontaVista Software, Inc.
14 * Copyright (C) 2008 Red Hat, Inc., Ingo Molnar <mingo@redhat.com>
15 *
16 * Contributors at various stages not listed above:
17 * Jason Wessel ( jason.wessel@windriver.com )
18 * George Anzinger <george@mvista.com>
19 * Anurekh Saxena (anurekh.saxena@timesys.com)
20 * Lake Stevens Instrument Division (Glenn Engel)
21 * Jim Kingdon, Cygnus Support.
22 *
23 * Original KGDB stub: David Grothe <dave@gcom.com>,
24 * Tigran Aivazian <tigran@sco.com>
25 *
26 * This file is licensed under the terms of the GNU General Public License
27 * version 2. This program is licensed "as is" without any warranty of any
28 * kind, whether express or implied.
29 */
30#include <linux/pid_namespace.h>
Jason Wessel7c3078b2008-02-15 14:55:54 -060031#include <linux/clocksource.h>
Jason Wesseldc7d5522008-04-17 20:05:37 +020032#include <linux/interrupt.h>
33#include <linux/spinlock.h>
34#include <linux/console.h>
35#include <linux/threads.h>
36#include <linux/uaccess.h>
37#include <linux/kernel.h>
38#include <linux/module.h>
39#include <linux/ptrace.h>
Jason Wesseldc7d5522008-04-17 20:05:37 +020040#include <linux/string.h>
41#include <linux/delay.h>
42#include <linux/sched.h>
43#include <linux/sysrq.h>
44#include <linux/init.h>
45#include <linux/kgdb.h>
Jason Wesseldcc78712010-05-20 21:04:21 -050046#include <linux/kdb.h>
Jason Wesseldc7d5522008-04-17 20:05:37 +020047#include <linux/pid.h>
48#include <linux/smp.h>
49#include <linux/mm.h>
50
51#include <asm/cacheflush.h>
52#include <asm/byteorder.h>
53#include <asm/atomic.h>
54#include <asm/system.h>
Jason Wessel53197fc2010-04-02 11:48:03 -050055
56#include "debug_core.h"
Jason Wesseldc7d5522008-04-17 20:05:37 +020057
58static int kgdb_break_asap;
59
Jason Wessel53197fc2010-04-02 11:48:03 -050060struct debuggerinfo_struct kgdb_info[NR_CPUS];
Jason Wesseldc7d5522008-04-17 20:05:37 +020061
62/**
63 * kgdb_connected - Is a host GDB connected to us?
64 */
65int kgdb_connected;
66EXPORT_SYMBOL_GPL(kgdb_connected);
67
68/* All the KGDB handlers are installed */
Jason Wesself503b5a2010-05-20 21:04:25 -050069int kgdb_io_module_registered;
Jason Wesseldc7d5522008-04-17 20:05:37 +020070
71/* Guard for recursive entry */
72static int exception_level;
73
Jason Wessel53197fc2010-04-02 11:48:03 -050074struct kgdb_io *dbg_io_ops;
Jason Wesseldc7d5522008-04-17 20:05:37 +020075static DEFINE_SPINLOCK(kgdb_registration_lock);
76
77/* kgdb console driver is loaded */
78static int kgdb_con_registered;
79/* determine if kgdb console output should be used */
80static int kgdb_use_con;
Jason Wesseldcc78712010-05-20 21:04:21 -050081/* Next cpu to become the master debug core */
82int dbg_switch_cpu;
83
84/* Use kdb or gdbserver mode */
Jason Wessela0de0552010-05-20 21:04:24 -050085int dbg_kdb_mode = 1;
Jason Wesseldc7d5522008-04-17 20:05:37 +020086
87static int __init opt_kgdb_con(char *str)
88{
89 kgdb_use_con = 1;
90 return 0;
91}
92
93early_param("kgdbcon", opt_kgdb_con);
94
95module_param(kgdb_use_con, int, 0644);
96
97/*
98 * Holds information about breakpoints in a kernel. These breakpoints are
99 * added and removed by gdb.
100 */
101static struct kgdb_bkpt kgdb_break[KGDB_MAX_BREAKPOINTS] = {
102 [0 ... KGDB_MAX_BREAKPOINTS-1] = { .state = BP_UNDEFINED }
103};
104
105/*
106 * The CPU# of the active CPU, or -1 if none:
107 */
108atomic_t kgdb_active = ATOMIC_INIT(-1);
Jason Wesseldcc78712010-05-20 21:04:21 -0500109EXPORT_SYMBOL_GPL(kgdb_active);
Jason Wesseldc7d5522008-04-17 20:05:37 +0200110
111/*
112 * We use NR_CPUs not PERCPU, in case kgdb is used to debug early
113 * bootup code (which might not have percpu set up yet):
114 */
115static atomic_t passive_cpu_wait[NR_CPUS];
116static atomic_t cpu_in_kgdb[NR_CPUS];
Jason Wessel1cee5e32009-06-03 14:06:57 -0500117static atomic_t kgdb_break_tasklet_var;
Jason Wesseldc7d5522008-04-17 20:05:37 +0200118atomic_t kgdb_setting_breakpoint;
119
120struct task_struct *kgdb_usethread;
121struct task_struct *kgdb_contthread;
122
123int kgdb_single_step;
Jason Wessel53197fc2010-04-02 11:48:03 -0500124static pid_t kgdb_sstep_pid;
Jason Wesseldc7d5522008-04-17 20:05:37 +0200125
126/* to keep track of the CPU which is doing the single stepping*/
127atomic_t kgdb_cpu_doing_single_step = ATOMIC_INIT(-1);
128
129/*
130 * If you are debugging a problem where roundup (the collection of
131 * all other CPUs) is a problem [this should be extremely rare],
132 * then use the nokgdbroundup option to avoid roundup. In that case
133 * the other CPUs might interfere with your debugging context, so
134 * use this with care:
135 */
Harvey Harrison688b7442008-04-24 16:57:23 -0500136static int kgdb_do_roundup = 1;
Jason Wesseldc7d5522008-04-17 20:05:37 +0200137
138static int __init opt_nokgdbroundup(char *str)
139{
140 kgdb_do_roundup = 0;
141
142 return 0;
143}
144
145early_param("nokgdbroundup", opt_nokgdbroundup);
146
147/*
148 * Finally, some KGDB code :-)
149 */
150
151/*
152 * Weak aliases for breakpoint management,
153 * can be overriden by architectures when needed:
154 */
Jason Wesseldc7d5522008-04-17 20:05:37 +0200155int __weak kgdb_arch_set_breakpoint(unsigned long addr, char *saved_instr)
156{
157 int err;
158
159 err = probe_kernel_read(saved_instr, (char *)addr, BREAK_INSTR_SIZE);
160 if (err)
161 return err;
162
163 return probe_kernel_write((char *)addr, arch_kgdb_ops.gdb_bpt_instr,
164 BREAK_INSTR_SIZE);
165}
166
167int __weak kgdb_arch_remove_breakpoint(unsigned long addr, char *bundle)
168{
169 return probe_kernel_write((char *)addr,
170 (char *)bundle, BREAK_INSTR_SIZE);
171}
172
Jason Wessela9b60bf2008-08-01 08:39:34 -0500173int __weak kgdb_validate_break_address(unsigned long addr)
174{
175 char tmp_variable[BREAK_INSTR_SIZE];
176 int err;
177 /* Validate setting the breakpoint and then removing it. In the
178 * remove fails, the kernel needs to emit a bad message because we
179 * are deep trouble not being able to put things back the way we
180 * found them.
181 */
182 err = kgdb_arch_set_breakpoint(addr, tmp_variable);
183 if (err)
184 return err;
185 err = kgdb_arch_remove_breakpoint(addr, tmp_variable);
186 if (err)
187 printk(KERN_ERR "KGDB: Critical breakpoint error, kernel "
188 "memory destroyed at: %lx", addr);
189 return err;
190}
191
Jason Wesseldc7d5522008-04-17 20:05:37 +0200192unsigned long __weak kgdb_arch_pc(int exception, struct pt_regs *regs)
193{
194 return instruction_pointer(regs);
195}
196
197int __weak kgdb_arch_init(void)
198{
199 return 0;
200}
201
Jason Wesselb4b8ac52008-02-20 13:33:38 -0600202int __weak kgdb_skipexception(int exception, struct pt_regs *regs)
203{
204 return 0;
205}
206
Jason Wesseldc7d5522008-04-17 20:05:37 +0200207/**
208 * kgdb_disable_hw_debug - Disable hardware debugging while we in kgdb.
209 * @regs: Current &struct pt_regs.
210 *
211 * This function will be called if the particular architecture must
212 * disable hardware debugging while it is processing gdb packets or
213 * handling exception.
214 */
215void __weak kgdb_disable_hw_debug(struct pt_regs *regs)
216{
217}
218
219/*
Jason Wesseldc7d5522008-04-17 20:05:37 +0200220 * Some architectures need cache flushes when we set/clear a
221 * breakpoint:
222 */
223static void kgdb_flush_swbreak_addr(unsigned long addr)
224{
225 if (!CACHE_FLUSH_IS_SAFE)
226 return;
227
Jason Wessel737a4602008-03-07 16:34:16 -0600228 if (current->mm && current->mm->mmap_cache) {
Jason Wesseldc7d5522008-04-17 20:05:37 +0200229 flush_cache_range(current->mm->mmap_cache,
230 addr, addr + BREAK_INSTR_SIZE);
Jason Wesseldc7d5522008-04-17 20:05:37 +0200231 }
Jason Wessel1a9a3e72008-04-01 16:55:28 -0500232 /* Force flush instruction cache if it was outside the mm */
233 flush_icache_range(addr, addr + BREAK_INSTR_SIZE);
Jason Wesseldc7d5522008-04-17 20:05:37 +0200234}
235
236/*
237 * SW breakpoint management:
238 */
Jason Wessel53197fc2010-04-02 11:48:03 -0500239int dbg_activate_sw_breakpoints(void)
Jason Wesseldc7d5522008-04-17 20:05:37 +0200240{
241 unsigned long addr;
Jason Wessel7f8b7ed62009-12-11 08:43:20 -0600242 int error;
243 int ret = 0;
Jason Wesseldc7d5522008-04-17 20:05:37 +0200244 int i;
245
246 for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++) {
247 if (kgdb_break[i].state != BP_SET)
248 continue;
249
250 addr = kgdb_break[i].bpt_addr;
251 error = kgdb_arch_set_breakpoint(addr,
252 kgdb_break[i].saved_instr);
Jason Wessel7f8b7ed62009-12-11 08:43:20 -0600253 if (error) {
254 ret = error;
255 printk(KERN_INFO "KGDB: BP install failed: %lx", addr);
256 continue;
257 }
Jason Wesseldc7d5522008-04-17 20:05:37 +0200258
259 kgdb_flush_swbreak_addr(addr);
260 kgdb_break[i].state = BP_ACTIVE;
261 }
Jason Wessel7f8b7ed62009-12-11 08:43:20 -0600262 return ret;
Jason Wesseldc7d5522008-04-17 20:05:37 +0200263}
264
Jason Wessel53197fc2010-04-02 11:48:03 -0500265int dbg_set_sw_break(unsigned long addr)
Jason Wesseldc7d5522008-04-17 20:05:37 +0200266{
267 int err = kgdb_validate_break_address(addr);
268 int breakno = -1;
269 int i;
270
271 if (err)
272 return err;
273
274 for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++) {
275 if ((kgdb_break[i].state == BP_SET) &&
276 (kgdb_break[i].bpt_addr == addr))
277 return -EEXIST;
278 }
279 for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++) {
280 if (kgdb_break[i].state == BP_REMOVED &&
281 kgdb_break[i].bpt_addr == addr) {
282 breakno = i;
283 break;
284 }
285 }
286
287 if (breakno == -1) {
288 for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++) {
289 if (kgdb_break[i].state == BP_UNDEFINED) {
290 breakno = i;
291 break;
292 }
293 }
294 }
295
296 if (breakno == -1)
297 return -E2BIG;
298
299 kgdb_break[breakno].state = BP_SET;
300 kgdb_break[breakno].type = BP_BREAKPOINT;
301 kgdb_break[breakno].bpt_addr = addr;
302
303 return 0;
304}
305
Jason Wesseldcc78712010-05-20 21:04:21 -0500306int dbg_deactivate_sw_breakpoints(void)
Jason Wesseldc7d5522008-04-17 20:05:37 +0200307{
308 unsigned long addr;
Jason Wessel7f8b7ed62009-12-11 08:43:20 -0600309 int error;
310 int ret = 0;
Jason Wesseldc7d5522008-04-17 20:05:37 +0200311 int i;
312
313 for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++) {
314 if (kgdb_break[i].state != BP_ACTIVE)
315 continue;
316 addr = kgdb_break[i].bpt_addr;
317 error = kgdb_arch_remove_breakpoint(addr,
318 kgdb_break[i].saved_instr);
Jason Wessel7f8b7ed62009-12-11 08:43:20 -0600319 if (error) {
320 printk(KERN_INFO "KGDB: BP remove failed: %lx\n", addr);
321 ret = error;
322 }
Jason Wesseldc7d5522008-04-17 20:05:37 +0200323
324 kgdb_flush_swbreak_addr(addr);
325 kgdb_break[i].state = BP_SET;
326 }
Jason Wessel7f8b7ed62009-12-11 08:43:20 -0600327 return ret;
Jason Wesseldc7d5522008-04-17 20:05:37 +0200328}
329
Jason Wessel53197fc2010-04-02 11:48:03 -0500330int dbg_remove_sw_break(unsigned long addr)
Jason Wesseldc7d5522008-04-17 20:05:37 +0200331{
332 int i;
333
334 for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++) {
335 if ((kgdb_break[i].state == BP_SET) &&
336 (kgdb_break[i].bpt_addr == addr)) {
337 kgdb_break[i].state = BP_REMOVED;
338 return 0;
339 }
340 }
341 return -ENOENT;
342}
343
344int kgdb_isremovedbreak(unsigned long addr)
345{
346 int i;
347
348 for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++) {
349 if ((kgdb_break[i].state == BP_REMOVED) &&
350 (kgdb_break[i].bpt_addr == addr))
351 return 1;
352 }
353 return 0;
354}
355
Jason Wessel53197fc2010-04-02 11:48:03 -0500356int dbg_remove_all_break(void)
Jason Wesseldc7d5522008-04-17 20:05:37 +0200357{
358 unsigned long addr;
359 int error;
360 int i;
361
362 /* Clear memory breakpoints. */
363 for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++) {
Jason Wessel737a4602008-03-07 16:34:16 -0600364 if (kgdb_break[i].state != BP_ACTIVE)
365 goto setundefined;
Jason Wesseldc7d5522008-04-17 20:05:37 +0200366 addr = kgdb_break[i].bpt_addr;
367 error = kgdb_arch_remove_breakpoint(addr,
368 kgdb_break[i].saved_instr);
369 if (error)
Jason Wessel737a4602008-03-07 16:34:16 -0600370 printk(KERN_ERR "KGDB: breakpoint remove failed: %lx\n",
371 addr);
372setundefined:
373 kgdb_break[i].state = BP_UNDEFINED;
Jason Wesseldc7d5522008-04-17 20:05:37 +0200374 }
375
376 /* Clear hardware breakpoints. */
377 if (arch_kgdb_ops.remove_all_hw_break)
378 arch_kgdb_ops.remove_all_hw_break();
379
380 return 0;
381}
382
383/*
Jason Wesseldc7d5522008-04-17 20:05:37 +0200384 * Return true if there is a valid kgdb I/O module. Also if no
385 * debugger is attached a message can be printed to the console about
386 * waiting for the debugger to attach.
387 *
388 * The print_wait argument is only to be true when called from inside
389 * the core kgdb_handle_exception, because it will wait for the
390 * debugger to attach.
391 */
392static int kgdb_io_ready(int print_wait)
393{
Jason Wessel53197fc2010-04-02 11:48:03 -0500394 if (!dbg_io_ops)
Jason Wesseldc7d5522008-04-17 20:05:37 +0200395 return 0;
396 if (kgdb_connected)
397 return 1;
398 if (atomic_read(&kgdb_setting_breakpoint))
399 return 1;
Jason Wesseldcc78712010-05-20 21:04:21 -0500400 if (print_wait) {
401#ifdef CONFIG_KGDB_KDB
402 if (!dbg_kdb_mode)
403 printk(KERN_CRIT "KGDB: waiting... or $3#33 for KDB\n");
404#else
Jason Wesseldc7d5522008-04-17 20:05:37 +0200405 printk(KERN_CRIT "KGDB: Waiting for remote debugger\n");
Jason Wesseldcc78712010-05-20 21:04:21 -0500406#endif
407 }
Jason Wesseldc7d5522008-04-17 20:05:37 +0200408 return 1;
409}
410
Jason Wesseldc7d5522008-04-17 20:05:37 +0200411static int kgdb_reenter_check(struct kgdb_state *ks)
412{
413 unsigned long addr;
414
415 if (atomic_read(&kgdb_active) != raw_smp_processor_id())
416 return 0;
417
418 /* Panic on recursive debugger calls: */
419 exception_level++;
420 addr = kgdb_arch_pc(ks->ex_vector, ks->linux_regs);
Jason Wesseldcc78712010-05-20 21:04:21 -0500421 dbg_deactivate_sw_breakpoints();
Jason Wesseldc7d5522008-04-17 20:05:37 +0200422
423 /*
424 * If the break point removed ok at the place exception
425 * occurred, try to recover and print a warning to the end
426 * user because the user planted a breakpoint in a place that
427 * KGDB needs in order to function.
428 */
Jason Wessel53197fc2010-04-02 11:48:03 -0500429 if (dbg_remove_sw_break(addr) == 0) {
Jason Wesseldc7d5522008-04-17 20:05:37 +0200430 exception_level = 0;
431 kgdb_skipexception(ks->ex_vector, ks->linux_regs);
Jason Wessel53197fc2010-04-02 11:48:03 -0500432 dbg_activate_sw_breakpoints();
Jason Wessel67baf942008-02-15 14:55:55 -0600433 printk(KERN_CRIT "KGDB: re-enter error: breakpoint removed %lx\n",
434 addr);
Jason Wesseldc7d5522008-04-17 20:05:37 +0200435 WARN_ON_ONCE(1);
436
437 return 1;
438 }
Jason Wessel53197fc2010-04-02 11:48:03 -0500439 dbg_remove_all_break();
Jason Wesseldc7d5522008-04-17 20:05:37 +0200440 kgdb_skipexception(ks->ex_vector, ks->linux_regs);
441
442 if (exception_level > 1) {
443 dump_stack();
444 panic("Recursive entry to debugger");
445 }
446
447 printk(KERN_CRIT "KGDB: re-enter exception: ALL breakpoints killed\n");
Jason Wessel6d906342010-05-20 21:04:27 -0500448#ifdef CONFIG_KGDB_KDB
449 /* Allow kdb to debug itself one level */
450 return 0;
451#endif
Jason Wesseldc7d5522008-04-17 20:05:37 +0200452 dump_stack();
453 panic("Recursive entry to debugger");
454
455 return 1;
456}
457
Jason Wesseldcc78712010-05-20 21:04:21 -0500458static void dbg_cpu_switch(int cpu, int next_cpu)
459{
460 /* Mark the cpu we are switching away from as a slave when it
461 * holds the kgdb_active token. This must be done so that the
462 * that all the cpus wait in for the debug core will not enter
463 * again as the master. */
464 if (cpu == atomic_read(&kgdb_active)) {
465 kgdb_info[cpu].exception_state |= DCPU_IS_SLAVE;
466 kgdb_info[cpu].exception_state &= ~DCPU_WANT_MASTER;
467 }
468 kgdb_info[next_cpu].exception_state |= DCPU_NEXT_MASTER;
469}
470
Jason Wessel62fae312010-04-02 11:47:02 -0500471static int kgdb_cpu_enter(struct kgdb_state *ks, struct pt_regs *regs)
Jason Wesseldc7d5522008-04-17 20:05:37 +0200472{
Jason Wesseldc7d5522008-04-17 20:05:37 +0200473 unsigned long flags;
Jason Wessel028e7b12009-12-11 08:43:17 -0600474 int sstep_tries = 100;
Jason Wesseldcc78712010-05-20 21:04:21 -0500475 int error;
Jason Wesseldc7d5522008-04-17 20:05:37 +0200476 int i, cpu;
Jason Wessel4da75b92010-04-02 11:57:18 -0500477 int trace_on = 0;
Jason Wesseldc7d5522008-04-17 20:05:37 +0200478acquirelock:
479 /*
480 * Interrupts will be restored by the 'trap return' code, except when
481 * single stepping.
482 */
483 local_irq_save(flags);
484
Jason Wessel62fae312010-04-02 11:47:02 -0500485 cpu = ks->cpu;
486 kgdb_info[cpu].debuggerinfo = regs;
487 kgdb_info[cpu].task = current;
Jason Wesseldcc78712010-05-20 21:04:21 -0500488 kgdb_info[cpu].ret_state = 0;
489 kgdb_info[cpu].irq_depth = hardirq_count() >> HARDIRQ_SHIFT;
Jason Wessel62fae312010-04-02 11:47:02 -0500490 /*
491 * Make sure the above info reaches the primary CPU before
492 * our cpu_in_kgdb[] flag setting does:
493 */
Jason Wesselae6bf532010-04-02 14:58:18 -0500494 atomic_inc(&cpu_in_kgdb[cpu]);
Jason Wesseldc7d5522008-04-17 20:05:37 +0200495
Jason Wessel6d906342010-05-20 21:04:27 -0500496 if (exception_level == 1)
497 goto cpu_master_loop;
498
Jason Wesseldc7d5522008-04-17 20:05:37 +0200499 /*
Jason Wessel62fae312010-04-02 11:47:02 -0500500 * CPU will loop if it is a slave or request to become a kgdb
501 * master cpu and acquire the kgdb_active lock:
Jason Wesseldc7d5522008-04-17 20:05:37 +0200502 */
Jason Wessel62fae312010-04-02 11:47:02 -0500503 while (1) {
Jason Wesseldcc78712010-05-20 21:04:21 -0500504cpu_loop:
505 if (kgdb_info[cpu].exception_state & DCPU_NEXT_MASTER) {
506 kgdb_info[cpu].exception_state &= ~DCPU_NEXT_MASTER;
507 goto cpu_master_loop;
508 } else if (kgdb_info[cpu].exception_state & DCPU_WANT_MASTER) {
Jason Wessel62fae312010-04-02 11:47:02 -0500509 if (atomic_cmpxchg(&kgdb_active, -1, cpu) == cpu)
510 break;
511 } else if (kgdb_info[cpu].exception_state & DCPU_IS_SLAVE) {
512 if (!atomic_read(&passive_cpu_wait[cpu]))
513 goto return_normal;
514 } else {
515return_normal:
516 /* Return to normal operation by executing any
517 * hw breakpoint fixup.
518 */
519 if (arch_kgdb_ops.correct_hw_break)
520 arch_kgdb_ops.correct_hw_break();
Jason Wessel4da75b92010-04-02 11:57:18 -0500521 if (trace_on)
522 tracing_on();
Jason Wesselae6bf532010-04-02 14:58:18 -0500523 atomic_dec(&cpu_in_kgdb[cpu]);
Jason Wessel62fae312010-04-02 11:47:02 -0500524 touch_softlockup_watchdog_sync();
525 clocksource_touch_watchdog();
526 local_irq_restore(flags);
527 return 0;
528 }
Jason Wesseldc7d5522008-04-17 20:05:37 +0200529 cpu_relax();
Jason Wessel62fae312010-04-02 11:47:02 -0500530 }
Jason Wesseldc7d5522008-04-17 20:05:37 +0200531
532 /*
Jason Wessel028e7b12009-12-11 08:43:17 -0600533 * For single stepping, try to only enter on the processor
534 * that was single stepping. To gaurd against a deadlock, the
535 * kernel will only try for the value of sstep_tries before
536 * giving up and continuing on.
Jason Wesseldc7d5522008-04-17 20:05:37 +0200537 */
538 if (atomic_read(&kgdb_cpu_doing_single_step) != -1 &&
Jason Wessel028e7b12009-12-11 08:43:17 -0600539 (kgdb_info[cpu].task &&
540 kgdb_info[cpu].task->pid != kgdb_sstep_pid) && --sstep_tries) {
Jason Wesseldc7d5522008-04-17 20:05:37 +0200541 atomic_set(&kgdb_active, -1);
Jason Wesseld6ad3e22010-01-27 16:25:22 -0600542 touch_softlockup_watchdog_sync();
Jason Wessel7c3078b2008-02-15 14:55:54 -0600543 clocksource_touch_watchdog();
Jason Wesseldc7d5522008-04-17 20:05:37 +0200544 local_irq_restore(flags);
545
546 goto acquirelock;
547 }
548
549 if (!kgdb_io_ready(1)) {
Jason Wesseldcc78712010-05-20 21:04:21 -0500550 kgdb_info[cpu].ret_state = 1;
Jason Wessel53197fc2010-04-02 11:48:03 -0500551 goto kgdb_restore; /* No I/O connection, resume the system */
Jason Wesseldc7d5522008-04-17 20:05:37 +0200552 }
553
554 /*
555 * Don't enter if we have hit a removed breakpoint.
556 */
557 if (kgdb_skipexception(ks->ex_vector, ks->linux_regs))
558 goto kgdb_restore;
559
560 /* Call the I/O driver's pre_exception routine */
Jason Wessel53197fc2010-04-02 11:48:03 -0500561 if (dbg_io_ops->pre_exception)
562 dbg_io_ops->pre_exception();
Jason Wesseldc7d5522008-04-17 20:05:37 +0200563
Jason Wesseldc7d5522008-04-17 20:05:37 +0200564 kgdb_disable_hw_debug(ks->linux_regs);
565
566 /*
567 * Get the passive CPU lock which will hold all the non-primary
568 * CPU in a spin state while the debugger is active
569 */
Jason Wesseld7161a62008-09-26 10:36:41 -0500570 if (!kgdb_single_step) {
Jason Wesseldc7d5522008-04-17 20:05:37 +0200571 for (i = 0; i < NR_CPUS; i++)
Jason Wesselae6bf532010-04-02 14:58:18 -0500572 atomic_inc(&passive_cpu_wait[i]);
Jason Wesseldc7d5522008-04-17 20:05:37 +0200573 }
574
Jason Wessel56fb7092008-04-01 16:55:27 -0500575#ifdef CONFIG_SMP
576 /* Signal the other CPUs to enter kgdb_wait() */
Jason Wesseld7161a62008-09-26 10:36:41 -0500577 if ((!kgdb_single_step) && kgdb_do_roundup)
Jason Wessel56fb7092008-04-01 16:55:27 -0500578 kgdb_roundup_cpus(flags);
579#endif
580
Jason Wesseldc7d5522008-04-17 20:05:37 +0200581 /*
582 * Wait for the other CPUs to be notified and be waiting for us:
583 */
584 for_each_online_cpu(i) {
Jason Wesseldcc78712010-05-20 21:04:21 -0500585 while (kgdb_do_roundup && !atomic_read(&cpu_in_kgdb[i]))
Jason Wesseldc7d5522008-04-17 20:05:37 +0200586 cpu_relax();
587 }
588
589 /*
590 * At this point the primary processor is completely
591 * in the debugger and all secondary CPUs are quiescent
592 */
Jason Wesseldcc78712010-05-20 21:04:21 -0500593 dbg_deactivate_sw_breakpoints();
Jason Wesseldc7d5522008-04-17 20:05:37 +0200594 kgdb_single_step = 0;
Jason Wesseld7161a62008-09-26 10:36:41 -0500595 kgdb_contthread = current;
Jason Wesseldc7d5522008-04-17 20:05:37 +0200596 exception_level = 0;
Jason Wessel4da75b92010-04-02 11:57:18 -0500597 trace_on = tracing_is_on();
598 if (trace_on)
599 tracing_off();
Jason Wesseldc7d5522008-04-17 20:05:37 +0200600
Jason Wesseldcc78712010-05-20 21:04:21 -0500601 while (1) {
602cpu_master_loop:
603 if (dbg_kdb_mode) {
604 kgdb_connected = 1;
605 error = kdb_stub(ks);
606 } else {
607 error = gdb_serial_stub(ks);
608 }
609
610 if (error == DBG_PASS_EVENT) {
611 dbg_kdb_mode = !dbg_kdb_mode;
612 kgdb_connected = 0;
613 } else if (error == DBG_SWITCH_CPU_EVENT) {
614 dbg_cpu_switch(cpu, dbg_switch_cpu);
615 goto cpu_loop;
616 } else {
617 kgdb_info[cpu].ret_state = error;
618 break;
619 }
620 }
Jason Wesseldc7d5522008-04-17 20:05:37 +0200621
622 /* Call the I/O driver's post_exception routine */
Jason Wessel53197fc2010-04-02 11:48:03 -0500623 if (dbg_io_ops->post_exception)
624 dbg_io_ops->post_exception();
Jason Wesseldc7d5522008-04-17 20:05:37 +0200625
Jason Wesselae6bf532010-04-02 14:58:18 -0500626 atomic_dec(&cpu_in_kgdb[ks->cpu]);
Jason Wesseldc7d5522008-04-17 20:05:37 +0200627
Jason Wesseld7161a62008-09-26 10:36:41 -0500628 if (!kgdb_single_step) {
Jason Wesseldc7d5522008-04-17 20:05:37 +0200629 for (i = NR_CPUS-1; i >= 0; i--)
Jason Wesselae6bf532010-04-02 14:58:18 -0500630 atomic_dec(&passive_cpu_wait[i]);
Jason Wesseldc7d5522008-04-17 20:05:37 +0200631 /*
Jason Wesseldcc78712010-05-20 21:04:21 -0500632 * Wait till all the CPUs have quit from the debugger,
633 * but allow a CPU that hit an exception and is
634 * waiting to become the master to remain in the debug
635 * core.
Jason Wesseldc7d5522008-04-17 20:05:37 +0200636 */
637 for_each_online_cpu(i) {
Jason Wesseldcc78712010-05-20 21:04:21 -0500638 while (kgdb_do_roundup &&
639 atomic_read(&cpu_in_kgdb[i]) &&
640 !(kgdb_info[i].exception_state &
641 DCPU_WANT_MASTER))
Jason Wesseldc7d5522008-04-17 20:05:37 +0200642 cpu_relax();
643 }
644 }
645
646kgdb_restore:
Jason Wessel028e7b12009-12-11 08:43:17 -0600647 if (atomic_read(&kgdb_cpu_doing_single_step) != -1) {
648 int sstep_cpu = atomic_read(&kgdb_cpu_doing_single_step);
649 if (kgdb_info[sstep_cpu].task)
650 kgdb_sstep_pid = kgdb_info[sstep_cpu].task->pid;
651 else
652 kgdb_sstep_pid = 0;
653 }
Jason Wessel4da75b92010-04-02 11:57:18 -0500654 if (trace_on)
655 tracing_on();
Jason Wesseldc7d5522008-04-17 20:05:37 +0200656 /* Free kgdb_active */
657 atomic_set(&kgdb_active, -1);
Jason Wesseld6ad3e22010-01-27 16:25:22 -0600658 touch_softlockup_watchdog_sync();
Jason Wessel7c3078b2008-02-15 14:55:54 -0600659 clocksource_touch_watchdog();
Jason Wesseldc7d5522008-04-17 20:05:37 +0200660 local_irq_restore(flags);
661
Jason Wesseldcc78712010-05-20 21:04:21 -0500662 return kgdb_info[cpu].ret_state;
Jason Wesseldc7d5522008-04-17 20:05:37 +0200663}
664
Jason Wessel62fae312010-04-02 11:47:02 -0500665/*
666 * kgdb_handle_exception() - main entry point from a kernel exception
667 *
668 * Locking hierarchy:
669 * interface locks, if any (begin_session)
670 * kgdb lock (kgdb_active)
671 */
672int
673kgdb_handle_exception(int evector, int signo, int ecode, struct pt_regs *regs)
674{
675 struct kgdb_state kgdb_var;
676 struct kgdb_state *ks = &kgdb_var;
677 int ret;
678
679 ks->cpu = raw_smp_processor_id();
680 ks->ex_vector = evector;
681 ks->signo = signo;
Jason Wessel62fae312010-04-02 11:47:02 -0500682 ks->err_code = ecode;
683 ks->kgdb_usethreadid = 0;
684 ks->linux_regs = regs;
685
686 if (kgdb_reenter_check(ks))
687 return 0; /* Ouch, double exception ! */
688 kgdb_info[ks->cpu].exception_state |= DCPU_WANT_MASTER;
689 ret = kgdb_cpu_enter(ks, regs);
Jason Wesseldcc78712010-05-20 21:04:21 -0500690 kgdb_info[ks->cpu].exception_state &= ~(DCPU_WANT_MASTER |
691 DCPU_IS_SLAVE);
Jason Wessel62fae312010-04-02 11:47:02 -0500692 return ret;
693}
694
Jason Wesseldc7d5522008-04-17 20:05:37 +0200695int kgdb_nmicallback(int cpu, void *regs)
696{
697#ifdef CONFIG_SMP
Jason Wessel62fae312010-04-02 11:47:02 -0500698 struct kgdb_state kgdb_var;
699 struct kgdb_state *ks = &kgdb_var;
700
701 memset(ks, 0, sizeof(struct kgdb_state));
702 ks->cpu = cpu;
703 ks->linux_regs = regs;
704
Jason Wesseldc7d5522008-04-17 20:05:37 +0200705 if (!atomic_read(&cpu_in_kgdb[cpu]) &&
Jason Wessel62fae312010-04-02 11:47:02 -0500706 atomic_read(&kgdb_active) != -1 &&
707 atomic_read(&kgdb_active) != cpu) {
708 kgdb_info[cpu].exception_state |= DCPU_IS_SLAVE;
709 kgdb_cpu_enter(ks, regs);
710 kgdb_info[cpu].exception_state &= ~DCPU_IS_SLAVE;
Jason Wesseldc7d5522008-04-17 20:05:37 +0200711 return 0;
712 }
713#endif
714 return 1;
715}
716
Jason Wesselaabdc3b2008-06-24 10:52:55 -0500717static void kgdb_console_write(struct console *co, const char *s,
718 unsigned count)
Jason Wesseldc7d5522008-04-17 20:05:37 +0200719{
720 unsigned long flags;
721
722 /* If we're debugging, or KGDB has not connected, don't try
723 * and print. */
Jason Wesseldcc78712010-05-20 21:04:21 -0500724 if (!kgdb_connected || atomic_read(&kgdb_active) != -1 || dbg_kdb_mode)
Jason Wesseldc7d5522008-04-17 20:05:37 +0200725 return;
726
727 local_irq_save(flags);
Jason Wessel53197fc2010-04-02 11:48:03 -0500728 gdbstub_msg_write(s, count);
Jason Wesseldc7d5522008-04-17 20:05:37 +0200729 local_irq_restore(flags);
730}
731
732static struct console kgdbcons = {
733 .name = "kgdb",
734 .write = kgdb_console_write,
735 .flags = CON_PRINTBUFFER | CON_ENABLED,
736 .index = -1,
737};
738
739#ifdef CONFIG_MAGIC_SYSRQ
Jason Wessel53197fc2010-04-02 11:48:03 -0500740static void sysrq_handle_dbg(int key, struct tty_struct *tty)
Jason Wesseldc7d5522008-04-17 20:05:37 +0200741{
Jason Wessel53197fc2010-04-02 11:48:03 -0500742 if (!dbg_io_ops) {
Jason Wesseldc7d5522008-04-17 20:05:37 +0200743 printk(KERN_CRIT "ERROR: No KGDB I/O module available\n");
744 return;
745 }
Jason Wesseldcc78712010-05-20 21:04:21 -0500746 if (!kgdb_connected) {
747#ifdef CONFIG_KGDB_KDB
748 if (!dbg_kdb_mode)
749 printk(KERN_CRIT "KGDB or $3#33 for KDB\n");
750#else
Jason Wesseldc7d5522008-04-17 20:05:37 +0200751 printk(KERN_CRIT "Entering KGDB\n");
Jason Wesseldcc78712010-05-20 21:04:21 -0500752#endif
753 }
Jason Wesseldc7d5522008-04-17 20:05:37 +0200754
755 kgdb_breakpoint();
756}
757
Jason Wessel53197fc2010-04-02 11:48:03 -0500758static struct sysrq_key_op sysrq_dbg_op = {
759 .handler = sysrq_handle_dbg,
Jason Wessel364b5b72009-05-13 21:56:59 -0500760 .help_msg = "debug(G)",
761 .action_msg = "DEBUG",
Jason Wesseldc7d5522008-04-17 20:05:37 +0200762};
763#endif
764
765static void kgdb_register_callbacks(void)
766{
767 if (!kgdb_io_module_registered) {
768 kgdb_io_module_registered = 1;
769 kgdb_arch_init();
770#ifdef CONFIG_MAGIC_SYSRQ
Jason Wessel53197fc2010-04-02 11:48:03 -0500771 register_sysrq_key('g', &sysrq_dbg_op);
Jason Wesseldc7d5522008-04-17 20:05:37 +0200772#endif
773 if (kgdb_use_con && !kgdb_con_registered) {
774 register_console(&kgdbcons);
775 kgdb_con_registered = 1;
776 }
777 }
778}
779
780static void kgdb_unregister_callbacks(void)
781{
782 /*
783 * When this routine is called KGDB should unregister from the
784 * panic handler and clean up, making sure it is not handling any
785 * break exceptions at the time.
786 */
787 if (kgdb_io_module_registered) {
788 kgdb_io_module_registered = 0;
789 kgdb_arch_exit();
790#ifdef CONFIG_MAGIC_SYSRQ
Jason Wessel53197fc2010-04-02 11:48:03 -0500791 unregister_sysrq_key('g', &sysrq_dbg_op);
Jason Wesseldc7d5522008-04-17 20:05:37 +0200792#endif
793 if (kgdb_con_registered) {
794 unregister_console(&kgdbcons);
795 kgdb_con_registered = 0;
796 }
797 }
798}
799
Jason Wessel1cee5e32009-06-03 14:06:57 -0500800/*
801 * There are times a tasklet needs to be used vs a compiled in
802 * break point so as to cause an exception outside a kgdb I/O module,
803 * such as is the case with kgdboe, where calling a breakpoint in the
804 * I/O driver itself would be fatal.
805 */
806static void kgdb_tasklet_bpt(unsigned long ing)
807{
808 kgdb_breakpoint();
809 atomic_set(&kgdb_break_tasklet_var, 0);
810}
811
812static DECLARE_TASKLET(kgdb_tasklet_breakpoint, kgdb_tasklet_bpt, 0);
813
814void kgdb_schedule_breakpoint(void)
815{
816 if (atomic_read(&kgdb_break_tasklet_var) ||
817 atomic_read(&kgdb_active) != -1 ||
818 atomic_read(&kgdb_setting_breakpoint))
819 return;
820 atomic_inc(&kgdb_break_tasklet_var);
821 tasklet_schedule(&kgdb_tasklet_breakpoint);
822}
823EXPORT_SYMBOL_GPL(kgdb_schedule_breakpoint);
824
Jason Wesseldc7d5522008-04-17 20:05:37 +0200825static void kgdb_initial_breakpoint(void)
826{
827 kgdb_break_asap = 0;
828
829 printk(KERN_CRIT "kgdb: Waiting for connection from remote gdb...\n");
830 kgdb_breakpoint();
831}
832
833/**
Jason Wessel737a4602008-03-07 16:34:16 -0600834 * kgdb_register_io_module - register KGDB IO module
Jason Wessel53197fc2010-04-02 11:48:03 -0500835 * @new_dbg_io_ops: the io ops vector
Jason Wesseldc7d5522008-04-17 20:05:37 +0200836 *
837 * Register it with the KGDB core.
838 */
Jason Wessel53197fc2010-04-02 11:48:03 -0500839int kgdb_register_io_module(struct kgdb_io *new_dbg_io_ops)
Jason Wesseldc7d5522008-04-17 20:05:37 +0200840{
841 int err;
842
843 spin_lock(&kgdb_registration_lock);
844
Jason Wessel53197fc2010-04-02 11:48:03 -0500845 if (dbg_io_ops) {
Jason Wesseldc7d5522008-04-17 20:05:37 +0200846 spin_unlock(&kgdb_registration_lock);
847
848 printk(KERN_ERR "kgdb: Another I/O driver is already "
849 "registered with KGDB.\n");
850 return -EBUSY;
851 }
852
Jason Wessel53197fc2010-04-02 11:48:03 -0500853 if (new_dbg_io_ops->init) {
854 err = new_dbg_io_ops->init();
Jason Wesseldc7d5522008-04-17 20:05:37 +0200855 if (err) {
856 spin_unlock(&kgdb_registration_lock);
857 return err;
858 }
859 }
860
Jason Wessel53197fc2010-04-02 11:48:03 -0500861 dbg_io_ops = new_dbg_io_ops;
Jason Wesseldc7d5522008-04-17 20:05:37 +0200862
863 spin_unlock(&kgdb_registration_lock);
864
865 printk(KERN_INFO "kgdb: Registered I/O driver %s.\n",
Jason Wessel53197fc2010-04-02 11:48:03 -0500866 new_dbg_io_ops->name);
Jason Wesseldc7d5522008-04-17 20:05:37 +0200867
868 /* Arm KGDB now. */
869 kgdb_register_callbacks();
870
871 if (kgdb_break_asap)
872 kgdb_initial_breakpoint();
873
874 return 0;
875}
876EXPORT_SYMBOL_GPL(kgdb_register_io_module);
877
878/**
879 * kkgdb_unregister_io_module - unregister KGDB IO module
Jason Wessel53197fc2010-04-02 11:48:03 -0500880 * @old_dbg_io_ops: the io ops vector
Jason Wesseldc7d5522008-04-17 20:05:37 +0200881 *
882 * Unregister it with the KGDB core.
883 */
Jason Wessel53197fc2010-04-02 11:48:03 -0500884void kgdb_unregister_io_module(struct kgdb_io *old_dbg_io_ops)
Jason Wesseldc7d5522008-04-17 20:05:37 +0200885{
886 BUG_ON(kgdb_connected);
887
888 /*
889 * KGDB is no longer able to communicate out, so
890 * unregister our callbacks and reset state.
891 */
892 kgdb_unregister_callbacks();
893
894 spin_lock(&kgdb_registration_lock);
895
Jason Wessel53197fc2010-04-02 11:48:03 -0500896 WARN_ON_ONCE(dbg_io_ops != old_dbg_io_ops);
897 dbg_io_ops = NULL;
Jason Wesseldc7d5522008-04-17 20:05:37 +0200898
899 spin_unlock(&kgdb_registration_lock);
900
901 printk(KERN_INFO
902 "kgdb: Unregistered I/O driver %s, debugger disabled.\n",
Jason Wessel53197fc2010-04-02 11:48:03 -0500903 old_dbg_io_ops->name);
Jason Wesseldc7d5522008-04-17 20:05:37 +0200904}
905EXPORT_SYMBOL_GPL(kgdb_unregister_io_module);
906
Jason Wesseldcc78712010-05-20 21:04:21 -0500907int dbg_io_get_char(void)
908{
909 int ret = dbg_io_ops->read_char();
Jason Wesself5316b42010-05-20 21:04:22 -0500910 if (ret == NO_POLL_CHAR)
911 return -1;
Jason Wesseldcc78712010-05-20 21:04:21 -0500912 if (!dbg_kdb_mode)
913 return ret;
914 if (ret == 127)
915 return 8;
916 return ret;
917}
918
Jason Wesseldc7d5522008-04-17 20:05:37 +0200919/**
920 * kgdb_breakpoint - generate breakpoint exception
921 *
922 * This function will generate a breakpoint exception. It is used at the
923 * beginning of a program to sync up with a debugger and can be used
924 * otherwise as a quick means to stop program execution and "break" into
925 * the debugger.
926 */
927void kgdb_breakpoint(void)
928{
Jason Wesselae6bf532010-04-02 14:58:18 -0500929 atomic_inc(&kgdb_setting_breakpoint);
Jason Wesseldc7d5522008-04-17 20:05:37 +0200930 wmb(); /* Sync point before breakpoint */
931 arch_kgdb_breakpoint();
932 wmb(); /* Sync point after breakpoint */
Jason Wesselae6bf532010-04-02 14:58:18 -0500933 atomic_dec(&kgdb_setting_breakpoint);
Jason Wesseldc7d5522008-04-17 20:05:37 +0200934}
935EXPORT_SYMBOL_GPL(kgdb_breakpoint);
936
937static int __init opt_kgdb_wait(char *str)
938{
939 kgdb_break_asap = 1;
940
Jason Wesseldcc78712010-05-20 21:04:21 -0500941 kdb_init(KDB_INIT_EARLY);
Jason Wesseldc7d5522008-04-17 20:05:37 +0200942 if (kgdb_io_module_registered)
943 kgdb_initial_breakpoint();
944
945 return 0;
946}
947
948early_param("kgdbwait", opt_kgdb_wait);