Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 25 Jul 2006 03:58:06 +0200
From:      Tijl Coosemans <tijl@ulyssis.org>
To:        freebsd-emulation@freebsd.org, Daniel Eischen <deischen@freebsd.org>
Cc:        freebsd-hackers@freebsd.org, Michael Nottebrock <lofi@freebsd.org>
Subject:   Re: WINE vs. FreeBSD
Message-ID:  <200607250358.21457.tijl@ulyssis.org>
In-Reply-To: <Pine.GSO.4.64.0607241247110.14045@sea.ntplx.net>
References:  <200607221914.15826.lofi@freebsd.org> <200607241839.28229.tijl@ulyssis.org> <Pine.GSO.4.64.0607241247110.14045@sea.ntplx.net>

next in thread | previous in thread | raw e-mail | index | archive | help
--nextPart2198738.aAC9hlQsmE
Content-Type: text/plain;
  charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

On Monday 24 July 2006 18:49, Daniel Eischen wrote:
> On Mon, 24 Jul 2006, Tijl Coosemans wrote:
> > On Monday 24 July 2006 17:39, Daniel Eischen wrote:
> >> On Mon, 24 Jul 2006, Tijl Coosemans wrote:
> >>> I've attached two patches that accomplish this, but this seems to
> >>> trigger other problems, so use at your own risk. If you want to
> >>> try them, place them in the port's files/ directory and add a
> >>> line containing "USE_AUTOTOOLS=3D autoconf:259" to the Makefile.
> >>> This seems to break wine+libpthread, so I've also changed the
> >>> port to use libthr instead.
> >>>
> >>> For the libpthread experts, I haven't investigated that much
> >>> further yet, but libpthread seems to fail in create_stack() from
> >>> _pthread_create() from _thr_start_sig_daemon().
> >>
> >> See my response to this in a previous reply to this thread.=20
> >> libthr and libpthread use LDT's for TLS.  WINE is stomping on them
> >> because it doesn't properly create LDTs.  This is not a problem
> >> with either of the thread libraries and this issue has been known
> >> ever since we implemented TLS years ago.
> >
> > And as I stated later on in that thread, I don't see where
> > libpthread and libthr still use LDT entries. As far as I understand
> > the code, instead of using an LDT entry per thread (as it sure used
> > to be), only one single GDT entry is used whose base address is
> > updated during a context switch. Looking at the cvs history, it has
> > been working like this since a couple commits of Peter Wemm about a
> > year ago.
> >
> > And if nothing but Wine uses the LDT, Wine's static allocation of
> > LDT entries can't be the problem.
>
> Look, we use %gs for TLS, period.  Go see
> libpthread/arch/i386/i386/pthread_md.c for how libpthread does it.=20
> TLS would not work without setting aside a register for the threads
> library (and rtld) to use.

Aaarrrrgghhh :)

What you say is true of course, but %gs points to a GDT entry, not LDT.=20
libpthread and libthr no longer use LDT entries...

There would be a problem of course if Wine or Windows programs=20
change %gs. Wine does seem to touch %gs but I've never actually seen it=20
change. It's always 0x001B, which is the correct value (GUGS_SEL).

However, Wine/Windows uses %fs for TLS and it appears that the FreeBSD=20
kernel doesn't preserve it. It always ends up pointing to GUDATA_SEL.

--nextPart2198738.aAC9hlQsmE
Content-Type: application/pgp-signature

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.4 (FreeBSD)

iD8DBQBExXq9dMR2xnarec8RAqulAJ4yxbyI98xm5NNR435SSjVRexBPGQCePcQC
2CrH4OPfAvSy7sojjFCyfg8=
=hOSN
-----END PGP SIGNATURE-----

--nextPart2198738.aAC9hlQsmE--



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