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

Reply via email to