1/* Functions for CET/x86. 2 Copyright (C) 2017-2020 Free Software Foundation, Inc. 3 4This file is part of GCC. 5 6GCC is free software; you can redistribute it and/or modify 7it under the terms of the GNU General Public License as published by 8the Free Software Foundation; either version 3, or (at your option) 9any later version. 10 11GCC is distributed in the hope that it will be useful, 12but WITHOUT ANY WARRANTY; without even the implied warranty of 13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14GNU General Public License for more details. 15 16You should have received a copy of the GNU General Public License 17along with GCC; see the file COPYING3. If not see 18<http://www.gnu.org/licenses/>. */ 19 20#include "config.h" 21#include "system.h" 22#include "coretypes.h" 23#include "tm.h" 24#include "output.h" 25#include "linux-common.h" 26 27void 28file_end_indicate_exec_stack_and_cet (void) 29{ 30 file_end_indicate_exec_stack (); 31 32 if (flag_cf_protection == CF_NONE) 33 return; 34 35 unsigned int feature_1 = 0; 36 37 if (flag_cf_protection & CF_BRANCH) 38 /* GNU_PROPERTY_X86_FEATURE_1_IBT. */ 39 feature_1 |= 0x1; 40 41 if (flag_cf_protection & CF_RETURN) 42 /* GNU_PROPERTY_X86_FEATURE_1_SHSTK. */ 43 feature_1 |= 0x2; 44 45 if (feature_1) 46 { 47 int p2align = ptr_mode == SImode ? 2 : 3; 48 49 /* Generate GNU_PROPERTY_X86_FEATURE_1_XXX. */ 50 switch_to_section (get_section (".note.gnu.property", 51 SECTION_NOTYPE, NULL)); 52 53 ASM_OUTPUT_ALIGN (asm_out_file, p2align); 54 /* name length. */ 55 fprintf (asm_out_file, ASM_LONG " 1f - 0f\n"); 56 /* data length. */ 57 fprintf (asm_out_file, ASM_LONG " 4f - 1f\n"); 58 /* note type: NT_GNU_PROPERTY_TYPE_0. */ 59 fprintf (asm_out_file, ASM_LONG " 5\n"); 60 fprintf (asm_out_file, "0:\n"); 61 /* vendor name: "GNU". */ 62 fprintf (asm_out_file, STRING_ASM_OP " \"GNU\"\n"); 63 fprintf (asm_out_file, "1:\n"); 64 ASM_OUTPUT_ALIGN (asm_out_file, p2align); 65 /* pr_type: GNU_PROPERTY_X86_FEATURE_1_AND. */ 66 fprintf (asm_out_file, ASM_LONG " 0xc0000002\n"); 67 /* pr_datasz. */\ 68 fprintf (asm_out_file, ASM_LONG " 3f - 2f\n"); 69 fprintf (asm_out_file, "2:\n"); 70 /* GNU_PROPERTY_X86_FEATURE_1_XXX. */ 71 fprintf (asm_out_file, ASM_LONG " 0x%x\n", feature_1); 72 fprintf (asm_out_file, "3:\n"); 73 ASM_OUTPUT_ALIGN (asm_out_file, p2align); 74 fprintf (asm_out_file, "4:\n"); 75 } 76} 77