From patchwork Thu Nov 9 17:00: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: 118467 Delivered-To: patch@linaro.org Received: by 10.80.225.132 with SMTP id k4csp1153324edl; Thu, 9 Nov 2017 09:00:33 -0800 (PST) X-Google-Smtp-Source: ABhQp+TuSKlDKcI2d/PvUMdnYQpqkQaGTZQw348Em0W7LZZNkSP1m7wJ6FC7TOBcjywArtD3svj5 X-Received: by 10.159.216.145 with SMTP id s17mr1009682plp.297.1510246833068; Thu, 09 Nov 2017 09:00:33 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1510246833; cv=none; d=google.com; s=arc-20160816; b=Qtn1lY8oXtONrtu9ExQWeQztgCQy4Rd8NmWdOTHu4Mi+QoUb2X6tvgvzp3Oi/YrJFo SrSieKEdH15TUz9kkBQWLt4yU3lVy5yg/hkbaUDIyruqVgryX9kXVzSPPPbuofquHRNq v0EALRdD0W5WH4iXcy8aiZUSHooBZIjMppwUiWPko6lL16YQaTpZYhaNRCylpZe2pSJi ToHX0uwBbj/zgG3CzpctrmBJmbAjabLyIn3J/YUxqhrurwGBtX6oysd/iSgUwRhut22V jmWQMXElkIulm7Rf2CtdEBujiSmY7DtiNgBfAX83je4j61V+UgkPfZSK5DYYdyt2CYT9 ovGw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=V6HCRLgqa9ErgrXDTIirUcDf6PpujyqfQP8dm4aQeDI=; b=ZEpht45m4YFP/6uI1SHGItM7ZJDNFDM6IEUoVB+pin6U3zP3qOe+RRrrWE0BWHBbBT NLZL0f1uLWR1xDvbBbJUcyxvgulB8HGwglXx0bbtotvz5UxSEC4S7+ANN75Xhfb9Pk7V TaUgFxRypM98KcUaNoe2Am2ucxGYFE/gyz1vqq/CkHjywSKz0RwCH3u/2jJ4txqFTO5w ZhYmB8tdiOZhKeQRDT82cWbUBwOKlzLtHcUxUx+QKVhWktwFgtwOmBerXGnrEWtGUTcI 4oe4TQGnmAxtSy+K79OlLGB29aTWIwSU9YAUO0udXQ1K7uNr/4hWXVphiOKB8ujY4PNN Qusg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=havQvlqc; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m12si6651801plt.65.2017.11.09.09.00.32; Thu, 09 Nov 2017 09:00:33 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=havQvlqc; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754102AbdKIRA3 (ORCPT + 23 others); Thu, 9 Nov 2017 12:00:29 -0500 Received: from mail-wm0-f66.google.com ([74.125.82.66]:33676 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754080AbdKIRA1 (ORCPT ); Thu, 9 Nov 2017 12:00:27 -0500 Received: by mail-wm0-f66.google.com with SMTP id r68so2968217wmr.0 for ; Thu, 09 Nov 2017 09:00:27 -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=V6HCRLgqa9ErgrXDTIirUcDf6PpujyqfQP8dm4aQeDI=; b=havQvlqcBCpW8VQKFVjgkzBILNpTmrCupPEsGdcx59tqwrqRSmq5YX6E4uguOTwn3k lu5XPx1T+L59Ouyo8+sp/WoEIXb+4MIij6nHKiimTPEFhtsSjdOY4C2SShKM+c1z9ody 9eQWJW9Gxzj9i3hLb+CwGc5VYHwz68GIYZ5Wg= 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=V6HCRLgqa9ErgrXDTIirUcDf6PpujyqfQP8dm4aQeDI=; b=O3572T50xo4AV2XiZosE+XMguS3w9OBtZng7ddxQkRsVgT6Cepynnrr/OsjbzW6Loz n7LPl24YdiynfY5xTr/xdC6RXdEsE0FAfw+iaW84hBWmkhFG47JSWCoJuXJkX4Bi2NHu mTgq8vQEUehS+mOk6s48owoGSVmu6ZTvnj49hhCyXP4+E1HEJAa5a35KnoGIzYZIxaVP EWBTh0Of4bR2qM7jqHJpCreMwVplWxhnxWdOIVQqA9Wiq5lJGukECqQjk3YmllPqFJO1 pNkCvihiFzNdfodBhddvLQO+aQVnFaLWGMTmU+NlIZJ0EM1VPzM4vpcmsSs7XUarJgWq Aa9Q== X-Gm-Message-State: AJaThX45Wilzdb9x8ABzs0SCjg180mSzFwx8VqsY1zMcPbh0k1adjxtg piQq2JPzumzFuNfjcGf6qpPfSg== X-Received: by 10.28.69.8 with SMTP id s8mr343101wma.65.1510246826444; Thu, 09 Nov 2017 09:00:26 -0800 (PST) Received: from zen.linaro.local ([81.128.185.34]) by smtp.gmail.com with ESMTPSA id 25sm7341808wrv.8.2017.11.09.09.00.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 09 Nov 2017 09:00:24 -0800 (PST) Received: from zen.linaroharston (localhost [127.0.0.1]) by zen.linaro.local (Postfix) with ESMTP id 567A03E0349; Thu, 9 Nov 2017 17:00:22 +0000 (GMT) From: =?utf-8?q?Alex_Benn=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 Cc: =?utf-8?q?Alex_Benn=C3=A9e?= , Catalin Marinas , Will Deacon , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v2 2/3] kvm: arm64: handle single-stepping trapped instructions Date: Thu, 9 Nov 2017 17:00:20 +0000 Message-Id: <20171109170021.2984-3-alex.bennee@linaro.org> X-Mailer: git-send-email 2.14.2 In-Reply-To: <20171109170021.2984-1-alex.bennee@linaro.org> References: <20171109170021.2984-1-alex.bennee@linaro.org> MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- 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(-) -- 2.14.2 Reviewed-by: Julien Thierry 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