]>
Commit | Line | Data |
---|---|---|
5e6f34c2 | 1 | /* Copyright (C) 1997, 2008 Free Software Foundation, Inc. |
5ae3e846 UD |
2 | This file is part of the GNU C Library. |
3 | Contributed by Richard Henderson <richard@gnu.ai.mit.edu>, 1997. | |
4 | ||
5 | The GNU C Library is free software; you can redistribute it and/or | |
41bdb6e2 AJ |
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. | |
5ae3e846 UD |
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 | |
41bdb6e2 | 13 | Lesser General Public License for more details. |
5ae3e846 | 14 | |
41bdb6e2 | 15 | You should have received a copy of the GNU Lesser General Public |
59ba27a6 PE |
16 | License along with the GNU C Library; if not, see |
17 | <http://www.gnu.org/licenses/>. */ | |
5ae3e846 UD |
18 | |
19 | /* __brk is a special syscall under Linux since it never returns an | |
20 | error. Instead, the error condition is indicated by returning the old | |
21 | break value (instead of the new, requested one). */ | |
22 | ||
23 | #include <sysdep.h> | |
24 | #define _ERRNO_H | |
25 | #include <bits/errno.h> | |
26 | ||
27 | #ifdef PIC | |
28 | .section .bss | |
29 | .align 8 | |
30 | .globl __curbrk | |
31 | __curbrk: .skip 8 | |
32 | .type __curbrk,@object | |
33 | .size __curbrk,8 | |
34 | #else | |
35 | .common __curbrk, 8, 8 | |
36 | #endif | |
37 | ||
38 | .text | |
043cee37 | 39 | ENTRY (__brk) |
9c4c0024 | 40 | save %sp, -192, %sp |
043cee37 RM |
41 | cfi_def_cfa_register(%fp) |
42 | cfi_window_save | |
43 | cfi_register(%o7, %i7) | |
5ae3e846 | 44 | #ifdef PIC |
3d2b3019 | 45 | SETUP_PIC_REG(l7) |
5ae3e846 UD |
46 | #endif |
47 | ||
48 | LOADSYSCALL(brk) | |
49 | mov %i0, %o0 | |
50 | ||
9c4c0024 | 51 | ta 0x6d |
5ae3e846 UD |
52 | |
53 | /* All the ways we can fail... */ | |
54 | bcs,pn %xcc, .Lerr1 | |
55 | nop | |
9c4c0024 | 56 | brz,pt %i0, .Lok |
5ae3e846 UD |
57 | subcc %i0, %o0, %g0 |
58 | bne,pn %xcc, .Lerr0 | |
9c4c0024 | 59 | nop |
5ae3e846 UD |
60 | |
61 | /* Update __curbrk and return cleanly. */ | |
3d2b3019 DM |
62 | .Lok: |
63 | #ifndef PIC | |
64 | sethi %hi(__curbrk), %g1 | |
5ae3e846 | 65 | or %g1, %lo(__curbrk), %g1 |
3d2b3019 | 66 | #else |
3d2b3019 DM |
67 | sethi %gdop_hix22(__curbrk), %g1 |
68 | xor %g1, %gdop_lox10(__curbrk), %g1 | |
69 | ldx [%l7 + %g1], %g1, %gdop(__curbrk) | |
5ae3e846 | 70 | #endif |
9c4c0024 | 71 | stx %o0, [%g1] |
5ae3e846 UD |
72 | mov %g0, %i0 |
73 | ||
74 | /* Don't use "ret" cause the preprocessor will eat it. */ | |
75 | jmpl %i7+8, %g0 | |
76 | restore | |
77 | ||
78 | /* What a horrible way to die. */ | |
79 | .Lerr0: set ENOMEM, %o0 | |
ac16e905 UD |
80 | .Lerr1: |
81 | #ifndef _LIBC_REENTRANT | |
3d2b3019 | 82 | #ifndef PIC |
ac16e905 | 83 | sethi %hi(errno), %g1 |
5ae3e846 | 84 | or %g1, %lo(errno), %g1 |
3d2b3019 | 85 | #else |
3d2b3019 DM |
86 | sethi %gdop_hix22(errno), %g1 |
87 | xor %g1, %gdop_lox10(errno), %g1 | |
88 | ldx [%l7 + %g1], %g1, %gdop(errno) | |
5ae3e846 | 89 | #endif |
9c4c0024 | 90 | st %o0, [%g1] |
5e6f34c2 JJ |
91 | #else |
92 | #ifndef NOT_IN_libc | |
93 | call HIDDEN_JUMPTARGET(__errno_location) | |
ac16e905 | 94 | #else |
5ae3e846 | 95 | call __errno_location |
5e6f34c2 | 96 | #endif |
5ae3e846 UD |
97 | mov %o0,%l1 |
98 | st %l1, [%o0] | |
99 | #endif | |
100 | sub %g0, 1, %i0 | |
101 | jmpl %i7+8, %g0 | |
102 | restore | |
043cee37 | 103 | END (__brk) |
5ae3e846 UD |
104 | |
105 | weak_alias (__brk, brk) |