diff options
Diffstat (limited to 'scripts')
| -rw-r--r-- | scripts/Makefile.build | 2 | ||||
| -rw-r--r-- | scripts/gcc-plugins/latent_entropy_plugin.c | 44 | ||||
| -rwxr-xr-x | scripts/link-vmlinux.sh | 2 | 
3 files changed, 29 insertions, 19 deletions
diff --git a/scripts/Makefile.build b/scripts/Makefile.build index 9717e6f6fb31..33c1ed581522 100644 --- a/scripts/Makefile.build +++ b/scripts/Makefile.build @@ -231,7 +231,7 @@ objtool_args =								\  	$(if $(part-of-module), --module)				\  	$(if $(CONFIG_X86_KERNEL_IBT), --lto --ibt)			\  	$(if $(CONFIG_FRAME_POINTER),, --no-fp)				\ -	$(if $(CONFIG_GCOV_KERNEL)$(CONFIG_LTO_CLANG), --no-unreachable)\ +	$(if $(CONFIG_GCOV_KERNEL), --no-unreachable)			\  	$(if $(CONFIG_RETPOLINE), --retpoline)				\  	$(if $(CONFIG_X86_SMAP), --uaccess)				\  	$(if $(CONFIG_FTRACE_MCOUNT_USE_OBJTOOL), --mcount)		\ diff --git a/scripts/gcc-plugins/latent_entropy_plugin.c b/scripts/gcc-plugins/latent_entropy_plugin.c index 589454bce930..8425da41de0d 100644 --- a/scripts/gcc-plugins/latent_entropy_plugin.c +++ b/scripts/gcc-plugins/latent_entropy_plugin.c @@ -86,25 +86,31 @@ static struct plugin_info latent_entropy_plugin_info = {  	.help		= "disable\tturn off latent entropy instrumentation\n",  }; -static unsigned HOST_WIDE_INT seed; -/* - * get_random_seed() (this is a GCC function) generates the seed. - * This is a simple random generator without any cryptographic security because - * the entropy doesn't come from here. - */ +static unsigned HOST_WIDE_INT deterministic_seed; +static unsigned HOST_WIDE_INT rnd_buf[32]; +static size_t rnd_idx = ARRAY_SIZE(rnd_buf); +static int urandom_fd = -1; +  static unsigned HOST_WIDE_INT get_random_const(void)  { -	unsigned int i; -	unsigned HOST_WIDE_INT ret = 0; - -	for (i = 0; i < 8 * sizeof(ret); i++) { -		ret = (ret << 1) | (seed & 1); -		seed >>= 1; -		if (ret & 1) -			seed ^= 0xD800000000000000ULL; +	if (deterministic_seed) { +		unsigned HOST_WIDE_INT w = deterministic_seed; +		w ^= w << 13; +		w ^= w >> 7; +		w ^= w << 17; +		deterministic_seed = w; +		return deterministic_seed;  	} -	return ret; +	if (urandom_fd < 0) { +		urandom_fd = open("/dev/urandom", O_RDONLY); +		gcc_assert(urandom_fd >= 0); +	} +	if (rnd_idx >= ARRAY_SIZE(rnd_buf)) { +		gcc_assert(read(urandom_fd, rnd_buf, sizeof(rnd_buf)) == sizeof(rnd_buf)); +		rnd_idx = 0; +	} +	return rnd_buf[rnd_idx++];  }  static tree tree_get_random_const(tree type) @@ -537,8 +543,6 @@ static void latent_entropy_start_unit(void *gcc_data __unused,  	tree type, id;  	int quals; -	seed = get_random_seed(false); -  	if (in_lto_p)  		return; @@ -573,6 +577,12 @@ __visible int plugin_init(struct plugin_name_args *plugin_info,  	const struct plugin_argument * const argv = plugin_info->argv;  	int i; +	/* +	 * Call get_random_seed() with noinit=true, so that this returns +	 * 0 in the case where no seed has been passed via -frandom-seed. +	 */ +	deterministic_seed = get_random_seed(true); +  	static const struct ggc_root_tab gt_ggc_r_gt_latent_entropy[] = {  		{  			.base = &latent_entropy_decl, diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh index 20f44504a644..9361a1ef02c9 100755 --- a/scripts/link-vmlinux.sh +++ b/scripts/link-vmlinux.sh @@ -140,7 +140,7 @@ objtool_link()  		if ! is_enabled CONFIG_FRAME_POINTER; then  			objtoolopt="${objtoolopt} --no-fp"  		fi -		if is_enabled CONFIG_GCOV_KERNEL || is_enabled CONFIG_LTO_CLANG; then +		if is_enabled CONFIG_GCOV_KERNEL; then  			objtoolopt="${objtoolopt} --no-unreachable"  		fi  		if is_enabled CONFIG_RETPOLINE; then  | 
