(RTLD_START): Adjust _dl_argv by _dl_skip_args. (ELF_MACHINE_FIXED_STACK): Removed.
authorUlrich Drepper <drepper@redhat.com>
Fri, 29 Sep 2000 15:07:13 +0000 (15:07 +0000)
committerUlrich Drepper <drepper@redhat.com>
Fri, 29 Sep 2000 15:07:13 +0000 (15:07 +0000)
sysdeps/ia64/dl-machine.h

index aedf2a3..1c37b24 100644 (file)
@@ -310,14 +310,24 @@ _dl_start_user:
 
             The stack pointer has to be 16 byte aligned. We cannot simply
             addjust the stack pointer. We have to move the whole argv and
 
             The stack pointer has to be 16 byte aligned. We cannot simply
             addjust the stack pointer. We have to move the whole argv and
-            envp. H.J.  */
+            envp and adjust _dl_argv by _dl_skip_args.  H.J.  */
        }
        }
-       { .mmi
+       { .mib
          ld8 out1 = [r10]      /* is argc actually stored as a long
                                   or as an int? */
          ld8 out1 = [r10]      /* is argc actually stored as a long
                                   or as an int? */
+         addl r2 = @ltoff(_dl_argv), gp
          ;;
          ;;
+       }
+       { .mmi
+         ld8 r2 = [r2]         /* Get the address of _dl_argv. */
          sub out1 = out1, r3   /* Get the new argc. */
          sub out1 = out1, r3   /* Get the new argc. */
-         shladd r15 = r3, 3, r11 /* The address of the argv we move */
+         shladd r3 = r3, 3, r0
+         ;;
+       }
+       {
+         .mib
+         ld8 r17 = [r2]        /* Get _dl_argv. */
+         add r15 = r11, r3     /* The address of the argv we move */
          ;;
        }
        /* ??? Could probably merge these two loops into 3 bundles.
          ;;
        }
        /* ??? Could probably merge these two loops into 3 bundles.
@@ -333,8 +343,9 @@ _dl_start_user:
 (p6)     br.cond.dptk.few 1b
          ;;
        }
 (p6)     br.cond.dptk.few 1b
          ;;
        }
-       { .mib
+       { .mmi
          mov out3 = r11
          mov out3 = r11
+         sub r17 = r17, r3     /* Substract _dl_skip_args. */
          addl out0 = @ltoff(_dl_loaded), gp
        }
 1:     /* Copy env. */
          addl out0 = @ltoff(_dl_loaded), gp
        }
 1:     /* Copy env. */
@@ -353,8 +364,9 @@ _dl_start_user:
          ld8 out0 = [out0]
          ;;
        }
          ld8 out0 = [out0]
          ;;
        }
-       { .mfb
+       { .mmb
          ld8 out0 = [out0]             /* get the linkmap */
          ld8 out0 = [out0]             /* get the linkmap */
+         st8 [r2] = r17                /* Load the new _dl_argv. */
          br.call.sptk.many b0 = _dl_init#
          ;;
        }
          br.call.sptk.many b0 = _dl_init#
          ;;
        }
@@ -402,10 +414,6 @@ _dl_start_user:
 /* According to the IA-64 specific documentation, Rela is always used.  */
 #define ELF_MACHINE_NO_REL 1
 
 /* According to the IA-64 specific documentation, Rela is always used.  */
 #define ELF_MACHINE_NO_REL 1
 
-/* Since ia64's stack has to be 16byte aligned, we cannot arbitrarily
-   move the stack pointer. */
-#define ELF_MACHINE_FIXED_STACK 1
-
 /* Return the address of the entry point. */
 extern ElfW(Addr) _dl_start_address (const struct link_map *map,
                                     ElfW(Addr) start);
 /* Return the address of the entry point. */
 extern ElfW(Addr) _dl_start_address (const struct link_map *map,
                                     ElfW(Addr) start);