From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christoffer Dall Subject: [PULL 14/19] kvm: arm64: handle single-step of hyp emulated mmio instructions Date: Mon, 4 Dec 2017 15:03:43 +0100 Message-ID: <20171204140348.21965-12-cdall@kernel.org> References: <20171204135637.21620-1-cdall@kernel.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from localhost (localhost [127.0.0.1]) by mm01.cs.columbia.edu (Postfix) with ESMTP id B581149DAD for ; Mon, 4 Dec 2017 09:01:11 -0500 (EST) Received: from mm01.cs.columbia.edu ([127.0.0.1]) by localhost (mm01.cs.columbia.edu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id zn7-onh9qb2P for ; Mon, 4 Dec 2017 09:01:06 -0500 (EST) Received: from mail-wm0-f67.google.com (mail-wm0-f67.google.com [74.125.82.67]) by mm01.cs.columbia.edu (Postfix) with ESMTPS id 2FB4049D82 for ; Mon, 4 Dec 2017 09:01:00 -0500 (EST) Received: by mail-wm0-f67.google.com with SMTP id b76so14540665wmg.1 for ; Mon, 04 Dec 2017 06:04:07 -0800 (PST) In-Reply-To: <20171204135637.21620-1-cdall@kernel.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 To: kvmarm@lists.cs.columbia.edu, Paolo Bonzini , =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= Cc: Marc Zyngier , kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org List-Id: kvmarm@lists.cs.columbia.edu RnJvbTogQWxleCBCZW5uw6llIDxhbGV4LmJlbm5lZUBsaW5hcm8ub3JnPgoKVGhlcmUgaXMgYSBm YXN0LXBhdGggb2YgTU1JTyBlbXVsYXRpb24gaW5zaWRlIGh5cCBtb2RlLiBUaGUgaGFuZGxpbmcK b2Ygc2luZ2xlLXN0ZXAgaXMgYnJvYWRseSB0aGUgc2FtZSBhcyBrdm1fYXJtX2hhbmRsZV9zdGVw X2RlYnVnKCkKZXhjZXB0IHdlIGp1c3Qgc2V0dXAgRVNSL0hTUiBzbyBoYW5kbGVfZXhpdCgpIGRv ZXMgdGhlIGNvcnJlY3QgdGhpbmcKYXMgd2UgZXhpdC4KCkZvciB0aGUgY2FzZSBvZiBhbiBlbXVs YXRlZCBpbGxlZ2FsIGFjY2VzcyBjYXVzaW5nIGFuIFNFcnJvciB3ZSB3aWxsCmV4aXQgdmlhIHRo ZSBBUk1fRVhDRVBUSU9OX0VMMV9TRVJST1IgcGF0aCBpbiBoYW5kbGVfZXhpdCgpLiBXZSBiZWhh dmUKYXMgd2Ugd291bGQgZHVyaW5nIGEgcmVhbCBTRXJyb3IgYW5kIGNsZWFyIHRoZSBEQkdfU1BT Ul9TUyBiaXQgZm9yIHRoZQplbXVsYXRlZCBpbnN0cnVjdGlvbi4KCkFja2VkLWJ5OiBNYXJjIFp5 bmdpZXIgPG1hcmMuenluZ2llckBhcm0uY29tPgpSZXZpZXdlZC1ieTogQ2hyaXN0b2ZmZXIgRGFs bCA8Y2hyaXN0b2ZmZXIuZGFsbEBsaW5hcm8ub3JnPgpTaWduZWQtb2ZmLWJ5OiBBbGV4IEJlbm7D qWUgPGFsZXguYmVubmVlQGxpbmFyby5vcmc+ClNpZ25lZC1vZmYtYnk6IENocmlzdG9mZmVyIERh bGwgPGNocmlzdG9mZmVyLmRhbGxAbGluYXJvLm9yZz4KLS0tCiBhcmNoL2FybTY0L2t2bS9oeXAv c3dpdGNoLmMgfCAzNyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tCiAxIGZp bGUgY2hhbmdlZCwgMzAgaW5zZXJ0aW9ucygrKSwgNyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQg YS9hcmNoL2FybTY0L2t2bS9oeXAvc3dpdGNoLmMgYi9hcmNoL2FybTY0L2t2bS9oeXAvc3dpdGNo LmMKaW5kZXggNTI1YzAxZjQ4ODY3Li5mN2M2NTFmM2E4YzAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJt NjQva3ZtL2h5cC9zd2l0Y2guYworKysgYi9hcmNoL2FybTY0L2t2bS9oeXAvc3dpdGNoLmMKQEAg LTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxhc20va3ZtX2VtdWxhdGUuaD4KICNpbmNsdWRlIDxh c20va3ZtX2h5cC5oPgogI2luY2x1ZGUgPGFzbS9mcHNpbWQuaD4KKyNpbmNsdWRlIDxhc20vZGVi dWctbW9uaXRvcnMuaD4KIAogc3RhdGljIGJvb2wgX19oeXBfdGV4dCBfX2Zwc2ltZF9lbmFibGVk X252aGUodm9pZCkKIHsKQEAgLTI2OSw3ICsyNzAsMTEgQEAgc3RhdGljIGJvb2wgX19oeXBfdGV4 dCBfX3BvcHVsYXRlX2ZhdWx0X2luZm8oc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogCXJldHVybiB0 cnVlOwogfQogCi1zdGF0aWMgdm9pZCBfX2h5cF90ZXh0IF9fc2tpcF9pbnN0cihzdHJ1Y3Qga3Zt X3ZjcHUgKnZjcHUpCisvKiBTa2lwIGFuIGluc3RydWN0aW9uIHdoaWNoIGhhcyBiZWVuIGVtdWxh dGVkLiBSZXR1cm5zIHRydWUgaWYKKyAqIGV4ZWN1dGlvbiBjYW4gY29udGludWUgb3IgZmFsc2Ug aWYgd2UgbmVlZCB0byBleGl0IGh5cCBtb2RlIGJlY2F1c2UKKyAqIHNpbmdsZS1zdGVwIHdhcyBp biBlZmZlY3QuCisgKi8KK3N0YXRpYyBib29sIF9faHlwX3RleHQgX19za2lwX2luc3RyKHN0cnVj dCBrdm1fdmNwdSAqdmNwdSkKIHsKIAkqdmNwdV9wYyh2Y3B1KSA9IHJlYWRfc3lzcmVnX2VsMihl bHIpOwogCkBAIC0yODIsNiArMjg3LDE0IEBAIHN0YXRpYyB2b2lkIF9faHlwX3RleHQgX19za2lw X2luc3RyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIAl9CiAKIAl3cml0ZV9zeXNyZWdfZWwyKCp2 Y3B1X3BjKHZjcHUpLCBlbHIpOworCisJaWYgKHZjcHUtPmd1ZXN0X2RlYnVnICYgS1ZNX0dVRVNU REJHX1NJTkdMRVNURVApIHsKKwkJdmNwdS0+YXJjaC5mYXVsdC5lc3JfZWwyID0KKwkJCShFU1Jf RUx4X0VDX1NPRlRTVFBfTE9XIDw8IEVTUl9FTHhfRUNfU0hJRlQpIHwgMHgyMjsKKwkJcmV0dXJu IGZhbHNlOworCX0gZWxzZSB7CisJCXJldHVybiB0cnVlOworCX0KIH0KIAogaW50IF9faHlwX3Rl eHQgX19rdm1fdmNwdV9ydW4oc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpAQCAtMzQyLDEzICszNTUs MjEgQEAgaW50IF9faHlwX3RleHQgX19rdm1fdmNwdV9ydW4oc3RydWN0IGt2bV92Y3B1ICp2Y3B1 KQogCQkJaW50IHJldCA9IF9fdmdpY192Ml9wZXJmb3JtX2NwdWlmX2FjY2Vzcyh2Y3B1KTsKIAog CQkJaWYgKHJldCA9PSAxKSB7Ci0JCQkJX19za2lwX2luc3RyKHZjcHUpOwotCQkJCWdvdG8gYWdh aW47CisJCQkJaWYgKF9fc2tpcF9pbnN0cih2Y3B1KSkKKwkJCQkJZ290byBhZ2FpbjsKKwkJCQll bHNlCisJCQkJCWV4aXRfY29kZSA9IEFSTV9FWENFUFRJT05fVFJBUDsKIAkJCX0KIAogCQkJaWYg KHJldCA9PSAtMSkgewotCQkJCS8qIFByb21vdGUgYW4gaWxsZWdhbCBhY2Nlc3MgdG8gYW4gU0Vy cm9yICovCi0JCQkJX19za2lwX2luc3RyKHZjcHUpOworCQkJCS8qIFByb21vdGUgYW4gaWxsZWdh bCBhY2Nlc3MgdG8gYW4KKwkJCQkgKiBTRXJyb3IuIElmIHdlIHdvdWxkIGJlIHJldHVybmluZwor CQkJCSAqIGR1ZSB0byBzaW5nbGUtc3RlcCBjbGVhciB0aGUgU1MKKwkJCQkgKiBiaXQgc28gaGFu ZGxlX2V4aXQga25vd3Mgd2hhdCB0bworCQkJCSAqIGRvIGFmdGVyIGRlYWxpbmcgd2l0aCB0aGUg ZXJyb3IuCisJCQkJICovCisJCQkJaWYgKCFfX3NraXBfaW5zdHIodmNwdSkpCisJCQkJCSp2Y3B1 X2Nwc3IodmNwdSkgJj0gfkRCR19TUFNSX1NTOwogCQkJCWV4aXRfY29kZSA9IEFSTV9FWENFUFRJ T05fRUwxX1NFUlJPUjsKIAkJCX0KIApAQCAtMzYzLDggKzM4NCwxMCBAQCBpbnQgX19oeXBfdGV4 dCBfX2t2bV92Y3B1X3J1bihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiAJCWludCByZXQgPSBfX3Zn aWNfdjNfcGVyZm9ybV9jcHVpZl9hY2Nlc3ModmNwdSk7CiAKIAkJaWYgKHJldCA9PSAxKSB7Ci0J CQlfX3NraXBfaW5zdHIodmNwdSk7Ci0JCQlnb3RvIGFnYWluOworCQkJaWYgKF9fc2tpcF9pbnN0 cih2Y3B1KSkKKwkJCQlnb3RvIGFnYWluOworCQkJZWxzZQorCQkJCWV4aXRfY29kZSA9IEFSTV9F WENFUFRJT05fVFJBUDsKIAkJfQogCiAJCS8qIDAgZmFsbHMgdGhyb3VnaCB0byBiZSBoYW5kbGVk IG91dCBvZiBFTDIgKi8KLS0gCjIuMTQuMgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18Ka3ZtYXJtIG1haWxpbmcgbGlzdAprdm1hcm1AbGlzdHMuY3MuY29s dW1iaWEuZWR1Cmh0dHBzOi8vbGlzdHMuY3MuY29sdW1iaWEuZWR1L21haWxtYW4vbGlzdGluZm8v a3ZtYXJtCg== From mboxrd@z Thu Jan 1 00:00:00 1970 From: cdall@kernel.org (Christoffer Dall) Date: Mon, 4 Dec 2017 15:03:43 +0100 Subject: [PULL 14/19] kvm: arm64: handle single-step of hyp emulated mmio instructions In-Reply-To: <20171204135637.21620-1-cdall@kernel.org> References: <20171204135637.21620-1-cdall@kernel.org> Message-ID: <20171204140348.21965-12-cdall@kernel.org> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org From: Alex Benn?e There is a fast-path of MMIO emulation inside hyp mode. The handling of single-step is broadly the same as kvm_arm_handle_step_debug() except we just setup ESR/HSR so handle_exit() does the correct thing as we exit. For the case of an emulated illegal access causing an SError we will exit via the ARM_EXCEPTION_EL1_SERROR path in handle_exit(). We behave as we would during a real SError and clear the DBG_SPSR_SS bit for the emulated instruction. Acked-by: Marc Zyngier Reviewed-by: Christoffer Dall Signed-off-by: Alex Benn?e Signed-off-by: Christoffer Dall --- arch/arm64/kvm/hyp/switch.c | 37 ++++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/arch/arm64/kvm/hyp/switch.c b/arch/arm64/kvm/hyp/switch.c index 525c01f48867..f7c651f3a8c0 100644 --- a/arch/arm64/kvm/hyp/switch.c +++ b/arch/arm64/kvm/hyp/switch.c @@ -22,6 +22,7 @@ #include #include #include +#include static bool __hyp_text __fpsimd_enabled_nvhe(void) { @@ -269,7 +270,11 @@ static bool __hyp_text __populate_fault_info(struct kvm_vcpu *vcpu) return true; } -static void __hyp_text __skip_instr(struct kvm_vcpu *vcpu) +/* Skip an instruction which has been emulated. Returns true if + * execution can continue or false if we need to exit hyp mode because + * single-step was in effect. + */ +static bool __hyp_text __skip_instr(struct kvm_vcpu *vcpu) { *vcpu_pc(vcpu) = read_sysreg_el2(elr); @@ -282,6 +287,14 @@ static void __hyp_text __skip_instr(struct kvm_vcpu *vcpu) } write_sysreg_el2(*vcpu_pc(vcpu), elr); + + if (vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP) { + vcpu->arch.fault.esr_el2 = + (ESR_ELx_EC_SOFTSTP_LOW << ESR_ELx_EC_SHIFT) | 0x22; + return false; + } else { + return true; + } } int __hyp_text __kvm_vcpu_run(struct kvm_vcpu *vcpu) @@ -342,13 +355,21 @@ int __hyp_text __kvm_vcpu_run(struct kvm_vcpu *vcpu) int ret = __vgic_v2_perform_cpuif_access(vcpu); if (ret == 1) { - __skip_instr(vcpu); - goto again; + if (__skip_instr(vcpu)) + goto again; + else + exit_code = ARM_EXCEPTION_TRAP; } if (ret == -1) { - /* Promote an illegal access to an SError */ - __skip_instr(vcpu); + /* Promote an illegal access to an + * SError. If we would be returning + * due to single-step clear the SS + * bit so handle_exit knows what to + * do after dealing with the error. + */ + if (!__skip_instr(vcpu)) + *vcpu_cpsr(vcpu) &= ~DBG_SPSR_SS; exit_code = ARM_EXCEPTION_EL1_SERROR; } @@ -363,8 +384,10 @@ int __hyp_text __kvm_vcpu_run(struct kvm_vcpu *vcpu) int ret = __vgic_v3_perform_cpuif_access(vcpu); if (ret == 1) { - __skip_instr(vcpu); - goto again; + if (__skip_instr(vcpu)) + goto again; + else + exit_code = ARM_EXCEPTION_TRAP; } /* 0 falls through to be handled out of EL2 */ -- 2.14.2