Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 30 Aug 2008 21:38:04 +0300
From:      Kostik Belousov <kostikbel@gmail.com>
To:        Artem Belevich <fbsdlist@src.cx>
Cc:        Bernd Walter <ticso@cicely7.cicely.de>, freebsd-current@freebsd.org
Subject:   Re: __tls_get_addr problem with recent current
Message-ID:  <20080830183804.GG2038@deviant.kiev.zoral.com.ua>
In-Reply-To: <ed91d4a80808300946s49ff076dw64b57f8e9058f2d@mail.gmail.com>
References:  <ed91d4a80808300946s49ff076dw64b57f8e9058f2d@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help

--oxour8c+zPVguRmP
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Sat, Aug 30, 2008 at 09:46:05AM -0700, Artem Belevich wrote:
> Hi,
>=20
> Did someone figure out what was/is causing this problem? I believe
> I've ran into the same issue on a freshly built (Aug 29th) RELENG_7 on
> amd64 (Q9450 w/ 8GB RAM).
>=20
> What's strange is that in my case the problem pops up when I run
> 32-bit binaries from RELENG_6. Otherwise the system is stable. I can
> buildworld continuously with -j8 without any problems. However, when I
> try to build my code using hacked make from FreeBSD6/i386 things start
> falling apart. All of a sudden I get cores from FreeBSD7/amd64
> binaries. All of them, as far as I can tell crash in __tls_get_addr.
> So far I've been unable to reproduce the crashes in any other
> scenarios, but I'm still trying.
>=20
> Interestingly enough, crash always occurs on "mov    %fs:0x0,%rdi" instru=
ction,
> yet the same code in the same binaries works fine when binaries are used
> without mixing amd64/i386 binaries. Could that be that amd64 might
> somehow inherit invalid registers from i386 binaries?
Quite possible, almost sure. Could you, please, check whether the
change below would fix it for you ?

diff --git a/sys/amd64/amd64/cpu_switch.S b/sys/amd64/amd64/cpu_switch.S
index f34b0cc..9e13ef4 100644
--- a/sys/amd64/amd64/cpu_switch.S
+++ b/sys/amd64/amd64/cpu_switch.S
@@ -265,6 +265,10 @@ load_seg:
 	movl	PCB_DS(%r8),%ds
 	movl	PCB_ES(%r8),%es
 	movl	PCB_FS(%r8),%fs
+	movl	$MSR_FSBASE,%ecx
+	rdmsr
+	shlq	$32,%rdx
+	leaq	(%rax,%rdx),%r9
 	jmp	done_load_seg
 	/* Restore userland %gs while preserving kernel gsbase */
 2:	movq	PCB_GS32P(%r8),%rax

--oxour8c+zPVguRmP
Content-Type: application/pgp-signature
Content-Disposition: inline

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

iEYEARECAAYFAki5k4sACgkQC3+MBN1Mb4hoSgCgupiq1FYy9tJuBus5if45ii6x
I88An19RL81V4ATFPwUyDHRqSPv7yKk6
=2b+R
-----END PGP SIGNATURE-----

--oxour8c+zPVguRmP--



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