From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752414AbbEFQXi (ORCPT ); Wed, 6 May 2015 12:23:38 -0400 Received: from static.88-198-71-155.clients.your-server.de ([88.198.71.155]:35252 "EHLO socrates.bennee.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751438AbbEFQXd (ORCPT ); Wed, 6 May 2015 12:23:33 -0400 From: =?UTF-8?q?Alex=20Benn=C3=A9e?= To: kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu, christoffer.dall@linaro.org, marc.zyngier@arm.com, peter.maydell@linaro.org, agraf@suse.de, drjones@redhat.com, pbonzini@redhat.com, zhichao.huang@linaro.org Cc: jan.kiszka@siemens.com, dahi@linux.vnet.ibm.com, r65777@freescale.com, bp@suse.de, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Gleb Natapov , Jonathan Corbet , Russell King , Catalin Marinas , Will Deacon , linux-doc@vger.kernel.org (open list:DOCUMENTATION), linux-kernel@vger.kernel.org (open list) Subject: [PATCH v3 06/12] KVM: arm64: guest debug, add SW break point support Date: Wed, 6 May 2015 17:23:21 +0100 Message-Id: <1430929407-3487-7-git-send-email-alex.bennee@linaro.org> X-Mailer: git-send-email 2.3.5 In-Reply-To: <1430929407-3487-1-git-send-email-alex.bennee@linaro.org> References: <1430929407-3487-1-git-send-email-alex.bennee@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-SA-Exim-Connect-IP: 127.0.0.1 X-SA-Exim-Mail-From: alex.bennee@linaro.org X-SA-Exim-Scanned: No (on socrates.bennee.com); SAEximRunCond expanded to false Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This adds support for SW breakpoints inserted by userspace. We do this by trapping all guest software debug exceptions to the hypervisor (MDCR_EL2.TDE). The exit handler sets an exit reason of KVM_EXIT_DEBUG with the kvm_debug_exit_arch structure holding the exception syndrome information. It will be up to userspace to extract the PC (via GET_ONE_REG) and determine if the debug event was for a breakpoint it inserted. If not userspace will need to re-inject the correct exception restart the hypervisor to deliver the debug exception to the guest. Any other guest software debug exception (e.g. single step or HW assisted breakpoints) will cause an error and the VM to be killed. This is addressed by later patches which add support for the other debug types. Signed-off-by: Alex Bennée --- v2 - update to use new exit struct - tweak for C setup - do our setup in debug_setup/clear code - fixed up comments v3: - fix spacing in KVM_GUESTDBG_VALID_MASK - fix and clarify wording on kvm_handle_guest_debug - handle error case in kvm_handle_guest_debug - re-word the commit message diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt index 4b0132f..5ef937c 100644 --- a/Documentation/virtual/kvm/api.txt +++ b/Documentation/virtual/kvm/api.txt @@ -2667,7 +2667,7 @@ when running. Common control bits are: The top 16 bits of the control field are architecture specific control flags which can include the following: - - KVM_GUESTDBG_USE_SW_BP: using software breakpoints [x86] + - KVM_GUESTDBG_USE_SW_BP: using software breakpoints [x86, arm64] - KVM_GUESTDBG_USE_HW_BP: using hardware breakpoints [x86, s390] - KVM_GUESTDBG_INJECT_DB: inject DB type exception [x86] - KVM_GUESTDBG_INJECT_BP: inject BP type exception [x86] diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c index 4a274e1..064c105 100644 --- a/arch/arm/kvm/arm.c +++ b/arch/arm/kvm/arm.c @@ -302,7 +302,7 @@ void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu) kvm_arm_set_running_vcpu(NULL); } -#define KVM_GUESTDBG_VALID_MASK (KVM_GUESTDBG_ENABLE) +#define KVM_GUESTDBG_VALID_MASK (KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_USE_SW_BP) /** * kvm_arch_vcpu_ioctl_set_guest_debug - set up guest debugging diff --git a/arch/arm64/kvm/debug.c b/arch/arm64/kvm/debug.c index b1f8731..5bee676 100644 --- a/arch/arm64/kvm/debug.c +++ b/arch/arm64/kvm/debug.c @@ -75,6 +75,12 @@ void kvm_arm_setup_debug(struct kvm_vcpu *vcpu) else vcpu->arch.mdcr_el2 &= ~MDCR_EL2_TDA; + /* Trap breakpoints? */ + if (vcpu->guest_debug & KVM_GUESTDBG_USE_SW_BP) + vcpu->arch.mdcr_el2 |= MDCR_EL2_TDE; + else + vcpu->arch.mdcr_el2 &= ~MDCR_EL2_TDE; + } void kvm_arm_clear_debug(struct kvm_vcpu *vcpu) diff --git a/arch/arm64/kvm/handle_exit.c b/arch/arm64/kvm/handle_exit.c index 524fa25..27f38a9 100644 --- a/arch/arm64/kvm/handle_exit.c +++ b/arch/arm64/kvm/handle_exit.c @@ -82,6 +82,40 @@ static int kvm_handle_wfx(struct kvm_vcpu *vcpu, struct kvm_run *run) return 1; } +/** + * kvm_handle_guest_debug - handle a debug exception instruction + * + * @vcpu: the vcpu pointer + * @run: access to the kvm_run structure for results + * + * We route all debug exceptions through the same handler. If both the + * guest and host are using the same debug facilities it will be up to + * userspace to re-inject the correct exception for guest delivery. + * + * @return: 0 (while setting run->exit_reason), -1 for error + */ +static int kvm_handle_guest_debug(struct kvm_vcpu *vcpu, struct kvm_run *run) +{ + u32 hsr = kvm_vcpu_get_hsr(vcpu); + int ret = 0; + + run->exit_reason = KVM_EXIT_DEBUG; + run->debug.arch.hsr = hsr; + + switch (hsr >> ESR_ELx_EC_SHIFT) { + case ESR_ELx_EC_BKPT32: + case ESR_ELx_EC_BRK64: + break; + default: + kvm_err("%s: un-handled case hsr: %#08x\n", + __func__, (unsigned int) hsr); + ret = -1; + break; + } + + return ret; +} + static exit_handle_fn arm_exit_handlers[] = { [ESR_ELx_EC_WFx] = kvm_handle_wfx, [ESR_ELx_EC_CP15_32] = kvm_handle_cp15_32, @@ -96,6 +130,8 @@ static exit_handle_fn arm_exit_handlers[] = { [ESR_ELx_EC_SYS64] = kvm_handle_sys_reg, [ESR_ELx_EC_IABT_LOW] = kvm_handle_guest_abort, [ESR_ELx_EC_DABT_LOW] = kvm_handle_guest_abort, + [ESR_ELx_EC_BKPT32] = kvm_handle_guest_debug, + [ESR_ELx_EC_BRK64] = kvm_handle_guest_debug, }; static exit_handle_fn kvm_get_exit_handler(struct kvm_vcpu *vcpu) -- 2.3.5 From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?q?Alex=20Benn=C3=A9e?= Subject: [PATCH v3 06/12] KVM: arm64: guest debug, add SW break point support Date: Wed, 6 May 2015 17:23:21 +0100 Message-ID: <1430929407-3487-7-git-send-email-alex.bennee@linaro.org> References: <1430929407-3487-1-git-send-email-alex.bennee@linaro.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Cc: Russell King , Jonathan Corbet , Gleb Natapov , jan.kiszka@siemens.com, "open list:DOCUMENTATION" , Will Deacon , open list , dahi@linux.vnet.ibm.com, Catalin Marinas , r65777@freescale.com, bp@suse.de To: kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu, christoffer.dall@linaro.org, marc.zyngier@arm.com, peter.maydell@linaro.org, agraf@suse.de, drjones@redhat.com, pbonzini@redhat.com, zhichao.huang@linaro.org Return-path: In-Reply-To: <1430929407-3487-1-git-send-email-alex.bennee@linaro.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kvmarm-bounces@lists.cs.columbia.edu Sender: kvmarm-bounces@lists.cs.columbia.edu List-Id: kvm.vger.kernel.org VGhpcyBhZGRzIHN1cHBvcnQgZm9yIFNXIGJyZWFrcG9pbnRzIGluc2VydGVkIGJ5IHVzZXJzcGFj ZS4KCldlIGRvIHRoaXMgYnkgdHJhcHBpbmcgYWxsIGd1ZXN0IHNvZnR3YXJlIGRlYnVnIGV4Y2Vw dGlvbnMgdG8gdGhlCmh5cGVydmlzb3IgKE1EQ1JfRUwyLlRERSkuIFRoZSBleGl0IGhhbmRsZXIg c2V0cyBhbiBleGl0IHJlYXNvbiBvZgpLVk1fRVhJVF9ERUJVRyB3aXRoIHRoZSBrdm1fZGVidWdf ZXhpdF9hcmNoIHN0cnVjdHVyZSBob2xkaW5nIHRoZQpleGNlcHRpb24gc3luZHJvbWUgaW5mb3Jt YXRpb24uCgpJdCB3aWxsIGJlIHVwIHRvIHVzZXJzcGFjZSB0byBleHRyYWN0IHRoZSBQQyAodmlh IEdFVF9PTkVfUkVHKSBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBkZWJ1ZyBldmVudCB3YXMgZm9yIGEg YnJlYWtwb2ludCBpdCBpbnNlcnRlZC4gSWYgbm90CnVzZXJzcGFjZSB3aWxsIG5lZWQgdG8gcmUt aW5qZWN0IHRoZSBjb3JyZWN0IGV4Y2VwdGlvbiByZXN0YXJ0IHRoZQpoeXBlcnZpc29yIHRvIGRl bGl2ZXIgdGhlIGRlYnVnIGV4Y2VwdGlvbiB0byB0aGUgZ3Vlc3QuCgpBbnkgb3RoZXIgZ3Vlc3Qg c29mdHdhcmUgZGVidWcgZXhjZXB0aW9uIChlLmcuIHNpbmdsZSBzdGVwIG9yIEhXCmFzc2lzdGVk IGJyZWFrcG9pbnRzKSB3aWxsIGNhdXNlIGFuIGVycm9yIGFuZCB0aGUgVk0gdG8gYmUga2lsbGVk LiBUaGlzCmlzIGFkZHJlc3NlZCBieSBsYXRlciBwYXRjaGVzIHdoaWNoIGFkZCBzdXBwb3J0IGZv ciB0aGUgb3RoZXIgZGVidWcKdHlwZXMuCgpTaWduZWQtb2ZmLWJ5OiBBbGV4IEJlbm7DqWUgPGFs ZXguYmVubmVlQGxpbmFyby5vcmc+CgotLS0KdjIKICAtIHVwZGF0ZSB0byB1c2UgbmV3IGV4aXQg c3RydWN0CiAgLSB0d2VhayBmb3IgQyBzZXR1cAogIC0gZG8gb3VyIHNldHVwIGluIGRlYnVnX3Nl dHVwL2NsZWFyIGNvZGUKICAtIGZpeGVkIHVwIGNvbW1lbnRzCnYzOgogIC0gZml4IHNwYWNpbmcg aW4gS1ZNX0dVRVNUREJHX1ZBTElEX01BU0sKICAtIGZpeCBhbmQgY2xhcmlmeSB3b3JkaW5nIG9u IGt2bV9oYW5kbGVfZ3Vlc3RfZGVidWcKICAtIGhhbmRsZSBlcnJvciBjYXNlIGluIGt2bV9oYW5k bGVfZ3Vlc3RfZGVidWcKICAtIHJlLXdvcmQgdGhlIGNvbW1pdCBtZXNzYWdlCgpkaWZmIC0tZ2l0 IGEvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9hcGkudHh0IGIvRG9jdW1lbnRhdGlvbi92aXJ0 dWFsL2t2bS9hcGkudHh0CmluZGV4IDRiMDEzMmYuLjVlZjkzN2MgMTAwNjQ0Ci0tLSBhL0RvY3Vt ZW50YXRpb24vdmlydHVhbC9rdm0vYXBpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwv a3ZtL2FwaS50eHQKQEAgLTI2NjcsNyArMjY2Nyw3IEBAIHdoZW4gcnVubmluZy4gQ29tbW9uIGNv bnRyb2wgYml0cyBhcmU6CiBUaGUgdG9wIDE2IGJpdHMgb2YgdGhlIGNvbnRyb2wgZmllbGQgYXJl IGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBjb250cm9sCiBmbGFncyB3aGljaCBjYW4gaW5jbHVkZSB0 aGUgZm9sbG93aW5nOgogCi0gIC0gS1ZNX0dVRVNUREJHX1VTRV9TV19CUDogICAgIHVzaW5nIHNv ZnR3YXJlIGJyZWFrcG9pbnRzIFt4ODZdCisgIC0gS1ZNX0dVRVNUREJHX1VTRV9TV19CUDogICAg IHVzaW5nIHNvZnR3YXJlIGJyZWFrcG9pbnRzIFt4ODYsIGFybTY0XQogICAtIEtWTV9HVUVTVERC R19VU0VfSFdfQlA6ICAgICB1c2luZyBoYXJkd2FyZSBicmVha3BvaW50cyBbeDg2LCBzMzkwXQog ICAtIEtWTV9HVUVTVERCR19JTkpFQ1RfREI6ICAgICBpbmplY3QgREIgdHlwZSBleGNlcHRpb24g W3g4Nl0KICAgLSBLVk1fR1VFU1REQkdfSU5KRUNUX0JQOiAgICAgaW5qZWN0IEJQIHR5cGUgZXhj ZXB0aW9uIFt4ODZdCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rdm0vYXJtLmMgYi9hcmNoL2FybS9r dm0vYXJtLmMKaW5kZXggNGEyNzRlMS4uMDY0YzEwNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va3Zt L2FybS5jCisrKyBiL2FyY2gvYXJtL2t2bS9hcm0uYwpAQCAtMzAyLDcgKzMwMiw3IEBAIHZvaWQg a3ZtX2FyY2hfdmNwdV9wdXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogCWt2bV9hcm1fc2V0X3J1 bm5pbmdfdmNwdShOVUxMKTsKIH0KIAotI2RlZmluZSBLVk1fR1VFU1REQkdfVkFMSURfTUFTSyAo S1ZNX0dVRVNUREJHX0VOQUJMRSkKKyNkZWZpbmUgS1ZNX0dVRVNUREJHX1ZBTElEX01BU0sgKEtW TV9HVUVTVERCR19FTkFCTEUgfCBLVk1fR1VFU1REQkdfVVNFX1NXX0JQKQogCiAvKioKICAqIGt2 bV9hcmNoX3ZjcHVfaW9jdGxfc2V0X2d1ZXN0X2RlYnVnIC0gc2V0IHVwIGd1ZXN0IGRlYnVnZ2lu ZwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rdm0vZGVidWcuYyBiL2FyY2gvYXJtNjQva3ZtL2Rl YnVnLmMKaW5kZXggYjFmODczMS4uNWJlZTY3NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rdm0v ZGVidWcuYworKysgYi9hcmNoL2FybTY0L2t2bS9kZWJ1Zy5jCkBAIC03NSw2ICs3NSwxMiBAQCB2 b2lkIGt2bV9hcm1fc2V0dXBfZGVidWcoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogCWVsc2UKIAkJ dmNwdS0+YXJjaC5tZGNyX2VsMiAmPSB+TURDUl9FTDJfVERBOwogCisJLyogVHJhcCBicmVha3Bv aW50cz8gKi8KKwlpZiAodmNwdS0+Z3Vlc3RfZGVidWcgJiBLVk1fR1VFU1REQkdfVVNFX1NXX0JQ KQorCQl2Y3B1LT5hcmNoLm1kY3JfZWwyIHw9IE1EQ1JfRUwyX1RERTsKKwllbHNlCisJCXZjcHUt PmFyY2gubWRjcl9lbDIgJj0gfk1EQ1JfRUwyX1RERTsKKwogfQogCiB2b2lkIGt2bV9hcm1fY2xl YXJfZGVidWcoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9r dm0vaGFuZGxlX2V4aXQuYyBiL2FyY2gvYXJtNjQva3ZtL2hhbmRsZV9leGl0LmMKaW5kZXggNTI0 ZmEyNS4uMjdmMzhhOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rdm0vaGFuZGxlX2V4aXQuYwor KysgYi9hcmNoL2FybTY0L2t2bS9oYW5kbGVfZXhpdC5jCkBAIC04Miw2ICs4Miw0MCBAQCBzdGF0 aWMgaW50IGt2bV9oYW5kbGVfd2Z4KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9y dW4gKnJ1bikKIAlyZXR1cm4gMTsKIH0KIAorLyoqCisgKiBrdm1faGFuZGxlX2d1ZXN0X2RlYnVn IC0gaGFuZGxlIGEgZGVidWcgZXhjZXB0aW9uIGluc3RydWN0aW9uCisgKgorICogQHZjcHU6CXRo ZSB2Y3B1IHBvaW50ZXIKKyAqIEBydW46CWFjY2VzcyB0byB0aGUga3ZtX3J1biBzdHJ1Y3R1cmUg Zm9yIHJlc3VsdHMKKyAqCisgKiBXZSByb3V0ZSBhbGwgZGVidWcgZXhjZXB0aW9ucyB0aHJvdWdo IHRoZSBzYW1lIGhhbmRsZXIuIElmIGJvdGggdGhlCisgKiBndWVzdCBhbmQgaG9zdCBhcmUgdXNp bmcgdGhlIHNhbWUgZGVidWcgZmFjaWxpdGllcyBpdCB3aWxsIGJlIHVwIHRvCisgKiB1c2Vyc3Bh Y2UgdG8gcmUtaW5qZWN0IHRoZSBjb3JyZWN0IGV4Y2VwdGlvbiBmb3IgZ3Vlc3QgZGVsaXZlcnku CisgKgorICogQHJldHVybjogMCAod2hpbGUgc2V0dGluZyBydW4tPmV4aXRfcmVhc29uKSwgLTEg Zm9yIGVycm9yCisgKi8KK3N0YXRpYyBpbnQga3ZtX2hhbmRsZV9ndWVzdF9kZWJ1ZyhzdHJ1Y3Qg a3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICpydW4pCit7CisJdTMyIGhzciA9IGt2bV92 Y3B1X2dldF9oc3IodmNwdSk7CisJaW50IHJldCA9IDA7CisKKwlydW4tPmV4aXRfcmVhc29uID0g S1ZNX0VYSVRfREVCVUc7CisJcnVuLT5kZWJ1Zy5hcmNoLmhzciA9IGhzcjsKKworCXN3aXRjaCAo aHNyID4+IEVTUl9FTHhfRUNfU0hJRlQpIHsKKwljYXNlIEVTUl9FTHhfRUNfQktQVDMyOgorCWNh c2UgRVNSX0VMeF9FQ19CUks2NDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJa3ZtX2VycigiJXM6 IHVuLWhhbmRsZWQgY2FzZSBoc3I6ICUjMDh4XG4iLAorCQkJX19mdW5jX18sICh1bnNpZ25lZCBp bnQpIGhzcik7CisJCXJldCA9IC0xOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQor CiBzdGF0aWMgZXhpdF9oYW5kbGVfZm4gYXJtX2V4aXRfaGFuZGxlcnNbXSA9IHsKIAlbRVNSX0VM eF9FQ19XRnhdCT0ga3ZtX2hhbmRsZV93ZngsCiAJW0VTUl9FTHhfRUNfQ1AxNV8zMl0JPSBrdm1f aGFuZGxlX2NwMTVfMzIsCkBAIC05Niw2ICsxMzAsOCBAQCBzdGF0aWMgZXhpdF9oYW5kbGVfZm4g YXJtX2V4aXRfaGFuZGxlcnNbXSA9IHsKIAlbRVNSX0VMeF9FQ19TWVM2NF0JPSBrdm1faGFuZGxl X3N5c19yZWcsCiAJW0VTUl9FTHhfRUNfSUFCVF9MT1ddCT0ga3ZtX2hhbmRsZV9ndWVzdF9hYm9y dCwKIAlbRVNSX0VMeF9FQ19EQUJUX0xPV10JPSBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0LAorCVtF U1JfRUx4X0VDX0JLUFQzMl0JPSBrdm1faGFuZGxlX2d1ZXN0X2RlYnVnLAorCVtFU1JfRUx4X0VD X0JSSzY0XQk9IGt2bV9oYW5kbGVfZ3Vlc3RfZGVidWcsCiB9OwogCiBzdGF0aWMgZXhpdF9oYW5k bGVfZm4ga3ZtX2dldF9leGl0X2hhbmRsZXIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQotLSAKMi4z LjUKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmt2bWFy bSBtYWlsaW5nIGxpc3QKa3ZtYXJtQGxpc3RzLmNzLmNvbHVtYmlhLmVkdQpodHRwczovL2xpc3Rz LmNzLmNvbHVtYmlhLmVkdS9tYWlsbWFuL2xpc3RpbmZvL2t2bWFybQo= From mboxrd@z Thu Jan 1 00:00:00 1970 From: alex.bennee@linaro.org (=?UTF-8?q?Alex=20Benn=C3=A9e?=) Date: Wed, 6 May 2015 17:23:21 +0100 Subject: [PATCH v3 06/12] KVM: arm64: guest debug, add SW break point support In-Reply-To: <1430929407-3487-1-git-send-email-alex.bennee@linaro.org> References: <1430929407-3487-1-git-send-email-alex.bennee@linaro.org> Message-ID: <1430929407-3487-7-git-send-email-alex.bennee@linaro.org> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org This adds support for SW breakpoints inserted by userspace. We do this by trapping all guest software debug exceptions to the hypervisor (MDCR_EL2.TDE). The exit handler sets an exit reason of KVM_EXIT_DEBUG with the kvm_debug_exit_arch structure holding the exception syndrome information. It will be up to userspace to extract the PC (via GET_ONE_REG) and determine if the debug event was for a breakpoint it inserted. If not userspace will need to re-inject the correct exception restart the hypervisor to deliver the debug exception to the guest. Any other guest software debug exception (e.g. single step or HW assisted breakpoints) will cause an error and the VM to be killed. This is addressed by later patches which add support for the other debug types. Signed-off-by: Alex Benn?e --- v2 - update to use new exit struct - tweak for C setup - do our setup in debug_setup/clear code - fixed up comments v3: - fix spacing in KVM_GUESTDBG_VALID_MASK - fix and clarify wording on kvm_handle_guest_debug - handle error case in kvm_handle_guest_debug - re-word the commit message diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt index 4b0132f..5ef937c 100644 --- a/Documentation/virtual/kvm/api.txt +++ b/Documentation/virtual/kvm/api.txt @@ -2667,7 +2667,7 @@ when running. Common control bits are: The top 16 bits of the control field are architecture specific control flags which can include the following: - - KVM_GUESTDBG_USE_SW_BP: using software breakpoints [x86] + - KVM_GUESTDBG_USE_SW_BP: using software breakpoints [x86, arm64] - KVM_GUESTDBG_USE_HW_BP: using hardware breakpoints [x86, s390] - KVM_GUESTDBG_INJECT_DB: inject DB type exception [x86] - KVM_GUESTDBG_INJECT_BP: inject BP type exception [x86] diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c index 4a274e1..064c105 100644 --- a/arch/arm/kvm/arm.c +++ b/arch/arm/kvm/arm.c @@ -302,7 +302,7 @@ void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu) kvm_arm_set_running_vcpu(NULL); } -#define KVM_GUESTDBG_VALID_MASK (KVM_GUESTDBG_ENABLE) +#define KVM_GUESTDBG_VALID_MASK (KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_USE_SW_BP) /** * kvm_arch_vcpu_ioctl_set_guest_debug - set up guest debugging diff --git a/arch/arm64/kvm/debug.c b/arch/arm64/kvm/debug.c index b1f8731..5bee676 100644 --- a/arch/arm64/kvm/debug.c +++ b/arch/arm64/kvm/debug.c @@ -75,6 +75,12 @@ void kvm_arm_setup_debug(struct kvm_vcpu *vcpu) else vcpu->arch.mdcr_el2 &= ~MDCR_EL2_TDA; + /* Trap breakpoints? */ + if (vcpu->guest_debug & KVM_GUESTDBG_USE_SW_BP) + vcpu->arch.mdcr_el2 |= MDCR_EL2_TDE; + else + vcpu->arch.mdcr_el2 &= ~MDCR_EL2_TDE; + } void kvm_arm_clear_debug(struct kvm_vcpu *vcpu) diff --git a/arch/arm64/kvm/handle_exit.c b/arch/arm64/kvm/handle_exit.c index 524fa25..27f38a9 100644 --- a/arch/arm64/kvm/handle_exit.c +++ b/arch/arm64/kvm/handle_exit.c @@ -82,6 +82,40 @@ static int kvm_handle_wfx(struct kvm_vcpu *vcpu, struct kvm_run *run) return 1; } +/** + * kvm_handle_guest_debug - handle a debug exception instruction + * + * @vcpu: the vcpu pointer + * @run: access to the kvm_run structure for results + * + * We route all debug exceptions through the same handler. If both the + * guest and host are using the same debug facilities it will be up to + * userspace to re-inject the correct exception for guest delivery. + * + * @return: 0 (while setting run->exit_reason), -1 for error + */ +static int kvm_handle_guest_debug(struct kvm_vcpu *vcpu, struct kvm_run *run) +{ + u32 hsr = kvm_vcpu_get_hsr(vcpu); + int ret = 0; + + run->exit_reason = KVM_EXIT_DEBUG; + run->debug.arch.hsr = hsr; + + switch (hsr >> ESR_ELx_EC_SHIFT) { + case ESR_ELx_EC_BKPT32: + case ESR_ELx_EC_BRK64: + break; + default: + kvm_err("%s: un-handled case hsr: %#08x\n", + __func__, (unsigned int) hsr); + ret = -1; + break; + } + + return ret; +} + static exit_handle_fn arm_exit_handlers[] = { [ESR_ELx_EC_WFx] = kvm_handle_wfx, [ESR_ELx_EC_CP15_32] = kvm_handle_cp15_32, @@ -96,6 +130,8 @@ static exit_handle_fn arm_exit_handlers[] = { [ESR_ELx_EC_SYS64] = kvm_handle_sys_reg, [ESR_ELx_EC_IABT_LOW] = kvm_handle_guest_abort, [ESR_ELx_EC_DABT_LOW] = kvm_handle_guest_abort, + [ESR_ELx_EC_BKPT32] = kvm_handle_guest_debug, + [ESR_ELx_EC_BRK64] = kvm_handle_guest_debug, }; static exit_handle_fn kvm_get_exit_handler(struct kvm_vcpu *vcpu) -- 2.3.5