brk.S revision 1.8
11.8Skleink/*	$NetBSD: brk.S,v 1.8 2000/06/23 15:40:38 kleink Exp $	*/
21.1Sthorpej
31.1Sthorpej#include "SYS.h"
41.1Sthorpej
51.5Skleink	.globl	_C_LABEL(__curbrk)
61.5Skleink	.globl	_C_LABEL(__minbrk)
71.6Skleink	.globl	_C_LABEL(_end)
81.4Stsubai
91.8Skleink#ifdef WEAK_ALIAS
101.8SkleinkWEAK_ALIAS(brk, _brk)
111.8Skleink#endif
121.8Skleink
131.4Stsubai	.data
141.5Skleink_C_LABEL(__minbrk):
151.6Skleink	.long	_C_LABEL(_end)		# XXX not used yet
161.1Sthorpej
171.1Sthorpej	.text
181.1Sthorpej
191.8Skleink#ifdef WEAK_ALIAS
201.8SkleinkENTRY(_brk)
211.8Skleink#else
221.4StsubaiENTRY(brk)
231.8Skleink#endif
241.1Sthorpej#ifdef PIC
251.4Stsubai	mflr	10
261.4Stsubai	bl	_GLOBAL_OFFSET_TABLE_@local-4
271.4Stsubai	mflr	9
281.4Stsubai	mtlr	10
291.7Skleink	lwz	5,_C_LABEL(_end)@got(9)
301.1Sthorpej#else
311.7Skleink	lis	5,_C_LABEL(_end)@ha	# r5 = &_end
321.7Skleink	addi	5,5,_C_LABEL(_end)@l
331.4Stsubai#endif
341.1Sthorpej	cmplw	5,3			# if (&_end <= r3)
351.1Sthorpej	bgt	0f
361.1Sthorpej	mr	5,3			# r5 = r3
371.1Sthorpej0:
381.1Sthorpej	mr	3,5			# new break value
391.1Sthorpej	li	0,SYS_break
401.1Sthorpej	sc				# assume, that r5 is kept
411.1Sthorpej	bso	1f
421.4Stsubai#ifdef PIC
431.5Skleink	lwz	6,_C_LABEL(__curbrk)@got(9)
441.4Stsubai	stw	5,0(6)
451.4Stsubai#else
461.5Skleink	lis	6,_C_LABEL(__curbrk)@ha	# record new break
471.5Skleink	stw	5,_C_LABEL(__curbrk)@l(6)
481.4Stsubai#endif
491.1Sthorpej	blr				# return 0
501.1Sthorpej
511.1Sthorpej1:
521.5Skleink	b	PIC_PLT(_C_LABEL(__cerror))
53