xref: /openbsd/lib/libc/arch/riscv64/sys/brk.S (revision 73471bf0)
1/*	$OpenBSD: brk.S,v 1.2 2021/10/25 14:38:10 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 __curbrk
21	.extern _C_LABEL(_end)
22
23	.data
24	.align 3
25__minbrk:
26	.dword _C_LABEL(_end)
27
28
29ENTRY(brk)
30	RETGUARD_SETUP(brk, t6)
31	lla	t1, _C_LABEL(__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, _C_LABEL(__curbrk)
39
40	li t0, SYS_break
41	ecall
42
43	/* check for error */
44	beqz	t0, .L_brk_ok
45
46	sw	a0, TP_OFFSET_ERRNO(tp)
47	li	a0, -1
48	j	.L_done
49
50	/* update, __curbrk and return */
51.L_brk_ok:
52	sd	a2, 0(t1)
53	li	a0, 0		/* # return 0 */
54.L_done:
55	RETGUARD_CHECK(brk, t6);
56	ret
57END(brk)
58	.weak	brk
59