xref: /minix3/lib/libc/arch/powerpc/sys/brk.S (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1/*	$NetBSD: brk.S,v 1.14 2014/08/23 02:24:22 matt Exp $	*/
2
3#include "SYS.h"
4
5#if defined(LIBC_SCCS) && !defined(lint)
6__RCSID("$NetBSD: brk.S,v 1.14 2014/08/23 02:24:22 matt Exp $")
7#endif /* LIBC_SCCS && !lint */
8
9	.hidden	_C_LABEL(__curbrk)
10	.globl	_C_LABEL(__curbrk)
11	.hidden	_C_LABEL(__minbrk)
12	.globl	_C_LABEL(__minbrk)
13	.globl	_C_LABEL(_end)
14
15#ifdef WEAK_ALIAS
16WEAK_ALIAS(brk, _brk)
17#endif
18
19	.data
20	.p2align 2
21_C_LABEL(__minbrk):
22	.long	_C_LABEL(_end)
23_C_LABEL(__curbrk):
24	.long	_C_LABEL(_end)
25
26ENTRY(_brk)
27#ifdef __PIC__
28	mflr	%r0
29	bcl	20,31,.LPIC0
30.LPIC0:	mflr    %r9
31	mtlr	%r0
32	addis	%r9,%r9,(_C_LABEL(__minbrk)-.LPIC0)@ha
33	ldptru	%r5,(_C_LABEL(__minbrk)-.LPIC0)@l(%r9)	# r5 = &_end
34#else
35	lis	%r9,_C_LABEL(__minbrk)@ha
36	ldptru	%r5,_C_LABEL(__minbrk)@l(%r9)	# r5 = &_end
37#endif
38	cmpptrl	%r5,%r3			# if (__minbrk <= r3)
39#ifdef __PPC_ISEL__
40	iselgt	%r3,%r5,%r3
41#else
42	bgt	0f
43	mr	%r5,%r3			# r5 = r3
440:
45	mr	%r3,%r5			# new break value
46#endif
47	_DOSYSCALL(break)		# assume that r5 is preserved
48	bso	1f
49	stptr	%r5,__SIZEOF_POINTER__(%r9)
50	blr				# return 0
51
521:
53	BRANCH_TO_CERROR()
54END(_brk)
55