brk.S revision 1.12
11.12Smatt/*	$NetBSD: brk.S,v 1.12 2011/01/16 02:43:10 matt Exp $	*/
21.1Sthorpej
31.1Sthorpej#include "SYS.h"
41.1Sthorpej
51.11Smatt#if defined(LIBC_SCCS) && !defined(lint)
61.12Smatt__RCSID("$NetBSD: brk.S,v 1.12 2011/01/16 02:43:10 matt Exp $")
71.11Smatt#endif /* LIBC_SCCS && !lint */
81.11Smatt
91.5Skleink	.globl	_C_LABEL(__curbrk)
101.5Skleink	.globl	_C_LABEL(__minbrk)
111.6Skleink	.globl	_C_LABEL(_end)
121.4Stsubai
131.8Skleink#ifdef WEAK_ALIAS
141.8SkleinkWEAK_ALIAS(brk, _brk)
151.8Skleink#endif
161.8Skleink
171.4Stsubai	.data
181.5Skleink_C_LABEL(__minbrk):
191.6Skleink	.long	_C_LABEL(_end)		# XXX not used yet
201.1Sthorpej
211.1Sthorpej	.text
221.8SkleinkENTRY(_brk)
231.12Smatt#if defined(PIC)
241.10Smatt	mflr	%r10
251.12Smatt	PIC_GOTSETUP(%r9)
261.10Smatt	mtlr	%r10
271.10Smatt	lwz	%r5,_C_LABEL(_end)@got(%r9)
281.1Sthorpej#else
291.10Smatt	lis	%r5,_C_LABEL(_end)@ha	# r5 = &_end
301.10Smatt	addi	%r5,%r5,_C_LABEL(_end)@l
311.4Stsubai#endif
321.10Smatt	cmplw	%r5,%r3			# if (&_end <= r3)
331.1Sthorpej	bgt	0f
341.10Smatt	mr	%r5,%r3			# r5 = r3
351.1Sthorpej0:
361.10Smatt	mr	%r3,%r5			# new break value
371.11Smatt	_DOSYSCALL(break)		# assume, that r5 is kept
381.1Sthorpej	bso	1f
391.4Stsubai#ifdef PIC
401.10Smatt	lwz	%r6,_C_LABEL(__curbrk)@got(%r9)
411.10Smatt	stw	%r5,0(%r6)
421.4Stsubai#else
431.10Smatt	lis	%r6,_C_LABEL(__curbrk)@ha	# record new break
441.10Smatt	stw	%r5,_C_LABEL(__curbrk)@l(%r6)
451.4Stsubai#endif
461.1Sthorpej	blr				# return 0
471.1Sthorpej
481.1Sthorpej1:
491.11Smatt	b	_C_LABEL(__cerror)
501.11SmattEND(_brk)
51