]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
PowerPC64 ELFv2 ABI 4/6: Stack frame layout changes
authorUlrich Weigand <Ulrich.Weigand@de.ibm.com>
Wed, 4 Dec 2013 12:55:03 +0000 (06:55 -0600)
committerAdhemerval Zanella <azanella@linux.vnet.ibm.com>
Wed, 4 Dec 2013 13:41:39 +0000 (07:41 -0600)
This updates glibc for the changes in the ELFv2 relating to the
stack frame layout.  These are described in more detail here:
http://gcc.gnu.org/ml/gcc-patches/2013-11/msg01149.html
http://gcc.gnu.org/ml/gcc-patches/2013-11/msg01146.html

Specifically, the "compiler and linker doublewords" were removed,
which has the effect that the save slot for the TOC register is
now at offset 24 rather than 40 to the stack pointer.

In addition, a function may now no longer necessarily assume that
its caller has set up a 64-byte register save area its use.

To address the first change, the patch goes through all assembler
files and replaces immediate offsets in instructions accessing the
ABI-defined stack slots by symbolic offsets.  Those already were
defined in ucontext_i.sym and used in some of the context routines,
but that doesn't really seem like the right place for those defines.

The patch instead defines those symbolic offsets in sysdeps.h,
in two variants for the old and new ABI, and uses them systematically
in all assembler files, not just the context routines.

The second change only affected a few assembler files that used
the save area to temporarily store some registers.  In those
cases where this happens within a leaf function, this patch
changes the code to store those registers to the "red zone"
below the stack pointer.  Otherwise, the functions already allocate
a stack frame, and the patch changes them to add extra space in
these frames as temporary space for the ELFv2 ABI.

15 files changed:
ChangeLog
nptl/ChangeLog
nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h
sysdeps/powerpc/powerpc64/__longjmp-common.S
sysdeps/powerpc/powerpc64/crti.S
sysdeps/powerpc/powerpc64/crtn.S
sysdeps/powerpc/powerpc64/dl-trampoline.S
sysdeps/powerpc/powerpc64/ppc-mcount.S
sysdeps/powerpc/powerpc64/setjmp-common.S
sysdeps/powerpc/powerpc64/sysdep.h
sysdeps/unix/sysv/linux/powerpc/powerpc64/____longjmp_chk.S
sysdeps/unix/sysv/linux/powerpc/powerpc64/brk.S
sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S
sysdeps/unix/sysv/linux/powerpc/powerpc64/socket.S
sysdeps/unix/sysv/linux/powerpc/powerpc64/ucontext_i.sym

index 668fe03d2bbd928e6886715812f244a0961e233c..0be780a3c6d836f58abfcf9e19e791656f600a18 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,53 @@
+2013-12-04  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
+
+       * sysdeps/powerpc/powerpc64/sysdep.h (FRAME_MIN_SIZE): Define.
+       (FRAME_MIN_SIZE_PARM): Likewise.
+       (FRAME_BACKCHAIN): Likewise.
+       (FRAME_CR_SAVE): Likewise.
+       (FRAME_LR_SAVE): Likewise.
+       (FRAME_TOC_SAVE): Likewise.
+       (FRAME_PARM_SAVE): Likewise.
+       (FRAME_PARM1_SAVE, FRAME_PARM2_SAVE, FRAME_PARM3_SAVE,
+       FRAME_PARM4_SAVE, FRAME_PARM5_SAVE, FRAME_PARM6_SAVE,
+       FRAME_PARM7_SAVE, FRAME_PARM8_SAVE, FRAME_PARM9_SAVE): Likewise.
+       (call_mcount_parm_offset): New macro.
+       (SAVE_ARG, REST_ARG, CFI_SAVE_ARG): Use it.
+       (PROF): Use symbolic stack frame offsets.
+       (TAIL_CALL_SYSCALL_ERROR): Likewise.
+       * sysdeps/powerpc/powerpc64/dl-trampoline.S (FRAME_SIZE, INT_PARMS):
+       Redefine in terms of FRAME_MIN_SIZE.
+       (_dl_runtime_resolve): Use symbolic stack frame offsets.
+       (_dl_profile_resolve): Likewise.  Update comment.
+       * sysdeps/powerpc/powerpc64/setjmp-common.S (__GI__setjmp): Use
+       symbols stack frame offsets.
+       (__sigsetjmp): Likewise.
+       * sysdeps/powerpc/powerpc64/__longjmp-common.S (__longjmp): Likewise.
+       * sysdeps/powerpc/powerpc64/ppc-mcount.S (_mcount): Likewise.
+       * sysdeps/powerpc/powerpc64/crti.S (_init, _fini): Likewise.
+       * sysdeps/powerpc/powerpc64/crtn.S (_init, _fini): Likewise.
+
+       * sysdeps/unix/sysv/linux/powerpc/powerpc64/ucontext_i.sym
+       (FRAME_BACKCHAIN): Remove.
+       (FRAME_CR_SAVE): Likewise.
+       (FRAME_LR_SAVE): Likewise.
+       (FRAME_COMPILER_DW): Likewise.
+       (FRAME_LINKER_DW): Likewise.
+       (FRAME_TOC_SAVE): Likewise.
+       (FRAME_PARM_SAVE): Likewise.
+       (FRAME_PARM1_SAVE, FRAME_PARM2_SAVE, FRAME_PARM3_SAVE,
+       FRAME_PARM4_SAVE, FRAME_PARM5_SAVE, FRAME_PARM6_SAVE,
+       FRAME_PARM7_SAVE, FRAME_PARM8_SAVE, FRAME_PARM9_SAVE): Likewise.
+       * sysdeps/unix/sysv/linux/powerpc/powerpc64/____longjmp_chk.S
+       (CHECK_SP): Use symbolic stack frame offsets.
+       * sysdeps/unix/sysv/linux/powerpc/powerpc64/brk.S (__brk): Use "red
+       zone" instead of caller's parameter save area for temp storage.
+       * sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S (__clone):
+       Likewise.  Also, use symbolic stack frame offsets.
+       * sysdeps/unix/sysv/linux/powerpc/powerpc64/socket.S (FRAMESIZE,
+       stackblock): Redefine for _CALL_ELF == 2 to save parameters into
+       our own stack frame instead of the caller's.
+       (__socket): Use symbolic stack frame offsets.
+
 2013-12-04  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
            Alan Modra  <amodra@gmail.com>
 
index 9f4063016f0bd5f21b6e5d8fe7fb5196e1226381..64dc17f2547f729550e47eb3e9b6f27f10ea7729 100644 (file)
@@ -1,3 +1,16 @@
+2013-12-04  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
+
+       * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h
+       (CANCEL_FRAMESIZE, CANCEL_PARM_SAVE): New macros to save parameters
+       into our own stack frame instead of the caller's.
+       (PSEUDO): Use them.  Use symbolic stack frame offsets.
+       (DOCARGS_1, UNDOCARGS_1): Use CANCEL_PARM_SAVE.
+       (DOCARGS_2, UNDOCARGS_2): Likewise.
+       (DOCARGS_3, UNDOCARGS_3): Likewise.
+       (DOCARGS_4, UNDOCARGS_4): Likewise.
+       (DOCARGS_5, UNDOCARGS_5): Likewise.
+       (DOCARGS_6, UNDOCARGS_6): Likewise.
+
 2013-11-26  Ondřej Bílka  <neleai@seznam.cz>
        * sysdeps/i386/tls.h: Use __glibc_reserved instead __unused.
        * sysdeps/x86_64/tls.h: Likewise.
index 51e021df59efe76ded5a677518fdda4c2a58ba81..d711dc6cf1c708521bb79fdbc0c50190933a4bce 100644 (file)
 #  define DASHDASHPFX(str) __##str
 # endif
 
+#if _CALL_ELF == 2
+#define CANCEL_FRAMESIZE (FRAME_MIN_SIZE+16+48)
+#define CANCEL_PARM_SAVE (FRAME_MIN_SIZE+16)
+#else
+#define CANCEL_FRAMESIZE (FRAME_MIN_SIZE+16)
+#define CANCEL_PARM_SAVE (CANCEL_FRAMESIZE+FRAME_PARM_SAVE)
+#endif
+
 # undef PSEUDO
 # define PSEUDO(name, syscall_name, args)                              \
   .section ".text";                                                    \
     PSEUDO_RET;                                                                \
   .size DASHDASHPFX(syscall_name##_nocancel),.-DASHDASHPFX(syscall_name##_nocancel);   \
   .Lpseudo_cancel:                                                     \
-    stdu 1,-128(1);                                                    \
-    cfi_adjust_cfa_offset (128);                                       \
+    stdu 1,-CANCEL_FRAMESIZE(1);                                       \
+    cfi_adjust_cfa_offset (CANCEL_FRAMESIZE);                          \
     mflr 9;                                                            \
-    std  9,128+16(1);                                                  \
-    cfi_offset (lr, 16);                                               \
+    std  9,CANCEL_FRAMESIZE+FRAME_LR_SAVE(1);                          \
+    cfi_offset (lr, FRAME_LR_SAVE);                                    \
     DOCARGS_##args;    /* save syscall args around CENABLE.  */        \
     CENABLE;                                                           \
-    std  3,112(1);     /* store CENABLE return value (MASK).  */       \
+    std  3,FRAME_MIN_SIZE(1); /* store CENABLE return value (MASK).  */        \
     UNDOCARGS_##args;  /* restore syscall args.  */                    \
     DO_CALL (SYS_ify (syscall_name));                                  \
     mfcr 0;            /* save CR/R3 around CDISABLE.  */              \
-    std  3,120(1);                                                     \
-    std  0,128+8(1);                                                   \
-    cfi_offset (cr, 8);                                                        \
-    ld   3,112(1);     /* pass MASK to CDISABLE.  */                   \
+    std  3,FRAME_MIN_SIZE+8(1);                                                \
+    std  0,CANCEL_FRAMESIZE+FRAME_CR_SAVE(1);                          \
+    cfi_offset (cr, FRAME_CR_SAVE);                                    \
+    ld   3,FRAME_MIN_SIZE(1); /* pass MASK to CDISABLE.  */            \
     CDISABLE;                                                          \
-    ld   9,128+16(1);                                                  \
-    ld   0,128+8(1);   /* restore CR/R3. */                            \
-    ld   3,120(1);                                                     \
+    ld   9,CANCEL_FRAMESIZE+FRAME_LR_SAVE(1);                          \
+    ld   0,CANCEL_FRAMESIZE+FRAME_CR_SAVE(1); /* restore CR/R3. */     \
+    ld   3,FRAME_MIN_SIZE+8(1);                                                \
     mtlr 9;                                                            \
     mtcr 0;                                                            \
-    addi 1,1,128;                                                      \
-    cfi_adjust_cfa_offset (-128);                                      \
+    addi 1,1,CANCEL_FRAMESIZE;                                         \
+    cfi_adjust_cfa_offset (-CANCEL_FRAMESIZE);                         \
     cfi_restore (lr);                                                  \
     cfi_restore (cr)
 
 # define DOCARGS_0
 # define UNDOCARGS_0
 
-# define DOCARGS_1     std 3,128+48(1); DOCARGS_0
-# define UNDOCARGS_1   ld 3,128+48(1); UNDOCARGS_0
+# define DOCARGS_1     std 3,CANCEL_PARM_SAVE(1); DOCARGS_0
+# define UNDOCARGS_1   ld 3,CANCEL_PARM_SAVE(1); UNDOCARGS_0
 
-# define DOCARGS_2     std 4,128+56(1); DOCARGS_1
-# define UNDOCARGS_2   ld 4,128+56(1); UNDOCARGS_1
+# define DOCARGS_2     std 4,CANCEL_PARM_SAVE+8(1); DOCARGS_1
+# define UNDOCARGS_2   ld 4,CANCEL_PARM_SAVE+8(1); UNDOCARGS_1
 
-# define DOCARGS_3     std 5,128+64(1); DOCARGS_2
-# define UNDOCARGS_3   ld 5,128+64(1); UNDOCARGS_2
+# define DOCARGS_3     std 5,CANCEL_PARM_SAVE+16(1); DOCARGS_2
+# define UNDOCARGS_3   ld 5,CANCEL_PARM_SAVE+16(1); UNDOCARGS_2
 
-# define DOCARGS_4     std 6,128+72(1); DOCARGS_3
-# define UNDOCARGS_4   ld 6,128+72(1); UNDOCARGS_3
+# define DOCARGS_4     std 6,CANCEL_PARM_SAVE+24(1); DOCARGS_3
+# define UNDOCARGS_4   ld 6,CANCEL_PARM_SAVE+24(1); UNDOCARGS_3
 
-# define DOCARGS_5     std 7,128+80(1); DOCARGS_4
-# define UNDOCARGS_5   ld 7,128+80(1); UNDOCARGS_4
+# define DOCARGS_5     std 7,CANCEL_PARM_SAVE+32(1); DOCARGS_4
+# define UNDOCARGS_5   ld 7,CANCEL_PARM_SAVE+32(1); UNDOCARGS_4
 
-# define DOCARGS_6     std 8,128+88(1); DOCARGS_5
-# define UNDOCARGS_6   ld 8,128+88(1); UNDOCARGS_5
+# define DOCARGS_6     std 8,CANCEL_PARM_SAVE+40(1); DOCARGS_5
+# define UNDOCARGS_6   ld 8,CANCEL_PARM_SAVE+40(1); UNDOCARGS_5
 
 # ifdef IS_IN_libpthread
 #  ifdef SHARED
index 4f1e3c88d3268717c66dfc7720c0102cc38f9f00..ce5a018e3725807a0c99e3b49bf2f7f920d7e212 100644 (file)
@@ -130,7 +130,7 @@ L(no_vmx):
        ld r14,((JB_GPRS+0)*8)(r3)
        lfd fp14,((JB_FPRS+0)*8)(r3)
 #if defined SHARED && !defined IS_IN_rtld
-       std r2,40(r1)   /* Restore the callers TOC save area.  */
+       std r2,FRAME_TOC_SAVE(r1)       /* Restore the callers TOC save area.  */
 #endif
        ld r15,((JB_GPRS+1)*8)(r3)
        lfd fp15,((JB_FPRS+1)*8)(r3)
@@ -148,7 +148,7 @@ L(no_vmx):
        PTR_DEMANGLE2 (r0, r25)
 #endif
        mtlr r0
-/*     std r2,40(r1)   Restore the TOC save area.  */
+/*     std r2,FRAME_TOC_SAVE(r1)       Restore the TOC save area.  */
        ld r21,((JB_GPRS+7)*8)(r3)
        lfd fp21,((JB_FPRS+7)*8)(r3)
        ld r22,((JB_GPRS+8)*8)(r3)
index 7eff7fd97cc61beb2c19a1ad51e233ee4558999c..6e1ece8d666ce5895bad0a3a1aa3bb60f9659849 100644 (file)
@@ -66,8 +66,8 @@
 BODY_LABEL (_init):
        LOCALENTRY(_init)
        mflr 0
-       std 0, 16(r1)
-       stdu r1, -112(r1)
+       std 0, FRAME_LR_SAVE(r1)
+       stdu r1, -FRAME_MIN_SIZE_PARM(r1)
 #if PREINIT_FUNCTION_WEAK
        addis r9, r2, .LC0@toc@ha
        ld r0, .LC0@toc@l(r9)
@@ -84,5 +84,5 @@ BODY_LABEL (_init):
 BODY_LABEL (_fini):
        LOCALENTRY(_fini)
        mflr 0
-       std 0, 16(r1)
-       stdu r1, -112(r1)
+       std 0, FRAME_LR_SAVE(r1)
+       stdu r1, -FRAME_MIN_SIZE_PARM(r1)
index 364e53aae78f60647d928efecc764f157cd1d55a..cdd3b0f3407f7ebe09d13899c2b57d95ee3e9ed2 100644 (file)
 #include <sysdep.h>
 
        .section .init,"ax",@progbits
-       addi r1, r1, 112
-       ld r0, 16(r1)
+       addi r1, r1, FRAME_MIN_SIZE_PARM
+       ld r0, FRAME_LR_SAVE(r1)
        mtlr r0
        blr
 
        .section .fini,"ax",@progbits
-       addi r1, r1, 112
-       ld r0, 16(r1)
+       addi r1, r1, FRAME_MIN_SIZE_PARM
+       ld r0, FRAME_LR_SAVE(r1)
        mtlr r0
        blr
index e31311cf1836826e0e2cde0fdc8ebfd998ec025e..18c8a3aa016c60997580d7380eafdb7cb3905e51 100644 (file)
    parm1 (r3) and the index (r0) need to be converted to an offset
    (index * 24) in parm2 (r4).  */
 
-#define FRAME_SIZE 176
+#define FRAME_SIZE (FRAME_MIN_SIZE+64)
 /* We need to save the registers used to pass parameters, ie. r3 thru
    r10;  Use local var space rather than the parameter save area,
    because gcc as of 2010/05 doesn't allocate a proper stack frame for
    a function that makes no calls except for __tls_get_addr and we
    might be here resolving the __tls_get_addr call.  */
-#define INT_PARMS 112
+#define INT_PARMS FRAME_MIN_SIZE
 EALIGN(_dl_runtime_resolve, 4, 0)
        stdu    r1,-FRAME_SIZE(r1)
        cfi_adjust_cfa_offset (FRAME_SIZE)
@@ -48,25 +48,25 @@ EALIGN(_dl_runtime_resolve, 4, 0)
        mflr    r0
        std     r8,INT_PARMS+40(r1)
 /* Store the LR in the LR Save area.  */
-       std     r0,FRAME_SIZE+16(r1)
-       cfi_offset (lr, 16)
+       std     r0,FRAME_SIZE+FRAME_LR_SAVE(r1)
+       cfi_offset (lr, FRAME_LR_SAVE)
        mfcr    r0
        std     r9,INT_PARMS+48(r1)
        std     r10,INT_PARMS+56(r1)
 /* I'm almost certain we don't have to save cr...  be safe.  */
-       std     r0,FRAME_SIZE+8(r1)
+       std     r0,FRAME_SIZE+FRAME_CR_SAVE(r1)
        bl      JUMPTARGET(_dl_fixup)
 #ifndef SHARED
        nop
 #endif
 /* Put the registers back.  */
-       ld      r0,FRAME_SIZE+16(r1)
+       ld      r0,FRAME_SIZE+FRAME_LR_SAVE(r1)
        ld      r10,INT_PARMS+56(r1)
        ld      r9,INT_PARMS+48(r1)
        ld      r8,INT_PARMS+40(r1)
        ld      r7,INT_PARMS+32(r1)
        mtlr    r0
-       ld      r0,FRAME_SIZE+8(r1)
+       ld      r0,FRAME_SIZE+FRAME_CR_SAVE(r1)
        ld      r6,INT_PARMS+24(r1)
        ld      r5,INT_PARMS+16(r1)
        ld      r4,INT_PARMS+8(r1)
@@ -76,7 +76,7 @@ EALIGN(_dl_runtime_resolve, 4, 0)
        ld      r3,INT_PARMS+0(r1)
 #if _CALL_ELF == 2
 /* Restore the caller's TOC in case we jump to a local entry point.  */
-       ld      r2,FRAME_SIZE+40(r1)
+       ld      r2,FRAME_SIZE+FRAME_TOC_SAVE(r1)
 #endif
 /* Unwind the stack frame, and jump.  */
        addi    r1,r1,FRAME_SIZE
@@ -86,6 +86,7 @@ END(_dl_runtime_resolve)
 #undef INT_PARMS
 
        /* Stack layout:
+          (Note: some of these are not required for the ELFv2 ABI.)
          +592   previous backchain
          +584   spill_r31
          +576   spill_r30
@@ -147,10 +148,11 @@ END(_dl_runtime_resolve)
          +64    parm3
          +56    parm2
          +48    parm1
-        * Parameter save area, Allocated by the call, at least 8 double words
-         +40    TOC save area
-         +32    Reserved for linker
-         +24    Reserved for compiler
+        * Parameter save area
+        * (v1 ABI: Allocated by the call, at least 8 double words)
+         +40    v1 ABI: TOC save area
+         +32    v1 ABI: Reserved for linker
+         +24    v1 ABI: Reserved for compiler / v2 ABI: TOC save area
          +16    LR save area
          +8     CR save area
        r1+0     stack back chain
@@ -206,15 +208,15 @@ EALIGN(_dl_profile_resolve, 4, 0)
 /* Store the LR in the LR Save area of the previous frame.  */
 /* XXX Do we have to do this?  */
        la      r8,FRAME_SIZE(r1)
-       std     r5,FRAME_SIZE+16(r1)
-       cfi_offset (lr, 16)
+       std     r5,FRAME_SIZE+FRAME_LR_SAVE(r1)
+       cfi_offset (lr, FRAME_LR_SAVE)
        std     r5,CALLING_LR(r1)
        mfcr    r0
        std     r9,INT_PARMS+48(r1)
        std     r10,INT_PARMS+56(r1)
        std     r8,CALLING_SP(r1)
 /* I'm almost certain we don't have to save cr...  be safe.  */
-       std     r0,FRAME_SIZE+8(r1)
+       std     r0,FRAME_SIZE+FRAME_CR_SAVE(r1)
        ld      r12,.LC__dl_hwcap@toc(r2)
 #ifdef SHARED
        /* Load _rtld_local_ro._dl_hwcap.  */
@@ -311,13 +313,13 @@ L(saveFP):
        lvx     v12,r11,r10
        lvx     v13,r11,r9
 L(restoreFXR):
-       ld      r0,FRAME_SIZE+16(r1)
+       ld      r0,FRAME_SIZE+FRAME_LR_SAVE(r1)
        ld      r10,INT_PARMS+56(r1)
        ld      r9,INT_PARMS+48(r1)
        ld      r8,INT_PARMS+40(r1)
        ld      r7,INT_PARMS+32(r1)
        mtlr    r0
-       ld      r0,FRAME_SIZE+8(r1)
+       ld      r0,FRAME_SIZE+FRAME_CR_SAVE(r1)
        ld      r6,INT_PARMS+24(r1)
        ld      r5,INT_PARMS+16(r1)
        ld      r4,INT_PARMS+8(r1)
@@ -327,7 +329,7 @@ L(restoreFXR):
        ld      r3,INT_PARMS+0(r1)
 #if _CALL_ELF == 2
 /* Restore the caller's TOC in case we jump to a local entry point.  */
-       ld      r2,FRAME_SIZE+40(r1)
+       ld      r2,FRAME_SIZE+FRAME_TOC_SAVE(r1)
 #endif
 /* Load the floating point registers.  */
        lfd     fp1,FPR_PARMS+0(r1)
@@ -375,19 +377,19 @@ L(do_pltexit):
        lvx     v12,r11,r10
        lvx     v13,r11,r9
 L(restoreFXR2):
-       ld      r0,FRAME_SIZE+16(r1)
+       ld      r0,FRAME_SIZE+FRAME_LR_SAVE(r1)
        ld      r10,INT_PARMS+56(r1)
        ld      r9,INT_PARMS+48(r1)
        ld      r8,INT_PARMS+40(r1)
        ld      r7,INT_PARMS+32(r1)
        mtlr    r0
-       ld      r0,FRAME_SIZE+8(r1)
+       ld      r0,FRAME_SIZE+FRAME_CR_SAVE(r1)
        ld      r6,INT_PARMS+24(r1)
        ld      r5,INT_PARMS+16(r1)
        ld      r4,INT_PARMS+8(r1)
        mtcrf   0xFF,r0
 /* Prepare for calling the function returned by fixup.  */
-       std     r2,40(r1)
+       std     r2,FRAME_TOC_SAVE(r1)
        PPC64_LOAD_FUNCPTR r3
        ld      r3,INT_PARMS+0(r1)
 /* Load the floating point registers.  */
@@ -406,7 +408,7 @@ L(restoreFXR2):
        lfd     fp13,FPR_PARMS+96(r1)
 /* Call the target function.  */
        bctrl
-       ld      r2,40(r1)
+       ld      r2,FRAME_TOC_SAVE(r1)
        lwz     r12,VR_VRSAVE(r1)
 /* But return here and store the return values.  */
        std     r3,INT_RTN(r1)
@@ -441,7 +443,7 @@ L(callpltexit):
        beq     L(pltexitreturn)
        lvx     v2,0,r10
 L(pltexitreturn):
-       ld      r0,FRAME_SIZE+16(r1)
+       ld      r0,FRAME_SIZE+FRAME_LR_SAVE(r1)
        ld      r31,584(r1)
        ld      r30,576(r1)
        mtlr    r0
index 3d21a70669cfae99aa70f6903eaf78e2a9a7b010..9824a55f5f704d8ac25785b89be0b4dd7b6f4665 100644 (file)
 ENTRY(_mcount)
        mflr             r4
        ld               r11, 0(r1)
-       stdu             r1,-112(r1)
-       cfi_adjust_cfa_offset (112)
-       std              r4, 128(r1)
-       cfi_offset (lr, 16)
-       ld               r3, 16(r11)
+       stdu             r1,-FRAME_MIN_SIZE(r1)
+       cfi_adjust_cfa_offset (FRAME_MIN_SIZE)
+       std              r4, FRAME_MIN_SIZE+FRAME_LR_SAVE(r1)
+       cfi_offset (lr, FRAME_LR_SAVE)
+       ld               r3, FRAME_LR_SAVE(r11)
        bl               JUMPTARGET(__mcount_internal)
        nop
-       ld               r0, 128(r1)
+       ld               r0, FRAME_MIN_SIZE+FRAME_LR_SAVE(r1)
        mtlr             r0
-       addi             r1,r1,112
+       addi             r1,r1,FRAME_MIN_SIZE
        blr
 END(_mcount)
 
index db4b3497c79afedad9f66d3cdef6198ca461fa30..9e4fb0277908ac84be5a990050feb4775dd3cee4 100644 (file)
@@ -54,7 +54,7 @@ END (setjmp)
    bugz #269.  __GI__setjmp is used in csu/libc-start.c when
    HAVE_CLEANUP_JMP_BUF is defined.  */
 ENTRY (__GI__setjmp)
-       std r2,40(r1)           /* Save the callers TOC in the save area.  */
+       std r2,FRAME_TOC_SAVE(r1)               /* Save the callers TOC in the save area.  */
        CALL_MCOUNT 1
        li r4,0                 /* Set second argument to 0.  */
        b JUMPTARGET (GLUE(__sigsetjmp,_ent))
@@ -80,7 +80,7 @@ JUMPTARGET(GLUE(__sigsetjmp,_ent)):
 #endif
        mflr r0
 #if defined SHARED && !defined IS_IN_rtld
-       ld   r5,40(r1)  /* Retrieve the callers TOC.  */
+       ld   r5,FRAME_TOC_SAVE(r1)      /* Retrieve the callers TOC.  */
        std  r5,(JB_GPR2*8)(3)
 #else
        std  r2,(JB_GPR2*8)(3)
@@ -216,14 +216,14 @@ L(no_vmx):
        b       JUMPTARGET (__sigjmp_save)
 #else
        mflr    r0
-       std     r0,16(r1)
-       stdu    r1,-112(r1)
-       cfi_adjust_cfa_offset(112)
-       cfi_offset(lr,16)
+       std     r0,FRAME_LR_SAVE(r1)
+       stdu    r1,-FRAME_MIN_SIZE(r1)
+       cfi_adjust_cfa_offset(FRAME_MIN_SIZE)
+       cfi_offset(lr,FRAME_LR_SAVE)
        bl      JUMPTARGET (__sigjmp_save)
        nop
-       ld      r0,112+16(r1)
-       addi    r1,r1,112
+       ld      r0,FRAME_MIN_SIZE+FRAME_LR_SAVE(r1)
+       addi    r1,r1,FRAME_MIN_SIZE
        mtlr    r0
        blr
 #endif
index 779fd9026589b6d8c09695002bc156ed33352b0d..112e4187c51f0bbfe492bedefec44b9291a97461 100644 (file)
 
 #ifdef __ASSEMBLER__
 
+/* Stack frame offsets.  */
+#if _CALL_ELF != 2
+#define FRAME_MIN_SIZE         112
+#define FRAME_MIN_SIZE_PARM    112
+#define FRAME_BACKCHAIN                0
+#define FRAME_CR_SAVE          8
+#define FRAME_LR_SAVE          16
+#define FRAME_TOC_SAVE         40
+#define FRAME_PARM_SAVE                48
+#define FRAME_PARM1_SAVE       48
+#define FRAME_PARM2_SAVE       56
+#define FRAME_PARM3_SAVE       64
+#define FRAME_PARM4_SAVE       72
+#define FRAME_PARM5_SAVE       80
+#define FRAME_PARM6_SAVE       88
+#define FRAME_PARM7_SAVE       96
+#define FRAME_PARM8_SAVE       104
+#define FRAME_PARM9_SAVE       112
+#else
+#define FRAME_MIN_SIZE         32
+#define FRAME_MIN_SIZE_PARM    96
+#define FRAME_BACKCHAIN                0
+#define FRAME_CR_SAVE          8
+#define FRAME_LR_SAVE          16
+#define FRAME_TOC_SAVE         24
+#define FRAME_PARM_SAVE                32
+#define FRAME_PARM1_SAVE       32
+#define FRAME_PARM2_SAVE       40
+#define FRAME_PARM3_SAVE       48
+#define FRAME_PARM4_SAVE       56
+#define FRAME_PARM5_SAVE       64
+#define FRAME_PARM6_SAVE       72
+#define FRAME_PARM7_SAVE       80
+#define FRAME_PARM8_SAVE       88
+#define FRAME_PARM9_SAVE       96
+#endif
+
 /* Support macros for CALL_MCOUNT.  */
+#if _CALL_ELF == 2
+#define call_mcount_parm_offset (-64)
+#else
+#define call_mcount_parm_offset FRAME_PARM_SAVE
+#endif
        .macro SAVE_ARG NARG
        .if \NARG
        SAVE_ARG \NARG-1
-       std     2+\NARG,40+8*(\NARG)(1)
+       std     2+\NARG,call_mcount_parm_offset-8+8*(\NARG)(1)
        .endif
        .endm
 
        .macro REST_ARG NARG
        .if \NARG
        REST_ARG \NARG-1
-       ld      2+\NARG,112+40+8*(\NARG)(1)
+       ld      2+\NARG,FRAME_MIN_SIZE_PARM+call_mcount_parm_offset-8+8*(\NARG)(1)
        .endif
        .endm
 
        .macro CFI_SAVE_ARG NARG
        .if \NARG
        CFI_SAVE_ARG \NARG-1
-       cfi_offset(2+\NARG,40+8*(\NARG))
+       cfi_offset(2+\NARG,call_mcount_parm_offset-8+8*(\NARG))
        .endif
        .endm
 
 #ifdef PROF
        mflr    r0
        SAVE_ARG \NARG
-       std     r0,16(r1)
-       stdu    r1,-112(r1)
-       cfi_adjust_cfa_offset(112)
-       cfi_offset(lr,16)
+       std     r0,FRAME_LR_SAVE(r1)
+       stdu    r1,-FRAME_MIN_SIZE_PARM(r1)
+       cfi_adjust_cfa_offset(FRAME_MIN_SIZE_PARM)
+       cfi_offset(lr,FRAME_LR_SAVE)
        CFI_SAVE_ARG \NARG
        bl      JUMPTARGET (_mcount)
 #ifndef SHARED
        nop
 #endif
-       ld      r0,128(r1)
+       ld      r0,FRAME_MIN_SIZE_PARM+FRAME_LR_SAVE(r1)
        REST_ARG \NARG
        mtlr    r0
-       addi    r1,r1,112
-       cfi_adjust_cfa_offset(-112)
+       addi    r1,r1,FRAME_MIN_SIZE_PARM
+       cfi_adjust_cfa_offset(-FRAME_MIN_SIZE_PARM)
        cfi_restore(lr)
        CFI_REST_ARG \NARG
 #endif
@@ -267,15 +309,15 @@ LT_LABELSUFFIX(name,_name_end): ; \
     .else; \
 .Local_syscall_error: \
     mflr 0; \
-    std 0,16(1); \
-    stdu 1,-112(1); \
-    cfi_adjust_cfa_offset(112); \
-    cfi_offset(lr,16); \
+    std 0,FRAME_LR_SAVE(1); \
+    stdu 1,-FRAME_MIN_SIZE(1); \
+    cfi_adjust_cfa_offset(FRAME_MIN_SIZE); \
+    cfi_offset(lr,FRAME_LR_SAVE); \
     bl JUMPTARGET(__syscall_error); \
     nop; \
-    ld 0,112+16(1); \
-    addi 1,1,112; \
-    cfi_adjust_cfa_offset(-112); \
+    ld 0,FRAME_MIN_SIZE+FRAME_LR_SAVE(1); \
+    addi 1,1,FRAME_MIN_SIZE; \
+    cfi_adjust_cfa_offset(-FRAME_MIN_SIZE); \
     mtlr 0; \
     cfi_restore(lr); \
     blr; \
index 270e21e0017a2eda33fb0a16ab1c70f3c314f741..ae576d62c3a938ffc5b7378199cd1f0c075ee4f4 100644 (file)
        cmpld   reg, r1;                                \
        bge+    .Lok;                                   \
        mflr    r0;                                     \
-       std     r0,16(r1);                              \
+       std     r0,FRAME_LR_SAVE(r1);                   \
        mr      r31,r3;                                 \
        mr      r30,r4;                                 \
-       stdu    r1,-144(r1);                            \
+       stdu    r1,-FRAME_MIN_SIZE-32(r1);              \
        cfi_remember_state;                             \
-       cfi_adjust_cfa_offset (144);                    \
-       cfi_offset (lr, 16);                            \
+       cfi_adjust_cfa_offset (FRAME_MIN_SIZE+32);      \
+       cfi_offset (lr, FRAME_LR_SAVE);                 \
        li      r3,0;                                   \
-       addi    r4,r1,112;                              \
+       addi    r4,r1,FRAME_MIN_SIZE;                   \
        li      r0,__NR_sigaltstack;                    \
        sc;                                             \
        /* Without working sigaltstack we cannot perform the test.  */ \
        bso     .Lok2;                                  \
-       lwz     r0,112+8(r1);                           \
+       lwz     r0,FRAME_MIN_SIZE+8(r1);                \
        andi.   r4,r0,1;                                \
        beq     .Lfail;                                 \
-       ld      r0,112+16(r1);                          \
-       ld      r4,112(r1);                             \
+       ld      r0,FRAME_MIN_SIZE+16(r1);               \
+       ld      r4,FRAME_MIN_SIZE(r1);                  \
        add     r4,r4,r0;                               \
        sub     r3,r3,reg;                              \
        cmpld   r3,r0;                                  \
index 348aeb5ba00d87b379781b00f374d2b45a39b9a3..33cdf25225f00c9198ef66a7fc32d2d3241ecb79 100644 (file)
@@ -28,9 +28,9 @@
 ENTRY (__brk)
        CALL_MCOUNT 1
 
-       std     r3,48(r1)
+       std     r3,-8(r1)
        DO_CALL(SYS_ify(brk))
-       ld      r6,48(r1)
+       ld      r6,-8(r1)
        ld      r5,.LC__curbrk@toc(r2)
        std     r3,0(r5)
        cmpld   r6,r3
index 4151d15c377d2beba32094e7062550f3bc4058c6..37d9d24fb9bda37ed902ce2e916040a1be7bea76 100644 (file)
@@ -40,22 +40,22 @@ ENTRY (__clone)
        cror    cr0*4+eq,cr1*4+eq,cr0*4+eq
        beq-    cr0,L(badargs)
 
-       /* Save some regs in parm save area.  */
+       /* Save some regs in the "red zone".  */
 #ifdef RESET_PID
-       std     r29,48(r1)
+       std     r29,-24(r1)
 #endif
-       std     r30,56(r1)
-       std     r31,64(r1)
+       std     r30,-16(r1)
+       std     r31,-8(r1)
 #ifdef RESET_PID
-       cfi_offset(r29,48)
+       cfi_offset(r29,-24)
 #endif
-       cfi_offset(r30,56)
-       cfi_offset(r31,64)
+       cfi_offset(r30,-16)
+       cfi_offset(r31,-8)
 
        /* Set up stack frame for child.  */
        clrrdi  r4,r4,4
        li      r0,0
-       stdu    r0,-112(r4) /* min stack frame is 112 bytes per ABI */
+       stdu    r0,-FRAME_MIN_SIZE_PARM(r4)
 
        /* Save fn, args, stack across syscall.  */
        mr      r30,r3                  /* Function in r30.  */
@@ -97,12 +97,12 @@ L(nomoregetpid):
 L(oldpid):
 #endif
 
-       std     r2,40(r1)
+       std     r2,FRAME_TOC_SAVE(r1)
        /* Call procedure.  */
        PPC64_LOAD_FUNCPTR r30
        mr      r3,r31
        bctrl
-       ld      r2,40(r1)
+       ld      r2,FRAME_TOC_SAVE(r1)
        /* Call _exit with result from procedure.  */
 #ifdef SHARED
        b       JUMPTARGET(__GI__exit)
@@ -121,15 +121,15 @@ L(badargs):
 L(parent):
        /* Parent.  Restore registers & return.  */
 #ifdef RESET_PID
-       cfi_offset(r29,48)
+       cfi_offset(r29,-24)
 #endif
-       cfi_offset(r30,56)
-       cfi_offset(r31,64)
+       cfi_offset(r30,-16)
+       cfi_offset(r31,-8)
 #ifdef RESET_PID
-       ld      r29,48(r1)
+       ld      r29,-24(r1)
 #endif
-       ld      r30,56(r1)
-       ld      r31,64(r1)
+       ld      r30,-16(r1)
+       ld      r31,-8(r1)
 #ifdef RESET_PID
        cfi_restore(r29)
 #endif
index 018e55c9971d5218c44c030d269811af0c9641ce..aba2d80902866406da7bb4be0a1acc17dcfd144f 100644 (file)
 # endif
 #endif
 
-#define FRAMESIZE 128
-#define stackblock FRAMESIZE+48 /* offset to parm save area.  */
+#if _CALL_ELF == 2
+#define FRAMESIZE (FRAME_MIN_SIZE+16+64)
+#define stackblock (FRAME_MIN_SIZE+16)
+#else
+#define FRAMESIZE (FRAME_MIN_SIZE+16)
+#define stackblock (FRAMESIZE+FRAME_PARM_SAVE) /* offset to parm save area.  */
+#endif
 
        .text
 ENTRY(__socket)
@@ -98,22 +103,22 @@ ENTRY(__socket)
 .Lsocket_cancel:
        cfi_adjust_cfa_offset(FRAMESIZE)
        mflr    r9
-       std     r9,FRAMESIZE+16(r1)
-       cfi_offset (lr, 16)
+       std     r9,FRAMESIZE+FRAME_LR_SAVE(r1)
+       cfi_offset (lr, FRAME_LR_SAVE)
        CENABLE
-       std     r3,120(r1)
+       std     r3,FRAME_MIN_SIZE+8(r1)
        li      r3,P(SOCKOP_,socket)
        addi    r4,r1,stackblock
        DO_CALL(SYS_ify(socketcall))
        mfcr    r0
-       std     r3,112(r1)
-       std     r0,FRAMESIZE+8(r1)
-       cfi_offset (cr, 8)
-       ld      r3,120(r1)
+       std     r3,FRAME_MIN_SIZE(r1)
+       std     r0,FRAMESIZE+FRAME_CR_SAVE(r1)
+       cfi_offset (cr, FRAME_CR_SAVE)
+       ld      r3,FRAME_MIN_SIZE+8(r1)
        CDISABLE
-       ld      r4,FRAMESIZE+16(r1)
-       ld      r0,FRAMESIZE+8(r1)
-       ld      r3,112(r1)
+       ld      r4,FRAMESIZE+FRAME_LR_SAVE(r1)
+       ld      r0,FRAMESIZE+FRAME_CR_SAVE(r1)
+       ld      r3,FRAME_MIN_SIZE(r1)
        mtlr    r4
        mtcr    r0
        addi    r1,r1,FRAMESIZE
index a35418d9d4ff96a90bf5dbf5a1ef060f31c8b9fe..8364e4614fb440689a3d264615bb9428a0047d70 100644 (file)
@@ -8,27 +8,6 @@ SIG_BLOCK
 SIG_SETMASK
 
 
--- Offsets of the fields in the powerpc64 ABI stack frame.
--- XXX Do these correspond to some struct?
-
-FRAME_BACKCHAIN                0
-FRAME_CR_SAVE          8
-FRAME_LR_SAVE          16
-FRAME_COMPILER_DW      24
-FRAME_LINKER_DW                32
-FRAME_TOC_SAVE         40
-FRAME_PARM_SAVE                48
-FRAME_PARM1_SAVE       48
-FRAME_PARM2_SAVE       56
-FRAME_PARM3_SAVE       64
-FRAME_PARM4_SAVE       72
-FRAME_PARM5_SAVE       80
-FRAME_PARM6_SAVE       88
-FRAME_PARM7_SAVE       96
-FRAME_PARM8_SAVE       104
-FRAME_PARM9_SAVE       112
-
-
 -- Offsets of the fields in the ucontext_t structure.
 #define ucontext(member)       offsetof (ucontext_t, member)
 #define mcontext(member)       ucontext (uc_mcontext.member)