brk.S revision 1.11
11.11Smatt/*	$NetBSD: brk.S,v 1.11 2011/01/15 07:31:12 matt Exp $	*/
21.1Sthorpej
31.1Sthorpej#include "SYS.h"
41.1Sthorpej
51.11Smatt#if defined(LIBC_SCCS) && !defined(lint)
61.11Smatt__RCSID("$NetBSD: brk.S,v 1.11 2011/01/15 07:31:12 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.1Sthorpej
231.8SkleinkENTRY(_brk)
241.1Sthorpej#ifdef PIC
251.10Smatt	mflr	%r10
261.4Stsubai	bl	_GLOBAL_OFFSET_TABLE_@local-4
271.10Smatt	mflr	%r9
281.10Smatt	mtlr	%r10
291.10Smatt	lwz	%r5,_C_LABEL(_end)@got(%r9)
301.1Sthorpej#else
311.10Smatt	lis	%r5,_C_LABEL(_end)@ha	# r5 = &_end
321.10Smatt	addi	%r5,%r5,_C_LABEL(_end)@l
331.4Stsubai#endif
341.10Smatt	cmplw	%r5,%r3			# if (&_end <= r3)
351.1Sthorpej	bgt	0f
361.10Smatt	mr	%r5,%r3			# r5 = r3
371.1Sthorpej0:
381.10Smatt	mr	%r3,%r5			# new break value
391.11Smatt	_DOSYSCALL(break)		# assume, that r5 is kept
401.1Sthorpej	bso	1f
411.4Stsubai#ifdef PIC
421.10Smatt	lwz	%r6,_C_LABEL(__curbrk)@got(%r9)
431.10Smatt	stw	%r5,0(%r6)
441.4Stsubai#else
451.10Smatt	lis	%r6,_C_LABEL(__curbrk)@ha	# record new break
461.10Smatt	stw	%r5,_C_LABEL(__curbrk)@l(%r6)
471.4Stsubai#endif
481.1Sthorpej	blr				# return 0
491.1Sthorpej
501.1Sthorpej1:
511.11Smatt	b	_C_LABEL(__cerror)
521.11SmattEND(_brk)
53