Blame view

kernel/debug/debug_core.c 24.8 KB
dc7d55270   Jason Wessel   kgdb: core
1
  /*
53197fc49   Jason Wessel   Separate the gdbs...
2
   * Kernel Debug Core
dc7d55270   Jason Wessel   kgdb: core
3
4
5
6
7
8
   *
   * Maintainer: Jason Wessel <jason.wessel@windriver.com>
   *
   * Copyright (C) 2000-2001 VERITAS Software Corporation.
   * Copyright (C) 2002-2004 Timesys Corporation
   * Copyright (C) 2003-2004 Amit S. Kale <amitkale@linsyssoft.com>
a2531293d   Pavel Machek   update email address
9
   * Copyright (C) 2004 Pavel Machek <pavel@ucw.cz>
dc7d55270   Jason Wessel   kgdb: core
10
11
   * Copyright (C) 2004-2006 Tom Rini <trini@kernel.crashing.org>
   * Copyright (C) 2004-2006 LinSysSoft Technologies Pvt. Ltd.
53197fc49   Jason Wessel   Separate the gdbs...
12
   * Copyright (C) 2005-2009 Wind River Systems, Inc.
dc7d55270   Jason Wessel   kgdb: core
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   * Copyright (C) 2007 MontaVista Software, Inc.
   * Copyright (C) 2008 Red Hat, Inc., Ingo Molnar <mingo@redhat.com>
   *
   * Contributors at various stages not listed above:
   *  Jason Wessel ( jason.wessel@windriver.com )
   *  George Anzinger <george@mvista.com>
   *  Anurekh Saxena (anurekh.saxena@timesys.com)
   *  Lake Stevens Instrument Division (Glenn Engel)
   *  Jim Kingdon, Cygnus Support.
   *
   * Original KGDB stub: David Grothe <dave@gcom.com>,
   * Tigran Aivazian <tigran@sco.com>
   *
   * This file is licensed under the terms of the GNU General Public License
   * version 2. This program is licensed "as is" without any warranty of any
   * kind, whether express or implied.
   */
  #include <linux/pid_namespace.h>
7c3078b63   Jason Wessel   kgdb: clocksource...
31
  #include <linux/clocksource.h>
16559ae48   Greg Kroah-Hartman   kgdb: remove #inc...
32
  #include <linux/serial_core.h>
dc7d55270   Jason Wessel   kgdb: core
33
34
35
36
37
38
39
40
  #include <linux/interrupt.h>
  #include <linux/spinlock.h>
  #include <linux/console.h>
  #include <linux/threads.h>
  #include <linux/uaccess.h>
  #include <linux/kernel.h>
  #include <linux/module.h>
  #include <linux/ptrace.h>
dc7d55270   Jason Wessel   kgdb: core
41
42
43
44
  #include <linux/string.h>
  #include <linux/delay.h>
  #include <linux/sched.h>
  #include <linux/sysrq.h>
2366e0478   Jason Wessel   kgdb,debug-core,g...
45
  #include <linux/reboot.h>
dc7d55270   Jason Wessel   kgdb: core
46
47
  #include <linux/init.h>
  #include <linux/kgdb.h>
dcc787112   Jason Wessel   kgdb: core change...
48
  #include <linux/kdb.h>
dc7d55270   Jason Wessel   kgdb: core
49
50
51
  #include <linux/pid.h>
  #include <linux/smp.h>
  #include <linux/mm.h>
615d6e875   Davidlohr Bueso   mm: per-thread vm...
52
  #include <linux/vmacache.h>
fb70b5888   Jason Wessel   debug_core: stop ...
53
  #include <linux/rcupdate.h>
dc7d55270   Jason Wessel   kgdb: core
54
55
56
  
  #include <asm/cacheflush.h>
  #include <asm/byteorder.h>
60063497a   Arun Sharma   atomic: use <linu...
57
  #include <linux/atomic.h>
dc7d55270   Jason Wessel   kgdb: core
58

53197fc49   Jason Wessel   Separate the gdbs...
59
  #include "debug_core.h"
dc7d55270   Jason Wessel   kgdb: core
60

53197fc49   Jason Wessel   Separate the gdbs...
61
  static int kgdb_break_asap;
62fae3121   Jason Wessel   kgdb: eliminate k...
62

53197fc49   Jason Wessel   Separate the gdbs...
63
  struct debuggerinfo_struct kgdb_info[NR_CPUS];
dc7d55270   Jason Wessel   kgdb: core
64
65
66
67
68
69
70
71
  
  /**
   * kgdb_connected - Is a host GDB connected to us?
   */
  int				kgdb_connected;
  EXPORT_SYMBOL_GPL(kgdb_connected);
  
  /* All the KGDB handlers are installed */
f503b5ae5   Jason Wessel   x86,kgdb: Add low...
72
  int			kgdb_io_module_registered;
dc7d55270   Jason Wessel   kgdb: core
73
74
75
  
  /* Guard for recursive entry */
  static int			exception_level;
53197fc49   Jason Wessel   Separate the gdbs...
76
  struct kgdb_io		*dbg_io_ops;
dc7d55270   Jason Wessel   kgdb: core
77
  static DEFINE_SPINLOCK(kgdb_registration_lock);
bec4d62ea   Jason Wessel   kgdb,debug_core: ...
78
79
  /* Action for the reboot notifiter, a global allow kdb to change it */
  static int kgdbreboot;
dc7d55270   Jason Wessel   kgdb: core
80
81
82
83
  /* kgdb console driver is loaded */
  static int kgdb_con_registered;
  /* determine if kgdb console output should be used */
  static int kgdb_use_con;
0b4b3827d   Jason Wessel   x86, kgdb, init: ...
84
85
  /* Flag for alternate operations for early debugging */
  bool dbg_is_early = true;
dcc787112   Jason Wessel   kgdb: core change...
86
87
88
89
  /* Next cpu to become the master debug core */
  int dbg_switch_cpu;
  
  /* Use kdb or gdbserver mode */
a0de055cf   Jason Wessel   kgdb: gdb "monito...
90
  int dbg_kdb_mode = 1;
dc7d55270   Jason Wessel   kgdb: core
91
92
93
94
95
96
97
98
99
100
  
  static int __init opt_kgdb_con(char *str)
  {
  	kgdb_use_con = 1;
  	return 0;
  }
  
  early_param("kgdbcon", opt_kgdb_con);
  
  module_param(kgdb_use_con, int, 0644);
bec4d62ea   Jason Wessel   kgdb,debug_core: ...
101
  module_param(kgdbreboot, int, 0644);
dc7d55270   Jason Wessel   kgdb: core
102
103
104
105
106
107
108
109
110
111
112
113
114
  
  /*
   * Holds information about breakpoints in a kernel. These breakpoints are
   * added and removed by gdb.
   */
  static struct kgdb_bkpt		kgdb_break[KGDB_MAX_BREAKPOINTS] = {
  	[0 ... KGDB_MAX_BREAKPOINTS-1] = { .state = BP_UNDEFINED }
  };
  
  /*
   * The CPU# of the active CPU, or -1 if none:
   */
  atomic_t			kgdb_active = ATOMIC_INIT(-1);
dcc787112   Jason Wessel   kgdb: core change...
115
  EXPORT_SYMBOL_GPL(kgdb_active);
dfee3a7b9   Jason Wessel   debug_core: refac...
116
117
  static DEFINE_RAW_SPINLOCK(dbg_master_lock);
  static DEFINE_RAW_SPINLOCK(dbg_slave_lock);
dc7d55270   Jason Wessel   kgdb: core
118
119
120
121
122
  
  /*
   * We use NR_CPUs not PERCPU, in case kgdb is used to debug early
   * bootup code (which might not have percpu set up yet):
   */
dfee3a7b9   Jason Wessel   debug_core: refac...
123
124
  static atomic_t			masters_in_kgdb;
  static atomic_t			slaves_in_kgdb;
1cee5e35f   Jason Wessel   kgdb: Add the abi...
125
  static atomic_t			kgdb_break_tasklet_var;
dc7d55270   Jason Wessel   kgdb: core
126
127
128
129
130
131
  atomic_t			kgdb_setting_breakpoint;
  
  struct task_struct		*kgdb_usethread;
  struct task_struct		*kgdb_contthread;
  
  int				kgdb_single_step;
53197fc49   Jason Wessel   Separate the gdbs...
132
  static pid_t			kgdb_sstep_pid;
dc7d55270   Jason Wessel   kgdb: core
133
134
135
136
137
138
139
140
141
142
143
  
  /* to keep track of the CPU which is doing the single stepping*/
  atomic_t			kgdb_cpu_doing_single_step = ATOMIC_INIT(-1);
  
  /*
   * If you are debugging a problem where roundup (the collection of
   * all other CPUs) is a problem [this should be extremely rare],
   * then use the nokgdbroundup option to avoid roundup. In that case
   * the other CPUs might interfere with your debugging context, so
   * use this with care:
   */
688b744d8   Harvey Harrison   kgdb: fix signedn...
144
  static int kgdb_do_roundup = 1;
dc7d55270   Jason Wessel   kgdb: core
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
  
  static int __init opt_nokgdbroundup(char *str)
  {
  	kgdb_do_roundup = 0;
  
  	return 0;
  }
  
  early_param("nokgdbroundup", opt_nokgdbroundup);
  
  /*
   * Finally, some KGDB code :-)
   */
  
  /*
   * Weak aliases for breakpoint management,
   * can be overriden by architectures when needed:
   */
98b54aa1a   Jason Wessel   kgdb,debug_core: ...
163
  int __weak kgdb_arch_set_breakpoint(struct kgdb_bkpt *bpt)
dc7d55270   Jason Wessel   kgdb: core
164
165
  {
  	int err;
98b54aa1a   Jason Wessel   kgdb,debug_core: ...
166
167
  	err = probe_kernel_read(bpt->saved_instr, (char *)bpt->bpt_addr,
  				BREAK_INSTR_SIZE);
dc7d55270   Jason Wessel   kgdb: core
168
169
  	if (err)
  		return err;
98b54aa1a   Jason Wessel   kgdb,debug_core: ...
170
171
172
  	err = probe_kernel_write((char *)bpt->bpt_addr,
  				 arch_kgdb_ops.gdb_bpt_instr, BREAK_INSTR_SIZE);
  	return err;
dc7d55270   Jason Wessel   kgdb: core
173
  }
98b54aa1a   Jason Wessel   kgdb,debug_core: ...
174
  int __weak kgdb_arch_remove_breakpoint(struct kgdb_bkpt *bpt)
dc7d55270   Jason Wessel   kgdb: core
175
  {
98b54aa1a   Jason Wessel   kgdb,debug_core: ...
176
177
  	return probe_kernel_write((char *)bpt->bpt_addr,
  				  (char *)bpt->saved_instr, BREAK_INSTR_SIZE);
dc7d55270   Jason Wessel   kgdb: core
178
  }
a9b60bf4c   Jason Wessel   kgdb: fix kgdb_va...
179
180
  int __weak kgdb_validate_break_address(unsigned long addr)
  {
98b54aa1a   Jason Wessel   kgdb,debug_core: ...
181
  	struct kgdb_bkpt tmp;
a9b60bf4c   Jason Wessel   kgdb: fix kgdb_va...
182
  	int err;
98b54aa1a   Jason Wessel   kgdb,debug_core: ...
183
  	/* Validate setting the breakpoint and then removing it.  If the
a9b60bf4c   Jason Wessel   kgdb: fix kgdb_va...
184
185
186
187
  	 * remove fails, the kernel needs to emit a bad message because we
  	 * are deep trouble not being able to put things back the way we
  	 * found them.
  	 */
98b54aa1a   Jason Wessel   kgdb,debug_core: ...
188
189
  	tmp.bpt_addr = addr;
  	err = kgdb_arch_set_breakpoint(&tmp);
a9b60bf4c   Jason Wessel   kgdb: fix kgdb_va...
190
191
  	if (err)
  		return err;
98b54aa1a   Jason Wessel   kgdb,debug_core: ...
192
  	err = kgdb_arch_remove_breakpoint(&tmp);
a9b60bf4c   Jason Wessel   kgdb: fix kgdb_va...
193
194
195
196
197
  	if (err)
  		printk(KERN_ERR "KGDB: Critical breakpoint error, kernel "
  		   "memory destroyed at: %lx", addr);
  	return err;
  }
dc7d55270   Jason Wessel   kgdb: core
198
199
200
201
202
203
204
205
206
  unsigned long __weak kgdb_arch_pc(int exception, struct pt_regs *regs)
  {
  	return instruction_pointer(regs);
  }
  
  int __weak kgdb_arch_init(void)
  {
  	return 0;
  }
b4b8ac524   Jason Wessel   kgdb: fix optiona...
207
208
209
210
  int __weak kgdb_skipexception(int exception, struct pt_regs *regs)
  {
  	return 0;
  }
dc7d55270   Jason Wessel   kgdb: core
211
  /*
dc7d55270   Jason Wessel   kgdb: core
212
213
214
215
216
217
218
   * Some architectures need cache flushes when we set/clear a
   * breakpoint:
   */
  static void kgdb_flush_swbreak_addr(unsigned long addr)
  {
  	if (!CACHE_FLUSH_IS_SAFE)
  		return;
615d6e875   Davidlohr Bueso   mm: per-thread vm...
219
220
221
222
223
224
225
226
227
  	if (current->mm) {
  		int i;
  
  		for (i = 0; i < VMACACHE_SIZE; i++) {
  			if (!current->vmacache[i])
  				continue;
  			flush_cache_range(current->vmacache[i],
  					  addr, addr + BREAK_INSTR_SIZE);
  		}
dc7d55270   Jason Wessel   kgdb: core
228
  	}
615d6e875   Davidlohr Bueso   mm: per-thread vm...
229

1a9a3e76d   Jason Wessel   kgdb: always use ...
230
231
  	/* Force flush instruction cache if it was outside the mm */
  	flush_icache_range(addr, addr + BREAK_INSTR_SIZE);
dc7d55270   Jason Wessel   kgdb: core
232
233
234
235
236
  }
  
  /*
   * SW breakpoint management:
   */
53197fc49   Jason Wessel   Separate the gdbs...
237
  int dbg_activate_sw_breakpoints(void)
dc7d55270   Jason Wessel   kgdb: core
238
  {
7f8b7ed6f   Jason Wessel   kgdb: Always proc...
239
240
  	int error;
  	int ret = 0;
dc7d55270   Jason Wessel   kgdb: core
241
242
243
244
245
  	int i;
  
  	for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++) {
  		if (kgdb_break[i].state != BP_SET)
  			continue;
98b54aa1a   Jason Wessel   kgdb,debug_core: ...
246
  		error = kgdb_arch_set_breakpoint(&kgdb_break[i]);
7f8b7ed6f   Jason Wessel   kgdb: Always proc...
247
248
  		if (error) {
  			ret = error;
98b54aa1a   Jason Wessel   kgdb,debug_core: ...
249
250
  			printk(KERN_INFO "KGDB: BP install failed: %lx",
  			       kgdb_break[i].bpt_addr);
7f8b7ed6f   Jason Wessel   kgdb: Always proc...
251
252
  			continue;
  		}
dc7d55270   Jason Wessel   kgdb: core
253

98b54aa1a   Jason Wessel   kgdb,debug_core: ...
254
  		kgdb_flush_swbreak_addr(kgdb_break[i].bpt_addr);
dc7d55270   Jason Wessel   kgdb: core
255
256
  		kgdb_break[i].state = BP_ACTIVE;
  	}
7f8b7ed6f   Jason Wessel   kgdb: Always proc...
257
  	return ret;
dc7d55270   Jason Wessel   kgdb: core
258
  }
53197fc49   Jason Wessel   Separate the gdbs...
259
  int dbg_set_sw_break(unsigned long addr)
dc7d55270   Jason Wessel   kgdb: core
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
  {
  	int err = kgdb_validate_break_address(addr);
  	int breakno = -1;
  	int i;
  
  	if (err)
  		return err;
  
  	for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++) {
  		if ((kgdb_break[i].state == BP_SET) &&
  					(kgdb_break[i].bpt_addr == addr))
  			return -EEXIST;
  	}
  	for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++) {
  		if (kgdb_break[i].state == BP_REMOVED &&
  					kgdb_break[i].bpt_addr == addr) {
  			breakno = i;
  			break;
  		}
  	}
  
  	if (breakno == -1) {
  		for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++) {
  			if (kgdb_break[i].state == BP_UNDEFINED) {
  				breakno = i;
  				break;
  			}
  		}
  	}
  
  	if (breakno == -1)
  		return -E2BIG;
  
  	kgdb_break[breakno].state = BP_SET;
  	kgdb_break[breakno].type = BP_BREAKPOINT;
  	kgdb_break[breakno].bpt_addr = addr;
  
  	return 0;
  }
dcc787112   Jason Wessel   kgdb: core change...
299
  int dbg_deactivate_sw_breakpoints(void)
dc7d55270   Jason Wessel   kgdb: core
300
  {
7f8b7ed6f   Jason Wessel   kgdb: Always proc...
301
302
  	int error;
  	int ret = 0;
dc7d55270   Jason Wessel   kgdb: core
303
304
305
306
307
  	int i;
  
  	for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++) {
  		if (kgdb_break[i].state != BP_ACTIVE)
  			continue;
98b54aa1a   Jason Wessel   kgdb,debug_core: ...
308
  		error = kgdb_arch_remove_breakpoint(&kgdb_break[i]);
7f8b7ed6f   Jason Wessel   kgdb: Always proc...
309
  		if (error) {
98b54aa1a   Jason Wessel   kgdb,debug_core: ...
310
311
312
  			printk(KERN_INFO "KGDB: BP remove failed: %lx
  ",
  			       kgdb_break[i].bpt_addr);
7f8b7ed6f   Jason Wessel   kgdb: Always proc...
313
314
  			ret = error;
  		}
dc7d55270   Jason Wessel   kgdb: core
315

98b54aa1a   Jason Wessel   kgdb,debug_core: ...
316
  		kgdb_flush_swbreak_addr(kgdb_break[i].bpt_addr);
dc7d55270   Jason Wessel   kgdb: core
317
318
  		kgdb_break[i].state = BP_SET;
  	}
7f8b7ed6f   Jason Wessel   kgdb: Always proc...
319
  	return ret;
dc7d55270   Jason Wessel   kgdb: core
320
  }
53197fc49   Jason Wessel   Separate the gdbs...
321
  int dbg_remove_sw_break(unsigned long addr)
dc7d55270   Jason Wessel   kgdb: core
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
  {
  	int i;
  
  	for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++) {
  		if ((kgdb_break[i].state == BP_SET) &&
  				(kgdb_break[i].bpt_addr == addr)) {
  			kgdb_break[i].state = BP_REMOVED;
  			return 0;
  		}
  	}
  	return -ENOENT;
  }
  
  int kgdb_isremovedbreak(unsigned long addr)
  {
  	int i;
  
  	for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++) {
  		if ((kgdb_break[i].state == BP_REMOVED) &&
  					(kgdb_break[i].bpt_addr == addr))
  			return 1;
  	}
  	return 0;
  }
53197fc49   Jason Wessel   Separate the gdbs...
346
  int dbg_remove_all_break(void)
dc7d55270   Jason Wessel   kgdb: core
347
  {
dc7d55270   Jason Wessel   kgdb: core
348
349
350
351
352
  	int error;
  	int i;
  
  	/* Clear memory breakpoints. */
  	for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++) {
737a460f2   Jason Wessel   kgdb: fix several...
353
354
  		if (kgdb_break[i].state != BP_ACTIVE)
  			goto setundefined;
98b54aa1a   Jason Wessel   kgdb,debug_core: ...
355
  		error = kgdb_arch_remove_breakpoint(&kgdb_break[i]);
dc7d55270   Jason Wessel   kgdb: core
356
  		if (error)
737a460f2   Jason Wessel   kgdb: fix several...
357
358
  			printk(KERN_ERR "KGDB: breakpoint remove failed: %lx
  ",
98b54aa1a   Jason Wessel   kgdb,debug_core: ...
359
  			       kgdb_break[i].bpt_addr);
737a460f2   Jason Wessel   kgdb: fix several...
360
361
  setundefined:
  		kgdb_break[i].state = BP_UNDEFINED;
dc7d55270   Jason Wessel   kgdb: core
362
363
364
365
366
367
368
369
370
371
  	}
  
  	/* Clear hardware breakpoints. */
  	if (arch_kgdb_ops.remove_all_hw_break)
  		arch_kgdb_ops.remove_all_hw_break();
  
  	return 0;
  }
  
  /*
dc7d55270   Jason Wessel   kgdb: core
372
373
374
375
376
377
378
379
380
381
   * Return true if there is a valid kgdb I/O module.  Also if no
   * debugger is attached a message can be printed to the console about
   * waiting for the debugger to attach.
   *
   * The print_wait argument is only to be true when called from inside
   * the core kgdb_handle_exception, because it will wait for the
   * debugger to attach.
   */
  static int kgdb_io_ready(int print_wait)
  {
53197fc49   Jason Wessel   Separate the gdbs...
382
  	if (!dbg_io_ops)
dc7d55270   Jason Wessel   kgdb: core
383
384
385
386
387
  		return 0;
  	if (kgdb_connected)
  		return 1;
  	if (atomic_read(&kgdb_setting_breakpoint))
  		return 1;
dcc787112   Jason Wessel   kgdb: core change...
388
389
390
391
392
393
  	if (print_wait) {
  #ifdef CONFIG_KGDB_KDB
  		if (!dbg_kdb_mode)
  			printk(KERN_CRIT "KGDB: waiting... or $3#33 for KDB
  ");
  #else
dc7d55270   Jason Wessel   kgdb: core
394
395
  		printk(KERN_CRIT "KGDB: Waiting for remote debugger
  ");
dcc787112   Jason Wessel   kgdb: core change...
396
397
  #endif
  	}
dc7d55270   Jason Wessel   kgdb: core
398
399
  	return 1;
  }
dc7d55270   Jason Wessel   kgdb: core
400
401
402
403
404
405
406
407
408
409
  static int kgdb_reenter_check(struct kgdb_state *ks)
  {
  	unsigned long addr;
  
  	if (atomic_read(&kgdb_active) != raw_smp_processor_id())
  		return 0;
  
  	/* Panic on recursive debugger calls: */
  	exception_level++;
  	addr = kgdb_arch_pc(ks->ex_vector, ks->linux_regs);
dcc787112   Jason Wessel   kgdb: core change...
410
  	dbg_deactivate_sw_breakpoints();
dc7d55270   Jason Wessel   kgdb: core
411
412
413
414
415
416
417
  
  	/*
  	 * If the break point removed ok at the place exception
  	 * occurred, try to recover and print a warning to the end
  	 * user because the user planted a breakpoint in a place that
  	 * KGDB needs in order to function.
  	 */
53197fc49   Jason Wessel   Separate the gdbs...
418
  	if (dbg_remove_sw_break(addr) == 0) {
dc7d55270   Jason Wessel   kgdb: core
419
420
  		exception_level = 0;
  		kgdb_skipexception(ks->ex_vector, ks->linux_regs);
53197fc49   Jason Wessel   Separate the gdbs...
421
  		dbg_activate_sw_breakpoints();
67baf94cd   Jason Wessel   kgdb: print break...
422
423
424
  		printk(KERN_CRIT "KGDB: re-enter error: breakpoint removed %lx
  ",
  			addr);
dc7d55270   Jason Wessel   kgdb: core
425
426
427
428
  		WARN_ON_ONCE(1);
  
  		return 1;
  	}
53197fc49   Jason Wessel   Separate the gdbs...
429
  	dbg_remove_all_break();
dc7d55270   Jason Wessel   kgdb: core
430
431
432
433
434
435
436
437
438
  	kgdb_skipexception(ks->ex_vector, ks->linux_regs);
  
  	if (exception_level > 1) {
  		dump_stack();
  		panic("Recursive entry to debugger");
  	}
  
  	printk(KERN_CRIT "KGDB: re-enter exception: ALL breakpoints killed
  ");
6d9063407   Jason Wessel   debug_core,kdb: A...
439
440
441
442
  #ifdef CONFIG_KGDB_KDB
  	/* Allow kdb to debug itself one level */
  	return 0;
  #endif
dc7d55270   Jason Wessel   kgdb: core
443
444
445
446
447
  	dump_stack();
  	panic("Recursive entry to debugger");
  
  	return 1;
  }
16cdc628c   Jason Wessel   debug_core: move ...
448
449
450
451
  static void dbg_touch_watchdogs(void)
  {
  	touch_softlockup_watchdog_sync();
  	clocksource_touch_watchdog();
fb70b5888   Jason Wessel   debug_core: stop ...
452
  	rcu_cpu_stall_reset();
16cdc628c   Jason Wessel   debug_core: move ...
453
  }
dfee3a7b9   Jason Wessel   debug_core: refac...
454
455
  static int kgdb_cpu_enter(struct kgdb_state *ks, struct pt_regs *regs,
  		int exception_state)
dc7d55270   Jason Wessel   kgdb: core
456
  {
dc7d55270   Jason Wessel   kgdb: core
457
  	unsigned long flags;
028e7b175   Jason Wessel   kgdb: allow for c...
458
  	int sstep_tries = 100;
dcc787112   Jason Wessel   kgdb: core change...
459
  	int error;
dfee3a7b9   Jason Wessel   debug_core: refac...
460
  	int cpu;
4da75b9ce   Jason Wessel   kgdb: Turn off tr...
461
  	int trace_on = 0;
dfee3a7b9   Jason Wessel   debug_core: refac...
462
  	int online_cpus = num_online_cpus();
c1bb9a9c1   Dongdong Deng   debug_core: disab...
463

dfee3a7b9   Jason Wessel   debug_core: refac...
464
465
466
467
468
469
470
  	kgdb_info[ks->cpu].enter_kgdb++;
  	kgdb_info[ks->cpu].exception_state |= exception_state;
  
  	if (exception_state == DCPU_WANT_MASTER)
  		atomic_inc(&masters_in_kgdb);
  	else
  		atomic_inc(&slaves_in_kgdb);
d7ba979d4   Dongdong Deng   debug_core,x86,bl...
471
472
473
  
  	if (arch_kgdb_ops.disable_hw_break)
  		arch_kgdb_ops.disable_hw_break(regs);
c1bb9a9c1   Dongdong Deng   debug_core: disab...
474

dc7d55270   Jason Wessel   kgdb: core
475
476
477
478
479
480
  acquirelock:
  	/*
  	 * Interrupts will be restored by the 'trap return' code, except when
  	 * single stepping.
  	 */
  	local_irq_save(flags);
62fae3121   Jason Wessel   kgdb: eliminate k...
481
482
483
  	cpu = ks->cpu;
  	kgdb_info[cpu].debuggerinfo = regs;
  	kgdb_info[cpu].task = current;
dcc787112   Jason Wessel   kgdb: core change...
484
485
  	kgdb_info[cpu].ret_state = 0;
  	kgdb_info[cpu].irq_depth = hardirq_count() >> HARDIRQ_SHIFT;
dc7d55270   Jason Wessel   kgdb: core
486

dfee3a7b9   Jason Wessel   debug_core: refac...
487
488
489
490
491
492
  	/* Make sure the above info reaches the primary CPU */
  	smp_mb();
  
  	if (exception_level == 1) {
  		if (raw_spin_trylock(&dbg_master_lock))
  			atomic_xchg(&kgdb_active, cpu);
6d9063407   Jason Wessel   debug_core,kdb: A...
493
  		goto cpu_master_loop;
dfee3a7b9   Jason Wessel   debug_core: refac...
494
  	}
6d9063407   Jason Wessel   debug_core,kdb: A...
495

dc7d55270   Jason Wessel   kgdb: core
496
  	/*
62fae3121   Jason Wessel   kgdb: eliminate k...
497
498
  	 * CPU will loop if it is a slave or request to become a kgdb
  	 * master cpu and acquire the kgdb_active lock:
dc7d55270   Jason Wessel   kgdb: core
499
  	 */
62fae3121   Jason Wessel   kgdb: eliminate k...
500
  	while (1) {
dcc787112   Jason Wessel   kgdb: core change...
501
502
503
504
505
  cpu_loop:
  		if (kgdb_info[cpu].exception_state & DCPU_NEXT_MASTER) {
  			kgdb_info[cpu].exception_state &= ~DCPU_NEXT_MASTER;
  			goto cpu_master_loop;
  		} else if (kgdb_info[cpu].exception_state & DCPU_WANT_MASTER) {
dfee3a7b9   Jason Wessel   debug_core: refac...
506
507
  			if (raw_spin_trylock(&dbg_master_lock)) {
  				atomic_xchg(&kgdb_active, cpu);
62fae3121   Jason Wessel   kgdb: eliminate k...
508
  				break;
dfee3a7b9   Jason Wessel   debug_core: refac...
509
  			}
62fae3121   Jason Wessel   kgdb: eliminate k...
510
  		} else if (kgdb_info[cpu].exception_state & DCPU_IS_SLAVE) {
dfee3a7b9   Jason Wessel   debug_core: refac...
511
  			if (!raw_spin_is_locked(&dbg_slave_lock))
62fae3121   Jason Wessel   kgdb: eliminate k...
512
513
514
515
516
517
518
519
  				goto return_normal;
  		} else {
  return_normal:
  			/* Return to normal operation by executing any
  			 * hw breakpoint fixup.
  			 */
  			if (arch_kgdb_ops.correct_hw_break)
  				arch_kgdb_ops.correct_hw_break();
4da75b9ce   Jason Wessel   kgdb: Turn off tr...
520
521
  			if (trace_on)
  				tracing_on();
dfee3a7b9   Jason Wessel   debug_core: refac...
522
523
524
  			kgdb_info[cpu].exception_state &=
  				~(DCPU_WANT_MASTER | DCPU_IS_SLAVE);
  			kgdb_info[cpu].enter_kgdb--;
4e857c58e   Peter Zijlstra   arch: Mass conver...
525
  			smp_mb__before_atomic();
dfee3a7b9   Jason Wessel   debug_core: refac...
526
  			atomic_dec(&slaves_in_kgdb);
16cdc628c   Jason Wessel   debug_core: move ...
527
  			dbg_touch_watchdogs();
62fae3121   Jason Wessel   kgdb: eliminate k...
528
529
530
  			local_irq_restore(flags);
  			return 0;
  		}
dc7d55270   Jason Wessel   kgdb: core
531
  		cpu_relax();
62fae3121   Jason Wessel   kgdb: eliminate k...
532
  	}
dc7d55270   Jason Wessel   kgdb: core
533
534
  
  	/*
028e7b175   Jason Wessel   kgdb: allow for c...
535
  	 * For single stepping, try to only enter on the processor
25985edce   Lucas De Marchi   Fix common misspe...
536
  	 * that was single stepping.  To guard against a deadlock, the
028e7b175   Jason Wessel   kgdb: allow for c...
537
538
  	 * kernel will only try for the value of sstep_tries before
  	 * giving up and continuing on.
dc7d55270   Jason Wessel   kgdb: core
539
540
  	 */
  	if (atomic_read(&kgdb_cpu_doing_single_step) != -1 &&
028e7b175   Jason Wessel   kgdb: allow for c...
541
542
  	    (kgdb_info[cpu].task &&
  	     kgdb_info[cpu].task->pid != kgdb_sstep_pid) && --sstep_tries) {
dc7d55270   Jason Wessel   kgdb: core
543
  		atomic_set(&kgdb_active, -1);
dfee3a7b9   Jason Wessel   debug_core: refac...
544
  		raw_spin_unlock(&dbg_master_lock);
16cdc628c   Jason Wessel   debug_core: move ...
545
  		dbg_touch_watchdogs();
dc7d55270   Jason Wessel   kgdb: core
546
547
548
549
550
551
  		local_irq_restore(flags);
  
  		goto acquirelock;
  	}
  
  	if (!kgdb_io_ready(1)) {
dcc787112   Jason Wessel   kgdb: core change...
552
  		kgdb_info[cpu].ret_state = 1;
53197fc49   Jason Wessel   Separate the gdbs...
553
  		goto kgdb_restore; /* No I/O connection, resume the system */
dc7d55270   Jason Wessel   kgdb: core
554
555
556
557
558
559
560
561
562
  	}
  
  	/*
  	 * Don't enter if we have hit a removed breakpoint.
  	 */
  	if (kgdb_skipexception(ks->ex_vector, ks->linux_regs))
  		goto kgdb_restore;
  
  	/* Call the I/O driver's pre_exception routine */
53197fc49   Jason Wessel   Separate the gdbs...
563
564
  	if (dbg_io_ops->pre_exception)
  		dbg_io_ops->pre_exception();
dc7d55270   Jason Wessel   kgdb: core
565

dc7d55270   Jason Wessel   kgdb: core
566
567
568
569
  	/*
  	 * Get the passive CPU lock which will hold all the non-primary
  	 * CPU in a spin state while the debugger is active
  	 */
dfee3a7b9   Jason Wessel   debug_core: refac...
570
571
  	if (!kgdb_single_step)
  		raw_spin_lock(&dbg_slave_lock);
dc7d55270   Jason Wessel   kgdb: core
572

56fb70932   Jason Wessel   kgdb: fix SMP NMI...
573
  #ifdef CONFIG_SMP
8daaa5f82   Mike Travis   kdb: Add support ...
574
575
576
  	/* If send_ready set, slaves are already waiting */
  	if (ks->send_ready)
  		atomic_set(ks->send_ready, 1);
56fb70932   Jason Wessel   kgdb: fix SMP NMI...
577
  	/* Signal the other CPUs to enter kgdb_wait() */
8daaa5f82   Mike Travis   kdb: Add support ...
578
  	else if ((!kgdb_single_step) && kgdb_do_roundup)
56fb70932   Jason Wessel   kgdb: fix SMP NMI...
579
580
  		kgdb_roundup_cpus(flags);
  #endif
dc7d55270   Jason Wessel   kgdb: core
581
582
583
  	/*
  	 * Wait for the other CPUs to be notified and be waiting for us:
  	 */
dfee3a7b9   Jason Wessel   debug_core: refac...
584
585
586
  	while (kgdb_do_roundup && (atomic_read(&masters_in_kgdb) +
  				atomic_read(&slaves_in_kgdb)) != online_cpus)
  		cpu_relax();
dc7d55270   Jason Wessel   kgdb: core
587
588
589
590
591
  
  	/*
  	 * At this point the primary processor is completely
  	 * in the debugger and all secondary CPUs are quiescent
  	 */
dcc787112   Jason Wessel   kgdb: core change...
592
  	dbg_deactivate_sw_breakpoints();
dc7d55270   Jason Wessel   kgdb: core
593
  	kgdb_single_step = 0;
d7161a653   Jason Wessel   kgdb, x86, arm, m...
594
  	kgdb_contthread = current;
dc7d55270   Jason Wessel   kgdb: core
595
  	exception_level = 0;
4da75b9ce   Jason Wessel   kgdb: Turn off tr...
596
597
598
  	trace_on = tracing_is_on();
  	if (trace_on)
  		tracing_off();
dc7d55270   Jason Wessel   kgdb: core
599

dcc787112   Jason Wessel   kgdb: core change...
600
601
602
603
604
  	while (1) {
  cpu_master_loop:
  		if (dbg_kdb_mode) {
  			kgdb_connected = 1;
  			error = kdb_stub(ks);
3fa43aba0   Jason Wessel   debug_core,kdb: f...
605
606
  			if (error == -1)
  				continue;
b0679c63d   Jason Wessel   debug_core,kdb: f...
607
  			kgdb_connected = 0;
dcc787112   Jason Wessel   kgdb: core change...
608
609
610
611
612
613
  		} else {
  			error = gdb_serial_stub(ks);
  		}
  
  		if (error == DBG_PASS_EVENT) {
  			dbg_kdb_mode = !dbg_kdb_mode;
dcc787112   Jason Wessel   kgdb: core change...
614
  		} else if (error == DBG_SWITCH_CPU_EVENT) {
495363d38   Jason Wessel   kdb,debug_core: a...
615
616
  			kgdb_info[dbg_switch_cpu].exception_state |=
  				DCPU_NEXT_MASTER;
dcc787112   Jason Wessel   kgdb: core change...
617
618
619
620
621
622
  			goto cpu_loop;
  		} else {
  			kgdb_info[cpu].ret_state = error;
  			break;
  		}
  	}
dc7d55270   Jason Wessel   kgdb: core
623
624
  
  	/* Call the I/O driver's post_exception routine */
53197fc49   Jason Wessel   Separate the gdbs...
625
626
  	if (dbg_io_ops->post_exception)
  		dbg_io_ops->post_exception();
dc7d55270   Jason Wessel   kgdb: core
627

d7161a653   Jason Wessel   kgdb, x86, arm, m...
628
  	if (!kgdb_single_step) {
dfee3a7b9   Jason Wessel   debug_core: refac...
629
630
631
632
  		raw_spin_unlock(&dbg_slave_lock);
  		/* Wait till all the CPUs have quit from the debugger. */
  		while (kgdb_do_roundup && atomic_read(&slaves_in_kgdb))
  			cpu_relax();
dc7d55270   Jason Wessel   kgdb: core
633
634
635
  	}
  
  kgdb_restore:
028e7b175   Jason Wessel   kgdb: allow for c...
636
637
638
639
640
641
642
  	if (atomic_read(&kgdb_cpu_doing_single_step) != -1) {
  		int sstep_cpu = atomic_read(&kgdb_cpu_doing_single_step);
  		if (kgdb_info[sstep_cpu].task)
  			kgdb_sstep_pid = kgdb_info[sstep_cpu].task->pid;
  		else
  			kgdb_sstep_pid = 0;
  	}
c1bb9a9c1   Dongdong Deng   debug_core: disab...
643
644
  	if (arch_kgdb_ops.correct_hw_break)
  		arch_kgdb_ops.correct_hw_break();
4da75b9ce   Jason Wessel   kgdb: Turn off tr...
645
646
  	if (trace_on)
  		tracing_on();
dfee3a7b9   Jason Wessel   debug_core: refac...
647
648
649
650
  
  	kgdb_info[cpu].exception_state &=
  		~(DCPU_WANT_MASTER | DCPU_IS_SLAVE);
  	kgdb_info[cpu].enter_kgdb--;
4e857c58e   Peter Zijlstra   arch: Mass conver...
651
  	smp_mb__before_atomic();
dfee3a7b9   Jason Wessel   debug_core: refac...
652
  	atomic_dec(&masters_in_kgdb);
dc7d55270   Jason Wessel   kgdb: core
653
654
  	/* Free kgdb_active */
  	atomic_set(&kgdb_active, -1);
dfee3a7b9   Jason Wessel   debug_core: refac...
655
  	raw_spin_unlock(&dbg_master_lock);
16cdc628c   Jason Wessel   debug_core: move ...
656
  	dbg_touch_watchdogs();
dc7d55270   Jason Wessel   kgdb: core
657
  	local_irq_restore(flags);
dcc787112   Jason Wessel   kgdb: core change...
658
  	return kgdb_info[cpu].ret_state;
dc7d55270   Jason Wessel   kgdb: core
659
  }
62fae3121   Jason Wessel   kgdb: eliminate k...
660
661
662
663
664
665
666
667
668
669
670
671
  /*
   * kgdb_handle_exception() - main entry point from a kernel exception
   *
   * Locking hierarchy:
   *	interface locks, if any (begin_session)
   *	kgdb lock (kgdb_active)
   */
  int
  kgdb_handle_exception(int evector, int signo, int ecode, struct pt_regs *regs)
  {
  	struct kgdb_state kgdb_var;
  	struct kgdb_state *ks = &kgdb_var;
5a14fead0   Anton Vorontsov   kernel/debug: Mas...
672
673
674
675
  	int ret = 0;
  
  	if (arch_kgdb_ops.enable_nmi)
  		arch_kgdb_ops.enable_nmi(0);
62fae3121   Jason Wessel   kgdb: eliminate k...
676

8daaa5f82   Mike Travis   kdb: Add support ...
677
  	memset(ks, 0, sizeof(struct kgdb_state));
62fae3121   Jason Wessel   kgdb: eliminate k...
678
679
680
  	ks->cpu			= raw_smp_processor_id();
  	ks->ex_vector		= evector;
  	ks->signo		= signo;
62fae3121   Jason Wessel   kgdb: eliminate k...
681
  	ks->err_code		= ecode;
62fae3121   Jason Wessel   kgdb: eliminate k...
682
683
684
  	ks->linux_regs		= regs;
  
  	if (kgdb_reenter_check(ks))
5a14fead0   Anton Vorontsov   kernel/debug: Mas...
685
  		goto out; /* Ouch, double exception ! */
dfee3a7b9   Jason Wessel   debug_core: refac...
686
  	if (kgdb_info[ks->cpu].enter_kgdb != 0)
5a14fead0   Anton Vorontsov   kernel/debug: Mas...
687
  		goto out;
dfee3a7b9   Jason Wessel   debug_core: refac...
688

5a14fead0   Anton Vorontsov   kernel/debug: Mas...
689
690
691
692
693
  	ret = kgdb_cpu_enter(ks, regs, DCPU_WANT_MASTER);
  out:
  	if (arch_kgdb_ops.enable_nmi)
  		arch_kgdb_ops.enable_nmi(1);
  	return ret;
62fae3121   Jason Wessel   kgdb: eliminate k...
694
  }
f30fed10c   Jason Wessel   kgdb: Add module ...
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
  /*
   * GDB places a breakpoint at this function to know dynamically
   * loaded objects. It's not defined static so that only one instance with this
   * name exists in the kernel.
   */
  
  static int module_event(struct notifier_block *self, unsigned long val,
  	void *data)
  {
  	return 0;
  }
  
  static struct notifier_block dbg_module_load_nb = {
  	.notifier_call	= module_event,
  };
dc7d55270   Jason Wessel   kgdb: core
710
711
712
  int kgdb_nmicallback(int cpu, void *regs)
  {
  #ifdef CONFIG_SMP
62fae3121   Jason Wessel   kgdb: eliminate k...
713
714
715
716
717
718
  	struct kgdb_state kgdb_var;
  	struct kgdb_state *ks = &kgdb_var;
  
  	memset(ks, 0, sizeof(struct kgdb_state));
  	ks->cpu			= cpu;
  	ks->linux_regs		= regs;
dfee3a7b9   Jason Wessel   debug_core: refac...
719
720
721
  	if (kgdb_info[ks->cpu].enter_kgdb == 0 &&
  			raw_spin_is_locked(&dbg_master_lock)) {
  		kgdb_cpu_enter(ks, regs, DCPU_IS_SLAVE);
dc7d55270   Jason Wessel   kgdb: core
722
723
724
725
726
  		return 0;
  	}
  #endif
  	return 1;
  }
fc8b13740   Mike Travis   kgdb/kdb: Fix no ...
727
728
  int kgdb_nmicallin(int cpu, int trapnr, void *regs, int err_code,
  							atomic_t *send_ready)
8daaa5f82   Mike Travis   kdb: Add support ...
729
730
731
732
733
734
735
736
737
738
739
740
741
  {
  #ifdef CONFIG_SMP
  	if (!kgdb_io_ready(0) || !send_ready)
  		return 1;
  
  	if (kgdb_info[cpu].enter_kgdb == 0) {
  		struct kgdb_state kgdb_var;
  		struct kgdb_state *ks = &kgdb_var;
  
  		memset(ks, 0, sizeof(struct kgdb_state));
  		ks->cpu			= cpu;
  		ks->ex_vector		= trapnr;
  		ks->signo		= SIGTRAP;
fc8b13740   Mike Travis   kgdb/kdb: Fix no ...
742
  		ks->err_code		= err_code;
8daaa5f82   Mike Travis   kdb: Add support ...
743
744
745
746
747
748
749
750
  		ks->linux_regs		= regs;
  		ks->send_ready		= send_ready;
  		kgdb_cpu_enter(ks, regs, DCPU_WANT_MASTER);
  		return 0;
  	}
  #endif
  	return 1;
  }
aabdc3b8c   Jason Wessel   kgdb: sparse fix
751
752
  static void kgdb_console_write(struct console *co, const char *s,
     unsigned count)
dc7d55270   Jason Wessel   kgdb: core
753
754
755
756
757
  {
  	unsigned long flags;
  
  	/* If we're debugging, or KGDB has not connected, don't try
  	 * and print. */
dcc787112   Jason Wessel   kgdb: core change...
758
  	if (!kgdb_connected || atomic_read(&kgdb_active) != -1 || dbg_kdb_mode)
dc7d55270   Jason Wessel   kgdb: core
759
760
761
  		return;
  
  	local_irq_save(flags);
53197fc49   Jason Wessel   Separate the gdbs...
762
  	gdbstub_msg_write(s, count);
dc7d55270   Jason Wessel   kgdb: core
763
764
765
766
767
768
769
770
771
772
773
  	local_irq_restore(flags);
  }
  
  static struct console kgdbcons = {
  	.name		= "kgdb",
  	.write		= kgdb_console_write,
  	.flags		= CON_PRINTBUFFER | CON_ENABLED,
  	.index		= -1,
  };
  
  #ifdef CONFIG_MAGIC_SYSRQ
1495cc9df   Dmitry Torokhov   Input: sysrq - dr...
774
  static void sysrq_handle_dbg(int key)
dc7d55270   Jason Wessel   kgdb: core
775
  {
53197fc49   Jason Wessel   Separate the gdbs...
776
  	if (!dbg_io_ops) {
dc7d55270   Jason Wessel   kgdb: core
777
778
779
780
  		printk(KERN_CRIT "ERROR: No KGDB I/O module available
  ");
  		return;
  	}
dcc787112   Jason Wessel   kgdb: core change...
781
782
783
784
785
786
  	if (!kgdb_connected) {
  #ifdef CONFIG_KGDB_KDB
  		if (!dbg_kdb_mode)
  			printk(KERN_CRIT "KGDB or $3#33 for KDB
  ");
  #else
dc7d55270   Jason Wessel   kgdb: core
787
788
  		printk(KERN_CRIT "Entering KGDB
  ");
dcc787112   Jason Wessel   kgdb: core change...
789
790
  #endif
  	}
dc7d55270   Jason Wessel   kgdb: core
791
792
793
  
  	kgdb_breakpoint();
  }
53197fc49   Jason Wessel   Separate the gdbs...
794
795
  static struct sysrq_key_op sysrq_dbg_op = {
  	.handler	= sysrq_handle_dbg,
f34565096   zhangwei(Jovi)   kgdb/sysrq: fix i...
796
  	.help_msg	= "debug(g)",
364b5b7b1   Jason Wessel   sysrq, intel_fb: ...
797
  	.action_msg	= "DEBUG",
dc7d55270   Jason Wessel   kgdb: core
798
799
  };
  #endif
4402c153c   Jason Wessel   kdb,debug_core: A...
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
  static int kgdb_panic_event(struct notifier_block *self,
  			    unsigned long val,
  			    void *data)
  {
  	if (dbg_kdb_mode)
  		kdb_printf("PANIC: %s
  ", (char *)data);
  	kgdb_breakpoint();
  	return NOTIFY_DONE;
  }
  
  static struct notifier_block kgdb_panic_event_nb = {
         .notifier_call	= kgdb_panic_event,
         .priority	= INT_MAX,
  };
0b4b3827d   Jason Wessel   x86, kgdb, init: ...
815
816
817
818
819
820
821
822
823
824
825
  void __weak kgdb_arch_late(void)
  {
  }
  
  void __init dbg_late_init(void)
  {
  	dbg_is_early = false;
  	if (kgdb_io_module_registered)
  		kgdb_arch_late();
  	kdb_init(KDB_INIT_FULL);
  }
2366e0478   Jason Wessel   kgdb,debug-core,g...
826
827
828
  static int
  dbg_notify_reboot(struct notifier_block *this, unsigned long code, void *x)
  {
bec4d62ea   Jason Wessel   kgdb,debug_core: ...
829
830
831
832
833
834
835
836
837
838
839
840
  	/*
  	 * Take the following action on reboot notify depending on value:
  	 *    1 == Enter debugger
  	 *    0 == [the default] detatch debug client
  	 *   -1 == Do nothing... and use this until the board resets
  	 */
  	switch (kgdbreboot) {
  	case 1:
  		kgdb_breakpoint();
  	case -1:
  		goto done;
  	}
2366e0478   Jason Wessel   kgdb,debug-core,g...
841
842
  	if (!dbg_kdb_mode)
  		gdbstub_exit(code);
bec4d62ea   Jason Wessel   kgdb,debug_core: ...
843
  done:
2366e0478   Jason Wessel   kgdb,debug-core,g...
844
845
846
847
848
849
850
851
  	return NOTIFY_DONE;
  }
  
  static struct notifier_block dbg_reboot_notifier = {
  	.notifier_call		= dbg_notify_reboot,
  	.next			= NULL,
  	.priority		= INT_MAX,
  };
dc7d55270   Jason Wessel   kgdb: core
852
853
854
855
856
  static void kgdb_register_callbacks(void)
  {
  	if (!kgdb_io_module_registered) {
  		kgdb_io_module_registered = 1;
  		kgdb_arch_init();
0b4b3827d   Jason Wessel   x86, kgdb, init: ...
857
858
  		if (!dbg_is_early)
  			kgdb_arch_late();
f30fed10c   Jason Wessel   kgdb: Add module ...
859
  		register_module_notifier(&dbg_module_load_nb);
2366e0478   Jason Wessel   kgdb,debug-core,g...
860
  		register_reboot_notifier(&dbg_reboot_notifier);
4402c153c   Jason Wessel   kdb,debug_core: A...
861
862
  		atomic_notifier_chain_register(&panic_notifier_list,
  					       &kgdb_panic_event_nb);
dc7d55270   Jason Wessel   kgdb: core
863
  #ifdef CONFIG_MAGIC_SYSRQ
53197fc49   Jason Wessel   Separate the gdbs...
864
  		register_sysrq_key('g', &sysrq_dbg_op);
dc7d55270   Jason Wessel   kgdb: core
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
  #endif
  		if (kgdb_use_con && !kgdb_con_registered) {
  			register_console(&kgdbcons);
  			kgdb_con_registered = 1;
  		}
  	}
  }
  
  static void kgdb_unregister_callbacks(void)
  {
  	/*
  	 * When this routine is called KGDB should unregister from the
  	 * panic handler and clean up, making sure it is not handling any
  	 * break exceptions at the time.
  	 */
  	if (kgdb_io_module_registered) {
  		kgdb_io_module_registered = 0;
2366e0478   Jason Wessel   kgdb,debug-core,g...
882
  		unregister_reboot_notifier(&dbg_reboot_notifier);
f30fed10c   Jason Wessel   kgdb: Add module ...
883
  		unregister_module_notifier(&dbg_module_load_nb);
4402c153c   Jason Wessel   kdb,debug_core: A...
884
885
  		atomic_notifier_chain_unregister(&panic_notifier_list,
  					       &kgdb_panic_event_nb);
dc7d55270   Jason Wessel   kgdb: core
886
887
  		kgdb_arch_exit();
  #ifdef CONFIG_MAGIC_SYSRQ
53197fc49   Jason Wessel   Separate the gdbs...
888
  		unregister_sysrq_key('g', &sysrq_dbg_op);
dc7d55270   Jason Wessel   kgdb: core
889
890
891
892
893
894
895
  #endif
  		if (kgdb_con_registered) {
  			unregister_console(&kgdbcons);
  			kgdb_con_registered = 0;
  		}
  	}
  }
1cee5e35f   Jason Wessel   kgdb: Add the abi...
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
  /*
   * There are times a tasklet needs to be used vs a compiled in
   * break point so as to cause an exception outside a kgdb I/O module,
   * such as is the case with kgdboe, where calling a breakpoint in the
   * I/O driver itself would be fatal.
   */
  static void kgdb_tasklet_bpt(unsigned long ing)
  {
  	kgdb_breakpoint();
  	atomic_set(&kgdb_break_tasklet_var, 0);
  }
  
  static DECLARE_TASKLET(kgdb_tasklet_breakpoint, kgdb_tasklet_bpt, 0);
  
  void kgdb_schedule_breakpoint(void)
  {
  	if (atomic_read(&kgdb_break_tasklet_var) ||
  		atomic_read(&kgdb_active) != -1 ||
  		atomic_read(&kgdb_setting_breakpoint))
  		return;
  	atomic_inc(&kgdb_break_tasklet_var);
  	tasklet_schedule(&kgdb_tasklet_breakpoint);
  }
  EXPORT_SYMBOL_GPL(kgdb_schedule_breakpoint);
dc7d55270   Jason Wessel   kgdb: core
920
921
922
923
924
925
926
927
928
929
  static void kgdb_initial_breakpoint(void)
  {
  	kgdb_break_asap = 0;
  
  	printk(KERN_CRIT "kgdb: Waiting for connection from remote gdb...
  ");
  	kgdb_breakpoint();
  }
  
  /**
737a460f2   Jason Wessel   kgdb: fix several...
930
   *	kgdb_register_io_module - register KGDB IO module
53197fc49   Jason Wessel   Separate the gdbs...
931
   *	@new_dbg_io_ops: the io ops vector
dc7d55270   Jason Wessel   kgdb: core
932
933
934
   *
   *	Register it with the KGDB core.
   */
53197fc49   Jason Wessel   Separate the gdbs...
935
  int kgdb_register_io_module(struct kgdb_io *new_dbg_io_ops)
dc7d55270   Jason Wessel   kgdb: core
936
937
938
939
  {
  	int err;
  
  	spin_lock(&kgdb_registration_lock);
53197fc49   Jason Wessel   Separate the gdbs...
940
  	if (dbg_io_ops) {
dc7d55270   Jason Wessel   kgdb: core
941
942
943
944
945
946
947
  		spin_unlock(&kgdb_registration_lock);
  
  		printk(KERN_ERR "kgdb: Another I/O driver is already "
  				"registered with KGDB.
  ");
  		return -EBUSY;
  	}
53197fc49   Jason Wessel   Separate the gdbs...
948
949
  	if (new_dbg_io_ops->init) {
  		err = new_dbg_io_ops->init();
dc7d55270   Jason Wessel   kgdb: core
950
951
952
953
954
  		if (err) {
  			spin_unlock(&kgdb_registration_lock);
  			return err;
  		}
  	}
53197fc49   Jason Wessel   Separate the gdbs...
955
  	dbg_io_ops = new_dbg_io_ops;
dc7d55270   Jason Wessel   kgdb: core
956
957
958
959
960
  
  	spin_unlock(&kgdb_registration_lock);
  
  	printk(KERN_INFO "kgdb: Registered I/O driver %s.
  ",
53197fc49   Jason Wessel   Separate the gdbs...
961
  	       new_dbg_io_ops->name);
dc7d55270   Jason Wessel   kgdb: core
962
963
964
965
966
967
968
969
970
971
972
973
974
  
  	/* Arm KGDB now. */
  	kgdb_register_callbacks();
  
  	if (kgdb_break_asap)
  		kgdb_initial_breakpoint();
  
  	return 0;
  }
  EXPORT_SYMBOL_GPL(kgdb_register_io_module);
  
  /**
   *	kkgdb_unregister_io_module - unregister KGDB IO module
53197fc49   Jason Wessel   Separate the gdbs...
975
   *	@old_dbg_io_ops: the io ops vector
dc7d55270   Jason Wessel   kgdb: core
976
977
978
   *
   *	Unregister it with the KGDB core.
   */
53197fc49   Jason Wessel   Separate the gdbs...
979
  void kgdb_unregister_io_module(struct kgdb_io *old_dbg_io_ops)
dc7d55270   Jason Wessel   kgdb: core
980
981
982
983
984
985
986
987
988
989
  {
  	BUG_ON(kgdb_connected);
  
  	/*
  	 * KGDB is no longer able to communicate out, so
  	 * unregister our callbacks and reset state.
  	 */
  	kgdb_unregister_callbacks();
  
  	spin_lock(&kgdb_registration_lock);
53197fc49   Jason Wessel   Separate the gdbs...
990
991
  	WARN_ON_ONCE(dbg_io_ops != old_dbg_io_ops);
  	dbg_io_ops = NULL;
dc7d55270   Jason Wessel   kgdb: core
992
993
994
995
996
997
  
  	spin_unlock(&kgdb_registration_lock);
  
  	printk(KERN_INFO
  		"kgdb: Unregistered I/O driver %s, debugger disabled.
  ",
53197fc49   Jason Wessel   Separate the gdbs...
998
  		old_dbg_io_ops->name);
dc7d55270   Jason Wessel   kgdb: core
999
1000
  }
  EXPORT_SYMBOL_GPL(kgdb_unregister_io_module);
dcc787112   Jason Wessel   kgdb: core change...
1001
1002
1003
  int dbg_io_get_char(void)
  {
  	int ret = dbg_io_ops->read_char();
f5316b4ae   Jason Wessel   kgdb,8250,pl011: ...
1004
1005
  	if (ret == NO_POLL_CHAR)
  		return -1;
dcc787112   Jason Wessel   kgdb: core change...
1006
1007
1008
1009
1010
1011
  	if (!dbg_kdb_mode)
  		return ret;
  	if (ret == 127)
  		return 8;
  	return ret;
  }
dc7d55270   Jason Wessel   kgdb: core
1012
1013
1014
1015
1016
1017
1018
1019
  /**
   * kgdb_breakpoint - generate breakpoint exception
   *
   * This function will generate a breakpoint exception.  It is used at the
   * beginning of a program to sync up with a debugger and can be used
   * otherwise as a quick means to stop program execution and "break" into
   * the debugger.
   */
d498d4b47   Vijaya Kumar K   KGDB: make kgdb_b...
1020
  noinline void kgdb_breakpoint(void)
dc7d55270   Jason Wessel   kgdb: core
1021
  {
ae6bf53e0   Jason Wessel   kgdb: use atomic_...
1022
  	atomic_inc(&kgdb_setting_breakpoint);
dc7d55270   Jason Wessel   kgdb: core
1023
1024
1025
  	wmb(); /* Sync point before breakpoint */
  	arch_kgdb_breakpoint();
  	wmb(); /* Sync point after breakpoint */
ae6bf53e0   Jason Wessel   kgdb: use atomic_...
1026
  	atomic_dec(&kgdb_setting_breakpoint);
dc7d55270   Jason Wessel   kgdb: core
1027
1028
1029
1030
1031
1032
  }
  EXPORT_SYMBOL_GPL(kgdb_breakpoint);
  
  static int __init opt_kgdb_wait(char *str)
  {
  	kgdb_break_asap = 1;
dcc787112   Jason Wessel   kgdb: core change...
1033
  	kdb_init(KDB_INIT_EARLY);
dc7d55270   Jason Wessel   kgdb: core
1034
1035
1036
1037
1038
1039
1040
  	if (kgdb_io_module_registered)
  		kgdb_initial_breakpoint();
  
  	return 0;
  }
  
  early_param("kgdbwait", opt_kgdb_wait);