From patchwork Mon Mar 16 18:48:23 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kiszka X-Patchwork-Id: 12459 Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n2GInChP024424 for ; Mon, 16 Mar 2009 18:49:12 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755246AbZCPSsn (ORCPT ); Mon, 16 Mar 2009 14:48:43 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1754265AbZCPSsn (ORCPT ); Mon, 16 Mar 2009 14:48:43 -0400 Received: from lizzard.sbs.de ([194.138.37.39]:18385 "EHLO lizzard.sbs.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752135AbZCPSsm (ORCPT ); Mon, 16 Mar 2009 14:48:42 -0400 Received: from mail1.sbs.de (localhost [127.0.0.1]) by lizzard.sbs.de (8.12.11.20060308/8.12.11) with ESMTP id n2GImOMk020018; Mon, 16 Mar 2009 19:48:24 +0100 Received: from [139.25.109.167] (mchn012c.ww002.siemens.net [139.25.109.167] (may be forged)) by mail1.sbs.de (8.12.11.20060308/8.12.11) with ESMTP id n2GImNFs007679; Mon, 16 Mar 2009 19:48:24 +0100 Message-ID: <49BE9EF7.7010005@siemens.com> Date: Mon, 16 Mar 2009 19:48:23 +0100 From: Jan Kiszka User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); de; rv:1.8.1.12) Gecko/20080226 SUSE/2.0.0.12-1.1 Thunderbird/2.0.0.12 Mnenhy/0.7.5.666 MIME-Version: 1.0 To: Avi Kivity CC: kvm-devel Subject: [PATCH] kvm-userspace: x86: Support for breakpoints in ROM code Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Align qemu-kvm-x86 with upstream kvm support /wrt software breakpoint support in ROM code. Signed-off-by: Jan Kiszka --- qemu/qemu-kvm-x86.c | 29 ++++++++++++++++++++++++----- 1 files changed, 24 insertions(+), 5 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/qemu/qemu-kvm-x86.c b/qemu/qemu-kvm-x86.c index 06ef775..05a9c4c 100644 --- a/qemu/qemu-kvm-x86.c +++ b/qemu/qemu-kvm-x86.c @@ -680,12 +680,32 @@ void kvm_arch_cpu_reset(CPUState *env) } } -int kvm_arch_insert_sw_breakpoint(CPUState *env, struct kvm_sw_breakpoint *bp) +#ifdef KVM_CAP_SET_GUEST_DEBUG +static int kvm_patch_opcode_byte(CPUState *env, target_ulong addr, uint8_t val) { - uint8_t int3 = 0xcc; + target_phys_addr_t phys_page_addr; + unsigned long pd; + uint8_t *ptr; + + phys_page_addr = cpu_get_phys_page_debug(env, addr & TARGET_PAGE_MASK); + if (phys_page_addr == -1) + return -EINVAL; + + pd = cpu_get_physical_page_desc(phys_page_addr); + if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM && + (pd & ~TARGET_PAGE_MASK) != IO_MEM_ROM && !(pd & IO_MEM_ROMD)) + return -EINVAL; + ptr = phys_ram_base + (pd & TARGET_PAGE_MASK) + + (addr & ~TARGET_PAGE_MASK); + *ptr = val; + return 0; +} + +int kvm_arch_insert_sw_breakpoint(CPUState *env, struct kvm_sw_breakpoint *bp) +{ if (cpu_memory_rw_debug(env, bp->pc, (uint8_t *)&bp->saved_insn, 1, 0) || - cpu_memory_rw_debug(env, bp->pc, &int3, 1, 1)) + kvm_patch_opcode_byte(env, bp->pc, 0xcc)) return -EINVAL; return 0; } @@ -695,12 +715,11 @@ int kvm_arch_remove_sw_breakpoint(CPUState *env, struct kvm_sw_breakpoint *bp) uint8_t int3; if (cpu_memory_rw_debug(env, bp->pc, &int3, 1, 0) || int3 != 0xcc || - cpu_memory_rw_debug(env, bp->pc, (uint8_t *)&bp->saved_insn, 1, 1)) + kvm_patch_opcode_byte(env, bp->pc, bp->saved_insn)) return -EINVAL; return 0; } -#ifdef KVM_CAP_SET_GUEST_DEBUG static struct { target_ulong addr; int len;