Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 3 Apr 2004 08:59:29 +0100
From:      Doug Rabson <dfr@nlsystems.com>
To:        Julian Elischer <julian@elischer.org>
Cc:        threads@freebsd.org
Subject:   Re: PERFORCE change 50188 for review
Message-ID:  <200404030859.29886.dfr@nlsystems.com>
In-Reply-To: <406DC12E.5060404@elischer.org>
References:  <200404021443.i32EhAP9009274@repoman.freebsd.org> <200404021957.02922.dfr@nlsystems.com> <406DC12E.5060404@elischer.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Friday 02 April 2004 20:38, Julian Elischer wrote:
> 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.
>

Yes.

>
> 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.

It is not true that the GNU model can only work for 1:1 threading. I can 
think of at least two ways of arranging for %gs:0==%gs without adding 
significant overhead to the userland thread switch code and without 
using syscalls in the common path.

>
> 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.

This might work, e.g. if we pre-allocate a per-cpu GDT entry for this 
purpose and this special trap merely changes the base address of this 
pre-initialised GDT.

I've just taken a look at the latest binutils cvs and gas does not have 
any support for the relocations required for the Sun abi (e.g. 
x@DTLNDX, x@TLSPLT). Given that the code relaxation optimisations which 
are to be performed by the linker are much trickier for the Sun abi, I 
doubt that ld supports it either. Lets just look at the pros and cons 
here:

Sun ABI

Pros					Cons

Works with todays libpthread		We would need to branch binutils and
					maintain that branch forever

					Code size and speed are poor

					We would be using a mode of the compiler
					which no-one else really cares about

GNU ABI

Pros					Cons

Supported by binutils and gcc today	We have to add ~5 lines of code to
					the userland thread switch
Small and fast code - easy to optimise
at link time

Everyone else using gnu tools uses
this mode so its well maintained



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