/* $OpenBSD: sbrk.S,v 1.2 2021/10/25 14:38:10 jca Exp $ */ /* * Copyright (c) 2021 Dale Rahn * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "SYS.h" .extern _C_LABEL(_end) .data .align 3 .globl __curbrk .hidden __curbrk .type __curbrk,@object __curbrk: .dword _C_LABEL(_end) END(__curbrk) ENTRY(sbrk) RETGUARD_SETUP(sbrk, t6) lla t1, _C_LABEL(__curbrk) ld a2, 0(t1) add a0, a0, a2 // compute current break mv t3, a0 SYSTRAP(break) beqz t0, .L_sbrk_ok sw a0, TP_OFFSET_ERRNO(tp) li a0, -1 j .L_sbrk_fail .L_sbrk_ok: sd t3, 0(t1) // save current val of curbrk from above mv a0, a2 // return old val of curbrk from above .L_sbrk_fail: RETGUARD_CHECK(sbrk, t6); ret END(sbrk) .weak sbrk