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