79 lines
1.4 KiB
ArmAsm
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
|