xref: /netbsd-src/lib/libc/arch/powerpc/sys/brk.S (revision 38dcdc34d982bf8ab9a66b4b5b2e99311457ea36)
1*38dcdc34Smatt/*	$NetBSD: brk.S,v 1.14 2014/08/23 02:24:22 matt Exp $	*/
25ef4bdf6Sthorpej
35ef4bdf6Sthorpej#include "SYS.h"
45ef4bdf6Sthorpej
5cf88c389Smatt#if defined(LIBC_SCCS) && !defined(lint)
6*38dcdc34Smatt__RCSID("$NetBSD: brk.S,v 1.14 2014/08/23 02:24:22 matt Exp $")
7cf88c389Smatt#endif /* LIBC_SCCS && !lint */
8cf88c389Smatt
9*38dcdc34Smatt	.hidden	_C_LABEL(__curbrk)
106348b7d5Skleink	.globl	_C_LABEL(__curbrk)
11*38dcdc34Smatt	.hidden	_C_LABEL(__minbrk)
126348b7d5Skleink	.globl	_C_LABEL(__minbrk)
135af7e7a9Skleink	.globl	_C_LABEL(_end)
14106908bdStsubai
1503f996bdSkleink#ifdef WEAK_ALIAS
1603f996bdSkleinkWEAK_ALIAS(brk, _brk)
1703f996bdSkleink#endif
1803f996bdSkleink
19106908bdStsubai	.data
20*38dcdc34Smatt	.p2align 2
216348b7d5Skleink_C_LABEL(__minbrk):
22*38dcdc34Smatt	.long	_C_LABEL(_end)
23*38dcdc34Smatt_C_LABEL(__curbrk):
24*38dcdc34Smatt	.long	_C_LABEL(_end)
255ef4bdf6Sthorpej
2603f996bdSkleinkENTRY(_brk)
274d12bfcdSjoerg#ifdef __PIC__
28*38dcdc34Smatt	mflr	%r0
29*38dcdc34Smatt	bcl	20,31,.LPIC0
30*38dcdc34Smatt.LPIC0:	mflr    %r9
31*38dcdc34Smatt	mtlr	%r0
32*38dcdc34Smatt	addis	%r9,%r9,(_C_LABEL(__minbrk)-.LPIC0)@ha
33*38dcdc34Smatt	ldptru	%r5,(_C_LABEL(__minbrk)-.LPIC0)@l(%r9)	# r5 = &_end
34106908bdStsubai#else
35*38dcdc34Smatt	lis	%r9,_C_LABEL(__minbrk)@ha
36*38dcdc34Smatt	ldptru	%r5,_C_LABEL(__minbrk)@l(%r9)	# r5 = &_end
37106908bdStsubai#endif
38*38dcdc34Smatt	cmpptrl	%r5,%r3			# if (__minbrk <= r3)
39*38dcdc34Smatt#ifdef __PPC_ISEL__
40*38dcdc34Smatt	iselgt	%r3,%r5,%r3
41*38dcdc34Smatt#else
425ef4bdf6Sthorpej	bgt	0f
431cddd41eSmatt	mr	%r5,%r3			# r5 = r3
445ef4bdf6Sthorpej0:
451cddd41eSmatt	mr	%r3,%r5			# new break value
46106908bdStsubai#endif
47*38dcdc34Smatt	_DOSYSCALL(break)		# assume that r5 is preserved
48*38dcdc34Smatt	bso	1f
49*38dcdc34Smatt	stptr	%r5,__SIZEOF_POINTER__(%r9)
505ef4bdf6Sthorpej	blr				# return 0
515ef4bdf6Sthorpej
525ef4bdf6Sthorpej1:
53*38dcdc34Smatt	BRANCH_TO_CERROR()
54cf88c389SmattEND(_brk)
55