From patchwork Wed Feb 10 11:02:47 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Asia Slowinska X-Patchwork-Id: 8271941 Return-Path: X-Original-To: patchwork-qemu-devel@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 E3B0FBEEE5 for ; Wed, 10 Feb 2016 13:21:29 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 18FA120398 for ; Wed, 10 Feb 2016 13:21:29 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 20D1020394 for ; Wed, 10 Feb 2016 13:21:28 +0000 (UTC) Received: from localhost ([::1]:39166 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aTUhz-0003vV-CH for patchwork-qemu-devel@patchwork.kernel.org; Wed, 10 Feb 2016 08:21:27 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58443) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aTSXt-0001EN-M1 for qemu-devel@nongnu.org; Wed, 10 Feb 2016 06:02:54 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aTSXp-0002tx-77 for qemu-devel@nongnu.org; Wed, 10 Feb 2016 06:02:53 -0500 Received: from mail-lf0-x22e.google.com ([2a00:1450:4010:c07::22e]:34076) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aTSXo-0002tQ-Pb for qemu-devel@nongnu.org; Wed, 10 Feb 2016 06:02:49 -0500 Received: by mail-lf0-x22e.google.com with SMTP id j78so9309895lfb.1 for ; Wed, 10 Feb 2016 03:02:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lastline-com.20150623.gappssmtp.com; s=20150623; h=mime-version:reply-to:date:message-id:subject:from:to:cc :content-type; bh=WJiEvshSUKHLo2zttAYNGv3TZDBRZvQeTtYpqg11Hvc=; b=ZJIbw5IYcG3CMEyF2m7j9csBgJmn0GOlnAyR6MTkv89x2Gy2Wv9zpTKWKjl2VbfrjZ pLUvGYSfZwUvVaH/IJ3x2MRQmpXG7JF2XhVSXqN+aS+Bi19/U5ghFoMZEfdc3zqSy0oL evXugzG44hLzHqa++/zmlVgMqDUfeBhqPJB3tvWjXowpN8pX3cHcmnuPETwBBYxqNQyM Ne+O1jJuhCIOzvLpsrjFZuof63LFYzVPecMFpO/fAomW7WwxAl2yjfC/0NO3xiKdCPTQ P2/Ujx4uRkUJQ2HB2bsSf/nlYA6JojOoYAQDUSqGUbLSlA7hjKhVWbVDvrSFmfSsRpIc ow3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:reply-to:date:message-id:subject :from:to:cc:content-type; bh=WJiEvshSUKHLo2zttAYNGv3TZDBRZvQeTtYpqg11Hvc=; b=PkgqmBbFXe1EA3BOpGTwEZXF3mioG9XbEWQTIfZVHyCW8KddiYpH8Mw7tnd7Tw3mVr Av7PSGkoYAXQ4heOb18AZp4LGOMmaHW4EkhiY06lmX5B9aoq7rpGV1SBj57AQVyPEEFM guPkk7gZofwU4BNuvCPpZO5BaufF3ZLIAb2btWcdp1p44FT6WSz0ixXF7f5bxumtzFen I+0Ey0kzbXRoGGmCV3yT0voMFlcIrb0O0+EVSEJlO5HcTOaAmQXiJAguCwEkDVO1NHf+ bcgSDGdA3sXSG/5RRChhp4aqLMDrBynGitbytJw9f4IYuLjwd1sFNbcBuV8/IQR/vibD PStw== X-Gm-Message-State: AG10YOTByR2GBfWCk6POtNwKn3curkLpiNwD+R5yupBa9JNIKYXAyOoFncWBVRy8yOPMMtorenCgLLZm9pwokg== MIME-Version: 1.0 X-Received: by 10.25.26.205 with SMTP id a196mr12866373lfa.125.1455102167492; Wed, 10 Feb 2016 03:02:47 -0800 (PST) Received: by 10.25.215.226 with HTTP; Wed, 10 Feb 2016 03:02:47 -0800 (PST) Date: Wed, 10 Feb 2016 12:02:47 +0100 Message-ID: From: Asia Slowinska To: qemu-devel@nongnu.org X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a00:1450:4010:c07::22e X-Mailman-Approved-At: Wed, 10 Feb 2016 08:21:12 -0500 Cc: pbonzini@redhat.com, ehabkost@redhat.com, A Slowinska , rth@twiddle.net Subject: [Qemu-devel] [PATCH] target-i386/kvm.c: Fix the order of FPU registers in xsave X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: asia@lastline.com List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org X-Spam-Status: No, score=-6.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, HTML_MESSAGE, RCVD_IN_DNSWL_HI, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=ham 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 Stick to the expected order of the FPU registers in xsave (as specified in the Intel manual.) Otherwise, instructions loading the FPU state don't set it up correctly. To set up FPU, software needs to provide a buffer of 80 bytes storing 8 FPU registers. They are organized in a stack. FPU assumes that the first field of the buffer is ST0, then ST1, and so on. QEMU maintains a circular buffer. When preparing these 80 bytes for KVM, QEMU just uses memcpy instead of copying the elements in a proper order. Signed-off-by: Asia Slowinska --- target-i386/kvm.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/target-i386/kvm.c b/target-i386/kvm.c index 94024bc..c77fe73 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -1325,8 +1325,10 @@ static int kvm_put_xsave(X86CPU *cpu) xsave->region[XSAVE_FTW_FOP] = (uint32_t)(env->fpop << 16) + twd; memcpy(&xsave->region[XSAVE_CWD_RIP], &env->fpip, sizeof(env->fpip)); memcpy(&xsave->region[XSAVE_CWD_RDP], &env->fpdp, sizeof(env->fpdp)); - memcpy(&xsave->region[XSAVE_ST_SPACE], env->fpregs, - sizeof env->fpregs); + for (i = 0; i < 8; i++) { + memcpy(&xsave_region[HXSAVE_ST_SPACE + i * 4], + &env->fpregs[(env->fpstt + i) & 7], 16); + } xsave->region[XSAVE_MXCSR] = env->mxcsr; *(uint64_t *)&xsave->region[XSAVE_XSTATE_BV] = env->xstate_bv; memcpy(&xsave->region[XSAVE_BNDREGS], env->bnd_regs, @@ -1745,8 +1747,10 @@ static int kvm_get_xsave(X86CPU *cpu) memcpy(&env->fpip, &xsave->region[XSAVE_CWD_RIP], sizeof(env->fpip)); memcpy(&env->fpdp, &xsave->region[XSAVE_CWD_RDP], sizeof(env->fpdp)); env->mxcsr = xsave->region[XSAVE_MXCSR]; - memcpy(env->fpregs, &xsave->region[XSAVE_ST_SPACE], - sizeof env->fpregs); + for (i = 0; i < 8; i++) { + memcpy(&env->fpregs[(env->fpstt + i) & 7], + &xsave_region[HXSAVE_ST_SPACE + i * 4], 16); + } env->xstate_bv = *(uint64_t *)&xsave->region[XSAVE_XSTATE_BV]; memcpy(env->bnd_regs, &xsave->region[XSAVE_BNDREGS], sizeof env->bnd_regs);