1/* $NetBSD: brk.S,v 1.12 2011/01/16 02:43:10 matt Exp $ */ 2 3#include "SYS.h" 4 5#if defined(LIBC_SCCS) && !defined(lint) 6__RCSID("$NetBSD: brk.S,v 1.12 2011/01/16 02:43:10 matt Exp $") 7#endif /* LIBC_SCCS && !lint */ 8 9 .globl _C_LABEL(__curbrk) 10 .globl _C_LABEL(__minbrk) 11 .globl _C_LABEL(_end) 12 13#ifdef WEAK_ALIAS 14WEAK_ALIAS(brk, _brk) 15#endif 16 17 .data 18_C_LABEL(__minbrk): 19 .long _C_LABEL(_end) # XXX not used yet 20 21 .text 22ENTRY(_brk) 23#if defined(PIC) 24 mflr %r10 25 PIC_GOTSETUP(%r9) 26 mtlr %r10 27 lwz %r5,_C_LABEL(_end)@got(%r9) 28#else 29 lis %r5,_C_LABEL(_end)@ha # r5 = &_end 30 addi %r5,%r5,_C_LABEL(_end)@l 31#endif 32 cmplw %r5,%r3 # if (&_end <= r3) 33 bgt 0f 34 mr %r5,%r3 # r5 = r3 350: 36 mr %r3,%r5 # new break value 37 _DOSYSCALL(break) # assume, that r5 is kept 38 bso 1f 39#ifdef PIC 40 lwz %r6,_C_LABEL(__curbrk)@got(%r9) 41 stw %r5,0(%r6) 42#else 43 lis %r6,_C_LABEL(__curbrk)@ha # record new break 44 stw %r5,_C_LABEL(__curbrk)@l(%r6) 45#endif 46 blr # return 0 47 481: 49 b _C_LABEL(__cerror) 50END(_brk) 51