summaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/linux/alpha
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux/alpha')
-rw-r--r--sysdeps/unix/sysv/linux/alpha/brk.S12
-rw-r--r--sysdeps/unix/sysv/linux/alpha/clone.S13
2 files changed, 20 insertions, 5 deletions
diff --git a/sysdeps/unix/sysv/linux/alpha/brk.S b/sysdeps/unix/sysv/linux/alpha/brk.S
index f44686b9a4..74fef64f64 100644
--- a/sysdeps/unix/sysv/linux/alpha/brk.S
+++ b/sysdeps/unix/sysv/linux/alpha/brk.S
@@ -37,8 +37,9 @@ __curbrk: .skip 8
#endif
.text
-LEAF(__brk, 0)
+LEAF(__brk, 8)
ldgp gp, 0(t12)
+ subq sp, 8, sp
#ifdef PROF
.set noat
lda AT, _mcount
@@ -47,9 +48,14 @@ LEAF(__brk, 0)
#endif
.prologue 1
+ /* Save the requested brk across the system call. */
+ stq a0, 0(sp)
+
ldiq v0, __NR_brk
call_pal PAL_callsys
+ ldq a0, 0(sp)
+
/* Be prepared for an OSF-style brk. */
bne a3, $err1
beq v0, $ok
@@ -62,11 +68,13 @@ LEAF(__brk, 0)
/* Update __curbrk and return cleanly. */
mov zero, v0
$ok: stq a0, __curbrk
+ addq sp, 8, sp
ret
/* What a horrible way to die. */
$err0: ldi v0, ENOMEM
-$err1: jmp zero, __syscall_error
+$err1: addq sp, 8, sp
+ jmp zero, __syscall_error
END(__brk)
diff --git a/sysdeps/unix/sysv/linux/alpha/clone.S b/sysdeps/unix/sysv/linux/alpha/clone.S
index 5d36e2588d..aab4e590a5 100644
--- a/sysdeps/unix/sysv/linux/alpha/clone.S
+++ b/sysdeps/unix/sysv/linux/alpha/clone.S
@@ -42,9 +42,12 @@ ENTRY(__clone)
beq a0,$error /* no NULL function pointers */
beq a1,$error /* no NULL stack pointers */
+ /* Save the fn ptr and arg on the new stack. */
+ subq a1,16,a1
+ stq a0,0(a1)
+ stq a3,8(a1)
+
/* Do the system call */
- mov a0,pv /* get fn ptr out of the way */
- mov a3,t0 /* get fn arg out of the way */
mov a2,a0
ldiq v0,__NR_clone
call_pal PAL_callsys
@@ -73,8 +76,12 @@ thread_start:
mov zero,fp
.prologue 0
+ /* Load up the arguments. */
+ ldq pv,0(sp)
+ ldq a0,8(sp)
+ addq sp,16,sp
+
/* Call the user's function */
- mov t0,a0
jsr ra,(pv)
ldgp gp,0(ra)