xref: /dflybsd-src/contrib/gcc-8.0/gcc/config/i386/cet.h (revision 38fd149817dfbff97799f62fcb70be98c4e32523)
1*38fd1498Szrj /* ELF program property for Intel CET.
2*38fd1498Szrj    Copyright (C) 2017-2018 Free Software Foundation, Inc.
3*38fd1498Szrj 
4*38fd1498Szrj    This file is free software; you can redistribute it and/or modify it
5*38fd1498Szrj    under the terms of the GNU General Public License as published by the
6*38fd1498Szrj    Free Software Foundation; either version 3, or (at your option) any
7*38fd1498Szrj    later version.
8*38fd1498Szrj 
9*38fd1498Szrj    This file is distributed in the hope that it will be useful, but
10*38fd1498Szrj    WITHOUT ANY WARRANTY; without even the implied warranty of
11*38fd1498Szrj    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12*38fd1498Szrj    General Public License for more details.
13*38fd1498Szrj 
14*38fd1498Szrj    Under Section 7 of GPL version 3, you are granted additional
15*38fd1498Szrj    permissions described in the GCC Runtime Library Exception, version
16*38fd1498Szrj    3.1, as published by the Free Software Foundation.
17*38fd1498Szrj 
18*38fd1498Szrj    You should have received a copy of the GNU General Public License and
19*38fd1498Szrj    a copy of the GCC Runtime Library Exception along with this program;
20*38fd1498Szrj    see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
21*38fd1498Szrj    <http://www.gnu.org/licenses/>.
22*38fd1498Szrj  */
23*38fd1498Szrj 
24*38fd1498Szrj /* Add x86 feature with IBT and/or SHSTK bits to ELF program property
25*38fd1498Szrj    if they are enabled.  Otherwise, contents in this header file are
26*38fd1498Szrj    unused.  Define _CET_ENDBR for assembly codes.  _CET_ENDBR should be
27*38fd1498Szrj    placed unconditionally at the entrance of a function whose address
28*38fd1498Szrj    may be taken.  */
29*38fd1498Szrj 
30*38fd1498Szrj #ifndef _CET_H_INCLUDED
31*38fd1498Szrj #define _CET_H_INCLUDED
32*38fd1498Szrj 
33*38fd1498Szrj #ifdef __ASSEMBLER__
34*38fd1498Szrj 
35*38fd1498Szrj # if defined __CET__ && (__CET__ & 1) != 0
36*38fd1498Szrj #  ifdef __x86_64__
37*38fd1498Szrj #   define _CET_ENDBR endbr64
38*38fd1498Szrj #  else
39*38fd1498Szrj #   define _CET_ENDBR endbr32
40*38fd1498Szrj #  endif
41*38fd1498Szrj # else
42*38fd1498Szrj #  define _CET_ENDBR
43*38fd1498Szrj # endif
44*38fd1498Szrj 
45*38fd1498Szrj # ifdef __ELF__
46*38fd1498Szrj #  ifdef __CET__
47*38fd1498Szrj #   if (__CET__ & 1) != 0
48*38fd1498Szrj /* GNU_PROPERTY_X86_FEATURE_1_IBT.  */
49*38fd1498Szrj #    define __PROPERTY_IBT 0x1
50*38fd1498Szrj #   else
51*38fd1498Szrj #    define __PROPERTY_IBT 0x0
52*38fd1498Szrj #   endif
53*38fd1498Szrj 
54*38fd1498Szrj #   if (__CET__ & 2) != 0
55*38fd1498Szrj /* GNU_PROPERTY_X86_FEATURE_1_SHSTK.  */
56*38fd1498Szrj #    define __PROPERTY_SHSTK 0x2
57*38fd1498Szrj #   else
58*38fd1498Szrj #    define __PROPERTY_SHSTK 0x0
59*38fd1498Szrj #   endif
60*38fd1498Szrj 
61*38fd1498Szrj #   define __PROPERTY_BITS (__PROPERTY_IBT | __PROPERTY_SHSTK)
62*38fd1498Szrj 
63*38fd1498Szrj #   ifdef __LP64__
64*38fd1498Szrj #    define __PROPERTY_ALIGN 3
65*38fd1498Szrj #   else
66*38fd1498Szrj #    define __PROPERTY_ALIGN 2
67*38fd1498Szrj #   endif
68*38fd1498Szrj 
69*38fd1498Szrj 	.pushsection ".note.gnu.property", "a"
70*38fd1498Szrj 	.p2align __PROPERTY_ALIGN
71*38fd1498Szrj 	.long 1f - 0f		/* name length.  */
72*38fd1498Szrj 	.long 4f - 1f		/* data length.  */
73*38fd1498Szrj 	/* NT_GNU_PROPERTY_TYPE_0.   */
74*38fd1498Szrj 	.long 5			/* note type.  */
75*38fd1498Szrj 0:
76*38fd1498Szrj 	.asciz "GNU"		/* vendor name.  */
77*38fd1498Szrj 1:
78*38fd1498Szrj 	.p2align __PROPERTY_ALIGN
79*38fd1498Szrj 	/* GNU_PROPERTY_X86_FEATURE_1_AND.  */
80*38fd1498Szrj 	.long 0xc0000002	/* pr_type.  */
81*38fd1498Szrj 	.long 3f - 2f		/* pr_datasz.  */
82*38fd1498Szrj 2:
83*38fd1498Szrj 	/* GNU_PROPERTY_X86_FEATURE_1_XXX.  */
84*38fd1498Szrj 	.long __PROPERTY_BITS
85*38fd1498Szrj 3:
86*38fd1498Szrj 	.p2align __PROPERTY_ALIGN
87*38fd1498Szrj 4:
88*38fd1498Szrj 	.popsection
89*38fd1498Szrj #  endif /* __CET__ */
90*38fd1498Szrj # endif /* __ELF__ */
91*38fd1498Szrj #endif /* __ASSEMBLER__ */
92*38fd1498Szrj 
93*38fd1498Szrj #endif /* _CET_H_INCLUDED */
94