From f33a7700a5a893798e92ee67495281d2e24159fa Mon Sep 17 00:00:00 2001 From: David 'Digit' Turner Date: Mon, 27 Sep 2010 17:27:14 +0200 Subject: [PATCH 01/10] libc: Add missing C++ guards to Change-Id: I94dad48678181d8b02431b1c1f5d507beafb5406 --- libc/include/pathconf.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libc/include/pathconf.h b/libc/include/pathconf.h index 4677f7b07..94f978789 100644 --- a/libc/include/pathconf.h +++ b/libc/include/pathconf.h @@ -28,6 +28,10 @@ #ifndef _PATHCONF_H_ #define _PATHCONF_H_ +#include + +__BEGIN_DECLS + /* constants to be used for the 'name' paremeter of pathconf/fpathconf */ #define _PC_FILESIZEBITS 0x0000 @@ -54,5 +58,7 @@ extern long fpathconf(int fildes, int name); extern long pathconf(const char *path, int name); +__END_DECLS + #endif /* _PATHCONF_H_ */ From 275cd48511daabe4591caa49c3ad0df34a6889ff Mon Sep 17 00:00:00 2001 From: David 'Digit' Turner Date: Mon, 27 Sep 2010 17:33:08 +0200 Subject: [PATCH 02/10] libc: Add missing pipe2() declaration and implementation. Change-Id: Iacb914bd6ac5adc60c5671e6fef680ede21f9b0c --- libc/SYSCALLS.TXT | 5 +++-- libc/arch-arm/syscalls.mk | 1 + libc/arch-arm/syscalls/pipe2.S | 19 ++++++++++++++++++ libc/arch-sh/syscalls.mk | 1 + libc/arch-sh/syscalls/pipe2.S | 32 +++++++++++++++++++++++++++++++ libc/arch-x86/syscalls.mk | 1 + libc/arch-x86/syscalls/pipe2.S | 26 +++++++++++++++++++++++++ libc/include/sys/linux-syscalls.h | 7 +++++-- libc/include/sys/linux-unistd.h | 1 + libc/include/unistd.h | 3 +++ 10 files changed, 92 insertions(+), 4 deletions(-) create mode 100644 libc/arch-arm/syscalls/pipe2.S create mode 100644 libc/arch-sh/syscalls/pipe2.S create mode 100644 libc/arch-x86/syscalls/pipe2.S diff --git a/libc/SYSCALLS.TXT b/libc/SYSCALLS.TXT index f66ff4067..4bcccb5b1 100644 --- a/libc/SYSCALLS.TXT +++ b/libc/SYSCALLS.TXT @@ -112,6 +112,7 @@ int flock(int, int) 143 int fchmod(int, mode_t) 94 int dup(int) 41 int pipe(int *) 42,42,-1 +int pipe2(int *, int) 359,331 int dup2(int, int) 63 int select:_newselect(int, struct fd_set *, struct fd_set *, struct fd_set *, struct timeval *) 142 int ftruncate(int, off_t) 93 @@ -229,8 +230,8 @@ int sched_get_priority_min(int policy) 160 int sched_rr_get_interval(pid_t pid, struct timespec *interval) 161 # io priorities -int ioprio_set(int which, int who, int ioprio) 314,289 -int ioprio_get(int which, int who) 315,290 +int ioprio_set(int which, int who, int ioprio) 314,289,288 +int ioprio_get(int which, int who) 315,290,289 # other int uname(struct utsname *) 122 diff --git a/libc/arch-arm/syscalls.mk b/libc/arch-arm/syscalls.mk index c46616666..2d944cabd 100644 --- a/libc/arch-arm/syscalls.mk +++ b/libc/arch-arm/syscalls.mk @@ -66,6 +66,7 @@ syscall_src += arch-arm/syscalls/flock.S syscall_src += arch-arm/syscalls/fchmod.S syscall_src += arch-arm/syscalls/dup.S syscall_src += arch-arm/syscalls/pipe.S +syscall_src += arch-arm/syscalls/pipe2.S syscall_src += arch-arm/syscalls/dup2.S syscall_src += arch-arm/syscalls/select.S syscall_src += arch-arm/syscalls/ftruncate.S diff --git a/libc/arch-arm/syscalls/pipe2.S b/libc/arch-arm/syscalls/pipe2.S new file mode 100644 index 000000000..df7709405 --- /dev/null +++ b/libc/arch-arm/syscalls/pipe2.S @@ -0,0 +1,19 @@ +/* autogenerated by gensyscalls.py */ +#include + + .text + .type pipe2, #function + .globl pipe2 + .align 4 + .fnstart + +pipe2: + .save {r4, r7} + stmfd sp!, {r4, r7} + ldr r7, =__NR_pipe2 + swi #0 + ldmfd sp!, {r4, r7} + movs r0, r0 + bxpl lr + b __set_syscall_errno + .fnend diff --git a/libc/arch-sh/syscalls.mk b/libc/arch-sh/syscalls.mk index ddae8d395..b690bbfc6 100644 --- a/libc/arch-sh/syscalls.mk +++ b/libc/arch-sh/syscalls.mk @@ -69,6 +69,7 @@ syscall_src += arch-sh/syscalls/__fcntl.S syscall_src += arch-sh/syscalls/flock.S syscall_src += arch-sh/syscalls/fchmod.S syscall_src += arch-sh/syscalls/dup.S +syscall_src += arch-sh/syscalls/pipe2.S syscall_src += arch-sh/syscalls/dup2.S syscall_src += arch-sh/syscalls/select.S syscall_src += arch-sh/syscalls/ftruncate.S diff --git a/libc/arch-sh/syscalls/pipe2.S b/libc/arch-sh/syscalls/pipe2.S new file mode 100644 index 000000000..f6d9964ec --- /dev/null +++ b/libc/arch-sh/syscalls/pipe2.S @@ -0,0 +1,32 @@ +/* autogenerated by gensyscalls.py */ +#include + + .text + .type pipe2, @function + .globl pipe2 + .align 4 + +pipe2: + + /* invoke trap */ + mov.l 0f, r3 /* trap num */ + trapa #(2 + 0x10) + + /* check return value */ + cmp/pz r0 + bt __NR_pipe2_end + + /* keep error number */ + sts.l pr, @-r15 + mov.l 1f, r1 + jsr @r1 + mov r0, r4 + lds.l @r15+, pr + +__NR_pipe2_end: + rts + nop + + .align 2 +0: .long __NR_pipe2 +1: .long __set_syscall_errno diff --git a/libc/arch-x86/syscalls.mk b/libc/arch-x86/syscalls.mk index 6ac371646..27153f908 100644 --- a/libc/arch-x86/syscalls.mk +++ b/libc/arch-x86/syscalls.mk @@ -69,6 +69,7 @@ syscall_src += arch-x86/syscalls/flock.S syscall_src += arch-x86/syscalls/fchmod.S syscall_src += arch-x86/syscalls/dup.S syscall_src += arch-x86/syscalls/pipe.S +syscall_src += arch-x86/syscalls/pipe2.S syscall_src += arch-x86/syscalls/dup2.S syscall_src += arch-x86/syscalls/select.S syscall_src += arch-x86/syscalls/ftruncate.S diff --git a/libc/arch-x86/syscalls/pipe2.S b/libc/arch-x86/syscalls/pipe2.S new file mode 100644 index 000000000..c3354a77f --- /dev/null +++ b/libc/arch-x86/syscalls/pipe2.S @@ -0,0 +1,26 @@ +/* autogenerated by gensyscalls.py */ +#include + + .text + .type pipe2, @function + .globl pipe2 + .align 4 + +pipe2: + pushl %ebx + pushl %ecx + mov 12(%esp), %ebx + mov 16(%esp), %ecx + movl $__NR_pipe2, %eax + int $0x80 + cmpl $-129, %eax + jb 1f + negl %eax + pushl %eax + call __set_errno + addl $4, %esp + orl $-1, %eax +1: + popl %ecx + popl %ebx + ret diff --git a/libc/include/sys/linux-syscalls.h b/libc/include/sys/linux-syscalls.h index 9e2aa2f37..6a7fc401e 100644 --- a/libc/include/sys/linux-syscalls.h +++ b/libc/include/sys/linux-syscalls.h @@ -138,6 +138,7 @@ #define __NR_openat (__NR_SYSCALL_BASE + 322) #define __NR_madvise (__NR_SYSCALL_BASE + 220) #define __NR_mincore (__NR_SYSCALL_BASE + 219) +#define __NR_pipe2 (__NR_SYSCALL_BASE + 359) #define __NR_getdents64 (__NR_SYSCALL_BASE + 217) #define __NR_fstatfs64 (__NR_SYSCALL_BASE + 267) #define __NR_fstatat64 (__NR_SYSCALL_BASE + 327) @@ -194,6 +195,7 @@ #define __NR_openat (__NR_SYSCALL_BASE + 295) #define __NR_madvise (__NR_SYSCALL_BASE + 219) #define __NR_mincore (__NR_SYSCALL_BASE + 218) +#define __NR_pipe2 (__NR_SYSCALL_BASE + 331) #define __NR_getdents64 (__NR_SYSCALL_BASE + 220) #define __NR_fstatfs64 (__NR_SYSCALL_BASE + 269) #define __NR_fstatat64 (__NR_SYSCALL_BASE + 300) @@ -235,6 +237,7 @@ #define __NR_openat (__NR_SYSCALL_BASE + 295) #define __NR_madvise (__NR_SYSCALL_BASE + 219) #define __NR_mincore (__NR_SYSCALL_BASE + 218) +#define __NR_pipe2 (__NR_SYSCALL_BASE + 331) #define __NR_getdents64 (__NR_SYSCALL_BASE + 220) #define __NR_fstatfs64 (__NR_SYSCALL_BASE + 269) #define __NR_fstatat64 (__NR_SYSCALL_BASE + 300) @@ -270,8 +273,8 @@ #define __NR_socketcall (__NR_SYSCALL_BASE + 102) #define __NR_socketcall (__NR_SYSCALL_BASE + 102) #define __NR___socketcall (__NR_SYSCALL_BASE + 102) -#define __NR_ioprio_set (__NR_SYSCALL_BASE + 289) -#define __NR_ioprio_get (__NR_SYSCALL_BASE + 290) +#define __NR_ioprio_set (__NR_SYSCALL_BASE + 288) +#define __NR_ioprio_get (__NR_SYSCALL_BASE + 289) #define __NR_epoll_create (__NR_SYSCALL_BASE + 254) #define __NR_epoll_ctl (__NR_SYSCALL_BASE + 255) #define __NR_epoll_wait (__NR_SYSCALL_BASE + 256) diff --git a/libc/include/sys/linux-unistd.h b/libc/include/sys/linux-unistd.h index 6bd9ac7e9..7494efefb 100644 --- a/libc/include/sys/linux-unistd.h +++ b/libc/include/sys/linux-unistd.h @@ -79,6 +79,7 @@ int flock (int, int); int fchmod (int, mode_t); int dup (int); int pipe (int *); +int pipe2 (int *, int); int dup2 (int, int); int select (int, struct fd_set *, struct fd_set *, struct fd_set *, struct timeval *); int ftruncate (int, off_t); diff --git a/libc/include/unistd.h b/libc/include/unistd.h index 75541980d..cd09e3d24 100644 --- a/libc/include/unistd.h +++ b/libc/include/unistd.h @@ -118,6 +118,9 @@ extern int chdir(const char *); extern int fchdir(int); extern int rmdir(const char *); extern int pipe(int *); +#ifdef _GNU_SOURCE /* GLibc compatibility */ +extern int pipe2(int *, int); +#endif extern int chroot(const char *); extern int symlink(const char *, const char *); extern int readlink(const char *, char *, size_t); From 00eea3f8a07190dc6d2c4d0e927fed3e47502424 Mon Sep 17 00:00:00 2001 From: David 'Digit' Turner Date: Sun, 26 Sep 2010 20:03:16 +0200 Subject: [PATCH 03/10] libc: add missing O_CLOEXEC from Change-Id: Ie7ad57898e67800a9fe92bb52589d67ec30e1cd9 --- libc/include/fcntl.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libc/include/fcntl.h b/libc/include/fcntl.h index 59e7135cd..7219dd744 100644 --- a/libc/include/fcntl.h +++ b/libc/include/fcntl.h @@ -39,6 +39,10 @@ __BEGIN_DECLS #define O_ASYNC FASYNC #endif +#ifndef O_CLOEXEC +#define O_CLOEXEC 02000000 +#endif + extern int open(const char* path, int mode, ...); extern int openat(int fd, const char* path, int mode, ...); extern int unlinkat(int dirfd, const char *pathname, int flags); From 80fba9a2fe4eacaabee99cf0bbead872c2792231 Mon Sep 17 00:00:00 2001 From: David 'Digit' Turner Date: Sun, 26 Sep 2010 22:40:02 +0200 Subject: [PATCH 04/10] libc: memmove(): non-overlapping block optim. Change-Id: I5652f4f97ca59d95176443fc27c737ef76258183 --- libc/string/memmove.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libc/string/memmove.c b/libc/string/memmove.c index fcaf4eedb..948a766dc 100644 --- a/libc/string/memmove.c +++ b/libc/string/memmove.c @@ -31,7 +31,11 @@ void *memmove(void *dst, const void *src, size_t n) { const char *p = src; char *q = dst; - if (__builtin_expect(q < p, 1)) { + + /* we can use highgly-optimized memcpy() if the destination + * is before the source, or if the two blocks are non-overlapping + */ + if (__builtin_expect((q < p || (q-p) <= (ptrdiff_t)n), 1)) { return memcpy(dst, src, n); } else { #define PRELOAD_DISTANCE 64 From bd8d987b3c3aa6d9d00cede2cb091f00bdb42204 Mon Sep 17 00:00:00 2001 From: David 'Digit' Turner Date: Sun, 26 Sep 2010 23:00:36 +0200 Subject: [PATCH 05/10] libc: remove C++ comments from public headers. Change-Id: I4af84f912062cd2ff34711c25122fb323f20c032 --- libc/arch-arm/include/machine/_types.h | 2 -- libc/include/pthread.h | 2 +- libc/include/sys/file.h | 2 +- libc/include/sys/ioctl_compat.h | 4 ++-- libc/include/sys/ptrace.h | 2 +- libc/include/utmp.h | 2 +- 6 files changed, 6 insertions(+), 8 deletions(-) diff --git a/libc/arch-arm/include/machine/_types.h b/libc/arch-arm/include/machine/_types.h index 6d10e12b4..3e779ca85 100644 --- a/libc/arch-arm/include/machine/_types.h +++ b/libc/arch-arm/include/machine/_types.h @@ -46,8 +46,6 @@ typedef long ssize_t; typedef long ptrdiff_t; #endif -//#include - /* 7.18.1.1 Exact-width integer types */ typedef __signed char __int8_t; typedef unsigned char __uint8_t; diff --git a/libc/include/pthread.h b/libc/include/pthread.h index 9773dcba2..99e747aa5 100644 --- a/libc/include/pthread.h +++ b/libc/include/pthread.h @@ -309,4 +309,4 @@ extern void __pthread_cleanup_pop(__pthread_cleanup_t* c, #define LONG_LONG_MAX __LONG_LONG_MAX__ #define LONG_LONG_MIN (-__LONG_LONG_MAX__ - 1) -#endif // _PTHREAD_H_ +#endif /* _PTHREAD_H_ */ diff --git a/libc/include/sys/file.h b/libc/include/sys/file.h index 06937ffaa..cf2f4b142 100644 --- a/libc/include/sys/file.h +++ b/libc/include/sys/file.h @@ -31,7 +31,7 @@ #include #include -// ANDROID: needed for flock() +/* ANDROID: needed for flock() */ #include #include diff --git a/libc/include/sys/ioctl_compat.h b/libc/include/sys/ioctl_compat.h index d79b67adb..cab5c80a5 100644 --- a/libc/include/sys/ioctl_compat.h +++ b/libc/include/sys/ioctl_compat.h @@ -39,8 +39,8 @@ #ifndef _SYS_IOCTL_COMPAT_H_ #define _SYS_IOCTL_COMPAT_H_ -//#include -//#include +/*#include */ +/*#include */ struct tchars { char t_intrc; /* interrupt */ diff --git a/libc/include/sys/ptrace.h b/libc/include/sys/ptrace.h index 78a057a0b..848416b64 100644 --- a/libc/include/sys/ptrace.h +++ b/libc/include/sys/ptrace.h @@ -30,7 +30,7 @@ #include #include -// For all of the defines +/* For all of the defines */ #include __BEGIN_DECLS diff --git a/libc/include/utmp.h b/libc/include/utmp.h index e362b4021..ffd3c925a 100644 --- a/libc/include/utmp.h +++ b/libc/include/utmp.h @@ -87,4 +87,4 @@ struct utmp* getutent(); __END_DECLS -#endif // _UTMP_H_ +#endif /* _UTMP_H_ */ From ce2ebf8d7338095bf410259abf6874af295749d6 Mon Sep 17 00:00:00 2001 From: David 'Digit' Turner Date: Sun, 26 Sep 2010 23:17:21 +0200 Subject: [PATCH 06/10] libm: remove aliasing issue. See http://code.google.com/p/android/issues/detail?id=6697 for details about this change. Change-Id: I516f00c6f3bc99b22be51669e4573246bdd6e33d --- libm/src/s_frexpf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libm/src/s_frexpf.c b/libm/src/s_frexpf.c index 89d464b4d..c18cd54c6 100644 --- a/libm/src/s_frexpf.c +++ b/libm/src/s_frexpf.c @@ -39,6 +39,6 @@ frexpf(float x, int *eptr) } *eptr += (ix>>23)-126; hx = (hx&0x807fffff)|0x3f000000; - *(int*)&x = hx; + SET_FLOAT_WORD(x,hx); return x; } From a3ae60d343661784e3f6f4566b276d8e6b8a06a7 Mon Sep 17 00:00:00 2001 From: David 'Digit' Turner Date: Mon, 27 Sep 2010 17:28:38 +0200 Subject: [PATCH 07/10] libc: Add missing fdatasync() implementation Change-Id: I04bb655d77e414021e1f2a973329167ad76ca1c4 --- libc/SYSCALLS.TXT | 1 + libc/arch-arm/syscalls.mk | 1 + libc/arch-arm/syscalls/fdatasync.S | 19 ++++++++++++++++++ libc/arch-sh/syscalls.mk | 1 + libc/arch-sh/syscalls/fdatasync.S | 32 ++++++++++++++++++++++++++++++ libc/arch-x86/syscalls.mk | 1 + libc/arch-x86/syscalls/fdatasync.S | 23 +++++++++++++++++++++ libc/include/sys/linux-syscalls.h | 1 + libc/include/sys/linux-unistd.h | 1 + 9 files changed, 80 insertions(+) create mode 100644 libc/arch-arm/syscalls/fdatasync.S create mode 100644 libc/arch-sh/syscalls/fdatasync.S create mode 100644 libc/arch-x86/syscalls/fdatasync.S diff --git a/libc/SYSCALLS.TXT b/libc/SYSCALLS.TXT index 4bcccb5b1..baac5d02f 100644 --- a/libc/SYSCALLS.TXT +++ b/libc/SYSCALLS.TXT @@ -118,6 +118,7 @@ int select:_newselect(int, struct fd_set *, struct fd_set *, struct fd_s int ftruncate(int, off_t) 93 int getdents:getdents64(unsigned int, struct dirent *, unsigned int) 217,220 int fsync(int) 118 +int fdatasync(int) 148 int fchown:fchown32(int, uid_t, gid_t) 207 void sync(void) 36 int __fcntl64:fcntl64(int, int, void *) 221 diff --git a/libc/arch-arm/syscalls.mk b/libc/arch-arm/syscalls.mk index 2d944cabd..f1d8fb16e 100644 --- a/libc/arch-arm/syscalls.mk +++ b/libc/arch-arm/syscalls.mk @@ -72,6 +72,7 @@ syscall_src += arch-arm/syscalls/select.S syscall_src += arch-arm/syscalls/ftruncate.S syscall_src += arch-arm/syscalls/getdents.S syscall_src += arch-arm/syscalls/fsync.S +syscall_src += arch-arm/syscalls/fdatasync.S syscall_src += arch-arm/syscalls/fchown.S syscall_src += arch-arm/syscalls/sync.S syscall_src += arch-arm/syscalls/__fcntl64.S diff --git a/libc/arch-arm/syscalls/fdatasync.S b/libc/arch-arm/syscalls/fdatasync.S new file mode 100644 index 000000000..5981a803c --- /dev/null +++ b/libc/arch-arm/syscalls/fdatasync.S @@ -0,0 +1,19 @@ +/* autogenerated by gensyscalls.py */ +#include + + .text + .type fdatasync, #function + .globl fdatasync + .align 4 + .fnstart + +fdatasync: + .save {r4, r7} + stmfd sp!, {r4, r7} + ldr r7, =__NR_fdatasync + swi #0 + ldmfd sp!, {r4, r7} + movs r0, r0 + bxpl lr + b __set_syscall_errno + .fnend diff --git a/libc/arch-sh/syscalls.mk b/libc/arch-sh/syscalls.mk index b690bbfc6..3e2274fb3 100644 --- a/libc/arch-sh/syscalls.mk +++ b/libc/arch-sh/syscalls.mk @@ -75,6 +75,7 @@ syscall_src += arch-sh/syscalls/select.S syscall_src += arch-sh/syscalls/ftruncate.S syscall_src += arch-sh/syscalls/getdents.S syscall_src += arch-sh/syscalls/fsync.S +syscall_src += arch-sh/syscalls/fdatasync.S syscall_src += arch-sh/syscalls/fchown.S syscall_src += arch-sh/syscalls/sync.S syscall_src += arch-sh/syscalls/__fcntl64.S diff --git a/libc/arch-sh/syscalls/fdatasync.S b/libc/arch-sh/syscalls/fdatasync.S new file mode 100644 index 000000000..d81c33a4c --- /dev/null +++ b/libc/arch-sh/syscalls/fdatasync.S @@ -0,0 +1,32 @@ +/* autogenerated by gensyscalls.py */ +#include + + .text + .type fdatasync, @function + .globl fdatasync + .align 4 + +fdatasync: + + /* invoke trap */ + mov.l 0f, r3 /* trap num */ + trapa #(1 + 0x10) + + /* check return value */ + cmp/pz r0 + bt __NR_fdatasync_end + + /* keep error number */ + sts.l pr, @-r15 + mov.l 1f, r1 + jsr @r1 + mov r0, r4 + lds.l @r15+, pr + +__NR_fdatasync_end: + rts + nop + + .align 2 +0: .long __NR_fdatasync +1: .long __set_syscall_errno diff --git a/libc/arch-x86/syscalls.mk b/libc/arch-x86/syscalls.mk index 27153f908..f0d7a31aa 100644 --- a/libc/arch-x86/syscalls.mk +++ b/libc/arch-x86/syscalls.mk @@ -75,6 +75,7 @@ syscall_src += arch-x86/syscalls/select.S syscall_src += arch-x86/syscalls/ftruncate.S syscall_src += arch-x86/syscalls/getdents.S syscall_src += arch-x86/syscalls/fsync.S +syscall_src += arch-x86/syscalls/fdatasync.S syscall_src += arch-x86/syscalls/fchown.S syscall_src += arch-x86/syscalls/sync.S syscall_src += arch-x86/syscalls/__fcntl64.S diff --git a/libc/arch-x86/syscalls/fdatasync.S b/libc/arch-x86/syscalls/fdatasync.S new file mode 100644 index 000000000..b86c0f807 --- /dev/null +++ b/libc/arch-x86/syscalls/fdatasync.S @@ -0,0 +1,23 @@ +/* autogenerated by gensyscalls.py */ +#include + + .text + .type fdatasync, @function + .globl fdatasync + .align 4 + +fdatasync: + pushl %ebx + mov 8(%esp), %ebx + movl $__NR_fdatasync, %eax + int $0x80 + cmpl $-129, %eax + jb 1f + negl %eax + pushl %eax + call __set_errno + addl $4, %esp + orl $-1, %eax +1: + popl %ebx + ret diff --git a/libc/include/sys/linux-syscalls.h b/libc/include/sys/linux-syscalls.h index 6a7fc401e..b90f20d53 100644 --- a/libc/include/sys/linux-syscalls.h +++ b/libc/include/sys/linux-syscalls.h @@ -72,6 +72,7 @@ #define __NR__newselect (__NR_SYSCALL_BASE + 142) #define __NR_ftruncate (__NR_SYSCALL_BASE + 93) #define __NR_fsync (__NR_SYSCALL_BASE + 118) +#define __NR_fdatasync (__NR_SYSCALL_BASE + 148) #define __NR_fchown32 (__NR_SYSCALL_BASE + 207) #define __NR_sync (__NR_SYSCALL_BASE + 36) #define __NR_fcntl64 (__NR_SYSCALL_BASE + 221) diff --git a/libc/include/sys/linux-unistd.h b/libc/include/sys/linux-unistd.h index 7494efefb..5e9c2f0f3 100644 --- a/libc/include/sys/linux-unistd.h +++ b/libc/include/sys/linux-unistd.h @@ -85,6 +85,7 @@ int select (int, struct fd_set *, struct fd_set *, struct fd_set *, int ftruncate (int, off_t); int getdents (unsigned int, struct dirent *, unsigned int); int fsync (int); +int fdatasync (int); int fchown (int, uid_t, gid_t); void sync (void); int __fcntl64 (int, int, void *); From 9973a564222b842eb7497fd6e659fe8c8c49e2b3 Mon Sep 17 00:00:00 2001 From: David 'Digit' Turner Date: Mon, 27 Sep 2010 17:30:33 +0200 Subject: [PATCH 08/10] libc: Add missing waitid() implementation. Change-Id: I312ee608dbf9249e4886a10d45d13e3cda8a9042 --- libc/SYSCALLS.TXT | 2 +- libc/arch-arm/syscalls.mk | 2 +- libc/arch-arm/syscalls/{waitid.S => __waitid.S} | 6 +++--- libc/arch-sh/syscalls.mk | 2 +- libc/arch-sh/syscalls/{waitid.S => __waitid.S} | 6 +++--- libc/arch-x86/syscalls.mk | 2 +- libc/arch-x86/syscalls/{waitid.S => __waitid.S} | 6 +++--- libc/include/sys/linux-unistd.h | 2 +- libc/include/sys/wait.h | 9 +++++++++ libc/unistd/wait.c | 7 +++++++ 10 files changed, 30 insertions(+), 14 deletions(-) rename libc/arch-arm/syscalls/{waitid.S => __waitid.S} (86%) rename libc/arch-sh/syscalls/{waitid.S => __waitid.S} (90%) rename libc/arch-x86/syscalls/{waitid.S => __waitid.S} (90%) diff --git a/libc/SYSCALLS.TXT b/libc/SYSCALLS.TXT index baac5d02f..935639e07 100644 --- a/libc/SYSCALLS.TXT +++ b/libc/SYSCALLS.TXT @@ -33,7 +33,7 @@ void _exit:exit_group (int) 248,252 void _exit_thread:exit (int) 1 pid_t __fork:fork (void) 2 pid_t _waitpid:waitpid (pid_t, int*, int, struct rusage*) -1,7 -int waitid(int, pid_t, struct siginfo_t*, int,void*) 280,284 +int __waitid:waitid(int, pid_t, struct siginfo_t*, int,void*) 280,284 # NOTE: this system call is never called directly, but we list it there # to have __NR_clone properly defined. diff --git a/libc/arch-arm/syscalls.mk b/libc/arch-arm/syscalls.mk index f1d8fb16e..c364d1cf1 100644 --- a/libc/arch-arm/syscalls.mk +++ b/libc/arch-arm/syscalls.mk @@ -3,7 +3,7 @@ syscall_src := syscall_src += arch-arm/syscalls/_exit.S syscall_src += arch-arm/syscalls/_exit_thread.S syscall_src += arch-arm/syscalls/__fork.S -syscall_src += arch-arm/syscalls/waitid.S +syscall_src += arch-arm/syscalls/__waitid.S syscall_src += arch-arm/syscalls/__sys_clone.S syscall_src += arch-arm/syscalls/execve.S syscall_src += arch-arm/syscalls/__setuid.S diff --git a/libc/arch-arm/syscalls/waitid.S b/libc/arch-arm/syscalls/__waitid.S similarity index 86% rename from libc/arch-arm/syscalls/waitid.S rename to libc/arch-arm/syscalls/__waitid.S index 4134e535f..fdd0da31d 100644 --- a/libc/arch-arm/syscalls/waitid.S +++ b/libc/arch-arm/syscalls/__waitid.S @@ -2,12 +2,12 @@ #include .text - .type waitid, #function - .globl waitid + .type __waitid, #function + .globl __waitid .align 4 .fnstart -waitid: +__waitid: mov ip, sp .save {r4, r5, r6, r7} stmfd sp!, {r4, r5, r6, r7} diff --git a/libc/arch-sh/syscalls.mk b/libc/arch-sh/syscalls.mk index 3e2274fb3..47b5a1ec6 100644 --- a/libc/arch-sh/syscalls.mk +++ b/libc/arch-sh/syscalls.mk @@ -4,7 +4,7 @@ syscall_src += arch-sh/syscalls/_exit.S syscall_src += arch-sh/syscalls/_exit_thread.S syscall_src += arch-sh/syscalls/__fork.S syscall_src += arch-sh/syscalls/_waitpid.S -syscall_src += arch-sh/syscalls/waitid.S +syscall_src += arch-sh/syscalls/__waitid.S syscall_src += arch-sh/syscalls/__sys_clone.S syscall_src += arch-sh/syscalls/execve.S syscall_src += arch-sh/syscalls/__setuid.S diff --git a/libc/arch-sh/syscalls/waitid.S b/libc/arch-sh/syscalls/__waitid.S similarity index 90% rename from libc/arch-sh/syscalls/waitid.S rename to libc/arch-sh/syscalls/__waitid.S index 1f0432d14..1f58de08f 100644 --- a/libc/arch-sh/syscalls/waitid.S +++ b/libc/arch-sh/syscalls/__waitid.S @@ -2,11 +2,11 @@ #include .text - .type waitid, @function - .globl waitid + .type __waitid, @function + .globl __waitid .align 4 -waitid: +__waitid: /* get ready for additonal arg */ mov.l @r15, r0 diff --git a/libc/arch-x86/syscalls.mk b/libc/arch-x86/syscalls.mk index f0d7a31aa..133f286b8 100644 --- a/libc/arch-x86/syscalls.mk +++ b/libc/arch-x86/syscalls.mk @@ -4,7 +4,7 @@ syscall_src += arch-x86/syscalls/_exit.S syscall_src += arch-x86/syscalls/_exit_thread.S syscall_src += arch-x86/syscalls/__fork.S syscall_src += arch-x86/syscalls/_waitpid.S -syscall_src += arch-x86/syscalls/waitid.S +syscall_src += arch-x86/syscalls/__waitid.S syscall_src += arch-x86/syscalls/__sys_clone.S syscall_src += arch-x86/syscalls/execve.S syscall_src += arch-x86/syscalls/__setuid.S diff --git a/libc/arch-x86/syscalls/waitid.S b/libc/arch-x86/syscalls/__waitid.S similarity index 90% rename from libc/arch-x86/syscalls/waitid.S rename to libc/arch-x86/syscalls/__waitid.S index 9a5328bb5..4dd8c11b5 100644 --- a/libc/arch-x86/syscalls/waitid.S +++ b/libc/arch-x86/syscalls/__waitid.S @@ -2,11 +2,11 @@ #include .text - .type waitid, @function - .globl waitid + .type __waitid, @function + .globl __waitid .align 4 -waitid: +__waitid: pushl %ebx pushl %ecx pushl %edx diff --git a/libc/include/sys/linux-unistd.h b/libc/include/sys/linux-unistd.h index 5e9c2f0f3..a1905b3c7 100644 --- a/libc/include/sys/linux-unistd.h +++ b/libc/include/sys/linux-unistd.h @@ -9,7 +9,7 @@ void _exit (int); void _exit_thread (int); pid_t __fork (void); pid_t _waitpid (pid_t, int*, int, struct rusage*); -int waitid (int, pid_t, struct siginfo_t*, int,void*); +int __waitid (int, pid_t, struct siginfo_t*, int,void*); pid_t __sys_clone (int, void*, int*, void*, int*); int execve (const char*, char* const*, char* const*); int __setuid (uid_t); diff --git a/libc/include/sys/wait.h b/libc/include/sys/wait.h index 8ba1837fe..573e22004 100644 --- a/libc/include/sys/wait.h +++ b/libc/include/sys/wait.h @@ -32,6 +32,7 @@ #include #include #include +#include __BEGIN_DECLS @@ -49,6 +50,14 @@ extern pid_t waitpid(pid_t, int *, int); extern pid_t wait3(int *, int, struct rusage *); extern pid_t wait4(pid_t, int *, int, struct rusage *); +/* Posix states that idtype_t should be an enumeration type, but + * the kernel headers define P_ALL, P_PID and P_PGID as constant macros + * instead. + */ +typedef int idtype_t; + +extern int waidit(idtype_t which, id_t id, siginfo_t *info, int options); + __END_DECLS #endif /* _SYS_WAIT_H_ */ diff --git a/libc/unistd/wait.c b/libc/unistd/wait.c index d17241909..f1db086db 100644 --- a/libc/unistd/wait.c +++ b/libc/unistd/wait.c @@ -29,6 +29,7 @@ #include extern pid_t __wait4 (pid_t pid, int *status, int options, struct rusage *rusage); +extern int __waitid(idtype_t which, id_t id, siginfo_t *info, int options, struct rusage *ru); pid_t wait( int* status ) { @@ -44,3 +45,9 @@ pid_t waitpid(pid_t pid, int* status, int options) { return __wait4( pid, status, options, NULL ); } + +int waitid(idtype_t which, id_t id, siginfo_t *info, int options) +{ + /* the system call takes an option struct rusage that we don't need */ + return __waitid(which, id, info, options, NULL); +} From defd162212de3789d2268a1f3339c2a6097fa825 Mon Sep 17 00:00:00 2001 From: David 'Digit' Turner Date: Sun, 26 Sep 2010 22:29:14 +0200 Subject: [PATCH 09/10] libc: add and corresponding implementations. Change-Id: Ide040884c456190226e580513099fdb8377e015b --- libc/Android.mk | 1 + libc/SYSCALLS.TXT | 2 ++ libc/arch-arm/syscalls.mk | 1 + libc/arch-arm/syscalls/eventfd.S | 19 ++++++++++++ libc/arch-sh/syscalls.mk | 1 + libc/arch-sh/syscalls/eventfd.S | 32 ++++++++++++++++++++ libc/arch-x86/syscalls.mk | 1 + libc/arch-x86/syscalls/eventfd.S | 26 ++++++++++++++++ libc/include/sys/eventfd.h | 50 +++++++++++++++++++++++++++++++ libc/include/sys/linux-syscalls.h | 3 ++ libc/include/sys/linux-unistd.h | 1 + libc/unistd/eventfd.c | 25 ++++++++++++++++ 12 files changed, 162 insertions(+) create mode 100644 libc/arch-arm/syscalls/eventfd.S create mode 100644 libc/arch-sh/syscalls/eventfd.S create mode 100644 libc/arch-x86/syscalls/eventfd.S create mode 100644 libc/include/sys/eventfd.h create mode 100644 libc/unistd/eventfd.c diff --git a/libc/Android.mk b/libc/Android.mk index 9d7dd3ddf..9e6bdfbb4 100644 --- a/libc/Android.mk +++ b/libc/Android.mk @@ -11,6 +11,7 @@ libc_common_src_files := \ unistd/brk.c \ unistd/creat.c \ unistd/daemon.c \ + unistd/eventfd.c \ unistd/exec.c \ unistd/fcntl.c \ unistd/fnmatch.c \ diff --git a/libc/SYSCALLS.TXT b/libc/SYSCALLS.TXT index 935639e07..0850b8282 100644 --- a/libc/SYSCALLS.TXT +++ b/libc/SYSCALLS.TXT @@ -259,6 +259,8 @@ int inotify_rm_watch(int, unsigned int) 318,293,292 int poll(struct pollfd *, unsigned int, long) 168 +int eventfd:eventfd2(unsigned int, int) 356,328 + # ARM-specific ARM_NR_BASE == 0x0f0000 == 983040 int __set_tls:ARM_set_tls(void*) 983045,-1 int cacheflush:ARM_cacheflush(long start, long end, long flags) 983042,-1 diff --git a/libc/arch-arm/syscalls.mk b/libc/arch-arm/syscalls.mk index c364d1cf1..ba78c1846 100644 --- a/libc/arch-arm/syscalls.mk +++ b/libc/arch-arm/syscalls.mk @@ -172,5 +172,6 @@ syscall_src += arch-arm/syscalls/inotify_init.S syscall_src += arch-arm/syscalls/inotify_add_watch.S syscall_src += arch-arm/syscalls/inotify_rm_watch.S syscall_src += arch-arm/syscalls/poll.S +syscall_src += arch-arm/syscalls/eventfd.S syscall_src += arch-arm/syscalls/__set_tls.S syscall_src += arch-arm/syscalls/cacheflush.S diff --git a/libc/arch-arm/syscalls/eventfd.S b/libc/arch-arm/syscalls/eventfd.S new file mode 100644 index 000000000..8d2cce93b --- /dev/null +++ b/libc/arch-arm/syscalls/eventfd.S @@ -0,0 +1,19 @@ +/* autogenerated by gensyscalls.py */ +#include + + .text + .type eventfd, #function + .globl eventfd + .align 4 + .fnstart + +eventfd: + .save {r4, r7} + stmfd sp!, {r4, r7} + ldr r7, =__NR_eventfd2 + swi #0 + ldmfd sp!, {r4, r7} + movs r0, r0 + bxpl lr + b __set_syscall_errno + .fnend diff --git a/libc/arch-sh/syscalls.mk b/libc/arch-sh/syscalls.mk index 47b5a1ec6..a87419d96 100644 --- a/libc/arch-sh/syscalls.mk +++ b/libc/arch-sh/syscalls.mk @@ -161,3 +161,4 @@ syscall_src += arch-sh/syscalls/inotify_init.S syscall_src += arch-sh/syscalls/inotify_add_watch.S syscall_src += arch-sh/syscalls/inotify_rm_watch.S syscall_src += arch-sh/syscalls/poll.S +syscall_src += arch-sh/syscalls/eventfd.S diff --git a/libc/arch-sh/syscalls/eventfd.S b/libc/arch-sh/syscalls/eventfd.S new file mode 100644 index 000000000..c73bf234e --- /dev/null +++ b/libc/arch-sh/syscalls/eventfd.S @@ -0,0 +1,32 @@ +/* autogenerated by gensyscalls.py */ +#include + + .text + .type eventfd, @function + .globl eventfd + .align 4 + +eventfd: + + /* invoke trap */ + mov.l 0f, r3 /* trap num */ + trapa #(2 + 0x10) + + /* check return value */ + cmp/pz r0 + bt __NR_eventfd2_end + + /* keep error number */ + sts.l pr, @-r15 + mov.l 1f, r1 + jsr @r1 + mov r0, r4 + lds.l @r15+, pr + +__NR_eventfd2_end: + rts + nop + + .align 2 +0: .long __NR_eventfd2 +1: .long __set_syscall_errno diff --git a/libc/arch-x86/syscalls.mk b/libc/arch-x86/syscalls.mk index 133f286b8..420a91eb0 100644 --- a/libc/arch-x86/syscalls.mk +++ b/libc/arch-x86/syscalls.mk @@ -175,3 +175,4 @@ syscall_src += arch-x86/syscalls/inotify_init.S syscall_src += arch-x86/syscalls/inotify_add_watch.S syscall_src += arch-x86/syscalls/inotify_rm_watch.S syscall_src += arch-x86/syscalls/poll.S +syscall_src += arch-x86/syscalls/eventfd.S diff --git a/libc/arch-x86/syscalls/eventfd.S b/libc/arch-x86/syscalls/eventfd.S new file mode 100644 index 000000000..104c842a5 --- /dev/null +++ b/libc/arch-x86/syscalls/eventfd.S @@ -0,0 +1,26 @@ +/* autogenerated by gensyscalls.py */ +#include + + .text + .type eventfd, @function + .globl eventfd + .align 4 + +eventfd: + pushl %ebx + pushl %ecx + mov 12(%esp), %ebx + mov 16(%esp), %ecx + movl $__NR_eventfd2, %eax + int $0x80 + cmpl $-129, %eax + jb 1f + negl %eax + pushl %eax + call __set_errno + addl $4, %esp + orl $-1, %eax +1: + popl %ecx + popl %ebx + ret diff --git a/libc/include/sys/eventfd.h b/libc/include/sys/eventfd.h new file mode 100644 index 000000000..19244a5d7 --- /dev/null +++ b/libc/include/sys/eventfd.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#ifndef _SYS_EVENTFD_H +#define _SYS_EVENTFD_H + +#include +#include + +__BEGIN_DECLS + +#define EFD_CLOEXEC O_CLOEXEC +#define EFD_NONBLOCK O_NONBLOCK + +/* type of event counter */ +typedef uint64_t eventfd_t; + +extern int eventfd(unsigned int initval, int flags); + +/* Compatibility with GLibc */ +extern int eventfd_read(int fd, eventfd_t *counter); +extern int eventfd_write(int fd, const eventfd_t counter); + +__END_DECLS + +#endif /* _SYS_EVENTFD_H */ diff --git a/libc/include/sys/linux-syscalls.h b/libc/include/sys/linux-syscalls.h index b90f20d53..9702a7a73 100644 --- a/libc/include/sys/linux-syscalls.h +++ b/libc/include/sys/linux-syscalls.h @@ -182,6 +182,7 @@ #define __NR_inotify_init (__NR_SYSCALL_BASE + 316) #define __NR_inotify_add_watch (__NR_SYSCALL_BASE + 317) #define __NR_inotify_rm_watch (__NR_SYSCALL_BASE + 318) +#define __NR_eventfd2 (__NR_SYSCALL_BASE + 356) #define __NR_ARM_set_tls (__NR_SYSCALL_BASE + 983045) #define __NR_ARM_cacheflush (__NR_SYSCALL_BASE + 983042) #endif @@ -225,6 +226,7 @@ #define __NR_inotify_init (__NR_SYSCALL_BASE + 291) #define __NR_inotify_add_watch (__NR_SYSCALL_BASE + 292) #define __NR_inotify_rm_watch (__NR_SYSCALL_BASE + 293) +#define __NR_eventfd2 (__NR_SYSCALL_BASE + 328) #endif #if defined(__SH3__) || defined(__SH4__) @@ -282,6 +284,7 @@ #define __NR_inotify_init (__NR_SYSCALL_BASE + 290) #define __NR_inotify_add_watch (__NR_SYSCALL_BASE + 291) #define __NR_inotify_rm_watch (__NR_SYSCALL_BASE + 292) +#define __NR_eventfd2 (__NR_SYSCALL_BASE + 328) #endif #endif diff --git a/libc/include/sys/linux-unistd.h b/libc/include/sys/linux-unistd.h index a1905b3c7..23853dac1 100644 --- a/libc/include/sys/linux-unistd.h +++ b/libc/include/sys/linux-unistd.h @@ -202,6 +202,7 @@ int inotify_init (void); int inotify_add_watch (int, const char *, unsigned int); int inotify_rm_watch (int, unsigned int); int poll (struct pollfd *, unsigned int, long); +int eventfd (unsigned int, int); int __set_tls (void*); int cacheflush (long start, long end, long flags); #ifdef __cplusplus diff --git a/libc/unistd/eventfd.c b/libc/unistd/eventfd.c new file mode 100644 index 000000000..a48704328 --- /dev/null +++ b/libc/unistd/eventfd.c @@ -0,0 +1,25 @@ +#include +#include + +/* We duplicate the GLibc error semantics, which are poorly defined + * if the read() or write() does not return the proper number of bytes. + */ +int eventfd_read(int fd, eventfd_t *counter) +{ + int ret = read(fd, counter, sizeof(*counter)); + + if (ret == sizeof(*counter)) + return 0; + + return -1; +} + +int eventfd_write(int fd, eventfd_t counter) +{ + int ret = write(fd, &counter, sizeof(counter)); + + if (ret == sizeof(counter)) + return 0; + + return -1; +} From af00228b705b53165c132a22b30c2d6cbb9acd13 Mon Sep 17 00:00:00 2001 From: Marco Nelissen Date: Tue, 28 Sep 2010 10:24:20 -0700 Subject: [PATCH 10/10] Revert "libc: memmove(): non-overlapping block optim." This reverts commit 80fba9a2fe4eacaabee99cf0bbead872c2792231, which caused the system to not boot anymore, aborting with: "java.lang.RuntimeException: Missing static main on com.android.server.SystemServer". Change-Id: I745e0a23c728cccf5f95a3c7642d544478a4e57e --- libc/string/memmove.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/libc/string/memmove.c b/libc/string/memmove.c index 948a766dc..fcaf4eedb 100644 --- a/libc/string/memmove.c +++ b/libc/string/memmove.c @@ -31,11 +31,7 @@ void *memmove(void *dst, const void *src, size_t n) { const char *p = src; char *q = dst; - - /* we can use highgly-optimized memcpy() if the destination - * is before the source, or if the two blocks are non-overlapping - */ - if (__builtin_expect((q < p || (q-p) <= (ptrdiff_t)n), 1)) { + if (__builtin_expect(q < p, 1)) { return memcpy(dst, src, n); } else { #define PRELOAD_DISTANCE 64