Errno must not be touched before TCB is initialized.
authorDavid Zhu <yuzhu@cs.berkeley.edu>
Tue, 23 Nov 2010 07:06:07 +0000 (23:06 -0800)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:57 +0000 (17:35 -0700)
Now making sbrk ignore errno in libc.
The alternative is to replicate the logic of sbrk for this particular
call of sbrk, which is even uglier.

Also added some documentation on errno, probably need more docs on TLS.

Documentation/glibc.txt
tools/compilers/gcc-glibc/glibc-2.11.1-ros/sysdeps/ros/sbrk.c

index 32d4338..ee2a2a8 100644 (file)
@@ -99,6 +99,20 @@ perhaps?).  If you add "unix/inet", you get more than just its Subdirs.
 Also note that these subdirs can depend on each other, noted in the "Depends"
 file.  Presumably this will cause them to get made...
 
+Errno & TLS
+--------------------------
+errno is a macro that may point to different locations depending on where you
+are in Glibc. errno_location is simply one of the options. 
+During dynamic linking, the linker points errno to a different location, so it
+is usable and can be referenced before TLS is fully set up in TLS_INIT_TP. 
+Because errno is valid when the linker runs, regular syscalls can be made.
+
+However for statically linked apps, several syscalls cannot use the ros_syscall
+macro, because there is no valid errno set up. 
+
+
+
+
 Unimplemented Stubs
 --------------------------
 There are a lot of things we haven't ported, but we have the stub functions so
index 2a58301..3e9bc82 100644 (file)
@@ -20,6 +20,7 @@
 #include <stdint.h>
 #include <unistd.h>
 #include <bits/libc-lock.h>
+#include <ros/syscall.h>
 #include <ros/memlayout.h>
 #include <ros/procinfo.h>
 #include <sys/mman.h>
@@ -45,10 +46,10 @@ __internal_setbrk (uintptr_t addr)
   {
     if(real_new_brk > BRK_END)
       return -1;
-
-    if (mmap((void*)real_brk, real_new_brk-real_brk,
+       // calling mmap directly to avoid referencing errno before it is initialized.
+    if ((void*)__ros_syscall(SYS_mmap, (void*)real_brk, real_new_brk-real_brk,
              PROT_READ | PROT_WRITE | PROT_EXEC,
-             MAP_FIXED | MAP_ANONYMOUS, -1, 0) != (void*)real_brk)
+             MAP_FIXED | MAP_ANONYMOUS, -1, 0, NULL) != (void*)real_brk)
       return -1;
   }
   else if(real_new_brk < real_brk)