1 /* ELF program property for Intel CET. 2 Copyright (C) 2017-2018 Free Software Foundation, Inc. 3 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. 8 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. 13 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. 17 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/>. 22 */ 23 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. */ 29 30 #ifndef _CET_H_INCLUDED 31 #define _CET_H_INCLUDED 32 33 #ifdef __ASSEMBLER__ 34 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 44 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 53 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 60 61 # define __PROPERTY_BITS (__PROPERTY_IBT | __PROPERTY_SHSTK) 62 63 # ifdef __LP64__ 64 # define __PROPERTY_ALIGN 3 65 # else 66 # define __PROPERTY_ALIGN 2 67 # endif 68 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. */ 75 0: 76 .asciz "GNU" /* vendor name. */ 77 1: 78 .p2align __PROPERTY_ALIGN 79 /* GNU_PROPERTY_X86_FEATURE_1_AND. */ 80 .long 0xc0000002 /* pr_type. */ 81 .long 3f - 2f /* pr_datasz. */ 82 2: 83 /* GNU_PROPERTY_X86_FEATURE_1_XXX. */ 84 .long __PROPERTY_BITS 85 3: 86 .p2align __PROPERTY_ALIGN 87 4: 88 .popsection 89 # endif /* __CET__ */ 90 # endif /* __ELF__ */ 91 #endif /* __ASSEMBLER__ */ 92 93 #endif /* _CET_H_INCLUDED */ 94