As part of trying to remove GCC plugins from Linux, drop the ARM_SSP_PER_TASK plugin. The feature is available upstream since GCC 12, so anyone needing newer kernels with per-task ssp can update their compiler[1].
Showing the changes to scripts (3 of 5 files). Show all
Unified · Split
| @@ -36,12 +36,6 @@ ifdef CONFIG_GCC_PLUGIN_STACKLEAK · 35 unmodified lines | |||
| 36 | endif | 36 | endif |
| 37 | export DISABLE_STACKLEAK_PLUGIN | 37 | export DISABLE_STACKLEAK_PLUGIN |
| 38 | 38 | ||
| 39 | gcc-plugin-$(CONFIG_GCC_PLUGIN_ARM_SSP_PER_TASK) += arm_ssp_per_task_plugin.so | ||
| 40 | ifdef CONFIG_GCC_PLUGIN_ARM_SSP_PER_TASK | ||
| 41 | DISABLE_ARM_SSP_PER_TASK_PLUGIN += -fplugin-arg-arm_ssp_per_task_plugin-disable | ||
| 42 | endif | ||
| 43 | export DISABLE_ARM_SSP_PER_TASK_PLUGIN | ||
| 44 | |||
| 45 | # All the plugin CFLAGS are collected here in case a build target needs to | 39 | # All the plugin CFLAGS are collected here in case a build target needs to |
| 46 | # filter them out of the KBUILD_CFLAGS. | 40 | # filter them out of the KBUILD_CFLAGS. |
| 47 | GCC_PLUGINS_CFLAGS := $(strip $(addprefix -fplugin=$(objtree)/scripts/gcc-plugins/, $(gcc-plugin-y)) $(gcc-plugin-cflags-y)) | 41 | GCC_PLUGINS_CFLAGS := $(strip $(addprefix -fplugin=$(objtree)/scripts/gcc-plugins/, $(gcc-plugin-y)) $(gcc-plugin-cflags-y)) |
| @@ -46,8 +46,4 @@ config GCC_PLUGIN_LATENT_ENTROPY · 45 unmodified lines | |||
| 46 | * https://grsecurity.net/ | 46 | * https://grsecurity.net/ |
| 47 | * https://pax.grsecurity.net/ | 47 | * https://pax.grsecurity.net/ |
| 48 | 48 | ||
| 49 | config GCC_PLUGIN_ARM_SSP_PER_TASK | ||
| 50 | bool | ||
| 51 | depends on GCC_PLUGINS && ARM | ||
| 52 | |||
| 53 | endif | 49 | endif |
| @@ -1,107 +0,0 @@ | |||
| 1 | // SPDX-License-Identifier: GPL-2.0 | ||
| 2 | |||
| 3 | #include "gcc-common.h" | ||
| 4 | |||
| 5 | __visible int plugin_is_GPL_compatible; | ||
| 6 | |||
| 7 | static unsigned int canary_offset; | ||
| 8 | |||
| 9 | static unsigned int arm_pertask_ssp_rtl_execute(void) | ||
| 10 | { | ||
| 11 | rtx_insn *insn; | ||
| 12 | |||
| 13 | for (insn = get_insns(); insn; insn = NEXT_INSN(insn)) { | ||
| 14 | const char *sym; | ||
| 15 | rtx body; | ||
| 16 | rtx current; | ||
| 17 | |||
| 18 | /* | ||
| 19 | * Find a SET insn involving a SYMBOL_REF to __stack_chk_guard | ||
| 20 | */ | ||
| 21 | if (!INSN_P(insn)) | ||
| 22 | continue; | ||
| 23 | body = PATTERN(insn); | ||
| 24 | if (GET_CODE(body) != SET || | ||
| 25 | GET_CODE(SET_SRC(body)) != SYMBOL_REF) | ||
| 26 | continue; | ||
| 27 | sym = XSTR(SET_SRC(body), 0); | ||
| 28 | if (strcmp(sym, "__stack_chk_guard")) | ||
| 29 | continue; | ||
| 30 | |||
| 31 | /* | ||
| 32 | * Replace the source of the SET insn with an expression that | ||
| 33 | * produces the address of the current task's stack canary value | ||
| 34 | */ | ||
| 35 | current = gen_reg_rtx(Pmode); | ||
| 36 | |||
| 37 | emit_insn_before(gen_load_tp_hard(current), insn); | ||
| 38 | |||
| 39 | SET_SRC(body) = gen_rtx_PLUS(Pmode, current, | ||
| 40 | GEN_INT(canary_offset)); | ||
| 41 | } | ||
| 42 | return 0; | ||
| 43 | } | ||
| 44 | |||
| 45 | #define PASS_NAME arm_pertask_ssp_rtl | ||
| 46 | |||
| 47 | #define NO_GATE | ||
| 48 | #include "gcc-generate-rtl-pass.h" | ||
| 49 | |||
| 50 | #if BUILDING_GCC_VERSION >= 9000 | ||
| 51 | static bool no(void) | ||
| 52 | { | ||
| 53 | return false; | ||
| 54 | } | ||
| 55 | |||
| 56 | static void arm_pertask_ssp_start_unit(void *gcc_data, void *user_data) | ||
| 57 | { | ||
| 58 | targetm.have_stack_protect_combined_set = no; | ||
| 59 | targetm.have_stack_protect_combined_test = no; | ||
| 60 | } | ||
| 61 | #endif | ||
| 62 | |||
| 63 | __visible int plugin_init(struct plugin_name_args *plugin_info, | ||
| 64 | struct plugin_gcc_version *version) | ||
| 65 | { | ||
| 66 | const char * const plugin_name = plugin_info->base_name; | ||
| 67 | const int argc = plugin_info->argc; | ||
| 68 | const struct plugin_argument *argv = plugin_info->argv; | ||
| 69 | int i; | ||
| 70 | |||
| 71 | if (!plugin_default_version_check(version, &gcc_version)) { | ||
| 72 | error(G_("incompatible gcc/plugin versions")); | ||
| 73 | return 1; | ||
| 74 | } | ||
| 75 | |||
| 76 | for (i = 0; i < argc; ++i) { | ||
| 77 | if (!strcmp(argv[i].key, "disable")) | ||
| 78 | return 0; | ||
| 79 | |||
| 80 | /* all remaining options require a value */ | ||
| 81 | if (!argv[i].value) { | ||
| 82 | error(G_("no value supplied for option '-fplugin-arg-%s-%s'"), | ||
| 83 | plugin_name, argv[i].key); | ||
| 84 | return 1; | ||
| 85 | } | ||
| 86 | |||
| 87 | if (!strcmp(argv[i].key, "offset")) { | ||
| 88 | canary_offset = atoi(argv[i].value); | ||
| 89 | continue; | ||
| 90 | } | ||
| 91 | error(G_("unknown option '-fplugin-arg-%s-%s'"), | ||
| 92 | plugin_name, argv[i].key); | ||
| 93 | return 1; | ||
| 94 | } | ||
| 95 | |||
| 96 | PASS_INFO(arm_pertask_ssp_rtl, "expand", 1, PASS_POS_INSERT_AFTER); | ||
| 97 | |||
| 98 | register_callback(plugin_info->base_name, PLUGIN_PASS_MANAGER_SETUP, | ||
| 99 | NULL, &arm_pertask_ssp_rtl_pass_info); | ||
| 100 | |||
| 101 | #if BUILDING_GCC_VERSION >= 9000 | ||
| 102 | register_callback(plugin_info->base_name, PLUGIN_START_UNIT, | ||
| 103 | arm_pertask_ssp_start_unit, NULL); | ||
| 104 | #endif | ||
| 105 | |||
| 106 | return 0; | ||
| 107 | } | ||