brk.S revision 1.11
1/*	$NetBSD: brk.S,v 1.11 2011/01/15 07:31:12 matt Exp $	*/
2
3#include "SYS.h"
4
5#if defined(LIBC_SCCS) && !defined(lint)
6__RCSID("$NetBSD: brk.S,v 1.11 2011/01/15 07:31:12 matt Exp $")
7#endif /* LIBC_SCCS && !lint */
8
9	.globl	_C_LABEL(__curbrk)
10	.globl	_C_LABEL(__minbrk)
11	.globl	_C_LABEL(_end)
12
13#ifdef WEAK_ALIAS
14WEAK_ALIAS(brk, _brk)
15#endif
16
17	.data
18_C_LABEL(__minbrk):
19	.long	_C_LABEL(_end)		# XXX not used yet
20
21	.text
22
23ENTRY(_brk)
24#ifdef PIC
25	mflr	%r10
26	bl	_GLOBAL_OFFSET_TABLE_@local-4
27	mflr	%r9
28	mtlr	%r10
29	lwz	%r5,_C_LABEL(_end)@got(%r9)
30#else
31	lis	%r5,_C_LABEL(_end)@ha	# r5 = &_end
32	addi	%r5,%r5,_C_LABEL(_end)@l
33#endif
34	cmplw	%r5,%r3			# if (&_end <= r3)
35	bgt	0f
36	mr	%r5,%r3			# r5 = r3
370:
38	mr	%r3,%r5			# new break value
39	_DOSYSCALL(break)		# assume, that r5 is kept
40	bso	1f
41#ifdef PIC
42	lwz	%r6,_C_LABEL(__curbrk)@got(%r9)
43	stw	%r5,0(%r6)
44#else
45	lis	%r6,_C_LABEL(__curbrk)@ha	# record new break
46	stw	%r5,_C_LABEL(__curbrk)@l(%r6)
47#endif
48	blr				# return 0
49
501:
51	b	_C_LABEL(__cerror)
52END(_brk)
53