diff options
| author | Peter Zijlstra <peterz@infradead.org> | 2022-09-15 13:11:08 +0200 | 
|---|---|---|
| committer | Peter Zijlstra <peterz@infradead.org> | 2022-10-17 16:41:07 +0200 | 
| commit | 6644ee846cb983437063da8fd24b7cae671fd019 (patch) | |
| tree | 50b0daea032de24114f31f76fdf4555d7b0e8f77 | |
| parent | 61c6065ef7ec0447a280179d04b2d81c80c2f479 (diff) | |
objtool: Track init section
For future usage of .init.text exclusion track the init section in the
instruction decoder and use the result in retpoline validation.
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/20220915111145.910334431@infradead.org
| -rw-r--r-- | tools/objtool/check.c | 17 | ||||
| -rw-r--r-- | tools/objtool/include/objtool/elf.h | 2 | 
2 files changed, 11 insertions, 8 deletions
| diff --git a/tools/objtool/check.c b/tools/objtool/check.c index 7174bba14494..bb7c8196bf57 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -382,6 +382,15 @@ static int decode_instructions(struct objtool_file *file)  		    !strncmp(sec->name, ".text.__x86.", 12))  			sec->noinstr = true; +		/* +		 * .init.text code is ran before userspace and thus doesn't +		 * strictly need retpolines, except for modules which are +		 * loaded late, they very much do need retpoline in their +		 * .init.text +		 */ +		if (!strcmp(sec->name, ".init.text") && !opts.module) +			sec->init = true; +  		for (offset = 0; offset < sec->sh.sh_size; offset += insn->len) {  			insn = malloc(sizeof(*insn));  			if (!insn) { @@ -3748,13 +3757,7 @@ static int validate_retpoline(struct objtool_file *file)  		if (insn->retpoline_safe)  			continue; -		/* -		 * .init.text code is ran before userspace and thus doesn't -		 * strictly need retpolines, except for modules which are -		 * loaded late, they very much do need retpoline in their -		 * .init.text -		 */ -		if (!strcmp(insn->sec->name, ".init.text") && !opts.module) +		if (insn->sec->init)  			continue;  		if (insn->type == INSN_RETURN) { diff --git a/tools/objtool/include/objtool/elf.h b/tools/objtool/include/objtool/elf.h index 16f4067b82ae..baa808583c4f 100644 --- a/tools/objtool/include/objtool/elf.h +++ b/tools/objtool/include/objtool/elf.h @@ -38,7 +38,7 @@ struct section {  	Elf_Data *data;  	char *name;  	int idx; -	bool changed, text, rodata, noinstr; +	bool changed, text, rodata, noinstr, init;  };  struct symbol { | 
