xref: /openbsd/lib/libc/arch/riscv64/sys/sbrk.S (revision d415bd75)
1/*	$OpenBSD: sbrk.S,v 1.4 2022/12/03 15:02:30 jca Exp $	*/
2/*
3 * Copyright (c) 2021 Dale Rahn <drahn@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#include "SYS.h"
19
20	.extern _end
21
22	.data
23	.align	3
24	.globl	__curbrk
25	.hidden __curbrk
26	.type	__curbrk,@object
27__curbrk:
28	.dword _end
29	END(__curbrk)
30
31ENTRY_NB(sbrk)
32	RETGUARD_SETUP(sbrk, t6)
33
34	lla	t1, __curbrk
35	ld	a2, 0(t1)
36	add	a0, a0, a2	// compute current break
37	mv	t3, a0
38	SYSTRAP(break)
39	beqz	t0, .L_sbrk_ok
40	sw      a0, TP_OFFSET_ERRNO(tp)
41	li	a0, -1
42	j	.L_sbrk_fail
43.L_sbrk_ok:
44	sd	t3, 0(t1)	// save current val of curbrk from above
45	mv	a0, a2		// return old val of curbrk from above
46.L_sbrk_fail:
47	RETGUARD_CHECK(sbrk, t6);
48	ret
49END(sbrk)
50	.weak	sbrk
51