brk.S revision 1.13
11.13Sjoerg/* $NetBSD: brk.S,v 1.13 2013/09/12 15:36:15 joerg Exp $ */ 21.1Sthorpej 31.1Sthorpej#include "SYS.h" 41.1Sthorpej 51.11Smatt#if defined(LIBC_SCCS) && !defined(lint) 61.13Sjoerg__RCSID("$NetBSD: brk.S,v 1.13 2013/09/12 15:36:15 joerg Exp $") 71.11Smatt#endif /* LIBC_SCCS && !lint */ 81.11Smatt 91.5Skleink .globl _C_LABEL(__curbrk) 101.5Skleink .globl _C_LABEL(__minbrk) 111.6Skleink .globl _C_LABEL(_end) 121.4Stsubai 131.8Skleink#ifdef WEAK_ALIAS 141.8SkleinkWEAK_ALIAS(brk, _brk) 151.8Skleink#endif 161.8Skleink 171.4Stsubai .data 181.5Skleink_C_LABEL(__minbrk): 191.6Skleink .long _C_LABEL(_end) # XXX not used yet 201.1Sthorpej 211.1Sthorpej .text 221.8SkleinkENTRY(_brk) 231.13Sjoerg#ifdef __PIC__ 241.10Smatt mflr %r10 251.12Smatt PIC_GOTSETUP(%r9) 261.10Smatt mtlr %r10 271.10Smatt lwz %r5,_C_LABEL(_end)@got(%r9) 281.1Sthorpej#else 291.10Smatt lis %r5,_C_LABEL(_end)@ha # r5 = &_end 301.10Smatt addi %r5,%r5,_C_LABEL(_end)@l 311.4Stsubai#endif 321.10Smatt cmplw %r5,%r3 # if (&_end <= r3) 331.1Sthorpej bgt 0f 341.10Smatt mr %r5,%r3 # r5 = r3 351.1Sthorpej0: 361.10Smatt mr %r3,%r5 # new break value 371.11Smatt _DOSYSCALL(break) # assume, that r5 is kept 381.1Sthorpej bso 1f 391.13Sjoerg#ifdef __PIC__ 401.10Smatt lwz %r6,_C_LABEL(__curbrk)@got(%r9) 411.10Smatt stw %r5,0(%r6) 421.4Stsubai#else 431.10Smatt lis %r6,_C_LABEL(__curbrk)@ha # record new break 441.10Smatt stw %r5,_C_LABEL(__curbrk)@l(%r6) 451.4Stsubai#endif 461.1Sthorpej blr # return 0 471.1Sthorpej 481.1Sthorpej1: 491.11Smatt b _C_LABEL(__cerror) 501.11SmattEND(_brk) 51