xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/config/i386/cet.c (revision 4c3eb207d36f67d31994830c0a694161fc1ca39b)
1 /* Functions for CET/x86.
2    Copyright (C) 2017-2020 Free Software Foundation, Inc.
3 
4 This file is part of GCC.
5 
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
10 
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along 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 
27 void
file_end_indicate_exec_stack_and_cet(void)28 file_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