Messages in this thread Patch in this message |  | | Subject | Re: [PATCH] firmware: declare __{start,end}_builtin_fw as pointers | From | Jiri Slaby <> | Date | Fri, 14 Oct 2016 07:52:53 +0200 |
| |
On 06/26/2016, 07:17 PM, Linus Torvalds wrote: > On Sun, Jun 26, 2016 at 2:24 AM, Vegard Nossum <vegard.nossum@gmail.com> wrote: >> >> This is the best I could come up with: assuming gcc is not allowed to >> reason about what's inside the asm(), this is the only way I could >> think of to lose the array information without incurring unnecessary >> overheads. It should also be relatively safe as there is no way to >> accidentally use the underlying arrays without explicitly declaring >> them. > > Ugh. I worry about the other places where we do things like this, > depending on the linker just assigning the addresses and us being able > to compare them. > > If there is a compiler option to disable this optimization, I would > almost prefer that.. Because we really do have a whole slew of these > things.
Any update on this? Couple months later and I still hit this.
Quick checking shows, that a lot code depends on comparing two arrays (undefined behaviour): ftrace_init count = __stop_mcount_loc - __start_mcount_loc; tracer_alloc_buffers if (__stop___trace_bprintk_fmt != __start___trace_bprintk_fmt)
FWIW this indeed fixes the get_builtin_firmware case for me: --- a/arch/x86/kernel/cpu/microcode/core.c +++ b/arch/x86/kernel/cpu/microcode/core.c @@ -97,9 +97,11 @@ extern struct builtin_fw __end_builtin_fw[]; bool get_builtin_firmware(struct cpio_data *cd, const char *name) { #ifdef CONFIG_FW_LOADER - struct builtin_fw *b_fw; + struct builtin_fw *b_fw = __start_builtin_fw;
- for (b_fw = __start_builtin_fw; b_fw != __end_builtin_fw; b_fw++) { + OPTIMIZER_HIDE_VAR(b_fw); + + for (; b_fw != __end_builtin_fw; b_fw++) { if (!strcmp(name, b_fw->name)) { cd->size = b_fw->size; cd->data = b_fw->data;
What about adding: #define for_each_vmlinux_symbol(sym, start, stop) \ for (sym = start, OPTIMIZER_HIDE_VAR(sym); sym != stop; sym++)
and converting at least the iterators?
What to do with the array subtractions and comparisons (like tracing), I don't know (yet).
thanks, -- js suse labs
|  |