/*	$NetBSD: sbrk.S,v 1.9 2002/07/30 06:08:00 matt Exp $	*/

#include "SYS.h"

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

#ifdef WEAK_ALIAS
WEAK_ALIAS(sbrk, _sbrk)
#endif

	.data
_C_LABEL(__curbrk):
	.long	_C_LABEL(_end)
	.text

ENTRY(_sbrk)
#ifdef PIC
	mflr	%r10
	bl	_GLOBAL_OFFSET_TABLE_@local-4
	mflr	%r5
	mtlr	%r10
	lwz	%r5,_C_LABEL(__curbrk)@got(%r5)
	lwz	%r6,0(%r5)
#else
	lis	%r5,_C_LABEL(__curbrk)@ha
	lwz	%r6,_C_LABEL(__curbrk)@l(%r5)	# r6 = old break
#endif
	add	%r3,%r3,%r6
	mr	%r7,%r3				# r7 = new break
	li	%r0,SYS_break
	sc					# break(new_break)
	bso	1f
	mr	%r3,%r6				# set return value
#ifdef PIC
	stw	%r7,0(%r5)
#else
	stw	%r7,_C_LABEL(__curbrk)@l(%r5)	# record new break
#endif
	blr
1:
	b	PIC_PLT(_C_LABEL(__cerror))
