Hi Luis, On Fri, 22 Jul 2016 14:24:34 -0700 "Luis R. Rodriguez" <mcgrof@xxxxxxxxxx> wrote: > This RFC v3 builds off the last RFC v2 series [0] for adding linker tables. > The largest amount of work here was to take Russell King's feedback on > using linker table for kprobes text not being appropriate -- and providing > another lightweight API for simple section ranges: read-only stitched pieces > of executable code. This required also generalizing common building blocks > for both linker tables and section ranges, these building blocks are defined > now in include/linux/sections.h and asm-generic/section.h. The other last thing > decided was to not support sub-sections. In the hunt for this I could think of > anything that really required this, and if it was needed it did not seem > impossible to port over to avoid its use. Please let me know if there are valid > uses cases for sub-sections. > > Other significant effort here was to provide a set of common assembly helpers > which could be used across architectures, this starts off some of this work > for generic helpers which carve out and define custom Linux sections. > > Lastly, this now also goes with two ports which required module support when > using linker tables: jump labels, and dynamic debug support. A few > extensions have been made to the original series in order to provide > support for that. > > Since kprobes actually had both a linker table and a section range the > patch that dealt with kprobes is now split off in two patches, one > that deals with its linker table and another for its section ranges. > > More elaborate uses for linker tables are possible, I'll hold off on any > of this type of work until at least the basic building blocks are fleshed > out. To review how this work came about, and more elaborate uses being > evaluated check out the userspace linker-tables mockup solution [1]. > Hopefully most of the possible bikeshedding was already dealt with through > that tree. Thanks to hpa for tons of feedback. Great! so table and ranges completely replace the old-style(add-hoc) _kprobe and NOKPROBE_SYMBOL() implementation, good job! :) > > Should you need it, the code here is also available on my linux-next > 20160722-linker-table-v3-try2 branch on kernel.org [2]. Lastly, ranges and > table development go under copyleft-next, Rusty recently asked for code > to go in prior to the license tag being added denoting this license as > GPL-compatible [3] -- I had noted in the patch submission which annotated > copyleft-next's compatibility to GPLv2 that copyleft-next is the license > of choice for ongoing kernel development on my end [4]. If this is > objectionable I'm happy to change it to GPLv2 however I'd like a reason > provided as I've gone through all possible channels to ensure this is kosher, > including vetting by 3 attorneys now, 2 at SUSE. I'm not a lawyer, so I don't know really it is compatible with GPLv2, and if it is, I'm not sure the reason why we need another license. AFAICS the license terms, most of parts looks reasonable. I just concern clause 8, after fifteen years, is that still GPLv2 compatible? (I'd like see FAQ about this license...) Thank you! > > This all goes tested by 0-day... however since I found an issue with linker > tables and blackfin this series remains as RFC -- I'll try to debug the > issue with Steven Miao. The issue with blackfin is using a config that > enables CONFIG_FW_LOADER=y and CONFIG_DYNAMIC_DEBUG=y [5] we end up with > the following at final link time: > > LD init/built-in.o > lib/built-in.o: In function `dynamic_debug_init': > lib/dynamic_debug.c:(.init.text+0x156): undefined reference to `__verbose__end' > lib/dynamic_debug.c:(.init.text+0x15a): undefined reference to `__verbose__end' > lib/dynamic_debug.c:(.init.text+0x160): undefined reference to `__verbose' > lib/dynamic_debug.c:(.init.text+0x164): undefined reference to `__verbose' > lib/dynamic_debug.c:(.init.text+0x214): undefined reference to `__verbose__end' > lib/dynamic_debug.c:(.init.text+0x218): undefined reference to `__verbose__end' > lib/dynamic_debug.c:(.init.text+0x252): undefined reference to `__verbose__end' > lib/dynamic_debug.c:(.init.text+0x258): undefined reference to `__verbose' > lib/dynamic_debug.c:(.init.text+0x25c): undefined reference to `__verbose__end' > lib/dynamic_debug.c:(.init.text+0x260): undefined reference to `__verbose' > drivers/built-in.o: In function `release_firmware': > (.text+0x22dc2): undefined reference to `builtin_fw' > drivers/built-in.o: In function `release_firmware': > (.text+0x22dc6): undefined reference to `builtin_fw__end' > drivers/built-in.o: In function `release_firmware': > (.text+0x22dca): undefined reference to `builtin_fw' > drivers/built-in.o: In function `release_firmware': > (.text+0x22dce): undefined reference to `builtin_fw__end' > drivers/built-in.o: In function `fw_get_builtin_firmware': > drivers/base/firmware_class.c:(.text+0x23008): undefined reference to `builtin_fw' > drivers/base/firmware_class.c:(.text+0x2300c): undefined reference to `builtin_fw__end' > drivers/base/firmware_class.c:(.text+0x23010): undefined reference to `builtin_fw' > drivers/base/firmware_class.c:(.text+0x23014): undefined reference to `builtin_fw__end' > Makefile:957: recipe for target 'vmlinux' failed > make: *** [vmlinux] Error 1 > > To reproduce then: > > wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross > chmod +x ~/bin/make.cross > wget http://drvbp1.linux-foundation.org/~mcgrof/2016/07/22/blackfin-fw-dyndbg.config -o .config > make.cross ARCH=blackfin > > [0] https://lkml.kernel.org/r/1455889559-9428-1-git-send-email-mcgrof@xxxxxxxxxx > [1] https://git.kernel.org/cgit/linux/kernel/git/mcgrof/linker-tables.git/ > [2] https://git.kernel.org/cgit/linux/kernel/git/mcgrof/linux-next.git/log/?h=20160722-linker-table-v3-try2 > [3] https://lkml.kernel.org/r/87y44zhbiu.fsf@xxxxxxxxxxxxxxx > [4] https://lkml.kernel.org/r/1467327207-14916-1-git-send-email-mcgrof@xxxxxxxxxx > [5] http://drvbp1.linux-foundation.org/~mcgrof/2016/07/22/blackfin-fw-dyndbg.config > > > Luis R. Rodriguez (13): > x86: remove LTO_REFERENCE_INITCALL() > dell-smo8800: include uaccess.h > scripts/module-common.lds: enable generation > sections.h: guard against asm and linker script > sections.h: add sections header to collect all section info > ranges.h: add helpers to build and identify Linux section ranges > tables.h: add linker table support > firmware/Makefile: force recompilation if makefile changes > firmware: port built-in section to linker table > jump_label: port __jump_table to linker tables > dynamic_debug: port to use linker tables > kprobes: port .kprobes.text to section range > kprobes: port blacklist kprobes to linker table > > .gitignore | 2 + > Documentation/DocBook/Makefile | 3 +- > Documentation/DocBook/linker-tables.tmpl | 166 ++++++ > Documentation/DocBook/sections.tmpl | 112 ++++ > Documentation/kbuild/makefiles.txt | 19 + > Makefile | 6 +- > arch/alpha/include/asm/ranges.h | 6 + > arch/alpha/include/asm/sections.h | 6 + > arch/alpha/include/asm/tables.h | 6 + > arch/arc/include/asm/ranges.h | 6 + > arch/arc/include/asm/tables.h | 6 + > arch/arc/kernel/vmlinux.lds.S | 1 - > arch/arm/include/asm/jump_label.h | 6 +- > arch/arm/include/asm/ranges.h | 6 + > arch/arm/include/asm/sections.h | 2 + > arch/arm/include/asm/tables.h | 6 + > arch/arm/kernel/entry-armv.S | 3 +- > arch/arm/kernel/vmlinux-xip.lds.S | 1 - > arch/arm/kernel/vmlinux.lds.S | 1 - > arch/arm64/include/asm/jump_label.h | 6 +- > arch/arm64/include/asm/ranges.h | 6 + > arch/arm64/include/asm/sections.h | 6 + > arch/arm64/include/asm/tables.h | 6 + > arch/avr32/include/asm/ranges.h | 6 + > arch/avr32/include/asm/sections.h | 6 + > arch/avr32/include/asm/tables.h | 6 + > arch/avr32/kernel/entry-avr32b.S | 5 +- > arch/avr32/kernel/vmlinux.lds.S | 1 - > arch/blackfin/include/asm/ranges.h | 6 + > arch/blackfin/include/asm/sections.h | 4 + > arch/blackfin/include/asm/tables.h | 6 + > arch/blackfin/kernel/vmlinux.lds.S | 1 - > arch/c6x/include/asm/ranges.h | 6 + > arch/c6x/include/asm/tables.h | 6 + > arch/c6x/kernel/vmlinux.lds.S | 1 - > arch/cris/include/asm/ranges.h | 6 + > arch/cris/include/asm/sections.h | 6 + > arch/cris/include/asm/tables.h | 6 + > arch/frv/include/asm/ranges.h | 6 + > arch/frv/include/asm/tables.h | 6 + > arch/h8300/include/asm/ranges.h | 6 + > arch/h8300/include/asm/sections.h | 6 + > arch/h8300/include/asm/tables.h | 6 + > arch/hexagon/include/asm/ranges.h | 6 + > arch/hexagon/include/asm/sections.h | 6 + > arch/hexagon/include/asm/tables.h | 6 + > arch/hexagon/kernel/vmlinux.lds.S | 1 - > arch/ia64/include/asm/ranges.h | 6 + > arch/ia64/include/asm/sections.h | 7 +- > arch/ia64/include/asm/tables.h | 6 + > arch/ia64/kernel/jprobes.S | 3 +- > arch/ia64/kernel/vmlinux.lds.S | 1 - > arch/ia64/lib/flush.S | 5 +- > arch/m32r/include/asm/ranges.h | 6 + > arch/m32r/include/asm/sections.h | 6 + > arch/m32r/include/asm/tables.h | 6 + > arch/m68k/include/asm/ranges.h | 6 + > arch/m68k/include/asm/sections.h | 6 + > arch/m68k/include/asm/tables.h | 6 + > arch/metag/include/asm/ranges.h | 6 + > arch/metag/include/asm/sections.h | 6 + > arch/metag/include/asm/tables.h | 6 + > arch/metag/kernel/vmlinux.lds.S | 1 - > arch/microblaze/include/asm/ranges.h | 6 + > arch/microblaze/include/asm/tables.h | 6 + > arch/microblaze/kernel/vmlinux.lds.S | 1 - > arch/mips/include/asm/jump_label.h | 6 +- > arch/mips/include/asm/ranges.h | 6 + > arch/mips/include/asm/sections.h | 6 + > arch/mips/include/asm/tables.h | 6 + > arch/mips/kernel/vmlinux.lds.S | 1 - > arch/mn10300/include/asm/ranges.h | 6 + > arch/mn10300/include/asm/sections.h | 6 + > arch/mn10300/include/asm/tables.h | 6 + > arch/mn10300/kernel/vmlinux.lds.S | 1 - > arch/nios2/include/asm/ranges.h | 6 + > arch/nios2/include/asm/sections.h | 6 + > arch/nios2/include/asm/tables.h | 6 + > arch/nios2/kernel/vmlinux.lds.S | 1 - > arch/openrisc/include/asm/ranges.h | 6 + > arch/openrisc/include/asm/sections.h | 6 + > arch/openrisc/include/asm/tables.h | 6 + > arch/openrisc/kernel/vmlinux.lds.S | 1 - > arch/parisc/include/asm/ranges.h | 6 + > arch/parisc/include/asm/tables.h | 6 + > arch/parisc/kernel/vmlinux.lds.S | 1 - > arch/powerpc/include/asm/jump_label.h | 8 +- > arch/powerpc/include/asm/ppc_asm.h | 7 +- > arch/powerpc/include/asm/ranges.h | 6 + > arch/powerpc/include/asm/sections.h | 11 +- > arch/powerpc/include/asm/tables.h | 6 + > arch/powerpc/kernel/vmlinux.lds.S | 1 - > arch/s390/include/asm/jump_label.h | 6 +- > arch/s390/include/asm/ranges.h | 6 + > arch/s390/include/asm/tables.h | 6 + > arch/s390/kernel/entry.S | 5 +- > arch/s390/kernel/kprobes.c | 6 +- > arch/s390/kernel/mcount.S | 2 +- > arch/s390/kernel/vmlinux.lds.S | 1 - > arch/score/include/asm/ranges.h | 6 + > arch/score/include/asm/sections.h | 6 + > arch/score/include/asm/tables.h | 6 + > arch/score/kernel/vmlinux.lds.S | 1 - > arch/sh/include/asm/ranges.h | 6 + > arch/sh/include/asm/sections.h | 2 + > arch/sh/include/asm/tables.h | 6 + > arch/sh/kernel/vmlinux.lds.S | 1 - > arch/sparc/include/asm/jump_label.h | 6 +- > arch/sparc/include/asm/ranges.h | 6 + > arch/sparc/include/asm/sections.h | 4 + > arch/sparc/include/asm/tables.h | 6 + > arch/sparc/kernel/vmlinux.lds.S | 1 - > arch/sparc/mm/ultra.S | 3 +- > arch/tile/include/asm/ranges.h | 6 + > arch/tile/include/asm/sections.h | 4 + > arch/tile/include/asm/tables.h | 6 + > arch/tile/kernel/vmlinux.lds.S | 1 - > arch/um/include/asm/ranges.h | 6 + > arch/um/include/asm/tables.h | 6 + > arch/unicore32/include/asm/ranges.h | 6 + > arch/unicore32/include/asm/sections.h | 6 + > arch/unicore32/include/asm/tables.h | 6 + > arch/x86/include/asm/jump_label.h | 10 +- > arch/x86/include/asm/ranges.h | 6 + > arch/x86/include/asm/sections.h | 23 +- > arch/x86/include/asm/tables.h | 6 + > arch/x86/include/asm/uaccess.h | 18 +- > arch/x86/kernel/cpu/microcode/core.c | 8 +- > arch/x86/kernel/kprobes/core.c | 11 +- > arch/x86/kernel/vmlinux.lds.S | 1 - > arch/x86/tools/relocs.c | 3 + > arch/xtensa/include/asm/ranges.h | 6 + > arch/xtensa/include/asm/sections.h | 6 + > arch/xtensa/include/asm/tables.h | 6 + > drivers/base/firmware_class.c | 12 +- > drivers/platform/x86/dell-smo8800.c | 1 + > firmware/Makefile | 7 +- > include/asm-generic/ranges.h | 70 +++ > include/asm-generic/sections.h | 306 ++++++++++- > include/asm-generic/tables.h | 70 +++ > include/asm-generic/vmlinux.lds.h | 66 +-- > include/linux/compiler.h | 2 +- > include/linux/dynamic_debug.h | 5 +- > include/linux/init.h | 20 +- > include/linux/jump_label.h | 10 +- > include/linux/kprobes.h | 8 +- > include/linux/ranges.h | 54 ++ > include/linux/sections.h | 123 +++++ > include/linux/tables.h | 597 +++++++++++++++++++++ > kernel/jump_label.c | 17 +- > kernel/kprobes.c | 17 +- > lib/dynamic_debug.c | 13 +- > scripts/Makefile | 1 + > scripts/Makefile.build | 4 +- > scripts/Makefile.clean | 1 + > scripts/Makefile.lib | 12 + > scripts/Makefile.modpost | 2 +- > scripts/mod/Makefile | 2 + > scripts/mod/modpost.c | 8 +- > scripts/{module-common.lds => module-common.lds.S} | 6 + > scripts/recordmcount.c | 7 +- > scripts/recordmcount.pl | 2 +- > tools/include/linux/sections.h | 13 + > tools/objtool/special.c | 8 +- > 164 files changed, 2241 insertions(+), 205 deletions(-) > create mode 100644 Documentation/DocBook/linker-tables.tmpl > create mode 100644 Documentation/DocBook/sections.tmpl > create mode 100644 arch/alpha/include/asm/ranges.h > create mode 100644 arch/alpha/include/asm/sections.h > create mode 100644 arch/alpha/include/asm/tables.h > create mode 100644 arch/arc/include/asm/ranges.h > create mode 100644 arch/arc/include/asm/tables.h > create mode 100644 arch/arm/include/asm/ranges.h > create mode 100644 arch/arm/include/asm/tables.h > create mode 100644 arch/arm64/include/asm/ranges.h > create mode 100644 arch/arm64/include/asm/sections.h > create mode 100644 arch/arm64/include/asm/tables.h > create mode 100644 arch/avr32/include/asm/ranges.h > create mode 100644 arch/avr32/include/asm/sections.h > create mode 100644 arch/avr32/include/asm/tables.h > create mode 100644 arch/blackfin/include/asm/ranges.h > create mode 100644 arch/blackfin/include/asm/tables.h > create mode 100644 arch/c6x/include/asm/ranges.h > create mode 100644 arch/c6x/include/asm/tables.h > create mode 100644 arch/cris/include/asm/ranges.h > create mode 100644 arch/cris/include/asm/sections.h > create mode 100644 arch/cris/include/asm/tables.h > create mode 100644 arch/frv/include/asm/ranges.h > create mode 100644 arch/frv/include/asm/tables.h > create mode 100644 arch/h8300/include/asm/ranges.h > create mode 100644 arch/h8300/include/asm/sections.h > create mode 100644 arch/h8300/include/asm/tables.h > create mode 100644 arch/hexagon/include/asm/ranges.h > create mode 100644 arch/hexagon/include/asm/sections.h > create mode 100644 arch/hexagon/include/asm/tables.h > create mode 100644 arch/ia64/include/asm/ranges.h > create mode 100644 arch/ia64/include/asm/tables.h > create mode 100644 arch/m32r/include/asm/ranges.h > create mode 100644 arch/m32r/include/asm/sections.h > create mode 100644 arch/m32r/include/asm/tables.h > create mode 100644 arch/m68k/include/asm/ranges.h > create mode 100644 arch/m68k/include/asm/sections.h > create mode 100644 arch/m68k/include/asm/tables.h > create mode 100644 arch/metag/include/asm/ranges.h > create mode 100644 arch/metag/include/asm/sections.h > create mode 100644 arch/metag/include/asm/tables.h > create mode 100644 arch/microblaze/include/asm/ranges.h > create mode 100644 arch/microblaze/include/asm/tables.h > create mode 100644 arch/mips/include/asm/ranges.h > create mode 100644 arch/mips/include/asm/sections.h > create mode 100644 arch/mips/include/asm/tables.h > create mode 100644 arch/mn10300/include/asm/ranges.h > create mode 100644 arch/mn10300/include/asm/sections.h > create mode 100644 arch/mn10300/include/asm/tables.h > create mode 100644 arch/nios2/include/asm/ranges.h > create mode 100644 arch/nios2/include/asm/sections.h > create mode 100644 arch/nios2/include/asm/tables.h > create mode 100644 arch/openrisc/include/asm/ranges.h > create mode 100644 arch/openrisc/include/asm/sections.h > create mode 100644 arch/openrisc/include/asm/tables.h > create mode 100644 arch/parisc/include/asm/ranges.h > create mode 100644 arch/parisc/include/asm/tables.h > create mode 100644 arch/powerpc/include/asm/ranges.h > create mode 100644 arch/powerpc/include/asm/tables.h > create mode 100644 arch/s390/include/asm/ranges.h > create mode 100644 arch/s390/include/asm/tables.h > create mode 100644 arch/score/include/asm/ranges.h > create mode 100644 arch/score/include/asm/sections.h > create mode 100644 arch/score/include/asm/tables.h > create mode 100644 arch/sh/include/asm/ranges.h > create mode 100644 arch/sh/include/asm/tables.h > create mode 100644 arch/sparc/include/asm/ranges.h > create mode 100644 arch/sparc/include/asm/tables.h > create mode 100644 arch/tile/include/asm/ranges.h > create mode 100644 arch/tile/include/asm/tables.h > create mode 100644 arch/um/include/asm/ranges.h > create mode 100644 arch/um/include/asm/tables.h > create mode 100644 arch/unicore32/include/asm/ranges.h > create mode 100644 arch/unicore32/include/asm/sections.h > create mode 100644 arch/unicore32/include/asm/tables.h > create mode 100644 arch/x86/include/asm/ranges.h > create mode 100644 arch/x86/include/asm/tables.h > create mode 100644 arch/xtensa/include/asm/ranges.h > create mode 100644 arch/xtensa/include/asm/sections.h > create mode 100644 arch/xtensa/include/asm/tables.h > create mode 100644 include/asm-generic/ranges.h > create mode 100644 include/asm-generic/tables.h > create mode 100644 include/linux/ranges.h > create mode 100644 include/linux/sections.h > create mode 100644 include/linux/tables.h > rename scripts/{module-common.lds => module-common.lds.S} (80%) > create mode 100644 tools/include/linux/sections.h > > -- > 2.8.4 > -- Masami Hiramatsu <mhiramat@xxxxxxxxxx> -- To unsubscribe from this list: send the line "unsubscribe linux-arch" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html