sbrk.S revision 107571
1206084Srdivacky/*-
2206084Srdivacky * Copyright (c) 2002 Peter Grehan.
3206084Srdivacky * All rights reserved.
4206084Srdivacky *
5206084Srdivacky * Redistribution and use in source and binary forms, with or without
6206084Srdivacky * modification, are permitted provided that the following conditions
7206084Srdivacky * are met:
8206084Srdivacky * 1. Redistributions of source code must retain the above copyright
9206084Srdivacky *    notice, this list of conditions and the following disclaimer.
10206084Srdivacky * 2. Redistributions in binary form must reproduce the above copyright
11206084Srdivacky *    notice, this list of conditions and the following disclaimer in the
12206084Srdivacky *    documentation and/or other materials provided with the distribution.
13206084Srdivacky *
14206084Srdivacky * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15206084Srdivacky * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16207619Srdivacky * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17206084Srdivacky * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18206084Srdivacky * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19206084Srdivacky * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20206084Srdivacky * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21206084Srdivacky * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22206084Srdivacky * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23207619Srdivacky * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24207619Srdivacky * SUCH DAMAGE.
25207619Srdivacky */
26207619Srdivacky/*      $NetBSD: sbrk.S,v 1.8 2000/06/26 06:25:44 kleink Exp $  */
27207619Srdivacky
28206275Srdivacky#include <machine/asm.h>
29206275Srdivacky__FBSDID("$FreeBSD: head/lib/libc/powerpc/sys/sbrk.S 107571 2002-12-04 07:25:14Z grehan $");
30207619Srdivacky
31207619Srdivacky#include "SYS.h"
32207619Srdivacky
33207619Srdivacky	.globl	HIDENAME(curbrk)
34207619Srdivacky	.globl	CNAME(_end)
35207619Srdivacky
36207619Srdivacky	.data
37207619SrdivackyHIDENAME(curbrk):
38207619Srdivacky	.long	CNAME(_end)
39207619Srdivacky
40207619Srdivacky	.text
41207619SrdivackyENTRY(sbrk)
42207619Srdivacky
43207619Srdivacky#ifdef PIC
44207619Srdivacky	mflr	%r10
45207619Srdivacky	bl	_GLOBAL_OFFSET_TABLE_@local-4
46207619Srdivacky	mflr	%r5
47207619Srdivacky	mtlr	%r10
48207619Srdivacky	lwz	%r5,HIDENAME(curbrk)@got(%r5)
49207619Srdivacky	lwz	%r6,0(%r5)
50206275Srdivacky#else
51207619Srdivacky	lis	%r5,HIDENAME(curbrk)@ha
52207619Srdivacky	lwz	%r6,HIDENAME(curbrk)@l(%r5)	/* r6 = old break */
53207619Srdivacky#endif
54207619Srdivacky	cmpwi	%r3,0				/* sbrk(0) - return curbrk */
55207619Srdivacky	beq	1f
56207619Srdivacky	add	%r3,%r3,%r6
57207619Srdivacky	mr	%r7,%r3				/* r7 = new break */
58207619Srdivacky	li	%r0,SYS_break
59207619Srdivacky	sc					/* break(new_break) */
60207619Srdivacky	bso	2f
61207619Srdivacky#ifdef PIC
62207619Srdivacky	stw     %r7,0(%r5)
63207619Srdivacky#else
64207619Srdivacky	stw     %r7,HIDENAME(curbrk)@l(%r5)	/* record new break */
65207619Srdivacky#endif
66207619Srdivacky1:
67207619Srdivacky	mr      %r3,%r6				/* set return value */
68207619Srdivacky	blr
69207619Srdivacky2:
70207619Srdivacky	b	PIC_PLT(HIDENAME(cerror))
71207619Srdivacky