svn commit: r279937 - in head/sys/powerpc: include powerpc

Nathan Whitehorn nwhitehorn at freebsd.org
Fri Mar 13 17:06:13 UTC 2015



On 03/13/15 01:47, Konstantin Belousov wrote:
> 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.

One more thing I'd appreciate advice on: we have a much worse ABI issue 
with setjmp(). On 32-bit systems, _JBLEN is too small to hold all the 
nonvolatile vector registers. Do you have any ideas how to handle that?
-Nathan


More information about the svn-src-all mailing list