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
22ENTRY(_brk)
23#if defined(PIC)
24	mflr	%r10
25	PIC_GOTSETUP(%r9)
26	mtlr	%r10
27	lwz	%r5,_C_LABEL(_end)@got(%r9)
28#else
29	lis	%r5,_C_LABEL(_end)@ha	# r5 = &_end
30	addi	%r5,%r5,_C_LABEL(_end)@l
31#endif
32	cmplw	%r5,%r3			# if (&_end <= r3)
33	bgt	0f
34	mr	%r5,%r3			# r5 = r3
350:
36	mr	%r3,%r5			# new break value
37	_DOSYSCALL(break)		# assume, that r5 is kept
38	bso	1f
39#ifdef PIC
40	lwz	%r6,_C_LABEL(__curbrk)@got(%r9)
41	stw	%r5,0(%r6)
42#else
43	lis	%r6,_C_LABEL(__curbrk)@ha	# record new break
44	stw	%r5,_C_LABEL(__curbrk)@l(%r6)
45#endif
46	blr				# return 0
47
481:
49	b	_C_LABEL(__cerror)
50END(_brk)
51