diff options
Diffstat (limited to 'scripts/gcc-plugins')
| -rw-r--r-- | scripts/gcc-plugins/Kconfig | 4 | ||||
| -rw-r--r-- | scripts/gcc-plugins/arm_ssp_per_task_plugin.c | 23 | 
2 files changed, 21 insertions, 6 deletions
| diff --git a/scripts/gcc-plugins/Kconfig b/scripts/gcc-plugins/Kconfig index d45f7f36b859..d9fd9988ef27 100644 --- a/scripts/gcc-plugins/Kconfig +++ b/scripts/gcc-plugins/Kconfig @@ -68,10 +68,6 @@ config GCC_PLUGIN_LATENT_ENTROPY  config GCC_PLUGIN_STRUCTLEAK  	bool "Force initialization of variables containing userspace addresses" -	# Currently STRUCTLEAK inserts initialization out of live scope of -	# variables from KASAN point of view. This leads to KASAN false -	# positive reports. Prohibit this combination for now. -	depends on !KASAN_EXTRA  	help  	  This plugin zero-initializes any structures containing a  	  __user attribute. This can prevent some classes of information diff --git a/scripts/gcc-plugins/arm_ssp_per_task_plugin.c b/scripts/gcc-plugins/arm_ssp_per_task_plugin.c index de70b8470971..89c47f57d1ce 100644 --- a/scripts/gcc-plugins/arm_ssp_per_task_plugin.c +++ b/scripts/gcc-plugins/arm_ssp_per_task_plugin.c @@ -13,7 +13,7 @@ static unsigned int arm_pertask_ssp_rtl_execute(void)  	for (insn = get_insns(); insn; insn = NEXT_INSN(insn)) {  		const char *sym;  		rtx body; -		rtx masked_sp; +		rtx mask, masked_sp;  		/*  		 * Find a SET insn involving a SYMBOL_REF to __stack_chk_guard @@ -33,12 +33,13 @@ static unsigned int arm_pertask_ssp_rtl_execute(void)  		 * produces the address of the copy of the stack canary value  		 * stored in struct thread_info  		 */ +		mask = GEN_INT(sext_hwi(sp_mask, GET_MODE_PRECISION(Pmode)));  		masked_sp = gen_reg_rtx(Pmode);  		emit_insn_before(gen_rtx_SET(masked_sp,  					     gen_rtx_AND(Pmode,  							 stack_pointer_rtx, -							 GEN_INT(sp_mask))), +							 mask)),  				 insn);  		SET_SRC(body) = gen_rtx_PLUS(Pmode, masked_sp, @@ -52,6 +53,19 @@ static unsigned int arm_pertask_ssp_rtl_execute(void)  #define NO_GATE  #include "gcc-generate-rtl-pass.h" +#if BUILDING_GCC_VERSION >= 9000 +static bool no(void) +{ +	return false; +} + +static void arm_pertask_ssp_start_unit(void *gcc_data, void *user_data) +{ +	targetm.have_stack_protect_combined_set = no; +	targetm.have_stack_protect_combined_test = no; +} +#endif +  __visible int plugin_init(struct plugin_name_args *plugin_info,  			  struct plugin_gcc_version *version)  { @@ -99,5 +113,10 @@ __visible int plugin_init(struct plugin_name_args *plugin_info,  	register_callback(plugin_info->base_name, PLUGIN_PASS_MANAGER_SETUP,  			  NULL, &arm_pertask_ssp_rtl_pass_info); +#if BUILDING_GCC_VERSION >= 9000 +	register_callback(plugin_info->base_name, PLUGIN_START_UNIT, +			  arm_pertask_ssp_start_unit, NULL); +#endif +  	return 0;  } | 
