Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 196350
b: refs/heads/master
c: 1cee5e3
h: refs/heads/master
v: v3
  • Loading branch information
Jason Wessel committed May 21, 2010
1 parent 8676dd2 commit 31cbcd4
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 5dd11d5d47d248850c58292513f0e164ba98b01e
refs/heads/master: 1cee5e35f15d0893be1ba944f1aec8676e43ab76
1 change: 1 addition & 0 deletions trunk/include/linux/kgdb.h
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,7 @@ extern int kgdb_mem2hex(char *mem, char *buf, int count);
extern int kgdb_hex2mem(char *buf, char *mem, int count);

extern int kgdb_isremovedbreak(unsigned long addr);
extern void kgdb_schedule_breakpoint(void);

extern int
kgdb_handle_exception(int ex_vector, int signo, int err_code,
Expand Down
26 changes: 26 additions & 0 deletions trunk/kernel/debug/debug_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ EXPORT_SYMBOL_GPL(kgdb_active);
*/
static atomic_t passive_cpu_wait[NR_CPUS];
static atomic_t cpu_in_kgdb[NR_CPUS];
static atomic_t kgdb_break_tasklet_var;
atomic_t kgdb_setting_breakpoint;

struct task_struct *kgdb_usethread;
Expand Down Expand Up @@ -789,6 +790,31 @@ static void kgdb_unregister_callbacks(void)
}
}

/*
* 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);

static void kgdb_initial_breakpoint(void)
{
kgdb_break_asap = 0;
Expand Down

0 comments on commit 31cbcd4

Please sign in to comment.