2002-11-07 Richard Henderson <rth@redhat.com>
[kopensolaris-gnu/glibc.git] / sysdeps / unix / sysv / linux / alpha / brk.S
1 /* Copyright (C) 1993, 1995, 1996, 1997 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Brendan Kehoe <brendan@zen.org>, 1993.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19
20 /* __brk is a special syscall under Linux since it never returns an
21    error.  Instead, the error condition is indicated by returning the old
22    break value (instead of the new, requested one).  */
23
24 #include <sysdep.h>
25 #define _ERRNO_H
26 #include <bits/errno.h>
27
28 #ifdef PIC
29 .section .bss
30         .align 3
31         .globl __curbrk
32 __curbrk: .skip 8
33         .type __curbrk,@object
34         .size __curbrk,8
35 #else
36 .comm __curbrk, 8
37 #endif
38
39         .text
40 LEAF(__brk, 8)
41         ldgp    gp, 0(t12)
42         subq    sp, 8, sp
43 #ifdef PROF
44         .set noat
45         lda     AT, _mcount
46         jsr     AT, (AT), _mcount
47         .set at
48 #endif
49         .prologue 1
50
51         /* Save the requested brk across the system call.  */
52         stq     a0, 0(sp)
53
54         ldiq    v0, __NR_brk
55         call_pal PAL_callsys
56
57         ldq     a0, 0(sp)
58
59         /* Be prepared for an OSF-style brk.  */
60         bne     a3, $err1
61         beq     v0, $ok
62
63         /* Correctly handle the brk(0) query case.  */
64         cmoveq  a0, v0, a0
65         xor     a0, v0, t0
66         bne     t0, $err0
67
68         /* Update __curbrk and return cleanly.  */
69         mov     zero, v0
70 $ok:    stq     a0, __curbrk
71         addq    sp, 8, sp
72         ret
73
74         /* What a horrible way to die.  */
75 $err0:  ldi     v0, ENOMEM
76 $err1:  addq    sp, 8, sp
77         SYSCALL_ERROR_HANDLER
78
79         END(__brk)
80
81 weak_alias (__brk, brk)