Fix stack initialization code
[kopensolaris-gnu/glibc.git] / nptl / sysdeps / unix / sysv / solaris2 / kopensolaris-gnu / pthreaddef.h
index 2f7f2f9..bedd148 100644 (file)
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#include <ucontext.h>
-#include <sys/isa_defs.h>
-
 /* Get the arch-specific version.  */
 #include_next <pthreaddef.h>
 
 /* Register atfork handlers to protect signal_lock.  */
 extern void sigaction_atfork (void);
 
-#define PLATFORM_PTHREAD_INIT                   \
-    sigaction_atfork ();                        \
-    THREAD_SETMEM (pd, main_thread, 1);         \
-    ucontext_t _ctx;                            \
-    if (getcontext (&_ctx) == 0)                \
-      {                                         \
-        main_stackaddr = _ctx.uc_stack.ss_sp;   \
-        main_stacksize = _ctx.uc_stack.ss_size; \
+/* We need to tell the kernel about the allocated stack.  */
+#define PLATFORM_THREAD_START                   \
+    {                                           \
+      pd->stack.ss_sp = pd->stackblock;         \
+      pd->stack.ss_sp = pd->stackblock_size;    \
+      pd->stack.ss_flags = 0;                   \
+      setustack (&pd->stack);                   \
+    }
+
+#ifndef __stack_t_defined
+# define __need_stack_t
+# include <bits/sigstack.h>
+#endif
+
+#define PLATFORM_PTHREAD_INIT                       \
+    sigaction_atfork ();                            \
+    THREAD_SETMEM (pd, main_thread, 1);             \
+    stack_t *_stack;                                \
+       if (getustack (&_stack) == 0 && _stack)         \
+      {                                             \
+        pd->stackblock = _stack->ss_sp;             \
+        pd->stackblock_size = _stack->ss_size;      \
       }
 
 /* Additional descr fields.  */
-# define PLATFORM_DESCR_FIELDS              \
-    int sigpipe_disabled;                   \
-    int main_thread;
-
-/* Static variables.  */
-#define PLATFORM_STATIC_DECLS   \
-    void *main_stackaddr;       \
-    size_t main_stacksize;
-extern void *main_stackaddr;
-extern size_t main_stacksize;
-
-/* We can get the main thread's stack via getcontext (see above).  */
-#define GET_MAIN_STACK_INFO(stackaddr, stacksize)       \
-    ({*stackaddr = main_stackaddr + main_stacksize;     \
-      *stacksize = main_stacksize;                      \
-      0;})
+# define PLATFORM_DESCR_FIELDS  \
+    int main_thread;            \
+    stack_t stack;
+
+/* stackblock/stackblock_size should always be filled.  */
+#define GET_MAIN_STACK_INFO(stackaddr, stacksize)      ENOSYS
 
 /* Use tid as pthread_t (instead of descr).  */
 #define PTHREAD_T_IS_TID
@@ -66,6 +67,12 @@ extern size_t main_stacksize;
 /* The first thread has a large (10M) stack so use the arch defaults.  */
 #define PTHREAD_USE_ARCH_STACK_DEFAULT_SIZE
 
+/* It is known that the first lwpid is 1.  */
+#define FIRST_THREAD_TID       1
+
+/* We need to be passed the stacksize.  */
+#define NEED_STACK_SIZE
+
 /* __exit_thread_inline is the same for all architectures.  */
 #include <inline-syscall.h>