diff options
author | Jason Wessel <jason.wessel@windriver.com> | 2008-09-26 11:36:41 -0400 |
---|---|---|
committer | Jason Wessel <jason.wessel@windriver.com> | 2008-09-26 11:36:41 -0400 |
commit | d7161a65341556bacb5e6654e133803f46f51063 (patch) | |
tree | b2933dc2ce1435956c193c37fd53a3d5530fe9d7 /kernel/kgdb.c | |
parent | 18d6522b86d21a04c8ac1ea79747e2e434a956d9 (diff) |
kgdb, x86, arm, mips, powerpc: ignore user space single stepping
On the x86 arch, user space single step exceptions should be ignored
if they occur in the kernel space, such as ptrace stepping through a
system call.
First check if it is kgdb that is executing a single step, then ensure
it is not an accidental traversal into the user space, while in kgdb,
any other time the TIF_SINGLESTEP is set, kgdb should ignore the
exception.
On x86, arm, mips and powerpc, the kgdb_contthread usage was
inconsistent with the way single stepping is implemented in the kgdb
core. The arch specific stub should always set the
kgdb_cpu_doing_single_step correctly if it is single stepping. This
allows kgdb to correctly process an instruction steps if ptrace
happens to be requesting an instruction step over a system call.
Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
Diffstat (limited to 'kernel/kgdb.c')
-rw-r--r-- | kernel/kgdb.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/kernel/kgdb.c b/kernel/kgdb.c index 949806ab67de..25d955dbb989 100644 --- a/kernel/kgdb.c +++ b/kernel/kgdb.c | |||
@@ -1462,7 +1462,7 @@ acquirelock: | |||
1462 | * Get the passive CPU lock which will hold all the non-primary | 1462 | * Get the passive CPU lock which will hold all the non-primary |
1463 | * CPU in a spin state while the debugger is active | 1463 | * CPU in a spin state while the debugger is active |
1464 | */ | 1464 | */ |
1465 | if (!kgdb_single_step || !kgdb_contthread) { | 1465 | if (!kgdb_single_step) { |
1466 | for (i = 0; i < NR_CPUS; i++) | 1466 | for (i = 0; i < NR_CPUS; i++) |
1467 | atomic_set(&passive_cpu_wait[i], 1); | 1467 | atomic_set(&passive_cpu_wait[i], 1); |
1468 | } | 1468 | } |
@@ -1475,7 +1475,7 @@ acquirelock: | |||
1475 | 1475 | ||
1476 | #ifdef CONFIG_SMP | 1476 | #ifdef CONFIG_SMP |
1477 | /* Signal the other CPUs to enter kgdb_wait() */ | 1477 | /* Signal the other CPUs to enter kgdb_wait() */ |
1478 | if ((!kgdb_single_step || !kgdb_contthread) && kgdb_do_roundup) | 1478 | if ((!kgdb_single_step) && kgdb_do_roundup) |
1479 | kgdb_roundup_cpus(flags); | 1479 | kgdb_roundup_cpus(flags); |
1480 | #endif | 1480 | #endif |
1481 | 1481 | ||
@@ -1494,7 +1494,7 @@ acquirelock: | |||
1494 | kgdb_post_primary_code(ks->linux_regs, ks->ex_vector, ks->err_code); | 1494 | kgdb_post_primary_code(ks->linux_regs, ks->ex_vector, ks->err_code); |
1495 | kgdb_deactivate_sw_breakpoints(); | 1495 | kgdb_deactivate_sw_breakpoints(); |
1496 | kgdb_single_step = 0; | 1496 | kgdb_single_step = 0; |
1497 | kgdb_contthread = NULL; | 1497 | kgdb_contthread = current; |
1498 | exception_level = 0; | 1498 | exception_level = 0; |
1499 | 1499 | ||
1500 | /* Talk to debugger with gdbserial protocol */ | 1500 | /* Talk to debugger with gdbserial protocol */ |
@@ -1508,7 +1508,7 @@ acquirelock: | |||
1508 | kgdb_info[ks->cpu].task = NULL; | 1508 | kgdb_info[ks->cpu].task = NULL; |
1509 | atomic_set(&cpu_in_kgdb[ks->cpu], 0); | 1509 | atomic_set(&cpu_in_kgdb[ks->cpu], 0); |
1510 | 1510 | ||
1511 | if (!kgdb_single_step || !kgdb_contthread) { | 1511 | if (!kgdb_single_step) { |
1512 | for (i = NR_CPUS-1; i >= 0; i--) | 1512 | for (i = NR_CPUS-1; i >= 0; i--) |
1513 | atomic_set(&passive_cpu_wait[i], 0); | 1513 | atomic_set(&passive_cpu_wait[i], 0); |
1514 | /* | 1514 | /* |