brk.S revision 1.11
1/* $NetBSD: brk.S,v 1.11 2011/01/15 07:31:12 matt Exp $ */ 2 3#include "SYS.h" 4 5#if defined(LIBC_SCCS) && !defined(lint) 6__RCSID("$NetBSD: brk.S,v 1.11 2011/01/15 07:31:12 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 22 23ENTRY(_brk) 24#ifdef PIC 25 mflr %r10 26 bl _GLOBAL_OFFSET_TABLE_@local-4 27 mflr %r9 28 mtlr %r10 29 lwz %r5,_C_LABEL(_end)@got(%r9) 30#else 31 lis %r5,_C_LABEL(_end)@ha # r5 = &_end 32 addi %r5,%r5,_C_LABEL(_end)@l 33#endif 34 cmplw %r5,%r3 # if (&_end <= r3) 35 bgt 0f 36 mr %r5,%r3 # r5 = r3 370: 38 mr %r3,%r5 # new break value 39 _DOSYSCALL(break) # assume, that r5 is kept 40 bso 1f 41#ifdef PIC 42 lwz %r6,_C_LABEL(__curbrk)@got(%r9) 43 stw %r5,0(%r6) 44#else 45 lis %r6,_C_LABEL(__curbrk)@ha # record new break 46 stw %r5,_C_LABEL(__curbrk)@l(%r6) 47#endif 48 blr # return 0 49 501: 51 b _C_LABEL(__cerror) 52END(_brk) 53