diff options
author | Dale S. Rahn <rahnds@cvs.openbsd.org> | 1999-01-28 05:09:13 +0000 |
---|---|---|
committer | Dale S. Rahn <rahnds@cvs.openbsd.org> | 1999-01-28 05:09:13 +0000 |
commit | fbc0e1c495ad8420eeee19aca2c6728419d6a50e (patch) | |
tree | b7801acfbd7d2a385f40be9f9738e9d9a020f13a /lib/libc/arch/powerpc/sys/sbrk.S | |
parent | 77e7f92ea9e893c8442cf830daa9157055abaf77 (diff) |
Preliminary version for PIC support. Builds and runs standard and profiled
just fine. pic version has been compiled, but without a ld.so has not been
tested. Needs binutils 2.9.1 or later to build pic version.
Diffstat (limited to 'lib/libc/arch/powerpc/sys/sbrk.S')
-rw-r--r-- | lib/libc/arch/powerpc/sys/sbrk.S | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/lib/libc/arch/powerpc/sys/sbrk.S b/lib/libc/arch/powerpc/sys/sbrk.S index c54fa839e8a..0cf807a5d6a 100644 --- a/lib/libc/arch/powerpc/sys/sbrk.S +++ b/lib/libc/arch/powerpc/sys/sbrk.S @@ -4,16 +4,26 @@ .globl _end .globl curbrk .globl minbrk -curbrk: .long _end -minbrk: .long _end +_ASM_LABEL(curbrk): + .long _C_LABEL(end) +_ASM_LABEL(minbrk): + .long _C_LABEL(end) .text -PSEUDO_PREFIX(sbrk,break) +PREFIX2(sbrk,break) /* call break(curbrk + size) */ - addis 6,0,curbrk@h - ori 6,6,curbrk@l /* # 6 = &curbrk */ +#ifndef PIC + addis 6, 0, curbrk@H + ori 6, 6, curbrk@L /* # 6 = &curbrk */ +#else + mflr 10 + bl _GLOBAL_OFFSET_TABLE_@local-4 + mflr 4 + mtlr 10 + lwz 6,_ASM_LABEL(curbrk)@got(9) +#endif lwz 5, 0(6) /* # 5 = *6 (old_curbrk) */ add 3, 5, 3 /* # 3 = new_curbrk */ mr 7, 3 @@ -21,12 +31,12 @@ PSEUDO_PREFIX(sbrk,break) sc /* check for error */ - cmpwi 0, 0 - beq+ sbrk_ok /* OK so this is stupid but I haven't read b */ - b cerror + cmpwi 0, 0 + beq+ .L_sbrk_ok + b PIC_PLT(_ASM_LABEL(cerror)) /* update, curbrk and return */ -sbrk_ok: +.L_sbrk_ok: stw 7, 0(6) /* # remember, 6=&curbrk, 7=new_curbrk */ mr 3, 5 /* # remember, 5=old_curbrk */ blr |