Author: aurel32 Date: 2011-06-12 10:39:31 +0000 (Sun, 12 Jun 2011) New Revision: 4732
Added: glibc-package/trunk/debian/patches/sparc/cvs-ifunc1.diff glibc-package/trunk/debian/patches/sparc/submitted-ifunc2.diff Modified: glibc-package/trunk/debian/changelog glibc-package/trunk/debian/patches/series glibc-package/trunk/debian/sysdeps/sparc.mk Log: * Add patches/sparc/cvs-ifunc1.diff and patches/sparc/submitted-ifunc2.diff to fix multi-arch support on sparc. Update sysdeps/sparc.mk and sysdeps/sparc64.mk to re-enable multi-arch support on sparc and sparc64. Closes: #625607. Modified: glibc-package/trunk/debian/changelog =================================================================== --- glibc-package/trunk/debian/changelog 2011-06-11 21:20:08 UTC (rev 4731) +++ glibc-package/trunk/debian/changelog 2011-06-12 10:39:31 UTC (rev 4732) @@ -1,11 +1,16 @@ eglibc (2.13-7) UNRELEASED; urgency=low + [ Aurelien Jarno ] * Update paths to the memcpy wrapper in NEWS.Debian.gz. Closes: #630138. * Fix preinst script wrt 3.0 kernel. Patch by Colin Watson. Closes: #630077. * debian/sysdeps/linux.mk: correctly check from multiarch asm/ include directory. + * Add patches/sparc/cvs-ifunc1.diff and patches/sparc/submitted-ifunc2.diff + to fix multi-arch support on sparc. Update sysdeps/sparc.mk and + sysdeps/sparc64.mk to re-enable multi-arch support on sparc and sparc64. + Closes: #625607. -- Aurelien Jarno <aure...@debian.org> Sat, 11 Jun 2011 18:11:51 +0200 Modified: glibc-package/trunk/debian/patches/series =================================================================== --- glibc-package/trunk/debian/patches/series 2011-06-11 21:20:08 UTC (rev 4731) +++ glibc-package/trunk/debian/patches/series 2011-06-12 10:39:31 UTC (rev 4732) @@ -176,6 +176,8 @@ sparc/local-sparcv9-target.diff sparc/submitted-timing.diff sparc/submitted-bzero.diff +sparc/cvs-ifunc1.diff +sparc/submitted-ifunc2.diff all/local-alias-UTF-8.diff all/local-alias-et_EE.diff Added: glibc-package/trunk/debian/patches/sparc/cvs-ifunc1.diff =================================================================== --- glibc-package/trunk/debian/patches/sparc/cvs-ifunc1.diff (rev 0) +++ glibc-package/trunk/debian/patches/sparc/cvs-ifunc1.diff 2011-06-12 10:39:31 UTC (rev 4732) @@ -0,0 +1,240 @@ +2011-06-07 David S. Miller <da...@davemloft.net> + + * sysdeps/sparc/sparc32/dl-irel.h (elf_irela): Pass dl_hwcap to + ifuncs. + * sysdeps/sparc/sparc32/dl-machine.h (elf_machine_rela, + elf_machine_lazy_rel): Likewise. + * sysdeps/sparc/sparc64/dl-irel.h (elf_irela): Likewise. + * sysdeps/sparc/sparc64/dl-machine.h (elf_machine_rela, + elf_machine_lazy_rel): Likewise. + * sysdeps/sparc/sparc64/multiarch/memcpy.S (memcpy): Fetch + dl_hwcap via passed in argument. + * sysdeps/sparc/sparc64/multiarch/memset.S (memset, bzero): + Likewise. + +diff --git a/sysdeps/sparc/sparc32/dl-irel.h b/sysdeps/sparc/sparc32/dl-irel.h +index 1891938..2753fb4 100644 +--- a/sysdeps/sparc/sparc32/dl-irel.h ++++ b/sysdeps/sparc/sparc32/dl-irel.h +@@ -24,6 +24,7 @@ + #include <stdio.h> + #include <unistd.h> + #include <dl-plt.h> ++#include <ldsodefs.h> + + #define ELF_MACHINE_IRELA 1 + +@@ -36,13 +37,13 @@ elf_irela (const Elf32_Rela *reloc) + if (__builtin_expect (r_type == R_SPARC_IRELATIVE, 1)) + { + Elf32_Addr *const reloc_addr = (void *) reloc->r_offset; +- Elf32_Addr value = ((Elf32_Addr (*) (void)) reloc->r_addend) (); ++ Elf32_Addr value = ((Elf32_Addr (*) (int)) reloc->r_addend) (GLRO(dl_hwcap)); + *reloc_addr = value; + } + else if (__builtin_expect (r_type == R_SPARC_JMP_IREL, 1)) + { + Elf32_Addr *const reloc_addr = (void *) reloc->r_offset; +- Elf32_Addr value = ((Elf32_Addr (*) (void)) reloc->r_addend) (); ++ Elf32_Addr value = ((Elf32_Addr (*) (int)) reloc->r_addend) (GLRO(dl_hwcap)); + + sparc_fixup_plt (reloc, reloc_addr, value, 0, 1); + } +diff --git a/sysdeps/sparc/sparc32/dl-machine.h b/sysdeps/sparc/sparc32/dl-machine.h +index 9631db3..f8e8fe4 100644 +--- a/sysdeps/sparc/sparc32/dl-machine.h ++++ b/sysdeps/sparc/sparc32/dl-machine.h +@@ -399,7 +399,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, + && __builtin_expect (ELFW(ST_TYPE) (sym->st_info) == STT_GNU_IFUNC, 0) + && __builtin_expect (sym->st_shndx != SHN_UNDEF, 1)) + { +- value = ((Elf32_Addr (*) (void)) value) (); ++ value = ((Elf32_Addr (*) (int)) value) (GLRO(dl_hwcap)); + } + + switch (r_type) +@@ -430,11 +430,11 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, + *reloc_addr = value; + break; + case R_SPARC_IRELATIVE: +- value = ((Elf32_Addr (*) (void)) value) (); ++ value = ((Elf32_Addr (*) (int)) value) (GLRO(dl_hwcap)); + *reloc_addr = value; + break; + case R_SPARC_JMP_IREL: +- value = ((Elf32_Addr (*) (void)) value) (); ++ value = ((Elf32_Addr (*) (int)) value) (GLRO(dl_hwcap)); + /* Fall thru */ + case R_SPARC_JMP_SLOT: + { +@@ -562,7 +562,7 @@ elf_machine_lazy_rel (struct link_map *map, + else if (r_type == R_SPARC_JMP_IREL) + { + Elf32_Addr value = map->l_addr + reloc->r_addend; +- value = ((Elf32_Addr (*) (void)) value) (); ++ value = ((Elf32_Addr (*) (int)) value) (GLRO(dl_hwcap)); + sparc_fixup_plt (reloc, reloc_addr, value, 1, 1); + } + else if (r_type == R_SPARC_NONE) +diff --git a/sysdeps/sparc/sparc64/dl-irel.h b/sysdeps/sparc/sparc64/dl-irel.h +index 1a2a0a3..0d70e2a 100644 +--- a/sysdeps/sparc/sparc64/dl-irel.h ++++ b/sysdeps/sparc/sparc64/dl-irel.h +@@ -24,6 +24,7 @@ + #include <stdio.h> + #include <unistd.h> + #include <dl-plt.h> ++#include <ldsodefs.h> + + #define ELF_MACHINE_IRELA 1 + +@@ -36,13 +37,13 @@ elf_irela (const Elf64_Rela *reloc) + if (__builtin_expect (r_type == R_SPARC_IRELATIVE, 1)) + { + Elf64_Addr *const reloc_addr = (void *) reloc->r_offset; +- Elf64_Addr value = ((Elf64_Addr (*) (void)) reloc->r_addend) (); ++ Elf64_Addr value = ((Elf64_Addr (*) (int)) reloc->r_addend) (GLRO(dl_hwcap)); + *reloc_addr = value; + } + else if (__builtin_expect (r_type == R_SPARC_JMP_IREL, 1)) + { + Elf64_Addr *const reloc_addr = (void *) reloc->r_offset; +- Elf64_Addr value = ((Elf64_Addr (*) (void)) reloc->r_addend) (); ++ Elf64_Addr value = ((Elf64_Addr (*) (int)) reloc->r_addend) (GLRO(dl_hwcap)); + struct link_map map = { .l_addr = 0 }; + + /* 'high' is always zero, for large PLT entries the linker +diff --git a/sysdeps/sparc/sparc64/dl-machine.h b/sysdeps/sparc/sparc64/dl-machine.h +index 82ab5a4..aaa22d6 100644 +--- a/sysdeps/sparc/sparc64/dl-machine.h ++++ b/sysdeps/sparc/sparc64/dl-machine.h +@@ -430,7 +430,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc, + if (sym != NULL + && __builtin_expect (ELFW(ST_TYPE) (sym->st_info) == STT_GNU_IFUNC, 0) + && __builtin_expect (sym->st_shndx != SHN_UNDEF, 1)) +- value = ((Elf64_Addr (*) (void)) value) (); ++ value = ((Elf64_Addr (*) (int)) value) (GLRO(dl_hwcap)); + + switch (r_type) + { +@@ -460,11 +460,11 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc, + *reloc_addr = value; + break; + case R_SPARC_IRELATIVE: +- value = ((Elf64_Addr (*) (void)) value) (); ++ value = ((Elf64_Addr (*) (int)) value) (GLRO(dl_hwcap)); + *reloc_addr = value; + break; + case R_SPARC_JMP_IREL: +- value = ((Elf64_Addr (*) (void)) value) (); ++ value = ((Elf64_Addr (*) (int)) value) (GLRO(dl_hwcap)); + /* Fall thru */ + case R_SPARC_JMP_SLOT: + #ifdef RESOLVE_CONFLICT_FIND_MAP +@@ -658,7 +658,7 @@ elf_machine_lazy_rel (struct link_map *map, + || r_type == R_SPARC_IRELATIVE) + { + Elf64_Addr value = map->l_addr + reloc->r_addend; +- value = ((Elf64_Addr (*) (void)) value) (); ++ value = ((Elf64_Addr (*) (int)) value) (GLRO(dl_hwcap)); + if (r_type == R_SPARC_JMP_IREL) + { + /* 'high' is always zero, for large PLT entries the linker +diff --git a/sysdeps/sparc/sparc64/multiarch/memcpy.S b/sysdeps/sparc/sparc64/multiarch/memcpy.S +index a708de1..c12dc3b 100644 +--- a/sysdeps/sparc/sparc64/multiarch/memcpy.S ++++ b/sysdeps/sparc/sparc64/multiarch/memcpy.S +@@ -32,26 +32,10 @@ ENTRY(memcpy) + or %o3, %lo(_GLOBAL_OFFSET_TABLE_+4), %o3 + 1: add %o7, %o3, %o3 + mov %o5, %o7 +- sethi %hi(_rtld_global_ro), %o2 +- or %o2, %lo(_rtld_global_ro), %o2 +-# ifdef __arch64__ +- ldx [%o3 + %o2], %o2 +- ldx [%o2 + RTLD_GLOBAL_RO_DL_HWCAP_OFFSET], %o2 +-# else +- ld [%o3 + %o2], %o2 +- ld [%o2 + RTLD_GLOBAL_RO_DL_HWCAP_OFFSET + 4], %o2 +-# endif +-# else +- set _dl_hwcap, %o3 +-# ifdef __arch64__ +- ldx [%o3], %o2 +-# else +- ld [%o3 + 4], %o2 +-# endif + # endif +- andcc %o2, 0x80, %g0 ! HWCAP_SPARC_N2 ++ andcc %o0, 0x80, %g0 ! HWCAP_SPARC_N2 + be 1f +- andcc %o2, 0x40, %g0 ! HWCAP_SPARC_BLKINIT ++ andcc %o0, 0x40, %g0 ! HWCAP_SPARC_BLKINIT + # ifdef SHARED + sethi %gdop_hix22(__memcpy_niagara2), %o1 + xor %o1, %gdop_lox10(__memcpy_niagara2), %o1 +@@ -61,7 +45,7 @@ ENTRY(memcpy) + ba 10f + nop + 1: be 1f +- andcc %o2, 0x20, %g0 ! HWCAP_SPARC_ULTRA3 ++ andcc %o0, 0x20, %g0 ! HWCAP_SPARC_ULTRA3 + # ifdef SHARED + sethi %gdop_hix22(__memcpy_niagara1), %o1 + xor %o1, %gdop_lox10(__memcpy_niagara1), %o1 +diff --git a/sysdeps/sparc/sparc64/multiarch/memset.S b/sysdeps/sparc/sparc64/multiarch/memset.S +index befd7ed..2e27448 100644 +--- a/sysdeps/sparc/sparc64/multiarch/memset.S ++++ b/sysdeps/sparc/sparc64/multiarch/memset.S +@@ -32,24 +32,8 @@ ENTRY(memset) + or %o3, %lo(_GLOBAL_OFFSET_TABLE_+4), %o3 + 1: add %o7, %o3, %o3 + mov %o5, %o7 +- sethi %hi(_rtld_global_ro), %o2 +- or %o2, %lo(_rtld_global_ro), %o2 +-# ifdef __arch64__ +- ldx [%o3 + %o2], %o2 +- ldx [%o2 + RTLD_GLOBAL_RO_DL_HWCAP_OFFSET], %o2 +-# else +- ld [%o3 + %o2], %o2 +- ld [%o2 + RTLD_GLOBAL_RO_DL_HWCAP_OFFSET + 4], %o2 +-# endif +-# else +- set _dl_hwcap, %o3 +-# ifdef __arch64__ +- ldx [%o3], %o2 +-# else +- ld [%o3 + 4], %o2 +-# endif + # endif +- andcc %o2, 0x40, %g0 ! HWCAP_SPARC_BLKINIT ++ andcc %o0, 0x40, %g0 ! HWCAP_SPARC_BLKINIT + be 9f + nop + # ifdef SHARED +@@ -84,24 +68,8 @@ ENTRY(__bzero) + or %o3, %lo(_GLOBAL_OFFSET_TABLE_+4), %o3 + 1: add %o7, %o3, %o3 + mov %o5, %o7 +- sethi %hi(_rtld_global_ro), %o2 +- or %o2, %lo(_rtld_global_ro), %o2 +-# ifdef __arch64__ +- ldx [%o3 + %o2], %o2 +- ldx [%o2 + RTLD_GLOBAL_RO_DL_HWCAP_OFFSET], %o2 +-# else +- ld [%o3 + %o2], %o2 +- ld [%o2 + RTLD_GLOBAL_RO_DL_HWCAP_OFFSET + 4], %o2 +-# endif +-# else +- set _dl_hwcap, %o3 +-# ifdef __arch64__ +- ldx [%o3], %o2 +-# else +- ld [%o3 + 4], %o2 +-# endif + # endif +- andcc %o2, 0x40, %g0 ! HWCAP_SPARC_BLKINIT ++ andcc %o0, 0x40, %g0 ! HWCAP_SPARC_BLKINIT + be 9f + nop + # ifdef SHARED Added: glibc-package/trunk/debian/patches/sparc/submitted-ifunc2.diff =================================================================== --- glibc-package/trunk/debian/patches/sparc/submitted-ifunc2.diff (rev 0) +++ glibc-package/trunk/debian/patches/sparc/submitted-ifunc2.diff 2011-06-12 10:39:31 UTC (rev 4732) @@ -0,0 +1,56 @@ +2011-06-11 Aurelien Jarno <aurel...@aurel32.net> + + * elf/dl-runtime.c(_dl_fixup,_dl_profile_fixup): Pass dl_hwcap to i + funcs. + * elf/dl-sym.c(do_sym): Likewise. + +diff --git a/elf/dl-runtime.c b/elf/dl-runtime.c +index b27cfbf..f48702b 100644 +--- a/elf/dl-runtime.c ++++ b/elf/dl-runtime.c +@@ -146,7 +146,8 @@ _dl_fixup ( + + if (sym != NULL + && __builtin_expect (ELFW(ST_TYPE) (sym->st_info) == STT_GNU_IFUNC, 0)) +- value = ((DL_FIXUP_VALUE_TYPE (*) (void)) DL_FIXUP_VALUE_ADDR (value)) (); ++ value = ((DL_FIXUP_VALUE_TYPE (*) (int)) ++ DL_FIXUP_VALUE_ADDR (value)) (GLRO(dl_hwcap)); + + /* Finally, fix up the plt itself. */ + if (__builtin_expect (GLRO(dl_bind_not), 0)) +@@ -235,8 +236,8 @@ _dl_profile_fixup ( + if (defsym != NULL + && __builtin_expect (ELFW(ST_TYPE) (defsym->st_info) + == STT_GNU_IFUNC, 0)) +- value = ((DL_FIXUP_VALUE_TYPE (*) (void)) +- DL_FIXUP_VALUE_ADDR (value)) (); ++ value = ((DL_FIXUP_VALUE_TYPE (*) (int)) ++ DL_FIXUP_VALUE_ADDR (value)) (GLRO(dl_hwcap)); + } + else + { +@@ -246,8 +247,8 @@ _dl_profile_fixup ( + + if (__builtin_expect (ELFW(ST_TYPE) (refsym->st_info) + == STT_GNU_IFUNC, 0)) +- value = ((DL_FIXUP_VALUE_TYPE (*) (void)) +- DL_FIXUP_VALUE_ADDR (value)) (); ++ value = ((DL_FIXUP_VALUE_TYPE (*) (int)) ++ DL_FIXUP_VALUE_ADDR (value)) (GLRO(dl_hwcap)); + + result = l; + } +diff --git a/elf/dl-sym.c b/elf/dl-sym.c +index 4faf05c..de6d34a 100644 +--- a/elf/dl-sym.c ++++ b/elf/dl-sym.c +@@ -197,7 +197,8 @@ RTLD_NEXT used in code not dynamically loaded")); + DL_FIXUP_VALUE_TYPE fixup + = DL_FIXUP_MAKE_VALUE (result, (ElfW(Addr)) value); + fixup = +- ((DL_FIXUP_VALUE_TYPE (*) (void)) DL_FIXUP_VALUE_ADDR (fixup)) (); ++ ((DL_FIXUP_VALUE_TYPE (*) (int)) ++ DL_FIXUP_VALUE_ADDR (fixup)) (GLRO(dl_hwcap)); + value = (void *) DL_FIXUP_VALUE_CODE_ADDR (fixup); + } + Modified: glibc-package/trunk/debian/sysdeps/sparc.mk =================================================================== --- glibc-package/trunk/debian/sysdeps/sparc.mk 2011-06-11 21:20:08 UTC (rev 4731) +++ glibc-package/trunk/debian/sysdeps/sparc.mk 2011-06-12 10:39:31 UTC (rev 4732) @@ -1,4 +1,4 @@ -extra_config_options = --disable-multi-arch +extra_config_options = --enable-multi-arch # build 64-bit (sparc64) alternative library EGLIBC_PASSES += sparc64 -- To UNSUBSCRIBE, email to debian-glibc-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/e1qvi4q-0006xm...@vasks.debian.org