1129202Scognet/*	$NetBSD: sbrk.S,v 1.7 2003/08/07 16:42:05 agc Exp $	*/
2129202Scognet
3129202Scognet/*-
4129202Scognet * Copyright (c) 1990 The Regents of the University of California.
5129202Scognet * All rights reserved.
6129202Scognet *
7129202Scognet * Redistribution and use in source and binary forms, with or without
8129202Scognet * modification, are permitted provided that the following conditions
9129202Scognet * are met:
10129202Scognet * 1. Redistributions of source code must retain the above copyright
11129202Scognet *    notice, this list of conditions and the following disclaimer.
12129202Scognet * 2. Redistributions in binary form must reproduce the above copyright
13129202Scognet *    notice, this list of conditions and the following disclaimer in the
14129202Scognet *    documentation and/or other materials provided with the distribution.
15129202Scognet * 3. Neither the name of the University nor the names of its contributors
16129202Scognet *    may be used to endorse or promote products derived from this software
17129202Scognet *    without specific prior written permission.
18129202Scognet *
19129202Scognet * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20129202Scognet * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21129202Scognet * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22129202Scognet * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23129202Scognet * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24129202Scognet * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25129202Scognet * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26129202Scognet * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27129202Scognet * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28129202Scognet * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29129202Scognet * SUCH DAMAGE.
30129202Scognet *
31129202Scognet *	from: @(#)sbrk.s	5.1 (Berkeley) 4/23/90
32129202Scognet */
33129202Scognet
34129202Scognet#include <machine/asm.h>
35129202Scognet__FBSDID("$FreeBSD: releng/10.2/lib/libc/arm/sys/sbrk.S 271337 2014-09-09 22:24:01Z ian $");
36129202Scognet#include "SYS.h"
37129202Scognet
38171061Skan	.globl	_C_LABEL(_end)
39129202Scognet
40129202Scognet#ifdef WEAK_ALIAS
41129202ScognetWEAK_ALIAS(sbrk, _sbrk)
42129202Scognet#endif
43129202Scognet
44129202Scognet	.data
45129202Scognet	.align	0
46129202Scognet	.globl	CURBRK
47129202Scognet	.type	CURBRK,#object
48129202ScognetCURBRK:
49171061Skan	.word	_C_LABEL(_end)
50129202Scognet
51129202Scognet/*
52129202Scognet * Change the data segment size
53129202Scognet */
54129202ScognetENTRY(_sbrk)
55129202Scognet#ifdef PIC
56129202Scognet	/* Setup the GOT */
57129202Scognet	ldr	r3, .Lgot
58129202Scognet	add	r3, pc, r3
59129202Scognet.L1:
60129202Scognet	ldr	r2, .Lcurbrk
61129202Scognet	ldr	r2, [r3, r2]
62129202Scognet#else
63129202Scognet	ldr	r2, .Lcurbrk
64129202Scognet#endif
65129202Scognet	/* Get the current brk address */
66129202Scognet	ldr	r1, [r2]
67129202Scognet
68129202Scognet	/* Calculate new value */
69129202Scognet	mov	r3, r0
70129202Scognet	add	r0, r0, r1
71129202Scognet	SYSTRAP(break)
72129202Scognet	bcs	PIC_SYM(CERROR, PLT)
73129202Scognet
74129202Scognet	/* Store new curbrk value */
75129202Scognet	ldr	r0, [r2]
76129202Scognet	add	r1, r0, r3
77129202Scognet	str	r1, [r2]
78129202Scognet
79129202Scognet	/* Return old curbrk value */
80137464Scognet	RET
81129202Scognet
82129202Scognet	.align	0
83129202Scognet#ifdef PIC
84129202Scognet.Lgot:
85129202Scognet	.word	_GLOBAL_OFFSET_TABLE_ - (.L1+4)
86129202Scognet#endif
87129202Scognet.Lcurbrk:
88129202Scognet	.word	PIC_SYM(CURBRK, GOT)
89271337SianEND(_sbrk)
90