summaryrefslogtreecommitdiff
path: root/lib/libc/arch/powerpc/sys/brk.S
blob: 767f07076ad19416e8a73d09e610b69f2972c5f8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/*	$NetBSD: brk.S,v 1.10 2002/07/30 06:07:59 matt Exp $	*/

#include "SYS.h"

	.globl	_C_LABEL(__curbrk)
	.globl	_C_LABEL(__minbrk)
	.globl	_C_LABEL(_end)

#ifdef WEAK_ALIAS
WEAK_ALIAS(brk, _brk)
#endif

	.data
_C_LABEL(__minbrk):
	.long	_C_LABEL(_end)		# XXX not used yet

	.text

ENTRY(_brk)
#ifdef PIC
	mflr	%r10
	bl	_GLOBAL_OFFSET_TABLE_@local-4
	mflr	%r9
	mtlr	%r10
	lwz	%r5,_C_LABEL(_end)@got(%r9)
#else
	lis	%r5,_C_LABEL(_end)@ha	# r5 = &_end
	addi	%r5,%r5,_C_LABEL(_end)@l
#endif
	cmplw	%r5,%r3			# if (&_end <= r3)
	bgt	0f
	mr	%r5,%r3			# r5 = r3
0:
	mr	%r3,%r5			# new break value
	li	%r0,SYS_break
	sc				# assume, that r5 is kept
	bso	1f
#ifdef PIC
	lwz	%r6,_C_LABEL(__curbrk)@got(%r9)
	stw	%r5,0(%r6)
#else
	lis	%r6,_C_LABEL(__curbrk)@ha	# record new break
	stw	%r5,_C_LABEL(__curbrk)@l(%r6)
#endif
	blr				# return 0

1:
	b	PIC_PLT(_C_LABEL(__cerror))