brk.S revision 1.3
1#include "SYS.h" 2 3 .extern curbrk 4 .extern _C_LABEL(end) 5 6PREFIX2(brk,break) 7 8 /* check >= _end, if not make the call for _end */ 9#ifndef PIC 10 addis 5,0,_C_LABEL(end)@h 11 ori 5,5,_C_LABEL(end)@l /* # 5 = &_end */ 12#else 13 mflr 10 14 bl _GLOBAL_OFFSET_TABLE_@local-4 15 mflr 9 16 mtlr 10 17 lwz 5,_C_LABEL(end)@got(9) 18#endif 19 cmpw 3,5 20 bge+ .L_brk_call 21 mr 3, 5 22 23.L_brk_call: 24 mr 7, 3 25 /* call break(size) */ 26#ifndef PIC 27 addis 6, 0, curbrk@H 28 ori 6, 6, curbrk@L /* # 6 = &curbrk */ 29#else 30 lwz 6,_ASM_LABEL(curbrk)@got(9) 31#endif 32 33 sc 34 35 /* check for error */ 36 cmpwi 0, 0 37 beq+ .L_brk_ok /* OK so this is stupid but I haven't read b */ 38 b PIC_PLT(_ASM_LABEL(cerror)) 39 40 /* update, curbrk and return */ 41.L_brk_ok: 42 stw 7, 0(6) /* # remember, 6=&curbrk, 3= new value */ 43 mr 3, 0 /* # return 0 */ 44 blr 45