Commit 10a6e676 authored by Jason Wessel's avatar Jason Wessel

kgdb,x86: fix regression in detach handling

The fix from ba773f7c
(x86,kgdb: Fix hw breakpoint regression) was not entirely complete.

The kgdb_remove_all_hw_break() function also needs to call the
hw_break_release_slot() or else a breakpoint can get activated again
after the debugger has detached.

The kgdb test suite exposes the behavior in the form of either a hang
or repetitive failure.  The kernel config that exposes the problem
contains all of the following:

CONFIG_DEBUG_RODATA=y
CONFIG_KGDB_TESTS=y
CONFIG_KGDB_TESTS_ON_BOOT=y
CONFIG_KGDB_TESTS_BOOT_STRING="V1F100"
Reported-by: default avatarFrederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: default avatarJason Wessel <jason.wessel@windriver.com>
Tested-by: default avatarFrederic Weisbecker <fweisbec@gmail.com>
parent 5450d904
...@@ -315,14 +315,18 @@ static void kgdb_remove_all_hw_break(void) ...@@ -315,14 +315,18 @@ static void kgdb_remove_all_hw_break(void)
if (!breakinfo[i].enabled) if (!breakinfo[i].enabled)
continue; continue;
bp = *per_cpu_ptr(breakinfo[i].pev, cpu); bp = *per_cpu_ptr(breakinfo[i].pev, cpu);
if (bp->attr.disabled == 1) if (!bp->attr.disabled) {
arch_uninstall_hw_breakpoint(bp);
bp->attr.disabled = 1;
continue; continue;
}
if (dbg_is_early) if (dbg_is_early)
early_dr7 &= ~encode_dr7(i, breakinfo[i].len, early_dr7 &= ~encode_dr7(i, breakinfo[i].len,
breakinfo[i].type); breakinfo[i].type);
else else if (hw_break_release_slot(i))
arch_uninstall_hw_breakpoint(bp); printk(KERN_ERR "KGDB: hw bpt remove failed %lx\n",
bp->attr.disabled = 1; breakinfo[i].addr);
breakinfo[i].enabled = 0;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment