Add field to tls_tcb to support segmented stacks in LLVM
authorMichael Neumann <mneumann@ntecs.de>
Tue, 22 Jul 2014 23:27:48 +0000 (01:27 +0200)
committerMichael Neumann <mneumann@ntecs.de>
Tue, 22 Jul 2014 23:27:48 +0000 (01:27 +0200)
When segmented stack support is enabled, LLVM adds code in front of
every function to check if the stack is already exhausted, in which
case it calls __morestack. For this reason LLVM needs to know the lower
boundary of the stack to check against the stack pointer.
The stack boundary can be stored in this per-thread field (tcb_segstack)
and accessed via %fs:32 (x86_64) or %fs:16 (i386) from the code generated
by LLVM.

sys/cpu/i386/include/tls.h
sys/cpu/x86_64/include/tls.h

index e70c82f..2478330 100644 (file)
@@ -54,7 +54,9 @@ struct tls_tcb {
        void *tcb_dtv;                  /* Dynamic Thread Vector */
        void *tcb_pthread;              /* thread library's data*/
        int *tcb_errno_p;               /* pointer to per-thread errno */
-       void *tcb_unused[4];
+       void *tcb_segstack;             /* used for segmented stacks */
+                                       /* e.g. by LLVM to store stack bound */
+       void *tcb_unused[3];
 };
 
 struct tls_dtv {
index ea8f27e..b6b695c 100644 (file)
@@ -52,7 +52,9 @@ struct tls_tcb {
        void *tcb_dtv;                  /* Dynamic Thread Vector */
        void *tcb_pthread;              /* thread library's data*/
        int *tcb_errno_p;               /* pointer to per-thread errno */
-       void *tcb_unused[4];
+       void *tcb_segstack;             /* used for segmented stacks */
+                                       /* e.g. by LLVM to store stack bound */
+       void *tcb_unused[3];
 };
 
 struct tls_dtv {