svn commit: branches/uClibc-nptl: libc/string/arm libc/sysdeps/linux/power etc...
sjhill at uclibc.org
sjhill at uclibc.org
Sat Sep 17 15:28:10 UTC 2005
Author: sjhill
Date: 2005-09-17 08:28:09 -0700 (Sat, 17 Sep 2005)
New Revision: 11491
Log:
Sync with trunk.
Added:
branches/uClibc-nptl/libc/sysdeps/linux/powerpc/bits/atomic.h
Modified:
branches/uClibc-nptl/libc/string/arm/_memcpy.S
branches/uClibc-nptl/libc/string/arm/bcopy.S
branches/uClibc-nptl/libc/string/arm/bzero.S
branches/uClibc-nptl/libc/string/arm/memcmp.S
branches/uClibc-nptl/libc/string/arm/memcpy.S
branches/uClibc-nptl/libc/string/arm/memmove.S
branches/uClibc-nptl/libc/string/arm/memset.S
branches/uClibc-nptl/libc/string/arm/strcmp.S
branches/uClibc-nptl/libc/string/arm/strlen.S
branches/uClibc-nptl/libc/string/arm/strncmp.S
branches/uClibc-nptl/libc/sysdeps/linux/powerpc/bits/syscalls.h
branches/uClibc-nptl/libpthread/linuxthreads/descr.h
Changeset:
Modified: branches/uClibc-nptl/libc/string/arm/_memcpy.S
===================================================================
--- branches/uClibc-nptl/libc/string/arm/_memcpy.S 2005-09-17 12:00:06 UTC (rev 11490)
+++ branches/uClibc-nptl/libc/string/arm/_memcpy.S 2005-09-17 15:28:09 UTC (rev 11491)
@@ -71,10 +71,10 @@
* Apologies for the state of the comments ;-)
*/
- .text
- .global _memcpy;
- .type _memcpy,%function
- .align 4; \
+.text
+.global _memcpy
+.type _memcpy,%function
+.align 4
_memcpy:
/* Determine copy direction */
Modified: branches/uClibc-nptl/libc/string/arm/bcopy.S
===================================================================
--- branches/uClibc-nptl/libc/string/arm/bcopy.S 2005-09-17 12:00:06 UTC (rev 11490)
+++ branches/uClibc-nptl/libc/string/arm/bcopy.S 2005-09-17 15:28:09 UTC (rev 11491)
@@ -39,10 +39,10 @@
/* bcopy = memcpy/memmove with arguments reversed. */
- .text
- .global bcopy;
- .type bcopy,%function
- .align 4; \
+.text
+.global bcopy
+.type bcopy,%function
+.align 4
bcopy:
/* switch the source and destination registers */
Modified: branches/uClibc-nptl/libc/string/arm/bzero.S
===================================================================
--- branches/uClibc-nptl/libc/string/arm/bzero.S 2005-09-17 12:00:06 UTC (rev 11490)
+++ branches/uClibc-nptl/libc/string/arm/bzero.S 2005-09-17 15:28:09 UTC (rev 11491)
@@ -37,10 +37,10 @@
* by Erik Andersen <andersen at codepoet.org>
*/
- .text
- .global __bzero;
- .type __bzero,%function
- .align 4; \
+.text
+.global __bzero
+.type __bzero,%function
+.align 4
__bzero:
mov r2, r1
Modified: branches/uClibc-nptl/libc/string/arm/memcmp.S
===================================================================
--- branches/uClibc-nptl/libc/string/arm/memcmp.S 2005-09-17 12:00:06 UTC (rev 11490)
+++ branches/uClibc-nptl/libc/string/arm/memcmp.S 2005-09-17 15:28:09 UTC (rev 11491)
@@ -30,10 +30,10 @@
*/
- .text
- .global memcmp;
- .type memcmp,%function
- .align 4; \
+.text
+.global memcmp
+.type memcmp,%function
+.align 4
memcmp:
/* if ((len - 1) < 0) return 0 */
@@ -52,6 +52,4 @@
sub r0, r2, r3
mov pc, lr
-.weak bcmp;
- bcmp = memcmp
-
+.weak bcmp ; bcmp = memcmp
Modified: branches/uClibc-nptl/libc/string/arm/memcpy.S
===================================================================
--- branches/uClibc-nptl/libc/string/arm/memcpy.S 2005-09-17 12:00:06 UTC (rev 11490)
+++ branches/uClibc-nptl/libc/string/arm/memcpy.S 2005-09-17 15:28:09 UTC (rev 11491)
@@ -37,10 +37,10 @@
* by Erik Andersen <andersen at codepoet.org>
*/
- .text
- .global memcpy;
- .type memcpy,%function
- .align 4; \
+.text
+.global memcpy
+.type memcpy,%function
+.align 4
memcpy:
stmfd sp!, {r0, lr}
Modified: branches/uClibc-nptl/libc/string/arm/memmove.S
===================================================================
--- branches/uClibc-nptl/libc/string/arm/memmove.S 2005-09-17 12:00:06 UTC (rev 11490)
+++ branches/uClibc-nptl/libc/string/arm/memmove.S 2005-09-17 15:28:09 UTC (rev 11491)
@@ -37,10 +37,10 @@
* by Erik Andersen <andersen at codepoet.org>
*/
- .text
- .global memmove;
- .type memmove,%function
- .align 4; \
+.text
+.global memmove
+.type memmove,%function
+.align 4
memmove:
stmfd sp!, {r0, lr}
Modified: branches/uClibc-nptl/libc/string/arm/memset.S
===================================================================
--- branches/uClibc-nptl/libc/string/arm/memset.S 2005-09-17 12:00:06 UTC (rev 11490)
+++ branches/uClibc-nptl/libc/string/arm/memset.S 2005-09-17 15:28:09 UTC (rev 11491)
@@ -19,10 +19,10 @@
#include <sys/syscall.h>
- .text
- .global memset;
- .type memset,%function
- .align 4; \
+.text
+.global memset
+.type memset,%function
+.align 4
memset:
mov a4, a1
@@ -68,5 +68,4 @@
strb a2, [a4], $1
mov pc, lr
-.size memset,.-memset;
-
+.size memset,.-memset
Modified: branches/uClibc-nptl/libc/string/arm/strcmp.S
===================================================================
--- branches/uClibc-nptl/libc/string/arm/strcmp.S 2005-09-17 12:00:06 UTC (rev 11490)
+++ branches/uClibc-nptl/libc/string/arm/strcmp.S 2005-09-17 15:28:09 UTC (rev 11491)
@@ -29,10 +29,10 @@
* by Erik Andersen <andersen at codepoet.org>
*/
- .text
- .global strcmp;
- .type strcmp,%function
- .align 4; \
+.text
+.global strcmp
+.type strcmp,%function
+.align 4
strcmp:
1:
@@ -44,6 +44,4 @@
sub r0, r2, r3
mov pc, lr
-.weak strcoll;
- strcoll = strcmp
-
+.weak strcoll ; strcoll = strcmp
Modified: branches/uClibc-nptl/libc/string/arm/strlen.S
===================================================================
--- branches/uClibc-nptl/libc/string/arm/strlen.S 2005-09-17 12:00:06 UTC (rev 11490)
+++ branches/uClibc-nptl/libc/string/arm/strlen.S 2005-09-17 15:28:09 UTC (rev 11491)
@@ -25,10 +25,10 @@
* exit: r0 = len
*/
- .text
- .global strlen;
- .type strlen,%function
- .align 4; \
+.text
+.global strlen
+.type strlen,%function
+.align 4
strlen:
bic r1, r0, $3 @ addr of word containing first byte
@@ -76,5 +76,4 @@
#endif
mov pc,lr
-.size strlen,.-strlen;
-
+.size strlen,.-strlen
Modified: branches/uClibc-nptl/libc/string/arm/strncmp.S
===================================================================
--- branches/uClibc-nptl/libc/string/arm/strncmp.S 2005-09-17 12:00:06 UTC (rev 11490)
+++ branches/uClibc-nptl/libc/string/arm/strncmp.S 2005-09-17 15:28:09 UTC (rev 11491)
@@ -29,16 +29,17 @@
* by Erik Andersen <andersen at codepoet.org>
*/
- .text
- .global strncmp;
- .type strncmp,%function
- .align 4; \
+.text
+.global strncmp
+.type strncmp,%function
+.align 4
strncmp:
- /* if ((len - 1) < 0) return 0 */
+ /* if (len == 0) return 0 */
+ cmp r2, #0
+ moveq r0, #0
+ moveq pc, lr
subs r2, r2, #1
- movmi r0, #0
- movmi pc, lr
/* ip == last src address to compare */
add ip, r0, r2
Copied: branches/uClibc-nptl/libc/sysdeps/linux/powerpc/bits/atomic.h (from rev 11490, trunk/uClibc/libc/sysdeps/linux/powerpc/bits/atomic.h)
Modified: branches/uClibc-nptl/libc/sysdeps/linux/powerpc/bits/syscalls.h
===================================================================
--- branches/uClibc-nptl/libc/sysdeps/linux/powerpc/bits/syscalls.h 2005-09-17 12:00:06 UTC (rev 11490)
+++ branches/uClibc-nptl/libc/sysdeps/linux/powerpc/bits/syscalls.h 2005-09-17 15:28:09 UTC (rev 11491)
@@ -10,62 +10,156 @@
* programs. */
#include <bits/sysnum.h>
+/* Define a macro which expands inline into the wrapper code for a system
+ call. This use is for internal calls that do not need to handle errors
+ normally. It will never touch errno.
+ On powerpc a system call basically clobbers the same registers like a
+ function call, with the exception of LR (which is needed for the
+ "sc; bnslr+" sequence) and CR (where only CR0.SO is clobbered to signal
+ an error return status). */
-#define __STRINGIFY(s) __STRINGIFY2 (s)
-#define __STRINGIFY2(s) #s
-
-#undef JUMPTARGET
-#ifdef __PIC__
-#define __MAKE_SYSCALL __STRINGIFY(__uClibc_syscall at plt)
-#else
-#define __MAKE_SYSCALL __STRINGIFY(__uClibc_syscall)
+# undef INLINE_SYSCALL
+#if 0
+# define INLINE_SYSCALL(name, nr, args...) \
+ ({ \
+ INTERNAL_SYSCALL_DECL (sc_err); \
+ long int sc_ret = INTERNAL_SYSCALL (name, sc_err, nr, args); \
+ if (INTERNAL_SYSCALL_ERROR_P (sc_ret, sc_err)) \
+ { \
+ __set_errno (INTERNAL_SYSCALL_ERRNO (sc_ret, sc_err)); \
+ sc_ret = -1L; \
+ } \
+ sc_ret; \
+ })
#endif
-#define unified_syscall_body(name) \
- __asm__ ( \
- ".section \".text\"\n\t" \
- ".align 2\n\t" \
- ".globl " __STRINGIFY(name) "\n\t" \
- ".type " __STRINGIFY(name) ", at function\n\t" \
- #name":\tli 0," __STRINGIFY(__NR_##name) "\n\t" \
- "b " __MAKE_SYSCALL "\n\t" \
- ".size\t" __STRINGIFY(name) ",.""-" __STRINGIFY(name) "\n" \
- )
+# define INLINE_SYSCALL(name, nr, args...) \
+ ({ \
+ INTERNAL_SYSCALL_DECL (sc_err); \
+ long int sc_ret = INTERNAL_SYSCALL (name, sc_err, nr, args); \
+ if (INTERNAL_SYSCALL_ERROR_P (sc_ret, sc_err)) \
+ { \
+ sc_ret = __syscall_error(INTERNAL_SYSCALL_ERRNO (sc_ret, sc_err));\
+ } \
+ sc_ret; \
+ })
+/* Define a macro which expands inline into the wrapper code for a system
+ call. This use is for internal calls that do not need to handle errors
+ normally. It will never touch errno.
+ On powerpc a system call basically clobbers the same registers like a
+ function call, with the exception of LR (which is needed for the
+ "sc; bnslr+" sequence) and CR (where only CR0.SO is clobbered to signal
+ an error return status). */
+# undef INTERNAL_SYSCALL_DECL
+# define INTERNAL_SYSCALL_DECL(err) long int err
+
+# undef INTERNAL_SYSCALL
+# define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \
+ ({ \
+ register long int r0 __asm__ ("r0"); \
+ register long int r3 __asm__ ("r3"); \
+ register long int r4 __asm__ ("r4"); \
+ register long int r5 __asm__ ("r5"); \
+ register long int r6 __asm__ ("r6"); \
+ register long int r7 __asm__ ("r7"); \
+ register long int r8 __asm__ ("r8"); \
+ register long int r9 __asm__ ("r9"); \
+ register long int r10 __asm__ ("r10"); \
+ register long int r11 __asm__ ("r11"); \
+ register long int r12 __asm__ ("r12"); \
+ LOADARGS_##nr(name, args); \
+ __asm__ __volatile__ \
+ ("sc \n\t" \
+ "mfcr %0" \
+ : "=&r" (r0), \
+ "=&r" (r3), "=&r" (r4), "=&r" (r5), "=&r" (r6), "=&r" (r7), \
+ "=&r" (r8), "=&r" (r9), "=&r" (r10), "=&r" (r11), "=&r" (r12) \
+ : ASM_INPUT_##nr \
+ : "cr0", "ctr", "memory"); \
+ err = r0; \
+ (int) r3; \
+ })
+# define INTERNAL_SYSCALL(name, err, nr, args...) \
+ INTERNAL_SYSCALL_NCS (__NR_##name, err, nr, ##args)
+
+# undef INTERNAL_SYSCALL_ERROR_P
+# define INTERNAL_SYSCALL_ERROR_P(val, err) \
+ ((void) (val), __builtin_expect ((err) & (1 << 28), 0))
+
+# undef INTERNAL_SYSCALL_ERRNO
+# define INTERNAL_SYSCALL_ERRNO(val, err) (val)
+
+# define LOADARGS_0(name, dummy) \
+ r0 = (long int)name
+# define LOADARGS_1(name, __arg1) \
+ LOADARGS_0(name, 0); \
+ r3 = (long int)__arg1
+# define LOADARGS_2(name, __arg1, __arg2) \
+ LOADARGS_1(name, __arg1); \
+ r4 = (long int)__arg2
+# define LOADARGS_3(name, __arg1, __arg2, __arg3) \
+ LOADARGS_2(name, __arg1, __arg2); \
+ r5 = (long int)__arg3
+# define LOADARGS_4(name, __arg1, __arg2, __arg3, __arg4) \
+ LOADARGS_3(name, __arg1, __arg2, __arg3); \
+ r6 = (long int)__arg4
+# define LOADARGS_5(name, __arg1, __arg2, __arg3, __arg4, __arg5) \
+ LOADARGS_4(name, __arg1, __arg2, __arg3, __arg4); \
+ r7 = (long int)__arg5
+# define LOADARGS_6(name, __arg1, __arg2, __arg3, __arg4, __arg5, __arg6) \
+ LOADARGS_5(name, __arg1, __arg2, __arg3, __arg4, __arg5); \
+ r8 = (long int)__arg6
+
+# define ASM_INPUT_0 "0" (r0)
+# define ASM_INPUT_1 ASM_INPUT_0, "1" (r3)
+# define ASM_INPUT_2 ASM_INPUT_1, "2" (r4)
+# define ASM_INPUT_3 ASM_INPUT_2, "3" (r5)
+# define ASM_INPUT_4 ASM_INPUT_3, "4" (r6)
+# define ASM_INPUT_5 ASM_INPUT_4, "5" (r7)
+# define ASM_INPUT_6 ASM_INPUT_5, "6" (r8)
+
#undef _syscall0
-#define _syscall0(type,name) \
-type name(void); \
-unified_syscall_body(name)
+#define _syscall0(type,name) \
+type name(void){ \
+ return INLINE_SYSCALL(name, 0); \
+}
#undef _syscall1
#define _syscall1(type,name,type1,arg1) \
-type name(type1 arg1); \
-unified_syscall_body(name)
+type name(type1 arg1){ \
+ return INLINE_SYSCALL(name, 1, arg1); \
+}
#undef _syscall2
#define _syscall2(type,name,type1,arg1,type2,arg2) \
-type name(type1 arg1, type2 arg2); \
-unified_syscall_body(name)
+type name(type1 arg1, type2 arg2){ \
+ return INLINE_SYSCALL(name, 2, arg1, arg2); \
+}
#undef _syscall3
#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
-type name(type1 arg1, type2 arg2, type3 arg3); \
-unified_syscall_body(name)
+type name(type1 arg1, type2 arg2, type3 arg3){ \
+ return INLINE_SYSCALL(name, 3, arg1, arg2, arg3); \
+}
#undef _syscall4
#define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
-type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4); \
-unified_syscall_body(name)
+type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4){ \
+ return INLINE_SYSCALL(name, 4, arg1, arg2, arg3, arg4); \
+}
#undef _syscall5
#define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) \
-type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5); \
-unified_syscall_body(name)
+type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5){ \
+ return INLINE_SYSCALL(name, 5, arg1, arg2, arg3, arg4, arg5); \
+}
#undef _syscall6
#define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5,type6,arg6) \
-type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6); \
-unified_syscall_body(name)
+type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6){ \
+ return INLINE_SYSCALL(name, 6, arg1, arg2, arg3, arg4, arg5, arg6); \
+}
#endif /* _BITS_SYSCALLS_H */
Modified: branches/uClibc-nptl/libpthread/linuxthreads/descr.h
===================================================================
--- branches/uClibc-nptl/libpthread/linuxthreads/descr.h 2005-09-17 12:00:06 UTC (rev 11490)
+++ branches/uClibc-nptl/libpthread/linuxthreads/descr.h 2005-09-17 15:28:09 UTC (rev 11491)
@@ -214,7 +214,10 @@
extern char *__pthread_initial_thread_bos;
#ifndef __ARCH_HAS_MMU__
extern char *__pthread_initial_thread_tos;
-#define NOMMU_INITIAL_THREAD_BOUNDS(tos,bos) if ((tos)>=__pthread_initial_thread_bos && (bos)<=__pthread_initial_thread_tos) __pthread_initial_thread_bos = (tos)+1
+#define NOMMU_INITIAL_THREAD_BOUNDS(tos,bos) \
+ if ((tos)>=__pthread_initial_thread_bos \
+ && (bos)<__pthread_initial_thread_tos) \
+ __pthread_initial_thread_bos = (tos)+1
#else
#define NOMMU_INITIAL_THREAD_BOUNDS(tos,bos) /* empty */
#endif /* __ARCH_HAS_MMU__ */
More information about the uClibc-cvs
mailing list