Blame view

kernel/debug/debug_core.c 22.7 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>
dc7d55270   Jason Wessel   kgdb: core
32
33
34
35
36
37
38
39
  #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
40
41
42
43
44
45
  #include <linux/string.h>
  #include <linux/delay.h>
  #include <linux/sched.h>
  #include <linux/sysrq.h>
  #include <linux/init.h>
  #include <linux/kgdb.h>
dcc787112   Jason Wessel   kgdb: core change...
46
  #include <linux/kdb.h>
dc7d55270   Jason Wessel   kgdb: core
47
48
49
  #include <linux/pid.h>
  #include <linux/smp.h>
  #include <linux/mm.h>
fb70b5888   Jason Wessel   debug_core: stop ...
50
  #include <linux/rcupdate.h>
dc7d55270   Jason Wessel   kgdb: core
51
52
53
  
  #include <asm/cacheflush.h>
  #include <asm/byteorder.h>
60063497a   Arun Sharma   atomic: use <linu...
54
  #include <linux/atomic.h>
dc7d55270   Jason Wessel   kgdb: core
55
  #include <asm/system.h>
53197fc49   Jason Wessel   Separate the gdbs...
56
  #include "debug_core.h"
dc7d55270   Jason Wessel   kgdb: core
57

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

53197fc49   Jason Wessel   Separate the gdbs...
60
  struct debuggerinfo_struct kgdb_info[NR_CPUS];
dc7d55270   Jason Wessel   kgdb: core
61
62
63
64
65
66
67
68
  
  /**
   * 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...
69
  int			kgdb_io_module_registered;
dc7d55270   Jason Wessel   kgdb: core
70
71
72
  
  /* Guard for recursive entry */
  static int			exception_level;
53197fc49   Jason Wessel   Separate the gdbs...
73
  struct kgdb_io		*dbg_io_ops;
dc7d55270   Jason Wessel   kgdb: core
74
75
76
77
78
79
  static DEFINE_SPINLOCK(kgdb_registration_lock);
  
  /* 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: ...
80
81
  /* Flag for alternate operations for early debugging */
  bool dbg_is_early = true;
dcc787112   Jason Wessel   kgdb: core change...
82
83
84
85
  /* Next cpu to become the master debug core */
  int dbg_switch_cpu;
  
  /* Use kdb or gdbserver mode */
a0de055cf   Jason Wessel   kgdb: gdb "monito...
86
  int dbg_kdb_mode = 1;
dc7d55270   Jason Wessel   kgdb: core
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
  
  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);
  
  /*
   * 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...
110
  EXPORT_SYMBOL_GPL(kgdb_active);
dfee3a7b9   Jason Wessel   debug_core: refac...
111
112
  static DEFINE_RAW_SPINLOCK(dbg_master_lock);
  static DEFINE_RAW_SPINLOCK(dbg_slave_lock);
dc7d55270   Jason Wessel   kgdb: core
113
114
115
116
117
  
  /*
   * 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...
118
119
  static atomic_t			masters_in_kgdb;
  static atomic_t			slaves_in_kgdb;
1cee5e35f   Jason Wessel   kgdb: Add the abi...
120
  static atomic_t			kgdb_break_tasklet_var;
dc7d55270   Jason Wessel   kgdb: core
121
122
123
124
125
126
  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...
127
  static pid_t			kgdb_sstep_pid;
dc7d55270   Jason Wessel   kgdb: core
128
129
130
131
132
133
134
135
136
137
138
  
  /* 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...
139
  static int kgdb_do_roundup = 1;
dc7d55270   Jason Wessel   kgdb: core
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
  
  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:
   */
dc7d55270   Jason Wessel   kgdb: core
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
  int __weak kgdb_arch_set_breakpoint(unsigned long addr, char *saved_instr)
  {
  	int err;
  
  	err = probe_kernel_read(saved_instr, (char *)addr, BREAK_INSTR_SIZE);
  	if (err)
  		return err;
  
  	return probe_kernel_write((char *)addr, arch_kgdb_ops.gdb_bpt_instr,
  				  BREAK_INSTR_SIZE);
  }
  
  int __weak kgdb_arch_remove_breakpoint(unsigned long addr, char *bundle)
  {
  	return probe_kernel_write((char *)addr,
  				  (char *)bundle, BREAK_INSTR_SIZE);
  }
a9b60bf4c   Jason Wessel   kgdb: fix kgdb_va...
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
  int __weak kgdb_validate_break_address(unsigned long addr)
  {
  	char tmp_variable[BREAK_INSTR_SIZE];
  	int err;
  	/* Validate setting the breakpoint and then removing it.  In the
  	 * 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.
  	 */
  	err = kgdb_arch_set_breakpoint(addr, tmp_variable);
  	if (err)
  		return err;
  	err = kgdb_arch_remove_breakpoint(addr, tmp_variable);
  	if (err)
  		printk(KERN_ERR "KGDB: Critical breakpoint error, kernel "
  		   "memory destroyed at: %lx", addr);
  	return err;
  }
dc7d55270   Jason Wessel   kgdb: core
193
194
195
196
197
198
199
200
201
  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...
202
203
204
205
  int __weak kgdb_skipexception(int exception, struct pt_regs *regs)
  {
  	return 0;
  }
dc7d55270   Jason Wessel   kgdb: core
206
  /*
dc7d55270   Jason Wessel   kgdb: core
207
208
209
210
211
212
213
   * 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;
737a460f2   Jason Wessel   kgdb: fix several...
214
  	if (current->mm && current->mm->mmap_cache) {
dc7d55270   Jason Wessel   kgdb: core
215
216
  		flush_cache_range(current->mm->mmap_cache,
  				  addr, addr + BREAK_INSTR_SIZE);
dc7d55270   Jason Wessel   kgdb: core
217
  	}
1a9a3e76d   Jason Wessel   kgdb: always use ...
218
219
  	/* Force flush instruction cache if it was outside the mm */
  	flush_icache_range(addr, addr + BREAK_INSTR_SIZE);
dc7d55270   Jason Wessel   kgdb: core
220
221
222
223
224
  }
  
  /*
   * SW breakpoint management:
   */
53197fc49   Jason Wessel   Separate the gdbs...
225
  int dbg_activate_sw_breakpoints(void)
dc7d55270   Jason Wessel   kgdb: core
226
227
  {
  	unsigned long addr;
7f8b7ed6f   Jason Wessel   kgdb: Always proc...
228
229
  	int error;
  	int ret = 0;
dc7d55270   Jason Wessel   kgdb: core
230
231
232
233
234
235
236
237
238
  	int i;
  
  	for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++) {
  		if (kgdb_break[i].state != BP_SET)
  			continue;
  
  		addr = kgdb_break[i].bpt_addr;
  		error = kgdb_arch_set_breakpoint(addr,
  				kgdb_break[i].saved_instr);
7f8b7ed6f   Jason Wessel   kgdb: Always proc...
239
240
241
242
243
  		if (error) {
  			ret = error;
  			printk(KERN_INFO "KGDB: BP install failed: %lx", addr);
  			continue;
  		}
dc7d55270   Jason Wessel   kgdb: core
244
245
246
247
  
  		kgdb_flush_swbreak_addr(addr);
  		kgdb_break[i].state = BP_ACTIVE;
  	}
7f8b7ed6f   Jason Wessel   kgdb: Always proc...
248
  	return ret;
dc7d55270   Jason Wessel   kgdb: core
249
  }
53197fc49   Jason Wessel   Separate the gdbs...
250
  int dbg_set_sw_break(unsigned long addr)
dc7d55270   Jason Wessel   kgdb: core
251
252
253
254
255
256
257
258
259
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
  {
  	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...
290
  int dbg_deactivate_sw_breakpoints(void)
dc7d55270   Jason Wessel   kgdb: core
291
292
  {
  	unsigned long addr;
7f8b7ed6f   Jason Wessel   kgdb: Always proc...
293
294
  	int error;
  	int ret = 0;
dc7d55270   Jason Wessel   kgdb: core
295
296
297
298
299
300
301
302
  	int i;
  
  	for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++) {
  		if (kgdb_break[i].state != BP_ACTIVE)
  			continue;
  		addr = kgdb_break[i].bpt_addr;
  		error = kgdb_arch_remove_breakpoint(addr,
  					kgdb_break[i].saved_instr);
7f8b7ed6f   Jason Wessel   kgdb: Always proc...
303
304
305
306
307
  		if (error) {
  			printk(KERN_INFO "KGDB: BP remove failed: %lx
  ", addr);
  			ret = error;
  		}
dc7d55270   Jason Wessel   kgdb: core
308
309
310
311
  
  		kgdb_flush_swbreak_addr(addr);
  		kgdb_break[i].state = BP_SET;
  	}
7f8b7ed6f   Jason Wessel   kgdb: Always proc...
312
  	return ret;
dc7d55270   Jason Wessel   kgdb: core
313
  }
53197fc49   Jason Wessel   Separate the gdbs...
314
  int dbg_remove_sw_break(unsigned long addr)
dc7d55270   Jason Wessel   kgdb: core
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
  {
  	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...
339
  int dbg_remove_all_break(void)
dc7d55270   Jason Wessel   kgdb: core
340
341
342
343
344
345
346
  {
  	unsigned long addr;
  	int error;
  	int i;
  
  	/* Clear memory breakpoints. */
  	for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++) {
737a460f2   Jason Wessel   kgdb: fix several...
347
348
  		if (kgdb_break[i].state != BP_ACTIVE)
  			goto setundefined;
dc7d55270   Jason Wessel   kgdb: core
349
350
351
352
  		addr = kgdb_break[i].bpt_addr;
  		error = kgdb_arch_remove_breakpoint(addr,
  				kgdb_break[i].saved_instr);
  		if (error)
737a460f2   Jason Wessel   kgdb: fix several...
353
354
355
356
357
  			printk(KERN_ERR "KGDB: breakpoint remove failed: %lx
  ",
  			   addr);
  setundefined:
  		kgdb_break[i].state = BP_UNDEFINED;
dc7d55270   Jason Wessel   kgdb: core
358
359
360
361
362
363
364
365
366
367
  	}
  
  	/* 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
368
369
370
371
372
373
374
375
376
377
   * 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...
378
  	if (!dbg_io_ops)
dc7d55270   Jason Wessel   kgdb: core
379
380
381
382
383
  		return 0;
  	if (kgdb_connected)
  		return 1;
  	if (atomic_read(&kgdb_setting_breakpoint))
  		return 1;
dcc787112   Jason Wessel   kgdb: core change...
384
385
386
387
388
389
  	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
390
391
  		printk(KERN_CRIT "KGDB: Waiting for remote debugger
  ");
dcc787112   Jason Wessel   kgdb: core change...
392
393
  #endif
  	}
dc7d55270   Jason Wessel   kgdb: core
394
395
  	return 1;
  }
dc7d55270   Jason Wessel   kgdb: core
396
397
398
399
400
401
402
403
404
405
  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...
406
  	dbg_deactivate_sw_breakpoints();
dc7d55270   Jason Wessel   kgdb: core
407
408
409
410
411
412
413
  
  	/*
  	 * 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...
414
  	if (dbg_remove_sw_break(addr) == 0) {
dc7d55270   Jason Wessel   kgdb: core
415
416
  		exception_level = 0;
  		kgdb_skipexception(ks->ex_vector, ks->linux_regs);
53197fc49   Jason Wessel   Separate the gdbs...
417
  		dbg_activate_sw_breakpoints();
67baf94cd   Jason Wessel   kgdb: print break...
418
419
420
  		printk(KERN_CRIT "KGDB: re-enter error: breakpoint removed %lx
  ",
  			addr);
dc7d55270   Jason Wessel   kgdb: core
421
422
423
424
  		WARN_ON_ONCE(1);
  
  		return 1;
  	}
53197fc49   Jason Wessel   Separate the gdbs...
425
  	dbg_remove_all_break();
dc7d55270   Jason Wessel   kgdb: core
426
427
428
429
430
431
432
433
434
  	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...
435
436
437
438
  #ifdef CONFIG_KGDB_KDB
  	/* Allow kdb to debug itself one level */
  	return 0;
  #endif
dc7d55270   Jason Wessel   kgdb: core
439
440
441
442
443
  	dump_stack();
  	panic("Recursive entry to debugger");
  
  	return 1;
  }
16cdc628c   Jason Wessel   debug_core: move ...
444
445
446
447
  static void dbg_touch_watchdogs(void)
  {
  	touch_softlockup_watchdog_sync();
  	clocksource_touch_watchdog();
fb70b5888   Jason Wessel   debug_core: stop ...
448
  	rcu_cpu_stall_reset();
16cdc628c   Jason Wessel   debug_core: move ...
449
  }
dfee3a7b9   Jason Wessel   debug_core: refac...
450
451
  static int kgdb_cpu_enter(struct kgdb_state *ks, struct pt_regs *regs,
  		int exception_state)
dc7d55270   Jason Wessel   kgdb: core
452
  {
dc7d55270   Jason Wessel   kgdb: core
453
  	unsigned long flags;
028e7b175   Jason Wessel   kgdb: allow for c...
454
  	int sstep_tries = 100;
dcc787112   Jason Wessel   kgdb: core change...
455
  	int error;
dfee3a7b9   Jason Wessel   debug_core: refac...
456
  	int cpu;
4da75b9ce   Jason Wessel   kgdb: Turn off tr...
457
  	int trace_on = 0;
dfee3a7b9   Jason Wessel   debug_core: refac...
458
  	int online_cpus = num_online_cpus();
c1bb9a9c1   Dongdong Deng   debug_core: disab...
459

dfee3a7b9   Jason Wessel   debug_core: refac...
460
461
462
463
464
465
466
  	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...
467
468
469
  
  	if (arch_kgdb_ops.disable_hw_break)
  		arch_kgdb_ops.disable_hw_break(regs);
c1bb9a9c1   Dongdong Deng   debug_core: disab...
470

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

dfee3a7b9   Jason Wessel   debug_core: refac...
483
484
485
486
487
488
  	/* 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...
489
  		goto cpu_master_loop;
dfee3a7b9   Jason Wessel   debug_core: refac...
490
  	}
6d9063407   Jason Wessel   debug_core,kdb: A...
491

dc7d55270   Jason Wessel   kgdb: core
492
  	/*
62fae3121   Jason Wessel   kgdb: eliminate k...
493
494
  	 * 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
495
  	 */
62fae3121   Jason Wessel   kgdb: eliminate k...
496
  	while (1) {
dcc787112   Jason Wessel   kgdb: core change...
497
498
499
500
501
  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...
502
503
  			if (raw_spin_trylock(&dbg_master_lock)) {
  				atomic_xchg(&kgdb_active, cpu);
62fae3121   Jason Wessel   kgdb: eliminate k...
504
  				break;
dfee3a7b9   Jason Wessel   debug_core: refac...
505
  			}
62fae3121   Jason Wessel   kgdb: eliminate k...
506
  		} else if (kgdb_info[cpu].exception_state & DCPU_IS_SLAVE) {
dfee3a7b9   Jason Wessel   debug_core: refac...
507
  			if (!raw_spin_is_locked(&dbg_slave_lock))
62fae3121   Jason Wessel   kgdb: eliminate k...
508
509
510
511
512
513
514
515
  				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...
516
517
  			if (trace_on)
  				tracing_on();
dfee3a7b9   Jason Wessel   debug_core: refac...
518
519
520
521
522
  			kgdb_info[cpu].exception_state &=
  				~(DCPU_WANT_MASTER | DCPU_IS_SLAVE);
  			kgdb_info[cpu].enter_kgdb--;
  			smp_mb__before_atomic_dec();
  			atomic_dec(&slaves_in_kgdb);
16cdc628c   Jason Wessel   debug_core: move ...
523
  			dbg_touch_watchdogs();
62fae3121   Jason Wessel   kgdb: eliminate k...
524
525
526
  			local_irq_restore(flags);
  			return 0;
  		}
dc7d55270   Jason Wessel   kgdb: core
527
  		cpu_relax();
62fae3121   Jason Wessel   kgdb: eliminate k...
528
  	}
dc7d55270   Jason Wessel   kgdb: core
529
530
  
  	/*
028e7b175   Jason Wessel   kgdb: allow for c...
531
  	 * For single stepping, try to only enter on the processor
25985edce   Lucas De Marchi   Fix common misspe...
532
  	 * that was single stepping.  To guard against a deadlock, the
028e7b175   Jason Wessel   kgdb: allow for c...
533
534
  	 * kernel will only try for the value of sstep_tries before
  	 * giving up and continuing on.
dc7d55270   Jason Wessel   kgdb: core
535
536
  	 */
  	if (atomic_read(&kgdb_cpu_doing_single_step) != -1 &&
028e7b175   Jason Wessel   kgdb: allow for c...
537
538
  	    (kgdb_info[cpu].task &&
  	     kgdb_info[cpu].task->pid != kgdb_sstep_pid) && --sstep_tries) {
dc7d55270   Jason Wessel   kgdb: core
539
  		atomic_set(&kgdb_active, -1);
dfee3a7b9   Jason Wessel   debug_core: refac...
540
  		raw_spin_unlock(&dbg_master_lock);
16cdc628c   Jason Wessel   debug_core: move ...
541
  		dbg_touch_watchdogs();
dc7d55270   Jason Wessel   kgdb: core
542
543
544
545
546
547
  		local_irq_restore(flags);
  
  		goto acquirelock;
  	}
  
  	if (!kgdb_io_ready(1)) {
dcc787112   Jason Wessel   kgdb: core change...
548
  		kgdb_info[cpu].ret_state = 1;
53197fc49   Jason Wessel   Separate the gdbs...
549
  		goto kgdb_restore; /* No I/O connection, resume the system */
dc7d55270   Jason Wessel   kgdb: core
550
551
552
553
554
555
556
557
558
  	}
  
  	/*
  	 * 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...
559
560
  	if (dbg_io_ops->pre_exception)
  		dbg_io_ops->pre_exception();
dc7d55270   Jason Wessel   kgdb: core
561

dc7d55270   Jason Wessel   kgdb: core
562
563
564
565
  	/*
  	 * 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...
566
567
  	if (!kgdb_single_step)
  		raw_spin_lock(&dbg_slave_lock);
dc7d55270   Jason Wessel   kgdb: core
568

56fb70932   Jason Wessel   kgdb: fix SMP NMI...
569
570
  #ifdef CONFIG_SMP
  	/* Signal the other CPUs to enter kgdb_wait() */
d7161a653   Jason Wessel   kgdb, x86, arm, m...
571
  	if ((!kgdb_single_step) && kgdb_do_roundup)
56fb70932   Jason Wessel   kgdb: fix SMP NMI...
572
573
  		kgdb_roundup_cpus(flags);
  #endif
dc7d55270   Jason Wessel   kgdb: core
574
575
576
  	/*
  	 * Wait for the other CPUs to be notified and be waiting for us:
  	 */
dfee3a7b9   Jason Wessel   debug_core: refac...
577
578
579
  	while (kgdb_do_roundup && (atomic_read(&masters_in_kgdb) +
  				atomic_read(&slaves_in_kgdb)) != online_cpus)
  		cpu_relax();
dc7d55270   Jason Wessel   kgdb: core
580
581
582
583
584
  
  	/*
  	 * At this point the primary processor is completely
  	 * in the debugger and all secondary CPUs are quiescent
  	 */
dcc787112   Jason Wessel   kgdb: core change...
585
  	dbg_deactivate_sw_breakpoints();
dc7d55270   Jason Wessel   kgdb: core
586
  	kgdb_single_step = 0;
d7161a653   Jason Wessel   kgdb, x86, arm, m...
587
  	kgdb_contthread = current;
dc7d55270   Jason Wessel   kgdb: core
588
  	exception_level = 0;
4da75b9ce   Jason Wessel   kgdb: Turn off tr...
589
590
591
  	trace_on = tracing_is_on();
  	if (trace_on)
  		tracing_off();
dc7d55270   Jason Wessel   kgdb: core
592

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

d7161a653   Jason Wessel   kgdb, x86, arm, m...
621
  	if (!kgdb_single_step) {
dfee3a7b9   Jason Wessel   debug_core: refac...
622
623
624
625
  		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
626
627
628
  	}
  
  kgdb_restore:
028e7b175   Jason Wessel   kgdb: allow for c...
629
630
631
632
633
634
635
  	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...
636
637
  	if (arch_kgdb_ops.correct_hw_break)
  		arch_kgdb_ops.correct_hw_break();
4da75b9ce   Jason Wessel   kgdb: Turn off tr...
638
639
  	if (trace_on)
  		tracing_on();
dfee3a7b9   Jason Wessel   debug_core: refac...
640
641
642
643
644
645
  
  	kgdb_info[cpu].exception_state &=
  		~(DCPU_WANT_MASTER | DCPU_IS_SLAVE);
  	kgdb_info[cpu].enter_kgdb--;
  	smp_mb__before_atomic_dec();
  	atomic_dec(&masters_in_kgdb);
dc7d55270   Jason Wessel   kgdb: core
646
647
  	/* Free kgdb_active */
  	atomic_set(&kgdb_active, -1);
dfee3a7b9   Jason Wessel   debug_core: refac...
648
  	raw_spin_unlock(&dbg_master_lock);
16cdc628c   Jason Wessel   debug_core: move ...
649
  	dbg_touch_watchdogs();
dc7d55270   Jason Wessel   kgdb: core
650
  	local_irq_restore(flags);
dcc787112   Jason Wessel   kgdb: core change...
651
  	return kgdb_info[cpu].ret_state;
dc7d55270   Jason Wessel   kgdb: core
652
  }
62fae3121   Jason Wessel   kgdb: eliminate k...
653
654
655
656
657
658
659
660
661
662
663
664
  /*
   * 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;
62fae3121   Jason Wessel   kgdb: eliminate k...
665
666
667
668
  
  	ks->cpu			= raw_smp_processor_id();
  	ks->ex_vector		= evector;
  	ks->signo		= signo;
62fae3121   Jason Wessel   kgdb: eliminate k...
669
670
671
672
673
674
  	ks->err_code		= ecode;
  	ks->kgdb_usethreadid	= 0;
  	ks->linux_regs		= regs;
  
  	if (kgdb_reenter_check(ks))
  		return 0; /* Ouch, double exception ! */
dfee3a7b9   Jason Wessel   debug_core: refac...
675
676
677
678
  	if (kgdb_info[ks->cpu].enter_kgdb != 0)
  		return 0;
  
  	return kgdb_cpu_enter(ks, regs, DCPU_WANT_MASTER);
62fae3121   Jason Wessel   kgdb: eliminate k...
679
  }
dc7d55270   Jason Wessel   kgdb: core
680
681
682
  int kgdb_nmicallback(int cpu, void *regs)
  {
  #ifdef CONFIG_SMP
62fae3121   Jason Wessel   kgdb: eliminate k...
683
684
685
686
687
688
  	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...
689
690
691
  	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
692
693
694
695
696
  		return 0;
  	}
  #endif
  	return 1;
  }
aabdc3b8c   Jason Wessel   kgdb: sparse fix
697
698
  static void kgdb_console_write(struct console *co, const char *s,
     unsigned count)
dc7d55270   Jason Wessel   kgdb: core
699
700
701
702
703
  {
  	unsigned long flags;
  
  	/* If we're debugging, or KGDB has not connected, don't try
  	 * and print. */
dcc787112   Jason Wessel   kgdb: core change...
704
  	if (!kgdb_connected || atomic_read(&kgdb_active) != -1 || dbg_kdb_mode)
dc7d55270   Jason Wessel   kgdb: core
705
706
707
  		return;
  
  	local_irq_save(flags);
53197fc49   Jason Wessel   Separate the gdbs...
708
  	gdbstub_msg_write(s, count);
dc7d55270   Jason Wessel   kgdb: core
709
710
711
712
713
714
715
716
717
718
719
  	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...
720
  static void sysrq_handle_dbg(int key)
dc7d55270   Jason Wessel   kgdb: core
721
  {
53197fc49   Jason Wessel   Separate the gdbs...
722
  	if (!dbg_io_ops) {
dc7d55270   Jason Wessel   kgdb: core
723
724
725
726
  		printk(KERN_CRIT "ERROR: No KGDB I/O module available
  ");
  		return;
  	}
dcc787112   Jason Wessel   kgdb: core change...
727
728
729
730
731
732
  	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
733
734
  		printk(KERN_CRIT "Entering KGDB
  ");
dcc787112   Jason Wessel   kgdb: core change...
735
736
  #endif
  	}
dc7d55270   Jason Wessel   kgdb: core
737
738
739
  
  	kgdb_breakpoint();
  }
53197fc49   Jason Wessel   Separate the gdbs...
740
741
  static struct sysrq_key_op sysrq_dbg_op = {
  	.handler	= sysrq_handle_dbg,
364b5b7b1   Jason Wessel   sysrq, intel_fb: ...
742
743
  	.help_msg	= "debug(G)",
  	.action_msg	= "DEBUG",
dc7d55270   Jason Wessel   kgdb: core
744
745
  };
  #endif
4402c153c   Jason Wessel   kdb,debug_core: A...
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
  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: ...
761
762
763
764
765
766
767
768
769
770
771
  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);
  }
dc7d55270   Jason Wessel   kgdb: core
772
773
774
775
776
  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: ...
777
778
  		if (!dbg_is_early)
  			kgdb_arch_late();
4402c153c   Jason Wessel   kdb,debug_core: A...
779
780
  		atomic_notifier_chain_register(&panic_notifier_list,
  					       &kgdb_panic_event_nb);
dc7d55270   Jason Wessel   kgdb: core
781
  #ifdef CONFIG_MAGIC_SYSRQ
53197fc49   Jason Wessel   Separate the gdbs...
782
  		register_sysrq_key('g', &sysrq_dbg_op);
dc7d55270   Jason Wessel   kgdb: core
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
  #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;
4402c153c   Jason Wessel   kdb,debug_core: A...
800
801
  		atomic_notifier_chain_unregister(&panic_notifier_list,
  					       &kgdb_panic_event_nb);
dc7d55270   Jason Wessel   kgdb: core
802
803
  		kgdb_arch_exit();
  #ifdef CONFIG_MAGIC_SYSRQ
53197fc49   Jason Wessel   Separate the gdbs...
804
  		unregister_sysrq_key('g', &sysrq_dbg_op);
dc7d55270   Jason Wessel   kgdb: core
805
806
807
808
809
810
811
  #endif
  		if (kgdb_con_registered) {
  			unregister_console(&kgdbcons);
  			kgdb_con_registered = 0;
  		}
  	}
  }
1cee5e35f   Jason Wessel   kgdb: Add the abi...
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
  /*
   * 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
836
837
838
839
840
841
842
843
844
845
  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...
846
   *	kgdb_register_io_module - register KGDB IO module
53197fc49   Jason Wessel   Separate the gdbs...
847
   *	@new_dbg_io_ops: the io ops vector
dc7d55270   Jason Wessel   kgdb: core
848
849
850
   *
   *	Register it with the KGDB core.
   */
53197fc49   Jason Wessel   Separate the gdbs...
851
  int kgdb_register_io_module(struct kgdb_io *new_dbg_io_ops)
dc7d55270   Jason Wessel   kgdb: core
852
853
854
855
  {
  	int err;
  
  	spin_lock(&kgdb_registration_lock);
53197fc49   Jason Wessel   Separate the gdbs...
856
  	if (dbg_io_ops) {
dc7d55270   Jason Wessel   kgdb: core
857
858
859
860
861
862
863
  		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...
864
865
  	if (new_dbg_io_ops->init) {
  		err = new_dbg_io_ops->init();
dc7d55270   Jason Wessel   kgdb: core
866
867
868
869
870
  		if (err) {
  			spin_unlock(&kgdb_registration_lock);
  			return err;
  		}
  	}
53197fc49   Jason Wessel   Separate the gdbs...
871
  	dbg_io_ops = new_dbg_io_ops;
dc7d55270   Jason Wessel   kgdb: core
872
873
874
875
876
  
  	spin_unlock(&kgdb_registration_lock);
  
  	printk(KERN_INFO "kgdb: Registered I/O driver %s.
  ",
53197fc49   Jason Wessel   Separate the gdbs...
877
  	       new_dbg_io_ops->name);
dc7d55270   Jason Wessel   kgdb: core
878
879
880
881
882
883
884
885
886
887
888
889
890
  
  	/* 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...
891
   *	@old_dbg_io_ops: the io ops vector
dc7d55270   Jason Wessel   kgdb: core
892
893
894
   *
   *	Unregister it with the KGDB core.
   */
53197fc49   Jason Wessel   Separate the gdbs...
895
  void kgdb_unregister_io_module(struct kgdb_io *old_dbg_io_ops)
dc7d55270   Jason Wessel   kgdb: core
896
897
898
899
900
901
902
903
904
905
  {
  	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...
906
907
  	WARN_ON_ONCE(dbg_io_ops != old_dbg_io_ops);
  	dbg_io_ops = NULL;
dc7d55270   Jason Wessel   kgdb: core
908
909
910
911
912
913
  
  	spin_unlock(&kgdb_registration_lock);
  
  	printk(KERN_INFO
  		"kgdb: Unregistered I/O driver %s, debugger disabled.
  ",
53197fc49   Jason Wessel   Separate the gdbs...
914
  		old_dbg_io_ops->name);
dc7d55270   Jason Wessel   kgdb: core
915
916
  }
  EXPORT_SYMBOL_GPL(kgdb_unregister_io_module);
dcc787112   Jason Wessel   kgdb: core change...
917
918
919
  int dbg_io_get_char(void)
  {
  	int ret = dbg_io_ops->read_char();
f5316b4ae   Jason Wessel   kgdb,8250,pl011: ...
920
921
  	if (ret == NO_POLL_CHAR)
  		return -1;
dcc787112   Jason Wessel   kgdb: core change...
922
923
924
925
926
927
  	if (!dbg_kdb_mode)
  		return ret;
  	if (ret == 127)
  		return 8;
  	return ret;
  }
dc7d55270   Jason Wessel   kgdb: core
928
929
930
931
932
933
934
935
936
937
  /**
   * 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.
   */
  void kgdb_breakpoint(void)
  {
ae6bf53e0   Jason Wessel   kgdb: use atomic_...
938
  	atomic_inc(&kgdb_setting_breakpoint);
dc7d55270   Jason Wessel   kgdb: core
939
940
941
  	wmb(); /* Sync point before breakpoint */
  	arch_kgdb_breakpoint();
  	wmb(); /* Sync point after breakpoint */
ae6bf53e0   Jason Wessel   kgdb: use atomic_...
942
  	atomic_dec(&kgdb_setting_breakpoint);
dc7d55270   Jason Wessel   kgdb: core
943
944
945
946
947
948
  }
  EXPORT_SYMBOL_GPL(kgdb_breakpoint);
  
  static int __init opt_kgdb_wait(char *str)
  {
  	kgdb_break_asap = 1;
dcc787112   Jason Wessel   kgdb: core change...
949
  	kdb_init(KDB_INIT_EARLY);
dc7d55270   Jason Wessel   kgdb: core
950
951
952
953
954
955
956
  	if (kgdb_io_module_registered)
  		kgdb_initial_breakpoint();
  
  	return 0;
  }
  
  early_param("kgdbwait", opt_kgdb_wait);