1 /* Copyright (C) 2001-2021 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   ({ void *p__; asm volatile ("mov %%" RSP_REG ", %0" : "=r" (p__)); p__; })
44 #define stackinfo_sub_sp(ptr) \
45   ({ ptrdiff_t d__;						\
46      asm volatile ("sub %%" RSP_REG " , %0" : "=r" (d__) : "0" (ptr));	\
47      d__; })
48 
49 #endif	/* stackinfo.h */
50