From owner-svn-src-all@FreeBSD.ORG Fri Mar 13 08:47:17 2015 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 502143E2; Fri, 13 Mar 2015 08:47:17 +0000 (UTC) Received: from kib.kiev.ua (kib.kiev.ua [IPv6:2001:470:d5e7:1::1]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id CB19F3D5; Fri, 13 Mar 2015 08:47:16 +0000 (UTC) Received: from tom.home (kostik@localhost [127.0.0.1]) by kib.kiev.ua (8.14.9/8.14.9) with ESMTP id t2D8l2ac069723 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 13 Mar 2015 10:47:02 +0200 (EET) (envelope-from kostikbel@gmail.com) DKIM-Filter: OpenDKIM Filter v2.9.2 kib.kiev.ua t2D8l2ac069723 Received: (from kostik@localhost) by tom.home (8.14.9/8.14.9/Submit) id t2D8l2lH069722; Fri, 13 Mar 2015 10:47:02 +0200 (EET) (envelope-from kostikbel@gmail.com) X-Authentication-Warning: tom.home: kostik set sender to kostikbel@gmail.com using -f Date: Fri, 13 Mar 2015 10:47:02 +0200 From: Konstantin Belousov To: Nathan Whitehorn Subject: Re: svn commit: r279937 - in head/sys/powerpc: include powerpc Message-ID: <20150313084702.GV2379@kib.kiev.ua> References: <201503122115.t2CLFdmi026986@svn.freebsd.org> <20150312212234.GS2379@kib.kiev.ua> <55020547.7050102@freebsd.org> <20150312213530.GT2379@kib.kiev.ua> <5502094D.5090001@freebsd.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5502094D.5090001@freebsd.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-Spam-Status: No, score=-2.0 required=5.0 tests=ALL_TRUSTED,BAYES_00, DKIM_ADSP_CUSTOM_MED,FREEMAIL_FROM,NML_ADSP_CUSTOM_MED autolearn=no autolearn_force=no version=3.4.0 X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on tom.home Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.18-1 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: Fri, 13 Mar 2015 08:47:17 -0000 On Thu, Mar 12, 2015 at 02:46:53PM -0700, Nathan Whitehorn wrote: > > On 03/12/15 14:35, Konstantin Belousov wrote: > > On Thu, Mar 12, 2015 at 02:29:43PM -0700, Nathan Whitehorn wrote: > >> On 03/12/15 14:22, Konstantin Belousov wrote: > >>> On Thu, Mar 12, 2015 at 09:15:39PM +0000, Nathan Whitehorn wrote: > >>>> Author: nwhitehorn > >>>> Date: Thu Mar 12 21:15:38 2015 > >>>> New Revision: 279937 > >>>> URL: https://svnweb.freebsd.org/changeset/base/279937 > >>>> > >>>> Log: > >>>> Provide VSX context in ucontext(3) API. > >>>> > >>>> Modified: > >>>> head/sys/powerpc/include/ucontext.h > >>>> head/sys/powerpc/powerpc/exec_machdep.c > >>>> > >>>> Modified: head/sys/powerpc/include/ucontext.h > >>>> ============================================================================== > >>>> --- head/sys/powerpc/include/ucontext.h Thu Mar 12 20:14:48 2015 (r279936) > >>>> +++ head/sys/powerpc/include/ucontext.h Thu Mar 12 21:15:38 2015 (r279937) > >>>> @@ -46,6 +46,7 @@ typedef struct __mcontext { > >>>> uint32_t mc_av[2]; > >>>> register_t mc_frame[42]; > >>>> uint64_t mc_fpreg[33]; > >>>> + uint64_t mc_vsxfpreg[32]; /* low-order half of VSR0-31 */ > >>>> } mcontext_t __aligned(16); > >>>> > >>>> #if defined(_KERNEL) && defined(__powerpc64__) > >>>> @@ -60,6 +61,7 @@ typedef struct __mcontext32 { > >>>> uint32_t mc_av[2]; > >>>> uint32_t mc_frame[42]; > >>>> uint64_t mc_fpreg[33]; > >>>> + uint64_t mc_vsxfpreg[32]; /* low-order half of VSR0-31 */ > >>>> } mcontext32_t __aligned(16); > >>>> #endif > >>> It looks as if you broken the ABI compatibility by the change. Am I wrong ? > >>> > >> That is correct. It's a tier-2 platform and -CURRENT, so I'm not sure > >> it's worth the compatibility shims. I'm happy to add them if you think > >> otherwise. > > You are main maintainer of PowerPC port, IMO, so it is your decision. > > > > Note that 'this is current' argument is not applicable, since the change > > also breaks stable/* binaries. > > > > I do understand the argument of PowerPC being tier 2 architecture, but this > > makes me sad. Anyway, it is yours. For x86, I have to introduce > > getcontextx(3) mechanism. > > > This is a good point. I'll try to fix it. Is my understanding of how > this works correct? > > 1. Provide a sysarch() for the extended FPU state. > 2. Implement getcontextx() in the C library to fill extra properties if > required. > 3. Store state for signal trampoline in variable-sized stack area 4. Implement __getcontextx_size() and __fillcontextx2() for use in the deferred signal delivery while libthr is in critical section, see lib/libthr/thread/thr_sig.c:check_deferred_signal(). > > Implementation of (2) seems to rely on having spare members in ucontext, > which PowerPC unfortunately does not have. Is there a way around that? Indeed, this is very unfortunate. My concern is that typical application allocating ucontext_t on stack or by mallocing it, would get silent memory corruption after the extension of mcontext_t. It seems indeed that ABI breakage cannot be completely avoided, but it could be significantly reduced IMO. Is it true that mc_avec is only valid when _MC_AV_VALID bit is set ? If yes, we can introduce another mcontext flag, say _MC_XSTATE_VALID, which is mutually exclusive with the _MC_AC_VALID. The new flag indicates that there is external data, and the data is pointed to by some word placed in the previous mc_avec file, say mc_avec[0]. The altivec registers file content is moved into that external data area as well. Providing the external area size in mc_avec[1] allows to extend that block in the future-compatible manner. This way, applications which use ucontext_t and which are not aware about VSX, get the expected behaviour, possibly without seeing altivec. I.e. in typical case, we do not get random memory corruption. Meantime, I have a question. I looked at the powerpc/include/ucontex.h and tried to match it with the PowerISA specs 2.06 and 2.07. From what I understand, mc_fpreg corresponds to the floating-point registers file, mc_avec and mc_av to the 'Vector Facility Registers'. But I fail to see what would match the + uint64_t mc_vsxfpreg[32]; /* low-order half of VSR0-31 */ file. The 7.2.1 Vector-Scalar Registers says 'Sixty-four 128-bit VSRs are provided'.