Merge changes I427a1881,I959b6428

* changes:
  Add faccessat to syscall list
  Update unistd.h for new syscalls
diff --git a/libc/bionic/libc_init_common.c b/libc/bionic/libc_init_common.c
index b6a6379..7fb1246 100644
--- a/libc/bionic/libc_init_common.c
+++ b/libc/bionic/libc_init_common.c
@@ -52,12 +52,19 @@
 
 int __system_properties_init(void);
 
-void __libc_init_common(uintptr_t *elfdata)
+/* Init TLS for the initial thread. Called by the linker _before_ libc is mapped
+ * in memory. Beware: all writes to libc globals from this function will
+ * apply to linker-private copies and will not be visible from libc later on.
+ *
+ * Note: this function creates a pthread_internal_t for the initial thread and
+ * stores the pointer in TLS, but does not add it to pthread's gThreadList. This
+ * has to be done later from libc itself (see __libc_init_common).
+ *
+ * This function also stores elfdata argument in a specific TLS slot to be later
+ * picked up by the libc constructor.
+ */
+void __libc_init_tls(unsigned** elfdata)
 {
-    int     argc = *elfdata;
-    char**  argv = (char**)(elfdata + 1);
-    char**  envp = argv + argc + 1;
-
     pthread_attr_t             thread_attr;
     static pthread_internal_t  thread;
     static void*               tls_area[BIONIC_TLS_SLOTS];
@@ -72,7 +79,19 @@
     _init_thread(&thread, gettid(), &thread_attr, (void*)stackbottom);
     __init_tls(tls_area, &thread);
 
-    /* clear errno - requires TLS area */
+    tls_area[TLS_SLOT_BIONIC_PREINIT] = elfdata;
+}
+
+void __libc_init_common(uintptr_t *elfdata)
+{
+    int     argc = *elfdata;
+    char**  argv = (char**)(elfdata + 1);
+    char**  envp = argv + argc + 1;
+
+    /* get the initial thread from TLS and add it to gThreadList */
+    _pthread_internal_add(__get_thread());
+
+    /* clear errno */
     errno = 0;
 
     /* set program name */
diff --git a/libc/bionic/libc_init_static.c b/libc/bionic/libc_init_static.c
index a2c11a9..f97961d 100644
--- a/libc/bionic/libc_init_static.c
+++ b/libc/bionic/libc_init_static.c
@@ -65,6 +65,11 @@
     int  argc;
     char **argv, **envp;
 
+    __libc_init_tls(NULL);
+
+    /* get the initial thread from TLS and add it to gThreadList */
+    _pthread_internal_add(__get_thread());
+
     /* Initialize the C runtime environment */
     __libc_init_common(elfdata);
 
diff --git a/libc/bionic/pthread.c b/libc/bionic/pthread.c
index fdfe508..5cad167 100644
--- a/libc/bionic/pthread.c
+++ b/libc/bionic/pthread.c
@@ -145,7 +145,7 @@
     pthread_mutex_unlock(&gThreadListLock);
 }
 
-static void
+__LIBC_ABI_PRIVATE__ void
 _pthread_internal_add( pthread_internal_t*  thread )
 {
     pthread_mutex_lock(&gThreadListLock);
@@ -157,7 +157,7 @@
     pthread_mutex_unlock(&gThreadListLock);
 }
 
-pthread_internal_t*
+__LIBC_ABI_PRIVATE__ pthread_internal_t*
 __get_thread(void)
 {
     void**  tls = (void**)__get_tls();
@@ -217,6 +217,7 @@
     pthread_exit( (void*)func(arg) );
 }
 
+__LIBC_ABI_PRIVATE__
 void _init_thread(pthread_internal_t * thread, pid_t kernel_id, pthread_attr_t * attr, void * stack_base)
 {
     if (attr == NULL) {
@@ -238,8 +239,6 @@
     thread->join_count = 0;
 
     thread->cleanup_stack = NULL;
-
-    _pthread_internal_add(thread);
 }
 
 
@@ -371,6 +370,8 @@
 
     _init_thread(thread, tid, (pthread_attr_t*)attr, stack);
 
+    _pthread_internal_add(thread);
+
     if (!madestack)
         thread->attr.flags |= PTHREAD_ATTR_FLAG_USER_STACK;
 
diff --git a/libc/bionic/pthread_internal.h b/libc/bionic/pthread_internal.h
index 655b8f3..268cacf 100644
--- a/libc/bionic/pthread_internal.h
+++ b/libc/bionic/pthread_internal.h
@@ -47,6 +47,8 @@
 } pthread_internal_t;
 
 extern void _init_thread(pthread_internal_t * thread, pid_t kernel_id, pthread_attr_t * attr, void * stack_base);
+void _pthread_internal_add( pthread_internal_t*  thread );
+pthread_internal_t* __get_thread(void);
 
 /* needed by posix-timers.c */
 
diff --git a/libc/kernel/common/linux/fb.h b/libc/kernel/common/linux/fb.h
index 18e43f0..451301c 100644
--- a/libc/kernel/common/linux/fb.h
+++ b/libc/kernel/common/linux/fb.h
@@ -241,156 +241,159 @@
 #define FB_FLAG_RATIO_16_9 128
 #define FB_FLAG_PIXEL_REPEAT 256
 /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define FB_FLAG_PREFERRED 512
+#define FB_FLAG_HW_CAPABLE 1024
 #define FB_ROTATE_UR 0
 #define FB_ROTATE_CW 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
 #define FB_ROTATE_UD 2
 #define FB_ROTATE_CCW 3
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
 #define PICOS2KHZ(a) (1000000000UL/(a))
 #define KHZ2PICOS(a) (1000000000UL/(a))
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
 struct fb_var_screeninfo {
  __u32 xres;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u32 yres;
  __u32 xres_virtual;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u32 yres_virtual;
  __u32 xoffset;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u32 yoffset;
  __u32 bits_per_pixel;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u32 grayscale;
  struct fb_bitfield red;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  struct fb_bitfield green;
  struct fb_bitfield blue;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  struct fb_bitfield transp;
  __u32 nonstd;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u32 activate;
  __u32 height;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u32 width;
  __u32 accel_flags;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u32 pixclock;
  __u32 left_margin;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u32 right_margin;
  __u32 upper_margin;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u32 lower_margin;
  __u32 hsync_len;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u32 vsync_len;
  __u32 sync;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u32 vmode;
  __u32 rotate;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u32 reserved[5];
 };
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
 struct fb_cmap {
  __u32 start;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u32 len;
  __u16 *red;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u16 *green;
  __u16 *blue;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u16 *transp;
 };
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
 struct fb_con2fbmap {
  __u32 console;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u32 framebuffer;
 };
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
 #define VESA_NO_BLANKING 0
 #define VESA_VSYNC_SUSPEND 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
 #define VESA_HSYNC_SUSPEND 2
 #define VESA_POWERDOWN 3
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
 enum {
  FB_BLANK_UNBLANK = VESA_NO_BLANKING,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  FB_BLANK_NORMAL = VESA_NO_BLANKING + 1,
  FB_BLANK_VSYNC_SUSPEND = VESA_VSYNC_SUSPEND + 1,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  FB_BLANK_HSYNC_SUSPEND = VESA_HSYNC_SUSPEND + 1,
  FB_BLANK_POWERDOWN = VESA_POWERDOWN + 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
 };
 #define FB_VBLANK_VBLANKING 0x001  
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
 #define FB_VBLANK_HBLANKING 0x002  
 #define FB_VBLANK_HAVE_VBLANK 0x004  
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
 #define FB_VBLANK_HAVE_HBLANK 0x008  
 #define FB_VBLANK_HAVE_COUNT 0x010  
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
 #define FB_VBLANK_HAVE_VCOUNT 0x020  
 #define FB_VBLANK_HAVE_HCOUNT 0x040  
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
 #define FB_VBLANK_VSYNCING 0x080  
 #define FB_VBLANK_HAVE_VSYNC 0x100  
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
 struct fb_vblank {
  __u32 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u32 count;
  __u32 vcount;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u32 hcount;
  __u32 reserved[4];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
 };
 #define ROP_COPY 0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
 #define ROP_XOR 1
 struct fb_copyarea {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u32 dx;
  __u32 dy;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u32 width;
  __u32 height;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u32 sx;
  __u32 sy;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
 };
 struct fb_fillrect {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u32 dx;
  __u32 dy;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u32 width;
  __u32 height;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u32 color;
  __u32 rop;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
 };
 struct fb_image {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u32 dx;
  __u32 dy;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u32 width;
  __u32 height;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u32 fg_color;
  __u32 bg_color;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u8 depth;
  const char *data;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  struct fb_cmap cmap;
 };
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
 #define FB_CUR_SETIMAGE 0x01
 #define FB_CUR_SETPOS 0x02
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
 #define FB_CUR_SETHOT 0x04
 #define FB_CUR_SETCMAP 0x08
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
 #define FB_CUR_SETSHAPE 0x10
 #define FB_CUR_SETSIZE 0x20
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
 #define FB_CUR_SETALL 0xFF
 struct fbcurpos {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u16 x, y;
 };
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
 struct fb_cursor {
  __u16 set;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  __u16 enable;
  __u16 rop;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  const char *mask;
  struct fbcurpos hot;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
  struct fb_image image;
 };
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
 #endif
diff --git a/libc/private/bionic_tls.h b/libc/private/bionic_tls.h
index 008fd2f..af19554 100644
--- a/libc/private/bionic_tls.h
+++ b/libc/private/bionic_tls.h
@@ -134,6 +134,9 @@
 /* return the stack base and size, used by our malloc debugger */
 extern void*  __get_stack_base(int  *p_stack_size);
 
+/* Initialize the TLS. */
+extern void __libc_init_tls(unsigned** elfdata);
+
 __END_DECLS
 
 #endif /* _SYS_TLS_H */
diff --git a/linker/linker.c b/linker/linker.c
index 9805b35..6b6282d 100644
--- a/linker/linker.c
+++ b/linker/linker.c
@@ -2054,10 +2054,6 @@
     }
 }
 
-#define ANDROID_TLS_SLOTS  BIONIC_TLS_SLOTS
-
-static void * __tls_area[ANDROID_TLS_SLOTS];
-
 /*
  * This code is called after the linker has linked itself and
  * fixed it's own GOT. It is safe to make references to externs
@@ -2076,18 +2072,6 @@
     const char *ldpath_env = NULL;
     const char *ldpreload_env = NULL;
 
-    /* Setup a temporary TLS area that is used to get a working
-     * errno for system calls.
-     */
-    __set_tls(__tls_area);
-
-    pid = getpid();
-
-#if TIMING
-    struct timeval t0, t1;
-    gettimeofday(&t0, 0);
-#endif
-
     /* NOTE: we store the elfdata pointer on a special location
      *       of the temporary TLS area in order to pass it to
      *       the C Library's runtime initializer.
@@ -2096,7 +2080,14 @@
      *       to point to a different location to ensure that no other
      *       shared library constructor can access it.
      */
-    __tls_area[TLS_SLOT_BIONIC_PREINIT] = elfdata;
+    __libc_init_tls(elfdata);
+
+    pid = getpid();
+
+#if TIMING
+    struct timeval t0, t1;
+    gettimeofday(&t0, 0);
+#endif
 
     /* Initialize environment functions, and get to the ELF aux vectors table */
     vecs = linker_env_init(vecs);