xref: /freebsd/contrib/llvm-project/clang/lib/Headers/cet.h (revision e25152834cdf3b353892835a4f3b157e066a8ed4)
1*5ffd83dbSDimitry Andric /*===------ cet.h -Control-flow Enforcement Technology  feature ------------===
2*5ffd83dbSDimitry Andric  * Add x86 feature with IBT and/or SHSTK bits to ELF program property if they
3*5ffd83dbSDimitry Andric  * are enabled. Otherwise, contents in this header file are unused. This file
4*5ffd83dbSDimitry Andric  * is mainly design for assembly source code which want to enable CET.
5*5ffd83dbSDimitry Andric  *
6*5ffd83dbSDimitry Andric  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
7*5ffd83dbSDimitry Andric  * See https://llvm.org/LICENSE.txt for license information.
8*5ffd83dbSDimitry Andric  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
9*5ffd83dbSDimitry Andric  *
10*5ffd83dbSDimitry Andric  *===-----------------------------------------------------------------------===
11*5ffd83dbSDimitry Andric  */
12*5ffd83dbSDimitry Andric #ifndef __CET_H
13*5ffd83dbSDimitry Andric #define __CET_H
14*5ffd83dbSDimitry Andric 
15*5ffd83dbSDimitry Andric #ifdef __ASSEMBLER__
16*5ffd83dbSDimitry Andric 
17*5ffd83dbSDimitry Andric #ifndef __CET__
18*5ffd83dbSDimitry Andric # define _CET_ENDBR
19*5ffd83dbSDimitry Andric #endif
20*5ffd83dbSDimitry Andric 
21*5ffd83dbSDimitry Andric #ifdef __CET__
22*5ffd83dbSDimitry Andric 
23*5ffd83dbSDimitry Andric # ifdef __LP64__
24*5ffd83dbSDimitry Andric #  if __CET__ & 0x1
25*5ffd83dbSDimitry Andric #    define _CET_ENDBR endbr64
26*5ffd83dbSDimitry Andric #  else
27*5ffd83dbSDimitry Andric #    define _CET_ENDBR
28*5ffd83dbSDimitry Andric #  endif
29*5ffd83dbSDimitry Andric # else
30*5ffd83dbSDimitry Andric #  if __CET__ & 0x1
31*5ffd83dbSDimitry Andric #    define _CET_ENDBR endbr32
32*5ffd83dbSDimitry Andric #  else
33*5ffd83dbSDimitry Andric #    define _CET_ENDBR
34*5ffd83dbSDimitry Andric #  endif
35*5ffd83dbSDimitry Andric # endif
36*5ffd83dbSDimitry Andric 
37*5ffd83dbSDimitry Andric 
38*5ffd83dbSDimitry Andric #  ifdef __LP64__
39*5ffd83dbSDimitry Andric #   define __PROPERTY_ALIGN 3
40*5ffd83dbSDimitry Andric #  else
41*5ffd83dbSDimitry Andric #   define __PROPERTY_ALIGN 2
42*5ffd83dbSDimitry Andric #  endif
43*5ffd83dbSDimitry Andric 
44*5ffd83dbSDimitry Andric 	.pushsection ".note.gnu.property", "a"
45*5ffd83dbSDimitry Andric 	.p2align __PROPERTY_ALIGN
46*5ffd83dbSDimitry Andric 	.long 1f - 0f		/* name length.  */
47*5ffd83dbSDimitry Andric 	.long 4f - 1f		/* data length.  */
48*5ffd83dbSDimitry Andric 	/* NT_GNU_PROPERTY_TYPE_0.   */
49*5ffd83dbSDimitry Andric 	.long 5			/* note type.  */
50*5ffd83dbSDimitry Andric 0:
51*5ffd83dbSDimitry Andric 	.asciz "GNU"		/* vendor name.  */
52*5ffd83dbSDimitry Andric 1:
53*5ffd83dbSDimitry Andric 	.p2align __PROPERTY_ALIGN
54*5ffd83dbSDimitry Andric 	/* GNU_PROPERTY_X86_FEATURE_1_AND.  */
55*5ffd83dbSDimitry Andric 	.long 0xc0000002	/* pr_type.  */
56*5ffd83dbSDimitry Andric 	.long 3f - 2f		/* pr_datasz.  */
57*5ffd83dbSDimitry Andric 2:
58*5ffd83dbSDimitry Andric 	/* GNU_PROPERTY_X86_FEATURE_1_XXX.  */
59*5ffd83dbSDimitry Andric 	.long __CET__
60*5ffd83dbSDimitry Andric 3:
61*5ffd83dbSDimitry Andric 	.p2align __PROPERTY_ALIGN
62*5ffd83dbSDimitry Andric 4:
63*5ffd83dbSDimitry Andric 	.popsection
64*5ffd83dbSDimitry Andric #endif
65*5ffd83dbSDimitry Andric #endif
66*5ffd83dbSDimitry Andric #endif
67