1/* $NetBSD: brk.S,v 1.10 2002/07/30 06:07:59 matt Exp $ */ 2 3#include "SYS.h" 4 5 .globl _C_LABEL(__curbrk) 6 .globl _C_LABEL(__minbrk) 7 .globl _C_LABEL(_end) 8 9#ifdef WEAK_ALIAS 10WEAK_ALIAS(brk, _brk) 11#endif 12 13 .data 14_C_LABEL(__minbrk): 15 .long _C_LABEL(_end) # XXX not used yet 16 17 .text 18 19ENTRY(_brk) 20#ifdef PIC 21 mflr %r10 22 bl _GLOBAL_OFFSET_TABLE_@local-4 23 mflr %r9 24 mtlr %r10 25 lwz %r5,_C_LABEL(_end)@got(%r9) 26#else 27 lis %r5,_C_LABEL(_end)@ha # r5 = &_end 28 addi %r5,%r5,_C_LABEL(_end)@l 29#endif 30 cmplw %r5,%r3 # if (&_end <= r3) 31 bgt 0f 32 mr %r5,%r3 # r5 = r3 330: 34 mr %r3,%r5 # new break value 35 li %r0,SYS_break 36 sc # assume, that r5 is kept 37 bso 1f 38#ifdef PIC 39 lwz %r6,_C_LABEL(__curbrk)@got(%r9) 40 stw %r5,0(%r6) 41#else 42 lis %r6,_C_LABEL(__curbrk)@ha # record new break 43 stw %r5,_C_LABEL(__curbrk)@l(%r6) 44#endif 45 blr # return 0 46 471: 48 b PIC_PLT(_C_LABEL(__cerror)) 49