Retro68/gcc/newlib/libc/sys/sparc64/sbrk.S
2012-03-27 01:51:53 +02:00

79 lines
1.4 KiB
ArmAsm

! sbrk() system call
#include "sys/syscallasm.h"
DATA_SECTION
ALIGN (4)
! CURBRK contains the current top of allocated space.
! END is a private symbol in svr4, but a public one in sunos4.
! FIXME: CURBRK is 4 bytes for now.
GLOBAL (ASM_PRIVATE_SYMBOL (curbrk))
ASM_PRIVATE_SYMBOL (curbrk):
#ifdef __svr4__
WORD (ASM_PRIVATE_SYMBOL (end))
#else
WORD (ASM_SYMBOL (end))
#endif
TEXT_SECTION
ALIGN (4)
#ifdef REENT
GLOBAL (ASM_SYMBOL (_sbrk_r))
ASM_SYMBOL (_sbrk_r):
mov %o0,%o5
mov %o1,%o0
#else
GLOBAL (ASM_SYMBOL (sbrk))
ASM_SYMBOL (sbrk):
#endif
add %o0,7,%o0
andn %o0,7,%o0
sethi %hi (ASM_PRIVATE_SYMBOL (curbrk)),%o2
lduw [%o2+%lo (ASM_PRIVATE_SYMBOL (curbrk))],%o3
add %o3,7,%o3
andn %o3,7,%o3
add %o3,%o0,%o0
mov %o0,%o4
mov SYS_brk,%g1
ta SYSCALL_TRAP
bcs err
nop
stw %o4,[%o2+%lo (ASM_PRIVATE_SYMBOL (curbrk))]
jmpl %o7+8,%g0
mov %o3,%o0
#ifdef REENT
GLOBAL (ASM_SYMBOL (_brk_r))
ASM_SYMBOL (_brk_r):
mov %o0,%o5
mov %o1,%o0
#else
GLOBAL (ASM_SYMBOL (brk))
ASM_SYMBOL (brk):
#endif
add %o0,7,%o0
andn %o0,7,%o0
mov %o0,%o2
mov SYS_brk,%g1
ta SYSCALL_TRAP
bcs err
nop
sethi %hi (ASM_PRIVATE_SYMBOL (curbrk)),%o3
st %o2,[%o3+%lo (ASM_PRIVATE_SYMBOL (curbrk))]
retl
mov %g0,%o0
err:
#ifdef REENT
sethi %hi (ASM_PRIVATE_SYMBOL (cerror_r)),%g1
or %g1,%lo (ASM_PRIVATE_SYMBOL (cerror_r)),%g1
#else
sethi %hi (ASM_PRIVATE_SYMBOL (cerror)),%g1
or %g1,%lo (ASM_PRIVATE_SYMBOL (cerror)),%g1
#endif
jmpl %g1,%g0
mov %o5,%o1