(root)/
glibc-2.38/
sysdeps/
x86_64/
stackinfo.h
       1  /* Copyright (C) 2001-2023 Free Software Foundation, Inc.
       2     This file is part of the GNU C Library.
       3  
       4     The GNU C Library is free software; you can redistribute it and/or
       5     modify it under the terms of the GNU Lesser General Public
       6     License as published by the Free Software Foundation; either
       7     version 2.1 of the License, or (at your option) any later version.
       8  
       9     The GNU C Library is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      12     Lesser General Public License for more details.
      13  
      14     You should have received a copy of the GNU Lesser General Public
      15     License along with the GNU C Library; if not, see
      16     <https://www.gnu.org/licenses/>.  */
      17  
      18  /* This file contains a bit of information about the stack allocation
      19     of the processor.  */
      20  
      21  #ifndef _STACKINFO_H
      22  #define _STACKINFO_H	1
      23  
      24  #include <elf.h>
      25  
      26  #ifdef __ILP32__
      27  # define RSP_REG "esp"
      28  #else
      29  # define RSP_REG "rsp"
      30  #endif
      31  
      32  /* On x86_64 the stack grows down.  */
      33  #define _STACK_GROWS_DOWN	1
      34  
      35  /* Default to an executable stack.  PF_X can be overridden if PT_GNU_STACK is
      36   * present, but it is presumed absent.  */
      37  #define DEFAULT_STACK_PERMS (PF_R|PF_W|PF_X)
      38  
      39  /* Access to the stack pointer.  The macros are used in alloca_account
      40     for which they need to act as barriers as well, hence the additional
      41     (unnecessary) parameters.  */
      42  #define stackinfo_get_sp() \
      43    ({ register void * p__ __asm__(RSP_REG); \
      44       asm volatile("" : "=r" (p__)); \
      45       p__; })
      46  #define stackinfo_sub_sp(ptr) \
      47    ({ ptrdiff_t d__;						\
      48       asm volatile ("sub %%" RSP_REG " , %0" : "=r" (d__) : "0" (ptr));	\
      49       d__; })
      50  
      51  #endif	/* stackinfo.h */