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