This is the mail archive of the libc-hacker@sourceware.cygnus.com mailing list for the glibc project.
Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
[ Uli, if Geoff must approve the file with binary changes, could you
please approve the ones files that have no binary differences? ]
Only one file shows binary differences for non-BP:
--- /home/gkm/libc/NATIVE-powerpc-unknown-linux-gnu/string/strchr.dis Fri Jun 30 13:27:15 2000
+++ /home/gkm/libc-bp/NATIVE-powerpc-unknown-linux-gnu/string/strchr.dis Fri Jun 30 13:27:20 2000
@@ -1,60 +1,60 @@
string/strchr.o: file format elf32-powerpc
Disassembly of section .text:
00000000 <strchr>:
0: 50 84 44 2e rlwimi r4,r4,8,16,23
4: 39 60 ff ff li r11,-1
8: 50 84 80 1e rlwimi r4,r4,16,0,15
- c: 3c c0 fe ff lis r6,-257
- 10: 3c e0 7f 7f lis r7,32639
- 14: 54 68 00 3a rlwinm r8,r3,0,0,29
- 18: 38 e7 7f 7f addi r7,r7,32639
- 1c: 38 c6 fe ff addi r6,r6,-257
- 20: 54 6a 1e f8 rlwinm r10,r3,3,27,28 <<<< move this ...
- 24: 80 a8 00 00 lwz r5,0(r8)
+ c: 54 6a 1e f8 rlwinm r10,r3,3,27,28 <<<< ... up, so that it precedes ...
+ 10: 3c c0 fe ff lis r6,-257
+ 14: 3c e0 7f 7f lis r7,32639
+ 18: 54 63 00 3a rlwinm r3,r3,0,0,29 <<<< ... this
+ 1c: 38 e7 7f 7f addi r7,r7,32639
+ 20: 38 c6 fe ff addi r6,r6,-257
+ 24: 80 a3 00 00 lwz r5,0(r3)
28: 7d 6b 54 30 srw r11,r11,r10
2c: 7c a5 5b 38 orc r5,r5,r11
30: 7c 06 2a 14 add r0,r6,r5
34: 7c e9 28 f8 nor r9,r7,r5
38: 7c 00 48 39 and. r0,r0,r9
3c: 7c 8c 2a 78 xor r12,r4,r5
40: 7d 8c 5b 38 orc r12,r12,r11
44: 48 00 00 20 b 64 <strchr+0x64>
- 48: 84 a8 00 04 lwzu r5,4(r8)
+ 48: 84 a3 00 04 lwzu r5,4(r3)
4c: 7c 00 48 39 and. r0,r0,r9
50: 7c 06 2a 14 add r0,r6,r5
54: 7c e9 28 f8 nor r9,r7,r5
58: 40 82 00 5c bne b4 <strchr+0xb4>
5c: 7c 00 48 39 and. r0,r0,r9
60: 7c 8c 2a 78 xor r12,r4,r5
64: 7c 06 62 14 add r0,r6,r12
68: 7c e9 60 f8 nor r9,r7,r12
6c: 41 82 ff dc beq 48 <strchr+0x48>
70: 7c 00 48 39 and. r0,r0,r9
74: 38 60 00 00 li r3,0
78: 4d 82 00 20 beqlr
7c: 7c e6 28 38 and r6,r7,r5
80: 7c eb 2b 78 or r11,r7,r5
84: 7c e0 60 38 and r0,r7,r12
88: 7c ea 63 78 or r10,r7,r12
8c: 7c c6 3a 14 add r6,r6,r7
90: 7c 00 3a 14 add r0,r0,r7
94: 7d 65 30 f8 nor r5,r11,r6
98: 7d 49 00 f8 nor r9,r10,r0
9c: 7c 05 48 40 cmplw r5,r9
a0: 4d 81 00 20 bgtlr
a4: 7d 24 00 34 cntlzw r4,r9
a8: 54 84 e8 fe rlwinm r4,r4,29,3,31
- ac: 7c 68 22 14 add r3,r8,r4
+ ac: 7c 63 22 14 add r3,r3,r4
b0: 4e 80 00 20 blr
b4: 7c e0 60 38 and r0,r7,r12
b8: 7c ea 63 78 or r10,r7,r12
bc: 7c 00 3a 14 add r0,r0,r7
c0: 7d 49 00 f8 nor r9,r10,r0
c4: 7d 24 00 34 cntlzw r4,r9
- c8: 39 08 ff fc addi r8,r8,-4
+ c8: 38 63 ff fc addi r3,r3,-4
cc: 54 84 e8 fe rlwinm r4,r4,29,3,31
- d0: 7c 68 22 14 add r3,r8,r4
+ d0: 7c 63 22 14 add r3,r3,r4
d4: 4e 80 00 20 blr
[ basically, s/r8/r3/g, which necessitates the insn move above
so that we can use r3's value before it's altered. ]
2000-06-30 Greg McGary <greg@mcgary.org>
* sysdeps/powerpc/bp-asm.h: New file.
* sysdeps/powerpc/__longjmp.S: Check bounds.
Wrap extern symbols in BP_SYM ().
* sysdeps/powerpc/bsd-_setjmp.S: Likewise.
* sysdeps/powerpc/bsd-setjmp.S: Likewise.
* sysdeps/powerpc/setjmp.S: Likewise.
* sysdeps/powerpc/add_n.S: Likewise.
* sysdeps/powerpc/addmul_1.S: Likewise.
* sysdeps/powerpc/lshift.S: Likewise.
* sysdeps/powerpc/rshift.S: Likewise.
* sysdeps/powerpc/mul_1.S: Likewise.
* sysdeps/powerpc/sub_n.S: Likewise.
* sysdeps/powerpc/submul_1.S: Likewise.
* sysdeps/powerpc/strlen.S: Likewise.
* sysdeps/powerpc/memset.S: Likewise.
* sysdeps/powerpc/stpcpy.S: Likewise.
* sysdeps/powerpc/strchr.S: Likewise.
* sysdeps/powerpc/strcmp.S: Likewise.
* sysdeps/powerpc/strcpy.S: Likewise.
* sysdeps/powerpc/elf/bzero.S: Likewise.
Index: sysdeps/powerpc/bp-asm.h
===================================================================
RCS file: bp-asm.h
diff -N bp-asm.h
--- /dev/null Tue May 5 13:32:27 1998
+++ bp-asm.h Fri Jun 30 12:20:48 2000
@@ -0,0 +1,115 @@
+/* Bounded-pointer definitions for PowerPC assembler.
+ Copyright (C) 2000 Free Software Foundation, Inc.
+ Contributed by Greg McGary <greg@mcgary.org>
+
+ This file is part of the GNU C Library. Its master source is NOT part of
+ the C library, however. The master source lives in the GNU MP Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#if __BOUNDED_POINTERS__
+
+/* Byte offsets of BP components. */
+# define oVALUE 0
+# define oLOW 4
+# define oHIGH 8
+
+/* Don't check bounds, just convert the BP register to its simple
+ pointer value. */
+
+# define UNCHECK_BOUNDS(rBP) \
+ lwz rBP, oVALUE(rBP)
+
+/* Check low bound, with the side effect that the BP register is converted
+ its simple pointer value. Move the high bound into a register for
+ later use. */
+
+# define CHECK_BOUNDS_LOW(rBP, rLOW, rHIGH) \
+ lwz rHIGH, oHIGH(rBP); \
+ lwz rLOW, oLOW(rBP); \
+ lwz rBP, oVALUE(rBP); \
+ twllt rBP, rLOW
+
+/* Check the high bound, which is in a register, using the given
+ conditional trap instruction. */
+
+# define CHECK_BOUNDS_HIGH(rVALUE, rHIGH, TWLcc) \
+ TWLcc rVALUE, rHIGH
+
+/* Check the high bound, which is stored at the return-value's high
+ bound slot, using the given conditional trap instruction. */
+
+# define CHECK_BOUNDS_HIGH_RTN(rVALUE, rHIGH, TWLcc) \
+ lwz rHIGH, oHIGH(rRTN); \
+ TWLcc rVALUE, rHIGH
+
+/* Check both bounds, with the side effect that the BP register is
+ converted to its simple pointer value. */
+
+# define CHECK_BOUNDS_BOTH(rBP, rLOW, rHIGH) \
+ CHECK_BOUNDS_LOW(rBP, rLOW, rHIGH); \
+ twlge rBP, rHIGH
+
+/* Check bounds on a memory region of given length, with the side
+ effect that the BP register is converted to its simple pointer
+ value. */
+
+# define CHECK_BOUNDS_BOTH_WIDE(rBP, rLOW, rHIGH, rLENGTH) \
+ CHECK_BOUNDS_LOW (rBP, rLOW, rHIGH); \
+ sub rHIGH, rHIGH, rLENGTH; \
+ twlgt rBP, rHIGH
+
+# define CHECK_BOUNDS_BOTH_WIDE_LIT(rBP, rLOW, rHIGH, LENGTH) \
+ CHECK_BOUNDS_LOW (rBP, rLOW, rHIGH); \
+ subi rHIGH, rHIGH, LENGTH; \
+ twlgt rBP, rHIGH
+
+/* Store a pointer value register into the return-value's pointer
+ value slot. */
+
+# define STORE_RETURN_VALUE(rVALUE) \
+ stw rVALUE, oVALUE(rRTN)
+
+/* Store a low and high bounds into the return-value's pointer bounds
+ slots. */
+
+# define STORE_RETURN_BOUNDS(rLOW, rHIGH) \
+ stw rLOW, oLOW(rRTN); \
+ stw rHIGH, oHIGH(rRTN)
+
+/* Stuff zero value/low/high into the BP addressed by rRTN. */
+
+# define RETURN_NULL_BOUNDED_POINTER \
+ li r4, 0; \
+ STORE_RETURN_VALUE (r4); \
+ STORE_RETURN_BOUNDS (r4, r4)
+
+#else
+
+# define UNCHECK_BOUNDS(rBP)
+# define CHECK_BOUNDS_LOW(rBP, rLOW, rHIGH)
+# define CHECK_BOUNDS_HIGH(rVALUE, rHIGH, TWLcc)
+# define CHECK_BOUNDS_HIGH_RTN(rVALUE, rHIGH, TWLcc)
+# define CHECK_BOUNDS_BOTH(rBP, rLOW, rHIGH)
+# define CHECK_BOUNDS_BOTH_WIDE(rBP, rLOW, rHIGH, rLENGTH)
+# define CHECK_BOUNDS_BOTH_WIDE_LIT(rBP, rLOW, rHIGH, LENGTH)
+# define STORE_RETURN_VALUE(rVALUE)
+# define STORE_RETURN_BOUNDS(rLOW, rHIGH)
+
+# define RETURN_NULL_BOUNDED_POINTER li rRTN, 0
+
+#endif
+
Index: sysdeps/powerpc/__longjmp.S
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/powerpc/__longjmp.S,v
retrieving revision 1.9
diff -u -p -r1.9 __longjmp.S
--- __longjmp.S 1999/10/11 23:08:14 1.9
+++ __longjmp.S 2000/06/30 19:20:48
@@ -1,5 +1,5 @@
/* longjmp for PowerPC.
- Copyright (C) 1995, 1996, 1997, 1999 Free Software Foundation, Inc.
+ Copyright (C) 1995, 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -21,8 +21,12 @@
#define _ASM
#define _SETJMP_H
#include <bits/setjmp.h>
+#include <bp-sym.h>
+#include <bp-asm.h>
-ENTRY (__longjmp)
+ENTRY (BP_SYM (__longjmp))
+ CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE)
+
lwz r1,(JB_GPR1*4)(r3)
lwz r2,(JB_GPR2*4)(r3)
lwz r0,(JB_LR*4)(r3)
@@ -67,4 +71,4 @@ ENTRY (__longjmp)
lfd fp31,((JB_FPRS+17*2)*4)(r3)
mr r3,r4
blr
-END (__longjmp)
+END (BP_SYM (__longjmp))
Index: sysdeps/powerpc/add_n.S
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/powerpc/add_n.S,v
retrieving revision 1.3
diff -u -p -r1.3 add_n.S
--- add_n.S 2000/02/28 22:15:38 1.3
+++ add_n.S 2000/06/30 19:20:48
@@ -18,6 +18,8 @@
Boston, MA 02111-1307, USA. */
#include <sysdep.h>
+#include <bp-sym.h>
+#include <bp-asm.h>
/* mp_limb_t mpn_add_n (mp_ptr res_ptr, mp_srcptr s1_ptr, mp_srcptr s2_ptr,
mp_size_t size)
@@ -27,7 +29,14 @@
possible 2-unrolled inner loop will not be. Also, watch out for the
alignment... */
-EALIGN(__mpn_add_n,3,0)
+EALIGN (BP_SYM (__mpn_add_n), 3, 0)
+
+#if __BOUNDED_POINTERS__
+ slwi r10,r6,2 /* convert limbs to bytes */
+ CHECK_BOUNDS_BOTH_WIDE (r3, r8, r9, r10)
+ CHECK_BOUNDS_BOTH_WIDE (r4, r8, r9, r10)
+ CHECK_BOUNDS_BOTH_WIDE (r5, r8, r9, r10)
+#endif
/* Set up for loop below. */
mtcrf 0x01,r6
srwi. r7,r6,1
@@ -65,4 +74,4 @@ L(0): lwz r9,4(r4)
/* Return the carry. */
L(1): addze r3,r10
blr
-END(__mpn_add_n)
+END (BP_SYM (__mpn_add_n))
Index: sysdeps/powerpc/addmul_1.S
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/powerpc/addmul_1.S,v
retrieving revision 1.3
diff -u -p -r1.3 addmul_1.S
--- addmul_1.S 2000/02/28 22:16:33 1.3
+++ addmul_1.S 2000/06/30 19:20:48
@@ -18,11 +18,18 @@
Boston, MA 02111-1307, USA. */
#include <sysdep.h>
+#include <bp-sym.h>
+#include <bp-asm.h>
/* mp_limb_t mpn_addmul_1 (mp_ptr res_ptr, mp_srcptr s1_ptr,
mp_size_t s1_size, mp_limb_t s2_limb)
Calculate res+s1*s2 and put result back in res; return carry. */
-ENTRY(__mpn_addmul_1)
+ENTRY (BP_SYM (__mpn_addmul_1))
+#if __BOUNDED_POINTERS__
+ slwi r10,r5,2 /* convert limbs to bytes */
+ CHECK_BOUNDS_BOTH_WIDE (r3, r8, r9, r10)
+ CHECK_BOUNDS_BOTH_WIDE (r4, r8, r9, r10)
+#endif
mtctr r5
lwz r0,0(r4)
@@ -46,4 +53,4 @@ L(0): lwzu r0,4(r4)
L(1): stw r8,4(r3)
addze r3,r10
blr
-END(__mpn_addmul_1)
+END (BP_SYM (__mpn_addmul_1))
Index: sysdeps/powerpc/bsd-_setjmp.S
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/powerpc/bsd-_setjmp.S,v
retrieving revision 1.5
diff -u -p -r1.5 bsd-_setjmp.S
--- bsd-_setjmp.S 1999/10/11 22:13:05 1.5
+++ bsd-_setjmp.S 2000/06/30 19:20:48
@@ -1,5 +1,5 @@
/* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. PowerPC version.
- Copyright (C) 1994, 1997, 1999 Free Software Foundation, Inc.
+ Copyright (C) 1994, 1997, 1999, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -22,8 +22,9 @@
in setjmp doesn't clobber the state restored by longjmp. */
#include <sysdep.h>
+#include <bp-sym.h>
-ENTRY (_setjmp)
+ENTRY (BP_SYM (_setjmp))
li r4,0 /* Set second argument to 0. */
- b JUMPTARGET(__sigsetjmp)
-END (_setjmp)
+ b JUMPTARGET(BP_SYM (__sigsetjmp))
+END (BP_SYM (_setjmp))
Index: sysdeps/powerpc/bsd-setjmp.S
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/powerpc/bsd-setjmp.S,v
retrieving revision 1.5
diff -u -p -r1.5 bsd-setjmp.S
--- bsd-setjmp.S 1999/10/11 22:13:19 1.5
+++ bsd-setjmp.S 2000/06/30 19:20:48
@@ -1,5 +1,5 @@
/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. PowerPC version.
- Copyright (C) 1994, 1997, 1999 Free Software Foundation, Inc.
+ Copyright (C) 1994, 1997, 1999, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -22,11 +22,12 @@
in setjmp doesn't clobber the state restored by longjmp. */
#include <sysdep.h>
+#include <bp-sym.h>
-ENTRY (__setjmp)
+ENTRY (BP_SYM (__setjmp))
li r4,1 /* Set second argument to 1. */
- b JUMPTARGET(__sigsetjmp)
-END (__setjmp)
+ b JUMPTARGET(BP_SYM (__sigsetjmp))
+END (BP_SYM (__setjmp))
- .globl setjmp
- .set setjmp,__setjmp
+ .globl BP_SYM (setjmp)
+ .set BP_SYM (setjmp), BP_SYM (__setjmp)
Index: sysdeps/powerpc/lshift.S
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/powerpc/lshift.S,v
retrieving revision 1.3
diff -u -p -r1.3 lshift.S
--- lshift.S 2000/02/28 22:17:44 1.3
+++ lshift.S 2000/06/30 19:20:48
@@ -18,11 +18,19 @@
Boston, MA 02111-1307, USA. */
#include <sysdep.h>
+#include <bp-sym.h>
+#include <bp-asm.h>
/* mp_limb_t mpn_lshift (mp_ptr wp, mp_srcptr up, mp_size_t usize,
unsigned int cnt) */
-EALIGN(__mpn_lshift,3,0)
+EALIGN (BP_SYM (__mpn_lshift), 3, 0)
+
+#if __BOUNDED_POINTERS__
+ slwi r10,r5,2 /* convert limbs to bytes */
+ CHECK_BOUNDS_BOTH_WIDE (r3, r8, r9, r10)
+ CHECK_BOUNDS_BOTH_WIDE (r4, r8, r9, r10)
+#endif
mtctr r5 # copy size into CTR
cmplwi cr0,r5,16 # is size < 16
slwi r0,r5,2
@@ -120,4 +128,4 @@ L(n): lwzu r10,-4(r4); \
DO_LSHIFT(30)
DO_LSHIFT(31)
-END(__mpn_lshift)
+END (BP_SYM (__mpn_lshift))
Index: sysdeps/powerpc/mul_1.S
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/powerpc/mul_1.S,v
retrieving revision 1.3
diff -u -p -r1.3 mul_1.S
--- mul_1.S 2000/02/28 22:20:39 1.3
+++ mul_1.S 2000/06/30 19:20:48
@@ -18,12 +18,19 @@
Boston, MA 02111-1307, USA. */
#include <sysdep.h>
+#include <bp-sym.h>
+#include <bp-asm.h>
/* mp_limb_t mpn_mul_1 (mp_ptr res_ptr, mp_srcptr s1_ptr,
mp_size_t s1_size, mp_limb_t s2_limb)
Calculate s1*s2 and put result in res_ptr; return carry. */
-ENTRY(__mpn_mul_1)
+ENTRY (BP_SYM (__mpn_mul_1))
+#if __BOUNDED_POINTERS__
+ slwi r10,r5,2 /* convert limbs to bytes */
+ CHECK_BOUNDS_BOTH_WIDE (r3, r8, r9, r10)
+ CHECK_BOUNDS_BOTH_WIDE (r4, r8, r9, r10)
+#endif
mtctr r5
lwz r0,0(r4)
@@ -43,4 +50,4 @@ L(0): lwzu r0,4(r4)
L(1): stw r7,4(r3)
addze r3,r10
blr
-END(__mpn_mul_1)
+END (BP_SYM (__mpn_mul_1))
Index: sysdeps/powerpc/rshift.S
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/powerpc/rshift.S,v
retrieving revision 1.3
diff -u -p -r1.3 rshift.S
--- rshift.S 2000/02/28 22:21:33 1.3
+++ rshift.S 2000/06/30 19:20:48
@@ -18,6 +18,8 @@
Boston, MA 02111-1307, USA. */
#include <sysdep.h>
+#include <bp-sym.h>
+#include <bp-asm.h>
/* INPUT PARAMETERS
res_ptr r3
@@ -25,7 +27,12 @@
size r5
cnt r6 */
-ENTRY(__mpn_rshift)
+ENTRY (BP_SYM (__mpn_rshift))
+#if __BOUNDED_POINTERS__
+ slwi r10,r5,2 /* convert limbs to bytes */
+ CHECK_BOUNDS_BOTH_WIDE (r3, r8, r9, r10)
+ CHECK_BOUNDS_BOTH_WIDE (r4, r8, r9, r10)
+#endif
mtctr r5 # copy size into CTR
addi r7,r3,-4 # move adjusted res_ptr to free return reg
subfic r8,r6,32
@@ -53,4 +60,4 @@ L(1): srw r0,r11,r6
L(2): srw r0,r10,r6
stw r0,4(r7)
blr
-END(__mpn_rshift)
+END (BP_SYM (__mpn_rshift))
Index: sysdeps/powerpc/setjmp.S
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/powerpc/setjmp.S,v
retrieving revision 1.9
diff -u -p -r1.9 setjmp.S
--- setjmp.S 1999/10/11 23:06:33 1.9
+++ setjmp.S 2000/06/30 19:20:48
@@ -1,5 +1,5 @@
/* setjmp for PowerPC.
- Copyright (C) 1995, 1996, 1997, 1999 Free Software Foundation, Inc.
+ Copyright (C) 1995, 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -21,8 +21,12 @@
#define _ASM
#define _SETJMP_H
#include <bits/setjmp.h>
+#include <bp-sym.h>
+#include <bp-asm.h>
-ENTRY (__sigsetjmp)
+ENTRY (BP_SYM (__sigsetjmp))
+ CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE)
+
stw r1,(JB_GPR1*4)(3)
mflr r0
stw r2,(JB_GPR2*4)(3)
@@ -65,5 +69,5 @@ ENTRY (__sigsetjmp)
stfd fp30,((JB_FPRS+16*2)*4)(3)
stw r31,((JB_GPRS+17)*4)(3)
stfd fp31,((JB_FPRS+17*2)*4)(3)
- b JUMPTARGET(__sigjmp_save)
-END (__sigsetjmp)
+ b JUMPTARGET (BP_SYM (__sigjmp_save))
+END (BP_SYM (__sigsetjmp))
Index: sysdeps/powerpc/strlen.S
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/powerpc/strlen.S,v
retrieving revision 1.5
diff -u -p -r1.5 strlen.S
--- strlen.S 2000/06/06 22:37:40 1.5
+++ strlen.S 2000/06/30 19:20:48
@@ -18,6 +18,8 @@
Boston, MA 02111-1307, USA. */
#include <sysdep.h>
+#include <bp-sym.h>
+#include <bp-asm.h>
/* The algorithm here uses the following techniques:
@@ -71,7 +73,7 @@
/* int [r3] strlen (char *s [r3]) */
-ENTRY (strlen)
+ENTRY (BP_SYM (strlen))
#define rTMP1 r0
#define rRTN r3 /* incoming STR arg, outgoing result */
@@ -87,6 +89,8 @@ ENTRY (strlen)
#define rTMP3 r11
#define rTMP4 r12
+ CHECK_BOUNDS_LOW (rRTN, rTMP1, rTMP2)
+
clrrwi rSTR, rRTN, 2
lis r7F7F, 0x7f7f
rlwinm rPADN, rRTN, 3, 27, 28
@@ -150,5 +154,6 @@ L(done0):
subf rTMP1, rRTN, rSTR
srwi rTMP3, rTMP3, 3
add rRTN, rTMP1, rTMP3
+ /* GKM FIXME: check high bound. */
blr
-END (strlen)
+END (BP_SYM (strlen))
Index: sysdeps/powerpc/sub_n.S
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/powerpc/sub_n.S,v
retrieving revision 1.3
diff -u -p -r1.3 sub_n.S
--- sub_n.S 2000/02/28 22:34:10 1.3
+++ sub_n.S 2000/06/30 19:20:48
@@ -18,6 +18,8 @@
Boston, MA 02111-1307, USA. */
#include <sysdep.h>
+#include <bp-sym.h>
+#include <bp-asm.h>
/* mp_limb_t mpn_sub_n (mp_ptr res_ptr, mp_srcptr s1_ptr, mp_srcptr s2_ptr,
mp_size_t size)
@@ -27,7 +29,15 @@
possible 2-unrolled inner loop will not be. Also, watch out for the
alignment... */
-EALIGN(__mpn_sub_n,3,1)
+EALIGN (BP_SYM (__mpn_sub_n), 3, 1)
+
+#if __BOUNDED_POINTERS__
+ slwi r10,r6,2 /* convert limbs to bytes */
+ CHECK_BOUNDS_BOTH_WIDE (r3, r8, r9, r10)
+ CHECK_BOUNDS_BOTH_WIDE (r4, r8, r9, r10)
+ CHECK_BOUNDS_BOTH_WIDE (r5, r8, r9, r10)
+#endif
+
/* Set up for loop below. */
mtcrf 0x01,r6
srwi. r7,r6,1
@@ -65,4 +75,4 @@ L(0):
L(1): subfe r3,r3,r3
neg r3,r3
blr
-END(__mpn_sub_n)
+END (BP_SYM (__mpn_sub_n))
Index: sysdeps/powerpc/submul_1.S
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/powerpc/submul_1.S,v
retrieving revision 1.3
diff -u -p -r1.3 submul_1.S
--- submul_1.S 2000/02/28 22:34:48 1.3
+++ submul_1.S 2000/06/30 19:20:48
@@ -18,12 +18,19 @@
Boston, MA 02111-1307, USA. */
#include <sysdep.h>
+#include <bp-sym.h>
+#include <bp-asm.h>
/* mp_limb_t mpn_submul_1 (mp_ptr res_ptr, mp_srcptr s1_ptr,
mp_size_t s1_size, mp_limb_t s2_limb)
Calculate res-s1*s2 and put result back in res; return carry. */
-ENTRY(__mpn_submul_1)
+ENTRY (BP_SYM (__mpn_submul_1))
+#if __BOUNDED_POINTERS__
+ slwi r10,r5,2 /* convert limbs to bytes */
+ CHECK_BOUNDS_BOTH_WIDE (r3, r8, r9, r10)
+ CHECK_BOUNDS_BOTH_WIDE (r4, r8, r9, r10)
+#endif
mtctr r5
lwz r0,0(r4)
@@ -49,4 +56,4 @@ L(0): lwzu r0,4(r4)
L(1): stw r8,4(r3)
addze r3,r10
blr
-END(__mpn_submul_1)
+END (BP_SYM (__mpn_submul_1))
Index: sysdeps/powerpc/memset.S
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/powerpc/memset.S,v
retrieving revision 1.5
diff -u -p -r1.5 memset.S
--- memset.S 2000/06/06 22:37:40 1.5
+++ memset.S 2000/06/30 19:20:48
@@ -18,6 +18,8 @@
Boston, MA 02111-1307, USA. */
#include <sysdep.h>
+#include <bp-sym.h>
+#include <bp-asm.h>
/* __ptr_t [r3] memset (__ptr_t s [r3], int c [r4], size_t n [r5]));
Returns 's'.
@@ -26,13 +28,21 @@
cache line (256 bits). There is a special case for setting cache lines
to 0, to take advantage of the dcbz instruction. */
-EALIGN (memset, 5, 1)
+EALIGN (BP_SYM (memset), 5, 1)
#define rTMP r0
-#define rRTN r3 /* initial value of 1st argument */
-#define rCHR r4 /* char to set in each byte */
-#define rLEN r5 /* length of region to set */
-#define rMEMP r6 /* address at which we are storing */
+#define rRTN r3 /* initial value of 1st argument */
+#if __BOUNDED_POINTERS__
+# define rMEMP0 r4 /* original value of 1st arg */
+# define rCHR r5 /* char to set in each byte */
+# define rLEN r6 /* length of region to set */
+# define rMEMP r10 /* address at which we are storing */
+#else
+# define rMEMP0 r3 /* original value of 1st arg */
+# define rCHR r4 /* char to set in each byte */
+# define rLEN r5 /* length of region to set */
+# define rMEMP r6 /* address at which we are storing */
+#endif
#define rALIGN r7 /* number of bytes we are setting now (when aligning) */
#define rMEMP2 r8
@@ -40,21 +50,29 @@ EALIGN (memset, 5, 1)
#define rNEG64 r8 /* constant -64 for clearing with dcbz */
#define rNEG32 r9 /* constant -32 for clearing with dcbz */
+#if __BOUNDED_POINTERS__
+ cmplwi cr1, rRTN, 0
+ CHECK_BOUNDS_BOTH_WIDE (rMEMP0, rTMP, rTMP2, rLEN)
+ beq cr1, L(b0)
+ STORE_RETURN_VALUE (rMEMP0)
+ STORE_RETURN_BOUNDS (rTMP, rTMP2)
+L(b0):
+#endif
+ mr rMEMP, rMEMP0
/* take care of case for size <= 4 */
cmplwi cr1, rLEN, 4
- andi. rALIGN, rRTN, 3
- mr rMEMP, rRTN
+ andi. rALIGN, rMEMP, 3
ble- cr1, L(small)
/* align to word boundary */
cmplwi cr5, rLEN, 31
rlwimi rCHR, rCHR, 8, 16, 23
beq+ L(aligned) /* 8th instruction from .align */
- mtcrf 0x01, rRTN
+ mtcrf 0x01, rMEMP
subfic rALIGN, rALIGN, 4
add rMEMP, rMEMP, rALIGN
sub rLEN, rLEN, rALIGN
bf+ 31, L(g0)
- stb rCHR, 0(rRTN)
+ stb rCHR, 0(rMEMP0)
bt 30, L(aligned)
L(g0): sth rCHR, -2(rMEMP) /* 16th instruction from .align */
/* take care of case for size < 31 */
@@ -207,4 +225,4 @@ L(medium_28t):
stw rCHR, -4(rMEMP)
stw rCHR, -8(rMEMP)
blr
-END(memset)
+END (BP_SYM (memset))
Index: sysdeps/powerpc/stpcpy.S
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/powerpc/stpcpy.S,v
retrieving revision 1.4
diff -u -p -r1.4 stpcpy.S
--- stpcpy.S 2000/06/30 18:26:00 1.4
+++ stpcpy.S 2000/06/30 19:20:48
@@ -18,22 +18,36 @@
Boston, MA 02111-1307, USA. */
#include <sysdep.h>
+#include <bp-sym.h>
+#include <bp-asm.h>
/* See strlen.s for comments on how the end-of-string testing works. */
/* char * [r3] stpcpy (char *dest [r3], const char *src [r4]) */
-EALIGN (__stpcpy, 4, 0)
+EALIGN (BP_SYM (__stpcpy), 4, 0)
#define rTMP r0
-#define rDEST r3 /* pointer to previous word in dest */
-#define rSRC r4 /* pointer to previous word in src */
+#define rRTN r3
+#if __BOUNDED_POINTERS__
+# define rDEST r4 /* pointer to previous word in dest */
+# define rSRC r5 /* pointer to previous word in src */
+# define rLOW r11
+# define rHIGH r12
+#else
+# define rDEST r3 /* pointer to previous word in dest */
+# define rSRC r4 /* pointer to previous word in src */
+#endif
#define rWORD r6 /* current word from src */
#define rFEFE r7 /* 0xfefefeff */
#define r7F7F r8 /* 0x7f7f7f7f */
#define rNEG r9 /* ~(word in src | 0x7f7f7f7f) */
#define rALT r10 /* alternate word from src */
+ CHECK_BOUNDS_LOW (rSRC, rLOW, rHIGH)
+ CHECK_BOUNDS_LOW (rDEST, rLOW, rHIGH)
+ STORE_RETURN_BOUNDS (rLOW, rHIGH)
+
or rTMP, rSRC, rDEST
clrlwi. rTMP, rTMP, 30
addi rDEST, rDEST, -4
@@ -71,6 +85,8 @@ L(g1): rlwinm. rTMP, rALT, 8, 24, 31
stbu rTMP, 1(rDEST)
beqlr-
stbu rALT, 1(rDEST)
+ CHECK_BOUNDS_HIGH (rDEST, rHIGH, twlgt)
+ STORE_RETURN_VALUE (rDEST)
blr
/* Oh well. In this case, we just do a byte-by-byte copy. */
@@ -92,9 +108,13 @@ L(u0): lbzu rALT, 1(rSRC)
cmpwi rWORD, 0
bne+ L(u0)
L(u2): stbu rWORD, 1(rDEST)
+ CHECK_BOUNDS_HIGH (rDEST, rHIGH, twlgt)
+ STORE_RETURN_VALUE (rDEST)
blr
L(u1): stbu rALT, 1(rDEST)
+ CHECK_BOUNDS_HIGH (rDEST, rHIGH, twlgt)
+ STORE_RETURN_VALUE (rDEST)
blr
-END (__stpcpy)
+END (BP_SYM (__stpcpy))
-weak_alias (__stpcpy, stpcpy)
+weak_alias (BP_SYM (__stpcpy), BP_SYM (stpcpy))
Index: sysdeps/powerpc/strchr.S
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/powerpc/strchr.S,v
retrieving revision 1.3
diff -u -p -r1.3 strchr.S
--- strchr.S 2000/06/06 22:37:40 1.3
+++ strchr.S 2000/06/30 19:20:48
@@ -18,36 +18,45 @@
Boston, MA 02111-1307, USA. */
#include <sysdep.h>
+#include <bp-sym.h>
+#include <bp-asm.h>
/* See strlen.s for comments on how this works. */
/* char * [r3] strchr (const char *s [r3] , int c [r4] ) */
-ENTRY (strchr)
+ENTRY (BP_SYM (strchr))
#define rTMP1 r0
#define rRTN r3 /* outgoing result */
-#define rSTRin r3 /* incoming string arg */
-#define rCHR r4 /* byte we're looking for, spread over the whole word */
+#if __BOUNDED_POINTERS__
+# define rSTR r4
+# define rCHR r5 /* byte we're looking for, spread over the whole word */
+#else
+# define rSTR r3 /* current word pointer */
+# define rCHR r4 /* byte we're looking for, spread over the whole word */
+#endif
#define rCLZB rCHR /* leading zero byte count */
-#define rWORD r5 /* the current word */
#define rFEFE r6 /* constant 0xfefefeff (-0x01010101) */
#define r7F7F r7 /* constant 0x7f7f7f7f */
-#define rSTR r8 /* current word pointer */
+#define rWORD r8 /* the current word */
#define rTMP2 r9
#define rIGN r10 /* number of bits we should ignore in the first word */
#define rMASK r11 /* mask with the bits to ignore set to 0 */
#define rTMP3 r12
+ CHECK_BOUNDS_LOW (rSTR, rTMP1, rTMP2)
+ STORE_RETURN_BOUNDS (rTMP1, rTMP2)
+
rlwimi rCHR, rCHR, 8, 16, 23
li rMASK, -1
rlwimi rCHR, rCHR, 16, 0, 15
lis rFEFE, -0x101
lis r7F7F, 0x7f7f
- clrrwi rSTR, rSTRin, 2
+ rlwinm rIGN, rSTR, 3, 27, 28
addi r7F7F, r7F7F, 0x7f7f
addi rFEFE, rFEFE, -0x101
- rlwinm rIGN, rSTRin, 3, 27, 28
+ clrrwi rSTR, rSTR, 2
/* Test the first (partial?) word. */
lwz rWORD, 0(rSTR)
srw rMASK, rMASK, rIGN
@@ -80,7 +89,8 @@ L(loopentry):
happened, though. */
L(missed):
and. rTMP1, rTMP1, rTMP2
- li rRTN, 0
+ li rSTR, 0
+ STORE_RETURN_VALUE (rSTR)
beqlr
/* It did happen. Decide which one was first...
I'm not sure if this is actually faster than a sequence of
@@ -97,7 +107,9 @@ L(missed):
bgtlr
cntlzw rCLZB, rTMP2
srwi rCLZB, rCLZB, 3
- add rRTN, rSTR, rCLZB
+ add rSTR, rSTR, rCLZB
+ CHECK_BOUNDS_HIGH_RTN (rSTR, rTMP2, twlge)
+ STORE_RETURN_VALUE (rSTR)
blr
L(foundit):
@@ -108,8 +120,10 @@ L(foundit):
cntlzw rCLZB, rTMP2
subi rSTR, rSTR, 4
srwi rCLZB, rCLZB, 3
- add rRTN, rSTR, rCLZB
+ add rSTR, rSTR, rCLZB
+ CHECK_BOUNDS_HIGH_RTN (rSTR, rTMP2, twlge)
+ STORE_RETURN_VALUE (rSTR)
blr
-END (strchr)
+END (BP_SYM (strchr))
-weak_alias(strchr, index)
+weak_alias (BP_SYM (strchr), BP_SYM (index))
Index: sysdeps/powerpc/strcmp.S
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/powerpc/strcmp.S,v
retrieving revision 1.5
diff -u -p -r1.5 strcmp.S
--- strcmp.S 2000/06/06 22:37:40 1.5
+++ strcmp.S 2000/06/30 19:20:48
@@ -18,24 +18,33 @@
Boston, MA 02111-1307, USA. */
#include <sysdep.h>
+#include <bp-sym.h>
+#include <bp-asm.h>
/* See strlen.s for comments on how the end-of-string testing works. */
/* int [r3] strcmp (const char *s1 [r3], const char *s2 [r4]) */
-EALIGN (strcmp, 4, 0)
+EALIGN (BP_SYM (strcmp), 4, 0)
#define rTMP r0
-#define rRTN r3 /* return value */
+#define rRTN r3
#define rSTR1 r3 /* first string arg */
#define rSTR2 r4 /* second string arg */
+#if __BOUNDED_POINTERS__
+# define rHIGH1 r11
+# define rHIGH2 r12
+#endif
#define rWORD1 r5 /* current word in s1 */
#define rWORD2 r6 /* current word in s2 */
#define rFEFE r7 /* constant 0xfefefeff (-0x01010101) */
-#define r7F7F r8 /* constant 0x7f7f7f7f */
+#define r7F7F r8 /* constant 0x7f7f7f7f */
#define rNEG r9 /* ~(word in s1 | 0x7f7f7f7f) */
#define rBITDIF r10 /* bits that differ in s1 & s2 words */
+ CHECK_BOUNDS_LOW (rSTR1, rTMP, rHIGH1)
+ CHECK_BOUNDS_LOW (rSTR2, rTMP, rHIGH2)
+
or rTMP, rSTR2, rSTR1
clrlwi. rTMP, rTMP, 30
lis rFEFE, -0x101
@@ -74,6 +83,7 @@ L(endstring):
bgelr+ cr1
L(equal):
li rRTN, 0
+ /* GKM FIXME: check high bounds. */
blr
L(different):
@@ -83,6 +93,7 @@ L(different):
bgelr+
L(highbit):
ori rRTN, rWORD2, 1
+ /* GKM FIXME: check high bounds. */
blr
@@ -106,8 +117,10 @@ L(u1): cmpwi cr1, rWORD1, 0
cmpw rWORD1, rWORD2
bne+ cr1, L(u0)
L(u3): sub rRTN, rWORD1, rWORD2
+ /* GKM FIXME: check high bounds. */
blr
L(u4): lbz rWORD1, -1(rSTR1)
sub rRTN, rWORD1, rWORD2
+ /* GKM FIXME: check high bounds. */
blr
-END(strcmp)
+END (BP_SYM (strcmp))
Index: sysdeps/powerpc/strcpy.S
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/powerpc/strcpy.S,v
retrieving revision 1.4
diff -u -p -r1.4 strcpy.S
--- strcpy.S 2000/06/06 22:37:40 1.4
+++ strcpy.S 2000/06/30 19:20:48
@@ -18,26 +18,43 @@
Boston, MA 02111-1307, USA. */
#include <sysdep.h>
+#include <bp-sym.h>
+#include <bp-asm.h>
/* See strlen.s for comments on how the end-of-string testing works. */
/* char * [r3] strcpy (char *dest [r3], const char *src [r4]) */
-EALIGN(strcpy, 4, 0)
+EALIGN (BP_SYM (strcpy), 4, 0)
#define rTMP r0
#define rRTN r3 /* incoming DEST arg preserved as result */
-#define rSRC r4 /* pointer to previous word in src */
-#define rDEST r5 /* pointer to previous word in dest */
-#define rWORD r6 /* current word from src */
+#if __BOUNDED_POINTERS__
+# define rDEST r4 /* pointer to previous word in dest */
+# define rSRC r5 /* pointer to previous word in src */
+# define rLOW r11
+# define rHIGH r12
+#else
+# define rSRC r4 /* pointer to previous word in src */
+# define rDEST r5 /* pointer to previous word in dest */
+#endif
+#define rWORD r6 /* current word from src */
#define rFEFE r7 /* constant 0xfefefeff (-0x01010101) */
-#define r7F7F r8 /* constant 0x7f7f7f7f */
+#define r7F7F r8 /* constant 0x7f7f7f7f */
#define rNEG r9 /* ~(word in s1 | 0x7f7f7f7f) */
#define rALT r10 /* alternate word from src */
+ CHECK_BOUNDS_LOW (rSRC, rLOW, rHIGH)
+ CHECK_BOUNDS_LOW (rDEST, rLOW, rHIGH)
+ STORE_RETURN_BOUNDS (rLOW, rHIGH)
+
or rTMP, rSRC, rRTN
clrlwi. rTMP, rTMP, 30
+#if __BOUNDED_POINTERS__
+ addi rDEST, rDEST, -4
+#else
addi rDEST, rRTN, -4
+#endif
bne L(unaligned)
lis rFEFE, -0x101
@@ -72,6 +89,7 @@ L(g1): rlwinm. rTMP, rALT, 8, 24, 31
stb rTMP, 6(rDEST)
beqlr-
stb rALT, 7(rDEST)
+ /* GKM FIXME: check high bound. */
blr
/* Oh well. In this case, we just do a byte-by-byte copy. */
@@ -93,8 +111,10 @@ L(u0): lbzu rALT, 1(rSRC)
cmpwi rWORD, 0
bne+ L(u0)
L(u2): stb rWORD, 1(rDEST)
+ /* GKM FIXME: check high bound. */
blr
L(u1): stb rALT, 1(rDEST)
+ /* GKM FIXME: check high bound. */
blr
-END(strcpy)
+END (BP_SYM (strcpy))
Index: sysdeps/powerpc/elf/bzero.S
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/powerpc/elf/bzero.S,v
retrieving revision 1.1
diff -u -p -r1.1 bzero.S
--- bzero.S 2000/02/25 20:28:45 1.1
+++ bzero.S 2000/06/30 19:20:48
@@ -1,5 +1,5 @@
/* Optimized bzero `implementation' for PowerPC.
- Copyright (C) 1997, 1999 Free Software Foundation, Inc.
+ Copyright (C) 1997, 1999, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -18,10 +18,20 @@
Boston, MA 02111-1307, USA. */
#include <sysdep.h>
+#include <bp-sym.h>
-ENTRY(__bzero)
+ENTRY (BP_SYM (__bzero))
+
+#if __BOUNDED_POINTERS__
+ mr r6,r4
+ li r5,0
+ mr r4,r3
+ /* Tell memset that we don't want a return value. */
+ li r3,0
+#else
mr r5,r4
li r4,0
- b memset@local
-END(__bzero)
-weak_alias (__bzero, bzero)
+#endif
+ b BP_SYM (memset)@local
+END (BP_SYM (__bzero))
+weak_alias (BP_SYM (__bzero), BP_SYM (bzero))
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |