From patchwork Wed Aug 5 16:11:37 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marc Zyngier X-Patchwork-Id: 6951561 Return-Path: X-Original-To: patchwork-kvm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 70489C05AC for ; Wed, 5 Aug 2015 16:11:47 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 8FF8B20221 for ; Wed, 5 Aug 2015 16:11:46 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 28F8120429 for ; Wed, 5 Aug 2015 16:11:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753989AbbHEQLm (ORCPT ); Wed, 5 Aug 2015 12:11:42 -0400 Received: from foss.arm.com ([217.140.101.70]:34801 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753668AbbHEQLk (ORCPT ); Wed, 5 Aug 2015 12:11:40 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id E8C97317; Wed, 5 Aug 2015 09:11:42 -0700 (PDT) Received: from [10.1.209.148] (usa-sjc-imap-foss1.foss.arm.com [10.72.51.249]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id DA9A63F318; Wed, 5 Aug 2015 09:11:38 -0700 (PDT) Message-ID: <55C235B9.3000800@arm.com> Date: Wed, 05 Aug 2015 17:11:37 +0100 From: Marc Zyngier Organization: ARM Ltd User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Icedove/31.7.0 MIME-Version: 1.0 To: Mario Smarduch , "kvmarm@lists.cs.columbia.edu" , "christoffer.dall@linaro.org" CC: "kvm@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" Subject: Re: [PATCH v4 1/2] arm64: KVM: Optimize arm64 skip 30-50% vfp/simd save/restore on exits References: <1437082178-11039-1-git-send-email-m.smarduch@samsung.com> <1437082178-11039-2-git-send-email-m.smarduch@samsung.com> In-Reply-To: <1437082178-11039-2-git-send-email-m.smarduch@samsung.com> Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Spam-Status: No, score=-7.0 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP On 16/07/15 22:29, Mario Smarduch wrote: > This patch only saves and restores FP/SIMD registers on Guest access. To do > this cptr_el2 FP/SIMD trap is set on Guest entry and later checked on exit. > lmbench, hackbench show significant improvements, for 30-50% exits FP/SIMD > context is not saved/restored > > Signed-off-by: Mario Smarduch So this patch seems to break 32bit guests on arm64. I've had a look, squashed a few bugs that I dangerously overlooked during the review, but it still doesn't work (it doesn't crash anymore, but I get random illegal VFP instructions in 32bit guests). I'd be glad if someone could eyeball the following patch and tell me what's going wrong. If we don't find the root cause quickly enough, I'll have to drop the series from -next, and that'd be a real shame. Thanks, M. commit 5777dc55fbc170426a85e00c26002dd5a795cfa5 Author: Marc Zyngier Date: Wed Aug 5 16:53:01 2015 +0100 KVM: arm64: NOTAFIX: Prevent crash when 32bit guest uses VFP Since we switch FPSIMD in a lazy way, access to FPEXC32_EL2 must be guarded by skip_fpsimd_state. Otherwise, all hell break loose. Also, FPEXC32_EL2 must be restored when we trap to EL2 to enable floating point. Note that while it prevents the host from catching fire, the guest still doesn't work properly, and I don't understand why just yet. Not-really-signed-off-by: Marc Zyngier diff --git a/arch/arm64/kvm/hyp.S b/arch/arm64/kvm/hyp.S index c8e0c70..b53ec5d 100644 --- a/arch/arm64/kvm/hyp.S +++ b/arch/arm64/kvm/hyp.S @@ -431,10 +431,12 @@ add x3, x2, #CPU_SYSREG_OFFSET(DACR32_EL2) mrs x4, dacr32_el2 mrs x5, ifsr32_el2 - mrs x6, fpexc32_el2 stp x4, x5, [x3] - str x6, [x3, #16] + skip_fpsimd_state x8, 3f + mrs x6, fpexc32_el2 + str x6, [x3, #16] +3: skip_debug_state x8, 2f mrs x7, dbgvcr32_el2 str x7, [x3, #24] @@ -461,10 +463,8 @@ add x3, x2, #CPU_SYSREG_OFFSET(DACR32_EL2) ldp x4, x5, [x3] - ldr x6, [x3, #16] msr dacr32_el2, x4 msr ifsr32_el2, x5 - msr fpexc32_el2, x6 skip_debug_state x8, 2f ldr x7, [x3, #24] @@ -669,12 +669,14 @@ __restore_debug: ret __save_fpsimd: + skip_fpsimd_state x3, 1f save_fpsimd - ret +1: ret __restore_fpsimd: + skip_fpsimd_state x3, 1f restore_fpsimd - ret +1: ret switch_to_guest_fpsimd: push x4, lr @@ -682,6 +684,7 @@ switch_to_guest_fpsimd: mrs x2, cptr_el2 bic x2, x2, #CPTR_EL2_TFP msr cptr_el2, x2 + isb mrs x0, tpidr_el2 @@ -692,6 +695,10 @@ switch_to_guest_fpsimd: add x2, x0, #VCPU_CONTEXT bl __restore_fpsimd + skip_32bit_state x3, 1f + ldr x4, [x2, #CPU_SYSREG_OFFSET(FPEXC32_EL2)] + msr fpexc32_el2, x4 +1: pop x4, lr pop x2, x3 pop x0, x1 @@ -754,9 +761,7 @@ __kvm_vcpu_return: add x2, x0, #VCPU_CONTEXT save_guest_regs - skip_fpsimd_state x3, 1f bl __save_fpsimd -1: bl __save_sysregs skip_debug_state x3, 1f @@ -777,9 +782,7 @@ __kvm_vcpu_return: kern_hyp_va x2 bl __restore_sysregs - skip_fpsimd_state x3, 1f bl __restore_fpsimd -1: /* Clear FPSIMD and Trace trapping */ msr cptr_el2, xzr