xref: /openbsd-src/lib/libc/arch/riscv64/sys/brk.S (revision 83762a71f74848f4d09174ce350838b4204957c5)
1/*	$OpenBSD: brk.S,v 1.5 2023/12/10 16:45:52 deraadt 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 __curbrk
21	.extern _end
22
23	.data
24	.align 3
25__minbrk:
26	.dword _end
27
28
29ENTRY_NB(brk)
30	RETGUARD_SETUP(brk, t6)
31	lla	t1, __minbrk
32	ld	t5, 0(t1)
33	bgeu	a0, t5, .L_brk_call
34	mv	a0, t5
35
36.L_brk_call:
37	mv	a2, a0
38	lla	t1, __curbrk
39
40	li t0, SYS_break
4199:	ecall
42	PINSYSCALL(SYS_break, 99b)
43
44	/* check for error */
45	beqz	t0, .L_brk_ok
46
47	sw	a0, TP_OFFSET_ERRNO(tp)
48	li	a0, -1
49	j	.L_done
50
51	/* update, __curbrk and return */
52.L_brk_ok:
53	sd	a2, 0(t1)
54	li	a0, 0		/* # return 0 */
55.L_done:
56	RETGUARD_CHECK(brk, t6);
57	ret
58END(brk)
59	.weak	brk
60