summaryrefslogtreecommitdiffstats
path: root/target
diff options
context:
space:
mode:
authorPaolo Bonzini2021-03-01 12:02:44 +0100
committerPaolo Bonzini2021-03-06 11:41:54 +0100
commitc6986f16a7022ccfb73d91bc7676c8e1d15e5342 (patch)
tree315d164b674c90d94ceaaf55b7753a91e37a667d /target
parentvirtiofs: drop remapped security.capability xattr as needed (diff)
downloadqemu-c6986f16a7022ccfb73d91bc7676c8e1d15e5342.tar.gz
qemu-c6986f16a7022ccfb73d91bc7676c8e1d15e5342.tar.xz
qemu-c6986f16a7022ccfb73d91bc7676c8e1d15e5342.zip
KVM: x86: do not fail if software breakpoint has already been removed
If kvm_arch_remove_sw_breakpoint finds that a software breakpoint does not have an INT3 instruction, it fails. This can happen if one sets a software breakpoint in a kernel module and then reloads it. gdb then thinks the breakpoint cannot be deleted and there is no way to add it back. Suggested-by: Maxim Levitsky <mlevitsk@redhat.com> Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'target')
-rw-r--r--target/i386/kvm/kvm.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
index 0b5755e42b..c8d61daf68 100644
--- a/target/i386/kvm/kvm.c
+++ b/target/i386/kvm/kvm.c
@@ -4352,8 +4352,13 @@ int kvm_arch_remove_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp)
{
uint8_t int3;
- if (cpu_memory_rw_debug(cs, bp->pc, &int3, 1, 0) || int3 != 0xcc ||
- cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, 1, 1)) {
+ if (cpu_memory_rw_debug(cs, bp->pc, &int3, 1, 0)) {
+ return -EINVAL;
+ }
+ if (int3 != 0xcc) {
+ return 0;
+ }
+ if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, 1, 1)) {
return -EINVAL;
}
return 0;