Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 13 Mar 2015 10:47:02 +0200
From:      Konstantin Belousov <kostikbel@gmail.com>
To:        Nathan Whitehorn <nwhitehorn@freebsd.org>
Cc:        svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org
Subject:   Re: svn commit: r279937 - in head/sys/powerpc: include powerpc
Message-ID:  <20150313084702.GV2379@kib.kiev.ua>
In-Reply-To: <5502094D.5090001@freebsd.org>
References:  <201503122115.t2CLFdmi026986@svn.freebsd.org> <20150312212234.GS2379@kib.kiev.ua> <55020547.7050102@freebsd.org> <20150312213530.GT2379@kib.kiev.ua> <5502094D.5090001@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
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'.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20150313084702.GV2379>