From owner-freebsd-ia64@FreeBSD.ORG Thu Mar 29 18:11:39 2012 Return-Path: Delivered-To: ia64@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E62A3106564A; Thu, 29 Mar 2012 18:11:39 +0000 (UTC) (envelope-from kostikbel@gmail.com) Received: from mail.zoral.com.ua (mx0.zoral.com.ua [91.193.166.200]) by mx1.freebsd.org (Postfix) with ESMTP id 722AE8FC17; Thu, 29 Mar 2012 18:11:39 +0000 (UTC) Received: from skuns.kiev.zoral.com.ua (localhost [127.0.0.1]) by mail.zoral.com.ua (8.14.2/8.14.2) with ESMTP id q2TIBS9B024164; Thu, 29 Mar 2012 21:11:28 +0300 (EEST) (envelope-from kostikbel@gmail.com) Received: from deviant.kiev.zoral.com.ua (kostik@localhost [127.0.0.1]) by deviant.kiev.zoral.com.ua (8.14.5/8.14.5) with ESMTP id q2TIBRms007641; Thu, 29 Mar 2012 21:11:27 +0300 (EEST) (envelope-from kostikbel@gmail.com) Received: (from kostik@localhost) by deviant.kiev.zoral.com.ua (8.14.5/8.14.5/Submit) id q2TIBRCk007640; Thu, 29 Mar 2012 21:11:27 +0300 (EEST) (envelope-from kostikbel@gmail.com) X-Authentication-Warning: deviant.kiev.zoral.com.ua: kostik set sender to kostikbel@gmail.com using -f Date: Thu, 29 Mar 2012 21:11:25 +0300 From: Konstantin Belousov To: ia64@freebsd.org Message-ID: <20120329181125.GB2358@deviant.kiev.zoral.com.ua> References: <201203291750.q2THo1Pu003875@svn.freebsd.org> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="KnD4IZsf9tI8pAcs" Content-Disposition: inline In-Reply-To: <201203291750.q2THo1Pu003875@svn.freebsd.org> User-Agent: Mutt/1.4.2.3i X-Virus-Scanned: clamav-milter 0.95.2 at skuns.kiev.zoral.com.ua X-Virus-Status: Clean X-Spam-Status: No, score=-4.0 required=5.0 tests=ALL_TRUSTED,AWL,BAYES_00 autolearn=ham version=3.2.5 X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on skuns.kiev.zoral.com.ua Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org Subject: Re: svn commit: r233674 - head/libexec/rtld-elf X-BeenThere: freebsd-ia64@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Porting FreeBSD to the IA-64 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 29 Mar 2012 18:11:40 -0000 --KnD4IZsf9tI8pAcs Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Thu, Mar 29, 2012 at 05:50:01PM +0000, Konstantin Belousov wrote: > Author: kib > Date: Thu Mar 29 17:50:01 2012 > New Revision: 233674 > URL: http://svn.freebsd.org/changeset/base/233674 >=20 > Log: > Fix ia64 build after r233655. > =20 > MFC after: 1 week >=20 > Modified: > head/libexec/rtld-elf/rtld.c >=20 > Modified: head/libexec/rtld-elf/rtld.c > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D > --- head/libexec/rtld-elf/rtld.c Thu Mar 29 17:39:18 2012 (r233673) > +++ head/libexec/rtld-elf/rtld.c Thu Mar 29 17:50:01 2012 (r233674) > @@ -2618,7 +2618,9 @@ do_dlsym(void *handle, const char *name, > const Elf_Sym *def; > SymLook req; > RtldLockState lockstate; > +#ifndef __ia64__ > tls_index ti; > +#endif > int res; > =20 > def =3D NULL; > @@ -2734,9 +2736,13 @@ do_dlsym(void *handle, const char *name, > else if (ELF_ST_TYPE(def->st_info) =3D=3D STT_GNU_IFUNC) > return (rtld_resolve_ifunc(defobj, def)); > else if (ELF_ST_TYPE(def->st_info) =3D=3D STT_TLS) { > +#ifdef __ia64__ > + return (__tls_get_addr(defobj->tlsindex, def->st_value)); > +#else > ti.ti_module =3D defobj->tlsindex; > ti.ti_offset =3D def->st_value; > return (__tls_get_addr(&ti)); > +#endif > } else > return (defobj->relocbase + def->st_value); > } While this band-aid fixes the build, the change is obviously bad. The reason to have this #ifdef is that ia64 is the only architecture that declares __tls_get_addr() as void *__tls_get_addr(unsigned long module, unsigned long offset); while all other architectures do typedef struct { unsigned long ti_module; unsigned long ti_offset; } tls_index; void *__tls_get_addr(tls_index *ti); But e.g. on amd64 the ABI of both declarations is the same. From my cursory look at ia64 ABI document, the same hold for ia64. Can anybody with ia64 clue and test machine confirm that the following works, i.e. ABI is not broken ? diff --git a/libexec/rtld-elf/ia64/reloc.c b/libexec/rtld-elf/ia64/reloc.c index 01e20b8..31319f3 100644 --- a/libexec/rtld-elf/ia64/reloc.c +++ b/libexec/rtld-elf/ia64/reloc.c @@ -650,9 +650,9 @@ allocate_initial_tls(Obj_Entry *list) __asm __volatile("mov r13 =3D %0" :: "r"(tpval)); } =20 -void *__tls_get_addr(unsigned long module, unsigned long offset) +void *__tls_get_addr(tls_index *ti) { register Elf_Addr** tp __asm__("r13"); =20 - return tls_get_addr_common(tp, module, offset); + return tls_get_addr_common(tp, ti->ti_module, ti->ti_offset); } diff --git a/libexec/rtld-elf/ia64/rtld_machdep.h b/libexec/rtld-elf/ia64/r= tld_machdep.h index 4a68ff7..df877f2 100644 --- a/libexec/rtld-elf/ia64/rtld_machdep.h +++ b/libexec/rtld-elf/ia64/rtld_machdep.h @@ -64,7 +64,12 @@ void call_init_pointer(const struct Struct_Obj_Entry *, = Elf_Addr); round(prev_offset + prev_size, align) #define calculate_tls_end(off, size) ((off) + (size)) =20 -extern void *__tls_get_addr(unsigned long module, unsigned long offset); +typedef struct { + unsigned long ti_module; + unsigned long ti_offset; +} tls_index; + +extern void *__tls_get_addr(tls_index *ti); =20 #define RTLD_DEFAULT_STACK_PF_EXEC 0 #define RTLD_DEFAULT_STACK_EXEC 0 diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c index d3ce3c6..828b8b4 100644 --- a/libexec/rtld-elf/rtld.c +++ b/libexec/rtld-elf/rtld.c @@ -2618,9 +2618,7 @@ do_dlsym(void *handle, const char *name, void *retadd= r, const Ver_Entry *ve, const Elf_Sym *def; SymLook req; RtldLockState lockstate; -#ifndef __ia64__ tls_index ti; -#endif int res; =20 def =3D NULL; @@ -2736,13 +2734,9 @@ do_dlsym(void *handle, const char *name, void *retad= dr, const Ver_Entry *ve, else if (ELF_ST_TYPE(def->st_info) =3D=3D STT_GNU_IFUNC) return (rtld_resolve_ifunc(defobj, def)); else if (ELF_ST_TYPE(def->st_info) =3D=3D STT_TLS) { -#ifdef __ia64__ - return (__tls_get_addr(defobj->tlsindex, def->st_value)); -#else ti.ti_module =3D defobj->tlsindex; ti.ti_offset =3D def->st_value; return (__tls_get_addr(&ti)); -#endif } else return (defobj->relocbase + def->st_value); } --KnD4IZsf9tI8pAcs Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (FreeBSD) iEYEARECAAYFAk90pc0ACgkQC3+MBN1Mb4hLOACfSfBauPd73ygp1fcTnFb34vqP IIwAoJu0N/Q2SpTTCwQBxvuddEF6WoX4 =blHj -----END PGP SIGNATURE----- --KnD4IZsf9tI8pAcs--