From patchwork Thu Nov 16 15:39:20 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Alex_Benn=C3=A9e?= X-Patchwork-Id: 10061447 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 34B2D60230 for ; Thu, 16 Nov 2017 16:03:31 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 27BF02AB87 for ; Thu, 16 Nov 2017 16:03:31 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1C1092AB86; Thu, 16 Nov 2017 16:03:31 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 7E45D2AB7D for ; Thu, 16 Nov 2017 16:03:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=uNsv0qPxqzlKHTIyat3bQay9riVVfVNXutck4eWULVg=; b=YngWJCb4lTdQo5 n0xEv1Wqn1UDKF/3eTqF5Rp9T4pk1HZtkQm8lJG99Sjrt4/ZTOzdyjdnqtItDiqEbplna6+yD66sY Fi5qNC9auzrCX7pIvJ3FrXH8+pEoGtCTP4MnQpTO+R4Lbja6rredkLpgBFXZDVY0L+VM2jtPyB7If nt7fDcYZJUyMbElwDsfUucFar6jjm/AH8gjWFuaTFOhvhEPjme82Lip9/mCjwkpx0vhq1olwGxZ0i Zg4vUxxy5qVJxmeosC6D7st/PoXnbXKJr0LL3Os3ibvzGpAntO1HlTjncNvSt2nwegHv9637EQoEA 8mW3CjlCupSRG6XjAhyA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1eFMdU-0005hN-Fe; Thu, 16 Nov 2017 16:03:28 +0000 Received: from mail-wm0-x244.google.com ([2a00:1450:400c:c09::244]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1eFMGa-0001Px-Bp for linux-arm-kernel@lists.infradead.org; Thu, 16 Nov 2017 15:39:50 +0000 Received: by mail-wm0-x244.google.com with SMTP id v186so1068301wma.2 for ; Thu, 16 Nov 2017 07:39:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=slpupatpw0H5CEBDfNoAa38imSLd9H2hQ5fwhN9ClgM=; b=EGjta8svYFrnc10lGrCuaJMwxX1lw3PhDah2isnz7TWa4fyx7k+PVozKa8Ftg91cHF CYpC/yVDSCTBB5LhkMcc3RVlUQkqykKVL2hlzbfi4mTqgI5xIPONFQlvY9XqY7LtNksq qggqY6CG36c+qLLKbkIoyovSdOhHOUfSg7baY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=slpupatpw0H5CEBDfNoAa38imSLd9H2hQ5fwhN9ClgM=; b=ZhTtHcxPdZ9WLkp3is2Pv+F7eyCbrrcM/xAU5YwfXMf9p363jTUAyDj8p63BlXzh6I vWnvr3sqbCc9g2AHoeQpSUk2igcBRjq5gBTpeEnXGXNqZ28J0tapX/agTLI6o2ZtVYfi WqFnokPy48p98N+FLya+r5e+g0vvFwvvPSLWXntq///yJ7F1IZAkCWhrKeWAtb3ZaM88 cnT7u7kv1QwMag4580WW8vvqxmOZRbAqQMFdi++BiMsdbPPGIweHmh4zw8TWzaOCNK9/ T3NB2pRhRxwm2kHkHgTs1YTqX53ysvxISjfRWkZ/ibi9FoFx7x0qnA0XgiWiTiXMK8b4 RpCA== X-Gm-Message-State: AJaThX613QF0ptllF1q2NoQdB3KFA1Dfi75gkcn7EYbEdRGFAARM2yRU xgQ8bG77OYK6sF1R8JkQTXk9gg== X-Google-Smtp-Source: AGs4zMZB1Nvifo9Zue5o2VBa8Sp7GHANP5LqarbIXoqsjT2i8mQPoEDyfPJzoE9W6IM23RD9lizy5g== X-Received: by 10.28.70.131 with SMTP id t125mr1778583wma.92.1510846766528; Thu, 16 Nov 2017 07:39:26 -0800 (PST) Received: from zen.linaro.local ([81.128.185.34]) by smtp.gmail.com with ESMTPSA id l16sm4355131wma.19.2017.11.16.07.39.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 16 Nov 2017 07:39:23 -0800 (PST) Received: from zen.linaroharston (localhost [127.0.0.1]) by zen.linaro.local (Postfix) with ESMTP id 2F3A93E0412; Thu, 16 Nov 2017 15:39:22 +0000 (GMT) From: =?UTF-8?q?Alex=20Benn=C3=A9e?= To: julien.thierry@arm.com, kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu, christoffer.dall@linaro.org, marc.zyngier@arm.com Subject: [PATCH v3 2/3] kvm: arm64: handle single-stepping trapped instructions Date: Thu, 16 Nov 2017 15:39:20 +0000 Message-Id: <20171116153921.21991-3-alex.bennee@linaro.org> X-Mailer: git-send-email 2.15.0 In-Reply-To: <20171116153921.21991-1-alex.bennee@linaro.org> References: <20171116153921.21991-1-alex.bennee@linaro.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20171116_073948_608998_BDE4BEA6 X-CRM114-Status: GOOD ( 17.28 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Catalin Marinas , =?UTF-8?q?Alex=20Benn=C3=A9e?= , open list , Will Deacon Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP If we are using guest debug to single-step the guest we need to ensure we exit after emulating the instruction. This only affects instructions completely emulated by the kernel. For userspace emulated instructions we need to exit and return to complete the emulation. The kvm_arm_handle_step_debug() helper sets up the necessary exit state if needed. Signed-off-by: Alex Bennée Reviewed-by: Julien Thierry --- v2 - use helper from patch 1 - if (handled > 0) instead of if (handled) so errors propagate --- arch/arm64/kvm/handle_exit.c | 47 +++++++++++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/arch/arm64/kvm/handle_exit.c b/arch/arm64/kvm/handle_exit.c index 7debb74843a0..af1c804742f6 100644 --- a/arch/arm64/kvm/handle_exit.c +++ b/arch/arm64/kvm/handle_exit.c @@ -178,6 +178,38 @@ static exit_handle_fn kvm_get_exit_handler(struct kvm_vcpu *vcpu) return arm_exit_handlers[hsr_ec]; } +/* + * We may be single-stepping an emulated instruction. If the emulation + * has been completed in-kernel we can return to userspace with a + * KVM_EXIT_DEBUG, otherwise the userspace needs to complete its + * emulation first. + */ + +static int handle_trap_exceptions(struct kvm_vcpu *vcpu, struct kvm_run *run) +{ + int handled; + + /* + * See ARM ARM B1.14.1: "Hyp traps on instructions + * that fail their condition code check" + */ + if (!kvm_condition_valid(vcpu)) { + kvm_skip_instr(vcpu, kvm_vcpu_trap_il_is32bit(vcpu)); + handled = 1; + } else { + exit_handle_fn exit_handler; + + exit_handler = kvm_get_exit_handler(vcpu); + handled = exit_handler(vcpu, run); + } + + /* helper sets exit_reason if we need to return to userspace */ + if (handled > 0 && kvm_arm_handle_step_debug(vcpu, run)) + handled = 0; + + return handled; +} + /* * Return > 0 to return to guest, < 0 on error, 0 (and set exit_reason) on * proper exit to userspace. @@ -185,8 +217,6 @@ static exit_handle_fn kvm_get_exit_handler(struct kvm_vcpu *vcpu) int handle_exit(struct kvm_vcpu *vcpu, struct kvm_run *run, int exception_index) { - exit_handle_fn exit_handler; - if (ARM_SERROR_PENDING(exception_index)) { u8 hsr_ec = ESR_ELx_EC(kvm_vcpu_get_hsr(vcpu)); @@ -214,18 +244,7 @@ int handle_exit(struct kvm_vcpu *vcpu, struct kvm_run *run, kvm_inject_vabt(vcpu); return 1; case ARM_EXCEPTION_TRAP: - /* - * See ARM ARM B1.14.1: "Hyp traps on instructions - * that fail their condition code check" - */ - if (!kvm_condition_valid(vcpu)) { - kvm_skip_instr(vcpu, kvm_vcpu_trap_il_is32bit(vcpu)); - return 1; - } - - exit_handler = kvm_get_exit_handler(vcpu); - - return exit_handler(vcpu, run); + return handle_trap_exceptions(vcpu, run); case ARM_EXCEPTION_HYP_GONE: /* * EL2 has been reset to the hyp-stub. This happens when a guest