Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 02 Apr 2004 11:38:22 -0800
From:      Julian Elischer <julian@elischer.org>
To:        Doug Rabson <dfr@nlsystems.com>, Daniel Eischen <deischen@freebsd.org>, threads@freebsd.org, Peter Wemm <peter@wemm.org>, Marcel Moolenaar <marcel@xcllnt.net>
Subject:   Re: PERFORCE change 50188 for review
Message-ID:  <406DC12E.5060404@elischer.org>
In-Reply-To: <200404021957.02922.dfr@nlsystems.com>
References:  <200404021443.i32EhAP9009274@repoman.freebsd.org> <1080926920.4652.1.camel@builder02.qubesoft.com> <406DB178.2000205@elischer.org> <200404021957.02922.dfr@nlsystems.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Doug Rabson wrote:
> On Friday 02 April 2004 19:31, Julian Elischer wrote:
> 
>>Doug Rabson wrote:
>>
>>>On Fri, 2004-04-02 at 17:47, Julian Elischer wrote:
>>>
>>>>And the crowd goes wild...
>>>
>>>I'm not convinced that rtld is quite right yet. In particular,
>>>stuff like:
>>>	int __thread x[10];
>>>	&x[5];
>>>
>>>is probably broken.
>>>
>>>FWIW, our binutils doen't support the Sun abi at all...
>>
>>hmmm I wonder if it's planned or if we have to do it..
> 
> 
> Personally, I don't see the point. The GNU abi is smaller and faster and 
> will be better maintained by the gnu people over time. There isn't any 
> choice for any of the other platforms, including amd64 (which uses a 
> gnu-style abi with %fs:0 == %fs).

So we are screwed for amd64 basically.


But the reason the sun ABI axists is because on a PC using %gs as a segment 
register for thread identification, you cannot use the GNU model unless you
are using 1:1 threads.  You need to be able to change the place the pointer
points from userland. Obviously this requires a syscall as changing a [gl]dt
entry can not be done by a user process. This means that every context switch 
would require a syscall which defeats the entire point of using M:N threads.

The SUN API allows the destination of the %gs:0 to be changes at runtime by
the user this allowing the UTS to switch threads "on the fly" without
going back to the kernel.

Processors that have a "thread pointer" register are ok because the UTS
can just change it whenever it switches threads. Unfortunatly the X86
requires that we use a priviledged operation.
The only thing I can see as a possibility is if we make a special trap
into the kernel (bypassing all the normal syscall code)
that takes a single register as an argument and puts it into the
segment register descriptor pointed to by %gs after checking it VERY quickly,
and returns.. it may be possible to get in and out of the kernel quick enough 
that we don't lose performance.

-- 
+------------------------------------+       ______ _  __
|   __--_|\  Julian Elischer         |       \     U \/ / hard at work in
|  /       \ julian@elischer.org     +------>x   USA    \ a very strange
| (   OZ    )                                \___   ___ | country !
+- X_.---._/    presently in San Francisco       \_/   \\
           v



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