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