1/*        $NetBSD: brk.S,v 1.14 2014/08/23 02:24:22 matt Exp $        */
2
3#include "SYS.h"
4
5#if defined(LIBC_SCCS) && !defined(lint)
6__RCSID("$NetBSD: brk.S,v 1.14 2014/08/23 02:24:22 matt Exp $")
7#endif /* LIBC_SCCS && !lint */
8
9          .hidden   _C_LABEL(__curbrk)
10          .globl    _C_LABEL(__curbrk)
11          .hidden   _C_LABEL(__minbrk)
12          .globl    _C_LABEL(__minbrk)
13          .globl    _C_LABEL(_end)
14
15#ifdef WEAK_ALIAS
16WEAK_ALIAS(brk, _brk)
17#endif
18
19          .data
20          .p2align 2
21_C_LABEL(__minbrk):
22          .long     _C_LABEL(_end)
23_C_LABEL(__curbrk):
24          .long     _C_LABEL(_end)
25
26ENTRY(_brk)
27#ifdef __PIC__
28          mflr      %r0
29          bcl       20,31,.LPIC0
30.LPIC0:   mflr    %r9
31          mtlr      %r0
32          addis     %r9,%r9,(_C_LABEL(__minbrk)-.LPIC0)@ha
33          ldptru    %r5,(_C_LABEL(__minbrk)-.LPIC0)@l(%r9)  # r5 = &_end
34#else
35          lis       %r9,_C_LABEL(__minbrk)@ha
36          ldptru    %r5,_C_LABEL(__minbrk)@l(%r9) # r5 = &_end
37#endif
38          cmpptrl   %r5,%r3                       # if (__minbrk <= r3)
39#ifdef __PPC_ISEL__
40          iselgt    %r3,%r5,%r3
41#else
42          bgt       0f
43          mr        %r5,%r3                       # r5 = r3
440:
45          mr        %r3,%r5                       # new break value
46#endif
47          _DOSYSCALL(break)             # assume that r5 is preserved
48          bso       1f
49          stptr     %r5,__SIZEOF_POINTER__(%r9)
50          blr                                     # return 0
51
521:
53          BRANCH_TO_CERROR()
54END(_brk)
55