From owner-svn-src-all@FreeBSD.ORG Tue Jul 16 23:19:06 2013 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 3C633655; Tue, 16 Jul 2013 23:19:06 +0000 (UTC) (envelope-from andrew@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id 13ECF85A; Tue, 16 Jul 2013 23:19:06 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r6GNJ528035961; Tue, 16 Jul 2013 23:19:05 GMT (envelope-from andrew@svn.freebsd.org) Received: (from andrew@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r6GNJ5K4035960; Tue, 16 Jul 2013 23:19:05 GMT (envelope-from andrew@svn.freebsd.org) Message-Id: <201307162319.r6GNJ5K4035960@svn.freebsd.org> From: Andrew Turner Date: Tue, 16 Jul 2013 23:19:05 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r253400 - head/sys/arm/arm X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 16 Jul 2013 23:19:06 -0000 Author: andrew Date: Tue Jul 16 23:19:05 2013 New Revision: 253400 URL: http://svnweb.freebsd.org/changeset/base/253400 Log: Fix vfp: - We should check is_d32 to see howmany registers we have - In vfp_restore mark vfpscr as an output register Without the second part it appears we can return the incorrect value from vfp_bounce if the VFP condition flags are set as it may override the register holding the return value. Modified: head/sys/arm/arm/vfp.c Modified: head/sys/arm/arm/vfp.c ============================================================================== --- head/sys/arm/arm/vfp.c Tue Jul 16 22:14:26 2013 (r253399) +++ head/sys/arm/arm/vfp.c Tue Jul 16 23:19:05 2013 (r253400) @@ -202,21 +202,20 @@ vfp_restore(struct vfp_state *vfpsave) * form ldcl, and similar for stcleq. */ #ifdef __clang__ -#define ldcleq "ldcleq" -#define stcleq "stcleq" +#define ldclne "ldclne" +#define stclne "stclne" #else -#define ldcleq "ldceql" -#define stcleq "stceql" +#define ldclne "ldcnel" +#define stclne "stcnel" #endif if (vfpsave) { - __asm __volatile("ldc p10, c0, [%0], #128\n" /* d0-d15 */ - "cmp %0, #0\n" /* -D16 or -D32? */ - ldcleq" p11, c0, [%0], #128\n" /* d16-d31 */ - "addne %0, %0, #128\n" /* skip missing regs */ - "ldr %1, [%0]\n" /* set old vfpscr */ - "mcr p10, 7, %1, cr1, c0, 0\n" - :: "r" (vfpsave), "r" (vfpscr), "r" (is_d32) - : "cc"); + __asm __volatile("ldc p10, c0, [%1], #128\n" /* d0-d15 */ + "cmp %2, #0\n" /* -D16 or -D32? */ + ldclne" p11, c0, [%1], #128\n" /* d16-d31 */ + "addeq %1, %1, #128\n" /* skip missing regs */ + "ldr %0, [%1]\n" /* set old vfpscr */ + "mcr p10, 7, %0, cr1, c0, 0\n" + : "=&r" (vfpscr) : "r" (vfpsave), "r" (is_d32) : "cc"); PCPU_SET(vfpcthread, PCPU_GET(curthread)); } } @@ -238,12 +237,12 @@ vfp_store(struct vfp_state *vfpsave) tmp = fmrx(VFPEXC); /* Is the vfp enabled? */ if (vfpsave && tmp & VFPEXC_EN) { __asm __volatile("stc p11, c0, [%1], #128\n" /* d0-d15 */ - "cmp %0, #0\n" /* -D16 or -D32? */ - stcleq" p11, c0, [%1], #128\n" /* d16-d31 */ - "addne %1, %1, #128\n" /* skip missing regs */ + "cmp %2, #0\n" /* -D16 or -D32? */ + stclne" p11, c0, [%1], #128\n" /* d16-d31 */ + "addeq %1, %1, #128\n" /* skip missing regs */ "mrc p10, 7, %0, cr1, c0, 0\n" /* fmxr(VFPSCR) */ "str %0, [%1]\n" /* save vfpscr */ - : "=&r" (vfpscr) : "r" (vfpsave), "r" (is_d32) : "cc"); + : "=&r" (vfpscr) : "r" (vfpsave), "r" (is_d32) : "cc"); } #undef ldcleq #undef stcleq