Home | History | Annotate | Line # | Download | only in libgcc
      1   1.1  mrg /* Library support for -fsplit-stack.  */
      2  1.10  mrg /* Copyright (C) 2009-2022 Free Software Foundation, Inc.
      3   1.1  mrg    Contributed by Ian Lance Taylor <iant (at) google.com>.
      4   1.1  mrg 
      5   1.1  mrg This file is part of GCC.
      6   1.1  mrg 
      7   1.1  mrg GCC is free software; you can redistribute it and/or modify it under
      8   1.1  mrg the terms of the GNU General Public License as published by the Free
      9   1.1  mrg Software Foundation; either version 3, or (at your option) any later
     10   1.1  mrg version.
     11   1.1  mrg 
     12   1.1  mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
     13   1.1  mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
     14   1.1  mrg FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     15   1.1  mrg for more details.
     16   1.1  mrg 
     17   1.1  mrg Under Section 7 of GPL version 3, you are granted additional
     18   1.1  mrg permissions described in the GCC Runtime Library Exception, version
     19   1.1  mrg 3.1, as published by the Free Software Foundation.
     20   1.1  mrg 
     21   1.1  mrg You should have received a copy of the GNU General Public License and
     22   1.1  mrg a copy of the GCC Runtime Library Exception along with this program;
     23   1.1  mrg see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     24   1.1  mrg <http://www.gnu.org/licenses/>.  */
     25   1.1  mrg 
     26   1.9  mrg #pragma GCC optimize ("no-isolate-erroneous-paths-dereference")
     27   1.9  mrg 
     28   1.4  mrg /* powerpc 32-bit not supported.  */
     29   1.4  mrg #if !defined __powerpc__ || defined __powerpc64__
     30   1.4  mrg 
     31   1.1  mrg #include "tconfig.h"
     32   1.1  mrg #include "tsystem.h"
     33   1.1  mrg #include "coretypes.h"
     34   1.1  mrg #include "tm.h"
     35   1.1  mrg #include "libgcc_tm.h"
     36   1.1  mrg 
     37   1.8  mrg /* If inhibit_libc is defined, we cannot compile this file.  The
     38   1.1  mrg    effect is that people will not be able to use -fsplit-stack.  That
     39   1.1  mrg    is much better than failing the build particularly since people
     40   1.1  mrg    will want to define inhibit_libc while building a compiler which
     41   1.1  mrg    can build glibc.  */
     42   1.1  mrg 
     43   1.1  mrg #ifndef inhibit_libc
     44   1.1  mrg 
     45   1.1  mrg #include <assert.h>
     46   1.1  mrg #include <errno.h>
     47   1.1  mrg #include <signal.h>
     48   1.1  mrg #include <stdlib.h>
     49   1.1  mrg #include <string.h>
     50   1.1  mrg #include <unistd.h>
     51   1.1  mrg #include <sys/mman.h>
     52   1.1  mrg #include <sys/uio.h>
     53   1.1  mrg 
     54   1.1  mrg #include "generic-morestack.h"
     55   1.1  mrg 
     56   1.9  mrg /* Some systems use LD_PRELOAD or similar tricks to add hooks to
     57   1.9  mrg    mmap/munmap.  That breaks this code, because when we call mmap
     58   1.9  mrg    there is enough stack space for the system call but there is not,
     59   1.9  mrg    in general, enough stack space to run a hook.  Try to avoid the
     60   1.9  mrg    problem by calling syscall directly.  We only do this on GNU/Linux
     61   1.9  mrg    for now, but it should be easy to add support for more systems with
     62   1.9  mrg    testing.  */
     63   1.9  mrg 
     64   1.9  mrg #if defined(__gnu_linux__)
     65   1.9  mrg 
     66   1.9  mrg #include <sys/syscall.h>
     67   1.9  mrg 
     68   1.9  mrg #if defined(SYS_mmap) || defined(SYS_mmap2)
     69   1.9  mrg 
     70   1.9  mrg #ifdef SYS_mmap2
     71   1.9  mrg #define MORESTACK_MMAP SYS_mmap2
     72   1.9  mrg #define MORESTACK_ADJUST_OFFSET(x) ((x) / 4096ULL)
     73   1.9  mrg #else
     74   1.9  mrg #define MORESTACK_MMAP SYS_mmap
     75   1.9  mrg #define MORESTACK_ADJUST_OFFSET(x) (x)
     76   1.9  mrg #endif
     77   1.9  mrg 
     78   1.9  mrg static void *
     79   1.9  mrg morestack_mmap (void *addr, size_t length, int prot, int flags, int fd,
     80   1.9  mrg 		off_t offset)
     81   1.9  mrg {
     82   1.9  mrg   offset = MORESTACK_ADJUST_OFFSET (offset);
     83   1.9  mrg 
     84   1.9  mrg #ifdef __s390__
     85   1.9  mrg   long args[6] = { (long) addr, (long) length, (long) prot, (long) flags,
     86   1.9  mrg 		   (long) fd, (long) offset };
     87   1.9  mrg   return (void *) syscall (MORESTACK_MMAP, args);
     88   1.9  mrg #else
     89   1.9  mrg   return (void *) syscall (MORESTACK_MMAP, addr, length, prot, flags, fd,
     90   1.9  mrg 			   offset);
     91   1.9  mrg #endif
     92   1.9  mrg }
     93   1.9  mrg 
     94   1.9  mrg #define mmap morestack_mmap
     95   1.9  mrg 
     96   1.9  mrg #endif /* defined(SYS_MMAP) || defined(SYS_mmap2) */
     97   1.9  mrg 
     98   1.9  mrg #if defined(SYS_munmap)
     99   1.9  mrg 
    100   1.9  mrg static int
    101   1.9  mrg morestack_munmap (void * addr, size_t length)
    102   1.9  mrg {
    103   1.9  mrg   return (int) syscall (SYS_munmap, addr, length);
    104   1.9  mrg }
    105   1.9  mrg 
    106   1.9  mrg #define munmap morestack_munmap
    107   1.9  mrg 
    108   1.9  mrg #endif /* defined(SYS_munmap) */
    109   1.9  mrg 
    110   1.9  mrg #endif /* defined(__gnu_linux__) */
    111   1.9  mrg 
    112   1.1  mrg typedef unsigned uintptr_type __attribute__ ((mode (pointer)));
    113   1.1  mrg 
    114   1.1  mrg /* This file contains subroutines that are used by code compiled with
    115   1.1  mrg    -fsplit-stack.  */
    116   1.1  mrg 
    117   1.1  mrg /* Declare functions to avoid warnings--there is no header file for
    118   1.1  mrg    these internal functions.  We give most of these functions the
    119   1.1  mrg    flatten attribute in order to minimize their stack usage--here we
    120   1.1  mrg    must minimize stack usage even at the cost of code size, and in
    121   1.1  mrg    general inlining everything will do that.  */
    122   1.1  mrg 
    123   1.1  mrg extern void
    124   1.1  mrg __generic_morestack_set_initial_sp (void *sp, size_t len)
    125   1.1  mrg   __attribute__ ((no_split_stack, flatten, visibility ("hidden")));
    126   1.1  mrg 
    127   1.1  mrg extern void *
    128   1.1  mrg __generic_morestack (size_t *frame_size, void *old_stack, size_t param_size)
    129   1.1  mrg   __attribute__ ((no_split_stack, flatten, visibility ("hidden")));
    130   1.1  mrg 
    131   1.1  mrg extern void *
    132   1.1  mrg __generic_releasestack (size_t *pavailable)
    133   1.1  mrg   __attribute__ ((no_split_stack, flatten, visibility ("hidden")));
    134   1.1  mrg 
    135   1.1  mrg extern void
    136   1.1  mrg __morestack_block_signals (void)
    137   1.1  mrg   __attribute__ ((no_split_stack, flatten, visibility ("hidden")));
    138   1.1  mrg 
    139   1.1  mrg extern void
    140   1.1  mrg __morestack_unblock_signals (void)
    141   1.1  mrg   __attribute__ ((no_split_stack, flatten, visibility ("hidden")));
    142   1.1  mrg 
    143   1.1  mrg extern size_t
    144   1.1  mrg __generic_findstack (void *stack)
    145   1.1  mrg   __attribute__ ((no_split_stack, flatten, visibility ("hidden")));
    146   1.1  mrg 
    147   1.1  mrg extern void
    148   1.1  mrg __morestack_load_mmap (void)
    149   1.1  mrg   __attribute__ ((no_split_stack, visibility ("hidden")));
    150   1.1  mrg 
    151   1.1  mrg extern void *
    152   1.1  mrg __morestack_allocate_stack_space (size_t size)
    153   1.1  mrg   __attribute__ ((visibility ("hidden")));
    154   1.1  mrg 
    155   1.1  mrg /* These are functions which -fsplit-stack code can call.  These are
    156   1.1  mrg    not called by the compiler, and are not hidden.  FIXME: These
    157   1.1  mrg    should be in some header file somewhere, somehow.  */
    158   1.1  mrg 
    159   1.1  mrg extern void *
    160   1.1  mrg __splitstack_find (void *, void *, size_t *, void **, void **, void **)
    161   1.1  mrg   __attribute__ ((visibility ("default")));
    162   1.1  mrg 
    163   1.1  mrg extern void
    164   1.1  mrg __splitstack_block_signals (int *, int *)
    165   1.1  mrg   __attribute__ ((visibility ("default")));
    166   1.1  mrg 
    167   1.1  mrg extern void
    168   1.1  mrg __splitstack_getcontext (void *context[10])
    169   1.1  mrg   __attribute__ ((no_split_stack, visibility ("default")));
    170   1.1  mrg 
    171   1.1  mrg extern void
    172   1.1  mrg __splitstack_setcontext (void *context[10])
    173   1.1  mrg   __attribute__ ((no_split_stack, visibility ("default")));
    174   1.1  mrg 
    175   1.1  mrg extern void *
    176   1.1  mrg __splitstack_makecontext (size_t, void *context[10], size_t *)
    177   1.1  mrg   __attribute__ ((visibility ("default")));
    178   1.1  mrg 
    179   1.1  mrg extern void *
    180   1.1  mrg __splitstack_resetcontext (void *context[10], size_t *)
    181   1.1  mrg   __attribute__ ((visibility ("default")));
    182   1.1  mrg 
    183   1.1  mrg extern void
    184   1.1  mrg __splitstack_releasecontext (void *context[10])
    185   1.1  mrg   __attribute__ ((visibility ("default")));
    186   1.1  mrg 
    187   1.1  mrg extern void
    188   1.1  mrg __splitstack_block_signals_context (void *context[10], int *, int *)
    189   1.1  mrg   __attribute__ ((visibility ("default")));
    190   1.1  mrg 
    191   1.1  mrg extern void *
    192   1.1  mrg __splitstack_find_context (void *context[10], size_t *, void **, void **,
    193   1.1  mrg 			   void **)
    194   1.1  mrg   __attribute__ ((visibility ("default")));
    195   1.1  mrg 
    196   1.1  mrg /* These functions must be defined by the processor specific code.  */
    197   1.1  mrg 
    198   1.1  mrg extern void *__morestack_get_guard (void)
    199   1.1  mrg   __attribute__ ((no_split_stack, visibility ("hidden")));
    200   1.1  mrg 
    201   1.1  mrg extern void __morestack_set_guard (void *)
    202   1.1  mrg   __attribute__ ((no_split_stack, visibility ("hidden")));
    203   1.1  mrg 
    204   1.1  mrg extern void *__morestack_make_guard (void *, size_t)
    205   1.1  mrg   __attribute__ ((no_split_stack, visibility ("hidden")));
    206   1.1  mrg 
    207   1.1  mrg /* When we allocate a stack segment we put this header at the
    208   1.1  mrg    start.  */
    209   1.1  mrg 
    210   1.1  mrg struct stack_segment
    211   1.1  mrg {
    212   1.1  mrg   /* The previous stack segment--when a function running on this stack
    213   1.1  mrg      segment returns, it will run on the previous one.  */
    214   1.1  mrg   struct stack_segment *prev;
    215   1.1  mrg   /* The next stack segment, if it has been allocated--when a function
    216   1.1  mrg      is running on this stack segment, the next one is not being
    217   1.1  mrg      used.  */
    218   1.1  mrg   struct stack_segment *next;
    219   1.1  mrg   /* The total size of this stack segment.  */
    220   1.1  mrg   size_t size;
    221   1.1  mrg   /* The stack address when this stack was created.  This is used when
    222   1.1  mrg      popping the stack.  */
    223   1.1  mrg   void *old_stack;
    224   1.1  mrg   /* A list of memory blocks allocated by dynamic stack
    225   1.1  mrg      allocation.  */
    226   1.1  mrg   struct dynamic_allocation_blocks *dynamic_allocation;
    227   1.1  mrg   /* A list of dynamic memory blocks no longer needed.  */
    228   1.1  mrg   struct dynamic_allocation_blocks *free_dynamic_allocation;
    229   1.1  mrg   /* An extra pointer in case we need some more information some
    230   1.1  mrg      day.  */
    231   1.1  mrg   void *extra;
    232   1.1  mrg };
    233   1.1  mrg 
    234   1.1  mrg /* This structure holds the (approximate) initial stack pointer and
    235   1.1  mrg    size for the system supplied stack for a thread.  This is set when
    236   1.1  mrg    the thread is created.  We also store a sigset_t here to hold the
    237   1.1  mrg    signal mask while splitting the stack, since we don't want to store
    238   1.1  mrg    that on the stack.  */
    239   1.1  mrg 
    240   1.1  mrg struct initial_sp
    241   1.1  mrg {
    242   1.1  mrg   /* The initial stack pointer.  */
    243   1.1  mrg   void *sp;
    244   1.1  mrg   /* The stack length.  */
    245   1.1  mrg   size_t len;
    246   1.1  mrg   /* A signal mask, put here so that the thread can use it without
    247   1.1  mrg      needing stack space.  */
    248   1.1  mrg   sigset_t mask;
    249   1.1  mrg   /* Non-zero if we should not block signals.  This is a reversed flag
    250   1.1  mrg      so that the default zero value is the safe value.  The type is
    251   1.1  mrg      uintptr_type because it replaced one of the void * pointers in
    252   1.1  mrg      extra.  */
    253   1.1  mrg   uintptr_type dont_block_signals;
    254   1.1  mrg   /* Some extra space for later extensibility.  */
    255   1.1  mrg   void *extra[4];
    256   1.1  mrg };
    257   1.1  mrg 
    258   1.1  mrg /* A list of memory blocks allocated by dynamic stack allocation.
    259   1.1  mrg    This is used for code that calls alloca or uses variably sized
    260   1.1  mrg    arrays.  */
    261   1.1  mrg 
    262   1.1  mrg struct dynamic_allocation_blocks
    263   1.1  mrg {
    264   1.1  mrg   /* The next block in the list.  */
    265   1.1  mrg   struct dynamic_allocation_blocks *next;
    266   1.1  mrg   /* The size of the allocated memory.  */
    267   1.1  mrg   size_t size;
    268   1.1  mrg   /* The allocated memory.  */
    269   1.1  mrg   void *block;
    270   1.1  mrg };
    271   1.1  mrg 
    272   1.1  mrg /* These thread local global variables must be shared by all split
    273   1.1  mrg    stack code across shared library boundaries.  Therefore, they have
    274   1.1  mrg    default visibility.  They have extensibility fields if needed for
    275   1.1  mrg    new versions.  If more radical changes are needed, new code can be
    276   1.1  mrg    written using new variable names, while still using the existing
    277   1.1  mrg    variables in a backward compatible manner.  Symbol versioning is
    278   1.1  mrg    also used, although, since these variables are only referenced by
    279   1.1  mrg    code in this file and generic-morestack-thread.c, it is likely that
    280   1.1  mrg    simply using new names will suffice.  */
    281   1.1  mrg 
    282   1.1  mrg /* The first stack segment allocated for this thread.  */
    283   1.1  mrg 
    284   1.1  mrg __thread struct stack_segment *__morestack_segments
    285   1.1  mrg   __attribute__ ((visibility ("default")));
    286   1.1  mrg 
    287   1.1  mrg /* The stack segment that we think we are currently using.  This will
    288   1.1  mrg    be correct in normal usage, but will be incorrect if an exception
    289   1.1  mrg    unwinds into a different stack segment or if longjmp jumps to a
    290   1.1  mrg    different stack segment.  */
    291   1.1  mrg 
    292   1.1  mrg __thread struct stack_segment *__morestack_current_segment
    293   1.1  mrg   __attribute__ ((visibility ("default")));
    294   1.1  mrg 
    295   1.1  mrg /* The initial stack pointer and size for this thread.  */
    296   1.1  mrg 
    297   1.1  mrg __thread struct initial_sp __morestack_initial_sp
    298   1.1  mrg   __attribute__ ((visibility ("default")));
    299   1.1  mrg 
    300   1.1  mrg /* A static signal mask, to avoid taking up stack space.  */
    301   1.1  mrg 
    302   1.1  mrg static sigset_t __morestack_fullmask;
    303   1.1  mrg 
    304   1.7  mrg /* Page size, as returned from getpagesize(). Set on startup. */
    305   1.7  mrg static unsigned int static_pagesize;
    306   1.7  mrg 
    307   1.7  mrg /* Set on startup to non-zero value if SPLIT_STACK_GUARD env var is set. */
    308   1.7  mrg static int use_guard_page;
    309   1.7  mrg 
    310   1.1  mrg /* Convert an integer to a decimal string without using much stack
    311   1.1  mrg    space.  Return a pointer to the part of the buffer to use.  We this
    312   1.1  mrg    instead of sprintf because sprintf will require too much stack
    313   1.1  mrg    space.  */
    314   1.1  mrg 
    315   1.1  mrg static char *
    316   1.1  mrg print_int (int val, char *buf, int buflen, size_t *print_len)
    317   1.1  mrg {
    318   1.1  mrg   int is_negative;
    319   1.1  mrg   int i;
    320   1.1  mrg   unsigned int uval;
    321   1.1  mrg 
    322   1.1  mrg   uval = (unsigned int) val;
    323   1.1  mrg   if (val >= 0)
    324   1.1  mrg     is_negative = 0;
    325   1.1  mrg   else
    326   1.1  mrg     {
    327   1.1  mrg       is_negative = 1;
    328   1.1  mrg       uval = - uval;
    329   1.1  mrg     }
    330   1.1  mrg 
    331   1.1  mrg   i = buflen;
    332   1.1  mrg   do
    333   1.1  mrg     {
    334   1.1  mrg       --i;
    335   1.1  mrg       buf[i] = '0' + (uval % 10);
    336   1.1  mrg       uval /= 10;
    337   1.1  mrg     }
    338   1.1  mrg   while (uval != 0 && i > 0);
    339   1.1  mrg 
    340   1.1  mrg   if (is_negative)
    341   1.1  mrg     {
    342   1.1  mrg       if (i > 0)
    343   1.1  mrg 	--i;
    344   1.1  mrg       buf[i] = '-';
    345   1.1  mrg     }
    346   1.1  mrg 
    347   1.1  mrg   *print_len = buflen - i;
    348   1.1  mrg   return buf + i;
    349   1.1  mrg }
    350   1.1  mrg 
    351   1.1  mrg /* Print the string MSG/LEN, the errno number ERR, and a newline on
    352   1.1  mrg    stderr.  Then crash.  */
    353   1.1  mrg 
    354   1.1  mrg void
    355   1.1  mrg __morestack_fail (const char *, size_t, int) __attribute__ ((noreturn));
    356   1.1  mrg 
    357   1.1  mrg void
    358   1.1  mrg __morestack_fail (const char *msg, size_t len, int err)
    359   1.1  mrg {
    360   1.1  mrg   char buf[24];
    361   1.1  mrg   static const char nl[] = "\n";
    362   1.1  mrg   struct iovec iov[3];
    363   1.1  mrg   union { char *p; const char *cp; } const_cast;
    364   1.1  mrg 
    365   1.1  mrg   const_cast.cp = msg;
    366   1.1  mrg   iov[0].iov_base = const_cast.p;
    367   1.1  mrg   iov[0].iov_len = len;
    368   1.1  mrg   /* We can't call strerror, because it may try to translate the error
    369   1.1  mrg      message, and that would use too much stack space.  */
    370   1.1  mrg   iov[1].iov_base = print_int (err, buf, sizeof buf, &iov[1].iov_len);
    371   1.1  mrg   const_cast.cp = &nl[0];
    372   1.1  mrg   iov[2].iov_base = const_cast.p;
    373   1.1  mrg   iov[2].iov_len = sizeof nl - 1;
    374   1.1  mrg   /* FIXME: On systems without writev we need to issue three write
    375   1.1  mrg      calls, or punt on printing errno.  For now this is irrelevant
    376   1.1  mrg      since stack splitting only works on GNU/Linux anyhow.  */
    377   1.1  mrg   writev (2, iov, 3);
    378   1.1  mrg   abort ();
    379   1.1  mrg }
    380   1.1  mrg 
    381   1.1  mrg /* Allocate a new stack segment.  FRAME_SIZE is the required frame
    382   1.1  mrg    size.  */
    383   1.1  mrg 
    384   1.1  mrg static struct stack_segment *
    385   1.1  mrg allocate_segment (size_t frame_size)
    386   1.1  mrg {
    387   1.1  mrg   unsigned int pagesize;
    388   1.1  mrg   unsigned int overhead;
    389   1.1  mrg   unsigned int allocate;
    390   1.1  mrg   void *space;
    391   1.1  mrg   struct stack_segment *pss;
    392   1.1  mrg 
    393   1.1  mrg   pagesize = static_pagesize;
    394   1.1  mrg   overhead = sizeof (struct stack_segment);
    395   1.1  mrg 
    396   1.1  mrg   allocate = pagesize;
    397   1.1  mrg   if (allocate < MINSIGSTKSZ)
    398   1.1  mrg     allocate = ((MINSIGSTKSZ + overhead + pagesize - 1)
    399   1.1  mrg 		& ~ (pagesize - 1));
    400   1.1  mrg   if (allocate < frame_size)
    401   1.1  mrg     allocate = ((frame_size + overhead + pagesize - 1)
    402   1.1  mrg 		& ~ (pagesize - 1));
    403   1.1  mrg 
    404   1.1  mrg   if (use_guard_page)
    405   1.1  mrg     allocate += pagesize;
    406   1.1  mrg 
    407   1.1  mrg   /* FIXME: If this binary requires an executable stack, then we need
    408   1.1  mrg      to set PROT_EXEC.  Unfortunately figuring that out is complicated
    409   1.1  mrg      and target dependent.  We would need to use dl_iterate_phdr to
    410   1.1  mrg      see if there is any object which does not have a PT_GNU_STACK
    411   1.1  mrg      phdr, though only for architectures which use that mechanism.  */
    412   1.1  mrg   space = mmap (NULL, allocate, PROT_READ | PROT_WRITE,
    413   1.1  mrg 		MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
    414   1.1  mrg   if (space == MAP_FAILED)
    415   1.1  mrg     {
    416   1.1  mrg       static const char msg[] =
    417   1.1  mrg 	"unable to allocate additional stack space: errno ";
    418   1.1  mrg       __morestack_fail (msg, sizeof msg - 1, errno);
    419   1.1  mrg     }
    420   1.1  mrg 
    421   1.1  mrg   if (use_guard_page)
    422   1.1  mrg     {
    423   1.1  mrg       void *guard;
    424   1.1  mrg 
    425   1.3  mrg #ifdef __LIBGCC_STACK_GROWS_DOWNWARD__
    426   1.1  mrg       guard = space;
    427   1.1  mrg       space = (char *) space + pagesize;
    428   1.1  mrg #else
    429   1.1  mrg       guard = space + allocate - pagesize;
    430   1.1  mrg #endif
    431   1.1  mrg 
    432   1.1  mrg       mprotect (guard, pagesize, PROT_NONE);
    433   1.1  mrg       allocate -= pagesize;
    434   1.1  mrg     }
    435   1.1  mrg 
    436   1.1  mrg   pss = (struct stack_segment *) space;
    437   1.1  mrg 
    438   1.1  mrg   pss->prev = NULL;
    439   1.1  mrg   pss->next = NULL;
    440   1.1  mrg   pss->size = allocate - overhead;
    441   1.1  mrg   pss->dynamic_allocation = NULL;
    442   1.1  mrg   pss->free_dynamic_allocation = NULL;
    443   1.1  mrg   pss->extra = NULL;
    444   1.1  mrg 
    445   1.1  mrg   return pss;
    446   1.1  mrg }
    447   1.1  mrg 
    448   1.1  mrg /* Free a list of dynamic blocks.  */
    449   1.1  mrg 
    450   1.1  mrg static void
    451   1.1  mrg free_dynamic_blocks (struct dynamic_allocation_blocks *p)
    452   1.1  mrg {
    453   1.1  mrg   while (p != NULL)
    454   1.1  mrg     {
    455   1.1  mrg       struct dynamic_allocation_blocks *next;
    456   1.1  mrg 
    457   1.1  mrg       next = p->next;
    458   1.1  mrg       free (p->block);
    459   1.1  mrg       free (p);
    460   1.1  mrg       p = next;
    461   1.1  mrg     }
    462   1.1  mrg }
    463   1.1  mrg 
    464   1.1  mrg /* Merge two lists of dynamic blocks.  */
    465   1.1  mrg 
    466   1.1  mrg static struct dynamic_allocation_blocks *
    467   1.1  mrg merge_dynamic_blocks (struct dynamic_allocation_blocks *a,
    468   1.1  mrg 		      struct dynamic_allocation_blocks *b)
    469   1.1  mrg {
    470   1.1  mrg   struct dynamic_allocation_blocks **pp;
    471   1.1  mrg 
    472   1.1  mrg   if (a == NULL)
    473   1.1  mrg     return b;
    474   1.1  mrg   if (b == NULL)
    475   1.1  mrg     return a;
    476   1.1  mrg   for (pp = &a->next; *pp != NULL; pp = &(*pp)->next)
    477   1.1  mrg     ;
    478   1.1  mrg   *pp = b;
    479   1.1  mrg   return a;
    480   1.1  mrg }
    481   1.1  mrg 
    482   1.1  mrg /* Release stack segments.  If FREE_DYNAMIC is non-zero, we also free
    483   1.1  mrg    any dynamic blocks.  Otherwise we return them.  */
    484   1.1  mrg 
    485   1.1  mrg struct dynamic_allocation_blocks *
    486   1.1  mrg __morestack_release_segments (struct stack_segment **pp, int free_dynamic)
    487   1.1  mrg {
    488   1.1  mrg   struct dynamic_allocation_blocks *ret;
    489   1.1  mrg   struct stack_segment *pss;
    490   1.1  mrg 
    491   1.1  mrg   ret = NULL;
    492   1.1  mrg   pss = *pp;
    493   1.1  mrg   while (pss != NULL)
    494   1.1  mrg     {
    495   1.1  mrg       struct stack_segment *next;
    496   1.1  mrg       unsigned int allocate;
    497   1.1  mrg 
    498   1.1  mrg       next = pss->next;
    499   1.1  mrg 
    500   1.1  mrg       if (pss->dynamic_allocation != NULL
    501   1.1  mrg 	  || pss->free_dynamic_allocation != NULL)
    502   1.1  mrg 	{
    503   1.1  mrg 	  if (free_dynamic)
    504   1.1  mrg 	    {
    505   1.1  mrg 	      free_dynamic_blocks (pss->dynamic_allocation);
    506   1.1  mrg 	      free_dynamic_blocks (pss->free_dynamic_allocation);
    507   1.1  mrg 	    }
    508   1.1  mrg 	  else
    509   1.1  mrg 	    {
    510   1.1  mrg 	      ret = merge_dynamic_blocks (pss->dynamic_allocation, ret);
    511   1.1  mrg 	      ret = merge_dynamic_blocks (pss->free_dynamic_allocation, ret);
    512   1.1  mrg 	    }
    513   1.1  mrg 	}
    514   1.1  mrg 
    515   1.1  mrg       allocate = pss->size + sizeof (struct stack_segment);
    516   1.1  mrg       if (munmap (pss, allocate) < 0)
    517   1.1  mrg 	{
    518   1.1  mrg 	  static const char msg[] = "munmap of stack space failed: errno ";
    519   1.1  mrg 	  __morestack_fail (msg, sizeof msg - 1, errno);
    520   1.1  mrg 	}
    521   1.1  mrg 
    522   1.1  mrg       pss = next;
    523   1.1  mrg     }
    524   1.1  mrg   *pp = NULL;
    525   1.1  mrg 
    526   1.1  mrg   return ret;
    527   1.1  mrg }
    528   1.1  mrg 
    529   1.1  mrg /* This function is called by a processor specific function to set the
    530   1.1  mrg    initial stack pointer for a thread.  The operating system will
    531   1.1  mrg    always create a stack for a thread.  Here we record a stack pointer
    532   1.1  mrg    near the base of that stack.  The size argument lets the processor
    533   1.1  mrg    specific code estimate how much stack space is available on this
    534   1.1  mrg    initial stack.  */
    535   1.1  mrg 
    536   1.1  mrg void
    537   1.1  mrg __generic_morestack_set_initial_sp (void *sp, size_t len)
    538   1.1  mrg {
    539   1.1  mrg   /* The stack pointer most likely starts on a page boundary.  Adjust
    540   1.1  mrg      to the nearest 512 byte boundary.  It's not essential that we be
    541   1.1  mrg      precise here; getting it wrong will just leave some stack space
    542   1.1  mrg      unused.  */
    543   1.3  mrg #ifdef __LIBGCC_STACK_GROWS_DOWNWARD__
    544   1.1  mrg   sp = (void *) ((((__UINTPTR_TYPE__) sp + 511U) / 512U) * 512U);
    545   1.1  mrg #else
    546   1.1  mrg   sp = (void *) ((((__UINTPTR_TYPE__) sp - 511U) / 512U) * 512U);
    547   1.1  mrg #endif
    548   1.1  mrg 
    549   1.1  mrg   __morestack_initial_sp.sp = sp;
    550   1.1  mrg   __morestack_initial_sp.len = len;
    551   1.1  mrg   sigemptyset (&__morestack_initial_sp.mask);
    552   1.1  mrg 
    553   1.1  mrg   sigfillset (&__morestack_fullmask);
    554   1.1  mrg #if defined(__GLIBC__) && defined(__linux__)
    555   1.1  mrg   /* In glibc, the first two real time signals are used by the NPTL
    556   1.1  mrg      threading library.  By taking them out of the set of signals, we
    557   1.1  mrg      avoiding copying the signal mask in pthread_sigmask.  More
    558   1.1  mrg      importantly, pthread_sigmask uses less stack space on x86_64.  */
    559   1.1  mrg   sigdelset (&__morestack_fullmask, __SIGRTMIN);
    560   1.1  mrg   sigdelset (&__morestack_fullmask, __SIGRTMIN + 1);
    561   1.1  mrg #endif
    562   1.1  mrg }
    563   1.1  mrg 
    564   1.1  mrg /* This function is called by a processor specific function which is
    565   1.1  mrg    run in the prologue when more stack is needed.  The processor
    566   1.1  mrg    specific function handles the details of saving registers and
    567   1.1  mrg    frobbing the actual stack pointer.  This function is responsible
    568   1.1  mrg    for allocating a new stack segment and for copying a parameter
    569   1.1  mrg    block from the old stack to the new one.  On function entry
    570   1.1  mrg    *PFRAME_SIZE is the size of the required stack frame--the returned
    571   1.1  mrg    stack must be at least this large.  On function exit *PFRAME_SIZE
    572   1.1  mrg    is the amount of space remaining on the allocated stack.  OLD_STACK
    573   1.1  mrg    points at the parameters the old stack (really the current one
    574   1.1  mrg    while this function is running).  OLD_STACK is saved so that it can
    575   1.1  mrg    be returned by a later call to __generic_releasestack.  PARAM_SIZE
    576   1.1  mrg    is the size in bytes of parameters to copy to the new stack.  This
    577   1.1  mrg    function returns a pointer to the new stack segment, pointing to
    578   1.1  mrg    the memory after the parameters have been copied.  The returned
    579   1.1  mrg    value minus the returned *PFRAME_SIZE (or plus if the stack grows
    580   1.1  mrg    upward) is the first address on the stack which should not be used.
    581   1.1  mrg 
    582   1.1  mrg    This function is running on the old stack and has only a limited
    583   1.1  mrg    amount of stack space available.  */
    584   1.1  mrg 
    585   1.1  mrg void *
    586   1.1  mrg __generic_morestack (size_t *pframe_size, void *old_stack, size_t param_size)
    587   1.1  mrg {
    588   1.1  mrg   size_t frame_size = *pframe_size;
    589   1.1  mrg   struct stack_segment *current;
    590   1.1  mrg   struct stack_segment **pp;
    591   1.1  mrg   struct dynamic_allocation_blocks *dynamic;
    592   1.1  mrg   char *from;
    593   1.1  mrg   char *to;
    594   1.1  mrg   void *ret;
    595   1.1  mrg   size_t i;
    596   1.1  mrg   size_t aligned;
    597   1.1  mrg 
    598   1.1  mrg   current = __morestack_current_segment;
    599   1.1  mrg 
    600   1.1  mrg   pp = current != NULL ? &current->next : &__morestack_segments;
    601   1.1  mrg   if (*pp != NULL && (*pp)->size < frame_size)
    602   1.1  mrg     dynamic = __morestack_release_segments (pp, 0);
    603   1.1  mrg   else
    604   1.1  mrg     dynamic = NULL;
    605   1.1  mrg   current = *pp;
    606   1.1  mrg 
    607   1.1  mrg   if (current == NULL)
    608   1.1  mrg     {
    609   1.1  mrg       current = allocate_segment (frame_size + param_size);
    610   1.1  mrg       current->prev = __morestack_current_segment;
    611   1.1  mrg       *pp = current;
    612   1.1  mrg     }
    613   1.1  mrg 
    614   1.1  mrg   current->old_stack = old_stack;
    615   1.1  mrg 
    616   1.1  mrg   __morestack_current_segment = current;
    617   1.1  mrg 
    618   1.1  mrg   if (dynamic != NULL)
    619   1.1  mrg     {
    620   1.1  mrg       /* Move the free blocks onto our list.  We don't want to call
    621   1.1  mrg 	 free here, as we are short on stack space.  */
    622   1.1  mrg       current->free_dynamic_allocation =
    623   1.1  mrg 	merge_dynamic_blocks (dynamic, current->free_dynamic_allocation);
    624   1.1  mrg     }
    625   1.1  mrg 
    626   1.1  mrg   *pframe_size = current->size - param_size;
    627   1.1  mrg 
    628   1.1  mrg   /* Align the returned stack to a 32-byte boundary.  */
    629   1.1  mrg   aligned = (param_size + 31) & ~ (size_t) 31;
    630   1.1  mrg 
    631   1.3  mrg #ifdef __LIBGCC_STACK_GROWS_DOWNWARD__
    632   1.1  mrg   {
    633   1.1  mrg     char *bottom = (char *) (current + 1) + current->size;
    634   1.1  mrg     to = bottom - aligned;
    635   1.1  mrg     ret = bottom - aligned;
    636   1.1  mrg   }
    637   1.1  mrg #else
    638   1.1  mrg   to = current + 1;
    639   1.1  mrg   to += aligned - param_size;
    640   1.1  mrg   ret = (char *) (current + 1) + aligned;
    641   1.1  mrg #endif
    642   1.1  mrg 
    643   1.1  mrg   /* We don't call memcpy to avoid worrying about the dynamic linker
    644   1.1  mrg      trying to resolve it.  */
    645   1.1  mrg   from = (char *) old_stack;
    646   1.1  mrg   for (i = 0; i < param_size; i++)
    647   1.1  mrg     *to++ = *from++;
    648   1.1  mrg 
    649   1.1  mrg   return ret;
    650   1.1  mrg }
    651   1.1  mrg 
    652   1.1  mrg /* This function is called by a processor specific function when it is
    653   1.1  mrg    ready to release a stack segment.  We don't actually release the
    654   1.1  mrg    stack segment, we just move back to the previous one.  The current
    655   1.1  mrg    stack segment will still be available if we need it in
    656   1.1  mrg    __generic_morestack.  This returns a pointer to the new stack
    657   1.1  mrg    segment to use, which is the one saved by a previous call to
    658   1.1  mrg    __generic_morestack.  The processor specific function is then
    659   1.1  mrg    responsible for actually updating the stack pointer.  This sets
    660   1.1  mrg    *PAVAILABLE to the amount of stack space now available.  */
    661   1.1  mrg 
    662   1.1  mrg void *
    663   1.1  mrg __generic_releasestack (size_t *pavailable)
    664   1.1  mrg {
    665   1.1  mrg   struct stack_segment *current;
    666   1.1  mrg   void *old_stack;
    667   1.1  mrg 
    668   1.1  mrg   current = __morestack_current_segment;
    669   1.1  mrg   old_stack = current->old_stack;
    670   1.1  mrg   current = current->prev;
    671   1.1  mrg   __morestack_current_segment = current;
    672   1.1  mrg 
    673   1.1  mrg   if (current != NULL)
    674   1.1  mrg     {
    675   1.3  mrg #ifdef __LIBGCC_STACK_GROWS_DOWNWARD__
    676   1.1  mrg       *pavailable = (char *) old_stack - (char *) (current + 1);
    677   1.1  mrg #else
    678   1.1  mrg       *pavailable = (char *) (current + 1) + current->size - (char *) old_stack;
    679   1.1  mrg #endif
    680   1.1  mrg     }
    681   1.1  mrg   else
    682   1.1  mrg     {
    683   1.1  mrg       size_t used;
    684   1.1  mrg 
    685   1.1  mrg       /* We have popped back to the original stack.  */
    686   1.3  mrg #ifdef __LIBGCC_STACK_GROWS_DOWNWARD__
    687   1.1  mrg       if ((char *) old_stack >= (char *) __morestack_initial_sp.sp)
    688   1.1  mrg 	used = 0;
    689   1.1  mrg       else
    690   1.1  mrg 	used = (char *) __morestack_initial_sp.sp - (char *) old_stack;
    691   1.1  mrg #else
    692   1.1  mrg       if ((char *) old_stack <= (char *) __morestack_initial_sp.sp)
    693   1.1  mrg 	used = 0;
    694   1.1  mrg       else
    695   1.1  mrg 	used = (char *) old_stack - (char *) __morestack_initial_sp.sp;
    696   1.1  mrg #endif
    697   1.1  mrg 
    698   1.1  mrg       if (used > __morestack_initial_sp.len)
    699   1.1  mrg 	*pavailable = 0;
    700   1.1  mrg       else
    701   1.1  mrg 	*pavailable = __morestack_initial_sp.len - used;
    702   1.1  mrg     }
    703   1.1  mrg 
    704   1.1  mrg   return old_stack;
    705   1.1  mrg }
    706   1.1  mrg 
    707   1.1  mrg /* Block signals while splitting the stack.  This avoids trouble if we
    708   1.1  mrg    try to invoke a signal handler which itself wants to split the
    709   1.1  mrg    stack.  */
    710   1.1  mrg 
    711   1.1  mrg extern int pthread_sigmask (int, const sigset_t *, sigset_t *)
    712   1.1  mrg   __attribute__ ((weak));
    713   1.1  mrg 
    714   1.1  mrg void
    715   1.1  mrg __morestack_block_signals (void)
    716   1.1  mrg {
    717   1.1  mrg   if (__morestack_initial_sp.dont_block_signals)
    718   1.1  mrg     ;
    719   1.1  mrg   else if (pthread_sigmask)
    720   1.1  mrg     pthread_sigmask (SIG_BLOCK, &__morestack_fullmask,
    721   1.1  mrg 		     &__morestack_initial_sp.mask);
    722   1.1  mrg   else
    723   1.1  mrg     sigprocmask (SIG_BLOCK, &__morestack_fullmask,
    724   1.1  mrg 		 &__morestack_initial_sp.mask);
    725   1.1  mrg }
    726   1.1  mrg 
    727   1.1  mrg /* Unblock signals while splitting the stack.  */
    728   1.1  mrg 
    729   1.1  mrg void
    730   1.1  mrg __morestack_unblock_signals (void)
    731   1.1  mrg {
    732   1.1  mrg   if (__morestack_initial_sp.dont_block_signals)
    733   1.1  mrg     ;
    734   1.1  mrg   else if (pthread_sigmask)
    735   1.1  mrg     pthread_sigmask (SIG_SETMASK, &__morestack_initial_sp.mask, NULL);
    736   1.1  mrg   else
    737   1.1  mrg     sigprocmask (SIG_SETMASK, &__morestack_initial_sp.mask, NULL);
    738   1.1  mrg }
    739   1.1  mrg 
    740   1.1  mrg /* This function is called to allocate dynamic stack space, for alloca
    741   1.1  mrg    or a variably sized array.  This is a regular function with
    742   1.1  mrg    sufficient stack space, so we just use malloc to allocate the
    743   1.1  mrg    space.  We attach the allocated blocks to the current stack
    744   1.1  mrg    segment, so that they will eventually be reused or freed.  */
    745   1.1  mrg 
    746   1.1  mrg void *
    747   1.1  mrg __morestack_allocate_stack_space (size_t size)
    748   1.1  mrg {
    749   1.1  mrg   struct stack_segment *seg, *current;
    750   1.1  mrg   struct dynamic_allocation_blocks *p;
    751   1.1  mrg 
    752   1.1  mrg   /* We have to block signals to avoid getting confused if we get
    753   1.1  mrg      interrupted by a signal whose handler itself uses alloca or a
    754   1.1  mrg      variably sized array.  */
    755   1.1  mrg   __morestack_block_signals ();
    756   1.1  mrg 
    757   1.1  mrg   /* Since we don't want to call free while we are low on stack space,
    758   1.1  mrg      we may have a list of already allocated blocks waiting to be
    759   1.1  mrg      freed.  Release them all, unless we find one that is large
    760   1.1  mrg      enough.  We don't look at every block to see if one is large
    761   1.1  mrg      enough, just the first one, because we aren't trying to build a
    762   1.1  mrg      memory allocator here, we're just trying to speed up common
    763   1.1  mrg      cases.  */
    764   1.1  mrg 
    765   1.1  mrg   current = __morestack_current_segment;
    766   1.1  mrg   p = NULL;
    767   1.1  mrg   for (seg = __morestack_segments; seg != NULL; seg = seg->next)
    768   1.1  mrg     {
    769   1.1  mrg       p = seg->free_dynamic_allocation;
    770   1.1  mrg       if (p != NULL)
    771   1.1  mrg 	{
    772   1.1  mrg 	  if (p->size >= size)
    773   1.1  mrg 	    {
    774   1.1  mrg 	      seg->free_dynamic_allocation = p->next;
    775   1.1  mrg 	      break;
    776   1.1  mrg 	    }
    777   1.1  mrg 
    778   1.1  mrg 	  free_dynamic_blocks (p);
    779   1.1  mrg 	  seg->free_dynamic_allocation = NULL;
    780   1.1  mrg 	  p = NULL;
    781   1.1  mrg 	}
    782   1.1  mrg     }
    783   1.1  mrg 
    784   1.1  mrg   if (p == NULL)
    785   1.1  mrg     {
    786   1.1  mrg       /* We need to allocate additional memory.  */
    787   1.1  mrg       p = malloc (sizeof (*p));
    788   1.1  mrg       if (p == NULL)
    789   1.1  mrg 	abort ();
    790   1.1  mrg       p->size = size;
    791   1.1  mrg       p->block = malloc (size);
    792   1.1  mrg       if (p->block == NULL)
    793   1.1  mrg 	abort ();
    794   1.1  mrg     }
    795   1.1  mrg 
    796   1.1  mrg   /* If we are still on the initial stack, then we have a space leak.
    797   1.1  mrg      FIXME.  */
    798   1.1  mrg   if (current != NULL)
    799   1.1  mrg     {
    800   1.1  mrg       p->next = current->dynamic_allocation;
    801   1.1  mrg       current->dynamic_allocation = p;
    802   1.1  mrg     }
    803   1.1  mrg 
    804   1.1  mrg   __morestack_unblock_signals ();
    805   1.1  mrg 
    806   1.1  mrg   return p->block;
    807   1.1  mrg }
    808   1.1  mrg 
    809   1.1  mrg /* Find the stack segment for STACK and return the amount of space
    810   1.1  mrg    available.  This is used when unwinding the stack because of an
    811   1.1  mrg    exception, in order to reset the stack guard correctly.  */
    812   1.1  mrg 
    813   1.1  mrg size_t
    814   1.1  mrg __generic_findstack (void *stack)
    815   1.1  mrg {
    816   1.1  mrg   struct stack_segment *pss;
    817   1.1  mrg   size_t used;
    818   1.1  mrg 
    819   1.1  mrg   for (pss = __morestack_current_segment; pss != NULL; pss = pss->prev)
    820   1.1  mrg     {
    821   1.1  mrg       if ((char *) pss < (char *) stack
    822   1.1  mrg 	  && (char *) pss + pss->size > (char *) stack)
    823   1.1  mrg 	{
    824   1.1  mrg 	  __morestack_current_segment = pss;
    825   1.3  mrg #ifdef __LIBGCC_STACK_GROWS_DOWNWARD__
    826   1.1  mrg 	  return (char *) stack - (char *) (pss + 1);
    827   1.1  mrg #else
    828   1.1  mrg 	  return (char *) (pss + 1) + pss->size - (char *) stack;
    829   1.1  mrg #endif
    830   1.1  mrg 	}
    831   1.1  mrg     }
    832   1.1  mrg 
    833   1.1  mrg   /* We have popped back to the original stack.  */
    834   1.1  mrg 
    835   1.1  mrg   if (__morestack_initial_sp.sp == NULL)
    836   1.1  mrg     return 0;
    837   1.1  mrg 
    838   1.3  mrg #ifdef __LIBGCC_STACK_GROWS_DOWNWARD__
    839   1.1  mrg   if ((char *) stack >= (char *) __morestack_initial_sp.sp)
    840   1.1  mrg     used = 0;
    841   1.1  mrg   else
    842   1.1  mrg     used = (char *) __morestack_initial_sp.sp - (char *) stack;
    843   1.1  mrg #else
    844   1.1  mrg   if ((char *) stack <= (char *) __morestack_initial_sp.sp)
    845   1.1  mrg     used = 0;
    846   1.1  mrg   else
    847   1.1  mrg     used = (char *) stack - (char *) __morestack_initial_sp.sp;
    848   1.1  mrg #endif
    849   1.1  mrg 
    850   1.1  mrg   if (used > __morestack_initial_sp.len)
    851   1.1  mrg     return 0;
    852   1.1  mrg   else
    853   1.1  mrg     return __morestack_initial_sp.len - used;
    854   1.1  mrg }
    855   1.1  mrg 
    856   1.1  mrg /* This function is called at program startup time to make sure that
    857   1.1  mrg    mmap, munmap, and getpagesize are resolved if linking dynamically.
    858   1.1  mrg    We want to resolve them while we have enough stack for them, rather
    859   1.7  mrg    than calling into the dynamic linker while low on stack space.
    860   1.7  mrg    Similarly, invoke getenv here to check for split-stack related control
    861   1.7  mrg    variables, since doing do as part of the __morestack path can result
    862   1.7  mrg    in unwanted use of SSE/AVX registers (see GCC PR 86213). */
    863   1.1  mrg 
    864   1.1  mrg void
    865   1.1  mrg __morestack_load_mmap (void)
    866   1.1  mrg {
    867   1.1  mrg   /* Call with bogus values to run faster.  We don't care if the call
    868   1.1  mrg      fails.  Pass __MORESTACK_CURRENT_SEGMENT to make sure that any
    869   1.1  mrg      TLS accessor function is resolved.  */
    870   1.1  mrg   mmap (__morestack_current_segment, 0, PROT_READ, MAP_ANONYMOUS, -1, 0);
    871   1.1  mrg   mprotect (NULL, 0, 0);
    872   1.7  mrg   munmap (0, static_pagesize);
    873   1.7  mrg 
    874   1.7  mrg   /* Initialize these values here, so as to avoid dynamic linker
    875   1.7  mrg      activity as part of a __morestack call. */
    876   1.7  mrg   static_pagesize = getpagesize();
    877   1.7  mrg   use_guard_page = getenv ("SPLIT_STACK_GUARD") != 0;
    878   1.1  mrg }
    879   1.1  mrg 
    880   1.1  mrg /* This function may be used to iterate over the stack segments.
    881   1.1  mrg    This can be called like this.
    882   1.1  mrg      void *next_segment = NULL;
    883   1.1  mrg      void *next_sp = NULL;
    884   1.1  mrg      void *initial_sp = NULL;
    885   1.1  mrg      void *stack;
    886   1.1  mrg      size_t stack_size;
    887   1.1  mrg      while ((stack = __splitstack_find (next_segment, next_sp, &stack_size,
    888   1.1  mrg                                         &next_segment, &next_sp,
    889   1.1  mrg 					&initial_sp)) != NULL)
    890   1.1  mrg        {
    891   1.1  mrg          // Stack segment starts at stack and is stack_size bytes long.
    892   1.1  mrg        }
    893   1.1  mrg 
    894   1.1  mrg    There is no way to iterate over the stack segments of a different
    895   1.1  mrg    thread.  However, what is permitted is for one thread to call this
    896   1.1  mrg    with the first two values NULL, to pass next_segment, next_sp, and
    897   1.1  mrg    initial_sp to a different thread, and then to suspend one way or
    898   1.1  mrg    another.  A different thread may run the subsequent
    899   1.1  mrg    __morestack_find iterations.  Of course, this will only work if the
    900   1.1  mrg    first thread is suspended during the __morestack_find iterations.
    901   1.1  mrg    If not, the second thread will be looking at the stack while it is
    902   1.1  mrg    changing, and anything could happen.
    903   1.1  mrg 
    904   1.1  mrg    FIXME: This should be declared in some header file, but where?  */
    905   1.1  mrg 
    906   1.1  mrg void *
    907   1.1  mrg __splitstack_find (void *segment_arg, void *sp, size_t *len,
    908   1.1  mrg 		   void **next_segment, void **next_sp,
    909   1.1  mrg 		   void **initial_sp)
    910   1.1  mrg {
    911   1.1  mrg   struct stack_segment *segment;
    912   1.1  mrg   void *ret;
    913   1.1  mrg   char *nsp;
    914   1.1  mrg 
    915   1.1  mrg   if (segment_arg == (void *) (uintptr_type) 1)
    916   1.1  mrg     {
    917   1.1  mrg       char *isp = (char *) *initial_sp;
    918   1.1  mrg 
    919   1.1  mrg       if (isp == NULL)
    920   1.1  mrg 	return NULL;
    921   1.1  mrg 
    922   1.1  mrg       *next_segment = (void *) (uintptr_type) 2;
    923   1.1  mrg       *next_sp = NULL;
    924   1.3  mrg #ifdef __LIBGCC_STACK_GROWS_DOWNWARD__
    925   1.1  mrg       if ((char *) sp >= isp)
    926   1.1  mrg 	return NULL;
    927   1.1  mrg       *len = (char *) isp - (char *) sp;
    928   1.1  mrg       return sp;
    929   1.1  mrg #else
    930   1.1  mrg       if ((char *) sp <= (char *) isp)
    931   1.1  mrg 	return NULL;
    932   1.1  mrg       *len = (char *) sp - (char *) isp;
    933   1.1  mrg       return (void *) isp;
    934   1.1  mrg #endif
    935   1.1  mrg     }
    936   1.1  mrg   else if (segment_arg == (void *) (uintptr_type) 2)
    937   1.1  mrg     return NULL;
    938   1.1  mrg   else if (segment_arg != NULL)
    939   1.1  mrg     segment = (struct stack_segment *) segment_arg;
    940   1.1  mrg   else
    941   1.1  mrg     {
    942   1.1  mrg       *initial_sp = __morestack_initial_sp.sp;
    943   1.1  mrg       segment = __morestack_current_segment;
    944   1.1  mrg       sp = (void *) &segment;
    945   1.1  mrg       while (1)
    946   1.1  mrg 	{
    947   1.1  mrg 	  if (segment == NULL)
    948   1.1  mrg 	    return __splitstack_find ((void *) (uintptr_type) 1, sp, len,
    949   1.1  mrg 				      next_segment, next_sp, initial_sp);
    950   1.1  mrg 	  if ((char *) sp >= (char *) (segment + 1)
    951   1.1  mrg 	      && (char *) sp <= (char *) (segment + 1) + segment->size)
    952   1.1  mrg 	    break;
    953   1.1  mrg 	  segment = segment->prev;
    954   1.1  mrg 	}
    955   1.1  mrg     }
    956   1.1  mrg 
    957   1.1  mrg   if (segment->prev == NULL)
    958   1.1  mrg     *next_segment = (void *) (uintptr_type) 1;
    959   1.1  mrg   else
    960   1.1  mrg     *next_segment = segment->prev;
    961   1.1  mrg 
    962   1.1  mrg   /* The old_stack value is the address of the function parameters of
    963   1.1  mrg      the function which called __morestack.  So if f1 called f2 which
    964   1.1  mrg      called __morestack, the stack looks like this:
    965   1.1  mrg 
    966   1.1  mrg          parameters       <- old_stack
    967   1.1  mrg          return in f1
    968   1.1  mrg 	 return in f2
    969   1.1  mrg 	 registers pushed by __morestack
    970   1.1  mrg 
    971   1.1  mrg      The registers pushed by __morestack may not be visible on any
    972   1.1  mrg      other stack, if we are being called by a signal handler
    973   1.1  mrg      immediately after the call to __morestack_unblock_signals.  We
    974   1.1  mrg      want to adjust our return value to include those registers.  This
    975   1.1  mrg      is target dependent.  */
    976   1.1  mrg 
    977   1.1  mrg   nsp = (char *) segment->old_stack;
    978   1.1  mrg 
    979   1.1  mrg   if (nsp == NULL)
    980   1.1  mrg     {
    981   1.1  mrg       /* We've reached the top of the stack.  */
    982   1.1  mrg       *next_segment = (void *) (uintptr_type) 2;
    983   1.1  mrg     }
    984   1.1  mrg   else
    985   1.1  mrg     {
    986   1.1  mrg #if defined (__x86_64__)
    987   1.1  mrg       nsp -= 12 * sizeof (void *);
    988   1.1  mrg #elif defined (__i386__)
    989   1.1  mrg       nsp -= 6 * sizeof (void *);
    990   1.4  mrg #elif defined __powerpc64__
    991   1.4  mrg #elif defined __s390x__
    992   1.4  mrg       nsp -= 2 * 160;
    993   1.4  mrg #elif defined __s390__
    994   1.4  mrg       nsp -= 2 * 96;
    995   1.1  mrg #else
    996   1.1  mrg #error "unrecognized target"
    997   1.1  mrg #endif
    998   1.1  mrg 
    999   1.1  mrg       *next_sp = (void *) nsp;
   1000   1.1  mrg     }
   1001   1.1  mrg 
   1002   1.3  mrg #ifdef __LIBGCC_STACK_GROWS_DOWNWARD__
   1003   1.1  mrg   *len = (char *) (segment + 1) + segment->size - (char *) sp;
   1004   1.1  mrg   ret = (void *) sp;
   1005   1.1  mrg #else
   1006   1.1  mrg   *len = (char *) sp - (char *) (segment + 1);
   1007   1.1  mrg   ret = (void *) (segment + 1);
   1008   1.1  mrg #endif
   1009   1.1  mrg 
   1010   1.1  mrg   return ret;
   1011   1.1  mrg }
   1012   1.1  mrg 
   1013   1.1  mrg /* Tell the split stack code whether it has to block signals while
   1014   1.1  mrg    manipulating the stack.  This is for programs in which some threads
   1015   1.1  mrg    block all signals.  If a thread already blocks signals, there is no
   1016   1.1  mrg    need for the split stack code to block them as well.  If NEW is not
   1017   1.1  mrg    NULL, then if *NEW is non-zero signals will be blocked while
   1018   1.1  mrg    splitting the stack, otherwise they will not.  If OLD is not NULL,
   1019   1.1  mrg    *OLD will be set to the old value.  */
   1020   1.1  mrg 
   1021   1.1  mrg void
   1022   1.1  mrg __splitstack_block_signals (int *new, int *old)
   1023   1.1  mrg {
   1024   1.1  mrg   if (old != NULL)
   1025   1.1  mrg     *old = __morestack_initial_sp.dont_block_signals ? 0 : 1;
   1026   1.1  mrg   if (new != NULL)
   1027   1.1  mrg     __morestack_initial_sp.dont_block_signals = *new ? 0 : 1;
   1028   1.1  mrg }
   1029   1.1  mrg 
   1030   1.1  mrg /* The offsets into the arrays used by __splitstack_getcontext and
   1031   1.1  mrg    __splitstack_setcontext.  */
   1032   1.1  mrg 
   1033   1.1  mrg enum __splitstack_context_offsets
   1034   1.1  mrg {
   1035   1.1  mrg   MORESTACK_SEGMENTS = 0,
   1036   1.1  mrg   CURRENT_SEGMENT = 1,
   1037   1.1  mrg   CURRENT_STACK = 2,
   1038   1.1  mrg   STACK_GUARD = 3,
   1039   1.1  mrg   INITIAL_SP = 4,
   1040   1.1  mrg   INITIAL_SP_LEN = 5,
   1041   1.1  mrg   BLOCK_SIGNALS = 6,
   1042   1.1  mrg 
   1043   1.1  mrg   NUMBER_OFFSETS = 10
   1044   1.1  mrg };
   1045   1.1  mrg 
   1046   1.1  mrg /* Get the current split stack context.  This may be used for
   1047   1.1  mrg    coroutine switching, similar to getcontext.  The argument should
   1048   1.1  mrg    have at least 10 void *pointers for extensibility, although we
   1049   1.1  mrg    don't currently use all of them.  This would normally be called
   1050   1.1  mrg    immediately before a call to getcontext or swapcontext or
   1051   1.1  mrg    setjmp.  */
   1052   1.1  mrg 
   1053   1.1  mrg void
   1054   1.1  mrg __splitstack_getcontext (void *context[NUMBER_OFFSETS])
   1055   1.1  mrg {
   1056   1.1  mrg   memset (context, 0, NUMBER_OFFSETS * sizeof (void *));
   1057   1.1  mrg   context[MORESTACK_SEGMENTS] = (void *) __morestack_segments;
   1058   1.1  mrg   context[CURRENT_SEGMENT] = (void *) __morestack_current_segment;
   1059   1.1  mrg   context[CURRENT_STACK] = (void *) &context;
   1060   1.1  mrg   context[STACK_GUARD] = __morestack_get_guard ();
   1061   1.1  mrg   context[INITIAL_SP] = (void *) __morestack_initial_sp.sp;
   1062   1.1  mrg   context[INITIAL_SP_LEN] = (void *) (uintptr_type) __morestack_initial_sp.len;
   1063   1.1  mrg   context[BLOCK_SIGNALS] = (void *) __morestack_initial_sp.dont_block_signals;
   1064   1.1  mrg }
   1065   1.1  mrg 
   1066   1.1  mrg /* Set the current split stack context.  The argument should be a
   1067   1.1  mrg    context previously passed to __splitstack_getcontext.  This would
   1068   1.1  mrg    normally be called immediately after a call to getcontext or
   1069   1.1  mrg    swapcontext or setjmp if something jumped to it.  */
   1070   1.1  mrg 
   1071   1.1  mrg void
   1072   1.1  mrg __splitstack_setcontext (void *context[NUMBER_OFFSETS])
   1073   1.1  mrg {
   1074   1.1  mrg   __morestack_segments = (struct stack_segment *) context[MORESTACK_SEGMENTS];
   1075   1.1  mrg   __morestack_current_segment =
   1076   1.1  mrg     (struct stack_segment *) context[CURRENT_SEGMENT];
   1077   1.1  mrg   __morestack_set_guard (context[STACK_GUARD]);
   1078   1.1  mrg   __morestack_initial_sp.sp = context[INITIAL_SP];
   1079   1.1  mrg   __morestack_initial_sp.len = (size_t) context[INITIAL_SP_LEN];
   1080   1.1  mrg   __morestack_initial_sp.dont_block_signals =
   1081   1.1  mrg     (uintptr_type) context[BLOCK_SIGNALS];
   1082   1.1  mrg }
   1083   1.1  mrg 
   1084   1.1  mrg /* Create a new split stack context.  This will allocate a new stack
   1085   1.1  mrg    segment which may be used by a coroutine.  STACK_SIZE is the
   1086   1.1  mrg    minimum size of the new stack.  The caller is responsible for
   1087   1.1  mrg    actually setting the stack pointer.  This would normally be called
   1088   1.1  mrg    before a call to makecontext, and the returned stack pointer and
   1089   1.1  mrg    size would be used to set the uc_stack field.  A function called
   1090   1.1  mrg    via makecontext on a stack created by __splitstack_makecontext may
   1091   1.1  mrg    not return.  Note that the returned pointer points to the lowest
   1092   1.1  mrg    address in the stack space, and thus may not be the value to which
   1093   1.1  mrg    to set the stack pointer.  */
   1094   1.1  mrg 
   1095   1.1  mrg void *
   1096   1.1  mrg __splitstack_makecontext (size_t stack_size, void *context[NUMBER_OFFSETS],
   1097   1.1  mrg 			  size_t *size)
   1098   1.1  mrg {
   1099   1.1  mrg   struct stack_segment *segment;
   1100   1.1  mrg   void *initial_sp;
   1101   1.1  mrg 
   1102   1.1  mrg   memset (context, 0, NUMBER_OFFSETS * sizeof (void *));
   1103   1.1  mrg   segment = allocate_segment (stack_size);
   1104   1.1  mrg   context[MORESTACK_SEGMENTS] = segment;
   1105   1.1  mrg   context[CURRENT_SEGMENT] = segment;
   1106   1.3  mrg #ifdef __LIBGCC_STACK_GROWS_DOWNWARD__
   1107   1.1  mrg   initial_sp = (void *) ((char *) (segment + 1) + segment->size);
   1108   1.1  mrg #else
   1109   1.1  mrg   initial_sp = (void *) (segment + 1);
   1110   1.1  mrg #endif
   1111   1.1  mrg   context[STACK_GUARD] = __morestack_make_guard (initial_sp, segment->size);
   1112   1.1  mrg   context[INITIAL_SP] = NULL;
   1113   1.1  mrg   context[INITIAL_SP_LEN] = 0;
   1114   1.1  mrg   *size = segment->size;
   1115   1.1  mrg   return (void *) (segment + 1);
   1116   1.1  mrg }
   1117   1.1  mrg 
   1118   1.1  mrg /* Given an existing split stack context, reset it back to the start
   1119   1.1  mrg    of the stack.  Return the stack pointer and size, appropriate for
   1120   1.1  mrg    use with makecontext.  This may be used if a coroutine exits, in
   1121   1.1  mrg    order to reuse the stack segments for a new coroutine.  */
   1122   1.1  mrg 
   1123   1.1  mrg void *
   1124   1.1  mrg __splitstack_resetcontext (void *context[10], size_t *size)
   1125   1.1  mrg {
   1126   1.1  mrg   struct stack_segment *segment;
   1127   1.1  mrg   void *initial_sp;
   1128   1.1  mrg   size_t initial_size;
   1129   1.1  mrg   void *ret;
   1130   1.1  mrg 
   1131   1.1  mrg   /* Reset the context assuming that MORESTACK_SEGMENTS, INITIAL_SP
   1132   1.1  mrg      and INITIAL_SP_LEN are correct.  */
   1133   1.1  mrg 
   1134   1.1  mrg   segment = context[MORESTACK_SEGMENTS];
   1135   1.1  mrg   context[CURRENT_SEGMENT] = segment;
   1136   1.1  mrg   context[CURRENT_STACK] = NULL;
   1137   1.1  mrg   if (segment == NULL)
   1138   1.1  mrg     {
   1139   1.1  mrg       initial_sp = context[INITIAL_SP];
   1140   1.1  mrg       initial_size = (uintptr_type) context[INITIAL_SP_LEN];
   1141   1.1  mrg       ret = initial_sp;
   1142   1.3  mrg #ifdef __LIBGCC_STACK_GROWS_DOWNWARD__
   1143   1.1  mrg       ret = (void *) ((char *) ret - initial_size);
   1144   1.1  mrg #endif
   1145   1.1  mrg     }
   1146   1.1  mrg   else
   1147   1.1  mrg     {
   1148   1.3  mrg #ifdef __LIBGCC_STACK_GROWS_DOWNWARD__
   1149   1.1  mrg       initial_sp = (void *) ((char *) (segment + 1) + segment->size);
   1150   1.1  mrg #else
   1151   1.1  mrg       initial_sp = (void *) (segment + 1);
   1152   1.1  mrg #endif
   1153   1.1  mrg       initial_size = segment->size;
   1154   1.1  mrg       ret = (void *) (segment + 1);
   1155   1.1  mrg     }
   1156   1.1  mrg   context[STACK_GUARD] = __morestack_make_guard (initial_sp, initial_size);
   1157   1.1  mrg   context[BLOCK_SIGNALS] = NULL;
   1158   1.1  mrg   *size = initial_size;
   1159   1.1  mrg   return ret;
   1160   1.1  mrg }
   1161   1.1  mrg 
   1162   1.1  mrg /* Release all the memory associated with a splitstack context.  This
   1163   1.1  mrg    may be used if a coroutine exits and the associated stack should be
   1164   1.1  mrg    freed.  */
   1165   1.1  mrg 
   1166   1.1  mrg void
   1167   1.1  mrg __splitstack_releasecontext (void *context[10])
   1168   1.1  mrg {
   1169   1.1  mrg   __morestack_release_segments (((struct stack_segment **)
   1170   1.1  mrg 				 &context[MORESTACK_SEGMENTS]),
   1171   1.1  mrg 				1);
   1172   1.1  mrg }
   1173   1.1  mrg 
   1174   1.1  mrg /* Like __splitstack_block_signals, but operating on CONTEXT, rather
   1175   1.1  mrg    than on the current state.  */
   1176   1.1  mrg 
   1177   1.1  mrg void
   1178   1.1  mrg __splitstack_block_signals_context (void *context[NUMBER_OFFSETS], int *new,
   1179   1.1  mrg 				    int *old)
   1180   1.1  mrg {
   1181   1.1  mrg   if (old != NULL)
   1182   1.1  mrg     *old = ((uintptr_type) context[BLOCK_SIGNALS]) != 0 ? 0 : 1;
   1183   1.1  mrg   if (new != NULL)
   1184   1.1  mrg     context[BLOCK_SIGNALS] = (void *) (uintptr_type) (*new ? 0 : 1);
   1185   1.1  mrg }
   1186   1.1  mrg 
   1187   1.1  mrg /* Find the stack segments associated with a split stack context.
   1188   1.1  mrg    This will return the address of the first stack segment and set
   1189   1.1  mrg    *STACK_SIZE to its size.  It will set next_segment, next_sp, and
   1190   1.1  mrg    initial_sp which may be passed to __splitstack_find to find the
   1191   1.1  mrg    remaining segments.  */
   1192   1.1  mrg 
   1193   1.1  mrg void *
   1194   1.1  mrg __splitstack_find_context (void *context[NUMBER_OFFSETS], size_t *stack_size,
   1195   1.1  mrg 			   void **next_segment, void **next_sp,
   1196   1.1  mrg 			   void **initial_sp)
   1197   1.1  mrg {
   1198   1.1  mrg   void *sp;
   1199   1.1  mrg   struct stack_segment *segment;
   1200   1.1  mrg 
   1201   1.1  mrg   *initial_sp = context[INITIAL_SP];
   1202   1.1  mrg 
   1203   1.1  mrg   sp = context[CURRENT_STACK];
   1204   1.1  mrg   if (sp == NULL)
   1205   1.1  mrg     {
   1206   1.1  mrg       /* Most likely this context was created but was never used.  The
   1207   1.1  mrg 	 value 2 is a code used by __splitstack_find to mean that we
   1208   1.1  mrg 	 have reached the end of the list of stacks.  */
   1209   1.1  mrg       *next_segment = (void *) (uintptr_type) 2;
   1210   1.1  mrg       *next_sp = NULL;
   1211   1.1  mrg       *initial_sp = NULL;
   1212   1.1  mrg       return NULL;
   1213   1.1  mrg     }
   1214   1.1  mrg 
   1215   1.1  mrg   segment = context[CURRENT_SEGMENT];
   1216   1.1  mrg   if (segment == NULL)
   1217   1.1  mrg     {
   1218   1.1  mrg       /* Most likely this context was saved by a thread which was not
   1219   1.1  mrg 	 created using __splistack_makecontext and which has never
   1220   1.1  mrg 	 split the stack.  The value 1 is a code used by
   1221   1.1  mrg 	 __splitstack_find to look at the initial stack.  */
   1222   1.1  mrg       segment = (struct stack_segment *) (uintptr_type) 1;
   1223   1.1  mrg     }
   1224   1.1  mrg 
   1225   1.1  mrg   return __splitstack_find (segment, sp, stack_size, next_segment, next_sp,
   1226   1.1  mrg 			    initial_sp);
   1227   1.1  mrg }
   1228   1.1  mrg 
   1229   1.1  mrg #endif /* !defined (inhibit_libc) */
   1230   1.4  mrg #endif /* not powerpc 32-bit */
   1231