diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S')
-rw-r--r-- | sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S | 49 |
1 files changed, 21 insertions, 28 deletions
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S b/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S index aa8420135f..d8fefdd3b4 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S @@ -1,5 +1,5 @@ /* Wrapper around clone system call. PowerPC64 version. - Copyright (C) 1997,98,99,2000,02,04, 2006 Free Software Foundation, Inc. + Copyright (C) 1997-2014 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,8 +19,6 @@ #include <sysdep.h> #define _ERRNO_H 1 #include <bits/errno.h> -#include <bp-sym.h> -#include <bp-asm.h> #define CLONE_VM 0x00000100 #define CLONE_THREAD 0x00010000 @@ -33,11 +31,8 @@ int flags [r5], void *arg [r6], void *parent_tid [r7], void *tls [r8], void *child_tid [r9]); */ -ENTRY (BP_SYM (__clone)) +ENTRY (__clone) CALL_MCOUNT 7 - /* GKM FIXME: add bounds checks, where sensible. */ - DISCARD_BOUNDS (r4) - DISCARD_BOUNDS (r6) /* Check for child_stack == NULL || fn == NULL. */ cmpdi cr0,r4,0 @@ -45,22 +40,22 @@ ENTRY (BP_SYM (__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. */ @@ -102,14 +97,12 @@ L(nomoregetpid): L(oldpid): #endif - std r2,40(r1) + std r2,FRAME_TOC_SAVE(r1) /* Call procedure. */ - ld r0,0(r30) - ld r2,8(r30) - mtctr r0 + 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) @@ -128,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 @@ -144,6 +137,6 @@ L(parent): cfi_restore(r31) PSEUDO_RET -END (BP_SYM (__clone)) +END (__clone) -weak_alias (BP_SYM (__clone), BP_SYM (clone)) +weak_alias (__clone, clone) |