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: 119055 Delivered-To: patch@linaro.org Received: by 10.140.22.164 with SMTP id 33csp5734854qgn; Thu, 16 Nov 2017 07:40:01 -0800 (PST) X-Google-Smtp-Source: AGs4zMYB1BgZulepzLThMu0yyK3ivHWJbudC17xbjgIrRS5nvL0Phv9uZ1O00/+q2lRZLA3AKXQ5 X-Received: by 10.98.186.13 with SMTP id k13mr2268618pff.166.1510846801566; Thu, 16 Nov 2017 07:40:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1510846801; cv=none; d=google.com; s=arc-20160816; b=ujChIsXVm+fSpYXc1EXrEmVuTMu+czKIF1yMqmUGCh4KhxEfBZUbxE3UGg8sIHFniJ qIh1AyyfWP/ZXnUnyWa78CZUh/7IjFcM+OxJBIZA63JrZNt/9cK/KY013aTAZBToGc7u EOMUQWMDGsTL0znt7VSzlXphkMK/WHd+kNjU2kIGx5sxWXAC0E7ZXL5YDni5aXQUZCt+ QOysDctTQ0ws36IqMpaj6wpLjnS87DcXIajB0kjLhgqtKk+iINWaYs9KMY8pT9LXDk6P Ljz2IU6udQjds3HqTMuDK60W5NynKobfOuiDuOY+SrmIEZdbaOl9UA+7tzr6dkJLgQEy K8Fw== 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=slpupatpw0H5CEBDfNoAa38imSLd9H2hQ5fwhN9ClgM=; b=cC5FeFyspu900W3utBXsVQbUUa2sfbk7IZwOq/XHYaj8aLbQUl0IMZ3KmF4ZD+V/fa flmXaIRPJBy9kcpk+onClhYfbbAW2oZctcTcijI8HPy6JZ89Z1dSwq/plGdni2Eb/JEt MC5PYijOAOAssctGmVmuxzmUJxbmKJFYtUyfWxEm5HqrwBQCJN5dsWlrMnwPI/z644P1 UnLKJlrTFXV77M98mrhgCnR6i5PjTIam0QA44/0qFLTYblaGY8sSN5Iu6EdkxEkCTSdc 3zWADYlCTnCFsddlXnQxSQ1yXpA1RTEn020dsFMLX6qbHxhfdRQNb7Y0YHeC840gtCQy qqJg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=EGjta8sv; 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 x5si1156918pfx.313.2017.11.16.07.40.01; Thu, 16 Nov 2017 07:40:01 -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=EGjta8sv; 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 S935697AbdKPPj6 (ORCPT + 28 others); Thu, 16 Nov 2017 10:39:58 -0500 Received: from mail-wm0-f67.google.com ([74.125.82.67]:38050 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933881AbdKPPj2 (ORCPT ); Thu, 16 Nov 2017 10:39:28 -0500 Received: by mail-wm0-f67.google.com with SMTP id z3so1062749wme.3 for ; Thu, 16 Nov 2017 07:39: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=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=VcH6UvfUOUv7g68Ip09tDLpzIdFv9jFqjLIsms7xVVyn4l6GQkMwuDL8JTM+y6VWbo TXu2e59E8DPAvXA02qD6Pe+dZTnVai3gcfFTid9HuTCmgI/OjQOQglwqa+M+0BJl2Svt CMGalMr9VA2XqEIrjoPcXZZv8+JD2Iiqzxce5FgQPuy0HZexQo/CoEbZ5bvR2QJi+Phy 7X7RC7udizz7NtcAqSLm8fzSfnR472xzoiFMYJ7IBFzLHJqdKkXIbOTsSObyMRUQAxNe Ci7IRgKmj9pVdccRUDrVBI9c3M/pdv2SWmMlnUDM7xFrGvCNHYR26OzHzm18UOQWt3H3 4p4A== X-Gm-Message-State: AJaThX7RncvrRK5mYAZJt9o3QaDifBC3zwMTxi4ODxQ1N8NPcH9+Uq4K lE6F9tEZcMiK1yfgh4CCISwa8A== 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_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 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 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 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(-) -- 2.15.0 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