[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

r2492 - in glibc-package/trunk/debian: . patches patches/any



Author: aurel32
Date: 2007-08-01 06:04:08 +0000 (Wed, 01 Aug 2007)
New Revision: 2492

Removed:
   glibc-package/trunk/debian/patches/any/cvs-glibc-2_6-branch.diff
Modified:
   glibc-package/trunk/debian/changelog
   glibc-package/trunk/debian/patches/series
Log:
  * Remove any/cvs-glibc-2_6-branch.diff (merged upstream).



Modified: glibc-package/trunk/debian/changelog
===================================================================
--- glibc-package/trunk/debian/changelog	2007-08-01 06:01:55 UTC (rev 2491)
+++ glibc-package/trunk/debian/changelog	2007-08-01 06:04:08 UTC (rev 2492)
@@ -4,8 +4,9 @@
 
   [ Aurelien Jarno ]
   * debian/copyright: update.
+  * Remove any/cvs-glibc-2_6-branch.diff (merged upstream).
 
- -- Aurelien Jarno <aurel32@debian.org>  Wed, 01 Aug 2007 07:59:35 +0200
+ -- Aurelien Jarno <aurel32@debian.org>  Wed, 01 Aug 2007 08:03:16 +0200
 
 glibc (2.6-5) unstable; urgency=low
 

Deleted: glibc-package/trunk/debian/patches/any/cvs-glibc-2_6-branch.diff
===================================================================
--- glibc-package/trunk/debian/patches/any/cvs-glibc-2_6-branch.diff	2007-08-01 06:01:55 UTC (rev 2491)
+++ glibc-package/trunk/debian/patches/any/cvs-glibc-2_6-branch.diff	2007-08-01 06:04:08 UTC (rev 2492)
@@ -1,4785 +0,0 @@
---- glibc-2.6.orig/ChangeLog
-+++ glibc-2.6/ChangeLog
-@@ -1,3 +1,242 @@
-+2007-06-04  Jakub Jelinek  <jakub@redhat.com>
-+
-+	* math/test-misc.c (main): Don't run last batch of tests with
-+	IBM long double format.
-+
-+2007-07-07  Ulrich Drepper  <drepper@redhat.com>
-+
-+	[BZ #4745]
-+	* stdio-common/vfscanf.c (_IO_vfscanf): Add additional test for EOF
-+	in loop to look for conversion specifier to avoid testing of
-+	wrong errno value.
-+	* stdio-common/Makefile (tests): Add bug18, bug18a, bug19, bug19a.
-+	* stdio-common/bug18.c: New file.
-+	* stdio-common/bug18a.c: New file.
-+	* stdio-common/bug19.c: New file.
-+	* stdio-common/bug19a.c: New file.
-+
-+2007-06-06  Jakub Jelinek  <jakub@redhat.com>
-+
-+	[BZ #4586]
-+	* sysdeps/i386/ldbl2mpn.c (__mpn_extract_long_double): Treat
-+	pseudo-zeros as zero.
-+	* sysdeps/x86_64/ldbl2mpn.c: New file.
-+	* sysdeps/ia64/ldbl2mpn.c: New file.
-+
-+2007-07-01  Jakub Jelinek  <jakub@redhat.com>
-+
-+	* elf/dl-sysdep.c (_dl_important_hwcaps): Add integer overflow check.
-+	* elf/dl-minimal.c (__libc_memalign): Likewise.  Handle malloc (0).
-+	Return NULL if mmap failed instead of asserting it does not.
-+	(calloc): Check for integer overflow.
-+
-+	* elf/dl-minimal.c (__strtoul_internal): Fix parsing of numbers bigger
-+	than LONG_MAX / 10.
-+
-+2007-07-03  Jakub Jelinek  <jakub@redhat.com>
-+
-+	[BZ #4702]
-+	* nis/nss-default.c: Include errno.h.
-+	(init): Preserve errno.
-+
-+2007-06-19  Ulrich Drepper  <drepper@redhat.com>
-+
-+	* sysdeps/generic/ldsodefs.h (rtld_global): Reorder some elements
-+	to fill in holes
-+	(rtld_global_ro): Likewise.
-+
-+2007-06-18  Jakub Jelinek  <jakub@redhat.com>
-+
-+	* elf/dl-addr.c (_dl_addr): Skip PT_LOAD checking if l_contiguous.
-+	Move PT_LOAD checking to...
-+	(_dl_addr_inside_object): ... here, new function.
-+	* elf/dl-sym.c (do_sym): If not l_contiguous,
-+	call _dl_addr_inside_object.
-+	* elf/dl-iteratephdr.c (__dl_iterate_phdr): Likewise.
-+	* dlfcn/dlinfo.c (dlinfo_doit): Likewise.
-+	* elf/dl-open.c (dl_open_worker): Likewise.
-+	(_dl_addr_inside_object): New function if IS_IN_rtld.
-+	* elf/dl-load.c (_dl_map_object_from_fd): Set l_contiguous if no
-+	holes are present or are PROT_NONE protected.
-+	* include/link.h (struct link_map): Add l_contiguous field.
-+	* sysdeps/generic/ldsodefs.h (_dl_addr_inside_object): New prototype.
-+
-+2007-06-18  Jakub Jelinek  <jakub@redhat.com>
-+
-+	* elf/rtld.c (dl_main): Don't call init_tls more than once.
-+
-+2007-06-19  Ulrich Drepper  <drepper@redhat.com>
-+
-+	* elf/dl-close.c (free_mem): Free _dl_scope_free_list.
-+
-+2007-06-13  Jakub Jelinek  <jakub@redhat.com>
-+
-+	* include/link.h: Don't include rtld-lowlevel.h.
-+	(struct link_map): Remove l_scope_lock.
-+	* sysdeps/generic/ldsodefs.h: Don't include rtld-lowlevel.h.
-+	(_dl_scope_free_list): New field (variable) in _rtld_global.
-+	(DL_LOOKUP_SCOPE_LOCK): Remove.
-+	(_dl_scope_free): New prototype.
-+	* elf/dl-runtime.c (_dl_fixup): Don't use __rtld_mrlock_*lock.
-+	Don't pass DL_LOOKUP_SCOPE_LOCK to _dl_lookup_symbol_x.
-+	(_dl_profile_fixup): Likewise.
-+	* elf/dl-sym.c (do_sym): Likewise.  Use wrapped _dl_lookup_symbol_x
-+	whenever !RTLD_SINGLE_THREAD_P, use THREAD_GSCOPE_SET_FLAG and
-+	THREAD_GSCOPE_RESET_FLAG around it.
-+	* elf/dl-close.c (_dl_close_worker): Don't use
-+	__rtld_mrlock_{change,done}.  Call _dl_scope_free on the old
-+	scope.  Make sure THREAD_GSCOPE_WAIT () happens if any old
-+	scopes were queued or if l_scope_mem has been abandoned.
-+	* elf/dl-open.c (_dl_scope_free): New function.
-+	(dl_open_worker): Use it.  Don't use __rtld_mrlock_{change,done}.
-+	* elf/dl-support.c (_dl_scope_free_list): New variable.
-+	* elf/dl-lookup.c (add_dependency): Remove flags argument.
-+	Remove DL_LOOKUP_SCOPE_LOCK handling.
-+	(_dl_lookup_symbol_x): Adjust caller.  Remove DL_LOOKUP_SCOPE_LOCK
-+	handling.
-+	* elf/dl-object.c (_dl_new_object): Don't use
-+	__rtld_mrlock_initialize.
-+
-+2007-06-09  Ulrich Drepper  <drepper@redhat.com>
-+
-+	* elf/do-lookup.h (do_lookup_x): Read r_nlist before r_list and
-+	make sure gcc doesn't mess around with this.
-+
-+2007-06-08  Ulrich Drepper  <drepper@redhat.com>
-+
-+	* elf/dl-lookup.c (_dl_lookup_symbol_x): Remove use of r_nlist.
-+
-+2007-06-08  Jakub Jelinek  <jakub@redhat.com>
-+
-+	* elf/dl-close.c (_dl_close_worker): Remove all to be removed
-+	libraries from the global scope at once and call THREAD_GSCOPE_WAIT
-+
-+2007-05-18  Ulrich Drepper  <drepper@redhat.com>
-+
-+	* elf/dl-close.c (_dl_close_worker): When removing object from
-+	global scope, wait for all lookups to finish afterwards.
-+	* elf/dl-open.c (add_to_global): When global scope array must
-+	grow, allocate a new one and free old array only after all
-+	lookups finish.
-+	* elf/dl-runtime.c (_dl_fixup): Protect using global scope.
-+	(_dl_lookup_symbol_x): Likewise.
-+	* elf/dl-support.c: Define _dl_wait_lookup_done.
-+	* sysdeps/generic/ldsodefs.h (struct rtld_global): Add
-+	_dl_wait_lookup_done.
-+
-+2007-06-05  Jakub Jelinek  <jakub@redhat.com>
-+
-+	* sysdeps/ieee754/ldbl-128ibm/mpn2ldbl.c
-+	(__mpn_construct_long_double): Fix conversion where result ought
-+	to be smaller than __LDBL_MIN__, or the low double should be
-+	denormal.  Fix decision where to negate low double - honor round
-+	to even rules.
-+	* stdio-common/tst-sprintf2.c: Include string.h.
-+	(COMPARE_LDBL): Define.
-+	(TEST): Also test whether a string hexadecimal float representation
-+	can be parsed back to the number.
-+	(main): Add a couple of further tests.
-+
-+2007-06-04  Jakub Jelinek  <jakub@redhat.com>
-+
-+	* sysdeps/ieee754/ldbl-128ibm/printf_fphex.c
-+	(PRINT_FPHEX_LONG_DOUBLE): Fix printing numbers where lower double
-+	is non-zero, but smaller than 2 * __DBL_MIN__.
-+	* stdio-common/tst-sprintf2.c: New test.
-+	* stdio-common/Makefile (tests): Add tst-sprintf2.
-+
-+2007-06-04  Jakub Jelinek  <jakub@redhat.com>
-+
-+	* sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c (nextafterl): Remove
-+	unused ily variable.  Fix nextafterl on +-__LDBL_MAX__ and +-Inf.
-+	Remove unreachable code at the end.
-+
-+2007-06-01  Steven Munroe  <sjmunroe@us.ibm.com>
-+
-+	* sysdeps/ieee754/ldbl-128ibm/s_fpclassifyl.c: Correct description of
-+	ldbl-128ibm in comment.
-+	(fpclassifyl): Correct classification of denormals.
-+	* sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c (nextafterl): Correct
-+	return value for MIN denormal. Rewrite using long double math too
-+	correctly handle denormals and canonicalize the results.
-+
-+2007-05-29  Ulrich Drepper  <drepper@redhat.com>
-+
-+	* nscd/nscd_helper.c (get_mapping): Handle short replies instead
-+	of crashing.  When this is the case or if the reply is malformed,
-+	don't try to close the new file descriptor since it does not
-+	exist.
-+	Patch in part by Guillaume Chazarain <guichaz@yahoo.fr>.
-+
-+2007-05-21  Ulrich Drepper  <drepper@redhat.com>
-+
-+	* sysdeps/x86_64/cacheinfo.c (init_cacheinfo): Pass correct value
-+	as second parameter to handle_intel.
-+
-+	* sysdeps/unix/sysv/linux/x86_64/sysconf.c: Move cache information
-+	handling to ...
-+	* sysdeps/x86_64/cacheinfo.c: ... here.  New file.
-+	* sysdeps/x86_64/Makefile [subdir=string] (sysdep_routines): Add
-+	cacheinfo.
-+	* sysdeps/x86_64/memcpy.S: Complete rewrite.
-+	* sysdeps/x86_64/mempcpy.S: Adjust appropriately.
-+	Patch by Evandro Menezes <evandro.menezes@amd.com>.
-+
-+2007-05-21  Ulrich Drepper  <drepper@redhat.com>
-+
-+	* sysdeps/unix/sysv/linux/i386/epoll_pwait.S: New file.
-+
-+2007-05-21  Jakub Jelinek  <jakub@redhat.com>
-+
-+	[BZ #4525]
-+	* sysdeps/unix/sysv/linux/Makefile (sysdep_routines): Add epoll_pwait.
-+	* sysdeps/unix/sysv/linux/epoll_pwait.c: New file.
-+	* sysdeps/unix/sysv/linux/syscalls.list (epoll_pwait): Remove.
-+
-+	* sysdeps/unix/sysv/linux/x86_64/sys/epoll.h (epoll_pwait): Declare.
-+
-+	[BZ #4514]
-+	* stdio-common/vfprintf.c (vfprintf): Don't shadow workstart variable,
-+	reinitialize workend at the start of each do_positional format spec
-+	loop, free workstart before do_positional loops.
-+	(printf_unknown): Fix size of work_buffer.
-+	* stdio-common/tst-sprintf.c (main): Add 3 new testcases.
-+
-+	* malloc/hooks.c (MALLOC_STATE_VERSION): Bump.
-+	(public_sET_STATe): If ms->version < 3, put all chunks into
-+	unsorted chunks and clear {fd,bk}_nextsize fields of largebin
-+	chunks.
-+
-+	* malloc/malloc.c [MALLOC_DEBUG]: Revert 2007-05-13 changes.
-+	* malloc/hooks.c: Likewise.
-+	* malloc/arena.c: Likewise.
-+	* malloc/malloc.c (do_check_malloc_state): Don't assert
-+	n_mmaps is not greater than n_mmaps_max.  This removes the need
-+	for the previous change.
-+
-+	* malloc/Makefile (CFLAGS-malloc.c): Revert accidental
-+	2007-05-07 commit.
-+
-+2007-05-18  Ulrich Drepper  <drepper@redhat.com>
-+
-+	* malloc/malloc.c (do_check_chunk): Correct check for mmaped block
-+	not overlapping with arena.
-+
-+	* malloc/mcheck.c (reallochook): If size==0, free the block.
-+
-+	* rt/tst-shm.c: Use fstat64 instead of fstat.
-+
-+	* sysdeps/unix/sysv/linux/i386/sync_file_range.S: Fix case where
-+	__NR_sync_file_range is not defined.
-+
-+2007-05-17  Ulrich Drepper  <drepper@redhat.com>
-+
-+	Dummy files to prevent stub versions from being used.
-+	* sysdeps/x86_64/fpu/k_cosl.c: New file.
-+	* sysdeps/x86_64/fpu/k_rem_pio2l.c: New file.
-+	* sysdeps/x86_64/fpu/k_sinl.c: New file.
-+	* sysdeps/x86_64/fpu/k_tanl.c: New file.
-+
- 2007-05-14  Ulrich Drepper  <drepper@redhat.com>
- 
- 	* version.h (VERSION): Define to 6.
---- glibc-2.6.orig/dlfcn/dlinfo.c
-+++ glibc-2.6/dlfcn/dlinfo.c
-@@ -1,5 +1,5 @@
- /* dlinfo -- Get information from the dynamic linker.
--   Copyright (C) 2003, 2004, 2006 Free Software Foundation, Inc.
-+   Copyright (C) 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
-    This file is part of the GNU C Library.
- 
-    The GNU C Library is free software; you can redistribute it and/or
-@@ -56,9 +56,8 @@
-       /* Find the highest-addressed object that CALLER is not below.  */
-       for (nsid = 0; nsid < DL_NNS; ++nsid)
- 	for (l = GL(dl_ns)[nsid]._ns_loaded; l != NULL; l = l->l_next)
--	  if (caller >= l->l_map_start && caller < l->l_map_end)
--	    /* There must be exactly one DSO for the range of the virtual
--	       memory.  Otherwise something is really broken.  */
-+	  if (caller >= l->l_map_start && caller < l->l_map_end
-+	      && (l->l_contiguous || _dl_addr_inside_object (l, caller)))
- 	    break;
- 
-       if (l == NULL)
---- glibc-2.6.orig/elf/dl-addr.c
-+++ glibc-2.6/elf/dl-addr.c
-@@ -134,22 +134,12 @@
-   /* Find the highest-addressed object that ADDRESS is not below.  */
-   for (Lmid_t ns = 0; ns < DL_NNS; ++ns)
-     for (struct link_map *l = GL(dl_ns)[ns]._ns_loaded; l; l = l->l_next)
--      if (addr >= l->l_map_start && addr < l->l_map_end)
-+      if (addr >= l->l_map_start && addr < l->l_map_end
-+	  && (l->l_contiguous || _dl_addr_inside_object (l, addr)))
- 	{
--	  /* Make sure it lies within one of L's segments.  */
--	  int n = l->l_phnum;
--	  const ElfW(Addr) reladdr = addr - l->l_addr;
--	  while (--n >= 0)
--	    if (l->l_phdr[n].p_type == PT_LOAD)
--	      {
--		if (reladdr - l->l_phdr[n].p_vaddr >= 0
--		    && reladdr - l->l_phdr[n].p_vaddr < l->l_phdr[n].p_memsz)
--		  {
--		    determine_info (addr, l, info, mapp, symbolp);
--		    result = 1;
--		    goto out;
--		  }
--	      }
-+	  determine_info (addr, l, info, mapp, symbolp);
-+	  result = 1;
-+	  goto out;
- 	}
- 
-  out:
-@@ -158,3 +148,19 @@
-   return result;
- }
- libc_hidden_def (_dl_addr)
-+
-+/* Return non-zero if ADDR lies within one of L's segments.  */
-+int
-+internal_function
-+_dl_addr_inside_object (struct link_map *l, const ElfW(Addr) addr)
-+{
-+  int n = l->l_phnum;
-+  const ElfW(Addr) reladdr = addr - l->l_addr;
-+
-+  while (--n >= 0)
-+    if (l->l_phdr[n].p_type == PT_LOAD
-+	&& reladdr - l->l_phdr[n].p_vaddr >= 0
-+	&& reladdr - l->l_phdr[n].p_vaddr < l->l_phdr[n].p_memsz)
-+      return 1;
-+  return 0;
-+}
---- glibc-2.6.orig/elf/dl-close.c
-+++ glibc-2.6/elf/dl-close.c
-@@ -31,6 +31,7 @@
- #include <sys/types.h>
- #include <sys/mman.h>
- #include <sysdep-cancel.h>
-+#include <tls.h>
- 
- 
- /* Type of the constructor functions.  */
-@@ -228,6 +229,8 @@
-   bool do_audit = GLRO(dl_naudit) > 0 && !ns->_ns_loaded->l_auditing;
- #endif
-   bool unload_any = false;
-+  bool scope_mem_left = false;
-+  unsigned int unload_global = 0;
-   unsigned int first_loaded = ~0;
-   for (unsigned int i = 0; i < nloaded; ++i)
-     {
-@@ -292,6 +295,9 @@
- 	  /* We indeed have an object to remove.  */
- 	  unload_any = true;
- 
-+	  if (imap->l_global)
-+	    ++unload_global;
-+
- 	  /* Remember where the first dynamically loaded object is.  */
- 	  if (i < first_loaded)
- 	    first_loaded = i;
-@@ -400,18 +406,18 @@
- 
- 	      struct r_scope_elem **old = imap->l_scope;
- 
--	      if (RTLD_SINGLE_THREAD_P)
--		imap->l_scope = newp;
--	      else
--		{
--		  __rtld_mrlock_change (imap->l_scope_lock);
--		  imap->l_scope = newp;
--		  __rtld_mrlock_done (imap->l_scope_lock);
--		}
-+	      imap->l_scope = newp;
- 
- 	      /* No user anymore, we can free it now.  */
- 	      if (old != imap->l_scope_mem)
--		free (old);
-+		{
-+		  if (_dl_scope_free (old))
-+		    /* If _dl_scope_free used THREAD_GSCOPE_WAIT (),
-+		       no need to repeat it.  */
-+		    scope_mem_left = false;
-+		}
-+	      else
-+		scope_mem_left = true;
- 
- 	      imap->l_scope_max = new_size;
- 	    }
-@@ -457,6 +463,46 @@
-   r->r_state = RT_DELETE;
-   _dl_debug_state ();
- 
-+  if (unload_global)
-+    {
-+      /* Some objects are in the global scope list.  Remove them.  */
-+      struct r_scope_elem *ns_msl = ns->_ns_main_searchlist;
-+      unsigned int i;
-+      unsigned int j = 0;
-+      unsigned int cnt = ns_msl->r_nlist;
-+
-+      while (cnt > 0 && ns_msl->r_list[cnt - 1]->l_removed)
-+	--cnt;
-+
-+      if (cnt + unload_global == ns_msl->r_nlist)
-+	/* Speed up removing most recently added objects.  */
-+	j = cnt;
-+      else
-+ 	for (i = 0; i < cnt; i++)
-+	  if (ns_msl->r_list[i]->l_removed == 0)
-+	    {
-+	      if (i != j)
-+		ns_msl->r_list[j] = ns_msl->r_list[i];
-+	      j++;
-+	    }
-+      ns_msl->r_nlist = j;
-+    }
-+
-+  if (!RTLD_SINGLE_THREAD_P
-+      && (unload_global
-+	  || scope_mem_left
-+	  || (GL(dl_scope_free_list) != NULL
-+	      && GL(dl_scope_free_list)->count)))
-+    {
-+      struct dl_scope_free_list *fsl;
-+
-+      THREAD_GSCOPE_WAIT ();
-+      /* Now we can free any queued old scopes.  */
-+      if ((fsl = GL(dl_scope_free_list)) != NULL)
-+	while (fsl->count > 0)
-+	  free (fsl->list[--fsl->count]);
-+    }
-+
-   size_t tls_free_start;
-   size_t tls_free_end;
-   tls_free_start = tls_free_end = NO_TLS_OFFSET;
-@@ -472,22 +518,6 @@
- 
- 	  /* That was the last reference, and this was a dlopen-loaded
- 	     object.  We can unmap it.  */
--	  if (__builtin_expect (imap->l_global, 0))
--	    {
--	      /* This object is in the global scope list.  Remove it.  */
--	      struct r_scope_elem *ns_msl = ns->_ns_main_searchlist;
--	      unsigned int cnt = ns_msl->r_nlist;
--
--	      do
--		--cnt;
--	      while (ns_msl->r_list[cnt] != imap);
--
--	      /* The object was already correctly registered.  */
--	      while (++cnt < ns_msl->r_nlist)
--		ns_msl->r_list[cnt - 1] = ns_msl->r_list[cnt];
--
--	      --ns_msl->r_nlist;
--	    }
- 
- 	  /* Remove the object from the dtv slotinfo array if it uses TLS.  */
- 	  if (__builtin_expect (imap->l_tls_blocksize > 0, 0))
-@@ -769,4 +799,8 @@
- 	   malloc), and in the static library it's in .bss space.  */
- 	free_slotinfo (&GL(dl_tls_dtv_slotinfo_list)->next);
-     }
-+
-+  void *scope_free_list = GL(dl_scope_free_list);
-+  GL(dl_scope_free_list) = NULL;
-+  free (scope_free_list);
- }
---- glibc-2.6.orig/elf/dl-iteratephdr.c
-+++ glibc-2.6/elf/dl-iteratephdr.c
-@@ -1,5 +1,5 @@
- /* Get loaded objects program headers.
--   Copyright (C) 2001,2002,2003,2004,2006 Free Software Foundation, Inc.
-+   Copyright (C) 2001,2002,2003,2004,2006,2007 Free Software Foundation, Inc.
-    This file is part of the GNU C Library.
-    Contributed by Jakub Jelinek <jakub@redhat.com>, 2001.
- 
-@@ -54,9 +54,9 @@
- 	nloaded += GL(dl_ns)[cnt]._ns_nloaded;
- 
- 	if (caller >= (const void *) l->l_map_start
--	    && caller < (const void *) l->l_map_end)
--	  /* There must be exactly one DSO for the range of the virtual
--	     memory.  Otherwise something is really broken.  */
-+	    && caller < (const void *) l->l_map_end
-+	    && (l->l_contiguous
-+		|| _dl_addr_inside_object (l, (ElfW(Addr)) caller)))
- 	  ns = cnt;
-       }
- 
---- glibc-2.6.orig/elf/dl-load.c
-+++ glibc-2.6/elf/dl-load.c
-@@ -1,5 +1,5 @@
- /* Map in a shared object's segments from the file.
--   Copyright (C) 1995-2005, 2006  Free Software Foundation, Inc.
-+   Copyright (C) 1995-2005, 2006, 2007  Free Software Foundation, Inc.
-    This file is part of the GNU C Library.
- 
-    The GNU C Library is free software; you can redistribute it and/or
-@@ -1223,6 +1223,8 @@
- 		      loadcmds[nloadcmds - 1].mapstart - c->mapend,
- 		      PROT_NONE);
- 
-+	l->l_contiguous = 1;
-+
- 	goto postmap;
-       }
- 
-@@ -1242,6 +1244,7 @@
-     /* Remember which part of the address space this object uses.  */
-     l->l_map_start = c->mapstart + l->l_addr;
-     l->l_map_end = l->l_map_start + maplength;
-+    l->l_contiguous = !has_holes;
- 
-     while (c < &loadcmds[nloadcmds])
-       {
---- glibc-2.6.orig/elf/dl-lookup.c
-+++ glibc-2.6/elf/dl-lookup.c
-@@ -86,7 +86,7 @@
- /* Add extra dependency on MAP to UNDEF_MAP.  */
- static int
- internal_function
--add_dependency (struct link_map *undef_map, struct link_map *map, int flags)
-+add_dependency (struct link_map *undef_map, struct link_map *map)
- {
-   struct link_map **list;
-   struct link_map *runp;
-@@ -99,18 +99,8 @@
-   if (undef_map == map)
-     return 0;
- 
--  /* Make sure nobody can unload the object while we are at it.
--     If we hold a scope lock drop it now to avoid ABBA locking problems.  */
--  if ((flags & DL_LOOKUP_SCOPE_LOCK) != 0 && !RTLD_SINGLE_THREAD_P)
--    {
--      __rtld_mrlock_unlock (undef_map->l_scope_lock);
--
--      __rtld_lock_lock_recursive (GL(dl_load_lock));
--
--      __rtld_mrlock_lock (undef_map->l_scope_lock);
--    }
--  else
--    __rtld_lock_lock_recursive (GL(dl_load_lock));
-+  /* Make sure nobody can unload the object while we are at it.  */
-+  __rtld_lock_lock_recursive (GL(dl_load_lock));
- 
-   /* Avoid references to objects which cannot be unloaded anyway.  */
-   if (map->l_type != lt_loaded
-@@ -237,20 +227,15 @@
- 
-   bump_num_relocations ();
- 
--  /* No other flag than DL_LOOKUP_ADD_DEPENDENCY and DL_LOOKUP_SCOPE_LOCK
--     is allowed if we look up a versioned symbol.  */
--  assert (version == NULL || (flags & ~(DL_LOOKUP_ADD_DEPENDENCY
--					| DL_LOOKUP_SCOPE_LOCK)) == 0);
-+  /* No other flag than DL_LOOKUP_ADD_DEPENDENCY is allowed if we look
-+     up a versioned symbol.  */
-+  assert (version == NULL || (flags & ~(DL_LOOKUP_ADD_DEPENDENCY)) == 0);
- 
-   size_t i = 0;
-   if (__builtin_expect (skip_map != NULL, 0))
--    {
--      /* Search the relevant loaded objects for a definition.  */
--      while ((*scope)->r_list[i] != skip_map)
--	++i;
--
--      assert (i < (*scope)->r_nlist);
--    }
-+    /* Search the relevant loaded objects for a definition.  */
-+    while ((*scope)->r_list[i] != skip_map)
-+      ++i;
- 
-   /* Search the relevant loaded objects for a definition.  */
-   for (size_t start = i; *scope != NULL; start = 0, ++scope)
-@@ -350,13 +335,11 @@
- 	 runtime lookups.  */
-       && (flags & DL_LOOKUP_ADD_DEPENDENCY) != 0
-       /* Add UNDEF_MAP to the dependencies.  */
--      && add_dependency (undef_map, current_value.m, flags) < 0)
-+      && add_dependency (undef_map, current_value.m) < 0)
-       /* Something went wrong.  Perhaps the object we tried to reference
- 	 was just removed.  Try finding another definition.  */
--      return _dl_lookup_symbol_x (undef_name, undef_map, ref,
--				  (flags & DL_LOOKUP_SCOPE_LOCK) == 0
--				  ? symbol_scope : undef_map->l_scope, version,
--				  type_class, flags, skip_map);
-+      return _dl_lookup_symbol_x (undef_name, undef_map, ref, symbol_scope,
-+				  version, type_class, flags, skip_map);
- 
-   /* The object is used.  */
-   current_value.m->l_used = 1;
---- glibc-2.6.orig/elf/dl-minimal.c
-+++ glibc-2.6/elf/dl-minimal.c
-@@ -75,14 +75,21 @@
-   alloc_ptr = (void *) 0 + (((alloc_ptr - (void *) 0) + align - 1)
- 			    & ~(align - 1));
- 
--  if (alloc_ptr + n >= alloc_end)
-+  if (alloc_ptr + n >= alloc_end || n >= -(uintptr_t) alloc_ptr)
-     {
-       /* Insufficient space left; allocate another page.  */
-       caddr_t page;
-       size_t nup = (n + GLRO(dl_pagesize) - 1) & ~(GLRO(dl_pagesize) - 1);
-+      if (__builtin_expect (nup == 0, 0))
-+	{
-+	  if (n)
-+	    return NULL;
-+	  nup = GLRO(dl_pagesize);
-+	}
-       page = __mmap (0, nup, PROT_READ|PROT_WRITE,
- 		     MAP_ANON|MAP_PRIVATE, _dl_zerofd, 0);
--      assert (page != MAP_FAILED);
-+      if (page == MAP_FAILED)
-+	return NULL;
-       if (page != alloc_end)
- 	alloc_ptr = page;
-       alloc_end = page + nup;
-@@ -108,7 +115,14 @@
-   /* New memory from the trivial malloc above is always already cleared.
-      (We make sure that's true in the rare occasion it might not be,
-      by clearing memory in free, below.)  */
--  return malloc (nmemb * size);
-+  size_t bytes = nmemb * size;
-+
-+#define HALF_SIZE_T (((size_t) 1) << (8 * sizeof (size_t) / 2))
-+  if (__builtin_expect ((nmemb | size) >= HALF_SIZE_T, 0)
-+      && size != 0 && bytes / size != nmemb)
-+    return NULL;
-+
-+  return malloc (bytes);
- }
- 
- /* This will rarely be called.  */
-@@ -264,7 +278,7 @@
-   while (*nptr >= '0' && *nptr <= '9')
-     {
-       unsigned long int digval = *nptr - '0';
--      if (result > LONG_MAX / 10
-+      if (result > ULONG_MAX / 10
- 	  || (result == ULONG_MAX / 10 && digval > ULONG_MAX % 10))
- 	{
- 	  errno = ERANGE;
---- glibc-2.6.orig/elf/dl-object.c
-+++ glibc-2.6/elf/dl-object.c
-@@ -1,5 +1,5 @@
- /* Storage management for the chain of loaded shared objects.
--   Copyright (C) 1995-2002, 2004, 2006 Free Software Foundation, Inc.
-+   Copyright (C) 1995-2002, 2004, 2006, 2007 Free Software Foundation, Inc.
-    This file is part of the GNU C Library.
- 
-    The GNU C Library is free software; you can redistribute it and/or
-@@ -85,11 +85,6 @@
-   new->l_scope = new->l_scope_mem;
-   new->l_scope_max = sizeof (new->l_scope_mem) / sizeof (new->l_scope_mem[0]);
- 
--  /* No need to initialize the scope lock if the initializer is zero.  */
--#if _RTLD_MRLOCK_INITIALIZER != 0
--  __rtld_mrlock_initialize (new->l_scope_lock);
--#endif
--
-   /* Counter for the scopes we have to handle.  */
-   idx = 0;
- 
---- glibc-2.6.orig/elf/dl-open.c
-+++ glibc-2.6/elf/dl-open.c
-@@ -32,6 +32,7 @@
- #include <bp-sym.h>
- #include <caller.h>
- #include <sysdep-cancel.h>
-+#include <tls.h>
- 
- #include <dl-dst.h>
- 
-@@ -125,15 +126,25 @@
-     {
-       /* We have to extend the existing array of link maps in the
- 	 main map.  */
-+      struct link_map **old_global
-+	= GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_list;
-+      size_t new_nalloc = ((ns->_ns_global_scope_alloc + to_add) * 2);
-+
-       new_global = (struct link_map **)
--	realloc (ns->_ns_main_searchlist->r_list,
--		 ((ns->_ns_global_scope_alloc + to_add + 8)
--		  * sizeof (struct link_map *)));
-+	malloc (new_nalloc * sizeof (struct link_map *));
-       if (new_global == NULL)
- 	goto nomem;
- 
--      ns->_ns_global_scope_alloc += to_add + 8;
-+      memcpy (new_global, old_global,
-+	      ns->_ns_global_scope_alloc * sizeof (struct link_map *));
-+
-+      ns->_ns_global_scope_alloc = new_nalloc;
-       ns->_ns_main_searchlist->r_list = new_global;
-+
-+      if (!RTLD_SINGLE_THREAD_P)
-+	THREAD_GSCOPE_WAIT ();
-+
-+      free (old_global);
-     }
- 
-   /* Now add the new entries.  */
-@@ -154,6 +165,40 @@
-   return 0;
- }
- 
-+int
-+_dl_scope_free (struct r_scope_elem **old)
-+{
-+  struct dl_scope_free_list *fsl;
-+#define DL_SCOPE_FREE_LIST_SIZE (sizeof (fsl->list) / sizeof (fsl->list[0]))
-+
-+  if (RTLD_SINGLE_THREAD_P)
-+    free (old);
-+  else if ((fsl = GL(dl_scope_free_list)) == NULL)
-+    {
-+      GL(dl_scope_free_list) = fsl = malloc (sizeof (*fsl));
-+      if (fsl == NULL)
-+	{
-+	  THREAD_GSCOPE_WAIT ();
-+	  free (old);
-+	  return 1;
-+	}
-+      else
-+	{
-+	  fsl->list[0] = old;
-+	  fsl->count = 1;
-+	}
-+    }
-+  else if (fsl->count < DL_SCOPE_FREE_LIST_SIZE)
-+    fsl->list[fsl->count++] = old;
-+  else
-+    {
-+      THREAD_GSCOPE_WAIT ();
-+      while (fsl->count > 0)
-+	free (fsl->list[--fsl->count]);
-+      return 1;
-+    }
-+  return 0;
-+}
- 
- static void
- dl_open_worker (void *a)
-@@ -190,10 +235,10 @@
-       for (Lmid_t ns = 0; ns < DL_NNS; ++ns)
- 	for (l = GL(dl_ns)[ns]._ns_loaded; l != NULL; l = l->l_next)
- 	  if (caller_dlopen >= (const void *) l->l_map_start
--	      && caller_dlopen < (const void *) l->l_map_end)
-+	      && caller_dlopen < (const void *) l->l_map_end
-+	      && (l->l_contiguous
-+		  || _dl_addr_inside_object (l, (ElfW(Addr)) caller_dlopen)))
- 	    {
--	      /* There must be exactly one DSO for the range of the virtual
--		 memory.  Otherwise something is really broken.  */
- 	      assert (ns == l->l_ns);
- 	      call_map = l;
- 	      goto found_caller;
-@@ -418,17 +463,10 @@
- 	      memcpy (newp, imap->l_scope, cnt * sizeof (imap->l_scope[0]));
- 	      struct r_scope_elem **old = imap->l_scope;
- 
--	      if (RTLD_SINGLE_THREAD_P)
--		imap->l_scope = newp;
--	      else
--		{
--		  __rtld_mrlock_change (imap->l_scope_lock);
--		  imap->l_scope = newp;
--		  __rtld_mrlock_done (imap->l_scope_lock);
--		}
-+	      imap->l_scope = newp;
- 
- 	      if (old != imap->l_scope_mem)
--		free (old);
-+		_dl_scope_free (old);
- 
- 	      imap->l_scope_max = new_size;
- 	    }
-@@ -651,3 +689,21 @@
-     }
- }
- #endif
-+
-+#ifdef IS_IN_rtld
-+/* Return non-zero if ADDR lies within one of L's segments.  */
-+int
-+internal_function
-+_dl_addr_inside_object (struct link_map *l, const ElfW(Addr) addr)
-+{
-+  int n = l->l_phnum;
-+  const ElfW(Addr) reladdr = addr - l->l_addr;
-+
-+  while (--n >= 0)
-+    if (l->l_phdr[n].p_type == PT_LOAD
-+	&& reladdr - l->l_phdr[n].p_vaddr >= 0
-+	&& reladdr - l->l_phdr[n].p_vaddr < l->l_phdr[n].p_memsz)
-+      return 1;
-+  return 0;
-+}
-+#endif
---- glibc-2.6.orig/elf/dl-runtime.c
-+++ glibc-2.6/elf/dl-runtime.c
-@@ -26,6 +26,8 @@
- #include <ldsodefs.h>
- #include <sysdep-cancel.h>
- #include "dynamic-link.h"
-+#include <tls.h>
-+
- 
- #if (!defined ELF_MACHINE_NO_RELA && !defined ELF_MACHINE_PLT_REL) \
-     || ELF_MACHINE_NO_REL
-@@ -97,17 +99,15 @@
- 	 not necessary for objects which cannot be unloaded or when
- 	 we are not using any threads (yet).  */
-       int flags = DL_LOOKUP_ADD_DEPENDENCY;
--      if (l->l_type == lt_loaded && !RTLD_SINGLE_THREAD_P)
--	{
--	  __rtld_mrlock_lock (l->l_scope_lock);
--	  flags |= DL_LOOKUP_SCOPE_LOCK;
--	}
-+      if (!RTLD_SINGLE_THREAD_P)
-+	THREAD_GSCOPE_SET_FLAG ();
- 
-       result = _dl_lookup_symbol_x (strtab + sym->st_name, l, &sym, l->l_scope,
- 				    version, ELF_RTYPE_CLASS_PLT, flags, NULL);
- 
--      if ((flags & DL_LOOKUP_SCOPE_LOCK) != 0)
--	__rtld_mrlock_unlock (l->l_scope_lock);
-+      /* We are done with the global scope.  */
-+      if (!RTLD_SINGLE_THREAD_P)
-+	THREAD_GSCOPE_RESET_FLAG ();
- 
-       /* Currently result contains the base load address (or link map)
- 	 of the object that defines sym.  Now add in the symbol
-@@ -191,18 +191,16 @@
- 	     not necessary for objects which cannot be unloaded or when
- 	     we are not using any threads (yet).  */
- 	  int flags = DL_LOOKUP_ADD_DEPENDENCY;
--	  if (l->l_type == lt_loaded && !RTLD_SINGLE_THREAD_P)
--	    {
--	      __rtld_mrlock_lock (l->l_scope_lock);
--	      flags |= DL_LOOKUP_SCOPE_LOCK;
--	    }
-+	  if (!RTLD_SINGLE_THREAD_P)
-+	    THREAD_GSCOPE_SET_FLAG ();
- 
- 	  result = _dl_lookup_symbol_x (strtab + refsym->st_name, l,
- 					&defsym, l->l_scope, version,
- 					ELF_RTYPE_CLASS_PLT, flags, NULL);
- 
--	  if ((flags & DL_LOOKUP_SCOPE_LOCK) != 0)
--	    __rtld_mrlock_unlock (l->l_scope_lock);
-+	  /* We are done with the global scope.  */
-+	  if (!RTLD_SINGLE_THREAD_P)
-+	    THREAD_GSCOPE_RESET_FLAG ();
- 
- 	  /* Currently result contains the base load address (or link map)
- 	     of the object that defines sym.  Now add in the symbol
---- glibc-2.6.orig/elf/dl-support.c
-+++ glibc-2.6/elf/dl-support.c
-@@ -1,5 +1,5 @@
- /* Support for dynamic linking code in static libc.
--   Copyright (C) 1996-2005, 2006 Free Software Foundation, Inc.
-+   Copyright (C) 1996-2005, 2006, 2007 Free Software Foundation, Inc.
-    This file is part of the GNU C Library.
- 
-    The GNU C Library is free software; you can redistribute it and/or
-@@ -132,6 +132,11 @@
-   = _dl_make_stack_executable;
- 
- 
-+/* Function in libpthread to wait for termination of lookups.  */
-+void (*_dl_wait_lookup_done) (void);
-+
-+struct dl_scope_free_list *_dl_scope_free_list;
-+
- #ifdef NEED_DL_SYSINFO
- /* Needed for improved syscall handling on at least x86/Linux.  */
- uintptr_t _dl_sysinfo = DL_SYSINFO_DEFAULT;
---- glibc-2.6.orig/elf/dl-sym.c
-+++ glibc-2.6/elf/dl-sym.c
-@@ -98,10 +98,9 @@
-   for (Lmid_t ns = 0; ns < DL_NNS; ++ns)
-     for (struct link_map *l = GL(dl_ns)[ns]._ns_loaded; l != NULL;
- 	 l = l->l_next)
--      if (caller >= l->l_map_start && caller < l->l_map_end)
-+      if (caller >= l->l_map_start && caller < l->l_map_end
-+	  && (l->l_contiguous || _dl_addr_inside_object (l, caller)))
- 	{
--	  /* There must be exactly one DSO for the range of the virtual
--	     memory.  Otherwise something is really broken.  */
- 	  match = l;
- 	  break;
- 	}
-@@ -113,29 +112,29 @@
- 	 the initial binary.  And then the more complex part
- 	 where the object is dynamically loaded and the scope
- 	 array can change.  */
--      if (match->l_type != lt_loaded || RTLD_SINGLE_THREAD_P)
-+      if (RTLD_SINGLE_THREAD_P)
- 	result = GLRO(dl_lookup_symbol_x) (name, match, &ref,
- 					   match->l_scope, vers, 0,
- 					   flags | DL_LOOKUP_ADD_DEPENDENCY,
- 					   NULL);
-       else
- 	{
--	  __rtld_mrlock_lock (match->l_scope_lock);
--
- 	  struct call_dl_lookup_args args;
- 	  args.name = name;
- 	  args.map = match;
- 	  args.vers = vers;
--	  args.flags = flags | DL_LOOKUP_ADD_DEPENDENCY | DL_LOOKUP_SCOPE_LOCK;
-+	  args.flags = flags | DL_LOOKUP_ADD_DEPENDENCY;
- 	  args.refp = &ref;
- 
-+	  THREAD_GSCOPE_SET_FLAG ();
-+
- 	  const char *objname;
- 	  const char *errstring = NULL;
- 	  bool malloced;
- 	  int err = GLRO(dl_catch_error) (&objname, &errstring, &malloced,
- 					  call_dl_lookup, &args);
- 
--	  __rtld_mrlock_unlock (match->l_scope_lock);
-+	  THREAD_GSCOPE_RESET_FLAG ();
- 
- 	  if (__builtin_expect (errstring != NULL, 0))
- 	    {
---- glibc-2.6.orig/elf/dl-sysdep.c
-+++ glibc-2.6/elf/dl-sysdep.c
-@@ -1,5 +1,5 @@
- /* Operating system support for run-time dynamic linker.  Generic Unix version.
--   Copyright (C) 1995-1998, 2000-2005, 2006 Free Software Foundation, Inc.
-+   Copyright (C) 1995-1998, 2000-2006, 2007 Free Software Foundation, Inc.
-    This file is part of the GNU C Library.
- 
-    The GNU C Library is free software; you can redistribute it and/or
-@@ -460,9 +460,21 @@
-     total = temp[0].len + 1;
-   else
-     {
--      total = (1UL << (cnt - 2)) * (temp[0].len + temp[cnt - 1].len + 2);
--      for (n = 1; n + 1 < cnt; ++n)
--	total += (1UL << (cnt - 3)) * (temp[n].len + 1);
-+      total = temp[0].len + temp[cnt - 1].len + 2;
-+      if (cnt > 2)
-+	{
-+	  total <<= 1;
-+	  for (n = 1; n + 1 < cnt; ++n)
-+	    total += temp[n].len + 1;
-+	  if (cnt > 3
-+	      && (cnt >= sizeof (size_t) * 8
-+		  || total + (sizeof (*result) << 3)
-+		     >= (1UL << (sizeof (size_t) * 8 - cnt + 3))))
-+	    _dl_signal_error (ENOMEM, NULL, NULL,
-+			      N_("cannot create capability list"));
-+
-+	  total <<= cnt - 3;
-+	}
-     }
- 
-   /* The result structure: we use a very compressed way to store the
---- glibc-2.6.orig/elf/do-lookup.h
-+++ glibc-2.6/elf/do-lookup.h
-@@ -1,5 +1,5 @@
- /* Look up a symbol in the loaded objects.
--   Copyright (C) 1995-2004, 2005, 2006 Free Software Foundation, Inc.
-+   Copyright (C) 1995-2004, 2005, 2006, 2007 Free Software Foundation, Inc.
-    This file is part of the GNU C Library.
- 
-    The GNU C Library is free software; you can redistribute it and/or
-@@ -29,8 +29,13 @@
- 	     const struct r_found_version *const version, int flags,
- 	     struct link_map *skip, int type_class)
- {
--  struct link_map **list = scope->r_list;
-   size_t n = scope->r_nlist;
-+  /* Make sure we read the value before proceeding.  Otherwise we
-+     might use r_list pointing to the initial scope and r_nlist being
-+     the value after a resize.  That is the only path in dl-open.c not
-+     protected by GSCOPE.  A read barrier here might be to expensive.  */
-+  __asm volatile ("" : "+r" (n), "+m" (scope->r_list));
-+  struct link_map **list = scope->r_list;
- 
-   do
-     {
---- glibc-2.6.orig/elf/rtld.c
-+++ glibc-2.6/elf/rtld.c
-@@ -1400,6 +1400,11 @@
-       /* Iterate over all entries in the list.  The order is important.  */
-       struct audit_ifaces *last_audit = NULL;
-       struct audit_list *al = audit_list->next;
-+
-+      /* Since we start using the auditing DSOs right away we need to
-+	 initialize the data structures now.  */
-+      tcbp = init_tls ();
-+
-       do
- 	{
- 	  int tls_idx = GL(dl_tls_max_dtv_idx);
-@@ -1409,11 +1414,6 @@
- 	     always allocate the static block, we never defer it even if
- 	     no DF_STATIC_TLS bit is set.  The reason is that we know
- 	     glibc will use the static model.  */
--
--	  /* Since we start using the auditing DSOs right away we need to
--	     initialize the data structures now.  */
--	  tcbp = init_tls ();
--
- 	  struct dlmopen_args dlmargs;
- 	  dlmargs.fname = al->name;
- 	  dlmargs.map = NULL;
---- glibc-2.6.orig/include/link.h
-+++ glibc-2.6/include/link.h
-@@ -44,7 +44,6 @@
- #include <dl-lookupcfg.h>
- #include <tls.h>
- #include <bits/libc-lock.h>
--#include <rtld-lowlevel.h>
- 
- 
- /* Some internal data structures of the dynamic linker used in the
-@@ -187,6 +186,9 @@
- 				       is interested in the PLT interception.*/
-     unsigned int l_removed:1;	/* Nozero if the object cannot be used anymore
- 				   since it is removed.  */
-+    unsigned int l_contiguous:1; /* Nonzero if inter-segment holes are
-+				    mprotected or if no holes are present at
-+				    all.  */
- 
-     /* Collected information about own RPATH directories.  */
-     struct r_search_path_struct l_rpath_dirs;
-@@ -220,8 +222,6 @@
-     /* This is an array defining the lookup scope for this link map.
-        There are initially at most three different scope lists.  */
-     struct r_scope_elem **l_scope;
--    /* We need to protect using the SCOPEREC.  */
--    __rtld_mrlock_define (, l_scope_lock)
- 
-     /* A similar array, this time only with the local scope.  This is
-        used occasionally.  */
---- glibc-2.6.orig/malloc/arena.c
-+++ glibc-2.6/malloc/arena.c
-@@ -370,9 +370,6 @@
-   mp_.top_pad        = DEFAULT_TOP_PAD;
- #endif
-   mp_.n_mmaps_max    = DEFAULT_MMAP_MAX;
--#if MALLOC_DEBUG
--  mp_.n_mmaps_cmax   = DEFAULT_MMAP_MAX;
--#endif
-   mp_.mmap_threshold = DEFAULT_MMAP_THRESHOLD;
-   mp_.trim_threshold = DEFAULT_TRIM_THRESHOLD;
-   mp_.pagesize       = malloc_getpagesize;
---- glibc-2.6.orig/malloc/hooks.c
-+++ glibc-2.6/malloc/hooks.c
-@@ -496,7 +496,7 @@
-    then the hooks are reset to 0.  */
- 
- #define MALLOC_STATE_MAGIC   0x444c4541l
--#define MALLOC_STATE_VERSION (0*0x100l + 2l) /* major*0x100 + minor */
-+#define MALLOC_STATE_VERSION (0*0x100l + 3l) /* major*0x100 + minor */
- 
- struct malloc_save_state {
-   long          magic;
-@@ -507,9 +507,6 @@
-   unsigned long trim_threshold;
-   unsigned long top_pad;
-   unsigned int  n_mmaps_max;
--#if MALLOC_DEBUG
--  unsigned int  n_mmaps_cmax;
--#endif
-   unsigned long mmap_threshold;
-   int           check_action;
-   unsigned long max_sbrked_mem;
-@@ -553,9 +550,6 @@
-   ms->trim_threshold = mp_.trim_threshold;
-   ms->top_pad = mp_.top_pad;
-   ms->n_mmaps_max = mp_.n_mmaps_max;
--#if MALLOC_DEBUG
--  ms->n_mmaps_cmax = mp_.n_mmaps_cmax;
--#endif
-   ms->mmap_threshold = mp_.mmap_threshold;
-   ms->check_action = check_action;
-   ms->max_sbrked_mem = main_arena.max_system_mem;
-@@ -601,8 +595,9 @@
-       assert(ms->av[2*i+3] == 0);
-       first(b) = last(b) = b;
-     } else {
--      if(i<NSMALLBINS || (largebin_index(chunksize(ms->av[2*i+2]))==i &&
--			  largebin_index(chunksize(ms->av[2*i+3]))==i)) {
-+      if(ms->version >= 3 &&
-+	 (i<NSMALLBINS || (largebin_index(chunksize(ms->av[2*i+2]))==i &&
-+			   largebin_index(chunksize(ms->av[2*i+3]))==i))) {
- 	first(b) = ms->av[2*i+2];
- 	last(b) = ms->av[2*i+3];
- 	/* Make sure the links to the bins within the heap are correct.  */
-@@ -622,14 +617,22 @@
-       }
-     }
-   }
-+  if (ms->version < 3) {
-+    /* Clear fd_nextsize and bk_nextsize fields.  */
-+    b = unsorted_chunks(&main_arena)->fd;
-+    while (b != unsorted_chunks(&main_arena)) {
-+      if (!in_smallbin_range(chunksize(b))) {
-+	b->fd_nextsize = NULL;
-+	b->bk_nextsize = NULL;
-+      }
-+      b = b->fd;
-+    }
-+  }
-   mp_.sbrk_base = ms->sbrk_base;
-   main_arena.system_mem = ms->sbrked_mem_bytes;
-   mp_.trim_threshold = ms->trim_threshold;
-   mp_.top_pad = ms->top_pad;
-   mp_.n_mmaps_max = ms->n_mmaps_max;
--#if MALLOC_DEBUG
--  mp_.n_mmaps_cmax = ms->n_mmaps_cmax;
--#endif
-   mp_.mmap_threshold = ms->mmap_threshold;
-   check_action = ms->check_action;
-   main_arena.max_system_mem = ms->max_sbrked_mem;
---- glibc-2.6.orig/malloc/Makefile
-+++ glibc-2.6/malloc/Makefile
-@@ -104,7 +104,6 @@
- include ../Rules
- 
- CFLAGS-mcheck-init.c = $(PIC-ccflag)
--CFLAGS-malloc.c += -DMALLOC_DEBUG
- 
- $(objpfx)libmcheck.a: $(objpfx)mcheck-init.o
- 	-rm -f $@
---- glibc-2.6.orig/malloc/malloc.c
-+++ glibc-2.6/malloc/malloc.c
-@@ -2358,9 +2358,6 @@
-   /* Memory map support */
-   int              n_mmaps;
-   int              n_mmaps_max;
--#if MALLOC_DEBUG
--  int              n_mmaps_cmax;
--#endif
-   int              max_n_mmaps;
-   /* the mmap_threshold is dynamic, until the user sets
-      it manually, at which point we need to disable any
-@@ -2572,7 +2569,7 @@
- #if HAVE_MMAP
-     /* address is outside main heap  */
-     if (contiguous(av) && av->top != initial_top(av)) {
--      assert(((char*)p) < min_address || ((char*)p) > max_address);
-+      assert(((char*)p) < min_address || ((char*)p) >= max_address);
-     }
-     /* chunk is page-aligned */
-     assert(((p->prev_size + sz) & (mp_.pagesize-1)) == 0);
-@@ -2876,8 +2873,6 @@
-   assert(total <= (unsigned long)(mp_.max_total_mem));
-   assert(mp_.n_mmaps >= 0);
- #endif
--  assert(mp_.n_mmaps <= mp_.n_mmaps_cmax);
--  assert(mp_.n_mmaps_max <= mp_.n_mmaps_cmax);
-   assert(mp_.n_mmaps <= mp_.max_n_mmaps);
- 
-   assert((unsigned long)(av->system_mem) <=
-@@ -3475,13 +3470,6 @@
-     }
- 
-   mp_.n_mmaps--;
--#if MALLOC_DEBUG
--  if (mp_.n_mmaps_cmax > mp_.n_mmaps_max)
--    {
--      assert (mp_.n_mmaps_cmax == mp_.n_mmaps + 1);
--      mp_.n_mmaps_cmax = mp_.n_mmaps;
--    }
--#endif
-   mp_.mmapped_mem -= total_size;
- 
-   int ret __attribute__ ((unused)) = munmap((char *)block, total_size);
-@@ -5397,9 +5385,6 @@
-   mp_.n_mmaps_max = 0;
-   mem = _int_malloc(av, size);
-   mp_.n_mmaps_max = mmx;   /* reset mmap */
--#if MALLOC_DEBUG
--  mp_.n_mmaps_cmax = mmx;
--#endif
-   if (mem == 0)
-     return 0;
- 
-@@ -5725,17 +5710,8 @@
-       res = 0;
-     else
- #endif
--      {
--#if MALLOC_DEBUG
--	if (mp_.n_mmaps <= value)
--	  mp_.n_mmaps_cmax = value;
--	else
--	  mp_.n_mmaps_cmax = mp_.n_mmaps;
--#endif
--
--	mp_.n_mmaps_max = value;
--	mp_.no_dyn_threshold = 1;
--      }
-+      mp_.n_mmaps_max = value;
-+      mp_.no_dyn_threshold = 1;
-     break;
- 
-   case M_CHECK_ACTION:
---- glibc-2.6.orig/malloc/mcheck.c
-+++ glibc-2.6/malloc/mcheck.c
-@@ -1,5 +1,5 @@
- /* Standard debugging hooks for `malloc'.
--   Copyright (C) 1990-1997,99,2000,01,02 Free Software Foundation, Inc.
-+   Copyright (C) 1990-1997,1999,2000-2002,2007 Free Software Foundation, Inc.
-    This file is part of the GNU C Library.
-    Written May 1989 by Mike Haertel.
- 
-@@ -264,6 +264,12 @@
- static __ptr_t
- reallochook (__ptr_t ptr, __malloc_size_t size, const __ptr_t caller)
- {
-+  if (size == 0)
-+    {
-+      freehook (ptr, caller);
-+      return NULL;
-+    }
-+
-   struct hdr *hdr;
-   __malloc_size_t osize;
- 
---- glibc-2.6.orig/math/test-misc.c
-+++ glibc-2.6/math/test-misc.c
-@@ -1235,7 +1235,12 @@
-     }
- #endif
- 
--#if !defined NO_LONG_DOUBLE && LDBL_MANT_DIG >= DBL_MANT_DIG + 4
-+/* Skip testing IBM long double format, for 2 reasons:
-+   1) it only supports FE_TONEAREST
-+   2) nextafter (0.0, 1.0) == nextafterl (0.0L, 1.0L), so
-+      nextafter (0.0, 1.0) / 16.0L will be 0.0L.  */
-+#if !defined NO_LONG_DOUBLE && LDBL_MANT_DIG >= DBL_MANT_DIG + 4 \
-+    && LDBL_MANT_DIG != 106
-   int oldmode = fegetround ();
-   int j;
-   for (j = 0; j < 4; j++)
---- glibc-2.6.orig/nis/nss-default.c
-+++ glibc-2.6/nis/nss-default.c
-@@ -1,4 +1,4 @@
--/* Copyright (C) 1996, 2001, 2004, 2006 Free Software Foundation, Inc.
-+/* Copyright (C) 1996, 2001, 2004, 2006, 2007 Free Software Foundation, Inc.
-    This file is part of the GNU C Library.
- 
-    The GNU C Library is free software; you can redistribute it and/or
-@@ -17,6 +17,7 @@
-    02111-1307 USA.  */
- 
- #include <ctype.h>
-+#include <errno.h>
- #include <stdio.h>
- #include <stdio_ext.h>
- #include <stdlib.h>
-@@ -54,6 +55,7 @@
- static void
- init (void)
- {
-+  int saved_errno = errno;
-   FILE *fp = fopen (default_nss, "rc");
-   if (fp != NULL)
-     {
-@@ -111,6 +113,7 @@
- 
-       fclose (fp);
-     }
-+  __set_errno (saved_errno);
- }
- 
- 
---- glibc-2.6.orig/nptl/allocatestack.c
-+++ glibc-2.6/nptl/allocatestack.c
-@@ -996,3 +996,60 @@
- 
-   lll_unlock (stack_cache_lock);
- }
-+
-+
-+void
-+attribute_hidden
-+__wait_lookup_done (void)
-+{
-+  lll_lock (stack_cache_lock);
-+
-+  struct pthread *self = THREAD_SELF;
-+
-+  /* Iterate over the list with system-allocated threads first.  */
-+  list_t *runp;
-+  list_for_each (runp, &stack_used)
-+    {
-+      struct pthread *t = list_entry (runp, struct pthread, list);
-+      if (t == self || t->header.gscope_flag == THREAD_GSCOPE_FLAG_UNUSED)
-+	continue;
-+
-+      int *const gscope_flagp = &t->header.gscope_flag;
-+
-+      /* We have to wait until this thread is done with the global
-+	 scope.  First tell the thread that we are waiting and
-+	 possibly have to be woken.  */
-+      if (atomic_compare_and_exchange_bool_acq (gscope_flagp,
-+						THREAD_GSCOPE_FLAG_WAIT,
-+						THREAD_GSCOPE_FLAG_USED))
-+	continue;
-+
-+      do
-+	lll_futex_wait (gscope_flagp, THREAD_GSCOPE_FLAG_WAIT);
-+      while (*gscope_flagp == THREAD_GSCOPE_FLAG_WAIT);
-+    }
-+
-+  /* Now the list with threads using user-allocated stacks.  */
-+  list_for_each (runp, &__stack_user)
-+    {
-+      struct pthread *t = list_entry (runp, struct pthread, list);
-+      if (t == self || t->header.gscope_flag == THREAD_GSCOPE_FLAG_UNUSED)
-+	continue;
-+
-+      int *const gscope_flagp = &t->header.gscope_flag;
-+
-+      /* We have to wait until this thread is done with the global
-+	 scope.  First tell the thread that we are waiting and
-+	 possibly have to be woken.  */
-+      if (atomic_compare_and_exchange_bool_acq (gscope_flagp,
-+						THREAD_GSCOPE_FLAG_WAIT,
-+						THREAD_GSCOPE_FLAG_USED))
-+	continue;
-+
-+      do
-+	lll_futex_wait (gscope_flagp, THREAD_GSCOPE_FLAG_WAIT);
-+      while (*gscope_flagp == THREAD_GSCOPE_FLAG_WAIT);
-+    }
-+
-+  lll_unlock (stack_cache_lock);
-+}
---- glibc-2.6.orig/nptl/ChangeLog
-+++ glibc-2.6/nptl/ChangeLog
-@@ -1,3 +1,124 @@
-+2007-06-22  Jakub Jelinek  <jakub@redhat.com>
-+
-+	* pthread_getattr_np.c (pthread_getattr_np): Clear cpuset and
-+	cpusetsize if pthread_getaffinity_np failed with ENOSYS.
-+
-+2007-05-28  Jakub Jelinek  <jakub@redhat.com>
-+
-+	* sysdeps/i386/tls.h (THREAD_GSCOPE_RESET_FLAG): Use explicit
-+	insn suffix.
-+	(THREAD_GSCOPE_GET_FLAG): Remove.
-+	* sysdeps/x86_64/tls.h (THREAD_GSCOPE_GET_FLAG): Remove.
-+	* allocatestack.c (__wait_lookup_done): Revert 2007-05-24
-+	changes.
-+	* sysdeps/powerpc/tls.h (tcbhead_t): Remove gscope_flag.
-+	(THREAD_GSCOPE_GET_FLAG): Remove.
-+	(THREAD_GSCOPE_RESET_FLAG): Use THREAD_SELF->header.gscope_flag
-+	instead of THREAD_GSCOPE_GET_FLAG.
-+	(THREAD_GSCOPE_SET_FLAG): Likewise.  Add atomic_write_barrier after
-+	it.
-+	* sysdeps/s390/tls.h (THREAD_GSCOPE_FLAG_UNUSED,
-+	THREAD_GSCOPE_FLAG_USED, THREAD_GSCOPE_FLAG_WAIT,
-+	THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_SET_FLAG,
-+	THREAD_GSCOPE_WAIT): Define.
-+	* sysdeps/sparc/tls.h (THREAD_GSCOPE_FLAG_UNUSED,
-+	THREAD_GSCOPE_FLAG_USED, THREAD_GSCOPE_FLAG_WAIT,
-+	THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_SET_FLAG,
-+	THREAD_GSCOPE_WAIT): Define.
-+	* sysdeps/sh/tls.h (THREAD_GSCOPE_FLAG_UNUSED,
-+	THREAD_GSCOPE_FLAG_USED, THREAD_GSCOPE_FLAG_WAIT,
-+	THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_SET_FLAG,
-+	THREAD_GSCOPE_WAIT): Define.
-+	* sysdeps/ia64/tls.h (THREAD_GSCOPE_FLAG_UNUSED,
-+	THREAD_GSCOPE_FLAG_USED, THREAD_GSCOPE_FLAG_WAIT,
-+	THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_SET_FLAG,
-+	THREAD_GSCOPE_WAIT): Define.
-+
-+2007-05-24  Richard Henderson  <rth@redhat.com>
-+
-+	* descr.h (struct pthread): Add header.gscope_flag.
-+	* sysdeps/alpha/tls.h (THREAD_GSCOPE_FLAG_UNUSED,
-+	THREAD_GSCOPE_FLAG_USED, THREAD_GSCOPE_FLAG_WAIT,
-+	THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_SET_FLAG,
-+	THREAD_GSCOPE_WAIT): Define.
-+
-+2007-05-26  Ulrich Drepper  <drepper@redhat.com>
-+
-+	* allocatestack.c: Revert last change.
-+	* init.c: Likewise.
-+	* sysdeps/i386/tls.h: Likewise.
-+	* sysdeps/x86_64/tls.h: Likewise.
-+
-+2007-05-24  Jakub Jelinek  <jakub@redhat.com>
-+
-+	* sysdeps/powerpc/tls.h (tcbhead_t): Add gscope_flag.
-+	(THREAD_GSCOPE_FLAG_UNUSED, THREAD_GSCOPE_FLAG_USED,
-+	THREAD_GSCOPE_FLAG_WAIT): Define.
-+	(THREAD_GSCOPE_GET_FLAG, THREAD_GSCOPE_SET_FLAG,
-+	THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_WAIT): Define.
-+	* sysdeps/i386/tls.h (THREAD_GSCOPE_WAIT): Don't use
-+	PTR_DEMANGLE.
-+	(THREAD_GSCOPE_GET_FLAG): Define.
-+	* sysdeps/x86_64/tls.h (THREAD_GSCOPE_GET_FLAG): Define.
-+	* allocatestack.c (__wait_lookup_done): Use THREAD_GSCOPE_GET_FLAG
-+	instead of ->header.gscope_flag directly.
-+
-+2007-05-21  Ulrich Drepper  <drepper@redhat.com>
-+
-+	* sysdeps/pthread/pthread-functions.h (struct pthread_functions):
-+	Remove ptr_wait_lookup_done again.
-+	* init.c (pthread_functions): Don't add .ptr_wait_lookup_done here.
-+	(__pthread_initialize_minimal_internal): Initialize
-+	_dl_wait_lookup_done pointer in _rtld_global directly.
-+	* sysdeps/unix/sysv/linux/libc_pthread_init.c (__libc_pthread_init):
-+	Remove code to code _dl_wait_lookup_done.
-+	* sysdeps/x86_64/tls.h (THREAD_GSCOPE_WAIT): The pointer is not
-+	encrypted for now.
-+
-+2007-05-19  Ulrich Drepper  <drepper@redhat.com>
-+
-+	* allocatestack.c (__wait_lookup_done): New function.
-+	* sysdeps/pthread/pthread-functions.h (struct pthread_functions):
-+	Add ptr_wait_lookup_done.
-+	* init.c (pthread_functions): Initialize .ptr_wait_lookup_done.
-+	* pthreadP.h: Declare __wait_lookup_done.
-+	* sysdeps/i386/tls.h (tcbhead_t): Add gscope_flag.
-+	Define macros to implement reference handling of global scope.
-+	* sysdeps/x86_64/tls.h: Likewise.
-+	* sysdeps/unix/sysv/linux/libc_pthread_init.c (__libc_pthread_init):
-+	Initialize GL(dl_wait_lookup_done).
-+
-+2007-05-25  Ulrich Drepper  <drepper@redhat.com>
-+
-+	* Makefile (tests): Add tst-sem10.
-+	* tst-sem10.c: New file.
-+
-+2007-05-25  Ulrich Drepper  <drepper@redhat.com>
-+	    Jakub Jelinek  <jakub@redhat.com>
-+
-+	* sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S (sem_timedwait):
-+	Move __pthread_enable_asynccancel right before futex syscall.
-+	* sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S (sem_timedwait):
-+	Likewise.
-+
-+2007-05-21  Jakub Jelinek  <jakub@redhat.com>
-+
-+	* tst-robust9.c (do_test): Don't fail if ENABLE_PI and
-+	pthread_mutex_init failed with ENOTSUP.
-+
-+2007-05-17  Ulrich Drepper  <drepper@redhat.com>
-+
-+	[BZ #4512]
-+	* pthread_mutex_lock.c: Preserve FUTEX_WAITERS bit when dead owner
-+	is detected.
-+	* pthread_mutex_timedlock.c: Likewise.
-+	* pthread_mutex_trylock.c: Likewise.
-+	Patch in part by Atsushi Nemoto <anemo@mba.ocn.ne.jp>.
-+
-+	* Makefile (tests): Add tst-robust9 and tst-robustpi9.
-+	* tst-robust9.c: New file.
-+	* tst-robustpi9.c: New file.
-+
- 2007-05-14  Ulrich Drepper  <drepper@redhat.com>
- 
- 	* sysdeps/unix/sysv/linux/x86_64/sem_wait.S: Remove unnecessary
---- glibc-2.6.orig/nptl/descr.h
-+++ glibc-2.6/nptl/descr.h
-@@ -131,6 +131,7 @@
-     struct
-     {
-       int multiple_threads;
-+      int gscope_flag;
-     } header;
- #endif
- 
---- glibc-2.6.orig/nptl/init.c
-+++ glibc-2.6/nptl/init.c
-@@ -1,4 +1,4 @@
--/* Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
-+/* Copyright (C) 2002,2003,2004,2005,2006,2007 Free Software Foundation, Inc.
-    This file is part of the GNU C Library.
-    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
- 
-@@ -386,6 +386,8 @@
- 
-   GL(dl_init_static_tls) = &__pthread_init_static_tls;
- 
-+  GL(dl_wait_lookup_done) = &__wait_lookup_done;
-+
-   /* Register the fork generation counter with the libc.  */
- #ifndef TLS_MULTIPLE_THREADS_IN_TCB
-   __libc_multiple_threads_ptr =
---- glibc-2.6.orig/nptl/Makefile
-+++ glibc-2.6/nptl/Makefile
-@@ -1,4 +1,4 @@
--# Copyright (C) 2002,2003,2004,2005,2006 Free Software Foundation, Inc.
-+# Copyright (C) 2002,2003,2004,2005,2006,2007 Free Software Foundation, Inc.
- # This file is part of the GNU C Library.
- 
- # The GNU C Library is free software; you can redistribute it and/or
-@@ -209,16 +209,16 @@
- 	tst-cond14 tst-cond15 tst-cond16 tst-cond17 tst-cond18 tst-cond19 \
- 	tst-cond20 tst-cond21 tst-cond22 \
- 	tst-robust1 tst-robust2 tst-robust3 tst-robust4 tst-robust5 \
--	tst-robust6 tst-robust7 tst-robust8 \
--	tst-robustpi1 tst-robustpi2 tst-robustpi3 tst-robustpi4 \
--	tst-robustpi5 tst-robustpi6 tst-robustpi7 tst-robustpi8 \
-+	tst-robust6 tst-robust7 tst-robust8 tst-robust9 \
-+	tst-robustpi1 tst-robustpi2 tst-robustpi3 tst-robustpi4 tst-robustpi5 \
-+	tst-robustpi6 tst-robustpi7 tst-robustpi8 tst-robustpi9 \
- 	tst-rwlock1 tst-rwlock2 tst-rwlock3 tst-rwlock4 tst-rwlock5 \
- 	tst-rwlock6 tst-rwlock7 tst-rwlock8 tst-rwlock9 tst-rwlock10 \
- 	tst-rwlock11 tst-rwlock12 tst-rwlock13 tst-rwlock14 \
- 	tst-once1 tst-once2 tst-once3 tst-once4 \
- 	tst-key1 tst-key2 tst-key3 tst-key4 \
- 	tst-sem1 tst-sem2 tst-sem3 tst-sem4 tst-sem5 tst-sem6 tst-sem7 \
--	tst-sem8 tst-sem9 \
-+	tst-sem8 tst-sem9 tst-sem10 \
- 	tst-barrier1 tst-barrier2 tst-barrier3 tst-barrier4 \
- 	tst-align tst-align2 tst-align3 \
- 	tst-basic1 tst-basic2 tst-basic3 tst-basic4 tst-basic5 tst-basic6 \
---- glibc-2.6.orig/nptl/pthread_getattr_np.c
-+++ glibc-2.6/nptl/pthread_getattr_np.c
-@@ -1,4 +1,4 @@
--/* Copyright (C) 2002, 2003, 2004, 2006 Free Software Foundation, Inc.
-+/* Copyright (C) 2002, 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
-    This file is part of the GNU C Library.
-    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
- 
-@@ -168,8 +168,12 @@
- 	{
- 	  free (cpuset);
- 	  if (ret == ENOSYS)
--	    /* There is no such functionality.  */
--	    ret = 0;
-+	    {	  
-+	      /* There is no such functionality.  */
-+	      ret = 0;
-+	      iattr->cpuset = NULL;
-+	      iattr->cpusetsize = 0;
-+	    }
- 	}
-     }
- 
---- glibc-2.6.orig/nptl/pthread_mutex_lock.c
-+++ glibc-2.6/nptl/pthread_mutex_lock.c
-@@ -1,4 +1,4 @@
--/* Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
-+/* Copyright (C) 2002,2003,2004,2005,2006,2007 Free Software Foundation, Inc.
-    This file is part of the GNU C Library.
-    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
- 
-@@ -127,6 +127,8 @@
- 	      int newval = id;
- #ifdef NO_INCR
- 	      newval |= FUTEX_WAITERS;
-+#else
-+	      newval |= (oldval & FUTEX_WAITERS);
- #endif
- 
- 	      newval
---- glibc-2.6.orig/nptl/pthread_mutex_timedlock.c
-+++ glibc-2.6/nptl/pthread_mutex_timedlock.c
-@@ -1,4 +1,4 @@
--/* Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
-+/* Copyright (C) 2002,2003,2004,2005,2006,2007 Free Software Foundation, Inc.
-    This file is part of the GNU C Library.
-    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
- 
-@@ -119,9 +119,11 @@
- 	  if ((oldval & FUTEX_OWNER_DIED) != 0)
- 	    {
- 	      /* The previous owner died.  Try locking the mutex.  */
--	      int newval
-+	      int newval = id | (oldval & FUTEX_WAITERS);
-+
-+	      newval
- 		= atomic_compare_and_exchange_val_acq (&mutex->__data.__lock,
--						       id, oldval);
-+						       newval, oldval);
- 	      if (newval != oldval)
- 		{
- 		  oldval = newval;
---- glibc-2.6.orig/nptl/pthread_mutex_trylock.c
-+++ glibc-2.6/nptl/pthread_mutex_trylock.c
-@@ -84,9 +84,11 @@
- 	  if ((oldval & FUTEX_OWNER_DIED) != 0)
- 	    {
- 	      /* The previous owner died.  Try locking the mutex.  */
--	      int newval
-+	      int newval = id | (oldval & FUTEX_WAITERS);
-+
-+	      newval
- 		= atomic_compare_and_exchange_val_acq (&mutex->__data.__lock,
--						       id, oldval);
-+						       newval, oldval);
- 
- 	      if (newval != oldval)
- 		{
---- glibc-2.6.orig/nptl/pthreadP.h
-+++ glibc-2.6/nptl/pthreadP.h
-@@ -1,4 +1,4 @@
--/* Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
-+/* Copyright (C) 2002,2003,2004,2005,2006,2007 Free Software Foundation, Inc.
-    This file is part of the GNU C Library.
-    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
- 
-@@ -545,6 +545,8 @@
- 
- extern void __free_stack_cache (void) attribute_hidden;
- 
-+extern void __wait_lookup_done (void) attribute_hidden;
-+
- #ifdef SHARED
- # define PTHREAD_STATIC_FN_REQUIRE(name)
- #else
---- glibc-2.6.orig/nptl/sysdeps/alpha/tls.h
-+++ glibc-2.6/nptl/sysdeps/alpha/tls.h
-@@ -1,5 +1,5 @@
- /* Definition for thread-local data handling.  NPTL/Alpha version.
--   Copyright (C) 2003, 2005, 2006 Free Software Foundation, Inc.
-+   Copyright (C) 2003, 2005, 2006, 2007 Free Software Foundation, Inc.
-    This file is part of the GNU C Library.
- 
-    The GNU C Library is free software; you can redistribute it and/or
-@@ -121,6 +121,29 @@
- #define THREAD_SETMEM_NC(descr, member, idx, value) \
-   descr->member[idx] = (value)
- 
-+/* Get and set the global scope generation counter in struct pthread.  */
-+#define THREAD_GSCOPE_FLAG_UNUSED 0
-+#define THREAD_GSCOPE_FLAG_USED   1
-+#define THREAD_GSCOPE_FLAG_WAIT   2
-+#define THREAD_GSCOPE_RESET_FLAG() \
-+  do									     \
-+    { int __res								     \
-+	= atomic_exchange_rel (&THREAD_SELF->header.gscope_flag,	     \
-+			       THREAD_GSCOPE_FLAG_UNUSED);		     \
-+      if (__res == THREAD_GSCOPE_FLAG_WAIT)				     \
-+	lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1);		     \
-+    }									     \
-+  while (0)
-+#define THREAD_GSCOPE_SET_FLAG() \
-+  do									     \
-+    {									     \
-+      THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED;	     \
-+      atomic_write_barrier ();						     \
-+    }									     \
-+  while (0)
-+#define THREAD_GSCOPE_WAIT() \
-+  GL(dl_wait_lookup_done) ()
-+
- #endif /* __ASSEMBLER__ */
- 
- #endif	/* tls.h */
---- glibc-2.6.orig/nptl/sysdeps/i386/tls.h
-+++ glibc-2.6/nptl/sysdeps/i386/tls.h
-@@ -1,5 +1,5 @@
- /* Definition for thread-local data handling.  nptl/i386 version.
--   Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
-+   Copyright (C) 2002,2003,2004,2005,2006,2007 Free Software Foundation, Inc.
-    This file is part of the GNU C Library.
- 
-    The GNU C Library is free software; you can redistribute it and/or
-@@ -51,6 +51,7 @@
-   uintptr_t sysinfo;
-   uintptr_t stack_guard;
-   uintptr_t pointer_guard;
-+  int gscope_flag;
- } tcbhead_t;
- 
- # define TLS_MULTIPLE_THREADS_IN_TCB 1
-@@ -431,6 +432,26 @@
-    = THREAD_GETMEM (THREAD_SELF, header.pointer_guard))
- 
- 
-+/* Get and set the global scope generation counter in the TCB head.  */
-+#define THREAD_GSCOPE_FLAG_UNUSED 0
-+#define THREAD_GSCOPE_FLAG_USED   1
-+#define THREAD_GSCOPE_FLAG_WAIT   2
-+#define THREAD_GSCOPE_RESET_FLAG() \
-+  do									      \
-+    { int __res;							      \
-+      asm volatile ("xchgl %0, %%gs:%P1"				      \
-+		    : "=r" (__res)					      \
-+		    : "i" (offsetof (struct pthread, header.gscope_flag)),    \
-+		      "0" (THREAD_GSCOPE_FLAG_UNUSED));			      \
-+      if (__res == THREAD_GSCOPE_FLAG_WAIT)				      \
-+	lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1);		      \
-+    }									      \
-+  while (0)
-+#define THREAD_GSCOPE_SET_FLAG() \
-+  THREAD_SETMEM (THREAD_SELF, header.gscope_flag, THREAD_GSCOPE_FLAG_USED)
-+#define THREAD_GSCOPE_WAIT() \
-+  GL(dl_wait_lookup_done) ()
-+
- #endif /* __ASSEMBLER__ */
- 
- #endif	/* tls.h */
---- glibc-2.6.orig/nptl/sysdeps/ia64/tls.h
-+++ glibc-2.6/nptl/sysdeps/ia64/tls.h
-@@ -1,5 +1,5 @@
- /* Definition for thread-local data handling.  nptl/IA-64 version.
--   Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
-+   Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
-    This file is part of the GNU C Library.
- 
-    The GNU C Library is free software; you can redistribute it and/or
-@@ -163,6 +163,29 @@
-   (((uintptr_t *) ((char *) (descr) + TLS_PRE_TCB_SIZE))[-2] \
-    = THREAD_GET_POINTER_GUARD ())
- 
-+/* Get and set the global scope generation counter in struct pthread.  */
-+#define THREAD_GSCOPE_FLAG_UNUSED 0
-+#define THREAD_GSCOPE_FLAG_USED   1
-+#define THREAD_GSCOPE_FLAG_WAIT   2
-+#define THREAD_GSCOPE_RESET_FLAG() \
-+  do									     \
-+    { int __res								     \
-+	= atomic_exchange_rel (&THREAD_SELF->header.gscope_flag,	     \
-+			       THREAD_GSCOPE_FLAG_UNUSED);		     \
-+      if (__res == THREAD_GSCOPE_FLAG_WAIT)				     \
-+	lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1);		     \
-+    }									     \
-+  while (0)
-+#define THREAD_GSCOPE_SET_FLAG() \
-+  do									     \
-+    {									     \
-+      THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED;	     \
-+      atomic_write_barrier ();						     \
-+    }									     \
-+  while (0)
-+#define THREAD_GSCOPE_WAIT() \
-+  GL(dl_wait_lookup_done) ()
-+
- #endif /* __ASSEMBLER__ */
- 
- #endif	/* tls.h */
---- glibc-2.6.orig/nptl/sysdeps/powerpc/tls.h
-+++ glibc-2.6/nptl/sysdeps/powerpc/tls.h
-@@ -1,5 +1,5 @@
- /* Definition for thread-local data handling.  NPTL/PowerPC version.
--   Copyright (C) 2003, 2005, 2006 Free Software Foundation, Inc.
-+   Copyright (C) 2003, 2005, 2006, 2007 Free Software Foundation, Inc.
-    This file is part of the GNU C Library.
- 
-    The GNU C Library is free software; you can redistribute it and/or
-@@ -180,6 +180,29 @@
-    different value to mean unset l_tls_offset.  */
- # define NO_TLS_OFFSET		-1
- 
-+/* Get and set the global scope generation counter in struct pthread.  */
-+#define THREAD_GSCOPE_FLAG_UNUSED 0
-+#define THREAD_GSCOPE_FLAG_USED   1
-+#define THREAD_GSCOPE_FLAG_WAIT   2
-+#define THREAD_GSCOPE_RESET_FLAG() \
-+  do									     \
-+    { int __res								     \
-+	= atomic_exchange_rel (&THREAD_SELF->header.gscope_flag,	     \
-+			       THREAD_GSCOPE_FLAG_UNUSED);		     \
-+      if (__res == THREAD_GSCOPE_FLAG_WAIT)				     \
-+	lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1);		     \
-+    }									     \
-+  while (0)
-+#define THREAD_GSCOPE_SET_FLAG() \
-+  do									     \
-+    {									     \
-+      THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED;	     \
-+      atomic_write_barrier ();						     \
-+    }									     \
-+  while (0)
-+#define THREAD_GSCOPE_WAIT() \
-+  GL(dl_wait_lookup_done) ()
-+
- #endif /* __ASSEMBLER__ */
- 
- #endif	/* tls.h */
---- glibc-2.6.orig/nptl/sysdeps/s390/tls.h
-+++ glibc-2.6/nptl/sysdeps/s390/tls.h
-@@ -1,5 +1,5 @@
- /* Definition for thread-local data handling.  NPTL/s390 version.
--   Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
-+   Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
-    This file is part of the GNU C Library.
- 
-    The GNU C Library is free software; you can redistribute it and/or
-@@ -50,6 +50,7 @@
-   int multiple_threads;
-   uintptr_t sysinfo;
-   uintptr_t stack_guard;
-+  int gscope_flag;
- } tcbhead_t;
- 
- # ifndef __s390x__
-@@ -168,6 +169,29 @@
- #define THREAD_SET_POINTER_GUARD(value)
- #define THREAD_COPY_POINTER_GUARD(descr)
- 
-+/* Get and set the global scope generation counter in struct pthread.  */
-+#define THREAD_GSCOPE_FLAG_UNUSED 0
-+#define THREAD_GSCOPE_FLAG_USED   1
-+#define THREAD_GSCOPE_FLAG_WAIT   2
-+#define THREAD_GSCOPE_RESET_FLAG() \
-+  do									     \
-+    { int __res								     \
-+	= atomic_exchange_rel (&THREAD_SELF->header.gscope_flag,	     \
-+			       THREAD_GSCOPE_FLAG_UNUSED);		     \
-+      if (__res == THREAD_GSCOPE_FLAG_WAIT)				     \
-+	lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1);		     \
-+    }									     \
-+  while (0)
-+#define THREAD_GSCOPE_SET_FLAG() \
-+  do									     \
-+    {									     \
-+      THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED;	     \
-+      atomic_write_barrier ();						     \
-+    }									     \
-+  while (0)
-+#define THREAD_GSCOPE_WAIT() \
-+  GL(dl_wait_lookup_done) ()
-+
- #endif /* __ASSEMBLER__ */
- 
- #endif	/* tls.h */
---- glibc-2.6.orig/nptl/sysdeps/sh/tls.h
-+++ glibc-2.6/nptl/sysdeps/sh/tls.h
-@@ -1,5 +1,5 @@
- /* Definition for thread-local data handling.  NPTL/SH version.
--   Copyright (C) 2003, 2005, 2006 Free Software Foundation, Inc.
-+   Copyright (C) 2003, 2005, 2006, 2007 Free Software Foundation, Inc.
-    This file is part of the GNU C Library.
- 
-    The GNU C Library is free software; you can redistribute it and/or
-@@ -150,6 +150,29 @@
-      __asm __volatile ("stc gbr,%0" : "=r" (__tcbp));			      \
-      ((tcbhead_t *) (descr + 1))->pointer_guard	= __tcbp->pointer_guard;})
- 
-+/* Get and set the global scope generation counter in struct pthread.  */
-+#define THREAD_GSCOPE_FLAG_UNUSED 0
-+#define THREAD_GSCOPE_FLAG_USED   1
-+#define THREAD_GSCOPE_FLAG_WAIT   2
-+#define THREAD_GSCOPE_RESET_FLAG() \
-+  do									     \
-+    { int __res								     \
-+	= atomic_exchange_rel (&THREAD_SELF->header.gscope_flag,	     \
-+			       THREAD_GSCOPE_FLAG_UNUSED);		     \
-+      if (__res == THREAD_GSCOPE_FLAG_WAIT)				     \
-+	lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1);		     \
-+    }									     \
-+  while (0)
-+#define THREAD_GSCOPE_SET_FLAG() \
-+  do									     \
-+    {									     \
-+      THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED;	     \
-+      atomic_write_barrier ();						     \
-+    }									     \
-+  while (0)
-+#define THREAD_GSCOPE_WAIT() \
-+  GL(dl_wait_lookup_done) ()
-+
- #endif /* __ASSEMBLER__ */
- 
- #endif	/* tls.h */
---- glibc-2.6.orig/nptl/sysdeps/sparc/tls.h
-+++ glibc-2.6/nptl/sysdeps/sparc/tls.h
-@@ -1,5 +1,5 @@
- /* Definitions for thread-local data handling.  NPTL/sparc version.
--   Copyright (C) 2003, 2005, 2006 Free Software Foundation, Inc.
-+   Copyright (C) 2003, 2005, 2006, 2007 Free Software Foundation, Inc.
-    This file is part of the GNU C Library.
- 
-    The GNU C Library is free software; you can redistribute it and/or
-@@ -141,6 +141,29 @@
- # define THREAD_COPY_POINTER_GUARD(descr) \
-   ((descr)->header.pointer_guard = THREAD_GET_POINTER_GUARD ())
- 
-+/* Get and set the global scope generation counter in struct pthread.  */
-+#define THREAD_GSCOPE_FLAG_UNUSED 0
-+#define THREAD_GSCOPE_FLAG_USED   1
-+#define THREAD_GSCOPE_FLAG_WAIT   2
-+#define THREAD_GSCOPE_RESET_FLAG() \
-+  do									     \
-+    { int __res								     \
-+	= atomic_exchange_rel (&THREAD_SELF->header.gscope_flag,	     \
-+			       THREAD_GSCOPE_FLAG_UNUSED);		     \
-+      if (__res == THREAD_GSCOPE_FLAG_WAIT)				     \
-+	lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1);		     \
-+    }									     \
-+  while (0)
-+#define THREAD_GSCOPE_SET_FLAG() \
-+  do									     \
-+    {									     \
-+      THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED;	     \
-+      atomic_write_barrier ();						     \
-+    }									     \
-+  while (0)
-+#define THREAD_GSCOPE_WAIT() \
-+  GL(dl_wait_lookup_done) ()
-+
- #endif /* !ASSEMBLER */
- 
- #endif	/* tls.h */
---- glibc-2.6.orig/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S
-+++ glibc-2.6/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S
-@@ -1,4 +1,4 @@
--/* Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
-+/* Copyright (C) 2002, 2003, 2004, 2005, 2007 Free Software Foundation, Inc.
-    This file is part of the GNU C Library.
-    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
- 
-@@ -79,10 +79,7 @@
- 	jae	6f
- 
- 	cfi_offset(3, -16)		/* %ebx */
--7:	call	__pthread_enable_asynccancel
--	movl	%eax, 8(%esp)
--
--	xorl	%ecx, %ecx
-+7:	xorl	%ecx, %ecx
- 	movl	%esp, %ebx
- 	movl	%ecx, %edx
- 	movl	$SYS_gettimeofday, %eax
-@@ -105,6 +102,10 @@
- 
- 	movl	%ecx, (%esp)	/* Store relative timeout.  */
- 	movl	%edx, 4(%esp)
-+
-+	call	__pthread_enable_asynccancel
-+	movl	%eax, 8(%esp)
-+
- 	movl	28(%esp), %ebx
- 	xorl	%ecx, %ecx
- 	movl	%esp, %esi
---- glibc-2.6.orig/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S
-+++ glibc-2.6/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S
-@@ -73,10 +73,7 @@
- 	cfi_offset(14, -24)		/* %r14 */
- 	jae	6f
- 
--7:	call	__pthread_enable_asynccancel
--	movl	%eax, 16(%rsp)
--
--	xorl	%esi, %esi
-+7:	xorl	%esi, %esi
- 	movq	%rsp, %rdi
- 	movq	$VSYSCALL_ADDR_vgettimeofday, %rax
- 	callq	*%rax
-@@ -99,6 +96,9 @@
- 	movq	%rdi, (%rsp)	/* Store relative timeout.  */
- 	movq	%rsi, 8(%rsp)
- 
-+	call	__pthread_enable_asynccancel
-+	movl	%eax, 16(%rsp)
-+
- 	movq	%rsp, %r10
- 	movq	%r12, %rdi
- 	xorl	%esi, %esi
---- glibc-2.6.orig/nptl/sysdeps/x86_64/tls.h
-+++ glibc-2.6/nptl/sysdeps/x86_64/tls.h
-@@ -47,6 +47,7 @@
-   dtv_t *dtv;
-   void *self;		/* Pointer to the thread descriptor.  */
-   int multiple_threads;
-+  int gscope_flag;
-   uintptr_t sysinfo;
-   uintptr_t stack_guard;
-   uintptr_t pointer_guard;
-@@ -337,6 +338,26 @@
-    = THREAD_GETMEM (THREAD_SELF, header.pointer_guard))
- 
- 
-+/* Get and set the global scope generation counter in the TCB head.  */
-+#define THREAD_GSCOPE_FLAG_UNUSED 0
-+#define THREAD_GSCOPE_FLAG_USED   1
-+#define THREAD_GSCOPE_FLAG_WAIT   2
-+#define THREAD_GSCOPE_RESET_FLAG() \
-+  do									      \
-+    { int __res;							      \
-+      asm volatile ("xchgl %0, %%fs:%P1"				      \
-+		    : "=r" (__res)					      \
-+		    : "i" (offsetof (struct pthread, header.gscope_flag)),    \
-+		      "0" (THREAD_GSCOPE_FLAG_UNUSED));			      \
-+      if (__res == THREAD_GSCOPE_FLAG_WAIT)				      \
-+	lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1);		      \
-+    }									      \
-+  while (0)
-+#define THREAD_GSCOPE_SET_FLAG() \
-+  THREAD_SETMEM (THREAD_SELF, header.gscope_flag, THREAD_GSCOPE_FLAG_USED)
-+#define THREAD_GSCOPE_WAIT() \
-+  GL(dl_wait_lookup_done) ()
-+
- #endif /* __ASSEMBLER__ */
- 
- #endif	/* tls.h */
---- /dev/null
-+++ glibc-2.6/nptl/tst-robust9.c
-@@ -0,0 +1,94 @@
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <errno.h>
-+#include <pthread.h>
-+#include <unistd.h>
-+#include <sys/time.h>
-+
-+
-+static pthread_mutex_t m;
-+
-+static void *
-+tf (void *data)
-+{
-+  int err = pthread_mutex_lock (&m);
-+  if (err == EOWNERDEAD)
-+    {
-+      err = pthread_mutex_consistent_np (&m);
-+      if (err)
-+	{
-+	  puts ("pthread_mutex_consistent_np");
-+	  exit (1);
-+	}
-+    }
-+  else if (err)
-+    {
-+      puts ("pthread_mutex_lock");
-+      exit (1);
-+    }
-+  printf ("thread%ld got the lock.\n", (long int) data);
-+  sleep (1);
-+  /* exit without unlock */
-+  return NULL;
-+}
-+
-+static int
-+do_test (void)
-+{
-+  int err, i;
-+  pthread_t t[3];
-+  pthread_mutexattr_t ma;
-+
-+  pthread_mutexattr_init (&ma);
-+  err = pthread_mutexattr_setrobust_np (&ma, PTHREAD_MUTEX_ROBUST_NP);
-+  if (err)
-+    {
-+      puts ("pthread_mutexattr_setrobust_np");
-+      return 1;
-+    }
-+#ifdef ENABLE_PI
-+  if (pthread_mutexattr_setprotocol (&ma, PTHREAD_PRIO_INHERIT) != 0)
-+    {
-+      puts ("pthread_mutexattr_setprotocol failed");
-+      return 1;
-+    }
-+#endif
-+  err = pthread_mutex_init (&m, &ma);
-+#ifdef ENABLE_PI
-+  if (err == ENOTSUP)
-+    {
-+      puts ("PI robust mutexes not supported");
-+      return 0;
-+    }
-+#endif
-+  if (err)
-+    {
-+      puts ("pthread_mutex_init");
-+      return 1;
-+    }
-+
-+  for (i = 0; i < sizeof (t) / sizeof (t[0]); i++)
-+    {
-+      err = pthread_create (&t[i], NULL, tf, (void *) (long int) i);
-+      if (err)
-+	{
-+	  puts ("pthread_create");
-+	  return 1;
-+	}
-+    }
-+
-+  for (i = 0; i < sizeof (t) / sizeof (t[0]); i++)
-+    {
-+      err = pthread_join (t[i], NULL);
-+      if (err)
-+	{
-+	  puts ("pthread_join");
-+	  return 1;
-+	}
-+    }
-+  return 0;
-+}
-+
-+#define TIMEOUT 5
-+#define TEST_FUNCTION do_test ()
-+#include "../test-skeleton.c"
---- /dev/null
-+++ glibc-2.6/nptl/tst-robustpi9.c
-@@ -0,0 +1,2 @@
-+#define ENABLE_PI 1
-+#include "tst-robust9.c"
---- /dev/null
-+++ glibc-2.6/nptl/tst-sem10.c
-@@ -0,0 +1,88 @@
-+/* Copyright (C) 2007 Free Software Foundation, Inc.
-+   This file is part of the GNU C Library.
-+   Contributed by Jakub Jelinek <jakub@redhat.com>, 2007.
-+
-+   The GNU C Library is free software; you can redistribute it and/or
-+   modify it under the terms of the GNU Lesser General Public
-+   License as published by the Free Software Foundation; either
-+   version 2.1 of the License, or (at your option) any later version.
-+
-+   The GNU C Library is distributed in the hope that it will be useful,
-+   but WITHOUT ANY WARRANTY; without even the implied warranty of
-+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+   Lesser General Public License for more details.
-+
-+   You should have received a copy of the GNU Lesser General Public
-+   License along with the GNU C Library; if not, write to the Free
-+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-+   02111-1307 USA.  */
-+
-+#include <errno.h>
-+#include <pthread.h>
-+#include <semaphore.h>
-+#include <stdio.h>
-+#include <time.h>
-+#include <unistd.h>
-+#include <sys/time.h>
-+
-+
-+static int
-+do_test (void)
-+{
-+  sem_t s;
-+  if (sem_init (&s, 0, 0) == -1)
-+    {
-+      puts ("sem_init failed");
-+      return 1;
-+    }
-+
-+  struct timeval tv;
-+  if (gettimeofday (&tv, NULL) != 0)
-+    {
-+      puts ("gettimeofday failed");
-+      return 1;
-+    }
-+
-+  struct timespec ts;
-+  TIMEVAL_TO_TIMESPEC (&tv, &ts);
-+
-+  /* Set ts to yesterday.  */
-+  ts.tv_sec -= 86400;
-+
-+  int type_before;
-+  if (pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED, &type_before) != 0)
-+    {
-+      puts ("first pthread_setcanceltype failed");
-+      return 1;
-+    }
-+
-+  errno = 0;
-+  if (TEMP_FAILURE_RETRY (sem_timedwait (&s, &ts)) != -1)
-+    {
-+      puts ("sem_timedwait succeeded");
-+      return 1;
-+    }
-+  if (errno != ETIMEDOUT)
-+    {
-+      printf ("sem_timedwait return errno = %d instead of ETIMEDOUT\n",
-+	      errno);
-+      return 1;
-+    }
-+
-+  int type_after;
-+  if (pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED, &type_after) != 0)
-+    {
-+      puts ("second pthread_setcanceltype failed");
-+      return 1;
-+    }
-+  if (type_after != PTHREAD_CANCEL_DEFERRED)
-+    {
-+      puts ("sem_timedwait changed cancellation type");
-+      return 1;
-+    }
-+
-+  return 0;
-+}
-+
-+#define TEST_FUNCTION do_test ()
-+#include "../test-skeleton.c"
---- glibc-2.6.orig/nscd/nscd_helper.c
-+++ glibc-2.6/nscd/nscd_helper.c
-@@ -269,11 +269,12 @@
- 			!= keylen, 0))
-     goto out_close2;
- 
--  mapfd = *(int *) CMSG_DATA (cmsg);
-+  if (__builtin_expect (CMSG_FIRSTHDR (&msg) == NULL
-+			|| (CMSG_FIRSTHDR (&msg)->cmsg_len
-+			    != CMSG_LEN (sizeof (int))), 0))
-+    goto out_close2;
- 
--  if (__builtin_expect (CMSG_FIRSTHDR (&msg)->cmsg_len
--			!= CMSG_LEN (sizeof (int)), 0))
--    goto out_close;
-+  mapfd = *(int *) CMSG_DATA (cmsg);
- 
-   struct stat64 st;
-   if (__builtin_expect (strcmp (resdata, key) != 0, 0)
---- glibc-2.6.orig/rt/tst-shm.c
-+++ glibc-2.6/rt/tst-shm.c
-@@ -60,7 +60,7 @@
- worker (int write_now)
- {
-   struct timespec ts;
--  struct stat st;
-+  struct stat64 st;
-   int i;
-   int fd = do_open ();
-   char *mem;
-@@ -68,8 +68,10 @@
-   if (fd == -1)
-     exit (fd);
- 
--  if (fstat (fd, &st) == -1 || st.st_size != 4000)
-+  if (fstat64 (fd, &st) == -1)
-     error (EXIT_FAILURE, 0, "stat failed");
-+  if (st.st_size != 4000)
-+    error (EXIT_FAILURE, 0, "size incorrect");
- 
-   mem = mmap (NULL, 4000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
-   if (mem == NULL)
-@@ -131,7 +133,7 @@
-   pid_t pid2;
-   int status1;
-   int status2;
--  struct stat st;
-+  struct stat64 st;
- 
-   /* Create the shared memory object.  */
-   fd = shm_open ("/shm-test", O_RDWR | O_CREAT | O_TRUNC | O_EXCL, 0600);
-@@ -155,11 +157,16 @@
-       return 0;
-     }
- 
--  if (fstat (fd, &st) == -1 || st.st_size != 4000)
-+  if (fstat64 (fd, &st) == -1)
-     {
-       shm_unlink ("/shm-test");
-       error (EXIT_FAILURE, 0, "initial stat failed");
-     }
-+  if (st.st_size != 4000)
-+    {
-+      shm_unlink ("/shm-test");
-+      error (EXIT_FAILURE, 0, "initial size not correct");
-+    }
- 
-   /* Spawn to processes which will do the work.  */
-   pid1 = fork ();
---- /dev/null
-+++ glibc-2.6/stdio-common/bug18a.c
-@@ -0,0 +1,6 @@
-+#include <wchar.h>
-+#define CHAR wchar_t
-+#define L(str) L##str
-+#define SSCANF swscanf
-+
-+#include "bug18.c"
---- /dev/null
-+++ glibc-2.6/stdio-common/bug18.c
-@@ -0,0 +1,48 @@
-+#include <assert.h>
-+#include <errno.h>
-+#include <stdio.h>
-+
-+#ifndef CHAR
-+# define CHAR char
-+# define L(str) str
-+# define SSCANF sscanf
-+#endif
-+
-+
-+static int
-+do_test (void)
-+{
-+  printf("setting errno to EINTR\n");
-+  errno = EINTR;
-+
-+  printf("checking sscanf\n");
-+
-+  CHAR str[] = L("7-11");
-+  int i, j, n;
-+
-+  i = j = n = 0;
-+  SSCANF (str, L(" %i - %i %n"), &i, &j, &n);
-+  printf ("found %i-%i (length=%i)\n", i, j, n);
-+
-+  int result = 0;
-+  if (i != 7)
-+    {
-+      printf ("i is %d, expected 7\n", i);
-+      result = 1;
-+    }
-+  if (j != 11)
-+    {
-+      printf ("j is %d, expected 11\n", j);
-+      result = 1;
-+    }
-+  if (n != 4)
-+    {
-+      printf ("n is %d, expected 4\n", j);
-+      result = 1;
-+    }
-+
-+  return result;
-+}
-+
-+#define TEST_FUNCTION do_test ()
-+#include "../test-skeleton.c"
---- /dev/null
-+++ glibc-2.6/stdio-common/bug19a.c
-@@ -0,0 +1,7 @@
-+#include <wchar.h>
-+#define CHAR wchar_t
-+#define L(str) L##str
-+#define FPUTS fputws
-+#define FSCANF fwscanf
-+
-+#include "bug19.c"
---- /dev/null
-+++ glibc-2.6/stdio-common/bug19.c
-@@ -0,0 +1,58 @@
-+#include <assert.h>
-+#include <errno.h>
-+#include <stdio.h>
-+
-+#ifndef CHAR
-+# define CHAR char
-+# define L(str) str
-+# define FPUTS fputs
-+# define FSCANF fscanf
-+#endif
-+
-+
-+static int
-+do_test (void)
-+{
-+  FILE *fp = tmpfile ();
-+  if (fp == NULL)
-+    {
-+      puts ("cannot open file");
-+      return 1;
-+    }
-+
-+  FPUTS (L("7-11"), fp);
-+  rewind (fp);
-+
-+  printf("setting errno to EINTR\n");
-+  errno = EINTR;
-+
-+  printf("checking sscanf\n");
-+
-+  int i, j, n;
-+
-+  i = j = n = 0;
-+  FSCANF (fp, L(" %i - %i %n"), &i, &j, &n);
-+  printf ("found %i-%i (length=%i)\n", i, j, n);
-+
-+  int result = 0;
-+  if (i != 7)
-+    {
-+      printf ("i is %d, expected 7\n", i);
-+      result = 1;
-+    }
-+  if (j != 11)
-+    {
-+      printf ("j is %d, expected 11\n", j);
-+      result = 1;
-+    }
-+  if (n != 4)
-+    {
-+      printf ("n is %d, expected 4\n", j);
-+      result = 1;
-+    }
-+
-+  return result;
-+}
-+
-+#define TEST_FUNCTION do_test ()
-+#include "../test-skeleton.c"
---- glibc-2.6.orig/stdio-common/Makefile
-+++ glibc-2.6/stdio-common/Makefile
-@@ -54,7 +54,8 @@
- 	 tst-swprintf tst-fseek tst-fmemopen test-vfprintf tst-gets \
- 	 tst-perror tst-sprintf tst-rndseek tst-fdopen tst-fphex bug14 bug15 \
- 	 tst-popen tst-unlockedio tst-fmemopen2 tst-put-error tst-fgets \
--	 tst-fwrite bug16 bug17 tst-swscanf
-+	 tst-fwrite bug16 bug17 tst-swscanf tst-sprintf2 bug18 bug18a \
-+	 bug19 bug19a
- 
- test-srcs = tst-unbputc tst-printf
- 
---- /dev/null
-+++ glibc-2.6/stdio-common/tst-sprintf2.c
-@@ -0,0 +1,82 @@
-+#include <float.h>
-+#include <math.h>
-+#include <stdio.h>
-+#include <string.h>
-+
-+int
-+main (void)
-+{
-+  volatile union { long double l; long long x[2]; } u, v;
-+  char buf[64];
-+  int result = 0;
-+
-+#if LDBL_MANT_DIG == 106 || LDBL_MANT_DIG == 113
-+# define COMPARE_LDBL(u, v) \
-+  ((u).l == (v).l && (u).x[0] == (v).x[0] && (u).x[1] == (v).x[1])
-+#else
-+# define COMPARE_LDBL(u, v) ((u).l == (v).l)
-+#endif
-+
-+#define TEST(val) \
-+  do									   \
-+    {									   \
-+      u.l = (val);							   \
-+      snprintf (buf, sizeof buf, "%LaL", u.l);				   \
-+      if (strcmp (buf, #val) != 0)					   \
-+	{								   \
-+	  printf ("Error on line %d: %s != %s\n", __LINE__, buf, #val);	   \
-+	  result = 1;							   \
-+	}								   \
-+      if (sscanf (#val, "%La", &v.l) != 1 || !COMPARE_LDBL (u, v))	   \
-+	{								   \
-+	  printf ("Error sscanf on line %d: %La != %La\n", __LINE__,	   \
-+		  u.l, v.l);						   \
-+	  result = 1;							   \
-+	}								   \
-+      /* printf ("%s %La %016Lx %016Lx\n", #val, u.l, u.x[0], u.x[1]); */  \
-+    }									   \
-+  while (0)
-+
-+#if LDBL_MANT_DIG >= 106
-+# if LDBL_MANT_DIG == 106
-+  TEST (0x0.ffffffffffffp-1022L);
-+  TEST (0x0.ffffffffffff1p-1022L);
-+  TEST (0x0.fffffffffffffp-1022L);
-+# endif
-+  TEST (0x1p-1022L);
-+  TEST (0x1.0000000000001p-1022L);
-+  TEST (0x1.00000000001e7p-1022L);
-+  TEST (0x1.fffffffffffffp-1022L);
-+  TEST (0x1p-1021L);
-+  TEST (0x1.00000000000008p-1021L);
-+  TEST (0x1.0000000000001p-1021L);
-+  TEST (0x1.00000000000018p-1021L);
-+  TEST (0x1.0000000000000f8p-1017L);
-+  TEST (0x1.0000000000001p-1017L);
-+  TEST (0x1.000000000000108p-1017L);
-+  TEST (0x1.000000000000dcf8p-1013L);
-+  TEST (0x1.000000000000ddp-1013L);
-+  TEST (0x1.000000000000dd08p-1013L);
-+  TEST (0x1.ffffffffffffffffffffffffffp-1L);
-+  TEST (0x1.ffffffffffffffffffffffffff8p-1L);
-+  TEST (0x1p+0L);
-+  TEST (0x1.000000000000000000000000008p+0L);
-+  TEST (0x1.00000000000000000000000001p+0L);
-+  TEST (0x1.000000000000000000000000018p+0L);
-+  TEST (0x1.23456789abcdef123456789abc8p+0L);
-+  TEST (0x1.23456789abcde7123456789abc8p+0L);
-+  TEST (0x1.23456789abcdef123456789abc8p+64L);
-+  TEST (0x1.23456789abcde7123456789abc8p+64L);
-+  TEST (0x1.123456789abcdef123456789p-969L);
-+# if LDBL_MANT_DIG == 106
-+  TEST (-0x1.2d71957cc1263bbbeb1d365f1e8p-969L);
-+  TEST (0x1.23456789abcdef0123456789abp-970L);
-+  TEST (0x1.579bde02468acp-1001L);
-+  TEST (0x0.abcdef0123456p-1022L);
-+  TEST (0x1.abcdef0123456p-1022L);
-+  TEST (0x1.abcdef012345678p-1014L);
-+  TEST (0x1.abcdef0123456f8p-1014L);
-+# endif
-+#endif
-+  return result;
-+}
---- glibc-2.6.orig/stdio-common/tst-sprintf.c
-+++ glibc-2.6/stdio-common/tst-sprintf.c
-@@ -37,5 +37,26 @@
-       free (dst);
-     }
- 
-+  if (sprintf (buf, "%1$d%3$.*2$s%4$d", 7, 67108863, "x", 8) != 3
-+      || strcmp (buf, "7x8") != 0)
-+    {
-+      printf ("sprintf (buf, \"%%1$d%%3$.*2$s%%4$d\", 7, 67108863, \"x\", 8) produced `%s' output", buf);
-+      result = 1;
-+    }
-+
-+  if (sprintf (buf, "%67108863.16\"%d", 7) != 14
-+      || strcmp (buf, "%67108863.16\"7") != 0)
-+    {
-+      printf ("sprintf (buf, \"%%67108863.16\\\"%%d\", 7) produced `%s' output", buf);
-+      result = 1;
-+    }
-+
-+  if (sprintf (buf, "%*\"%d", 0x3ffffff, 7) != 11
-+      || strcmp (buf, "%67108863\"7") != 0)
-+    {
-+      printf ("sprintf (buf, \"%%*\\\"%%d\", 0x3ffffff, 7) produced `%s' output", buf);
-+      result = 1;
-+    }
-+
-   return result;
- }
---- glibc-2.6.orig/stdio-common/vfprintf.c
-+++ glibc-2.6/stdio-common/vfprintf.c
-@@ -1627,6 +1627,8 @@
-     /* Just a counter.  */
-     size_t cnt;
- 
-+    free (workstart);
-+    workstart = NULL;
- 
-     if (grouping == (const char *) -1)
-       {
-@@ -1801,7 +1803,9 @@
- 	int use_outdigits = specs[nspecs_done].info.i18n;
- 	char pad = specs[nspecs_done].info.pad;
- 	CHAR_T spec = specs[nspecs_done].info.spec;
--	CHAR_T *workstart = NULL;
-+
-+	workstart = NULL;
-+	workend = &work_buffer[sizeof (work_buffer) / sizeof (CHAR_T)];
- 
- 	/* Fill in last information.  */
- 	if (specs[nspecs_done].width_arg != -1)
-@@ -1897,8 +1901,7 @@
- 	    break;
- 	  }
- 
--	if (__builtin_expect (workstart != NULL, 0))
--	  free (workstart);
-+	free (workstart);
- 	workstart = NULL;
- 
- 	/* Write the following constant string.  */
-@@ -1926,7 +1929,7 @@
- 
- {
-   int done = 0;
--  CHAR_T work_buffer[MAX (info->width, info->spec) + 32];
-+  CHAR_T work_buffer[MAX (sizeof (info->width), sizeof (info->prec)) * 3];
-   CHAR_T *const workend
-     = &work_buffer[sizeof (work_buffer) / sizeof (CHAR_T)];
-   register CHAR_T *w;
---- glibc-2.6.orig/stdio-common/vfscanf.c
-+++ glibc-2.6/stdio-common/vfscanf.c
-@@ -530,12 +530,17 @@
- 	{
- 	  /* Eat whitespace.  */
- 	  int save_errno = errno;
--	  errno = 0;
-+	  __set_errno (0);
- 	  do
--	    if (__builtin_expect (inchar () == EOF && errno == EINTR, 0))
-+	    /* We add the additional test for EOF here since otherwise
-+	       inchar will restore the old errno value which might be
-+	       EINTR but does not indicate an interrupt since nothing
-+	       was read at this time.  */
-+	    if (__builtin_expect ((c == EOF || inchar () == EOF)
-+				  && errno == EINTR, 0))
- 	      input_error ();
- 	  while (ISSPACE (c));
--	  errno = save_errno;
-+	  __set_errno (save_errno);
- 	  ungetc (c, s);
- 	  skip_space = 0;
- 	}
---- glibc-2.6.orig/sysdeps/generic/ldsodefs.h
-+++ glibc-2.6/sysdeps/generic/ldsodefs.h
-@@ -38,7 +38,6 @@
- #include <bits/libc-lock.h>
- #include <hp-timing.h>
- #include <tls.h>
--#include <rtld-lowlevel.h>
- 
- __BEGIN_DECLS
- 
-@@ -439,18 +438,18 @@
-   EXTERN void (*_dl_rtld_unlock_recursive) (void *);
- #endif
- 
--  /* Prevailing state of the stack, PF_X indicating it's executable.  */
--  EXTERN ElfW(Word) _dl_stack_flags;
--
-   /* If loading a shared object requires that we make the stack executable
-      when it was not, we do it by calling this function.
-      It returns an errno code or zero on success.  */
-   EXTERN int (*_dl_make_stack_executable_hook) (void **) internal_function;
- 
--  /* Highest dtv index currently needed.  */
--  EXTERN size_t _dl_tls_max_dtv_idx;
-+  /* Prevailing state of the stack, PF_X indicating it's executable.  */
-+  EXTERN ElfW(Word) _dl_stack_flags;
-+
-   /* Flag signalling whether there are gaps in the module ID allocation.  */
-   EXTERN bool _dl_tls_dtv_gaps;
-+  /* Highest dtv index currently needed.  */
-+  EXTERN size_t _dl_tls_max_dtv_idx;
-   /* Information about the dtv slots.  */
-   EXTERN struct dtv_slotinfo_list
-   {
-@@ -486,6 +485,14 @@
- 
-   EXTERN void (*_dl_init_static_tls) (struct link_map *);
- 
-+  EXTERN void (*_dl_wait_lookup_done) (void);
-+
-+  /* Scopes to free after next THREAD_GSCOPE_WAIT ().  */
-+  EXTERN struct dl_scope_free_list
-+  {
-+    size_t count;
-+    struct r_scope_elem **list[50];
-+  } *_dl_scope_free_list;
- #ifdef SHARED
- };
- # define __rtld_global_attribute__
-@@ -532,15 +539,15 @@
- #define DL_DEBUG_HELP       (1 << 9)
- #define DL_DEBUG_PRELINK    (1 << 10)
- 
--  /* Cached value of `getpagesize ()'.  */
--  EXTERN size_t _dl_pagesize;
--
-   /* OS version.  */
-   EXTERN unsigned int _dl_osversion;
-   /* Platform name.  */
-   EXTERN const char *_dl_platform;
-   EXTERN size_t _dl_platformlen;
- 
-+  /* Cached value of `getpagesize ()'.  */
-+  EXTERN size_t _dl_pagesize;
-+
-   /* Copy of the content of `_dl_main_searchlist' at startup time.  */
-   EXTERN struct r_scope_elem _dl_initial_searchlist;
- 
-@@ -569,9 +576,6 @@
-   /* Expected cache ID.  */
-   EXTERN int _dl_correct_cache_id;
- 
--  /* 0 if internal pointer values should not be guarded, 1 if they should.  */
--  EXTERN int _dl_pointer_guard;
--
-   /* Mask for hardware capabilities that are available.  */
-   EXTERN uint64_t _dl_hwcap;
- 
-@@ -655,6 +659,9 @@
-   /* List of auditing interfaces.  */
-   struct audit_ifaces *_dl_audit;
-   unsigned int _dl_naudit;
-+
-+  /* 0 if internal pointer values should not be guarded, 1 if they should.  */
-+  EXTERN int _dl_pointer_guard;
- };
- # define __rtld_global_attribute__
- # ifdef IS_IN_rtld
-@@ -838,9 +845,7 @@
-     DL_LOOKUP_ADD_DEPENDENCY = 1,
-     /* Return most recent version instead of default version for
-        unversioned lookup.  */
--    DL_LOOKUP_RETURN_NEWEST = 2,
--    /* Set if the scopr lock in the UNDEF_MAP is taken.  */
--    DL_LOOKUP_SCOPE_LOCK = 4
-+    DL_LOOKUP_RETURN_NEWEST = 2
-   };
- 
- /* Lookup versioned symbol.  */
-@@ -1048,6 +1053,11 @@
- 		       Lmid_t nsid, int argc, char *argv[], char *env[])
-      attribute_hidden;
- 
-+/* Free or queue for freeing scope OLD.  If other threads might be
-+   in the middle of _dl_fixup, _dl_profile_fixup or dl*sym using the
-+   old scope, OLD can't be freed until no thread is using it.  */
-+extern int _dl_scope_free (struct r_scope_elem **old) attribute_hidden;
-+
- /* Add module to slot information data.  */
- extern void _dl_add_to_slotinfo (struct link_map  *l) attribute_hidden;
- 
-@@ -1059,6 +1069,8 @@
-    but never touch anything.  Return null if it's not allocated yet.  */
- extern void *_dl_tls_get_addr_soft (struct link_map *l) internal_function;
- 
-+extern int _dl_addr_inside_object (struct link_map *l, const ElfW(Addr) addr)
-+     internal_function attribute_hidden;
- 
- __END_DECLS
- 
---- glibc-2.6.orig/sysdeps/i386/ldbl2mpn.c
-+++ glibc-2.6/sysdeps/i386/ldbl2mpn.c
-@@ -1,4 +1,4 @@
--/* Copyright (C) 1995, 1996, 1997, 2000 Free Software Foundation, Inc.
-+/* Copyright (C) 1995, 1996, 1997, 2000, 2007 Free Software Foundation, Inc.
-    This file is part of the GNU C Library.
- 
-    The GNU C Library is free software; you can redistribute it and/or
-@@ -19,7 +19,7 @@
- #include "gmp.h"
- #include "gmp-impl.h"
- #include "longlong.h"
--#include "ieee754.h"
-+#include <ieee754.h>
- #include <float.h>
- #include <stdlib.h>
- 
-@@ -46,7 +46,7 @@
- #elif BITS_PER_MP_LIMB == 64
-   /* Hopefully the compiler will combine the two bitfield extracts
-      and this composition into just the original quadword extract.  */
--  res_ptr[0] = ((unsigned long int) u.ieee.mantissa0 << 32) | u.ieee.mantissa1;
-+  res_ptr[0] = ((mp_limb_t) u.ieee.mantissa0 << 32) | u.ieee.mantissa1;
-   #define N 1
- #else
-   #error "mp_limb size " BITS_PER_MP_LIMB "not accounted for"
-@@ -109,6 +109,13 @@
- 	    }
- 	}
-     }
-+  else if (u.ieee.exponent < 0x7fff
-+#if N == 2
-+	   && res_ptr[0] == 0
-+#endif
-+	   && res_ptr[N - 1] == 0)
-+    /* Pseudo zero.  */
-+    *expt = 0;
- 
-   return N;
- }
---- /dev/null
-+++ glibc-2.6/sysdeps/ia64/ldbl2mpn.c
-@@ -0,0 +1 @@
-+#include "../i386/ldbl2mpn.c"
---- glibc-2.6.orig/sysdeps/ieee754/ldbl-128ibm/mpn2ldbl.c
-+++ glibc-2.6/sysdeps/ieee754/ldbl-128ibm/mpn2ldbl.c
-@@ -1,4 +1,4 @@
--/* Copyright (C) 1995, 1996, 1997, 1998, 1999, 2002, 2003, 2004, 2006
-+/* Copyright (C) 1995, 1996, 1997, 1998, 1999, 2002, 2003, 2004, 2006, 2007
- 	Free Software Foundation, Inc.
-    This file is part of the GNU C Library.
- 
-@@ -31,19 +31,20 @@
- __mpn_construct_long_double (mp_srcptr frac_ptr, int expt, int sign)
- {
-   union ibm_extended_long_double u;
--  unsigned long hidden2, lzcount;
-+  unsigned long lzcount;
-   unsigned long long hi, lo;
-+  int exponent2;
- 
-   u.ieee.negative = sign;
-   u.ieee.negative2 = sign;
-   u.ieee.exponent = expt + IBM_EXTENDED_LONG_DOUBLE_BIAS;
--  u.ieee.exponent2 = expt - 53 + IBM_EXTENDED_LONG_DOUBLE_BIAS;
-+  u.ieee.exponent2 = 0;
-+  exponent2 = expt - 53 + IBM_EXTENDED_LONG_DOUBLE_BIAS;
- 
- #if BITS_PER_MP_LIMB == 32
-   /* The low order 53 bits (52 + hidden) go into the lower double */
-   lo = frac_ptr[0];
-   lo |= (frac_ptr[1] & ((1LL << (53 - 32)) - 1)) << 32;
--  hidden2 = (frac_ptr[1] >> (52 - 32)) & ((mp_limb_t) 1);
-   /* The high order 53 bits (52 + hidden) go into the upper double */
-   hi = (frac_ptr[1] >> (53 - 32)) & ((1 << 11) - 1);
-   hi |= ((unsigned long long) frac_ptr[2]) << 11;
-@@ -51,7 +52,6 @@
- #elif BITS_PER_MP_LIMB == 64
-   /* The low order 53 bits (52 + hidden) go into the lower double */
-   lo = frac_ptr[0] & (((mp_limb_t) 1 << 53) - 1);
--  hidden2 = (frac_ptr[0] >> 52) & ((mp_limb_t) 1);
-   /* The high order 53 bits (52 + hidden) go into the upper double */
-   hi = (frac_ptr[0] >> 53) & (((mp_limb_t) 1 << 11) - 1);
-   hi |= (frac_ptr[1] << 11);
-@@ -59,14 +59,62 @@
-   #error "mp_limb size " BITS_PER_MP_LIMB "not accounted for"
- #endif
- 
-+  if ((hi & (1LL << 52)) == 0 && (hi | lo) != 0)
-+    {
-+      /* denormal number  */
-+      unsigned long long val = hi ? hi : lo;
-+
-+      if (sizeof (val) == sizeof (long))
-+	lzcount = __builtin_clzl (val);
-+      else if ((val >> 32) != 0)
-+	lzcount = __builtin_clzl ((long) (val >> 32));
-+      else
-+	lzcount = __builtin_clzl ((long) val) + 32;
-+      if (hi)
-+	lzcount = lzcount - 11;
-+      else
-+	lzcount = lzcount + 42;
-+
-+      if (lzcount > u.ieee.exponent)
-+	{
-+	  lzcount = u.ieee.exponent;
-+	  u.ieee.exponent = 0;
-+	  exponent2 -= lzcount;
-+	}
-+      else
-+	{
-+	  u.ieee.exponent -= (lzcount - 1);
-+	  exponent2 -= (lzcount - 1);
-+	}
-+
-+      if (lzcount <= 53)
-+	{
-+	  hi = (hi << lzcount) | (lo >> (53 - lzcount));
-+	  lo = (lo << lzcount) & ((1LL << 53) - 1);
-+	}
-+      else
-+	{
-+	  hi = lo << (lzcount - 53);
-+	  lo = 0;
-+	}
-+    }
-+
-   if (lo != 0L)
-     {
-       /* hidden2 bit of low double controls rounding of the high double.
--	 If hidden2 is '1' then round up hi and adjust lo (2nd mantissa)
-+	 If hidden2 is '1' and either the explicit mantissa is non-zero
-+	 or hi is odd, then round up hi and adjust lo (2nd mantissa)
- 	 plus change the sign of the low double to compensate.  */
--      if (hidden2)
-+      if ((lo & (1LL << 52)) != 0
-+	  && ((hi & 1) != 0 || (lo & ((1LL << 52) - 1))))
- 	{
- 	  hi++;
-+	  if ((hi & ((1LL << 52) - 1)) == 0)
-+	    {
-+	      if ((hi & (1LL << 53)) != 0)
-+		hi -= 1LL << 52;
-+	      u.ieee.exponent++;
-+	    }
- 	  u.ieee.negative2 = !sign;
- 	  lo = (1LL << 53) - lo;
- 	}
-@@ -85,17 +133,18 @@
-       if (lzcount > 0)
- 	{
- 	  lo = lo << lzcount;
--	  u.ieee.exponent2 = u.ieee.exponent2 - lzcount;
-+	  exponent2 = exponent2 - lzcount;
- 	}
-+      if (exponent2 > 0)
-+	u.ieee.exponent2 = exponent2;
-+      else
-+	lo >>= 1 - exponent2;
-     }
-   else
--    {
--      u.ieee.negative2 = 0;
--      u.ieee.exponent2 = 0;
--    }
-+    u.ieee.negative2 = 0;
- 
-   u.ieee.mantissa3 = lo & 0xffffffffLL;
--  u.ieee.mantissa2 = (lo >> 32) & 0xffffff;
-+  u.ieee.mantissa2 = (lo >> 32) & 0xfffff;
-   u.ieee.mantissa1 = hi & 0xffffffffLL;
-   u.ieee.mantissa0 = (hi >> 32) & ((1LL << (LDBL_MANT_DIG - 86)) - 1);
- 
---- glibc-2.6.orig/sysdeps/ieee754/ldbl-128ibm/printf_fphex.c
-+++ glibc-2.6/sysdeps/ieee754/ldbl-128ibm/printf_fphex.c
-@@ -1,5 +1,5 @@
- /* Print floating point number in hexadecimal notation according to ISO C99.
--   Copyright (C) 1997,1998,1999,2000,2001,2002,2004,2006
-+   Copyright (C) 1997,1998,1999,2000,2001,2002,2004,2006,2007
- 	Free Software Foundation, Inc.
-    This file is part of the GNU C Library.
-    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
-@@ -35,21 +35,24 @@
- 									      \
-       lo = ((long long)eldbl.ieee.mantissa2 << 32) | eldbl.ieee.mantissa3;    \
-       hi = ((long long)eldbl.ieee.mantissa0 << 32) | eldbl.ieee.mantissa1;    \
--   /* If the lower double is not a denomal or zero then set the hidden	      \
--      53rd bit.  */							      \
--      if (eldbl.ieee.exponent2 > 0x001)					      \
--	{								      \
--	  lo |= (1ULL << 52);						      \
--	  lo = lo << 7; /* pre-shift lo to match ieee854.  */		      \
--	  /* The lower double is normalized separately from the upper.  We    \
--	     may need to adjust the lower manitissa to reflect this.  */      \
--	  ediff = eldbl.ieee.exponent - eldbl.ieee.exponent2;		      \
--	  if (ediff > 53)						      \
--	    lo = lo >> (ediff-53);					      \
--	}								      \
--  									      \
--      if ((eldbl.ieee.negative != eldbl.ieee.negative2)			      \
--	  && ((eldbl.ieee.exponent2 != 0) && (lo != 0L)))		      \
-+      lo <<= 7; /* pre-shift lo to match ieee854.  */			      \
-+      /* If the lower double is not a denomal or zero then set the hidden     \
-+	 53rd bit.  */							      \
-+      if (eldbl.ieee.exponent2 != 0)					      \
-+	lo |= (1ULL << (52 + 7));					      \
-+      else								      \
-+	lo <<= 1;							      \
-+      /* The lower double is normalized separately from the upper.  We	      \
-+	 may need to adjust the lower manitissa to reflect this.  */	      \
-+      ediff = eldbl.ieee.exponent - eldbl.ieee.exponent2;		      \
-+      if (ediff > 53 + 63)						      \
-+	lo = 0;								      \
-+      else if (ediff > 53)						      \
-+	lo = lo >> (ediff - 53);					      \
-+      else if (eldbl.ieee.exponent2 == 0 && ediff < 53)			      \
-+	lo = lo << (53 - ediff);					      \
-+      if (eldbl.ieee.negative != eldbl.ieee.negative2			      \
-+	  && (eldbl.ieee.exponent2 != 0 || lo != 0L))			      \
- 	{								      \
- 	  lo = (1ULL << 60) - lo;					      \
- 	  if (hi == 0L)							      \
---- glibc-2.6.orig/sysdeps/ieee754/ldbl-128ibm/s_fpclassifyl.c
-+++ glibc-2.6/sysdeps/ieee754/ldbl-128ibm/s_fpclassifyl.c
-@@ -1,5 +1,5 @@
- /* Return classification value corresponding to argument.
--   Copyright (C) 1997,1999,2002,2004,2006 Free Software Foundation, Inc.
-+   Copyright (C) 1997,1999,2002,2004,2006,2007 Free Software Foundation, Inc.
-    This file is part of the GNU C Library.
-    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997 and
-    		  Jakub Jelinek <jj@ultra.linux.cz>, 1999.
-@@ -30,14 +30,16 @@
-    * -NaN	fffn nnnn nnnn nnnn xxxx xxxx xxxx xxxx
-    * +Inf	7ff0 0000 0000 0000 xxxx xxxx xxxx xxxx
-    * -Inf	fff0 0000 0000 0000 xxxx xxxx xxxx xxxx
--   * +0		0000 0000 0000 0000
--   * -0		8000 0000 0000 0000
--   * +normal	001n nnnn nnnn nnnn (smallest)
--   * -normal	801n nnnn nnnn nnnn (smallest)
--   * +normal	7fen nnnn nnnn nnnn (largest)
--   * -normal	ffen nnnn nnnn nnnn (largest)
--   * +denorm	000n nnnn nnnn nnnn
--   * -denorm	800n nnnn nnnn nnnn
-+   * +0		0000 0000 0000 0000 xxxx xxxx xxxx xxxx
-+   * -0		8000 0000 0000 0000 xxxx xxxx xxxx xxxx
-+   * +normal	0360 0000 0000 0000 0000 0000 0000 0000 (smallest)
-+   * -normal	8360 0000 0000 0000 0000 0000 0000 0000 (smallest)
-+   * +normal	7fef ffff ffff ffff 7c8f ffff ffff fffe (largest)
-+   * +normal	ffef ffff ffff ffff fc8f ffff ffff fffe (largest)
-+   * +denorm	0360 0000 0000 0000 8000 0000 0000 0001 (largest)
-+   * -denorm	8360 0000 0000 0000 0000 0000 0000 0001 (largest)
-+   * +denorm	000n nnnn nnnn nnnn xxxx xxxx xxxx xxxx
-+   * -denorm	800n nnnn nnnn nnnn xxxx xxxx xxxx xxxx
-    */
- 
- int
-@@ -59,12 +61,23 @@
-       /* +/-zero or +/- normal or +/- denormal */
-       if (hx & 0x7fffffffffffffffULL) {
- 	  /* +/- normal or +/- denormal */
--	  if ((hx & 0x7ff0000000000000ULL) >= 0x0360000000000000ULL) {
-+	  if ((hx & 0x7ff0000000000000ULL) > 0x0360000000000000ULL) {
- 	      /* +/- normal */
- 	      retval = FP_NORMAL;
- 	  } else {
--	      /* +/- denormal */
--	      retval = FP_SUBNORMAL;
-+	      if ((hx & 0x7ff0000000000000ULL) == 0x0360000000000000ULL) {
-+		  if ((lx & 0x7fffffffffffffff)	/* lower is non-zero */
-+		  && ((lx^hx) & 0x8000000000000000ULL)) { /* and sign differs */
-+		      /* +/- denormal */
-+		      retval = FP_SUBNORMAL;
-+		  } else {
-+		      /* +/- normal */
-+		      retval = FP_NORMAL;
-+		  }
-+	      } else {
-+		  /* +/- denormal */
-+		  retval = FP_SUBNORMAL;
-+	      }
- 	  }
-       } else {
- 	  /* +/- zero */
---- glibc-2.6.orig/sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c
-+++ glibc-2.6/sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c
-@@ -35,7 +35,7 @@
- 	long double x,y;
- #endif
- {
--	int64_t hx,hy,ihx,ihy,ilx,ily;
-+	int64_t hx,hy,ihx,ihy,ilx;
- 	u_int64_t lx,ly;
- 
- 	GET_LDOUBLE_WORDS64(hx,lx,x);
-@@ -43,7 +43,6 @@
- 	ihx = hx&0x7fffffffffffffffLL;		/* |hx| */
- 	ilx = lx&0x7fffffffffffffffLL;		/* |lx| */
- 	ihy = hy&0x7fffffffffffffffLL;		/* |hy| */
--	ily = ly&0x7fffffffffffffffLL;		/* |ly| */
- 
- 	if((((ihx&0x7ff0000000000000LL)==0x7ff0000000000000LL)&&
- 	    ((ihx&0x000fffffffffffffLL)!=0)) ||   /* x is nan */
-@@ -54,54 +53,66 @@
- 	    return y;		/* x=y, return y */
- 	if(ihx == 0 && ilx == 0) {			/* x == 0 */
- 	    long double u;
--	    SET_LDOUBLE_WORDS64(x,hy&0x8000000000000000ULL,1);/* return +-minsubnormal */
--	    u = math_opt_barrier (u);
-+	    hy = (hy & 0x8000000000000000ULL) | 1;
-+	    SET_LDOUBLE_WORDS64(x,hy,0ULL);/* return +-minsubnormal */
-+	    u = math_opt_barrier (x);
- 	    u = u * u;
- 	    math_force_eval (u);		/* raise underflow flag */
- 	    return x;
- 	}
--	if(ihx>=0) {			/* x > 0 */
--	    if(ihx>ihy||((ihx==ihy)&&(ilx>ily))) {	/* x > y, x -= ulp */
--
--	        if(ilx==0)
--		    hx--;
--		else
--		    lx--;
--	    } else {				/* x < y, x += ulp */
--	        if((hx==0x7fefffffffffffffLL)&&(lx==0x7c8ffffffffffffeLL))
--		  {
--		    SET_LDOUBLE_WORDS64(x,0x7ff0000000000000,0x8000000000000000);
--		    return x;
--		  }
--	        else if((hx==0xffefffffffffffffLL)&&(lx==0xfc8ffffffffffffeLL))
--		  {
--		    SET_LDOUBLE_WORDS64(x,0xfff0000000000000,0x8000000000000000);
--		    return x;
--		  }
--		else if((lx&0x7fffffffffffffff)==0) hx++;
--		else
--		  lx++;
-+	
-+	long double u;
-+	if(x > y) {	/* x > y, x -= ulp */
-+	    if((hx==0xffefffffffffffffLL)&&(lx==0xfc8ffffffffffffeLL))
-+	      return x+x;	/* overflow, return -inf */
-+	    if (hx >= 0x7ff0000000000000LL) {
-+	      SET_LDOUBLE_WORDS64(u,0x7fefffffffffffffLL,0x7c8ffffffffffffeLL);
-+	      return u;
- 	    }
--	} else {				/* x < 0 */
--	    if(ihy>=0||ihx>ihy||((ihx==ihy)&&(ilx>ily))){/* x < y, x -= ulp */
--		if((lx&0x7fffffffffffffff)==0)
--		    hx--;
--		else
--		    lx--;
--	    } else {				/* x > y, x += ulp */
--		if((lx&0x7fffffffffffffff)==0) hx++;
--		else
--		  lx++;
-+	    if(ihx <= 0x0360000000000000LL) {  /* x <= LDBL_MIN */
-+	      u = math_opt_barrier (x);
-+	      x -= __LDBL_DENORM_MIN__;
-+	      if (ihx < 0x0360000000000000LL
-+		  || (hx > 0 && (int64_t) lx <= 0)
-+		  || (hx < 0 && (int64_t) lx > 1)) {
-+		u = u * u;
-+		math_force_eval (u);		/* raise underflow flag */
-+	      }
-+	      return x;
- 	    }
-+	    if (ihx < 0x06a0000000000000LL) { /* ulp will denormal */
-+	      SET_LDOUBLE_WORDS64(u,(hx&0x7ff0000000000000LL),0ULL);
-+	      u *= 0x1.0000000000000p-105L;
-+	    } else
-+	      SET_LDOUBLE_WORDS64(u,(hx&0x7ff0000000000000LL)-0x0690000000000000LL,0ULL);
-+	    return x - u;
-+	} else {				/* x < y, x += ulp */
-+	    if((hx==0x7fefffffffffffffLL)&&(lx==0x7c8ffffffffffffeLL))
-+	      return x+x;	/* overflow, return +inf */
-+	    if ((u_int64_t) hx >= 0xfff0000000000000ULL) {
-+	      SET_LDOUBLE_WORDS64(u,0xffefffffffffffffLL,0xfc8ffffffffffffeLL);
-+	      return u;
-+	    }
-+	    if(ihx <= 0x0360000000000000LL) {  /* x <= LDBL_MIN */
-+	      u = math_opt_barrier (x);
-+	      x += __LDBL_DENORM_MIN__;
-+	      if (ihx < 0x0360000000000000LL
-+		  || (hx > 0 && (int64_t) lx < 0 && lx != 0x8000000000000001LL)
-+		  || (hx < 0 && (int64_t) lx >= 0)) {
-+		u = u * u;
-+		math_force_eval (u);		/* raise underflow flag */
-+	      }
-+	      if (x == 0.0L)	/* handle negative __LDBL_DENORM_MIN__ case */
-+		x = -0.0L;
-+	      return x;
-+	    }
-+	    if (ihx < 0x06a0000000000000LL) { /* ulp will denormal */
-+	      SET_LDOUBLE_WORDS64(u,(hx&0x7ff0000000000000LL),0ULL);
-+	      u *= 0x1.0000000000000p-105L;
-+	    } else
-+	      SET_LDOUBLE_WORDS64(u,(hx&0x7ff0000000000000LL)-0x0690000000000000LL,0ULL);
-+	    return x + u;
- 	}
--	hy = hx&0x7ff0000000000000LL;
--	if(hy==0x7ff0000000000000LL) return x+x;/* overflow  */
--	if(hy==0) {
--	    long double u = x * x;		/* underflow */
--	    math_force_eval (u);		/* raise underflow flag */
--	}
--	SET_LDOUBLE_WORDS64(x,hx,lx);
--	return x;
- }
- strong_alias (__nextafterl, __nexttowardl)
- long_double_symbol (libm, __nextafterl, nextafterl);
---- /dev/null
-+++ glibc-2.6/sysdeps/unix/sysv/linux/epoll_pwait.c
-@@ -0,0 +1,69 @@
-+/* Copyright (C) 2007 Free Software Foundation, Inc.
-+   This file is part of the GNU C Library.
-+
-+   The GNU C Library is free software; you can redistribute it and/or
-+   modify it under the terms of the GNU Lesser General Public
-+   License as published by the Free Software Foundation; either
-+   version 2.1 of the License, or (at your option) any later version.
-+
-+   The GNU C Library is distributed in the hope that it will be useful,
-+   but WITHOUT ANY WARRANTY; without even the implied warranty of
-+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+   Lesser General Public License for more details.
-+
-+   You should have received a copy of the GNU Lesser General Public
-+   License along with the GNU C Library; if not, write to the Free
-+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-+   02111-1307 USA.  */
-+
-+#include <errno.h>
-+#include <signal.h>
-+#include <unistd.h>
-+#include <sys/epoll.h>
-+
-+#include <sysdep-cancel.h>
-+#include <sys/syscall.h>
-+
-+#ifdef __NR_epoll_pwait
-+
-+/* Wait for events on an epoll instance "epfd". Returns the number of
-+   triggered events returned in "events" buffer. Or -1 in case of
-+   error with the "errno" variable set to the specific error code. The
-+   "events" parameter is a buffer that will contain triggered
-+   events. The "maxevents" is the maximum number of events to be
-+   returned ( usually size of "events" ). The "timeout" parameter
-+   specifies the maximum wait time in milliseconds (-1 == infinite).
-+   The thread's signal mask is temporarily and atomically replaced with
-+   the one provided as parameter.  */
-+
-+int epoll_pwait (int epfd, struct epoll_event *events,
-+		 int maxevents, int timeout,
-+		 const sigset_t *set)
-+{
-+  if (SINGLE_THREAD_P)
-+    return INLINE_SYSCALL (epoll_pwait, 6, epfd, events, maxevents, timeout,
-+			   set, _NSIG / 8);
-+
-+  int oldtype = LIBC_CANCEL_ASYNC ();
-+
-+  int result = INLINE_SYSCALL (epoll_pwait, 6, epfd, events, maxevents,
-+			       timeout, set, _NSIG / 8);
-+
-+  LIBC_CANCEL_RESET (oldtype);
-+
-+  return result;
-+}
-+
-+#else
-+
-+int epoll_pwait (int epfd, struct epoll_event *events,
-+		 int maxevents, int timeout,
-+		 const sigset_t *set)
-+{
-+  __set_errno (ENOSYS);
-+  return -1;
-+}
-+stub_warning (epoll_pwait)
-+
-+# include <stub-tag.h>
-+#endif
---- /dev/null
-+++ glibc-2.6/sysdeps/unix/sysv/linux/i386/epoll_pwait.S
-@@ -0,0 +1,80 @@
-+/* Copyright (C) 2007 Free Software Foundation, Inc.
-+   This file is part of the GNU C Library.
-+
-+   The GNU C Library is free software; you can redistribute it and/or
-+   modify it under the terms of the GNU Lesser General Public
-+   License as published by the Free Software Foundation; either
-+   version 2.1 of the License, or (at your option) any later version.
-+
-+   The GNU C Library is distributed in the hope that it will be useful,
-+   but WITHOUT ANY WARRANTY; without even the implied warranty of
-+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+   Lesser General Public License for more details.
-+
-+   You should have received a copy of the GNU Lesser General Public
-+   License along with the GNU C Library; if not, write to the Free
-+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-+   02111-1307 USA.  */
-+
-+#include <sysdep.h>
-+#define _ERRNO_H
-+#include <bits/errno.h>
-+#define _SIGNAL_H
-+#include <bits/signum.h>
-+
-+
-+	.text
-+ENTRY (epoll_pwait)
-+
-+#ifdef __NR_epoll_pwait
-+
-+	/* Save registers.  */
-+	pushl %ebp
-+	cfi_adjust_cfa_offset (4)
-+	pushl %ebx
-+	cfi_adjust_cfa_offset (4)
-+	pushl %esi
-+	cfi_adjust_cfa_offset (4)
-+	pushl %edi
-+	cfi_adjust_cfa_offset (4)
-+	cfi_rel_offset (edi, 0)
-+	cfi_rel_offset (esi, 4)
-+	cfi_rel_offset (ebx, 8)
-+	cfi_rel_offset (ebp, 12)
-+
-+	movl 20(%esp), %ebx
-+	movl 24(%esp), %ecx
-+	movl 28(%esp), %edx
-+	movl 32(%esp), %esi
-+	movl 36(%esp), %edi
-+	movl $_NSIG/8, %ebp
-+	movl $__NR_epoll_pwait, %eax
-+
-+	ENTER_KERNEL
-+
-+	/* Restore registers.  */
-+	popl %edi
-+	cfi_adjust_cfa_offset (-4)
-+	cfi_restore (edi)
-+	popl %esi
-+	cfi_adjust_cfa_offset (-4)
-+	cfi_restore (esi)
-+	popl %ebx
-+	cfi_adjust_cfa_offset (-4)
-+	cfi_restore (ebx)
-+	popl %ebp
-+	cfi_adjust_cfa_offset (-4)
-+	cfi_restore (ebp)
-+
-+	/* If 0 > %eax > -4096 there was an error.  */
-+	cmpl $-4096, %eax
-+	ja SYSCALL_ERROR_LABEL
-+
-+	/* Successful; return the syscall's value.  */
-+#else
-+	movl $-ENOSYS, %eax
-+	jmp SYSCALL_ERROR_LABEL
-+#endif
-+L(pseudo_end):
-+	ret
-+PSEUDO_END (epoll_pwait)
---- glibc-2.6.orig/sysdeps/unix/sysv/linux/i386/sync_file_range.S
-+++ glibc-2.6/sysdeps/unix/sysv/linux/i386/sync_file_range.S
-@@ -1,5 +1,5 @@
- /* Selective file content synch'ing.
--   Copyright (C) 2006 Free Software Foundation, Inc.
-+   Copyright (C) 2006, 2007 Free Software Foundation, Inc.
-    This file is part of the GNU C Library.
- 
-    The GNU C Library is free software; you can redistribute it and/or
-@@ -63,10 +63,10 @@
- 
- 	cmpl	$-4095, %eax
- 	jae	SYSCALL_ERROR_LABEL
--L(pseudo_end):
--	ret
- #else
- 	movl	$-ENOSYS, %eax
- 	jmp	SYSCALL_ERROR_LABEL
- #endif
-+L(pseudo_end):
-+	ret
- PSEUDO_END (sync_file_range)
---- glibc-2.6.orig/sysdeps/unix/sysv/linux/Makefile
-+++ glibc-2.6/sysdeps/unix/sysv/linux/Makefile
-@@ -13,7 +13,7 @@
- 
- ifeq ($(subdir),misc)
- sysdep_routines += sysctl clone llseek umount umount2 readahead \
--		   setfsuid setfsgid makedev
-+		   setfsuid setfsgid makedev epoll_pwait
- 
- CFLAGS-gethostid.c = -fexceptions
- 
---- glibc-2.6.orig/sysdeps/unix/sysv/linux/syscalls.list
-+++ glibc-2.6/sysdeps/unix/sysv/linux/syscalls.list
-@@ -10,7 +10,6 @@
- epoll_create	EXTRA	epoll_create	i:i	epoll_create
- epoll_ctl	EXTRA	epoll_ctl	i:iiip	epoll_ctl
- epoll_wait	EXTRA	epoll_wait	Ci:ipii	epoll_wait
--epoll_pwait	EXTRA	epoll_pwait	Ci:ipiipi	epoll_pwait
- fdatasync	-	fdatasync	Ci:i	fdatasync
- flock		-	flock		i:ii	__flock		flock
- fork		-	fork		i:	__libc_fork	__fork fork
---- glibc-2.6.orig/sysdeps/unix/sysv/linux/x86_64/sys/epoll.h
-+++ glibc-2.6/sysdeps/unix/sysv/linux/x86_64/sys/epoll.h
-@@ -1,4 +1,4 @@
--/* Copyright (C) 2002,2003,2004,2005,2006 Free Software Foundation, Inc.
-+/* Copyright (C) 2002,2003,2004,2005,2006,2007 Free Software Foundation, Inc.
-    This file is part of the GNU C Library.
- 
-    The GNU C Library is free software; you can redistribute it and/or
-@@ -22,6 +22,14 @@
- #include <stdint.h>
- #include <sys/types.h>
- 
-+/* Get __sigset_t.  */
-+#include <bits/sigset.h>
-+
-+#ifndef __sigset_t_defined
-+# define __sigset_t_defined
-+typedef __sigset_t sigset_t;
-+#endif
-+
- 
- enum EPOLL_EVENTS
-   {
-@@ -105,6 +113,16 @@
- extern int epoll_wait (int __epfd, struct epoll_event *__events,
- 		       int __maxevents, int __timeout);
- 
-+
-+/* Same as epoll_wait, but the thread's signal mask is temporarily
-+   and atomically replaced with the one provided as parameter.
-+
-+   This function is a cancellation point and therefore not marked with
-+   __THROW.  */
-+extern int epoll_pwait (int __epfd, struct epoll_event *__events,
-+			int __maxevents, int __timeout,
-+			__const __sigset_t *__ss);
-+
- __END_DECLS
- 
- #endif /* sys/epoll.h */
---- glibc-2.6.orig/sysdeps/unix/sysv/linux/x86_64/sysconf.c
-+++ glibc-2.6/sysdeps/unix/sysv/linux/x86_64/sysconf.c
-@@ -1,5 +1,5 @@
- /* Get file-specific information about a file.  Linux version.
--   Copyright (C) 2003, 2004, 2006 Free Software Foundation, Inc.
-+   Copyright (C) 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
-    This file is part of the GNU C Library.
- 
-    The GNU C Library is free software; you can redistribute it and/or
-@@ -24,328 +24,17 @@
- 
- 
- static long int linux_sysconf (int name);
--
--
--static const struct intel_02_cache_info
--{
--  unsigned int idx;
--  int name;
--  long int size;
--  long int assoc;
--  long int linesize;
--} intel_02_known[] =
--  {
--    { 0x06, _SC_LEVEL1_ICACHE_SIZE, 8192, 4, 32 },
--    { 0x08, _SC_LEVEL1_ICACHE_SIZE, 16384, 4, 32 },
--    { 0x0a, _SC_LEVEL1_DCACHE_SIZE, 8192, 2, 32 },
--    { 0x0c, _SC_LEVEL1_DCACHE_SIZE, 16384, 4, 32 },
--    { 0x22, _SC_LEVEL3_CACHE_SIZE, 524288, 4, 64 },
--    { 0x23, _SC_LEVEL3_CACHE_SIZE, 1048576, 8, 64 },
--    { 0x25, _SC_LEVEL3_CACHE_SIZE, 2097152, 8, 64 },
--    { 0x29, _SC_LEVEL3_CACHE_SIZE, 4194304, 8, 64 },
--    { 0x2c, _SC_LEVEL1_DCACHE_SIZE, 32768, 8, 64 },
--    { 0x30, _SC_LEVEL1_ICACHE_SIZE, 32768, 8, 64 },
--    { 0x39, _SC_LEVEL2_CACHE_SIZE, 131072, 4, 64 },
--    { 0x3a, _SC_LEVEL2_CACHE_SIZE, 196608, 6, 64 },
--    { 0x3b, _SC_LEVEL2_CACHE_SIZE, 131072, 2, 64 },
--    { 0x3c, _SC_LEVEL2_CACHE_SIZE, 262144, 4, 64 },
--    { 0x3d, _SC_LEVEL2_CACHE_SIZE, 393216, 6, 64 },
--    { 0x3e, _SC_LEVEL2_CACHE_SIZE, 524288, 4, 64 },
--    { 0x41, _SC_LEVEL2_CACHE_SIZE, 131072, 4, 32 },
--    { 0x42, _SC_LEVEL2_CACHE_SIZE, 262144, 4, 32 },
--    { 0x43, _SC_LEVEL2_CACHE_SIZE, 524288, 4, 32 },
--    { 0x44, _SC_LEVEL2_CACHE_SIZE, 1048576, 4, 32 },
--    { 0x45, _SC_LEVEL2_CACHE_SIZE, 2097152, 4, 32 },
--    { 0x46, _SC_LEVEL3_CACHE_SIZE, 4194304, 4, 64 },
--    { 0x47, _SC_LEVEL3_CACHE_SIZE, 8388608, 8, 64 },
--    { 0x49, _SC_LEVEL2_CACHE_SIZE, 4194304, 16, 64 },
--    { 0x4a, _SC_LEVEL3_CACHE_SIZE, 6291456, 12, 64 },
--    { 0x4b, _SC_LEVEL3_CACHE_SIZE, 8388608, 16, 64 },
--    { 0x4c, _SC_LEVEL3_CACHE_SIZE, 12582912, 12, 64 },
--    { 0x4d, _SC_LEVEL3_CACHE_SIZE, 16777216, 16, 64 },
--    { 0x60, _SC_LEVEL1_DCACHE_SIZE, 16384, 8, 64 },
--    { 0x66, _SC_LEVEL1_DCACHE_SIZE, 8192, 4, 64 },
--    { 0x67, _SC_LEVEL1_DCACHE_SIZE, 16384, 4, 64 },
--    { 0x68, _SC_LEVEL1_DCACHE_SIZE, 32768, 4, 64 },
--    { 0x78, _SC_LEVEL2_CACHE_SIZE, 1048576, 8, 64 },
--    { 0x79, _SC_LEVEL2_CACHE_SIZE, 131072, 8, 64 },
--    { 0x7a, _SC_LEVEL2_CACHE_SIZE, 262144, 8, 64 },
--    { 0x7b, _SC_LEVEL2_CACHE_SIZE, 524288, 8, 64 },
--    { 0x7c, _SC_LEVEL2_CACHE_SIZE, 1048576, 8, 64 },
--    { 0x7d, _SC_LEVEL2_CACHE_SIZE, 2097152, 8, 64 },
--    { 0x7f, _SC_LEVEL2_CACHE_SIZE, 524288, 2, 64 },
--    { 0x82, _SC_LEVEL2_CACHE_SIZE, 262144, 8, 32 },
--    { 0x83, _SC_LEVEL2_CACHE_SIZE, 524288, 8, 32 },
--    { 0x84, _SC_LEVEL2_CACHE_SIZE, 1048576, 8, 32 },
--    { 0x85, _SC_LEVEL2_CACHE_SIZE, 2097152, 8, 32 },
--    { 0x86, _SC_LEVEL2_CACHE_SIZE, 524288, 4, 64 },
--    { 0x87, _SC_LEVEL2_CACHE_SIZE, 1048576, 8, 64 },
--  };
--#define nintel_02_known (sizeof (intel_02_known) / sizeof (intel_02_known[0]))
--
--
--static int
--intel_02_known_compare (const void *p1, const void *p2)
--{
--  const struct intel_02_cache_info *i1;
--  const struct intel_02_cache_info *i2;
--
--  i1 = (const struct intel_02_cache_info *) p1;
--  i2 = (const struct intel_02_cache_info *) p2;
--
--  if (i1->idx == i2->idx)
--    return 0;
--
--  return i1->idx < i2->idx ? -1 : 1;
--}
--
--
--static long int
--__attribute__ ((noinline))
--intel_check_word (int name, unsigned int value, bool *has_level_2,
--		  bool *no_level_2_or_3)
--{
--  if ((value & 0x80000000) != 0)
--    /* The register value is reserved.  */
--    return 0;
--
--  /* Fold the name.  The _SC_ constants are always in the order SIZE,
--     ASSOC, LINESIZE.  */
--  int folded_name = (_SC_LEVEL1_ICACHE_SIZE
--		     + ((name - _SC_LEVEL1_ICACHE_SIZE) / 3) * 3);
--
--  while (value != 0)
--    {
--      unsigned int byte = value & 0xff;
--
--      if (byte == 0x40)
--	{
--	  *no_level_2_or_3 = true;
--
--	  if (folded_name == _SC_LEVEL3_CACHE_SIZE)
--	    /* No need to look further.  */
--	    break;
--	}
--      else
--	{
--	  if (byte == 0x49 && folded_name == _SC_LEVEL3_CACHE_SIZE)
--	    {
--	      /* Intel reused this value.  For family 15, model 6 it
--		 specifies the 3rd level cache.  Otherwise the 2nd
--		 level cache.  */
--	      unsigned int eax;
--	      unsigned int ebx;
--	      unsigned int ecx;
--	      unsigned int edx;
--	      asm volatile ("xchgl %%ebx, %1; cpuid; xchgl %%ebx, %1"
--			    : "=a" (eax), "=r" (ebx), "=c" (ecx), "=d" (edx)
--			    : "0" (1));
--
--	      unsigned int family = ((eax >> 20) & 0xff) + ((eax >> 8) & 0xf);
--	      unsigned int model = ((((eax >>16) & 0xf) << 4)
--				    + ((eax >> 4) & 0xf));
--	      if (family == 15 && model == 6)
--		{
--		  /* The level 3 cache is encoded for this model like
--		     the level 2 cache is for other models.  Pretend
--		     the caller asked for the level 2 cache.  */
--		  name = (_SC_LEVEL2_CACHE_SIZE
--			  + (name - _SC_LEVEL3_CACHE_SIZE));
--		  folded_name = _SC_LEVEL3_CACHE_SIZE;
--		}
--	    }
--
--	  struct intel_02_cache_info *found;
--	  struct intel_02_cache_info search;
--
--	  search.idx = byte;
--	  found = bsearch (&search, intel_02_known, nintel_02_known,
--			   sizeof (intel_02_known[0]), intel_02_known_compare);
--	  if (found != NULL)
--	    {
--	      if (found->name == folded_name)
--		{
--		  unsigned int offset = name - folded_name;
--
--		  if (offset == 0)
--		    /* Cache size.  */
--		    return found->size;
--		  if (offset == 1)
--		    return found->assoc;
--
--		  assert (offset == 2);
--		  return found->linesize;
--		}
--
--	      if (found->name == _SC_LEVEL2_CACHE_SIZE)
--		*has_level_2 = true;
--	    }
--	}
--
--      /* Next byte for the next round.  */
--      value >>= 8;
--    }
--
--  /* Nothing found.  */
--  return 0;
--}
--
--
--static long int __attribute__ ((noinline))
--handle_intel (int name, unsigned int maxidx)
--{
--  assert (maxidx >= 2);
--
--  /* OK, we can use the CPUID instruction to get all info about the
--     caches.  */
--  unsigned int cnt = 0;
--  unsigned int max = 1;
--  long int result = 0;
--  bool no_level_2_or_3 = false;
--  bool has_level_2 = false;
--  while (cnt++ < max)
--    {
--      unsigned int eax;
--      unsigned int ebx;
--      unsigned int ecx;
--      unsigned int edx;
--      asm volatile ("xchgl %%ebx, %1; cpuid; xchgl %%ebx, %1"
--		    : "=a" (eax), "=r" (ebx), "=c" (ecx), "=d" (edx)
--		    : "0" (2));
--
--      /* The low byte of EAX in the first round contain the number of
--	 rounds we have to make.  At least one, the one we are already
--	 doing.  */
--      if (cnt == 1)
--	{
--	  max = eax & 0xff;
--	  eax &= 0xffffff00;
--	}
--
--      /* Process the individual registers' value.  */
--      result = intel_check_word (name, eax, &has_level_2, &no_level_2_or_3);
--      if (result != 0)
--	return result;
--
--      result = intel_check_word (name, ebx, &has_level_2, &no_level_2_or_3);
--      if (result != 0)
--	return result;
--
--      result = intel_check_word (name, ecx, &has_level_2, &no_level_2_or_3);
--      if (result != 0)
--	return result;
--
--      result = intel_check_word (name, edx, &has_level_2, &no_level_2_or_3);
--      if (result != 0)
--	return result;
--    }
--
--  if (name >= _SC_LEVEL2_CACHE_SIZE && name <= _SC_LEVEL3_CACHE_LINESIZE
--      && no_level_2_or_3)
--    return -1;
--
--  return 0;
--}
--
--
--static long int __attribute__ ((noinline))
--handle_amd (int name)
--{
--  unsigned int eax;
--  unsigned int ebx;
--  unsigned int ecx;
--  unsigned int edx;
--  asm volatile ("xchgl %%ebx, %1; cpuid; xchgl %%ebx, %1"
--		: "=a" (eax), "=r" (ebx), "=c" (ecx), "=d" (edx)
--		: "0" (0x80000000));
--
--  if (name >= _SC_LEVEL3_CACHE_SIZE)
--    return 0;
--
--  unsigned int fn = 0x80000005 + (name >= _SC_LEVEL2_CACHE_SIZE);
--  if (eax < fn)
--    return 0;
--
--  asm volatile ("xchgl %%ebx, %1; cpuid; xchgl %%ebx, %1"
--		: "=a" (eax), "=r" (ebx), "=c" (ecx), "=d" (edx)
--		: "0" (fn));
--
--  if (name < _SC_LEVEL1_DCACHE_SIZE)
--    {
--      name += _SC_LEVEL1_DCACHE_SIZE - _SC_LEVEL1_ICACHE_SIZE;
--      ecx = edx;
--    }
--
--  switch (name)
--    {
--    case _SC_LEVEL1_DCACHE_SIZE:
--      return (ecx >> 14) & 0x3fc00;
--    case _SC_LEVEL1_DCACHE_ASSOC:
--      ecx >>= 16;
--      if ((ecx & 0xff) == 0xff)
--	/* Fully associative.  */
--	return (ecx << 2) & 0x3fc00;
--      return ecx & 0xff;
--    case _SC_LEVEL1_DCACHE_LINESIZE:
--      return ecx & 0xff;
--    case _SC_LEVEL2_CACHE_SIZE:
--      return (ecx & 0xf000) == 0 ? 0 : (ecx >> 6) & 0x3fffc00;
--    case _SC_LEVEL2_CACHE_ASSOC:
--      ecx >>= 12;
--      switch (ecx & 0xf)
--        {
--        case 0:
--        case 1:
--        case 2:
--        case 4:
--	  return ecx & 0xf;
--	case 6:
--	  return 8;
--	case 8:
--	  return 16;
--	case 0xf:
--	  return (ecx << 6) & 0x3fffc00;
--	default:
--	  return 0;
--        }
--    case _SC_LEVEL2_CACHE_LINESIZE:
--      return (ecx & 0xf000) == 0 ? 0 : ecx & 0xff;
--    default:
--      assert (! "cannot happen");
--    }
--  return -1;
--}
-+extern long int __cache_sysconf (int) attribute_hidden;
- 
- 
- /* Get the value of the system variable NAME.  */
- long int
- __sysconf (int name)
- {
--  /* We only handle the cache information here (for now).  */
--  if (name < _SC_LEVEL1_ICACHE_SIZE || name > _SC_LEVEL4_CACHE_LINESIZE)
--    return linux_sysconf (name);
--
--  /* Find out what brand of processor.  */
--  unsigned int eax;
--  unsigned int ebx;
--  unsigned int ecx;
--  unsigned int edx;
--  asm volatile ("xchgl %%ebx, %1; cpuid; xchgl %%ebx, %1"
--		: "=a" (eax), "=r" (ebx), "=c" (ecx), "=d" (edx)
--		: "0" (0));
--
--  /* This spells out "GenuineIntel".  */
--  if (ebx == 0x756e6547 && ecx == 0x6c65746e && edx == 0x49656e69)
--    return handle_intel (name, eax);
--
--  /* This spells out "AuthenticAMD".  */
--  if (ebx == 0x68747541 && ecx == 0x444d4163 && edx == 0x69746e65)
--    return handle_amd (name);
--
--  // XXX Fill in more vendors.
-+  if (name >= _SC_LEVEL1_ICACHE_SIZE && name <= _SC_LEVEL4_CACHE_LINESIZE)
-+    return __cache_sysconf (name);
- 
--  /* CPU not known, we have no information.  */
--  return 0;
-+  return linux_sysconf (name);
- }
- 
- /* Now the generic Linux version.  */
---- /dev/null
-+++ glibc-2.6/sysdeps/x86_64/cacheinfo.c
-@@ -0,0 +1,451 @@
-+/* x86_64 cache info.
-+   Copyright (C) 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
-+   This file is part of the GNU C Library.
-+
-+   The GNU C Library is free software; you can redistribute it and/or
-+   modify it under the terms of the GNU Lesser General Public
-+   License as published by the Free Software Foundation; either
-+   version 2.1 of the License, or (at your option) any later version.
-+
-+   The GNU C Library is distributed in the hope that it will be useful,
-+   but WITHOUT ANY WARRANTY; without even the implied warranty of
-+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+   Lesser General Public License for more details.
-+
-+   You should have received a copy of the GNU Lesser General Public
-+   License along with the GNU C Library; if not, write to the Free
-+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-+   02111-1307 USA.
-+*/
-+
-+#include <assert.h>
-+#include <stdbool.h>
-+#include <stdlib.h>
-+#include <unistd.h>
-+
-+static const struct intel_02_cache_info
-+{
-+  unsigned int idx;
-+  int name;
-+  long int size;
-+  long int assoc;
-+  long int linesize;
-+} intel_02_known [] =
-+  {
-+    { 0x06, _SC_LEVEL1_ICACHE_SIZE,    8192,  4, 32 },
-+    { 0x08, _SC_LEVEL1_ICACHE_SIZE,   16384,  4, 32 },
-+    { 0x0a, _SC_LEVEL1_DCACHE_SIZE,    8192,  2, 32 },
-+    { 0x0c, _SC_LEVEL1_DCACHE_SIZE,   16384,  4, 32 },
-+    { 0x22, _SC_LEVEL3_CACHE_SIZE,   524288,  4, 64 },
-+    { 0x23, _SC_LEVEL3_CACHE_SIZE,  1048576,  8, 64 },
-+    { 0x25, _SC_LEVEL3_CACHE_SIZE,  2097152,  8, 64 },
-+    { 0x29, _SC_LEVEL3_CACHE_SIZE,  4194304,  8, 64 },
-+    { 0x2c, _SC_LEVEL1_DCACHE_SIZE,   32768,  8, 64 },
-+    { 0x30, _SC_LEVEL1_ICACHE_SIZE,   32768,  8, 64 },
-+    { 0x39, _SC_LEVEL2_CACHE_SIZE,   131072,  4, 64 },
-+    { 0x3a, _SC_LEVEL2_CACHE_SIZE,   196608,  6, 64 },
-+    { 0x3b, _SC_LEVEL2_CACHE_SIZE,   131072,  2, 64 },
-+    { 0x3c, _SC_LEVEL2_CACHE_SIZE,   262144,  4, 64 },
-+    { 0x3d, _SC_LEVEL2_CACHE_SIZE,   393216,  6, 64 },
-+    { 0x3e, _SC_LEVEL2_CACHE_SIZE,   524288,  4, 64 },
-+    { 0x41, _SC_LEVEL2_CACHE_SIZE,   131072,  4, 32 },
-+    { 0x42, _SC_LEVEL2_CACHE_SIZE,   262144,  4, 32 },
-+    { 0x43, _SC_LEVEL2_CACHE_SIZE,   524288,  4, 32 },
-+    { 0x44, _SC_LEVEL2_CACHE_SIZE,  1048576,  4, 32 },
-+    { 0x45, _SC_LEVEL2_CACHE_SIZE,  2097152,  4, 32 },
-+    { 0x46, _SC_LEVEL3_CACHE_SIZE,  4194304,  4, 64 },
-+    { 0x47, _SC_LEVEL3_CACHE_SIZE,  8388608,  8, 64 },
-+    { 0x49, _SC_LEVEL2_CACHE_SIZE,  4194304, 16, 64 },
-+    { 0x4a, _SC_LEVEL3_CACHE_SIZE,  6291456, 12, 64 },
-+    { 0x4b, _SC_LEVEL3_CACHE_SIZE,  8388608, 16, 64 },
-+    { 0x4c, _SC_LEVEL3_CACHE_SIZE, 12582912, 12, 64 },
-+    { 0x4d, _SC_LEVEL3_CACHE_SIZE, 16777216, 16, 64 },
-+    { 0x60, _SC_LEVEL1_DCACHE_SIZE,   16384,  8, 64 },
-+    { 0x66, _SC_LEVEL1_DCACHE_SIZE,    8192,  4, 64 },
-+    { 0x67, _SC_LEVEL1_DCACHE_SIZE,   16384,  4, 64 },
-+    { 0x68, _SC_LEVEL1_DCACHE_SIZE,   32768,  4, 64 },
-+    { 0x78, _SC_LEVEL2_CACHE_SIZE,  1048576,  8, 64 },
-+    { 0x79, _SC_LEVEL2_CACHE_SIZE,   131072,  8, 64 },
-+    { 0x7a, _SC_LEVEL2_CACHE_SIZE,   262144,  8, 64 },
-+    { 0x7b, _SC_LEVEL2_CACHE_SIZE,   524288,  8, 64 },
-+    { 0x7c, _SC_LEVEL2_CACHE_SIZE,  1048576,  8, 64 },
-+    { 0x7d, _SC_LEVEL2_CACHE_SIZE,  2097152,  8, 64 },
-+    { 0x7f, _SC_LEVEL2_CACHE_SIZE,   524288,  2, 64 },
-+    { 0x82, _SC_LEVEL2_CACHE_SIZE,   262144,  8, 32 },
-+    { 0x83, _SC_LEVEL2_CACHE_SIZE,   524288,  8, 32 },
-+    { 0x84, _SC_LEVEL2_CACHE_SIZE,  1048576,  8, 32 },
-+    { 0x85, _SC_LEVEL2_CACHE_SIZE,  2097152,  8, 32 },
-+    { 0x86, _SC_LEVEL2_CACHE_SIZE,   524288,  4, 64 },
-+    { 0x87, _SC_LEVEL2_CACHE_SIZE,  1048576,  8, 64 },
-+  };
-+
-+#define nintel_02_known (sizeof (intel_02_known) / sizeof (intel_02_known [0]))
-+
-+static int
-+intel_02_known_compare (const void *p1, const void *p2)
-+{
-+  const struct intel_02_cache_info *i1;
-+  const struct intel_02_cache_info *i2;
-+
-+  i1 = (const struct intel_02_cache_info *) p1;
-+  i2 = (const struct intel_02_cache_info *) p2;
-+
-+  if (i1->idx == i2->idx)
-+    return 0;
-+
-+  return i1->idx < i2->idx ? -1 : 1;
-+}
-+
-+
-+static long int
-+__attribute__ ((noinline))
-+intel_check_word (int name, unsigned int value, bool *has_level_2,
-+		  bool *no_level_2_or_3)
-+{
-+  if ((value & 0x80000000) != 0)
-+    /* The register value is reserved.  */
-+    return 0;
-+
-+  /* Fold the name.  The _SC_ constants are always in the order SIZE,
-+     ASSOC, LINESIZE.  */
-+  int folded_name = (_SC_LEVEL1_ICACHE_SIZE
-+		     + ((name - _SC_LEVEL1_ICACHE_SIZE) / 3) * 3);
-+
-+  while (value != 0)
-+    {
-+      unsigned int byte = value & 0xff;
-+
-+      if (byte == 0x40)
-+	{
-+	  *no_level_2_or_3 = true;
-+
-+	  if (folded_name == _SC_LEVEL3_CACHE_SIZE)
-+	    /* No need to look further.  */
-+	    break;
-+	}
-+      else
-+	{
-+	  if (byte == 0x49 && folded_name == _SC_LEVEL3_CACHE_SIZE)
-+	    {
-+	      /* Intel reused this value.  For family 15, model 6 it
-+		 specifies the 3rd level cache.  Otherwise the 2nd
-+		 level cache.  */
-+	      unsigned int eax;
-+	      unsigned int ebx;
-+	      unsigned int ecx;
-+	      unsigned int edx;
-+	      asm volatile ("cpuid"
-+			    : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-+			    : "0" (1));
-+
-+	      unsigned int family = ((eax >> 20) & 0xff) + ((eax >> 8) & 0xf);
-+	      unsigned int model = ((((eax >>16) & 0xf) << 4)
-+				    + ((eax >> 4) & 0xf));
-+	      if (family == 15 && model == 6)
-+		{
-+		  /* The level 3 cache is encoded for this model like
-+		     the level 2 cache is for other models.  Pretend
-+		     the caller asked for the level 2 cache.  */
-+		  name = (_SC_LEVEL2_CACHE_SIZE
-+			  + (name - _SC_LEVEL3_CACHE_SIZE));
-+		  folded_name = _SC_LEVEL3_CACHE_SIZE;
-+		}
-+	    }
-+
-+	  struct intel_02_cache_info *found;
-+	  struct intel_02_cache_info search;
-+
-+	  search.idx = byte;
-+	  found = bsearch (&search, intel_02_known, nintel_02_known,
-+			   sizeof (intel_02_known[0]), intel_02_known_compare);
-+	  if (found != NULL)
-+	    {
-+	      if (found->name == folded_name)
-+		{
-+		  unsigned int offset = name - folded_name;
-+
-+		  if (offset == 0)
-+		    /* Cache size.  */
-+		    return found->size;
-+		  if (offset == 1)
-+		    return found->assoc;
-+
-+		  assert (offset == 2);
-+		  return found->linesize;
-+		}
-+
-+	      if (found->name == _SC_LEVEL2_CACHE_SIZE)
-+		*has_level_2 = true;
-+	    }
-+	}
-+
-+      /* Next byte for the next round.  */
-+      value >>= 8;
-+    }
-+
-+  /* Nothing found.  */
-+  return 0;
-+}
-+
-+
-+static long int __attribute__ ((noinline))
-+handle_intel (int name, unsigned int maxidx)
-+{
-+  assert (maxidx >= 2);
-+
-+  /* OK, we can use the CPUID instruction to get all info about the
-+     caches.  */
-+  unsigned int cnt = 0;
-+  unsigned int max = 1;
-+  long int result = 0;
-+  bool no_level_2_or_3 = false;
-+  bool has_level_2 = false;
-+
-+  while (cnt++ < max)
-+    {
-+      unsigned int eax;
-+      unsigned int ebx;
-+      unsigned int ecx;
-+      unsigned int edx;
-+      asm volatile ("cpuid"
-+		    : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-+		    : "0" (2));
-+
-+      /* The low byte of EAX in the first round contain the number of
-+	 rounds we have to make.  At least one, the one we are already
-+	 doing.  */
-+      if (cnt == 1)
-+	{
-+	  max = eax & 0xff;
-+	  eax &= 0xffffff00;
-+	}
-+
-+      /* Process the individual registers' value.  */
-+      result = intel_check_word (name, eax, &has_level_2, &no_level_2_or_3);
-+      if (result != 0)
-+	return result;
-+
-+      result = intel_check_word (name, ebx, &has_level_2, &no_level_2_or_3);
-+      if (result != 0)
-+	return result;
-+
-+      result = intel_check_word (name, ecx, &has_level_2, &no_level_2_or_3);
-+      if (result != 0)
-+	return result;
-+
-+      result = intel_check_word (name, edx, &has_level_2, &no_level_2_or_3);
-+      if (result != 0)
-+	return result;
-+    }
-+
-+  if (name >= _SC_LEVEL2_CACHE_SIZE && name <= _SC_LEVEL3_CACHE_LINESIZE
-+      && no_level_2_or_3)
-+    return -1;
-+
-+  return 0;
-+}
-+
-+
-+static long int __attribute__ ((noinline))
-+handle_amd (int name)
-+{
-+  unsigned int eax;
-+  unsigned int ebx;
-+  unsigned int ecx;
-+  unsigned int edx;
-+  asm volatile ("cpuid"
-+		: "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-+		: "0" (0x80000000));
-+
-+  if (name >= _SC_LEVEL3_CACHE_SIZE)
-+    return 0;
-+
-+  unsigned int fn = 0x80000005 + (name >= _SC_LEVEL2_CACHE_SIZE);
-+  if (eax < fn)
-+    return 0;
-+
-+  asm volatile ("cpuid"
-+		: "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-+		: "0" (fn));
-+
-+  if (name < _SC_LEVEL1_DCACHE_SIZE)
-+    {
-+      name += _SC_LEVEL1_DCACHE_SIZE - _SC_LEVEL1_ICACHE_SIZE;
-+      ecx = edx;
-+    }
-+
-+  switch (name)
-+    {
-+    case _SC_LEVEL1_DCACHE_SIZE:
-+      return (ecx >> 14) & 0x3fc00;
-+    case _SC_LEVEL1_DCACHE_ASSOC:
-+      ecx >>= 16;
-+      if ((ecx & 0xff) == 0xff)
-+	/* Fully associative.  */
-+	return (ecx << 2) & 0x3fc00;
-+      return ecx & 0xff;
-+    case _SC_LEVEL1_DCACHE_LINESIZE:
-+      return ecx & 0xff;
-+    case _SC_LEVEL2_CACHE_SIZE:
-+      return (ecx & 0xf000) == 0 ? 0 : (ecx >> 6) & 0x3fffc00;
-+    case _SC_LEVEL2_CACHE_ASSOC:
-+      ecx >>= 12;
-+      switch (ecx & 0xf)
-+        {
-+        case 0:
-+        case 1:
-+        case 2:
-+        case 4:
-+	  return ecx & 0xf;
-+	case 6:
-+	  return 8;
-+	case 8:
-+	  return 16;
-+	case 0xf:
-+	  return (ecx << 6) & 0x3fffc00;
-+	default:
-+	  return 0;
-+        }
-+    case _SC_LEVEL2_CACHE_LINESIZE:
-+      return (ecx & 0xf000) == 0 ? 0 : ecx & 0xff;
-+    default:
-+      assert (! "cannot happen");
-+    }
-+  return -1;
-+}
-+
-+
-+/* Get the value of the system variable NAME.  */
-+long int
-+attribute_hidden
-+__cache_sysconf (int name)
-+{
-+  /* Find out what brand of processor.  */
-+  unsigned int eax;
-+  unsigned int ebx;
-+  unsigned int ecx;
-+  unsigned int edx;
-+  asm volatile ("cpuid"
-+		: "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-+		: "0" (0));
-+
-+  /* This spells out "GenuineIntel".  */
-+  if (ebx == 0x756e6547 && ecx == 0x6c65746e && edx == 0x49656e69)
-+    return handle_intel (name, eax);
-+
-+  /* This spells out "AuthenticAMD".  */
-+  if (ebx == 0x68747541 && ecx == 0x444d4163 && edx == 0x69746e65)
-+    return handle_amd (name);
-+
-+  // XXX Fill in more vendors.
-+
-+  /* CPU not known, we have no information.  */
-+  return 0;
-+}
-+
-+
-+/* Half the core cache size for use in memory and string routines, typically
-+   L1 size. */
-+long int __x86_64_core_cache_size_half attribute_hidden = 32 * 1024 / 2;
-+/* Shared cache size for use in memory and string routines, typically
-+   L2 or L3 size. */
-+long int __x86_64_shared_cache_size_half attribute_hidden = 1024 * 1024 / 2;
-+/* PREFETCHW support flag for use in memory and string routines. */
-+int __x86_64_prefetchw attribute_hidden;
-+
-+
-+static void
-+__attribute__((constructor))
-+init_cacheinfo (void)
-+{
-+  /* Find out what brand of processor.  */
-+  unsigned int eax;
-+  unsigned int ebx;
-+  unsigned int ecx;
-+  unsigned int edx;
-+  int max_cpuid;
-+  int max_cpuid_ex;
-+  long int core = -1;
-+  long int shared = -1;
-+  unsigned int level;
-+  unsigned int threads = 0;
-+
-+  asm volatile ("cpuid"
-+		: "=a" (max_cpuid), "=b" (ebx), "=c" (ecx), "=d" (edx)
-+		: "0" (0));
-+
-+  /* This spells out "GenuineIntel".  */
-+  if (ebx == 0x756e6547 && ecx == 0x6c65746e && edx == 0x49656e69)
-+    {
-+      core = handle_intel (_SC_LEVEL1_DCACHE_SIZE, max_cpuid);
-+
-+      /* Try L3 first. */
-+      level  = 3;
-+      shared = handle_intel (_SC_LEVEL3_CACHE_SIZE, max_cpuid);
-+
-+      if (shared <= 0)
-+        {
-+	  /* Try L2 otherwise. */
-+          level  = 2;
-+          shared = handle_intel (_SC_LEVEL2_CACHE_SIZE, max_cpuid);
-+	}
-+
-+      /* Figure out the number of logical threads that share the
-+	 highest cache level. */
-+      if (max_cpuid >= 4)
-+        {
-+	  int i = 0;
-+
-+	  /* Query until desired cache level is enumerated. */
-+	  do
-+	    {
-+              asm volatile ("cpuid"
-+		            : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-+		            : "0" (4), "2" (i++));
-+	    }
-+          while (((eax >> 5) & 0x7) != level);
-+
-+	  threads = ((eax >> 14) & 0x3ff) + 1;
-+	}
-+      else
-+        {
-+	  /* Assume that all logical threads share the highest cache level. */
-+          asm volatile ("cpuid"
-+		        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-+		        : "0" (1));
-+
-+	  threads = (ebx >> 16) & 0xff;
-+	}
-+
-+      /* Cap usage of highest cache level to the number of supported
-+	 threads. */
-+      if (shared > 0 && threads > 0)
-+        shared /= threads;
-+    }
-+  /* This spells out "AuthenticAMD".  */
-+  else if (ebx == 0x68747541 && ecx == 0x444d4163 && edx == 0x69746e65)
-+    {
-+      core   = handle_amd (_SC_LEVEL1_DCACHE_SIZE);
-+      shared = handle_amd (_SC_LEVEL2_CACHE_SIZE);
-+
-+      asm volatile ("cpuid"
-+		    : "=a" (max_cpuid_ex), "=b" (ebx), "=c" (ecx), "=d" (edx)
-+		    : "0" (0x80000000));
-+
-+      if (max_cpuid_ex >= 0x80000001)
-+	{
-+	  asm volatile ("cpuid"
-+			: "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-+			: "0" (0x80000001));
-+	  /*  PREFETCHW     || 3DNow! */
-+	  if ((ecx & 0x100) || (edx & 0x80000000))
-+	    __x86_64_prefetchw = -1;
-+	}
-+    }
-+
-+  if (core > 0)
-+    __x86_64_core_cache_size_half = core / 2;
-+
-+  if (shared > 0)
-+    __x86_64_shared_cache_size_half = shared / 2;
-+}
---- /dev/null
-+++ glibc-2.6/sysdeps/x86_64/fpu/k_cosl.c
-@@ -0,0 +1 @@
-+/*  Not needed.  */
---- /dev/null
-+++ glibc-2.6/sysdeps/x86_64/fpu/k_rem_pio2l.c
-@@ -0,0 +1 @@
-+/*  Not needed.  */
---- /dev/null
-+++ glibc-2.6/sysdeps/x86_64/fpu/k_sinl.c
-@@ -0,0 +1 @@
-+/*  Not needed.  */
---- /dev/null
-+++ glibc-2.6/sysdeps/x86_64/fpu/k_tanl.c
-@@ -0,0 +1 @@
-+/*  Not needed.  */
---- /dev/null
-+++ glibc-2.6/sysdeps/x86_64/ldbl2mpn.c
-@@ -0,0 +1 @@
-+#include "../i386/ldbl2mpn.c"
---- glibc-2.6.orig/sysdeps/x86_64/Makefile
-+++ glibc-2.6/sysdeps/x86_64/Makefile
-@@ -9,3 +9,7 @@
- ifeq ($(subdir),gmon)
- sysdep_routines += _mcount
- endif
-+
-+ifeq ($(subdir),string)
-+sysdep_routines += cacheinfo
-+endif
---- glibc-2.6.orig/sysdeps/x86_64/memcpy.S
-+++ glibc-2.6/sysdeps/x86_64/memcpy.S
-@@ -1,7 +1,10 @@
--/* Highly optimized version for x86-64.
--   Copyright (C) 1997, 2000, 2002, 2003, 2004 Free Software Foundation, Inc.
-+/*
-+   Optimized memcpy for x86-64.
-+
-+   Copyright (C) 2007 Free Software Foundation, Inc.
-+   Contributed by Evandro Menezes <evandro.menezes@amd.com>, 2007.
-+
-    This file is part of the GNU C Library.
--   Based on i586 version contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
- 
-    The GNU C Library is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Lesser General Public
-@@ -16,86 +19,556 @@
-    You should have received a copy of the GNU Lesser General Public
-    License along with the GNU C Library; if not, write to the Free
-    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
--   02111-1307 USA.  */
-+   02111-1307 USA.
-+*/
- 
- #include <sysdep.h>
- #include "asm-syntax.h"
--#include "bp-sym.h"
--#include "bp-asm.h"
- 
--/* BEWARE: `#ifdef memcpy' means that memcpy is redefined as `mempcpy',
--   and the return value is the byte after the last one copied in
--   the destination. */
--#define MEMPCPY_P (defined memcpy)
-+/* Stack slots in the red-zone. */
-+
-+#ifdef USE_AS_MEMPCPY
-+#  define RETVAL	(0)
-+#else
-+#  define RETVAL	(-8)
-+#endif
-+#define SAVE0	(RETVAL - 8)
-+#define SAVE1	(SAVE0	- 8)
-+#define SAVE2	(SAVE1	- 8)
-+#define SAVE3	(SAVE2	- 8)
- 
-         .text
-+
- #if defined PIC && !defined NOT_IN_libc
- ENTRY (__memcpy_chk)
-+
- 	cmpq	%rdx, %rcx
- 	jb	HIDDEN_JUMPTARGET (__chk_fail)
-+
- END (__memcpy_chk)
- #endif
--ENTRY (BP_SYM (memcpy))
--	/* Cutoff for the big loop is a size of 32 bytes since otherwise
--	   the loop will never be entered.  */
-+
-+ENTRY(memcpy)				/* (void *, const void*, size_t) */
-+
-+/* Handle tiny blocks. */
-+
-+L(1try):				/* up to 32B */
- 	cmpq	$32, %rdx
--	movq	%rdx, %rcx
--#if !MEMPCPY_P
--	movq	%rdi, %r10	/* Save value. */
-+#ifndef USE_AS_MEMPCPY
-+	movq	%rdi, %rax		/* save return value */
- #endif
-+	jae	L(1after)
- 
--	/* We need this in any case.  */
--	cld
-+L(1):					/* 1-byte once */
-+	testb	$1, %dl
-+	jz	L(1a)
- 
--	jbe	1f
-+	movzbl	(%rsi),	%ecx
-+	movb	%cl, (%rdi)
- 
--	/* Align destination.  */
--	movq	%rdi, %rax
--	negq	%rax
--	andq	$7, %rax
--	subq	%rax, %rcx
--	xchgq	%rax, %rcx
-+	incq	%rsi
-+	incq	%rdi
-+
-+	.p2align 4,, 4
-+
-+L(1a):					/* 2-byte once */
-+	testb	$2, %dl
-+	jz	L(1b)
-+
-+	movzwl	(%rsi),	%ecx
-+	movw	%cx, (%rdi)
- 
--	rep; movsb
-+	addq	$2, %rsi
-+	addq	$2, %rdi
- 
--	movq	%rax, %rcx
--	subq	$32, %rcx
--	js	2f
-+	.p2align 4,, 4
-+
-+L(1b):					/* 4-byte once */
-+	testb	$4, %dl
-+	jz	L(1c)
-+
-+	movl	(%rsi),	%ecx
-+	movl	%ecx, (%rdi)
-+
-+	addq	$4, %rsi
-+	addq	$4, %rdi
-+
-+	.p2align 4,, 4
-+
-+L(1c):					/* 8-byte once */
-+	testb	$8, %dl
-+	jz	L(1d)
-+
-+	movq	(%rsi), %rcx
-+	movq	%rcx, (%rdi)
-+
-+	addq	$8, %rsi
-+	addq	$8, %rdi
-+
-+	.p2align 4,, 4
-+
-+L(1d):					/* 16-byte loop */
-+	andl	$0xf0, %edx
-+	jz	L(exit)
- 
- 	.p2align 4
--3:
- 
--	/* Now correct the loop counter.  Please note that in the following
--	   code the flags are not changed anymore.  */
--	subq	$32, %rcx
-+L(1loop):
-+	movq	  (%rsi), %rcx
-+	movq	8 (%rsi), %r8
-+	movq	%rcx,   (%rdi)
-+	movq	 %r8, 8 (%rdi)
-+
-+	subl	$16, %edx
-+
-+	leaq	16 (%rsi), %rsi
-+	leaq	16 (%rdi), %rdi
-+
-+	jnz	L(1loop)
-+
-+	.p2align 4,, 4
-+
-+L(exit):				/* exit */
-+#ifdef USE_AS_MEMPCPY
-+	movq	%rdi, %rax		/* return value */
-+#else
-+	rep
-+#endif
-+	retq
-+
-+	.p2align 4
-+
-+L(1after):
-+#ifndef USE_AS_MEMPCPY
-+	movq	%rax, RETVAL (%rsp)	/* save return value */
-+#endif
-+
-+/* Align to the natural word size. */
-+
-+L(aligntry):
-+	movl	%esi, %ecx      	/* align by destination */
-+
-+	andl	$7, %ecx
-+	jz	L(alignafter)  		/* already aligned */
-+
-+L(align):		      		/* align */
-+	leaq	-8 (%rcx, %rdx), %rdx	/* calculate remaining bytes */
-+	subl	$8, %ecx
-+
-+	.p2align 4
-+
-+L(alignloop):				/* 1-byte alignment loop */
-+	movzbl	(%rsi), %eax
-+	movb	%al, (%rdi)
-+
-+	incl	%ecx
-+
-+	leaq	1 (%rsi), %rsi
-+	leaq	1 (%rdi), %rdi
-+
-+	jnz	L(alignloop)
-+
-+	.p2align 4
-+
-+L(alignafter):
-+
-+/* Loop to handle mid-sized blocks. */
-+
-+L(32try):				/* up to 1KB */
-+	cmpq	$1024, %rdx
-+	ja	L(32after)
-+
-+L(32):					/* 32-byte loop */
-+	movl	%edx, %ecx
-+	shrl	$5, %ecx
-+	jz	L(32skip)
-+
-+	.p2align 4
-+
-+L(32loop):
-+	decl	%ecx
- 
- 	movq	(%rsi), %rax
--	movq	8(%rsi), %rdx
--	movq	16(%rsi), %r8
--	movq	24(%rsi), %r9
-+	movq	 8 (%rsi), %r8
-+	movq	16 (%rsi), %r9
-+	movq	24 (%rsi), %r10
-+
- 	movq	%rax, (%rdi)
--	movq	%rdx, 8(%rdi)
--	movq	%r8, 16(%rdi)
--	movq	%r9, 24(%rdi)
-+	movq	 %r8,  8 (%rdi)
-+	movq	 %r9, 16 (%rdi)
-+	movq	%r10, 24 (%rdi)
- 
- 	leaq	32(%rsi), %rsi
- 	leaq	32(%rdi), %rdi
- 
--	jns	3b
-+	jz	L(32skip)		/* help out smaller blocks */
-+
-+	decl	%ecx
-+
-+	movq	   (%rsi), %rax
-+	movq	 8 (%rsi), %r8
-+	movq	16 (%rsi), %r9
-+	movq	24 (%rsi), %r10
-+
-+	movq	%rax,    (%rdi)
-+	movq	 %r8,  8 (%rdi)
-+	movq	 %r9, 16 (%rdi)
-+	movq	%r10, 24 (%rdi)
-+
-+	leaq	32 (%rsi), %rsi
-+	leaq	32 (%rdi), %rdi
-+
-+	jnz	L(32loop)
-+
-+	.p2align 4
- 
--	/* Correct extra loop counter modification.  */
--2:	addq	$32, %rcx
--1:	rep; movsb
-+L(32skip):
-+	andl	$31, %edx		/* check for left overs */
-+#ifdef USE_AS_MEMPCPY
-+	jnz	L(1)
- 
--#if MEMPCPY_P
--	movq	%rdi, %rax		/* Set return value.  */
-+	movq	%rdi, %rax
- #else
--	movq	%r10, %rax		/* Set return value.  */
-+	movq	RETVAL (%rsp), %rax
-+	jnz	L(1)
- 	
-+	rep
-+#endif
-+	retq				/* exit */
-+
-+	.p2align 4
-+
-+L(32after):
-+
-+/*
-+	In order to minimize code-size in RTLD, algorithms specific for
-+	larger blocks are excluded when building for RTLD.
-+*/
-+
-+/* Handle large blocks smaller than 1/2 L1. */
-+
-+L(fasttry):				/* first 1/2 L1 */
-+#ifndef NOT_IN_libc			/* only up to this algorithm outside of libc.so */
-+	movq	__x86_64_core_cache_size_half (%rip), %r11
-+	cmpq	%rdx, %r11		/* calculate the smaller of */
-+	cmovaq	%rdx, %r11		/* remaining bytes and 1/2 L1 */
-+#endif
-+
-+L(fast):				/* good ol' MOVS */
-+#ifndef NOT_IN_libc
-+	movq	%r11, %rcx
-+	andq	$-8, %r11
-+#else
-+	movq	%rdx, %rcx
-+#endif
-+	shrq	$3, %rcx
-+	jz	L(fastskip)
-+
-+	rep
-+	movsq
-+
-+	.p2align 4,, 4
-+
-+L(fastskip):
-+#ifndef NOT_IN_libc
-+	subq	%r11, %rdx		/* check for more */
-+	testq	$-8, %rdx
-+	jnz	L(fastafter)
- #endif
--	ret
- 
--END (BP_SYM (memcpy))
--#if !MEMPCPY_P
-+	andl	$7, %edx		/* check for left overs */
-+#ifdef USE_AS_MEMPCPY
-+	jnz	L(1)
-+
-+	movq	%rdi, %rax
-+#else
-+	movq	RETVAL (%rsp), %rax
-+	jnz	L(1)
-+
-+	rep
-+#endif
-+	retq				/* exit */
-+
-+#ifndef NOT_IN_libc			/* none of the algorithms below for RTLD */
-+
-+	.p2align 4
-+
-+L(fastafter):
-+
-+/* Handle large blocks smaller than 1/2 L2. */
-+
-+L(pretry):				/* first 1/2 L2 */
-+	movq	__x86_64_shared_cache_size_half (%rip), %r8
-+	cmpq	%rdx, %r8		/* calculate the lesser of */
-+	cmovaq	%rdx, %r8		/* remaining bytes and 1/2 L2 */
-+
-+L(pre):					/* 64-byte with prefetching */
-+	movq	%r8, %rcx
-+	andq	$-64, %r8
-+	shrq	$6, %rcx
-+	jz	L(preskip)
-+
-+	movq	%r14, SAVE0 (%rsp)
-+	cfi_rel_offset (%r14, SAVE0)
-+	movq	%r13, SAVE1 (%rsp)
-+	cfi_rel_offset (%r13, SAVE1)
-+	movq	%r12, SAVE2 (%rsp)
-+	cfi_rel_offset (%r12, SAVE2)
-+	movq	%rbx, SAVE3 (%rsp)
-+	cfi_rel_offset (%rbx, SAVE3)
-+
-+	cmpl	$0, __x86_64_prefetchw (%rip)
-+	jz	L(preloop)		/* check if PREFETCHW OK */
-+
-+	.p2align 4
-+
-+/* ... when PREFETCHW is available (less cache-probe traffic in MP systems). */
-+
-+L(prewloop):				/* cache-line in state M */
-+	decq	%rcx
-+
-+	movq	   (%rsi), %rax
-+	movq	 8 (%rsi), %rbx
-+	movq	16 (%rsi), %r9
-+	movq	24 (%rsi), %r10
-+	movq	32 (%rsi), %r11
-+	movq	40 (%rsi), %r12
-+	movq	48 (%rsi), %r13
-+	movq	56 (%rsi), %r14
-+
-+	prefetcht0	 0 + 896 (%rsi)
-+	prefetcht0	64 + 896 (%rsi)
-+
-+	movq	%rax,    (%rdi)
-+	movq	%rbx,  8 (%rdi)
-+	movq	 %r9, 16 (%rdi)
-+	movq	%r10, 24 (%rdi)
-+	movq	%r11, 32 (%rdi)
-+	movq	%r12, 40 (%rdi)
-+	movq	%r13, 48 (%rdi)
-+	movq	%r14, 56 (%rdi)
-+
-+	leaq	64 (%rsi), %rsi
-+	leaq	64 (%rdi), %rdi
-+
-+	jz	L(prebail)
-+
-+	decq	%rcx
-+
-+	movq	   (%rsi), %rax
-+	movq	 8 (%rsi), %rbx
-+	movq	16 (%rsi), %r9
-+	movq	24 (%rsi), %r10
-+	movq	32 (%rsi), %r11
-+	movq	40 (%rsi), %r12
-+	movq	48 (%rsi), %r13
-+	movq	56 (%rsi), %r14
-+
-+	movq	%rax,    (%rdi)
-+	movq	%rbx,  8 (%rdi)
-+	movq	 %r9, 16 (%rdi)
-+	movq	%r10, 24 (%rdi)
-+	movq	%r11, 32 (%rdi)
-+	movq	%r12, 40 (%rdi)
-+	movq	%r13, 48 (%rdi)
-+	movq	%r14, 56 (%rdi)
-+
-+	prefetchw	896 - 64 (%rdi)
-+	prefetchw	896 -  0 (%rdi)
-+
-+	leaq	64 (%rsi), %rsi
-+	leaq	64 (%rdi), %rdi
-+
-+	jnz	L(prewloop)
-+	jmp	L(prebail)
-+
-+	.p2align 4
-+
-+/* ... when PREFETCHW is not available. */
-+
-+L(preloop):				/* cache-line in state E */
-+	decq	%rcx
-+
-+	movq	   (%rsi), %rax
-+	movq	 8 (%rsi), %rbx
-+	movq	16 (%rsi), %r9
-+	movq	24 (%rsi), %r10
-+	movq	32 (%rsi), %r11
-+	movq	40 (%rsi), %r12
-+	movq	48 (%rsi), %r13
-+	movq	56 (%rsi), %r14
-+
-+	prefetcht0	896 +  0 (%rsi)
-+	prefetcht0	896 + 64 (%rsi)
-+
-+	movq	%rax,    (%rdi)
-+	movq	%rbx,  8 (%rdi)
-+	movq	 %r9, 16 (%rdi)
-+	movq	%r10, 24 (%rdi)
-+	movq	%r11, 32 (%rdi)
-+	movq	%r12, 40 (%rdi)
-+	movq	%r13, 48 (%rdi)
-+	movq	%r14, 56 (%rdi)
-+
-+	leaq	64 (%rsi), %rsi
-+	leaq	64 (%rdi), %rdi
-+
-+	jz	L(prebail)
-+
-+	decq	%rcx
-+
-+	movq	   (%rsi), %rax
-+	movq	 8 (%rsi), %rbx
-+	movq	16 (%rsi), %r9
-+	movq	24 (%rsi), %r10
-+	movq	32 (%rsi), %r11
-+	movq	40 (%rsi), %r12
-+	movq	48 (%rsi), %r13
-+	movq	56 (%rsi), %r14
-+
-+	prefetcht0	896 - 64 (%rdi)
-+	prefetcht0	896 -  0 (%rdi)
-+
-+	movq	%rax,    (%rdi)
-+	movq	%rbx,  8 (%rdi)
-+	movq	 %r9, 16 (%rdi)
-+	movq	%r10, 24 (%rdi)
-+	movq	%r11, 32 (%rdi)
-+	movq	%r12, 40 (%rdi)
-+	movq	%r13, 48 (%rdi)
-+	movq	%r14, 56 (%rdi)
-+
-+	leaq	64 (%rsi), %rsi
-+	leaq	64 (%rdi), %rdi
-+
-+	jnz	L(preloop)
-+
-+L(prebail):
-+	movq	SAVE3 (%rsp), %rbx
-+	cfi_restore (%rbx)
-+	movq	SAVE2 (%rsp), %r12
-+	cfi_restore (%r12)
-+	movq	SAVE1 (%rsp), %r13
-+	cfi_restore (%r13)
-+	movq	SAVE0 (%rsp), %r14
-+	cfi_restore (%r14)
-+
-+/*       .p2align 4 */
-+
-+L(preskip):
-+	subq	%r8, %rdx		/* check for more */
-+	testq	$-64, %rdx
-+	jnz	L(preafter)
-+
-+	andl	$63, %edx		/* check for left overs */
-+#ifdef USE_AS_MEMPCPY
-+	jnz	L(1)
-+
-+	movq	%rdi, %rax
-+#else
-+	movq	RETVAL (%rsp), %rax
-+	jnz	L(1)
-+
-+	rep
-+#endif
-+	retq				/* exit */
-+
-+	.p2align 4
-+
-+L(preafter):
-+
-+/* Loop to handle huge blocks. */
-+
-+L(NTtry):
-+
-+L(NT):					/* non-temporal 128-byte */
-+	movq	%rdx, %rcx
-+	shrq	$7, %rcx
-+	jz	L(NTskip)
-+
-+	movq	%r14, SAVE0 (%rsp)
-+	cfi_rel_offset (%r14, SAVE0)
-+	movq	%r13, SAVE1 (%rsp)
-+	cfi_rel_offset (%r13, SAVE1)
-+	movq	%r12, SAVE2 (%rsp)
-+	cfi_rel_offset (%r12, SAVE2)
-+
-+       .p2align 4
-+
-+L(NTloop):
-+	prefetchnta	768 (%rsi)
-+	prefetchnta	832 (%rsi)
-+
-+	decq	%rcx
-+
-+	movq	   (%rsi), %rax
-+	movq	 8 (%rsi), %r8
-+	movq	16 (%rsi), %r9
-+	movq	24 (%rsi), %r10
-+	movq	32 (%rsi), %r11
-+	movq	40 (%rsi), %r12
-+	movq	48 (%rsi), %r13
-+	movq	56 (%rsi), %r14
-+
-+	movntiq	%rax,    (%rdi)
-+	movntiq	 %r8,  8 (%rdi)
-+	movntiq	 %r9, 16 (%rdi)
-+	movntiq	%r10, 24 (%rdi)
-+	movntiq	%r11, 32 (%rdi)
-+	movntiq	%r12, 40 (%rdi)
-+	movntiq	%r13, 48 (%rdi)
-+	movntiq	%r14, 56 (%rdi)
-+
-+	movq	 64 (%rsi), %rax
-+	movq	 72 (%rsi), %r8
-+	movq	 80 (%rsi), %r9
-+	movq	 88 (%rsi), %r10
-+	movq	 96 (%rsi), %r11
-+	movq	104 (%rsi), %r12
-+	movq	112 (%rsi), %r13
-+	movq	120 (%rsi), %r14
-+
-+	movntiq	%rax,  64 (%rdi)
-+	movntiq	 %r8,  72 (%rdi)
-+	movntiq	 %r9,  80 (%rdi)
-+	movntiq	%r10,  88 (%rdi)
-+	movntiq	%r11,  96 (%rdi)
-+	movntiq	%r12, 104 (%rdi)
-+	movntiq	%r13, 112 (%rdi)
-+	movntiq	%r14, 120 (%rdi)
-+
-+	leaq	128 (%rsi), %rsi
-+	leaq	128 (%rdi), %rdi
-+
-+	jnz	L(NTloop)
-+
-+	sfence				/* serialize memory stores */
-+
-+	movq	SAVE2 (%rsp), %r12
-+	cfi_restore (%r12)
-+	movq	SAVE1 (%rsp), %r13
-+	cfi_restore (%r13)
-+	movq	SAVE0 (%rsp), %r14
-+	cfi_restore (%r14)
-+
-+L(NTskip):
-+	andl	$127, %edx		/* check for left overs */
-+#ifdef USE_AS_MEMPCPY
-+	jnz	L(1)
-+
-+	movq	%rdi, %rax
-+#else
-+	movq	RETVAL (%rsp), %rax
-+	jnz	L(1)
-+
-+	rep
-+#endif
-+	retq				/* exit */
-+
-+#endif /* !NOT_IN_libc */
-+
-+END(memcpy)
-+
-+#ifndef USE_AS_MEMPCPY
- libc_hidden_builtin_def (memcpy)
- #endif
---- glibc-2.6.orig/sysdeps/x86_64/mempcpy.S
-+++ glibc-2.6/sysdeps/x86_64/mempcpy.S
-@@ -1,3 +1,4 @@
-+#define USE_AS_MEMPCPY
- #define memcpy __mempcpy
- #define __memcpy_chk __mempcpy_chk
- #include <sysdeps/x86_64/memcpy.S>

Modified: glibc-package/trunk/debian/patches/series
===================================================================
--- glibc-package/trunk/debian/patches/series	2007-08-01 06:01:55 UTC (rev 2491)
+++ glibc-package/trunk/debian/patches/series	2007-08-01 06:04:08 UTC (rev 2492)
@@ -1,5 +1,3 @@
-any/cvs-glibc-2_6-branch.diff
-
 localedata/locale-de_CH.diff 
 localedata/locale-eo_EO.diff -p0
 localedata/locale-no_NO.diff -p0



Reply to: