rpms/dietlibc/F-8 dietlibc-0.31-pagesize.patch,1.6,1.7

Enrico Scholz (ensc) fedora-extras-commits at redhat.com
Sat Jun 21 14:20:58 UTC 2008


Author: ensc

Update of /cvs/extras/rpms/dietlibc/F-8
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv376

Modified Files:
	dietlibc-0.31-pagesize.patch 
Log Message:
* moved calculation of __elfinto into start.S; user could do
  e.g. '*environ = NULL' which breaks the current deferred calculation
  in __libc_getpagesize()

* do not return a predefined PAGE_SIZE when __elfinfo code fails


dietlibc-0.31-pagesize.patch:

Index: dietlibc-0.31-pagesize.patch
===================================================================
RCS file: /cvs/extras/rpms/dietlibc/F-8/dietlibc-0.31-pagesize.patch,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- dietlibc-0.31-pagesize.patch	21 Jun 2008 14:08:41 -0000	1.6
+++ dietlibc-0.31-pagesize.patch	21 Jun 2008 14:19:34 -0000	1.7
@@ -1,6 +1,5 @@
-diff -up dietlibc-0.31.20080409/lib/mmap64.c.pagesize dietlibc-0.31.20080409/lib/mmap64.c
---- dietlibc-0.31.20080409/lib/mmap64.c.pagesize	2004-12-13 11:21:31.000000000 +0100
-+++ dietlibc-0.31.20080409/lib/mmap64.c	2008-04-13 22:19:49.000000000 +0200
+--- dietlibc-0.31.20080409/lib/mmap64.c.pagesize
++++ dietlibc-0.31.20080409/lib/mmap64.c
 @@ -4,16 +4,18 @@
  #include <syscalls.h>
  #include <errno.h>
@@ -22,9 +21,8 @@
  }
  
  void*mmap64(void*addr,size_t len,int prot,int flags,int fd,off64_t offset)
-diff -up dietlibc-0.31.20080409/lib/readdir64.c.pagesize dietlibc-0.31.20080409/lib/readdir64.c
---- dietlibc-0.31.20080409/lib/readdir64.c.pagesize	2004-03-02 22:27:19.000000000 +0100
-+++ dietlibc-0.31.20080409/lib/readdir64.c	2008-04-13 22:19:49.000000000 +0200
+--- dietlibc-0.31.20080409/lib/readdir64.c.pagesize
++++ dietlibc-0.31.20080409/lib/readdir64.c
 @@ -14,7 +14,7 @@
  #ifndef WANT_LARGEFILE_BACKCOMPAT
  struct dirent64* readdir64(DIR *d) {
@@ -52,9 +50,8 @@
      if (res<=0) {
        if (errno==ENOSYS) {
  	trygetdents64=0;
-diff -up dietlibc-0.31.20080409/lib/opendir.c.pagesize dietlibc-0.31.20080409/lib/opendir.c
---- dietlibc-0.31.20080409/lib/opendir.c.pagesize	2002-07-03 22:33:38.000000000 +0200
-+++ dietlibc-0.31.20080409/lib/opendir.c	2008-04-13 22:19:49.000000000 +0200
+--- dietlibc-0.31.20080409/lib/opendir.c.pagesize
++++ dietlibc-0.31.20080409/lib/opendir.c
 @@ -5,6 +5,8 @@
  #include <stdlib.h>
  #include <fcntl.h>
@@ -73,9 +70,8 @@
  		MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
      if (t == MAP_FAILED)
  lose:
-diff -up dietlibc-0.31.20080409/lib/readdir.c.pagesize dietlibc-0.31.20080409/lib/readdir.c
---- dietlibc-0.31.20080409/lib/readdir.c.pagesize	2002-07-03 22:33:38.000000000 +0200
-+++ dietlibc-0.31.20080409/lib/readdir.c	2008-04-13 22:19:49.000000000 +0200
+--- dietlibc-0.31.20080409/lib/readdir.c.pagesize
++++ dietlibc-0.31.20080409/lib/readdir.c
 @@ -5,7 +5,7 @@
  
  struct dirent* readdir(DIR *d) {
@@ -85,9 +81,8 @@
      if (res<=0) return 0;
      d->num=res; d->cur=0;
    }
-diff -up dietlibc-0.31.20080409/lib/closedir.c.pagesize dietlibc-0.31.20080409/lib/closedir.c
---- dietlibc-0.31.20080409/lib/closedir.c.pagesize	2002-07-03 22:33:37.000000000 +0200
-+++ dietlibc-0.31.20080409/lib/closedir.c	2008-04-13 22:19:49.000000000 +0200
+--- dietlibc-0.31.20080409/lib/closedir.c.pagesize
++++ dietlibc-0.31.20080409/lib/closedir.c
 @@ -4,8 +4,10 @@
  #include <dirent.h>
  #include <stdlib.h>
@@ -100,9 +95,8 @@
 +  munmap (d, __DIET_PAGE_SIZE);
    return res;
  }
-diff -up dietlibc-0.31.20080409/lib/alloc.c.pagesize dietlibc-0.31.20080409/lib/alloc.c
---- dietlibc-0.31.20080409/lib/alloc.c.pagesize	2007-08-03 22:58:33.000000000 +0200
-+++ dietlibc-0.31.20080409/lib/alloc.c	2008-04-13 22:19:49.000000000 +0200
+--- dietlibc-0.31.20080409/lib/alloc.c.pagesize
++++ dietlibc-0.31.20080409/lib/alloc.c
 @@ -18,8 +18,7 @@
  #include <stdlib.h>
  #include <string.h>
@@ -133,25 +127,25 @@
  
  static size_t REGPARM(1) get_index(size_t _size) {
    register size_t idx=0;
-diff -up dietlibc-0.31.20080409/ppc/start.S.pagesize dietlibc-0.31.20080409/ppc/start.S
---- dietlibc-0.31.20080409/ppc/start.S.pagesize	2006-04-04 07:35:14.000000000 +0200
-+++ dietlibc-0.31.20080409/ppc/start.S	2008-04-13 22:19:49.000000000 +0200
-@@ -31,6 +31,12 @@ _start:
+--- dietlibc-0.31.20080409/ppc/start.S.pagesize
++++ dietlibc-0.31.20080409/ppc/start.S
+@@ -31,6 +31,14 @@ _start:
  	lis	14,environ at ha
  	stw	5,environ at l(14)
  
 +#ifdef WANT_ELFINFO
-+	/* TODO: can we really assume that environ and __elfinfo are on the
-+	   same 16 bit page? */
++1:	lwzu	15,4(5)
++	cmpwi	15,0
++	bne	1b
++	
 +	stw	5,__elfinfo at l(14)
 +#endif
 +
  #ifdef WANT_DYNAMIC
  	mr	6,7
  	bl	_dyn_start
-diff -up dietlibc-0.31.20080409/dietfeatures.h.pagesize dietlibc-0.31.20080409/dietfeatures.h
---- dietlibc-0.31.20080409/dietfeatures.h.pagesize	2007-10-09 01:15:27.000000000 +0200
-+++ dietlibc-0.31.20080409/dietfeatures.h	2008-04-13 22:19:49.000000000 +0200
+--- dietlibc-0.31.20080409/dietfeatures.h.pagesize
++++ dietlibc-0.31.20080409/dietfeatures.h
 @@ -126,6 +126,16 @@
  /* #define WANT_SSP_XOR */
  
@@ -178,9 +172,8 @@
 +#endif
 +
  #endif
-diff -up dietlibc-0.31.20080409/test/Makefile.pagesize dietlibc-0.31.20080409/test/Makefile
---- dietlibc-0.31.20080409/test/Makefile.pagesize	2008-02-23 01:02:19.000000000 +0100
-+++ dietlibc-0.31.20080409/test/Makefile	2008-04-13 22:19:49.000000000 +0200
+--- dietlibc-0.31.20080409/test/Makefile.pagesize
++++ dietlibc-0.31.20080409/test/Makefile
 @@ -14,7 +14,7 @@ glob grent hasmntopt hello iconv if_name
  memccpy memchr memcmp memrchr memusage mktime mmap_test pipe printf printftest \
  protoent prototypes putenv pwent rand48 read1 readdir regex select sendfile servent siglist \
@@ -190,9 +183,8 @@
  
  test: $(TESTPROGRAMS)
  
-diff -up /dev/null dietlibc-0.31.20080409/test/sysconf.c
---- /dev/null	2008-03-18 07:40:22.289057188 +0100
-+++ dietlibc-0.31.20080409/test/sysconf.c	2008-04-13 22:19:49.000000000 +0200
+--- /dev/null
++++ dietlibc-0.31.20080409/test/sysconf.c
 @@ -0,0 +1,80 @@
 +#include <unistd.h>
 +#include <stdio.h>
@@ -274,9 +266,8 @@
 +
 +  return err;
 +}
-diff -up dietlibc-0.31.20080409/test/runtests.sh.pagesize dietlibc-0.31.20080409/test/runtests.sh
---- dietlibc-0.31.20080409/test/runtests.sh.pagesize	2008-02-23 01:02:19.000000000 +0100
-+++ dietlibc-0.31.20080409/test/runtests.sh	2008-04-13 22:19:49.000000000 +0200
+--- dietlibc-0.31.20080409/test/runtests.sh.pagesize
++++ dietlibc-0.31.20080409/test/runtests.sh
 @@ -1,6 +1,6 @@
  SUBDIRS="dirent inet stdio string stdlib time"
  
@@ -285,14 +276,19 @@
  
  STDIN="read1"
  PASS="getpass" 
-diff -up dietlibc-0.31.20080409/sparc64/start.S.pagesize dietlibc-0.31.20080409/sparc64/start.S
---- dietlibc-0.31.20080409/sparc64/start.S.pagesize	2006-04-04 07:35:14.000000000 +0200
-+++ dietlibc-0.31.20080409/sparc64/start.S	2008-04-13 22:19:49.000000000 +0200
-@@ -25,6 +25,11 @@ _start:
+--- dietlibc-0.31.20080409/sparc64/start.S.pagesize
++++ dietlibc-0.31.20080409/sparc64/start.S
+@@ -25,6 +25,17 @@ _start:
  	or	%o3, %lo(environ), %o3
  	stx	%o2, [%o3]
  
 +#ifdef WANT_ELFINFO
++#  error "VERIFY ME!"
++1:	add	%o2, %o2, 8
++	ldx	[%o2-8], %o4
++	orcc	%o4, %o4, %o4
++	bne	1b
++
 +	add	%o3, %o3, 8
 +	stx	%o2, [%o3]
 +#endif
@@ -300,9 +296,8 @@
  /* When starting a binary via the dynamic linker, %g1 contains the
     address of the shared library termination function, which will be
     registered with atexit(). If we are statically linked, this will
-diff -up dietlibc-0.31.20080409/libcruft/sysconf.c.pagesize dietlibc-0.31.20080409/libcruft/sysconf.c
---- dietlibc-0.31.20080409/libcruft/sysconf.c.pagesize	2002-12-20 14:32:37.000000000 +0100
-+++ dietlibc-0.31.20080409/libcruft/sysconf.c	2008-04-13 22:19:49.000000000 +0200
+--- dietlibc-0.31.20080409/libcruft/sysconf.c.pagesize
++++ dietlibc-0.31.20080409/libcruft/sysconf.c
 @@ -3,6 +3,9 @@
  #include <limits.h>
  #include <sys/resource.h>
@@ -313,7 +308,7 @@
  extern int __sc_nr_cpus();
  
  long sysconf(int name)
-@@ -16,6 +18,14 @@ long sysconf(int name)
+@@ -16,6 +19,14 @@ long sysconf(int name)
        return limit.rlim_cur;
      }
    case _SC_CLK_TCK:
@@ -328,7 +323,7 @@
  #ifdef __alpha__
      return 1024;
  #else
-@@ -23,11 +33,7 @@ long sysconf(int name)
+@@ -23,11 +34,7 @@ long sysconf(int name)
  #endif
  
    case _SC_PAGESIZE:
@@ -341,39 +336,26 @@
  
    case _SC_ARG_MAX:
      return ARG_MAX;
-diff -up /dev/null dietlibc-0.31.20080409/libcruft/__get_elf_aux_value.c
---- /dev/null	2008-03-18 07:40:22.289057188 +0100
-+++ dietlibc-0.31.20080409/libcruft/__get_elf_aux_value.c	2008-04-13 22:19:49.000000000 +0200
-@@ -0,0 +1,25 @@
+--- /dev/null
++++ dietlibc-0.31.20080409/libcruft/__get_elf_aux_value.c
+@@ -0,0 +1,14 @@
 +#include <stdlib.h>
 +#include "../dietelfinfo.h"
 +
 +__diet_elf_addr_t *__get_elf_aux_value(unsigned int tag)
 +{
-+  extern char **	__elfinfo;
-+  __diet_elf_addr_t	*aux_ptr;
-+  char **		tmp;
-+
-+  /* External symbol points to 'environ' after startup. Now, go the end
-+   * of 'environ'; the auxiliary ELF table is located immediately after
-+   * this position */
-+
-+  /* operate on tmp instead of __elfinfo to be thread safe */
-+  tmp = __elfinfo;
-+  while (*tmp)
-+    ++tmp;
-+  __elfinfo = tmp;
++  extern __diet_elf_addr_t const * const	__elfinfo;
++  __diet_elf_addr_t				*aux_ptr;
 +
-+  for (aux_ptr = (__diet_elf_addr_t *)(tmp+1); aux_ptr[0]!=AT_NULL; aux_ptr += 2)
++  for (aux_ptr = __elfinfo; aux_ptr[0]!=AT_NULL; aux_ptr += 2)
 +    if (aux_ptr[0]==tag)
 +      return aux_ptr+1;
 +
 +  return NULL;
 +}
-diff -up dietlibc-0.31.20080409/libcruft/getpagesize.c.pagesize dietlibc-0.31.20080409/libcruft/getpagesize.c
---- dietlibc-0.31.20080409/libcruft/getpagesize.c.pagesize	2002-02-23 23:18:42.000000000 +0100
-+++ dietlibc-0.31.20080409/libcruft/getpagesize.c	2008-04-13 22:19:49.000000000 +0200
-@@ -2,14 +2,25 @@
+--- dietlibc-0.31.20080409/libcruft/getpagesize.c.pagesize
++++ dietlibc-0.31.20080409/libcruft/getpagesize.c
+@@ -2,14 +2,23 @@
  #include <sys/ipc.h>
  #include <sys/shm.h>
  
@@ -393,8 +375,6 @@
 +    __diet_elf_addr_t	*v = __get_elf_aux_value(AT_PAGESZ);
 +    if (__likely(v))
 +      pgsz = *v;
-+    else
-+      pgsz = __DIET_PAGE_SIZE_PREDEF;
 +  }
 +
 +  return pgsz;
@@ -405,9 +385,8 @@
  
  size_t getpagesize(void)       __attribute__((weak,alias("__libc_getpagesize")));
 -
-diff -up /dev/null dietlibc-0.31.20080409/dietpagesize.h
---- /dev/null	2008-03-18 07:40:22.289057188 +0100
-+++ dietlibc-0.31.20080409/dietpagesize.h	2008-04-13 22:19:49.000000000 +0200
+--- /dev/null
++++ dietlibc-0.31.20080409/dietpagesize.h
 @@ -0,0 +1,31 @@
 +#ifndef H_DIETLIBC_DIETPAGESIZE_H
 +#define H_DIETLIBC_DIETPAGESIZE_H
@@ -440,24 +419,28 @@
 +#endif
 +
 +#endif	/* H_DIETLIBC_DIETPAGESIZE_H */
-diff -up dietlibc-0.31.20080409/s390x/start.S.pagesize dietlibc-0.31.20080409/s390x/start.S
---- dietlibc-0.31.20080409/s390x/start.S.pagesize	2006-04-04 07:35:14.000000000 +0200
-+++ dietlibc-0.31.20080409/s390x/start.S	2008-04-13 22:19:49.000000000 +0200
-@@ -26,6 +26,11 @@ _start:
+--- dietlibc-0.31.20080409/s390x/start.S.pagesize
++++ dietlibc-0.31.20080409/s390x/start.S
+@@ -26,6 +26,17 @@ _start:
  	larl	%r13,environ
  	stg	%r4,0(%r13)
  
 +#ifdef WANT_ELFINFO
-+	ahi	%r13, 8			/* TODO: does it really point to __elfinfo? */
++#  error "VERIFY ME!"
++1:	aghi	%r4, 8		# increment envp
++	lg	%r12, -8(0,%r4)	# load envp[-1] into %r12
++	ogr	%r12, %r12	# test %r12 for NULL
++	brc	1, 1b
++
++	aghi	%r13, 8
 +	stg	%r4,0(%r13)
 +#endif	
 +
  /* call main or _dyn_start */
  #ifdef WANT_DYNAMIC
  	brasl	%r14,_dyn_start
-diff -up /dev/null dietlibc-0.31.20080409/dietelfinfo.h
---- /dev/null	2008-03-18 07:40:22.289057188 +0100
-+++ dietlibc-0.31.20080409/dietelfinfo.h	2008-04-13 22:21:09.000000000 +0200
+--- /dev/null
++++ dietlibc-0.31.20080409/dietelfinfo.h
 @@ -0,0 +1,20 @@
 +#include "dietfeatures.h"
 +
@@ -479,14 +462,18 @@
 +__diet_elf_addr_t *	__get_elf_aux_value(unsigned int tag)
 +	__attribute__((__visibility__("hidden"),__const__)) __pure;
 +#endif
-diff -up dietlibc-0.31.20080409/ia64/start.S.pagesize dietlibc-0.31.20080409/ia64/start.S
---- dietlibc-0.31.20080409/ia64/start.S.pagesize	2006-04-04 07:35:14.000000000 +0200
-+++ dietlibc-0.31.20080409/ia64/start.S	2008-04-13 22:19:49.000000000 +0200
-@@ -40,6 +40,11 @@ _start:
+--- dietlibc-0.31.20080409/ia64/start.S.pagesize
++++ dietlibc-0.31.20080409/ia64/start.S
+@@ -40,6 +40,16 @@ _start:
  	;;
  	st8  [r14] = out2           /* store envp in environ */
  
 +#ifdef WANT_ELFINFO
++#  error "MAKE ME IE64 CODE!"
++1:	ld8	r9 = [out2], 8	    /* load *envp and increment it */
++	orr	r9 = r9, r9	    /* test for NULL */ 
++	bne	1b
++
 +	adds r14 = 8, r14	    /* __elfinfo = environ + 8 */ 
 +	st8  [r14] = out2           /* store envp in __elfinfo */
 +#endif
@@ -494,23 +481,24 @@
  #ifdef WANT_DYNAMIC
  /* FIXME: dl_init parameter ??? */
  	br.call.sptk.few rp = _dyn_start
-diff -up dietlibc-0.31.20080409/i386/start.S.pagesize dietlibc-0.31.20080409/i386/start.S
---- dietlibc-0.31.20080409/i386/start.S.pagesize	2006-04-04 07:35:14.000000000 +0200
-+++ dietlibc-0.31.20080409/i386/start.S	2008-04-13 22:19:49.000000000 +0200
-@@ -25,6 +25,10 @@ _start:
+--- dietlibc-0.31.20080409/i386/start.S.pagesize
++++ dietlibc-0.31.20080409/i386/start.S
+@@ -25,6 +25,13 @@ _start:
  	PIC_INIT			/* non-PIC: this is an empty line */
  	PUT_VAR %eax, environ, %ecx	/* non-PIC: movl %eax,environ */
  
 +#ifdef WANT_ELFINFO
++1:	add	$4, %eax		/* increment envp */
++	cmpl	$0, -4(%eax)		/* load envp[-1] */
++	jne	1b			/* ... until envp[-1]==NULL */
 +        PUT_VAR %eax, __elfinfo, %ecx
 +#endif
 +
  #ifdef PROFILING
  	pushl	$_etext
  	pushl	$.text
-diff -up dietlibc-0.31.20080409/dietdirent.h.pagesize dietlibc-0.31.20080409/dietdirent.h
---- dietlibc-0.31.20080409/dietdirent.h.pagesize	2002-07-03 22:33:37.000000000 +0200
-+++ dietlibc-0.31.20080409/dietdirent.h	2008-04-13 22:19:49.000000000 +0200
+--- dietlibc-0.31.20080409/dietdirent.h.pagesize
++++ dietlibc-0.31.20080409/dietdirent.h
 @@ -1,8 +1,12 @@
  #include <sys/shm.h>
  
@@ -525,23 +513,26 @@
  };				/* stream data from opendir() */
 +
 +#define __DIRSTREAM_BUF_SIZE	(__DIET_PAGE_SIZE - offsetof(struct __dirstream, buf))
-diff -up dietlibc-0.31.20080409/alpha/start.S.pagesize dietlibc-0.31.20080409/alpha/start.S
---- dietlibc-0.31.20080409/alpha/start.S.pagesize	2006-04-04 07:35:14.000000000 +0200
-+++ dietlibc-0.31.20080409/alpha/start.S	2008-04-13 22:19:49.000000000 +0200
-@@ -24,6 +24,10 @@ _start:
+--- dietlibc-0.31.20080409/alpha/start.S.pagesize
++++ dietlibc-0.31.20080409/alpha/start.S
+@@ -24,6 +24,15 @@ _start:
  
  	stq	$18, environ
  
 +#ifdef WANT_ELFINFO
++#  error "MAKE ME alpha ASSEMBLER!"
++1:	ldq	$19, $18	; load *envp into $19
++	addq	$18,  1,  $18	; increment *envp
++	orr	$19, $19, $19
++	jne	1b
 +	stq	$18, __elfinfo
 +#endif
 +
  #ifdef WANT_DYNAMIC
  /* in v0 ($0) is the ld.so _fini pointer */
  	mov	 $0, $19	/* mov v0(dynload) to a3 */
-diff -up dietlibc-0.31.20080409/syscalls.s/environ.S.pagesize dietlibc-0.31.20080409/syscalls.s/environ.S
---- dietlibc-0.31.20080409/syscalls.s/environ.S.pagesize	2004-09-28 02:01:30.000000000 +0200
-+++ dietlibc-0.31.20080409/syscalls.s/environ.S	2008-04-13 22:19:49.000000000 +0200
+--- dietlibc-0.31.20080409/syscalls.s/environ.S.pagesize
++++ dietlibc-0.31.20080409/syscalls.s/environ.S
 @@ -1,6 +1,7 @@
  .section ".bss"
  .align 8
@@ -573,10 +564,9 @@
 +#endif
 +.size __elfinfo,.-__elfinfo
 +#endif
-diff -up dietlibc-0.31.20080409/arm/start.S.pagesize dietlibc-0.31.20080409/arm/start.S
---- dietlibc-0.31.20080409/arm/start.S.pagesize	2006-04-04 07:35:14.000000000 +0200
-+++ dietlibc-0.31.20080409/arm/start.S	2008-04-13 22:19:49.000000000 +0200
-@@ -23,11 +23,15 @@ _start:
+--- dietlibc-0.31.20080409/arm/start.S.pagesize
++++ dietlibc-0.31.20080409/arm/start.S
+@@ -23,11 +23,18 @@ _start:
  #ifdef __DYN_LIB
  	ldr	sl, .L4
  1:	add	sl, pc, sl
@@ -587,27 +577,34 @@
  #endif
  
 +#ifdef WANT_ELFINFO
++1:	ldr	r5, [a3], #4		@ load *envp and increment it
++	orr	r5, r5, r5		@ read value==0?
++	bne	1b
 +	str	a3, [ip, #4]		@ __elfinfo = envp
 +#endif
 +
  #ifdef PROFILING
  	stmdb	sp!, { r0 - r3 }
  	ldr	r0, .L5
-@@ -70,6 +74,3 @@ _exit:
+@@ -70,6 +77,3 @@ _exit:
  .L5:	.word	.text
  .L6:	.word	_etext
  #endif
 -
 -
 -
-diff -up dietlibc-0.31.20080409/parisc/start.S.pagesize dietlibc-0.31.20080409/parisc/start.S
---- dietlibc-0.31.20080409/parisc/start.S.pagesize	2006-04-04 07:35:14.000000000 +0200
-+++ dietlibc-0.31.20080409/parisc/start.S	2008-04-13 22:19:49.000000000 +0200
-@@ -34,6 +34,11 @@ _start:
+--- dietlibc-0.31.20080409/parisc/start.S.pagesize
++++ dietlibc-0.31.20080409/parisc/start.S
+@@ -34,6 +34,16 @@ _start:
  	ldil LP%environ, %r19
  	ldo RP%environ(%r19), %r19
  
 +#ifdef WANT_ELFINFO
++#  error "MAKE ME PARISC CODE!"
++1:	add %r20, %r19, %r19		; envp += 4
++	ldw -4(0,%r19), %r21		; load envp[-4] into %r21
++	comibf =,0, 0,%21,1b		; compare %21 with 0 without nullification
++ 
 +	ldil LP%__elfinfo, %r19
 +	ldo RP%__elfinfo(%r19), %r19
 +#endif	
@@ -615,9 +612,8 @@
  	/* Expand the stack to store the 5th through 7th args */
  	ldo 64(%sp), %sp
  
-diff -up dietlibc-0.31.20080409/include/sys/shm.h.pagesize dietlibc-0.31.20080409/include/sys/shm.h
---- dietlibc-0.31.20080409/include/sys/shm.h.pagesize	2005-09-21 09:33:08.000000000 +0200
-+++ dietlibc-0.31.20080409/include/sys/shm.h	2008-04-13 22:19:49.000000000 +0200
+--- dietlibc-0.31.20080409/include/sys/shm.h.pagesize
++++ dietlibc-0.31.20080409/include/sys/shm.h
 @@ -60,15 +60,6 @@ struct shm_info {
    unsigned long swap_successes;
  };
@@ -634,14 +630,19 @@
  extern int shmget(key_t key, int size, int shmflg) __THROW;
  extern void *shmat(int shmid, const void *shmaddr, int shmflg) __THROW;
  extern int shmdt (const void *shmaddr) __THROW;
-diff -up dietlibc-0.31.20080409/sparc/start.S.pagesize dietlibc-0.31.20080409/sparc/start.S
---- dietlibc-0.31.20080409/sparc/start.S.pagesize	2006-04-04 07:35:14.000000000 +0200
-+++ dietlibc-0.31.20080409/sparc/start.S	2008-04-13 22:19:49.000000000 +0200
-@@ -25,6 +25,11 @@ _start:
+--- dietlibc-0.31.20080409/sparc/start.S.pagesize
++++ dietlibc-0.31.20080409/sparc/start.S
+@@ -25,6 +25,17 @@ _start:
  	or	%o3, %lo(environ), %o3
  	st	%o2, [%o3]
  
 +#ifdef WANT_ELFINFO
++#  error "VERIFY ME!"
++1:	add	%o2, %o2, 4
++	ld	[%o2-4], %o4
++	orcc	%o4, %o4, %o4
++	bne	1b
++
 +	add	%o3, %o3, 4
 +	st	%o2, [%o3]
 +#endif
@@ -649,9 +650,8 @@
  /* When starting a binary via the dynamic linker, %g1 contains the
     address of the shared library termination function, which will be
     registered with atexit(). If we are statically linked, this will
-diff -up dietlibc-0.31.20080409/sparc/shmat.c.pagesize dietlibc-0.31.20080409/sparc/shmat.c
---- dietlibc-0.31.20080409/sparc/shmat.c.pagesize	2001-06-16 19:48:57.000000000 +0200
-+++ dietlibc-0.31.20080409/sparc/shmat.c	2008-04-13 22:19:49.000000000 +0200
+--- dietlibc-0.31.20080409/sparc/shmat.c.pagesize
++++ dietlibc-0.31.20080409/sparc/shmat.c
 @@ -3,17 +3,15 @@
  #include <sys/shm.h>
  #include <unistd.h>
@@ -673,26 +673,26 @@
      result=raddr;
    return result;
  }
-diff -up dietlibc-0.31.20080409/ppc64/start.S.pagesize dietlibc-0.31.20080409/ppc64/start.S
---- dietlibc-0.31.20080409/ppc64/start.S.pagesize	2006-04-04 07:35:14.000000000 +0200
-+++ dietlibc-0.31.20080409/ppc64/start.S	2008-04-13 22:19:49.000000000 +0200
-@@ -58,6 +58,12 @@ _start:
+--- dietlibc-0.31.20080409/ppc64/start.S.pagesize
++++ dietlibc-0.31.20080409/ppc64/start.S
+@@ -58,6 +58,14 @@ _start:
  	oris	14,14,environ at ha
  	std	5,environ at l(14)
  
 +#ifdef WANT_ELFINFO
-+	/* TODO: can we really assume that environ and __elfinfo are on the
-+	   same 16 bit page? */
++1:	ldu	15,8(5)
++	cmpdi	15,0
++	bne	1b
++
 +	std	5,__elfinfo at l(14)
 +#endif
 +
  #ifdef WANT_DYNAMIC
  /* #warning dynamic */
  	mr	6,7
-diff -up dietlibc-0.31.20080409/x86_64/start.S.pagesize dietlibc-0.31.20080409/x86_64/start.S
---- dietlibc-0.31.20080409/x86_64/start.S.pagesize	2006-04-04 07:35:14.000000000 +0200
-+++ dietlibc-0.31.20080409/x86_64/start.S	2008-04-13 22:19:49.000000000 +0200
-@@ -12,12 +12,23 @@ _start:
+--- dietlibc-0.31.20080409/x86_64/start.S.pagesize
++++ dietlibc-0.31.20080409/x86_64/start.S
+@@ -12,12 +12,28 @@ _start:
  	
  	leaq	8(%rsi,%rdi,8),%rdx	/* %rdx = envp = (8*rdi)+%rsi+8 */
  
@@ -703,7 +703,12 @@
 +#else
 +	leaq	environ(%rip), %rax
 +#endif
-+	movq	%rdx, (%rax)	/* environ */
++  	movq	%rdx, (%rax)	/* environ */
++
++1:	add	$8, %rdx	/* increment envp */
++	cmpq	$0, -8(%rdx)	/* load envp[-1] */
++	jne	1b		/* ... until envp[-1]==NULL */
++
 +	movq	%rdx, 8(%rax)	/* __elfinfo */
 +#else
  #ifdef __DYN_LIB
@@ -716,24 +721,28 @@
  
  #ifdef PROFILING
  	pushq	%rdi			/* save reg args */
-diff -up dietlibc-0.31.20080409/s390/start.S.pagesize dietlibc-0.31.20080409/s390/start.S
---- dietlibc-0.31.20080409/s390/start.S.pagesize	2006-04-04 07:35:14.000000000 +0200
-+++ dietlibc-0.31.20080409/s390/start.S	2008-04-13 22:19:49.000000000 +0200
-@@ -30,6 +30,11 @@ _start:
+--- dietlibc-0.31.20080409/s390/start.S.pagesize
++++ dietlibc-0.31.20080409/s390/start.S
+@@ -30,6 +30,17 @@ _start:
  	l	%r1,8(%r13)
  	st	%r4,0(%r1)
  
 +#ifdef WANT_ELFINFO
-+	ahi	%r1, 4		# TODO:	 does it really point to __elfinfo now?
++#  error "VERIFY ME!"
++1:	ahi	%r4, 4		# increment envp
++	l	%r12, -4(0,%r4)	# load envp[-1] into %r12
++	or	%r12, %r12	# test %r12 for NULL
++	brc	1, 1b
++  
++	ahi	%r1, 4
 +	st	%r4,0(%r1)
 +#endif
 +
  /* call main or _dyn_start */
  	l	%r1,0(%r13)
  	basr	%r14,%r1
-diff -up dietlibc-0.31.20080409/dynlinker/ldso_start.S.pagesize dietlibc-0.31.20080409/dynlinker/ldso_start.S
---- dietlibc-0.31.20080409/dynlinker/ldso_start.S.pagesize	2006-10-13 22:11:13.000000000 +0200
-+++ dietlibc-0.31.20080409/dynlinker/ldso_start.S	2008-04-13 22:19:49.000000000 +0200
+--- dietlibc-0.31.20080409/dynlinker/ldso_start.S.pagesize
++++ dietlibc-0.31.20080409/dynlinker/ldso_start.S
 @@ -86,6 +86,15 @@ __environ:
  	.long 0
  #endif
@@ -750,14 +759,19 @@
  .global fini_entry
  fini_entry:
  	.long 0
-diff -up dietlibc-0.31.20080409/mips/start.S.pagesize dietlibc-0.31.20080409/mips/start.S
---- dietlibc-0.31.20080409/mips/start.S.pagesize	2006-04-04 07:35:14.000000000 +0200
-+++ dietlibc-0.31.20080409/mips/start.S	2008-04-13 22:19:49.000000000 +0200
-@@ -47,6 +47,9 @@ __start:
+--- dietlibc-0.31.20080409/mips/start.S.pagesize
++++ dietlibc-0.31.20080409/mips/start.S
+@@ -47,6 +47,15 @@ __start:
  #endif
  	add	$a2, $a2, $a1
  	sw	$a2, environ
 +#ifdef WANT_ELFINFO
++#  error "MAKE ME MIPS CODE!"
++1:	addu	$a2, $a2, 4	/* increment envp */
++	lw	$4, -4($a2)     /* load envp[-1]; TODO: is $4 a proper 
++				   temporary register? */
++	bnz	1b		/* ... until envp[-1]==NULL 
++				   TODO: use proper 'bnz' operation */
 +	sw	$a2, __elfinfo
 +#endif
  	jalr	$25




More information about the fedora-extras-commits mailing list