Clean up <sched.h>.

This patch switches to using the uapi constants. It also adds the missing
setns system call, fixes sched_getcpu's error behavior, and fixes the
gensyscalls script now ARM is uapi-only too.

Change-Id: I8e16b1693d6d32cd9b8499e46b5d8b0a50bc4f1d
diff --git a/libc/Android.mk b/libc/Android.mk
index 7c098a8..1164bd6 100644
--- a/libc/Android.mk
+++ b/libc/Android.mk
@@ -112,7 +112,6 @@
 	bionic/recv.c \
 	bionic/sched_cpualloc.c \
 	bionic/sched_cpucount.c \
-	bionic/sched_getcpu.c \
 	bionic/semaphore.c \
 	bionic/send.c \
 	bionic/setpgrp.c \
@@ -261,6 +260,7 @@
     bionic/sbrk.cpp \
     bionic/scandir.cpp \
     bionic/sched_getaffinity.cpp \
+    bionic/sched_getcpu.cpp \
     bionic/setegid.cpp \
     bionic/__set_errno.cpp \
     bionic/seteuid.cpp \
diff --git a/libc/SYSCALLS.TXT b/libc/SYSCALLS.TXT
index 19b4d22..d0fa528 100644
--- a/libc/SYSCALLS.TXT
+++ b/libc/SYSCALLS.TXT
@@ -179,7 +179,6 @@
 int     lremovexattr(const char*, const char*) all
 int     __statfs64:statfs64(const char*, size_t, struct statfs*)  arm,mips,x86
 int     statfs(const char*, struct statfs*)  aarch64,x86_64
-long    unshare(unsigned long)  all
 int     swapon(const char*, int) all
 int     swapoff(const char*) all
 
@@ -256,8 +255,10 @@
 int sched_get_priority_min(int policy)  all
 int sched_rr_get_interval(pid_t pid, struct timespec* interval)  all
 int sched_setaffinity(pid_t pid, size_t setsize, const cpu_set_t* set) all
+int setns(int, int) all
+int unshare(int) all
 int __sched_getaffinity:sched_getaffinity(pid_t pid, size_t setsize, cpu_set_t* set)  all
-int __getcpu:getcpu(unsigned* cpu, unsigned* node, void* unused) all
+int __getcpu:getcpu(unsigned*, unsigned*, void*) all
 
 # io priorities
 int ioprio_set(int which, int who, int ioprio) all
diff --git a/libc/arch-aarch64/syscalls.mk b/libc/arch-aarch64/syscalls.mk
index ab9c839..3e5d191 100644
--- a/libc/arch-aarch64/syscalls.mk
+++ b/libc/arch-aarch64/syscalls.mk
@@ -147,6 +147,7 @@
 syscall_src += arch-aarch64/syscalls/setgid.S
 syscall_src += arch-aarch64/syscalls/setgroups.S
 syscall_src += arch-aarch64/syscalls/setitimer.S
+syscall_src += arch-aarch64/syscalls/setns.S
 syscall_src += arch-aarch64/syscalls/setpgid.S
 syscall_src += arch-aarch64/syscalls/setpriority.S
 syscall_src += arch-aarch64/syscalls/setregid.S
diff --git a/libc/arch-aarch64/syscalls/setns.S b/libc/arch-aarch64/syscalls/setns.S
new file mode 100644
index 0000000..2ce2a75
--- /dev/null
+++ b/libc/arch-aarch64/syscalls/setns.S
@@ -0,0 +1,21 @@
+/* Generated by gensyscalls.py. Do not edit. */
+
+#include <private/bionic_asm.h>
+
+ENTRY(setns)
+    stp     x29, x30, [sp, #-16]!
+    mov     x29,  sp
+    str     x8,       [sp, #-16]!
+
+    mov     x8, __NR_setns
+    svc     #0
+
+    ldr     x8,       [sp], #16
+    ldp     x29, x30, [sp], #16
+
+    cmn     x0, #(MAX_ERRNO + 1)
+    cneg    x0, x0, hi
+    b.hi    __set_errno
+
+    ret
+END(setns)
diff --git a/libc/arch-arm/syscalls.mk b/libc/arch-arm/syscalls.mk
index a1d4689..f1763ef 100644
--- a/libc/arch-arm/syscalls.mk
+++ b/libc/arch-arm/syscalls.mk
@@ -154,6 +154,7 @@
 syscall_src += arch-arm/syscalls/setgid.S
 syscall_src += arch-arm/syscalls/setgroups.S
 syscall_src += arch-arm/syscalls/setitimer.S
+syscall_src += arch-arm/syscalls/setns.S
 syscall_src += arch-arm/syscalls/setpgid.S
 syscall_src += arch-arm/syscalls/setpriority.S
 syscall_src += arch-arm/syscalls/setregid.S
diff --git a/libc/arch-arm/syscalls/setns.S b/libc/arch-arm/syscalls/setns.S
new file mode 100644
index 0000000..7afbff0
--- /dev/null
+++ b/libc/arch-arm/syscalls/setns.S
@@ -0,0 +1,14 @@
+/* Generated by gensyscalls.py. Do not edit. */
+
+#include <private/bionic_asm.h>
+
+ENTRY(setns)
+    mov     ip, r7
+    ldr     r7, =__NR_setns
+    swi     #0
+    mov     r7, ip
+    cmn     r0, #(MAX_ERRNO + 1)
+    bxls    lr
+    neg     r0, r0
+    b       __set_errno
+END(setns)
diff --git a/libc/arch-mips/syscalls.mk b/libc/arch-mips/syscalls.mk
index 40932b7..cc7e557 100644
--- a/libc/arch-mips/syscalls.mk
+++ b/libc/arch-mips/syscalls.mk
@@ -154,6 +154,7 @@
 syscall_src += arch-mips/syscalls/setgid.S
 syscall_src += arch-mips/syscalls/setgroups.S
 syscall_src += arch-mips/syscalls/setitimer.S
+syscall_src += arch-mips/syscalls/setns.S
 syscall_src += arch-mips/syscalls/setpgid.S
 syscall_src += arch-mips/syscalls/setpriority.S
 syscall_src += arch-mips/syscalls/setregid.S
diff --git a/libc/arch-mips/syscalls/setns.S b/libc/arch-mips/syscalls/setns.S
new file mode 100644
index 0000000..fd4529e
--- /dev/null
+++ b/libc/arch-mips/syscalls/setns.S
@@ -0,0 +1,23 @@
+/* Generated by gensyscalls.py. Do not edit. */
+
+#include <asm/unistd.h>
+    .text
+    .globl setns
+    .align 4
+    .ent setns
+
+setns:
+    .set noreorder
+    .cpload $t9
+    li $v0, __NR_setns
+    syscall
+    bnez $a3, 1f
+    move $a0, $v0
+    j $ra
+    nop
+1:
+    la $t9,__set_errno
+    j $t9
+    nop
+    .set reorder
+    .end setns
diff --git a/libc/arch-x86/syscalls.mk b/libc/arch-x86/syscalls.mk
index 780972f..0699d09 100644
--- a/libc/arch-x86/syscalls.mk
+++ b/libc/arch-x86/syscalls.mk
@@ -153,6 +153,7 @@
 syscall_src += arch-x86/syscalls/setgid.S
 syscall_src += arch-x86/syscalls/setgroups.S
 syscall_src += arch-x86/syscalls/setitimer.S
+syscall_src += arch-x86/syscalls/setns.S
 syscall_src += arch-x86/syscalls/setpgid.S
 syscall_src += arch-x86/syscalls/setpriority.S
 syscall_src += arch-x86/syscalls/setregid.S
diff --git a/libc/arch-x86/syscalls/setns.S b/libc/arch-x86/syscalls/setns.S
new file mode 100644
index 0000000..6bdb98c
--- /dev/null
+++ b/libc/arch-x86/syscalls/setns.S
@@ -0,0 +1,23 @@
+/* Generated by gensyscalls.py. Do not edit. */
+
+#include <private/bionic_asm.h>
+
+ENTRY(setns)
+    pushl   %ebx
+    pushl   %ecx
+    mov     12(%esp), %ebx
+    mov     16(%esp), %ecx
+    movl    $__NR_setns, %eax
+    int     $0x80
+    cmpl    $-MAX_ERRNO, %eax
+    jb      1f
+    negl    %eax
+    pushl   %eax
+    call    __set_errno
+    addl    $4, %esp
+    orl     $-1, %eax
+1:
+    popl    %ecx
+    popl    %ebx
+    ret
+END(setns)
diff --git a/libc/arch-x86_64/syscalls.mk b/libc/arch-x86_64/syscalls.mk
index 9e2bfcc..cac7423 100644
--- a/libc/arch-x86_64/syscalls.mk
+++ b/libc/arch-x86_64/syscalls.mk
@@ -148,6 +148,7 @@
 syscall_src += arch-x86_64/syscalls/setgid.S
 syscall_src += arch-x86_64/syscalls/setgroups.S
 syscall_src += arch-x86_64/syscalls/setitimer.S
+syscall_src += arch-x86_64/syscalls/setns.S
 syscall_src += arch-x86_64/syscalls/setpgid.S
 syscall_src += arch-x86_64/syscalls/setpriority.S
 syscall_src += arch-x86_64/syscalls/setregid.S
diff --git a/libc/arch-x86_64/syscalls/setns.S b/libc/arch-x86_64/syscalls/setns.S
new file mode 100644
index 0000000..bab147b
--- /dev/null
+++ b/libc/arch-x86_64/syscalls/setns.S
@@ -0,0 +1,16 @@
+/* Generated by gensyscalls.py. Do not edit. */
+
+#include <private/bionic_asm.h>
+
+ENTRY(setns)
+    movl    $__NR_setns, %eax
+    syscall
+    cmpq    $-MAX_ERRNO, %rax
+    jb      1f
+    negl    %eax
+    movl    %eax, %edi
+    call    __set_errno
+    orq     $-1, %rax
+1:
+    ret
+END(setns)
diff --git a/libc/bionic/sched_getcpu.c b/libc/bionic/sched_getcpu.cpp
similarity index 87%
rename from libc/bionic/sched_getcpu.c
rename to libc/bionic/sched_getcpu.cpp
index 954df37..1f92e54 100644
--- a/libc/bionic/sched_getcpu.c
+++ b/libc/bionic/sched_getcpu.cpp
@@ -25,16 +25,17 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  */
+
 #define _GNU_SOURCE 1
 #include <sched.h>
 
-extern int  __getcpu(unsigned *cpu, unsigned *node, void* unused);
+extern "C" int __getcpu(unsigned*, unsigned*, void*);
 
-int  sched_getcpu(void)
-{
-    unsigned cpu;
-    if (__getcpu(&cpu, NULL, NULL) < 0)
-        return 0;
-
-    return (int)cpu;
+int sched_getcpu() {
+  unsigned cpu;
+  int rc = __getcpu(&cpu, NULL, NULL);
+  if (rc == -1) {
+    return -1; // errno is already set.
+  }
+  return cpu;
 }
diff --git a/libc/include/sched.h b/libc/include/sched.h
index 4d7d8c6..fba6514 100644
--- a/libc/include/sched.h
+++ b/libc/include/sched.h
@@ -31,54 +31,32 @@
 #include <sys/cdefs.h>
 #include <sys/time.h>
 
+#include <linux/sched.h>
+
 __BEGIN_DECLS
 
-#define SCHED_NORMAL            0
-#define SCHED_OTHER             0
-#define SCHED_FIFO              1
-#define SCHED_RR                2
+/* This name is used by glibc, but not by the kernel. */
+#define SCHED_OTHER SCHED_NORMAL
 
 struct sched_param {
-    int sched_priority;
+  int sched_priority;
 };
 
-extern int sched_setscheduler(pid_t, int, const struct sched_param *);
+extern int sched_setscheduler(pid_t, int, const struct sched_param*);
 extern int sched_getscheduler(pid_t);
 extern int sched_yield(void);
-extern int sched_get_priority_max(int policy);
-extern int sched_get_priority_min(int policy);
-extern int sched_setparam(pid_t, const struct sched_param *);
-extern int sched_getparam(pid_t, struct sched_param *);
-extern int sched_rr_get_interval(pid_t pid, struct timespec *tp);
-
-#define CLONE_VM             0x00000100
-#define CLONE_FS             0x00000200
-#define CLONE_FILES          0x00000400
-#define CLONE_SIGHAND        0x00000800
-#define CLONE_PTRACE         0x00002000
-#define CLONE_VFORK          0x00004000
-#define CLONE_PARENT         0x00008000
-#define CLONE_THREAD         0x00010000
-#define CLONE_NEWNS          0x00020000
-#define CLONE_SYSVSEM        0x00040000
-#define CLONE_SETTLS         0x00080000
-#define CLONE_PARENT_SETTID  0x00100000
-#define CLONE_CHILD_CLEARTID 0x00200000
-#define CLONE_DETACHED       0x00400000
-#define CLONE_UNTRACED       0x00800000
-#define CLONE_CHILD_SETTID   0x01000000
-#define CLONE_STOPPED        0x02000000
+extern int sched_get_priority_max(int);
+extern int sched_get_priority_min(int);
+extern int sched_setparam(pid_t, const struct sched_param*);
+extern int sched_getparam(pid_t, struct sched_param*);
+extern int sched_rr_get_interval(pid_t, struct timespec*);
 
 #ifdef _GNU_SOURCE
-extern int clone(int (*fn)(void *), void *child_stack, int flags, void*  arg, ...);
+
+extern int clone(int (*)(void*), void*, int, void*, ...);
 extern int unshare(int);
-#endif
-
-/* Support for cpu thread affinity */
-#ifdef _GNU_SOURCE
-
 extern int sched_getcpu(void);
-
+extern int setns(int, int);
 
 /* Our implementation supports up to 32 independent CPUs, which is also
  * the maximum supported by the kernel at the moment. GLibc uses 1024 by
diff --git a/libc/include/sys/glibc-syscalls.h b/libc/include/sys/glibc-syscalls.h
index 0deb73a..3131b6b 100644
--- a/libc/include/sys/glibc-syscalls.h
+++ b/libc/include/sys/glibc-syscalls.h
@@ -375,6 +375,7 @@
 #define SYS_fcntl64 __NR_fcntl64
 #define SYS_fdatasync __NR_fdatasync
 #define SYS_fgetxattr __NR_fgetxattr
+#define SYS_finit_module __NR_finit_module
 #define SYS_flistxattr __NR_flistxattr
 #define SYS_flock __NR_flock
 #define SYS_fork __NR_fork
@@ -439,6 +440,7 @@
 #define SYS_ioprio_get __NR_ioprio_get
 #define SYS_ioprio_set __NR_ioprio_set
 #define SYS_ipc __NR_ipc
+#define SYS_kcmp __NR_kcmp
 #define SYS_kexec_load __NR_kexec_load
 #define SYS_keyctl __NR_keyctl
 #define SYS_kill __NR_kill
diff --git a/libc/tools/gensyscalls.py b/libc/tools/gensyscalls.py
index ef201c3..58d1afd 100755
--- a/libc/tools/gensyscalls.py
+++ b/libc/tools/gensyscalls.py
@@ -416,7 +416,7 @@
         glibc_fp.write("#if defined(__aarch64__)\n")
         self.scan_linux_unistd_h(glibc_fp, bionic_libc_root + "/kernel/uapi/asm-generic/unistd.h")
         glibc_fp.write("#elif defined(__arm__)\n")
-        self.scan_linux_unistd_h(glibc_fp, bionic_libc_root + "/kernel/arch-arm/asm/unistd.h")
+        self.scan_linux_unistd_h(glibc_fp, bionic_libc_root + "/kernel/uapi/asm-arm/asm/unistd.h")
         glibc_fp.write("#elif defined(__mips__)\n")
         self.scan_linux_unistd_h(glibc_fp, bionic_libc_root + "/kernel/uapi/asm-mips/asm/unistd.h")
         glibc_fp.write("#elif defined(__i386__)\n")