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