Compile-time stack metadata validation
Subsystems (15)
v19 cover Compile-time stack metadata validation
This is v19 of the compile-time stack metadata validation patch set.
It's based on tip:core/objtool.
v18 can be found here:
https://lkml.kernel.org/r/[email protected]
For more information about the motivation behind this patch set, and more details about what it does, see the patch 8 changelog and tools/objtool/Documentation/stack-validation.txt.
Patches 1-7 mark various directories, files, and functions as "non-standard" in preparation for objtool.
Patches 8-10 add objtool and integrate it into the kernel build.
v19:
- add support for CONFIG_GCOV_KERNEL, CONFIG_KASAN, CONFIG_UBSAN
- always inline context_switch() to prevent gcov inline changes
- add main() return value in objtool.c
- change warning output format to mimic gcc warnings
v18:
- include/linux/objtool.h -> include/linux/frame.h
- __objtool_ignore_func -> __func_stack_frame_non_standard
- reword commit messages and comments a bit
- reorder patches
v17:
- __ex_table fix
- rename stacktool -> objtool
- STACKTOOL_IGNORE_FUNCTION -> STACK_FRAME_NON_STANDARD
- 'STACKTOOL := n' -> 'OBJECT_FILES_NON_STANDARD := y'
- updated global_noreturns list
v16:
- fix all allyesconfig warnings, except for staging
- get rid of STACKTOOL_IGNORE_INSN which is no longer needed
- remove several whitelists in favor of automatically whitelisting any function with a special instruction like ljmp, lret, or vmrun
- split up stacktool patch into 3 parts as suggested by Ingo
- update the global noreturn function list
- detect noreturn function fallthroughs
- skip weak functions in noreturn call detection logic
- add empty function check to noreturn logic
- allow non-section rela symbols for __ex_table sections
- support rare switch table case with jmpq *[addr](%rip)
- don't warn on frame pointer restore without save
- rearrange patch order a bit
v15:
- restructure code for a new cmdline interface "stacktool check" using the new subcommand framework in tools/lib/subcmd
- fix 32 bit build fail (put __sp at end) in paravirt_types.h patch 10 which was reported by 0day
v14:
- make tools/include/linux/list.h self-sufficient
- create FRAME_OFFSET to allow 32-bit code to be able to access function arguments on the stack
- add FRAME_OFFSET usage in crypto patch 14/24: "Create stack frames in aesni-intel_asm.S"
- rename "index" -> "idx" to fix build with some compilers
v13:
- LDFLAGS order fix from Chris J Arges
- new warning fix patches from Chris J Arges
- "--frame-pointer" -> "--check-frame-pointer"
v12:
- rename "stackvalidate" -> "stacktool"
- move from scripts/ to tools/:
- makefile rework
- make a copy of the x86 insn code (and warn if the code diverges)
- use tools/include/linux/list.h
- move warning macros to a new warn.h file
- change wording: "stack validation" -> "stack metadata validation"
v11:
- attempt to answer the "why" question better in the documentation and commit message
- s/FP_SAVE/FRAME_BEGIN/ in documentation
v10:
- add scripts/mod to directory ignores
- remove circular dependencies for ignored objects which are built before stackvalidate
- fix CONFIG_MODVERSIONS incompatibility
v9:
- rename FRAME/ENDFRAME -> FRAME_BEGIN/FRAME_END
- fix jump table issue for when the original instruction is a jump
- drop paravirt thunk alignment patch
- add maintainers to CC for proposed warning fixes
v8:
- add proposed fixes for warnings
- fix all memory leaks
- process ignores earlier and add more ignore checks
- always assume POPCNT alternative is enabled
- drop hweight inline asm fix
- drop __schedule() ignore patch
- change .Ltemp_\@ to .Lstackvalidate_ignore_\@ in asm macro
- fix CONFIG_* checks in asm macros
- add C versions of ignore macros and frame macros
- change ";" to "\n" in C macros
- add ifdef CONFIG_STACK_VALIDATION checks in C ignore macros
- use numbered label in C ignore macro
- add missing break in switch case statement in arch-x86.c
v7:
- sibling call support
- document proposed solution for inline asm() frame pointer issues
- say "kernel entry/exit" instead of "context switch"
- clarify the checking of switch statement jump tables
- discard __stackvalidate_ignore_* sections in linker script
- use .Ltemp_\@ to get a unique label instead of static 3-digit number
- change STACKVALIDATE_IGNORE_FUNC variable to a static
- move STACKVALIDATE_IGNORE_INSN to arch-specific .h file
v6:
- rename asmvalidate -> stackvalidate (again)
- gcc-generated object file support
- recursive branch state analysis
- external jump support
- fixup/exception table support
- jump label support
- switch statement jump table support
- added documentation
- detection of "noreturn" dead end functions
- added a Kbuild mechanism for skipping files and dirs
- moved frame pointer macros to arch/x86/include/asm/frame.h
- moved ignore macros to include/linux/stackvalidate.h
v5:
- stackvalidate -> asmvalidate
- frame pointers only required for non-leaf functions
- check for the use of the FP_SAVE/RESTORE macros instead of manually analyzing code to detect frame pointer usage
- additional checks to ensure each function doesn't leave its boundaries
- make the macros simpler and more flexible
- support for analyzing ALTERNATIVE macros
- simplified the arch interfaces in scripts/asmvalidate/arch.h
- fixed some asmvalidate warnings
- rebased onto latest tip asm cleanups
- many more small changes
v4:
- Changed the default to CONFIG_STACK_VALIDATION=n, until all the asm code can get cleaned up.
- Fixed a stackvalidate error path exit code issue found by Michal Marek.
v3:
- Added a patch to make the push/pop CFI macros arch-independent, as suggested by H. Peter Anvin
v2:
- Fixed memory leaks reported by Petr Mladek
Josh Poimboeuf (10):
objtool: Mark non-standard files and directories
objtool: Add STACK_FRAME_NON_STANDARD macro
x86/xen: Mark xen_cpuid() stack frame as non-standard
bpf: Mark __bpf_prog_run() stack frame as non-standard
sched: Mark __schedule() stack frame as non-standard
sched: always inline context_switch()
x86/kprobes: Mark kretprobe_trampoline() stack frame as non-standard
objtool: Compile-time stack metadata validation
objtool: Add CONFIG_STACK_VALIDATION option
objtool: Enable stack metadata validation on x86_64
MAINTAINERS | 5 + Makefile | 5 +- arch/Kconfig | 6 + arch/x86/Kconfig | 1 + arch/x86/boot/Makefile | 3 +- arch/x86/boot/compressed/Makefile | 3 +- arch/x86/entry/Makefile | 4 + arch/x86/entry/vdso/Makefile | 6 +- arch/x86/kernel/Makefile | 11 +- arch/x86/kernel/kprobes/core.c | 2 + arch/x86/kernel/vmlinux.lds.S | 5 +- arch/x86/platform/efi/Makefile | 2 + arch/x86/purgatory/Makefile | 2 + arch/x86/realmode/Makefile | 4 +- arch/x86/realmode/rm/Makefile | 3 +- arch/x86/xen/enlighten.c | 3 +- drivers/firmware/efi/libstub/Makefile | 1 + include/linux/frame.h | 23 + kernel/bpf/core.c | 2 + kernel/sched/core.c | 4 +- lib/Kconfig.debug | 12 + scripts/Makefile.build | 39 +- scripts/mod/Makefile | 2 + tools/Makefile | 14 +- tools/objtool/.gitignore | 2 + tools/objtool/Build | 13 + tools/objtool/Documentation/stack-validation.txt | 342 +++++++ tools/objtool/Makefile | 60 ++ tools/objtool/arch.h | 44 + tools/objtool/arch/x86/Build | 12 + tools/objtool/arch/x86/decode.c | 172 ++++ tools/objtool/arch/x86/insn/gen-insn-attr-x86.awk | 387 ++++++++ tools/objtool/arch/x86/insn/inat.c | 97 ++ tools/objtool/arch/x86/insn/inat.h | 221 +++++ tools/objtool/arch/x86/insn/inat_types.h | 29 + tools/objtool/arch/x86/insn/insn.c | 594 ++++++++++++ tools/objtool/arch/x86/insn/insn.h | 201 ++++ tools/objtool/arch/x86/insn/x86-opcode-map.txt | 984 +++++++++++++++++++ tools/objtool/builtin-check.c | 1072 +++++++++++++++++++++ tools/objtool/builtin.h | 22 + tools/objtool/elf.c | 403 ++++++++ tools/objtool/elf.h | 79 ++ tools/objtool/objtool.c | 136 +++ tools/objtool/special.c | 193 ++++ tools/objtool/special.h | 42 + tools/objtool/warn.h | 60 ++ 46 files changed, 5304 insertions(+), 23 deletions(-) create mode 100644 include/linux/frame.h create mode 100644 tools/objtool/.gitignore create mode 100644 tools/objtool/Build create mode 100644 tools/objtool/Documentation/stack-validation.txt create mode 100644 tools/objtool/Makefile create mode 100644 tools/objtool/arch.h create mode 100644 tools/objtool/arch/x86/Build create mode 100644 tools/objtool/arch/x86/decode.c create mode 100644 tools/objtool/arch/x86/insn/gen-insn-attr-x86.awk create mode 100644 tools/objtool/arch/x86/insn/inat.c create mode 100644 tools/objtool/arch/x86/insn/inat.h create mode 100644 tools/objtool/arch/x86/insn/inat_types.h create mode 100644 tools/objtool/arch/x86/insn/insn.c create mode 100644 tools/objtool/arch/x86/insn/insn.h create mode 100644 tools/objtool/arch/x86/insn/x86-opcode-map.txt create mode 100644 tools/objtool/builtin-check.c create mode 100644 tools/objtool/builtin.h create mode 100644 tools/objtool/elf.c create mode 100644 tools/objtool/elf.h create mode 100644 tools/objtool/objtool.c create mode 100644 tools/objtool/special.c create mode 100644 tools/objtool/special.h create mode 100644 tools/objtool/warn.h
Signature · 1 line
2.4.3
PATCH v19 1/10 objtool: Mark non-standard files and directories
Code which runs outside the kernel's normal mode of operation often does unusual things which can cause a static analysis tool like objtool to emit false positive warnings:
- boot image
- vdso image
- relocation
- realmode
- efi
- head
- purgatory
- modpost
Set OBJECT_FILES_NON_STANDARD for their related files and directories, which will tell objtool to skip checking them. It's ok to skip them because they don't affect runtime stack traces.
Also skip the following code which does the right thing with respect to frame pointers, but is too "special" to be validated by a tool:
- entry
- mcount
Also skip the test_nx module because it modifies its exception handling table at runtime, which objtool can't understand. Fortunately it's just a test module so it doesn't matter much.
Currently objtool is the only user of OBJECT_FILES_NON_STANDARD, but it might eventually be useful for other tools.
--- arch/x86/boot/Makefile | 3 ++- arch/x86/boot/compressed/Makefile | 3 ++- arch/x86/entry/Makefile | 4 ++++ arch/x86/entry/vdso/Makefile | 6 ++++-- arch/x86/kernel/Makefile | 11 ++++++++--- arch/x86/platform/efi/Makefile | 2 ++ arch/x86/purgatory/Makefile | 2 ++ arch/x86/realmode/Makefile | 4 +++- arch/x86/realmode/rm/Makefile | 3 ++- drivers/firmware/efi/libstub/Makefile | 1 + scripts/mod/Makefile | 2 ++ 11 files changed, 32 insertions(+), 9 deletions(-)
arch/x86/boot/Makefile +2 -1
@@ -9,7 +9,8 @@ # Changed by many, many contributors over the years. # -KASAN_SANITIZE := n +KASAN_SANITIZE := n +OBJECT_FILES_NON_STANDARD := y # If you want to preset the SVGA mode, uncomment the next line and # set SVGA_MODE to whatever number you want.
arch/x86/boot/compressed/Makefile +2 -1
@@ -16,7 +16,8 @@ # (see scripts/Makefile.lib size_append) # compressed vmlinux.bin.all + u32 size of vmlinux.bin.all -KASAN_SANITIZE := n +KASAN_SANITIZE := n +OBJECT_FILES_NON_STANDARD := y targets := vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma \ vmlinux.bin.xz vmlinux.bin.lzo vmlinux.bin.lz4
arch/x86/entry/Makefile +4 -0
@@ -1,6 +1,10 @@ # # Makefile for the x86 low level entry code # + +OBJECT_FILES_NON_STANDARD_entry_$(BITS).o := y +OBJECT_FILES_NON_STANDARD_entry_64_compat.o := y + obj-y := entry_$(BITS).o thunk_$(BITS).o syscall_$(BITS).o obj-y += common.o
arch/x86/entry/vdso/Makefile +4 -2
@@ -3,8 +3,9 @@ # KBUILD_CFLAGS += $(DISABLE_LTO) -KASAN_SANITIZE := n -UBSAN_SANITIZE := n +KASAN_SANITIZE := n +UBSAN_SANITIZE := n +OBJECT_FILES_NON_STANDARD := y VDSO64-$(CONFIG_X86_64) := y VDSOX32-$(CONFIG_X86_X32_ABI) := y
@@ -16,6 +17,7 @@ vobjs-y := vdso-note.o vclock_gettime.o vgetcpu.o # files to link into kernel obj-y += vma.o +OBJECT_FILES_NON_STANDARD_vma.o := n # vDSO images to build vdso_img-$(VDSO64-y) += 64
arch/x86/kernel/Makefile +8 -3
@@ -16,9 +16,14 @@ CFLAGS_REMOVE_ftrace.o = -pg CFLAGS_REMOVE_early_printk.o = -pg endif -KASAN_SANITIZE_head$(BITS).o := n -KASAN_SANITIZE_dumpstack.o := n -KASAN_SANITIZE_dumpstack_$(BITS).o := n +KASAN_SANITIZE_head$(BITS).o := n +KASAN_SANITIZE_dumpstack.o := n +KASAN_SANITIZE_dumpstack_$(BITS).o := n + +OBJECT_FILES_NON_STANDARD_head_$(BITS).o := y +OBJECT_FILES_NON_STANDARD_relocate_kernel_$(BITS).o := y +OBJECT_FILES_NON_STANDARD_mcount_$(BITS).o := y +OBJECT_FILES_NON_STANDARD_test_nx.o := y CFLAGS_irq.o := -I$(src)/../include/asm/trace
arch/x86/platform/efi/Makefile +2 -0
@@ -1,3 +1,5 @@ +OBJECT_FILES_NON_STANDARD_efi_thunk_$(BITS).o := y + obj-$(CONFIG_EFI) += quirks.o efi.o efi_$(BITS).o efi_stub_$(BITS).o obj-$(CONFIG_ACPI_BGRT) += efi-bgrt.o obj-$(CONFIG_EARLY_PRINTK_EFI) += early_printk.o
arch/x86/purgatory/Makefile +2 -0
@@ -1,3 +1,5 @@ +OBJECT_FILES_NON_STANDARD := y + purgatory-y := purgatory.o stack.o setup-x86_$(BITS).o sha256.o entry64.o string.o targets += $(purgatory-y)
arch/x86/realmode/Makefile +3 -1
@@ -6,7 +6,9 @@ # for more details. # # -KASAN_SANITIZE := n +KASAN_SANITIZE := n +OBJECT_FILES_NON_STANDARD := y + subdir- := rm obj-y += init.o
arch/x86/realmode/rm/Makefile +2 -1
@@ -6,7 +6,8 @@ # for more details. # # -KASAN_SANITIZE := n +KASAN_SANITIZE := n +OBJECT_FILES_NON_STANDARD := y always := realmode.bin realmode.relocs
drivers/firmware/efi/libstub/Makefile +1 -0
@@ -23,6 +23,7 @@ KBUILD_CFLAGS := $(cflags-y) -DDISABLE_BRANCH_PROFILING \ GCOV_PROFILE := n KASAN_SANITIZE := n UBSAN_SANITIZE := n +OBJECT_FILES_NON_STANDARD := y lib-y := efi-stub-helper.o
scripts/mod/Makefile +2 -0
@@ -1,3 +1,5 @@ +OBJECT_FILES_NON_STANDARD := y + hostprogs-y := modpost mk_elfconfig always := $(hostprogs-y) empty.o
Signature · 1 line
2.4.3
tip-bot for Josh Poimboeuf
merge bot[tip:core/objtool] objtool: Mark non-standard object files and directories
objtool: Mark non-standard object files and directories
Commit-ID: c0dd671686b2229e888ede77682ab0633b2a0dd7 Gitweb: http://git.kernel.org/tip/c0dd671686b2229e888ede77682ab0633b2a0dd7 Author: Josh Poimboeuf <[email protected]> AuthorDate: Sun, 28 Feb 2016 22:22:34 -0600 Committer: Ingo Molnar <[email protected]> CommitDate: Mon, 29 Feb 2016 08:35:02 +0100
objtool: Mark non-standard object files and directories
Code which runs outside the kernel's normal mode of operation often does unusual things which can cause a static analysis tool like objtool to emit false positive warnings:
- boot image
- vdso image
- relocation
- realmode
- efi
- head
- purgatory
- modpost
Set OBJECT_FILES_NON_STANDARD for their related files and directories, which will tell objtool to skip checking them. It's ok to skip them because they don't affect runtime stack traces.
Also skip the following code which does the right thing with respect to frame pointers, but is too "special" to be validated by a tool:
- entry
- mcount
Also skip the test_nx module because it modifies its exception handling table at runtime, which objtool can't understand. Fortunately it's just a test module so it doesn't matter much.
Currently objtool is the only user of OBJECT_FILES_NON_STANDARD, but it might eventually be useful for other tools.
--- arch/x86/boot/Makefile | 3 ++- arch/x86/boot/compressed/Makefile | 3 ++- arch/x86/entry/Makefile | 4 ++++ arch/x86/entry/vdso/Makefile | 6 ++++-- arch/x86/kernel/Makefile | 11 ++++++++--- arch/x86/platform/efi/Makefile | 2 ++ arch/x86/purgatory/Makefile | 2 ++ arch/x86/realmode/Makefile | 4 +++- arch/x86/realmode/rm/Makefile | 3 ++- drivers/firmware/efi/libstub/Makefile | 1 + scripts/mod/Makefile | 2 ++ 11 files changed, 32 insertions(+), 9 deletions(-)
arch/x86/boot/Makefile +2 -1
@@ -9,7 +9,8 @@ # Changed by many, many contributors over the years. # -KASAN_SANITIZE := n +KASAN_SANITIZE := n +OBJECT_FILES_NON_STANDARD := y # If you want to preset the SVGA mode, uncomment the next line and # set SVGA_MODE to whatever number you want.
arch/x86/boot/compressed/Makefile +2 -1
@@ -16,7 +16,8 @@ # (see scripts/Makefile.lib size_append) # compressed vmlinux.bin.all + u32 size of vmlinux.bin.all -KASAN_SANITIZE := n +KASAN_SANITIZE := n +OBJECT_FILES_NON_STANDARD := y targets := vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma \ vmlinux.bin.xz vmlinux.bin.lzo vmlinux.bin.lz4
arch/x86/entry/Makefile +4 -0
@@ -1,6 +1,10 @@ # # Makefile for the x86 low level entry code # + +OBJECT_FILES_NON_STANDARD_entry_$(BITS).o := y +OBJECT_FILES_NON_STANDARD_entry_64_compat.o := y + obj-y := entry_$(BITS).o thunk_$(BITS).o syscall_$(BITS).o obj-y += common.o
arch/x86/entry/vdso/Makefile +4 -2
@@ -3,8 +3,9 @@ # KBUILD_CFLAGS += $(DISABLE_LTO) -KASAN_SANITIZE := n -UBSAN_SANITIZE := n +KASAN_SANITIZE := n +UBSAN_SANITIZE := n +OBJECT_FILES_NON_STANDARD := y VDSO64-$(CONFIG_X86_64) := y VDSOX32-$(CONFIG_X86_X32_ABI) := y
@@ -16,6 +17,7 @@ vobjs-y := vdso-note.o vclock_gettime.o vgetcpu.o # files to link into kernel obj-y += vma.o +OBJECT_FILES_NON_STANDARD_vma.o := n # vDSO images to build vdso_img-$(VDSO64-y) += 64
arch/x86/kernel/Makefile +8 -3
@@ -16,9 +16,14 @@ CFLAGS_REMOVE_ftrace.o = -pg CFLAGS_REMOVE_early_printk.o = -pg endif -KASAN_SANITIZE_head$(BITS).o := n -KASAN_SANITIZE_dumpstack.o := n -KASAN_SANITIZE_dumpstack_$(BITS).o := n +KASAN_SANITIZE_head$(BITS).o := n +KASAN_SANITIZE_dumpstack.o := n +KASAN_SANITIZE_dumpstack_$(BITS).o := n + +OBJECT_FILES_NON_STANDARD_head_$(BITS).o := y +OBJECT_FILES_NON_STANDARD_relocate_kernel_$(BITS).o := y +OBJECT_FILES_NON_STANDARD_mcount_$(BITS).o := y +OBJECT_FILES_NON_STANDARD_test_nx.o := y CFLAGS_irq.o := -I$(src)/../include/asm/trace
arch/x86/platform/efi/Makefile +2 -0
@@ -1,3 +1,5 @@ +OBJECT_FILES_NON_STANDARD_efi_thunk_$(BITS).o := y + obj-$(CONFIG_EFI) += quirks.o efi.o efi_$(BITS).o efi_stub_$(BITS).o obj-$(CONFIG_ACPI_BGRT) += efi-bgrt.o obj-$(CONFIG_EARLY_PRINTK_EFI) += early_printk.o
arch/x86/purgatory/Makefile +2 -0
@@ -1,3 +1,5 @@ +OBJECT_FILES_NON_STANDARD := y + purgatory-y := purgatory.o stack.o setup-x86_$(BITS).o sha256.o entry64.o string.o targets += $(purgatory-y)
arch/x86/realmode/Makefile +3 -1
@@ -6,7 +6,9 @@ # for more details. # # -KASAN_SANITIZE := n +KASAN_SANITIZE := n +OBJECT_FILES_NON_STANDARD := y + subdir- := rm obj-y += init.o
arch/x86/realmode/rm/Makefile +2 -1
@@ -6,7 +6,8 @@ # for more details. # # -KASAN_SANITIZE := n +KASAN_SANITIZE := n +OBJECT_FILES_NON_STANDARD := y always := realmode.bin realmode.relocs
drivers/firmware/efi/libstub/Makefile +1 -0
@@ -23,6 +23,7 @@ KBUILD_CFLAGS := $(cflags-y) -DDISABLE_BRANCH_PROFILING \ GCOV_PROFILE := n KASAN_SANITIZE := n UBSAN_SANITIZE := n +OBJECT_FILES_NON_STANDARD := y lib-y := efi-stub-helper.o
scripts/mod/Makefile +2 -0
@@ -1,3 +1,5 @@ +OBJECT_FILES_NON_STANDARD := y + hostprogs-y := modpost mk_elfconfig always := $(hostprogs-y) empty.o
PATCH v19 2/10 objtool: Add STACK_FRAME_NON_STANDARD macro
In reply to Josh PoimboeufAdd a new macro, STACK_FRAME_NON_STANDARD, which is used to denote a function which does something unusual related to its stack frame. Use of the macro prevents objtool from emitting a false positive warning.
--- arch/x86/kernel/vmlinux.lds.S | 5 ++++- include/linux/frame.h | 23 +++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 include/linux/frame.h
arch/x86/kernel/vmlinux.lds.S +4 -1
@@ -343,7 +343,10 @@ SECTIONS /* Sections to be discarded */ DISCARDS - /DISCARD/ : { *(.eh_frame) } + /DISCARD/ : { + *(.eh_frame) + *(__func_stack_frame_non_standard) + } }
include/linux/frame.h new file +23 -0
@@ -0,0 +1,23 @@ +#ifndef _LINUX_FRAME_H +#define _LINUX_FRAME_H + +#ifdef CONFIG_STACK_VALIDATION +/* +* This macro marks the given function's stack frame as "non-standard", which +* tells objtool to ignore the function when doing stack metadata validation. +* It should only be used in special cases where you're 100% sure it won't +* affect the reliability of frame pointers and kernel stack traces. +* +* For more information, see tools/objtool/Documentation/stack-validation.txt. +*/ +#define STACK_FRAME_NON_STANDARD (func) \ + static void __used __section(__func_stack_frame_non_standard) \ + *__func_stack_frame_non_standard_##func = func + +#else /* !CONFIG_STACK_VALIDATION */ + +#define STACK_FRAME_NON_STANDARD (func) + +#endif /* CONFIG_STACK_VALIDATION */ + +#endif /* _LINUX_FRAME_H */
Signature · 1 line
2.4.3
tip-bot for Josh Poimboeuf
merge bot[tip:core/objtool] objtool: Add STACK_FRAME_NON_STANDARD() macro
objtool: Add STACK_FRAME_NON_STANDARD() macro
Commit-ID: 9a99417acbad99ba6c6a9389b45a53a4d002bb7e Gitweb: http://git.kernel.org/tip/9a99417acbad99ba6c6a9389b45a53a4d002bb7e Author: Josh Poimboeuf <[email protected]> AuthorDate: Sun, 28 Feb 2016 22:22:35 -0600 Committer: Ingo Molnar <[email protected]> CommitDate: Mon, 29 Feb 2016 08:35:10 +0100
objtool: Add STACK_FRAME_NON_STANDARD() macro
Add a new macro, STACK_FRAME_NON_STANDARD(), which is used to denote a function which does something unusual related to its stack frame. Use of the macro prevents objtool from emitting a false positive warning.
--- arch/x86/kernel/vmlinux.lds.S | 5 ++++- include/linux/frame.h | 23 +++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-)
arch/x86/kernel/vmlinux.lds.S +4 -1
@@ -343,7 +343,10 @@ SECTIONS /* Sections to be discarded */ DISCARDS - /DISCARD/ : { *(.eh_frame) } + /DISCARD/ : { + *(.eh_frame) + *(__func_stack_frame_non_standard) + } }
include/linux/frame.h new file +23 -0
@@ -0,0 +1,23 @@ +#ifndef _LINUX_FRAME_H +#define _LINUX_FRAME_H + +#ifdef CONFIG_STACK_VALIDATION +/* +* This macro marks the given function's stack frame as "non-standard", which +* tells objtool to ignore the function when doing stack metadata validation. +* It should only be used in special cases where you're 100% sure it won't +* affect the reliability of frame pointers and kernel stack traces. +* +* For more information, see tools/objtool/Documentation/stack-validation.txt. +*/ +#define STACK_FRAME_NON_STANDARD (func) \ + static void __used __section(__func_stack_frame_non_standard) \ + *__func_stack_frame_non_standard_##func = func + +#else /* !CONFIG_STACK_VALIDATION */ + +#define STACK_FRAME_NON_STANDARD (func) + +#endif /* CONFIG_STACK_VALIDATION */ + +#endif /* _LINUX_FRAME_H */
PATCH v19 3/10 x86/xen: Mark xen_cpuid() stack frame as non-standard
In reply to Josh Poimboeufobjtool reports the following false positive warning:
arch/x86/xen/enlighten.o: warning: objtool: xen_cpuid()+0x41: can't find jump dest instruction at .text+0x108
The warning is due to xen_cpuid()'s use of XEN_EMULATE_PREFIX to insert some fake instructions which objtool doesn't know how to decode.
--- arch/x86/xen/enlighten.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/x86/xen/enlighten.c +2 -1
@@ -32,6 +32,7 @@#include <linux/gfp.h> #include <linux/memblock.h> #include <linux/edd.h> +#include <linux/frame.h> #ifdef CONFIG_KEXEC_CORE #include <linux/kexec.h>
@@ -351,8 +352,8 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx, *cx &= maskecx; *cx |= setecx; *dx &= maskedx; - } +STACK_FRAME_NON_STANDARD (xen_cpuid);/* XEN_EMULATE_PREFIX */ static bool __init xen_check_mwait (void ) {
Signature · 1 line
2.4.3
tip-bot for Josh Poimboeuf
merge bot[tip:core/objtool] x86/xen: Mark xen_cpuid() stack frame as non-standard
x86/xen: Mark xen_cpuid() stack frame as non-standard
Commit-ID: 983bb6d254c77aaec581473e11c2eb859294f1f2 Gitweb: http://git.kernel.org/tip/983bb6d254c77aaec581473e11c2eb859294f1f2 Author: Josh Poimboeuf <[email protected]> AuthorDate: Sun, 28 Feb 2016 22:22:36 -0600 Committer: Ingo Molnar <[email protected]> CommitDate: Mon, 29 Feb 2016 08:35:10 +0100
x86/xen: Mark xen_cpuid() stack frame as non-standard
objtool reports the following false positive warning:
arch/x86/xen/enlighten.o: warning: objtool: xen_cpuid()+0x41: can't find jump dest instruction at .text+0x108
The warning is due to xen_cpuid()'s use of XEN_EMULATE_PREFIX to insert some fake instructions which objtool doesn't know how to decode.
--- arch/x86/xen/enlighten.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/x86/xen/enlighten.c +2 -1
@@ -32,6 +32,7 @@#include <linux/gfp.h> #include <linux/memblock.h> #include <linux/edd.h> +#include <linux/frame.h> #ifdef CONFIG_KEXEC_CORE #include <linux/kexec.h>
@@ -351,8 +352,8 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx, *cx &= maskecx; *cx |= setecx; *dx &= maskedx; - } +STACK_FRAME_NON_STANDARD (xen_cpuid);/* XEN_EMULATE_PREFIX */ static bool __init xen_check_mwait (void ) {
PATCH v19 4/10 bpf: Mark __bpf_prog_run() stack frame as non-standard
In reply to Josh Poimboeufobjtool reports the following false positive warnings:
kernel/bpf/core.o: warning: objtool: __bpf_prog_run()+0x5c: sibling call from callable instruction with changed frame pointer kernel/bpf/core.o: warning: objtool: __bpf_prog_run()+0x60: function has unreachable instruction kernel/bpf/core.o: warning: objtool: __bpf_prog_run()+0x64: function has unreachable instruction
[...]
It's confused by the following dynamic jump instruction in __bpf_prog_run()::
jmp *(%r12,%rax,8)
which corresponds to the following line in the C code:
goto *jumptable[insn->code];
There's no way for objtool to deterministically find all possible branch targets for a dynamic jump, so it can't verify this code.
In this case the jumps all stay within the function, and there's nothing unusual going on related to the stack, so we can whitelist the function.
--- kernel/bpf/core.c | 2 ++ 1 file changed, 2 insertions(+)
kernel/bpf/core.c +2 -0
@@ -27,6 +27,7 @@#include <linux/random.h> #include <linux/moduleloader.h> #include <linux/bpf.h> +#include <linux/frame.h> #include <asm/unaligned.h>
@@ -649,6 +650,7 @@ load_byte:WARN_RATELIMIT (1 ,"unknown opcode %02x\n" , insn->code);return 0 ; } +STACK_FRAME_NON_STANDARD (__bpf_prog_run);/* jump table */ bool bpf_prog_array_compatible (struct bpf_array *array,const struct bpf_prog *fp)
Signature · 1 line
2.4.3
tip-bot for Josh Poimboeuf
merge bot[tip:core/objtool] bpf: Mark __bpf_prog_run() stack frame as non-standard
bpf: Mark __bpf_prog_run() stack frame as non-standard
Commit-ID: 39853cc0cdcf1b11f00f7f81e2f515a4d68ed209 Gitweb: http://git.kernel.org/tip/39853cc0cdcf1b11f00f7f81e2f515a4d68ed209 Author: Josh Poimboeuf <[email protected]> AuthorDate: Sun, 28 Feb 2016 22:22:37 -0600 Committer: Ingo Molnar <[email protected]> CommitDate: Mon, 29 Feb 2016 08:35:11 +0100
bpf: Mark __bpf_prog_run() stack frame as non-standard
objtool reports the following false positive warnings:
kernel/bpf/core.o: warning: objtool: __bpf_prog_run()+0x5c: sibling call from callable instruction with changed frame pointer kernel/bpf/core.o: warning: objtool: __bpf_prog_run()+0x60: function has unreachable instruction kernel/bpf/core.o: warning: objtool: __bpf_prog_run()+0x64: function has unreachable instruction
[...]
It's confused by the following dynamic jump instruction in __bpf_prog_run()::
jmp *(%r12,%rax,8)
which corresponds to the following line in the C code:
goto *jumptable[insn->code];
There's no way for objtool to deterministically find all possible branch targets for a dynamic jump, so it can't verify this code.
In this case the jumps all stay within the function, and there's nothing unusual going on related to the stack, so we can whitelist the function.
--- kernel/bpf/core.c | 2 ++ 1 file changed, 2 insertions(+)
kernel/bpf/core.c +2 -0
@@ -27,6 +27,7 @@#include <linux/random.h> #include <linux/moduleloader.h> #include <linux/bpf.h> +#include <linux/frame.h> #include <asm/unaligned.h>
@@ -649,6 +650,7 @@ load_byte:WARN_RATELIMIT (1 ,"unknown opcode %02x\n" , insn->code);return 0 ; } +STACK_FRAME_NON_STANDARD (__bpf_prog_run);/* jump table */ bool bpf_prog_array_compatible (struct bpf_array *array,const struct bpf_prog *fp)
PATCH v19 5/10 sched: Mark __schedule() stack frame as non-standard
In reply to Josh Poimboeufobjtool reports the following warnings for __schedule():
kernel/sched/core.o: warning: objtool:__schedule()+0x3c0: duplicate frame pointer save kernel/sched/core.o: warning: objtool:__schedule()+0x3fd: sibling call from callable instruction with changed frame pointer kernel/sched/core.o: warning: objtool:__schedule()+0x40a: call without frame pointer save/setup kernel/sched/core.o: warning: objtool:__schedule()+0x7fd: frame pointer state mismatch kernel/sched/core.o: warning: objtool:__schedule()+0x421: frame pointer state mismatch
Basically it's confused by two unusual attributes of the switch_to() macro:
1. It saves prev's frame pointer to the old stack and restores next's frame pointer from the new stack.
2. For new tasks it jumps directly to ret_from_fork.
Eventually it would probably be a good idea to clean up the ret_from_fork hack so that new tasks are created with a valid initial stack, as suggested by Andy:
https://lkml.kernel.org/r/CALCETrWsqCw4L1qKO9j9L5F+4ED4viuLQTFc=n1pKBZfFPQUFg@mail.gmail.com
Then __schedule() could return normally into the new code and objtool hopefully wouldn't have a problem anymore.
In the meantime, mark its stack frame as non-standard so we can have a baseline with no objtool warnings. The marker also serves as a reminder that this code could be improved a bit.
--- kernel/sched/core.c | 2 ++ 1 file changed, 2 insertions(+)
kernel/sched/core.c +2 -0
@@ -74,6 +74,7 @@#include <linux/binfmts.h> #include <linux/context_tracking.h> #include <linux/compiler.h> +#include <linux/frame.h> #include <asm/switch_to.h> #include <asm/tlb.h>
@@ -3288,6 +3289,7 @@ static void __sched notrace __schedule(bool preempt)balance_callback (rq); } +STACK_FRAME_NON_STANDARD (__schedule);/* switch_to() */ static inline void sched_submit_work (struct task_struct *tsk) {
Signature · 1 line
2.4.3
tip-bot for Josh Poimboeuf
merge bot[tip:core/objtool] sched: Mark __schedule() stack frame as non-standard
sched: Mark __schedule() stack frame as non-standard
Commit-ID: 8e05e96ac949c80704d0a38420bf60dcf18c938f Gitweb: http://git.kernel.org/tip/8e05e96ac949c80704d0a38420bf60dcf18c938f Author: Josh Poimboeuf <[email protected]> AuthorDate: Sun, 28 Feb 2016 22:22:38 -0600 Committer: Ingo Molnar <[email protected]> CommitDate: Mon, 29 Feb 2016 08:35:11 +0100
sched: Mark __schedule() stack frame as non-standard
objtool reports the following warnings for __schedule():
kernel/sched/core.o: warning: objtool:__schedule()+0x3c0: duplicate frame pointer save kernel/sched/core.o: warning: objtool:__schedule()+0x3fd: sibling call from callable instruction with changed frame pointer kernel/sched/core.o: warning: objtool:__schedule()+0x40a: call without frame pointer save/setup kernel/sched/core.o: warning: objtool:__schedule()+0x7fd: frame pointer state mismatch kernel/sched/core.o: warning: objtool:__schedule()+0x421: frame pointer state mismatch
Basically it's confused by two unusual attributes of the switch_to() macro:
1. It saves prev's frame pointer to the old stack and restores next's frame pointer from the new stack.
2. For new tasks it jumps directly to ret_from_fork.
Eventually it would probably be a good idea to clean up the ret_from_fork hack so that new tasks are created with a valid initial stack, as suggested by Andy:
https://lkml.kernel.org/r/CALCETrWsqCw4L1qKO9j9L5F+4ED4viuLQTFc=n1pKBZfFPQUFg@mail.gmail.com
Then __schedule() could return normally into the new code and objtool hopefully wouldn't have a problem anymore.
In the meantime, mark its stack frame as non-standard so we can have a baseline with no objtool warnings. The marker also serves as a reminder that this code could be improved a bit.
--- kernel/sched/core.c | 2 ++ 1 file changed, 2 insertions(+)
kernel/sched/core.c +2 -0
@@ -74,6 +74,7 @@#include <linux/binfmts.h> #include <linux/context_tracking.h> #include <linux/compiler.h> +#include <linux/frame.h> #include <asm/switch_to.h> #include <asm/tlb.h>
@@ -3288,6 +3289,7 @@ static void __sched notrace __schedule(bool preempt)balance_callback (rq); } +STACK_FRAME_NON_STANDARD (__schedule);/* switch_to() */ static inline void sched_submit_work (struct task_struct *tsk) {
PATCH v19 6/10 sched: always inline context_switch()
In reply to Josh PoimboeufWhen CONFIG_GCOV is enabled, gcc decides to put context_switch() out-of-line, which is inconsistent with its normal behavior.
It also causes an objtool warning because __schedule() no longer inlines context_switch(), so the "STACK_FRAME_NON_STANDARD(__schedule)" statement loses its effect.
--- kernel/sched/core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/sched/core.c +1 -1
@@ -2763,7 +2763,7 @@ asmlinkage __visible void schedule_tail(struct task_struct *prev)/* * context_switch - switch to the new MM and the new thread's register state. */ -static inline struct rq * +static __always_inline struct rq *context_switch (struct rq *rq,struct task_struct *prev,struct task_struct *next) {
Signature · 1 line
2.4.3
tip-bot for Josh Poimboeuf
merge bot[tip:core/objtool] sched: Always inline context_switch()
sched: Always inline context_switch()
Commit-ID: 049369487e2068294b61cee19233be0ffac7d243 Gitweb: http://git.kernel.org/tip/049369487e2068294b61cee19233be0ffac7d243 Author: Josh Poimboeuf <[email protected]> AuthorDate: Sun, 28 Feb 2016 22:22:39 -0600 Committer: Ingo Molnar <[email protected]> CommitDate: Mon, 29 Feb 2016 08:35:11 +0100
sched: Always inline context_switch()
When CONFIG_GCOV is enabled, gcc decides to put context_switch() out-of-line, which is inconsistent with its normal behavior.
It also causes an objtool warning because __schedule() no longer inlines context_switch(), so the "STACK_FRAME_NON_STANDARD(__schedule)" statement loses its effect.
--- kernel/sched/core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/sched/core.c +1 -1
@@ -2763,7 +2763,7 @@ asmlinkage __visible void schedule_tail(struct task_struct *prev)/* * context_switch - switch to the new MM and the new thread's register state. */ -static inline struct rq * +static __always_inline struct rq *context_switch (struct rq *rq,struct task_struct *prev,struct task_struct *next) {
PATCH v19 7/10 x86/kprobes: Mark kretprobe_trampoline() stack frame as non-standard
In reply to Josh Poimboeufobjtool reports the following warning for kretprobe_trampoline():
arch/x86/kernel/kprobes/core.o: warning: objtool: kretprobe_trampoline()+0x20: call without frame pointer save/setup
kretprobes are a special case where the stack is intentionally wrong. The return address isn't known at the beginning of the trampoline, so the stack frame can't be set up properly before it calls trampoline_handler().
Because kretprobe handlers don't sleep, the frame pointer doesn't *have* to be accurate in the trampoline. So it's ok to tell objtool to ignore it. This results in no actual changes to the generated code.
--- arch/x86/kernel/kprobes/core.c | 2 ++ 1 file changed, 2 insertions(+)
arch/x86/kernel/kprobes/core.c +2 -0
@@ -49,6 +49,7 @@#include <linux/kdebug.h> #include <linux/kallsyms.h> #include <linux/ftrace.h> +#include <linux/frame.h> #include <asm/cacheflush.h> #include <asm/desc.h>
@@ -703,6 +704,7 @@ asm(".size kretprobe_trampoline, .-kretprobe_trampoline\n" );NOKPROBE_SYMBOL (kretprobe_trampoline); +STACK_FRAME_NON_STANDARD (kretprobe_trampoline);/* * Called from kretprobe_trampoline
Signature · 1 line
2.4.3
tip-bot for Josh Poimboeuf
merge bot[tip:core/objtool] x86/kprobes: Mark kretprobe_trampoline() stack frame as non-standard
x86/kprobes: Mark kretprobe_trampoline() stack frame as non-standard
Commit-ID: 87aaff2ae09036cf699fde20dfd52ce7d3c8eabe Gitweb: http://git.kernel.org/tip/87aaff2ae09036cf699fde20dfd52ce7d3c8eabe Author: Josh Poimboeuf <[email protected]> AuthorDate: Sun, 28 Feb 2016 22:22:40 -0600 Committer: Ingo Molnar <[email protected]> CommitDate: Mon, 29 Feb 2016 08:35:12 +0100
x86/kprobes: Mark kretprobe_trampoline() stack frame as non-standard
objtool reports the following warning for kretprobe_trampoline():
arch/x86/kernel/kprobes/core.o: warning: objtool: kretprobe_trampoline()+0x20: call without frame pointer save/setup
kretprobes are a special case where the stack is intentionally wrong. The return address isn't known at the beginning of the trampoline, so the stack frame can't be set up properly before it calls trampoline_handler().
Because kretprobe handlers don't sleep, the frame pointer doesn't *have* to be accurate in the trampoline. So it's ok to tell objtool to ignore it. This results in no actual changes to the generated code.
--- arch/x86/kernel/kprobes/core.c | 2 ++ 1 file changed, 2 insertions(+)
arch/x86/kernel/kprobes/core.c +2 -0
@@ -49,6 +49,7 @@#include <linux/kdebug.h> #include <linux/kallsyms.h> #include <linux/ftrace.h> +#include <linux/frame.h> #include <asm/cacheflush.h> #include <asm/desc.h>
@@ -703,6 +704,7 @@ asm(".size kretprobe_trampoline, .-kretprobe_trampoline\n" );NOKPROBE_SYMBOL (kretprobe_trampoline); +STACK_FRAME_NON_STANDARD (kretprobe_trampoline);/* * Called from kretprobe_trampoline
PATCH v19 8/10 objtool: Compile-time stack metadata validation
In reply to Josh PoimboeufThis adds a host tool named objtool which has a "check" subcommand which analyzes .o files to ensure the validity of stack metadata. It enforces a set of rules on asm code and C inline assembly code so that stack traces can be reliable.
For each function, it recursively follows all possible code paths and validates the correct frame pointer state at each instruction.
It also follows code paths involving kernel special sections, like .altinstructions, __jump_table, and __ex_table, which can add alternative execution paths to a given instruction (or set of instructions). Similarly, it knows how to follow switch statements, for which gcc sometimes uses jump tables.
Here are some of the benefits of validating stack metadata:
a) More reliable stack traces for frame pointer enabled kernels
Frame pointers are used for debugging purposes. They allow runtime code and debug tools to be able to walk the stack to determine the chain of function call sites that led to the currently executing code.
For some architectures, frame pointers are enabled by CONFIG_FRAME_POINTER. For some other architectures they may be required by the ABI (sometimes referred to as "backchain pointers").
For C code, gcc automatically generates instructions for setting up frame pointers when the -fno-omit-frame-pointer option is used.
But for asm code, the frame setup instructions have to be written by hand, which most people don't do. So the end result is that CONFIG_FRAME_POINTER is honored for C code but not for most asm code.
For stack traces based on frame pointers to be reliable, all functions which call other functions must first create a stack frame and update the frame pointer. If a first function doesn't properly create a stack frame before calling a second function, the *caller* of the first function will be skipped on the stack trace.
For example, consider the following example backtrace with frame pointers enabled:
[<ffffffff81812584>] dump_stack+0x4b/0x63
[<ffffffff812d6dc2>] cmdline_proc_show+0x12/0x30
[<ffffffff8127f568>] seq_read+0x108/0x3e0
[<ffffffff812cce62>] proc_reg_read+0x42/0x70
[<ffffffff81256197>] __vfs_read+0x37/0x100
[<ffffffff81256b16>] vfs_read+0x86/0x130
[<ffffffff81257898>] SyS_read+0x58/0xd0
[<ffffffff8181c1f2>] entry_SYSCALL_64_fastpath+0x12/0x76 It correctly shows that the caller of cmdline_proc_show() is seq_read().
If we remove the frame pointer logic from cmdline_proc_show() by replacing the frame pointer related instructions with nops, here's what it looks like instead:
[<ffffffff81812584>] dump_stack+0x4b/0x63
[<ffffffff812d6dc2>] cmdline_proc_show+0x12/0x30
[<ffffffff812cce62>] proc_reg_read+0x42/0x70
[<ffffffff81256197>] __vfs_read+0x37/0x100
[<ffffffff81256b16>] vfs_read+0x86/0x130
[<ffffffff81257898>] SyS_read+0x58/0xd0
[<ffffffff8181c1f2>] entry_SYSCALL_64_fastpath+0x12/0x76 Notice that cmdline_proc_show()'s caller, seq_read(), has been skipped. Instead the stack trace seems to show that cmdline_proc_show() was called by proc_reg_read().
The benefit of "objtool check" here is that because it ensures that *all* functions honor CONFIG_FRAME_POINTER, no functions will ever[*] be skipped on a stack trace.
[*] unless an interrupt or exception has occurred at the very
beginning of a function before the stack frame has been created, or at the very end of the function after the stack frame has been destroyed. This is an inherent limitation of frame pointers.
b) 100% reliable stack traces for DWARF enabled kernels
This is not yet implemented. For more details about what is planned, see tools/objtool/Documentation/stack-validation.txt.
c) Higher live patching compatibility rate
This is not yet implemented. For more details about what is planned, see tools/objtool/Documentation/stack-validation.txt.
To achieve the validation, "objtool check" enforces the following rules:
1. Each callable function must be annotated as such with the ELF function type. In asm code, this is typically done using the ENTRY/ENDPROC macros. If objtool finds a return instruction outside of a function, it flags an error since that usually indicates callable code which should be annotated accordingly.
This rule is needed so that objtool can properly identify each callable function in order to analyze its stack metadata.
2. Conversely, each section of code which is *not* callable should *not* be annotated as an ELF function. The ENDPROC macro shouldn't be used in this case.
This rule is needed so that objtool can ignore non-callable code. Such code doesn't have to follow any of the other rules.
3. Each callable function which calls another function must have the correct frame pointer logic, if required by CONFIG_FRAME_POINTER or the architecture's back chain rules. This can by done in asm code with the FRAME_BEGIN/FRAME_END macros.
This rule ensures that frame pointer based stack traces will work as designed. If function A doesn't create a stack frame before calling function B, the _caller_ of function A will be skipped on the stack trace.
4. Dynamic jumps and jumps to undefined symbols are only allowed if:
a) the jump is part of a switch statement; or
b) the jump matches sibling call semantics and the frame pointer has the same value it had on function entry.
This rule is needed so that objtool can reliably analyze all of a function's code paths. If a function jumps to code in another file, and it's not a sibling call, objtool has no way to follow the jump because it only analyzes a single file at a time.
5. A callable function may not execute kernel entry/exit instructions. The only code which needs such instructions is kernel entry code, which shouldn't be be in callable functions anyway.
This rule is just a sanity check to ensure that callable functions return normally.
It currently only supports x86_64. I tried to make the code generic so that support for other architectures can hopefully be plugged in relatively easily.
On my Lenovo laptop with a i7-4810MQ 4-core/8-thread CPU, building the kernel with objtool checking every .o file adds about three seconds of total build time. It hasn't been optimized for performance yet, so there are probably some opportunities for better build performance.
--- MAINTAINERS | 5 + tools/Makefile | 14 +- tools/objtool/.gitignore | 2 + tools/objtool/Build | 13 + tools/objtool/Documentation/stack-validation.txt | 342 +++++++ tools/objtool/Makefile | 60 ++ tools/objtool/arch.h | 44 + tools/objtool/arch/x86/Build | 12 + tools/objtool/arch/x86/decode.c | 172 ++++ tools/objtool/arch/x86/insn/gen-insn-attr-x86.awk | 387 ++++++++ tools/objtool/arch/x86/insn/inat.c | 97 ++ tools/objtool/arch/x86/insn/inat.h | 221 +++++ tools/objtool/arch/x86/insn/inat_types.h | 29 + tools/objtool/arch/x86/insn/insn.c | 594 ++++++++++++ tools/objtool/arch/x86/insn/insn.h | 201 ++++ tools/objtool/arch/x86/insn/x86-opcode-map.txt | 984 +++++++++++++++++++ tools/objtool/builtin-check.c | 1072 +++++++++++++++++++++ tools/objtool/builtin.h | 22 + tools/objtool/elf.c | 403 ++++++++ tools/objtool/elf.h | 79 ++ tools/objtool/objtool.c | 136 +++ tools/objtool/special.c | 193 ++++ tools/objtool/special.h | 42 + tools/objtool/warn.h | 60 ++ 24 files changed, 5178 insertions(+), 6 deletions(-) create mode 100644 tools/objtool/.gitignore create mode 100644 tools/objtool/Build create mode 100644 tools/objtool/Documentation/stack-validation.txt create mode 100644 tools/objtool/Makefile create mode 100644 tools/objtool/arch.h create mode 100644 tools/objtool/arch/x86/Build create mode 100644 tools/objtool/arch/x86/decode.c create mode 100644 tools/objtool/arch/x86/insn/gen-insn-attr-x86.awk create mode 100644 tools/objtool/arch/x86/insn/inat.c create mode 100644 tools/objtool/arch/x86/insn/inat.h create mode 100644 tools/objtool/arch/x86/insn/inat_types.h create mode 100644 tools/objtool/arch/x86/insn/insn.c create mode 100644 tools/objtool/arch/x86/insn/insn.h create mode 100644 tools/objtool/arch/x86/insn/x86-opcode-map.txt create mode 100644 tools/objtool/builtin-check.c create mode 100644 tools/objtool/builtin.h create mode 100644 tools/objtool/elf.c create mode 100644 tools/objtool/elf.h create mode 100644 tools/objtool/objtool.c create mode 100644 tools/objtool/special.c create mode 100644 tools/objtool/special.h create mode 100644 tools/objtool/warn.h
MAINTAINERS +5 -0
@@ -7778,6 +7778,11 @@ L: [email protected] (moderated for non-subscribers) S: Maintained F: sound/soc/codecs/tfa9879* +OBJTOOL +M: Josh Poimboeuf <[email protected]> +S: Supported +F: tools/objtool/ + OMAP SUPPORT M: Tony Lindgren <[email protected]> L: [email protected]
tools/Makefile +8 -6
@@ -20,6 +20,7 @@ help: @echo ' perf - Linux performance measurement and analysis tool' @echo ' selftests - various kernel selftests' @echo ' spi - spi tools' + @echo ' objtool - an ELF object analysis tool' @echo ' tmon - thermal monitoring and tuning tool' @echo ' turbostat - Intel CPU idle stats and freq reporting tool' @echo ' usb - USB testing tools'
@@ -53,7 +54,7 @@ acpi: FORCE cpupower: FORCE $(call descend,power/$@) -cgroup firewire hv guest spi usb virtio vm net iio: FORCE +cgroup firewire hv guest spi usb virtio vm net iio objtool: FORCE $(call descend,$@) liblockdep: FORCE
@@ -85,7 +86,7 @@ freefall: FORCE all: acpi cgroup cpupower hv firewire lguest \ perf selftests turbostat usb \ virtio vm net x86_energy_perf_policy \ - tmon freefall + tmon freefall objtool acpi_install: $(call descend,power/$(@:_install=),install)
@@ -93,7 +94,7 @@ acpi_install: cpupower_install: $(call descend,power/$(@:_install=),install) -cgroup_install firewire_install hv_install lguest_install perf_install usb_install virtio_install vm_install net_install: +cgroup_install firewire_install hv_install lguest_install perf_install usb_install virtio_install vm_install net_install objtool_install: $(call descend,$(@:_install=),install) selftests_install:
@@ -111,7 +112,7 @@ freefall_install: install: acpi_install cgroup_install cpupower_install hv_install firewire_install lguest_install \ perf_install selftests_install turbostat_install usb_install \ virtio_install vm_install net_install x86_energy_perf_policy_install \ - tmon_install freefall_install + tmon_install freefall_install objtool_install acpi_clean: $(call descend,power/acpi,clean)
@@ -119,7 +120,7 @@ acpi_clean: cpupower_clean: $(call descend,power/cpupower,clean) -cgroup_clean hv_clean firewire_clean lguest_clean spi_clean usb_clean virtio_clean vm_clean net_clean iio_clean: +cgroup_clean hv_clean firewire_clean lguest_clean spi_clean usb_clean virtio_clean vm_clean net_clean iio_clean objtool_clean: $(call descend,$(@:_clean=),clean) liblockdep_clean:
@@ -155,6 +156,7 @@ build_clean: clean: acpi_clean cgroup_clean cpupower_clean hv_clean firewire_clean lguest_clean \ perf_clean selftests_clean turbostat_clean spi_clean usb_clean virtio_clean \ vm_clean net_clean iio_clean x86_energy_perf_policy_clean tmon_clean \ - freefall_clean build_clean libbpf_clean libsubcmd_clean liblockdep_clean + freefall_clean build_clean libbpf_clean libsubcmd_clean liblockdep_clean \ + objtool_clean .PHONY: FORCE
tools/objtool/.gitignore new file +2 -0
@@ -0,0 +1,2 @@ +arch/x86/insn/inat-tables.c +objtool
tools/objtool/Build new file +13 -0
@@ -0,0 +1,13 @@ +objtool-y += arch/$(ARCH)/ +objtool-y += builtin-check.o +objtool-y += elf.o +objtool-y += special.o +objtool-y += objtool.o + +objtool-y += libstring.o + +CFLAGS += -I$(srctree)/tools/lib + +$(OUTPUT)libstring.o: ../lib/string.c FORCE + $(call rule_mkdir) + $(call if_changed_dep,cc_o_c)
tools/objtool/Documentation/stack-validation.txt new file +342 -0
342 lines not on this page · raw message
tools/objtool/Makefile new file +60 -0
60 lines not on this page · raw message
tools/objtool/arch.h new file +44 -0
44 lines not on this page · raw message
tools/objtool/arch/x86/Build new file +12 -0
@@ -0,0 +1,12 @@ +objtool-y += decode.o + +inat_tables_script = arch/x86/insn/gen-insn-attr-x86.awk +inat_tables_maps = arch/x86/insn/x86-opcode-map.txt + +$(OUTPUT)arch/x86/insn/inat-tables.c: $(inat_tables_script) $(inat_tables_maps) + $(call rule_mkdir) + $(Q)$(call echo-cmd,gen)$(AWK) -f $(inat_tables_script) $(inat_tables_maps) > $@ + +$(OUTPUT)arch/x86/decode.o: $(OUTPUT)arch/x86/insn/inat-tables.c + +CFLAGS_decode.o += -I$(OUTPUT)arch/x86/insn
tools/objtool/arch/x86/decode.c new file +172 -0
172 lines not on this page · raw message
tools/objtool/arch/x86/insn/gen-insn-attr-x86.awk new file +387 -0
387 lines not on this page · raw message
tools/objtool/arch/x86/insn/inat.c new file +97 -0
97 lines not on this page · raw message
tools/objtool/arch/x86/insn/inat.h new file +221 -0
221 lines not on this page · raw message
tools/objtool/arch/x86/insn/inat_types.h new file +29 -0
@@ -0,0 +1,29 @@ +#ifndef _ASM_X86_INAT_TYPES_H +#define _ASM_X86_INAT_TYPES_H +/* +* x86 instruction attributes +* +* Written by Masami Hiramatsu <[email protected]> +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +* +*/ + +/* Instruction attributes */ +typedef unsigned int insn_attr_t ; +typedef unsigned char insn_byte_t ; +typedef signed int insn_value_t ; + +#endif
tools/objtool/arch/x86/insn/insn.c new file +594 -0
594 lines not on this page · raw message
tools/objtool/arch/x86/insn/insn.h new file +201 -0
201 lines not on this page · raw message
tools/objtool/arch/x86/insn/x86-opcode-map.txt new file +984 -0
760 lines not on this page · raw message
tools/objtool/builtin-check.c new file +1072 -0
1,072 lines not on this page · raw message
tools/objtool/elf.c new file +403 -0
403 lines not on this page · raw message
tools/objtool/elf.h new file +79 -0
79 lines not on this page · raw message
tools/objtool/objtool.c new file +136 -0
136 lines not on this page · raw message
tools/objtool/special.c new file +193 -0
193 lines not on this page · raw message
tools/objtool/special.h new file +42 -0
42 lines not on this page · raw message
tools/objtool/warn.h new file +60 -0
60 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
Signature · 1 line
2.4.3
Part of the diff is not shown here. View the raw message.
tip-bot for Josh Poimboeuf
merge bot[tip:core/objtool] objtool: Add tool to perform compile-time stack metadata validation
objtool: Add tool to perform compile-time stack metadata validation
Commit-ID: 442f04c34a1a467759d024a1d2c1df0f744dcb06 Gitweb: http://git.kernel.org/tip/442f04c34a1a467759d024a1d2c1df0f744dcb06 Author: Josh Poimboeuf <[email protected]> AuthorDate: Sun, 28 Feb 2016 22:22:41 -0600 Committer: Ingo Molnar <[email protected]> CommitDate: Mon, 29 Feb 2016 08:35:12 +0100
objtool: Add tool to perform compile-time stack metadata validation
This adds a host tool named objtool which has a "check" subcommand which analyzes .o files to ensure the validity of stack metadata. It enforces a set of rules on asm code and C inline assembly code so that stack traces can be reliable.
For each function, it recursively follows all possible code paths and validates the correct frame pointer state at each instruction.
It also follows code paths involving kernel special sections, like .altinstructions, __jump_table, and __ex_table, which can add alternative execution paths to a given instruction (or set of instructions). Similarly, it knows how to follow switch statements, for which gcc sometimes uses jump tables.
Here are some of the benefits of validating stack metadata:
a) More reliable stack traces for frame pointer enabled kernels
Frame pointers are used for debugging purposes. They allow runtime code and debug tools to be able to walk the stack to determine the chain of function call sites that led to the currently executing code.
For some architectures, frame pointers are enabled by CONFIG_FRAME_POINTER. For some other architectures they may be required by the ABI (sometimes referred to as "backchain pointers").
For C code, gcc automatically generates instructions for setting up frame pointers when the -fno-omit-frame-pointer option is used.
But for asm code, the frame setup instructions have to be written by hand, which most people don't do. So the end result is that CONFIG_FRAME_POINTER is honored for C code but not for most asm code.
For stack traces based on frame pointers to be reliable, all functions which call other functions must first create a stack frame and update the frame pointer. If a first function doesn't properly create a stack frame before calling a second function, the *caller* of the first function will be skipped on the stack trace.
For example, consider the following example backtrace with frame pointers enabled:
[<ffffffff81812584>] dump_stack+0x4b/0x63
[<ffffffff812d6dc2>] cmdline_proc_show+0x12/0x30
[<ffffffff8127f568>] seq_read+0x108/0x3e0
[<ffffffff812cce62>] proc_reg_read+0x42/0x70
[<ffffffff81256197>] __vfs_read+0x37/0x100
[<ffffffff81256b16>] vfs_read+0x86/0x130
[<ffffffff81257898>] SyS_read+0x58/0xd0
[<ffffffff8181c1f2>] entry_SYSCALL_64_fastpath+0x12/0x76 It correctly shows that the caller of cmdline_proc_show() is seq_read().
If we remove the frame pointer logic from cmdline_proc_show() by replacing the frame pointer related instructions with nops, here's what it looks like instead:
[<ffffffff81812584>] dump_stack+0x4b/0x63
[<ffffffff812d6dc2>] cmdline_proc_show+0x12/0x30
[<ffffffff812cce62>] proc_reg_read+0x42/0x70
[<ffffffff81256197>] __vfs_read+0x37/0x100
[<ffffffff81256b16>] vfs_read+0x86/0x130
[<ffffffff81257898>] SyS_read+0x58/0xd0
[<ffffffff8181c1f2>] entry_SYSCALL_64_fastpath+0x12/0x76 Notice that cmdline_proc_show()'s caller, seq_read(), has been skipped. Instead the stack trace seems to show that cmdline_proc_show() was called by proc_reg_read().
The benefit of "objtool check" here is that because it ensures that *all* functions honor CONFIG_FRAME_POINTER, no functions will ever[*] be skipped on a stack trace.
[*] unless an interrupt or exception has occurred at the very
beginning of a function before the stack frame has been created, or at the very end of the function after the stack frame has been destroyed. This is an inherent limitation of frame pointers.
b) 100% reliable stack traces for DWARF enabled kernels
This is not yet implemented. For more details about what is planned, see tools/objtool/Documentation/stack-validation.txt.
c) Higher live patching compatibility rate
This is not yet implemented. For more details about what is planned, see tools/objtool/Documentation/stack-validation.txt.
To achieve the validation, "objtool check" enforces the following rules:
1. Each callable function must be annotated as such with the ELF function type. In asm code, this is typically done using the ENTRY/ENDPROC macros. If objtool finds a return instruction outside of a function, it flags an error since that usually indicates callable code which should be annotated accordingly.
This rule is needed so that objtool can properly identify each callable function in order to analyze its stack metadata.
2. Conversely, each section of code which is *not* callable should *not* be annotated as an ELF function. The ENDPROC macro shouldn't be used in this case.
This rule is needed so that objtool can ignore non-callable code. Such code doesn't have to follow any of the other rules.
3. Each callable function which calls another function must have the correct frame pointer logic, if required by CONFIG_FRAME_POINTER or the architecture's back chain rules. This can by done in asm code with the FRAME_BEGIN/FRAME_END macros.
This rule ensures that frame pointer based stack traces will work as designed. If function A doesn't create a stack frame before calling function B, the _caller_ of function A will be skipped on the stack trace.
4. Dynamic jumps and jumps to undefined symbols are only allowed if:
a) the jump is part of a switch statement; or
b) the jump matches sibling call semantics and the frame pointer has the same value it had on function entry.
This rule is needed so that objtool can reliably analyze all of a function's code paths. If a function jumps to code in another file, and it's not a sibling call, objtool has no way to follow the jump because it only analyzes a single file at a time.
5. A callable function may not execute kernel entry/exit instructions. The only code which needs such instructions is kernel entry code, which shouldn't be be in callable functions anyway.
This rule is just a sanity check to ensure that callable functions return normally.
It currently only supports x86_64. I tried to make the code generic so that support for other architectures can hopefully be plugged in relatively easily.
On my Lenovo laptop with a i7-4810MQ 4-core/8-thread CPU, building the kernel with objtool checking every .o file adds about three seconds of total build time. It hasn't been optimized for performance yet, so there are probably some opportunities for better build performance.
--- MAINTAINERS | 5 + tools/Makefile | 14 +- tools/objtool/.gitignore | 2 + tools/objtool/Build | 13 + tools/objtool/Documentation/stack-validation.txt | 342 +++++++ tools/objtool/Makefile | 60 ++ tools/objtool/arch.h | 44 + tools/objtool/arch/x86/Build | 12 + tools/objtool/arch/x86/decode.c | 172 ++++ .../objtool/arch/x86/insn}/gen-insn-attr-x86.awk | 0 tools/objtool/arch/x86/insn/inat.c | 97 ++ .../arch/x86/insn}/inat.h | 0 .../arch/x86/insn}/inat_types.h | 0 .../arch/x86/insn}/insn.c | 0 .../arch/x86/insn}/insn.h | 0 .../arch/x86/insn}/x86-opcode-map.txt | 0 tools/objtool/builtin-check.c | 1072 ++++++++++++++++++++ tools/objtool/builtin.h | 22 + tools/objtool/elf.c | 403 ++++++++ tools/objtool/elf.h | 79 ++ tools/objtool/objtool.c | 136 +++ tools/objtool/special.c | 193 ++++ tools/objtool/special.h | 42 + tools/objtool/warn.h | 60 ++ 24 files changed, 2762 insertions(+), 6 deletions(-)
MAINTAINERS +5 -0
@@ -7778,6 +7778,11 @@ L: [email protected] (moderated for non-subscribers) S: Maintained F: sound/soc/codecs/tfa9879* +OBJTOOL +M: Josh Poimboeuf <[email protected]> +S: Supported +F: tools/objtool/ + OMAP SUPPORT M: Tony Lindgren <[email protected]> L: [email protected]
tools/Makefile +8 -6
@@ -20,6 +20,7 @@ help: @echo ' perf - Linux performance measurement and analysis tool' @echo ' selftests - various kernel selftests' @echo ' spi - spi tools' + @echo ' objtool - an ELF object analysis tool' @echo ' tmon - thermal monitoring and tuning tool' @echo ' turbostat - Intel CPU idle stats and freq reporting tool' @echo ' usb - USB testing tools'
@@ -53,7 +54,7 @@ acpi: FORCE cpupower: FORCE $(call descend,power/$@) -cgroup firewire hv guest spi usb virtio vm net iio: FORCE +cgroup firewire hv guest spi usb virtio vm net iio objtool: FORCE $(call descend,$@) liblockdep: FORCE
@@ -85,7 +86,7 @@ freefall: FORCE all: acpi cgroup cpupower hv firewire lguest \ perf selftests turbostat usb \ virtio vm net x86_energy_perf_policy \ - tmon freefall + tmon freefall objtool acpi_install: $(call descend,power/$(@:_install=),install)
@@ -93,7 +94,7 @@ acpi_install: cpupower_install: $(call descend,power/$(@:_install=),install) -cgroup_install firewire_install hv_install lguest_install perf_install usb_install virtio_install vm_install net_install: +cgroup_install firewire_install hv_install lguest_install perf_install usb_install virtio_install vm_install net_install objtool_install: $(call descend,$(@:_install=),install) selftests_install:
@@ -111,7 +112,7 @@ freefall_install: install: acpi_install cgroup_install cpupower_install hv_install firewire_install lguest_install \ perf_install selftests_install turbostat_install usb_install \ virtio_install vm_install net_install x86_energy_perf_policy_install \ - tmon_install freefall_install + tmon_install freefall_install objtool_install acpi_clean: $(call descend,power/acpi,clean)
@@ -119,7 +120,7 @@ acpi_clean: cpupower_clean: $(call descend,power/cpupower,clean) -cgroup_clean hv_clean firewire_clean lguest_clean spi_clean usb_clean virtio_clean vm_clean net_clean iio_clean: +cgroup_clean hv_clean firewire_clean lguest_clean spi_clean usb_clean virtio_clean vm_clean net_clean iio_clean objtool_clean: $(call descend,$(@:_clean=),clean) liblockdep_clean:
@@ -155,6 +156,7 @@ build_clean: clean: acpi_clean cgroup_clean cpupower_clean hv_clean firewire_clean lguest_clean \ perf_clean selftests_clean turbostat_clean spi_clean usb_clean virtio_clean \ vm_clean net_clean iio_clean x86_energy_perf_policy_clean tmon_clean \ - freefall_clean build_clean libbpf_clean libsubcmd_clean liblockdep_clean + freefall_clean build_clean libbpf_clean libsubcmd_clean liblockdep_clean \ + objtool_clean .PHONY: FORCE
tools/objtool/.gitignore new file +2 -0
@@ -0,0 +1,2 @@ +arch/x86/insn/inat-tables.c +objtool
tools/objtool/Build new file +13 -0
@@ -0,0 +1,13 @@ +objtool-y += arch/$(ARCH)/ +objtool-y += builtin-check.o +objtool-y += elf.o +objtool-y += special.o +objtool-y += objtool.o + +objtool-y += libstring.o + +CFLAGS += -I$(srctree)/tools/lib + +$(OUTPUT)libstring.o: ../lib/string.c FORCE + $(call rule_mkdir) + $(call if_changed_dep,cc_o_c)
tools/objtool/Documentation/stack-validation.txt new file +342 -0
342 lines not on this page · raw message
tools/objtool/Makefile new file +60 -0
60 lines not on this page · raw message
tools/objtool/arch.h new file +44 -0
44 lines not on this page · raw message
tools/objtool/arch/x86/Build new file +12 -0
@@ -0,0 +1,12 @@ +objtool-y += decode.o + +inat_tables_script = arch/x86/insn/gen-insn-attr-x86.awk +inat_tables_maps = arch/x86/insn/x86-opcode-map.txt + +$(OUTPUT)arch/x86/insn/inat-tables.c: $(inat_tables_script) $(inat_tables_maps) + $(call rule_mkdir) + $(Q)$(call echo-cmd,gen)$(AWK) -f $(inat_tables_script) $(inat_tables_maps) > $@ + +$(OUTPUT)arch/x86/decode.o: $(OUTPUT)arch/x86/insn/inat-tables.c + +CFLAGS_decode.o += -I$(OUTPUT)arch/x86/insn
tools/objtool/arch/x86/decode.c new file +172 -0
172 lines not on this page · raw message
tools/objtool/arch/x86/insn/gen-insn-attr-x86.awk renamed from arch/x86/tools/gen-insn-attr-x86.awk +0 -0
tools/objtool/arch/x86/insn/inat.c new file +97 -0
97 lines not on this page · raw message
tools/objtool/arch/x86/insn/inat.h renamed from tools/perf/util/intel-pt-decoder/inat.h +0 -0
tools/objtool/arch/x86/insn/inat_types.h renamed from tools/perf/util/intel-pt-decoder/inat_types.h +0 -0
tools/objtool/arch/x86/insn/insn.c renamed from tools/perf/util/intel-pt-decoder/insn.c +0 -0
tools/objtool/arch/x86/insn/insn.h renamed from tools/perf/util/intel-pt-decoder/insn.h +0 -0
tools/objtool/arch/x86/insn/x86-opcode-map.txt renamed from tools/perf/util/intel-pt-decoder/x86-opcode-map.txt +0 -0
tools/objtool/builtin-check.c new file +1072 -0
1,072 lines not on this page · raw message
tools/objtool/builtin.h new file +22 -0
@@ -0,0 +1,22 @@ +/* +* Copyright (C) 2015 Josh Poimboeuf <[email protected]> +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, see <http://www.gnu.org/licenses/>. +*/ +#ifndef _BUILTIN_H +#define _BUILTIN_H + +extern int cmd_check (int argc,const char **argv); + +#endif /* _BUILTIN_H */
tools/objtool/elf.c new file +403 -0
403 lines not on this page · raw message
tools/objtool/elf.h new file +79 -0
79 lines not on this page · raw message
tools/objtool/objtool.c new file +136 -0
136 lines not on this page · raw message
tools/objtool/special.c new file +193 -0
193 lines not on this page · raw message
tools/objtool/special.h new file +42 -0
42 lines not on this page · raw message
tools/objtool/warn.h new file +60 -0
60 lines not on this page · raw message
PATCH v19 9/10 objtool: Add CONFIG_STACK_VALIDATION option
In reply to Josh PoimboeufAdd a CONFIG_STACK_VALIDATION option which will run "objtool check" for each .o file to ensure the validity of its stack metadata.
--- Makefile | 5 ++++- arch/Kconfig | 6 ++++++ lib/Kconfig.debug | 12 ++++++++++++ scripts/Makefile.build | 39 +++++++++++++++++++++++++++++++++++---- 4 files changed, 57 insertions(+), 5 deletions(-)
Makefile +4 -1
@@ -993,7 +993,10 @@ prepare0: archprepare FORCE $(Q)$(MAKE) $(build)=. # All the preparing.. -prepare: prepare0 +prepare: prepare0 prepare-objtool + +PHONY += prepare-objtool +prepare-objtool: $(if $(CONFIG_STACK_VALIDATION), tools/objtool FORCE) # Generate some files # ---------------------------------------------------------------------------
arch/Kconfig +6 -0
@@ -583,6 +583,12 @@ config HAVE_COPY_THREAD_TLS normal C parameter passing, rather than extracting the syscall argument from pt_regs. +config HAVE_STACK_VALIDATION + bool + help + Architecture supports the 'objtool check' host tool command, which + performs compile-time stack metadata validation. + # # ABI hall of shame #
lib/Kconfig.debug +12 -0
@@ -342,6 +342,18 @@ config FRAME_POINTER larger and slower, but it gives very useful debugging information in case of kernel bugs. (precise oopses/stacktraces/warnings) +config STACK_VALIDATION + bool "Compile-time stack metadata validation" + depends on HAVE_STACK_VALIDATION + default n + help + Add compile-time checks to validate stack metadata, including frame + pointers (if CONFIG_FRAME_POINTER is enabled). This helps ensure + that runtime stack traces are more reliable. + + For more information, see + tools/objtool/Documentation/stack-validation.txt. + config DEBUG_FORCE_WEAK_PER_CPU bool "Force weak per-cpu definitions" depends on DEBUG_KERNEL
scripts/Makefile.build +35 -4
@@ -241,10 +241,32 @@ cmd_record_mcount = \ fi; endif +ifdef CONFIG_STACK_VALIDATION + +__objtool_obj := $(objtree)/tools/objtool/objtool + +objtool_args = check +ifndef CONFIG_FRAME_POINTER +objtool_args += --no-fp +endif + +# 'OBJECT_FILES_NON_STANDARD := y': skip objtool checking for a directory +# 'OBJECT_FILES_NON_STANDARD_foo.o := 'y': skip objtool checking for a file +# 'OBJECT_FILES_NON_STANDARD_foo.o := 'n': override directory skip for a file +cmd_objtool = $(if $(patsubst y%,, \ + $(OBJECT_FILES_NON_STANDARD_$(basetarget).o)$(OBJECT_FILES_NON_STANDARD)n), \ + $(__objtool_obj) $(objtool_args) "$(@)";) +objtool_obj = $(if $(patsubst y%,, \ + $(OBJECT_FILES_NON_STANDARD_$(basetarget).o)$(OBJECT_FILES_NON_STANDARD)n), \ + $(__objtool_obj)) + +endif # CONFIG_STACK_VALIDATION + define rule_cc_o_c $(call echo-cmd,checksrc) $(cmd_checksrc) \ $(call echo-cmd,cc_o_c) $(cmd_cc_o_c); \ $(cmd_modversions) \ + $(cmd_objtool) \ $(call echo-cmd,record_mcount) \ $(cmd_record_mcount) \ scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,cc_o_c)' > \
@@ -253,14 +275,23 @@ define rule_cc_o_c mv -f $(dot-target).tmp $(dot-target).cmd endef +define rule_as_o_S + $(call echo-cmd,as_o_S) $(cmd_as_o_S); \ + $(cmd_objtool) \ + scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,as_o_S)' > \ + $(dot-target).tmp; \ + rm -f $(depfile); \ + mv -f $(dot-target).tmp $(dot-target).cmd +endef + # Built-in and composite module parts -$(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE +$(obj)/%.o: $(src)/%.c $(recordmcount_source) $(objtool_obj) FORCE $(call cmd,force_checksrc) $(call if_changed_rule,cc_o_c) # Single-part modules are special since we need to mark them in $(MODVERDIR) -$(single-used-m): $(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE +$(single-used-m): $(obj)/%.o: $(src)/%.c $(recordmcount_source) $(objtool_obj) FORCE $(call cmd,force_checksrc) $(call if_changed_rule,cc_o_c) @{ echo $(@:.o=.ko); echo $@; } > $(MODVERDIR)/$(@F:.o=.mod)
@@ -290,8 +321,8 @@ $(obj)/%.s: $(src)/%.S FORCE quiet_cmd_as_o_S = AS $(quiet_modtag) $@ cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $< -$(obj)/%.o: $(src)/%.S FORCE - $(call if_changed_dep,as_o_S) +$(obj)/%.o: $(src)/%.S $(objtool_obj) FORCE + $(call if_changed_rule,as_o_S) targets += $(real-objs-y) $(real-objs-m) $(lib-y) targets += $(extra-y) $(MAKECMDGOALS) $(always)
Signature · 1 line
2.4.3
tip-bot for Josh Poimboeuf
merge bot[tip:core/objtool] objtool: Add CONFIG_STACK_VALIDATION option
objtool: Add CONFIG_STACK_VALIDATION option
Commit-ID: b9ab5ebb14ec389bd80f66613f1fe3f8f65f2521 Gitweb: http://git.kernel.org/tip/b9ab5ebb14ec389bd80f66613f1fe3f8f65f2521 Author: Josh Poimboeuf <[email protected]> AuthorDate: Sun, 28 Feb 2016 22:22:42 -0600 Committer: Ingo Molnar <[email protected]> CommitDate: Mon, 29 Feb 2016 08:35:13 +0100
objtool: Add CONFIG_STACK_VALIDATION option
Add a CONFIG_STACK_VALIDATION option which will run "objtool check" for each .o file to ensure the validity of its stack metadata.
--- Makefile | 5 ++++- arch/Kconfig | 6 ++++++ lib/Kconfig.debug | 12 ++++++++++++ scripts/Makefile.build | 39 +++++++++++++++++++++++++++++++++++---- 4 files changed, 57 insertions(+), 5 deletions(-)
Makefile +4 -1
@@ -993,7 +993,10 @@ prepare0: archprepare FORCE $(Q)$(MAKE) $(build)=. # All the preparing.. -prepare: prepare0 +prepare: prepare0 prepare-objtool + +PHONY += prepare-objtool +prepare-objtool: $(if $(CONFIG_STACK_VALIDATION), tools/objtool FORCE) # Generate some files # ---------------------------------------------------------------------------
arch/Kconfig +6 -0
@@ -583,6 +583,12 @@ config HAVE_COPY_THREAD_TLS normal C parameter passing, rather than extracting the syscall argument from pt_regs. +config HAVE_STACK_VALIDATION + bool + help + Architecture supports the 'objtool check' host tool command, which + performs compile-time stack metadata validation. + # # ABI hall of shame #
lib/Kconfig.debug +12 -0
@@ -342,6 +342,18 @@ config FRAME_POINTER larger and slower, but it gives very useful debugging information in case of kernel bugs. (precise oopses/stacktraces/warnings) +config STACK_VALIDATION + bool "Compile-time stack metadata validation" + depends on HAVE_STACK_VALIDATION + default n + help + Add compile-time checks to validate stack metadata, including frame + pointers (if CONFIG_FRAME_POINTER is enabled). This helps ensure + that runtime stack traces are more reliable. + + For more information, see + tools/objtool/Documentation/stack-validation.txt. + config DEBUG_FORCE_WEAK_PER_CPU bool "Force weak per-cpu definitions" depends on DEBUG_KERNEL
scripts/Makefile.build +35 -4
@@ -241,10 +241,32 @@ cmd_record_mcount = \ fi; endif +ifdef CONFIG_STACK_VALIDATION + +__objtool_obj := $(objtree)/tools/objtool/objtool + +objtool_args = check +ifndef CONFIG_FRAME_POINTER +objtool_args += --no-fp +endif + +# 'OBJECT_FILES_NON_STANDARD := y': skip objtool checking for a directory +# 'OBJECT_FILES_NON_STANDARD_foo.o := 'y': skip objtool checking for a file +# 'OBJECT_FILES_NON_STANDARD_foo.o := 'n': override directory skip for a file +cmd_objtool = $(if $(patsubst y%,, \ + $(OBJECT_FILES_NON_STANDARD_$(basetarget).o)$(OBJECT_FILES_NON_STANDARD)n), \ + $(__objtool_obj) $(objtool_args) "$(@)";) +objtool_obj = $(if $(patsubst y%,, \ + $(OBJECT_FILES_NON_STANDARD_$(basetarget).o)$(OBJECT_FILES_NON_STANDARD)n), \ + $(__objtool_obj)) + +endif # CONFIG_STACK_VALIDATION + define rule_cc_o_c $(call echo-cmd,checksrc) $(cmd_checksrc) \ $(call echo-cmd,cc_o_c) $(cmd_cc_o_c); \ $(cmd_modversions) \ + $(cmd_objtool) \ $(call echo-cmd,record_mcount) \ $(cmd_record_mcount) \ scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,cc_o_c)' > \
@@ -253,14 +275,23 @@ define rule_cc_o_c mv -f $(dot-target).tmp $(dot-target).cmd endef +define rule_as_o_S + $(call echo-cmd,as_o_S) $(cmd_as_o_S); \ + $(cmd_objtool) \ + scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,as_o_S)' > \ + $(dot-target).tmp; \ + rm -f $(depfile); \ + mv -f $(dot-target).tmp $(dot-target).cmd +endef + # Built-in and composite module parts -$(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE +$(obj)/%.o: $(src)/%.c $(recordmcount_source) $(objtool_obj) FORCE $(call cmd,force_checksrc) $(call if_changed_rule,cc_o_c) # Single-part modules are special since we need to mark them in $(MODVERDIR) -$(single-used-m): $(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE +$(single-used-m): $(obj)/%.o: $(src)/%.c $(recordmcount_source) $(objtool_obj) FORCE $(call cmd,force_checksrc) $(call if_changed_rule,cc_o_c) @{ echo $(@:.o=.ko); echo $@; } > $(MODVERDIR)/$(@F:.o=.mod)
@@ -290,8 +321,8 @@ $(obj)/%.s: $(src)/%.S FORCE quiet_cmd_as_o_S = AS $(quiet_modtag) $@ cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $< -$(obj)/%.o: $(src)/%.S FORCE - $(call if_changed_dep,as_o_S) +$(obj)/%.o: $(src)/%.S $(objtool_obj) FORCE + $(call if_changed_rule,as_o_S) targets += $(real-objs-y) $(real-objs-m) $(lib-y) targets += $(extra-y) $(MAKECMDGOALS) $(always)
Re: [tip:core/objtool] objtool: Add CONFIG_STACK_VALIDATION option
Quoted 6 lines · tip-bot for Josh Poimboeuf
Gitweb: http://git.kernel.org/tip/b9ab5ebb14ec389bd80f66613f1fe3f8f65f2521 Author: Josh Poimboeuf <[email protected]> objtool: Add CONFIG_STACK_VALIDATION optionAdd a
CONFIG_STACK_VALIDATIONoption which will run "objtool check" for each .o file to ensure the validity of its stack metadata.
|./mk-x86-64.sh -j1 |make[1]: Entering directory '/home/bigeasy/linux-tip/build/linux-x8664' | CHK include/config/kernel.release | Using /home/bigeasy/linux-tip as source for kernel | GEN ./Makefile | CHK include/generated/uapi/linux/version.h | CHK include/generated/utsrelease.h | CHK include/generated/bounds.h | CHK include/generated/timeconst.h | CHK include/generated/asm-offsets.h | CALL /home/bigeasy/linux-tip/scripts/checksyscalls.sh |scripts/Makefile.include:3: *** O=build/linux-x8664 does not exist. Stop. |/home/bigeasy/linux-tip/Makefile:1518: recipe for target 'tools/objtool' failed |make[1]: *** [tools/objtool] Error 2 |make[1]: Leaving directory '/home/bigeasy/linux-tip/build/linux-x8664' |Makefile:146: recipe for target 'sub-make' failed |make: *** [sub-make] Error 2
with
|$ cat mk-x86-64.sh |#!/bin/sh |export PATH=/usr/lib/ccache/:$PATH |exec make O=build/linux-x8664 -j 8 $*
Is this know? I tried the TIP tree as of now. It works with CONFIG_STACK_VALIDATION=n
Sebastian
Re: [tip:core/objtool] objtool: Add CONFIG_STACK_VALIDATION option
Quoted 32 lines · Sebastian Andrzej Siewior
Quoted 6 lines · tip-bot for Josh Poimboeuf
Gitweb: http://git.kernel.org/tip/b9ab5ebb14ec389bd80f66613f1fe3f8f65f2521 Author: Josh Poimboeuf <[email protected]> objtool: Add CONFIG_STACK_VALIDATION optionAdd a
CONFIG_STACK_VALIDATIONoption which will run "objtool check" for each .o file to ensure the validity of its stack metadata.|./mk-x86-64.sh -j1 |make[1]: Entering directory '/home/bigeasy/linux-tip/build/linux-x8664' | CHK include/config/kernel.release | Using /home/bigeasy/linux-tip as source for kernel | GEN ./Makefile | CHK include/generated/uapi/linux/version.h | CHK include/generated/utsrelease.h | CHK include/generated/bounds.h | CHK include/generated/timeconst.h | CHK include/generated/asm-offsets.h | CALL /home/bigeasy/linux-tip/scripts/checksyscalls.sh |scripts/Makefile.include:3: *** O=build/linux-x8664 does not exist. Stop. |/home/bigeasy/linux-tip/Makefile:1518: recipe for target 'tools/objtool' failed |make[1]: *** [tools/objtool] Error 2 |make[1]: Leaving directory '/home/bigeasy/linux-tip/build/linux-x8664' |Makefile:146: recipe for target 'sub-make' failed |make: *** [sub-make] Error 2with
|$ cat mk-x86-64.sh |#!/bin/sh |export PATH=/usr/lib/ccache/:$PATH |exec make O=build/linux-x8664 -j 8 $*
Quoted 4 lines
Is this know? I tried the TIP tree as of now. It works with
CONFIG_STACK_VALIDATION=nSebastian
Hi Sebastian,
This bug happens when using a relative path for 'O=' with CONFIG_STACK_VALIDATION. I posted a patch to fix it:
Signature · 1 line
Josh
PATCH v19 10/10 objtool: Enable stack metadata validation on x86_64
In reply to Josh PoimboeufSet HAVE_STACK_VALIDATION to enable stack metadata validation for x86_64.
--- arch/x86/Kconfig | 1 + 1 file changed, 1 insertion(+)
arch/x86/Kconfig +1 -0
@@ -155,6 +155,7 @@ config X86 select VIRT_TO_BUS select X86_DEV_DMA_OPS if X86_64 select X86_FEATURE_NAMES if PROC_FS + select HAVE_STACK_VALIDATION if X86_64 config INSTRUCTION_DECODER def_bool y
Signature · 1 line
2.4.3
tip-bot for Josh Poimboeuf
merge bot[tip:core/objtool] objtool: Enable stack metadata validation on 64-bit x86
objtool: Enable stack metadata validation on 64-bit x86
Commit-ID: d4883d5d6b146fd65f762c462b2c6d4a327c7d50 Gitweb: http://git.kernel.org/tip/d4883d5d6b146fd65f762c462b2c6d4a327c7d50 Author: Josh Poimboeuf <[email protected]> AuthorDate: Sun, 28 Feb 2016 22:22:43 -0600 Committer: Ingo Molnar <[email protected]> CommitDate: Mon, 29 Feb 2016 08:35:13 +0100
objtool: Enable stack metadata validation on 64-bit x86
Set HAVE_STACK_VALIDATION to enable stack metadata validation for x86_64.
--- arch/x86/Kconfig | 1 + 1 file changed, 1 insertion(+)
arch/x86/Kconfig +1 -0
@@ -155,6 +155,7 @@ config X86 select VIRT_TO_BUS select X86_DEV_DMA_OPS if X86_64 select X86_FEATURE_NAMES if PROC_FS + select HAVE_STACK_VALIDATION if X86_64 config INSTRUCTION_DECODER def_bool y
Quoted 3 lines · Josh Poimboeuf
This is v19 of the compile-time stack metadata validation patch set.
It's based on tip:core/objtool.
So I've upgraded my main build box to Fedora 23, to:
gcc version 5.3.1 20151207 (Red Hat 5.3.1-2) (GCC)
GNU assembler version 2.25 (x86_64-redhat-linux) using BFD version version 2.25-15.fc23 GNU ld version 2.25-15.fc23
and I'm now getting a bunch of these warnings:
drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2e7: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2f3: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2ff: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x30b: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x317: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x323: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x32f: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x33b: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x348: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x355: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x362: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x36f: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x37c: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x389: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x396: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2e7: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2f3: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2ff: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x30b: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x317: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x323: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x32f: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x33b: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x348: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x355: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x362: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x36f: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x37c: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x389: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x396: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x19a: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1a6: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1b2: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1be: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1ca: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1d6: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1e2: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1ee: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1ff: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x210: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x221: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x251: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x262: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x273: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x284: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x295: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2a6: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2b7: frame pointer state mismatch
I see nothing particularly weird about rtlwifi_rate_mapping(), except the tons of switch statements - maybe GCC does something really clever here?
In any case this needs to be addressed before the merge window. Also, I think we should limit the number of objtool warnings to one per function?
Thanks,
Ingo
Quoted 64 lines · Ingo Molnar
Quoted 3 lines · Josh Poimboeuf
This is v19 of the compile-time stack metadata validation patch set.
It's based on tip:core/objtool.
So I've upgraded my main build box to Fedora 23, to:
gcc version 5.3.1 20151207 (Red Hat 5.3.1-2) (GCC)
GNU assembler version 2.25 (x86_64-redhat-linux) using BFD version version 2.25-15.fc23 GNU ld version 2.25-15.fc23and I'm now getting a bunch of these warnings:
drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2e7: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2f3: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2ff: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x30b: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x317: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x323: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x32f: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x33b: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x348: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x355: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x362: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x36f: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x37c: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x389: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x396: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2e7: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2f3: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2ff: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x30b: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x317: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x323: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x32f: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x33b: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x348: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x355: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x362: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x36f: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x37c: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x389: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x396: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x19a: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1a6: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1b2: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1be: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1ca: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1d6: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1e2: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1ee: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1ff: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x210: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x221: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x251: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x262: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x273: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x284: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x295: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2a6: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2b7: frame pointer state mismatch
Quoted 5 lines
I see nothing particularly weird about
rtlwifi_rate_mapping(), except the tons of switch statements - maybe GCC does something really clever here?In any case this needs to be addressed before the merge window. Also, I think we should limit the number of objtool warnings to one per function?
This is a bug in objtool's handling of switch statement jump tables. In fact, the 0-day bot warned me about this bug yesterday, but I misinterpreted it:
https://lkml.kernel.org/r/201603060006.yNZ9xTcs%[email protected]
I'll fix it up today. I'll also limit the warnings to one per function.
BTW, I was only able to recreate this particular issue after updating to today's tip/master. It was triggered by a new config option:CONFIG_UBSAN_SANITIZE_ALL.
Signature · 1 line
Josh
Quoted 75 lines · Josh Poimboeuf
Quoted 64 lines · Ingo Molnar
Quoted 3 lines · Josh Poimboeuf
This is v19 of the compile-time stack metadata validation patch set.
It's based on tip:core/objtool.
So I've upgraded my main build box to Fedora 23, to:
gcc version 5.3.1 20151207 (Red Hat 5.3.1-2) (GCC)
GNU assembler version 2.25 (x86_64-redhat-linux) using BFD version version 2.25-15.fc23 GNU ld version 2.25-15.fc23and I'm now getting a bunch of these warnings:
drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2e7: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2f3: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2ff: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x30b: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x317: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x323: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x32f: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x33b: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x348: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x355: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x362: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x36f: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x37c: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x389: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x396: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2e7: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2f3: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2ff: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x30b: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x317: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x323: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x32f: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x33b: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x348: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x355: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x362: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x36f: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x37c: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x389: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x396: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x19a: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1a6: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1b2: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1be: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1ca: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1d6: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1e2: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1ee: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1ff: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x210: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x221: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x251: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x262: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x273: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x284: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x295: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2a6: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2b7: frame pointer state mismatchQuoted 5 lines
I see nothing particularly weird about
rtlwifi_rate_mapping(), except the tons of switch statements - maybe GCC does something really clever here?In any case this needs to be addressed before the merge window. Also, I think we should limit the number of objtool warnings to one per function?
This is a bug in objtool's handling of switch statement jump tables. In fact, the 0-day bot warned me about this bug yesterday, but I misinterpreted it:
Quoted 7 lines
https://lkml.kernel.org/r/201603060006.yNZ9xTcs%[email protected]
I'll fix it up today. I'll also limit the warnings to one per function.
BTW, I was only able to recreate this particular issue after updating to today's tip/master. It was triggered by a new config option:
CONFIG_UBSAN_SANITIZE_ALL.
ah, makes sense! I also upgraded to the latestest Fedora and misinterpreted the warning.
Btw., I like it how in other cases you didn't try to work the warning around in objtool, but improved the C code itself. We can consider this warning as a 'unnecessarily complex switch statement' warning.
For example in this case I think we could use something like the patch below, because in reality the various cases are linear ranges. Totally untested.
Thanks,
Ingo
drivers/net/wireless/realtek/rtlwifi/base.c | 196 ++-------------------------- 1 file changed, 12 insertions(+), 184 deletions(-)
drivers/net/wireless/realtek/rtlwifi/base.c +12 -184
@@ -890,201 +890,29 @@ int rtlwifi_rate_mapping(struct ieee80211_hw *hw, bool isht, bool isvht,int rate_idx;if (isvht) { -switch (desc_rate) { -case DESC_RATEVHT1SS_MCS0 : - rate_idx =0 ; -break ; -case DESC_RATEVHT1SS_MCS1 : - rate_idx =1 ; -break ; -case DESC_RATEVHT1SS_MCS2 : - rate_idx =2 ; -break ; -case DESC_RATEVHT1SS_MCS3 : - rate_idx =3 ; -break ; -case DESC_RATEVHT1SS_MCS4 : - rate_idx =4 ; -break ; -case DESC_RATEVHT1SS_MCS5 : - rate_idx =5 ; -break ; -case DESC_RATEVHT1SS_MCS6 : - rate_idx =6 ; -break ; -case DESC_RATEVHT1SS_MCS7 : - rate_idx =7 ; -break ; -case DESC_RATEVHT1SS_MCS8 : - rate_idx =8 ; -break ; -case DESC_RATEVHT1SS_MCS9 : - rate_idx =9 ; -break ; -case DESC_RATEVHT2SS_MCS0 : - rate_idx =0 ; -break ; -case DESC_RATEVHT2SS_MCS1 : - rate_idx =1 ; -break ; -case DESC_RATEVHT2SS_MCS2 : - rate_idx =2 ; -break ; -case DESC_RATEVHT2SS_MCS3 : - rate_idx =3 ; -break ; -case DESC_RATEVHT2SS_MCS4 : - rate_idx =4 ; -break ; -case DESC_RATEVHT2SS_MCS5 : - rate_idx =5 ; -break ; -case DESC_RATEVHT2SS_MCS6 : - rate_idx =6 ; -break ; -case DESC_RATEVHT2SS_MCS7 : - rate_idx =7 ; -break ; -case DESC_RATEVHT2SS_MCS8 : - rate_idx =8 ; -break ; -case DESC_RATEVHT2SS_MCS9 : - rate_idx =9 ; -break ; -default : +if (desc_rate >=DESC_RATEVHT1SS_MCS0 && desc_rate <=DESC_RATEVHT2SS_MCS9 ) + rate_idx = desc_rate-DESC_RATEVHT1SS_MCS0 ; +else rate_idx =0 ; -break ; - }return rate_idx; }if (false == isht) {if (IEEE80211_BAND_2GHZ == hw->conf.chandef.chan->band) { -switch (desc_rate) { -case DESC_RATE1M : - rate_idx =0 ; -break ; -case DESC_RATE2M : - rate_idx =1 ; -break ; -case DESC_RATE5_5M : - rate_idx =2 ; -break ; -case DESC_RATE11M : - rate_idx =3 ; -break ; -case DESC_RATE6M : - rate_idx =4 ; -break ; -case DESC_RATE9M : - rate_idx =5 ; -break ; -case DESC_RATE12M : - rate_idx =6 ; -break ; -case DESC_RATE18M : - rate_idx =7 ; -break ; -case DESC_RATE24M : - rate_idx =8 ; -break ; -case DESC_RATE36M : - rate_idx =9 ; -break ; -case DESC_RATE48M : - rate_idx =10 ; -break ; -case DESC_RATE54M : - rate_idx =11 ; -break ; -default : +if (desc_rate <=DESC_RATE54M ) + rate_idx = desc_rate; +else rate_idx =0 ; -break ; - } }else { -switch (desc_rate) { -case DESC_RATE6M : - rate_idx =0 ; -break ; -case DESC_RATE9M : - rate_idx =1 ; -break ; -case DESC_RATE12M : - rate_idx =2 ; -break ; -case DESC_RATE18M : - rate_idx =3 ; -break ; -case DESC_RATE24M : - rate_idx =4 ; -break ; -case DESC_RATE36M : - rate_idx =5 ; -break ; -case DESC_RATE48M : - rate_idx =6 ; -break ; -case DESC_RATE54M : - rate_idx =7 ; -break ; -default : +if (desc_rate >=DESC_RATE6M && desc_rate <=DESC_RATE54M ) + rate_idx = desc_rate-DESC_RATE6M ; +else rate_idx =0 ; -break ; - } } }else { -switch (desc_rate) { -case DESC_RATEMCS0 : - rate_idx =0 ; -break ; -case DESC_RATEMCS1 : - rate_idx =1 ; -break ; -case DESC_RATEMCS2 : - rate_idx =2 ; -break ; -case DESC_RATEMCS3 : - rate_idx =3 ; -break ; -case DESC_RATEMCS4 : - rate_idx =4 ; -break ; -case DESC_RATEMCS5 : - rate_idx =5 ; -break ; -case DESC_RATEMCS6 : - rate_idx =6 ; -break ; -case DESC_RATEMCS7 : - rate_idx =7 ; -break ; -case DESC_RATEMCS8 : - rate_idx =8 ; -break ; -case DESC_RATEMCS9 : - rate_idx =9 ; -break ; -case DESC_RATEMCS10 : - rate_idx =10 ; -break ; -case DESC_RATEMCS11 : - rate_idx =11 ; -break ; -case DESC_RATEMCS12 : - rate_idx =12 ; -break ; -case DESC_RATEMCS13 : - rate_idx =13 ; -break ; -case DESC_RATEMCS14 : - rate_idx =14 ; -break ; -case DESC_RATEMCS15 : - rate_idx =15 ; -break ; -default : +if (desc_rate >=DESC_RATEMCS0 && desc_rate <=DESC_RATEMCS15 ) + rate_idx = desc_rate-DESC_RATEMCS0 ; +else rate_idx =0 ; -break ; - } }return rate_idx; }
Quoted 86 lines · Ingo Molnar
Quoted 75 lines · Josh Poimboeuf
Quoted 64 lines · Ingo Molnar
Quoted 3 lines · Josh Poimboeuf
This is v19 of the compile-time stack metadata validation patch set.
It's based on tip:core/objtool.
So I've upgraded my main build box to Fedora 23, to:
gcc version 5.3.1 20151207 (Red Hat 5.3.1-2) (GCC)
GNU assembler version 2.25 (x86_64-redhat-linux) using BFD version version 2.25-15.fc23 GNU ld version 2.25-15.fc23and I'm now getting a bunch of these warnings:
drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2e7: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2f3: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2ff: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x30b: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x317: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x323: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x32f: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x33b: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x348: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x355: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x362: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x36f: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x37c: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x389: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x396: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2e7: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2f3: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2ff: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x30b: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x317: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x323: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x32f: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x33b: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x348: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x355: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x362: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x36f: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x37c: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x389: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x396: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x19a: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1a6: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1b2: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1be: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1ca: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1d6: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1e2: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1ee: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1ff: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x210: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x221: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x251: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x262: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x273: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x284: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x295: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2a6: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2b7: frame pointer state mismatchQuoted 5 lines
I see nothing particularly weird about
rtlwifi_rate_mapping(), except the tons of switch statements - maybe GCC does something really clever here?In any case this needs to be addressed before the merge window. Also, I think we should limit the number of objtool warnings to one per function?
This is a bug in objtool's handling of switch statement jump tables. In fact, the 0-day bot warned me about this bug yesterday, but I misinterpreted it:
Quoted 7 lines
https://lkml.kernel.org/r/201603060006.yNZ9xTcs%[email protected]
I'll fix it up today. I'll also limit the warnings to one per function.
BTW, I was only able to recreate this particular issue after updating to today's tip/master. It was triggered by a new config option:
CONFIG_UBSAN_SANITIZE_ALL.
Quoted 6 lines
ah, makes sense! I also upgraded to the latestest Fedora and misinterpreted the warning.
Btw., I like it how in other cases you didn't try to work the warning around in objtool, but improved the C code itself. We can consider this warning as a 'unnecessarily complex switch statement' warning.
So the bug is that when there's more than one switch statement in a function, objtool interprets all the switch jump tables as a single table. If the targets of one jump table assume a stack frame and the targets of another one don't, you'll see frame pointer warnings like those above.
It *is* interesting that both functions which triggered this bug -- rtlwifi_rate_mapping() and cik_tiling_mode_table_init() -- are cases where the code is way too complex and can be simplified.
But, unless we want to institute an "only one switch statement allowed per function" policy, I think I should still fix the bug. Because I don't really have the clout to tell people "you need to clean up your code because my tool is buggy." :-)
Signature · 1 line
Josh
Quoted 100 lines · Josh Poimboeuf
Quoted 86 lines · Ingo Molnar
Quoted 75 lines · Josh Poimboeuf
Quoted 64 lines · Ingo Molnar
Quoted 3 lines · Josh Poimboeuf
This is v19 of the compile-time stack metadata validation patch set.
It's based on tip:core/objtool.
So I've upgraded my main build box to Fedora 23, to:
gcc version 5.3.1 20151207 (Red Hat 5.3.1-2) (GCC)
GNU assembler version 2.25 (x86_64-redhat-linux) using BFD version version 2.25-15.fc23 GNU ld version 2.25-15.fc23and I'm now getting a bunch of these warnings:
drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2e7: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2f3: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2ff: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x30b: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x317: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x323: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x32f: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x33b: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x348: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x355: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x362: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x36f: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x37c: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x389: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x396: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2e7: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2f3: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2ff: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x30b: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x317: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x323: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x32f: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x33b: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x348: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x355: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x362: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x36f: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x37c: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x389: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x396: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x19a: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1a6: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1b2: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1be: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1ca: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1d6: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1e2: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1ee: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x1ff: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x210: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x221: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x251: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x262: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x273: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x284: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x295: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2a6: frame pointer state mismatchdrivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2b7: frame pointer state mismatchQuoted 5 lines
I see nothing particularly weird about
rtlwifi_rate_mapping(), except the tons of switch statements - maybe GCC does something really clever here?In any case this needs to be addressed before the merge window. Also, I think we should limit the number of objtool warnings to one per function?
This is a bug in objtool's handling of switch statement jump tables. In fact, the 0-day bot warned me about this bug yesterday, but I misinterpreted it:
Quoted 7 lines
https://lkml.kernel.org/r/201603060006.yNZ9xTcs%[email protected]
I'll fix it up today. I'll also limit the warnings to one per function.
BTW, I was only able to recreate this particular issue after updating to today's tip/master. It was triggered by a new config option:
CONFIG_UBSAN_SANITIZE_ALL.Quoted 6 lines
ah, makes sense! I also upgraded to the latestest Fedora and misinterpreted the warning.
Btw., I like it how in other cases you didn't try to work the warning around in objtool, but improved the C code itself. We can consider this warning as a 'unnecessarily complex switch statement' warning.
So the bug is that when there's more than one switch statement in a function, objtool interprets all the switch jump tables as a single table. If the targets of one jump table assume a stack frame and the targets of another one don't, you'll see frame pointer warnings like those above.
Quoted 6 lines
It *is* interesting that both functions which triggered this bug --
rtlwifi_rate_mapping()andcik_tiling_mode_table_init()-- are cases where the code is way too complex and can be simplified.But, unless we want to institute an "only one switch statement allowed per function" policy, I think I should still fix the bug.
Yeah, agreed!
Thanks,
Ingo
so there's a much more serious objtool bug that I found today, apparently it can get into an infinite loop with certain randconfigs:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 104261 mingo 39 19 8672 936 840 R 100.0 0.0 115:03.97 objtool 104485 mingo 39 19 8672 876 780 R 100.0 0.0 115:03.71 objtool 115277 mingo 39 19 8808 892 796 R 100.0 0.0 114:59.38 objtool
unfortunately 'perf record -g' does not seem to be able to resolve it:
fomalhaut:~> perf record -g -p 104261 -a sleep 1
Warning:
PID/TID switch overriding SYSTEM[ perf record: Woken up 17 times to write data ] [ perf record: Captured and wrote 4.076 MB perf.data (4015 samples) ]
Samples: 4K of event 'cycles:ppp', Event count (approx.): 3342262267
Children Self Command Shared Object Symbol + 100.00% 0.00% objtool [unknown] [k] 0x000000000184bf00 + 100.00% 0.00% objtool [unknown] [k] 0x000000000184bf70 + 100.00% 0.00% objtool [unknown] [k] 0x000000000184bfe0 + 100.00% 0.00% objtool [unknown] [k] 0x000000000184c050 + 100.00% 0.00% objtool [unknown] [k] 0x000000000184c0c0 + 100.00% 0.00% objtool [unknown] [k] 0x000000000184c130 + 100.00% 0.00% objtool [unknown] [k] 0x000000000184c1a0 + 100.00% 0.00% objtool [unknown] [k] 0x000000000184c210 + 100.00% 0.00% objtool [unknown] [k] 0x000000000184c280 + 100.00% 0.00% objtool [unknown] [k] 0x000000000184c2f0 + 100.00% 0.00% objtool [unknown] [k] 0x000000000184c360 + 100.00% 0.00% objtool [unknown] [k] 0x000000000184c3d0 + 100.00% 0.00% objtool [unknown] [k] 0x000000000184c440 + 100.00% 0.00% objtool [unknown] [k] 0x000000000184c4b0 + 100.00% 0.00% objtool [unknown] [k] 0x000000000184c520
Plain 'perf top' shows:
Overhead Shared Object Symbol 95.36% objtool [.] validate_branch 2.36% objtool [.] find_symbol_by_offset 0.50% libc-2.22.so [.] __strcmp_sse2_unaligned 0.47% [kernel] [k] nmi 0.06% [kernel] [k] format_decode 0.05% objtool [.] strcmp@plt
I've attached the config that triggers it.
Thanks,
Ingo
#
# Automatically generated file; DO NOT EDIT.
# Linux/x86_64 4.5.0-rc7 Kernel Configuration
#CONFIG_64BIT=yCONFIG_X86_64=yCONFIG_X86=yCONFIG_INSTRUCTION_DECODER=yCONFIG_PERF_EVENTS_INTEL_UNCORE=yCONFIG_OUTPUT_FORMAT="elf64-x86-64"CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"CONFIG_LOCKDEP_SUPPORT=yCONFIG_STACKTRACE_SUPPORT=yCONFIG_MMU=yCONFIG_ARCH_MMAP_RND_BITS_MIN=28CONFIG_ARCH_MMAP_RND_BITS_MAX=32CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=8CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16CONFIG_NEED_DMA_MAP_STATE=yCONFIG_NEED_SG_DMA_LENGTH=yCONFIG_GENERIC_HWEIGHT=yCONFIG_RWSEM_XCHGADD_ALGORITHM=yCONFIG_GENERIC_CALIBRATE_DELAY=yCONFIG_ARCH_HAS_CPU_RELAX=yCONFIG_ARCH_HAS_CACHE_LINE_SIZE=yCONFIG_HAVE_SETUP_PER_CPU_AREA=yCONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=yCONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=yCONFIG_ARCH_HIBERNATION_POSSIBLE=yCONFIG_ARCH_SUSPEND_POSSIBLE=yCONFIG_ARCH_WANT_HUGE_PMD_SHARE=yCONFIG_ARCH_WANT_GENERAL_HUGETLB=yCONFIG_ZONE_DMA32=yCONFIG_AUDIT_ARCH=yCONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=yCONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=yCONFIG_X86_64_SMP=yCONFIG_ARCH_HWEIGHT_CFLAGS="-fcall-saved-rdi -fcall-saved-rsi -fcall-saved-rdx -fcall-saved-rcx -fcall-saved-r8 -fcall-saved-r9 -fcall-saved-r10 -fcall-saved-r11" CONFIG_ARCH_SUPPORTS_UPROBES=yCONFIG_FIX_EARLYCON_MEM=yCONFIG_DEBUG_RODATA=yCONFIG_PGTABLE_LEVELS=4CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"CONFIG_IRQ_WORK=yCONFIG_BUILDTIME_EXTABLE_SORT=y
#
# General setup
#CONFIG_INIT_ENV_ARG_LIMIT=32CONFIG_CROSS_COMPILE=""
# CONFIG_COMPILE_TEST is not setCONFIG_LOCALVERSION=""CONFIG_LOCALVERSION_AUTO=yCONFIG_HAVE_KERNEL_GZIP=yCONFIG_HAVE_KERNEL_BZIP2=yCONFIG_HAVE_KERNEL_LZMA=yCONFIG_HAVE_KERNEL_XZ=yCONFIG_HAVE_KERNEL_LZO=yCONFIG_HAVE_KERNEL_LZ4=y
# CONFIG_KERNEL_GZIP is not setCONFIG_KERNEL_BZIP2=y
# CONFIG_KERNEL_LZMA is not set
# CONFIG_KERNEL_XZ is not set
# CONFIG_KERNEL_LZO is not set
# CONFIG_KERNEL_LZ4 is not setCONFIG_DEFAULT_HOSTNAME="(none)"CONFIG_SWAP=y
# CONFIG_SYSVIPC is not setCONFIG_POSIX_MQUEUE=yCONFIG_POSIX_MQUEUE_SYSCTL=yCONFIG_CROSS_MEMORY_ATTACH=yCONFIG_FHANDLE=y
# CONFIG_USELIB is not setCONFIG_AUDIT=yCONFIG_HAVE_ARCH_AUDITSYSCALL=yCONFIG_AUDITSYSCALL=yCONFIG_AUDIT_WATCH=yCONFIG_AUDIT_TREE=y
#
# IRQ subsystem
#CONFIG_GENERIC_IRQ_PROBE=yCONFIG_GENERIC_IRQ_SHOW=yCONFIG_GENERIC_PENDING_IRQ=yCONFIG_GENERIC_IRQ_CHIP=yCONFIG_IRQ_DOMAIN=yCONFIG_IRQ_DOMAIN_HIERARCHY=y
# CONFIG_IRQ_DOMAIN_DEBUG is not setCONFIG_IRQ_FORCED_THREADING=yCONFIG_SPARSE_IRQ=yCONFIG_CLOCKSOURCE_WATCHDOG=yCONFIG_ARCH_CLOCKSOURCE_DATA=yCONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE=yCONFIG_GENERIC_TIME_VSYSCALL=yCONFIG_GENERIC_CLOCKEVENTS=yCONFIG_GENERIC_CLOCKEVENTS_BROADCAST=yCONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=yCONFIG_GENERIC_CMOS_UPDATE=y
#
# Timers subsystem
#CONFIG_TICK_ONESHOT=yCONFIG_HZ_PERIODIC=y
# CONFIG_NO_HZ_IDLE is not set
# CONFIG_NO_HZ_FULL is not setCONFIG_NO_HZ=yCONFIG_HIGH_RES_TIMERS=y
#
# CPU/Task time and stats accounting
#
# CONFIG_TICK_CPU_ACCOUNTING is not set
# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not setCONFIG_IRQ_TIME_ACCOUNTING=yCONFIG_BSD_PROCESS_ACCT=yCONFIG_BSD_PROCESS_ACCT_V3=yCONFIG_TASKSTATS=yCONFIG_TASK_DELAY_ACCT=yCONFIG_TASK_XACCT=yCONFIG_TASK_IO_ACCOUNTING=y
#
# RCU Subsystem
#CONFIG_TREE_RCU=yCONFIG_RCU_EXPERT=yCONFIG_SRCU=yCONFIG_TASKS_RCU=yCONFIG_RCU_STALL_COMMON=yCONFIG_RCU_FANOUT=64CONFIG_RCU_FANOUT_LEAF=16CONFIG_TREE_RCU_TRACE=yCONFIG_RCU_KTHREAD_PRIO=0CONFIG_RCU_NOCB_CPU=y
# CONFIG_RCU_NOCB_CPU_NONE is not set
# CONFIG_RCU_NOCB_CPU_ZERO is not setCONFIG_RCU_NOCB_CPU_ALL=y
# CONFIG_RCU_EXPEDITE_BOOT is not setCONFIG_BUILD_BIN2C=yCONFIG_IKCONFIG=y
# CONFIG_IKCONFIG_PROC is not setCONFIG_LOG_BUF_SHIFT=20CONFIG_LOG_CPU_MAX_BUF_SHIFT=12CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=yCONFIG_ARCH_SUPPORTS_NUMA_BALANCING=yCONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=yCONFIG_ARCH_SUPPORTS_INT128=yCONFIG_CGROUPS=yCONFIG_PAGE_COUNTER=yCONFIG_MEMCG=yCONFIG_MEMCG_SWAP=y
# CONFIG_MEMCG_SWAP_ENABLED is not set
# CONFIG_BLK_CGROUP is not setCONFIG_CGROUP_SCHED=yCONFIG_FAIR_GROUP_SCHED=yCONFIG_CFS_BANDWIDTH=yCONFIG_RT_GROUP_SCHED=yCONFIG_CGROUP_PIDS=y
# CONFIG_CGROUP_FREEZER is not setCONFIG_CPUSETS=y
# CONFIG_PROC_PID_CPUSET is not set
# CONFIG_CGROUP_DEVICE is not set
# CONFIG_CGROUP_CPUACCT is not setCONFIG_CGROUP_PERF=y
# CONFIG_CGROUP_DEBUG is not set
# CONFIG_CHECKPOINT_RESTORE is not setCONFIG_NAMESPACES=yCONFIG_UTS_NS=y
# CONFIG_IPC_NS is not setCONFIG_USER_NS=y
# CONFIG_PID_NS is not setCONFIG_NET_NS=yCONFIG_SCHED_AUTOGROUP=yCONFIG_SYSFS_DEPRECATED=y
# CONFIG_SYSFS_DEPRECATED_V2 is not setCONFIG_RELAY=yCONFIG_BLK_DEV_INITRD=yCONFIG_INITRAMFS_SOURCE=""CONFIG_RD_GZIP=yCONFIG_RD_BZIP2=yCONFIG_RD_LZMA=y
# CONFIG_RD_XZ is not setCONFIG_RD_LZO=yCONFIG_RD_LZ4=yCONFIG_CC_OPTIMIZE_FOR_SIZE=yCONFIG_SYSCTL=yCONFIG_ANON_INODES=yCONFIG_HAVE_UID16=yCONFIG_SYSCTL_EXCEPTION_TRACE=yCONFIG_HAVE_PCSPKR_PLATFORM=yCONFIG_BPF=yCONFIG_EXPERT=yCONFIG_UID16=yCONFIG_MULTIUSER=yCONFIG_SGETMASK_SYSCALL=y
# CONFIG_SYSFS_SYSCALL is not set
# CONFIG_SYSCTL_SYSCALL is not setCONFIG_KALLSYMS=yCONFIG_KALLSYMS_ALL=yCONFIG_PRINTK=y
# CONFIG_BUG is not set
# CONFIG_PCSPKR_PLATFORM is not setCONFIG_BASE_FULL=yCONFIG_FUTEX=yCONFIG_EPOLL=yCONFIG_SIGNALFD=yCONFIG_TIMERFD=yCONFIG_EVENTFD=y
# CONFIG_BPF_SYSCALL is not setCONFIG_SHMEM=yCONFIG_AIO=y
# CONFIG_ADVISE_SYSCALLS is not setCONFIG_USERFAULTFD=yCONFIG_PCI_QUIRKS=y
# CONFIG_MEMBARRIER is not set
# CONFIG_EMBEDDED is not setCONFIG_HAVE_PERF_EVENTS=y
#
# Kernel Performance Events And Counters
#CONFIG_PERF_EVENTS=y
# CONFIG_DEBUG_PERF_USE_VMALLOC is not setCONFIG_VM_EVENT_COUNTERS=y
# CONFIG_SLUB_DEBUG is not setCONFIG_COMPAT_BRK=y
# CONFIG_SLAB is not setCONFIG_SLUB=y
# CONFIG_SLOB is not setCONFIG_SLUB_CPU_PARTIAL=y
# CONFIG_SYSTEM_DATA_VERIFICATION is not setCONFIG_PROFILING=yCONFIG_TRACEPOINTS=yCONFIG_KEXEC_CORE=yCONFIG_OPROFILE=y
# CONFIG_OPROFILE_EVENT_MULTIPLEX is not setCONFIG_HAVE_OPROFILE=yCONFIG_OPROFILE_NMI_TIMER=yCONFIG_JUMP_LABEL=y
# CONFIG_STATIC_KEYS_SELFTEST is not set
# CONFIG_UPROBES is not set
# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not setCONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=yCONFIG_ARCH_USE_BUILTIN_BSWAP=yCONFIG_USER_RETURN_NOTIFIER=yCONFIG_HAVE_IOREMAP_PROT=yCONFIG_HAVE_KPROBES=yCONFIG_HAVE_KRETPROBES=yCONFIG_HAVE_OPTPROBES=yCONFIG_HAVE_KPROBES_ON_FTRACE=yCONFIG_HAVE_ARCH_TRACEHOOK=yCONFIG_HAVE_DMA_CONTIGUOUS=yCONFIG_GENERIC_SMP_IDLE_THREAD=yCONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=yCONFIG_HAVE_REGS_AND_STACK_ACCESS_API=yCONFIG_HAVE_CLK=yCONFIG_HAVE_DMA_API_DEBUG=yCONFIG_HAVE_HW_BREAKPOINT=yCONFIG_HAVE_MIXED_BREAKPOINTS_REGS=yCONFIG_HAVE_USER_RETURN_NOTIFIER=yCONFIG_HAVE_PERF_EVENTS_NMI=yCONFIG_HAVE_PERF_REGS=yCONFIG_HAVE_PERF_USER_STACK_DUMP=yCONFIG_HAVE_ARCH_JUMP_LABEL=yCONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=yCONFIG_HAVE_ALIGNED_STRUCT_PAGE=yCONFIG_HAVE_CMPXCHG_LOCAL=yCONFIG_HAVE_CMPXCHG_DOUBLE=yCONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=yCONFIG_ARCH_WANT_OLD_COMPAT_IPC=yCONFIG_HAVE_ARCH_SECCOMP_FILTER=yCONFIG_SECCOMP_FILTER=yCONFIG_HAVE_CC_STACKPROTECTOR=y
# CONFIG_CC_STACKPROTECTOR is not setCONFIG_CC_STACKPROTECTOR_NONE=y
# CONFIG_CC_STACKPROTECTOR_REGULAR is not set
# CONFIG_CC_STACKPROTECTOR_STRONG is not setCONFIG_HAVE_CONTEXT_TRACKING=yCONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=yCONFIG_HAVE_IRQ_TIME_ACCOUNTING=yCONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=yCONFIG_HAVE_ARCH_HUGE_VMAP=yCONFIG_HAVE_ARCH_SOFT_DIRTY=yCONFIG_MODULES_USE_ELF_RELA=yCONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=yCONFIG_ARCH_HAS_PGD_INIT_LATE=yCONFIG_ARCH_HAS_ELF_RANDOMIZE=yCONFIG_HAVE_ARCH_MMAP_RND_BITS=yCONFIG_ARCH_MMAP_RND_BITS=28CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=yCONFIG_ARCH_MMAP_RND_COMPAT_BITS=8CONFIG_HAVE_COPY_THREAD_TLS=yCONFIG_HAVE_STACK_VALIDATION=yCONFIG_OLD_SIGSUSPEND3=yCONFIG_COMPAT_OLD_SIGACTION=y
#
# GCOV-based kernel profiling
#
# CONFIG_GCOV_KERNEL is not setCONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
# CONFIG_HAVE_GENERIC_DMA_COHERENT is not setCONFIG_RT_MUTEXES=yCONFIG_BASE_SMALL=0
# CONFIG_MODULES is not setCONFIG_MODULES_TREE_LOOKUP=yCONFIG_BLOCK=yCONFIG_BLK_DEV_BSG=yCONFIG_BLK_DEV_BSGLIB=y
# CONFIG_BLK_DEV_INTEGRITY is not setCONFIG_BLK_CMDLINE_PARSER=y
#
# Partition Types
#CONFIG_PARTITION_ADVANCED=y
# CONFIG_ACORN_PARTITION is not setCONFIG_AIX_PARTITION=y
# CONFIG_OSF_PARTITION is not setCONFIG_AMIGA_PARTITION=y
# CONFIG_ATARI_PARTITION is not set
# CONFIG_MAC_PARTITION is not setCONFIG_MSDOS_PARTITION=yCONFIG_BSD_DISKLABEL=y
# CONFIG_MINIX_SUBPARTITION is not setCONFIG_SOLARIS_X86_PARTITION=yCONFIG_UNIXWARE_DISKLABEL=y
# CONFIG_LDM_PARTITION is not set
# CONFIG_SGI_PARTITION is not set
# CONFIG_ULTRIX_PARTITION is not setCONFIG_SUN_PARTITION=y
# CONFIG_KARMA_PARTITION is not setCONFIG_EFI_PARTITION=y
# CONFIG_SYSV68_PARTITION is not setCONFIG_CMDLINE_PARTITION=yCONFIG_BLOCK_COMPAT=y
#
# IO Schedulers
#CONFIG_IOSCHED_NOOP=yCONFIG_IOSCHED_DEADLINE=y
# CONFIG_IOSCHED_CFQ is not set
# CONFIG_DEFAULT_DEADLINE is not setCONFIG_DEFAULT_NOOP=yCONFIG_DEFAULT_IOSCHED="noop"CONFIG_PREEMPT_NOTIFIERS=yCONFIG_PADATA=yCONFIG_ASN1=yCONFIG_INLINE_SPIN_UNLOCK_IRQ=yCONFIG_INLINE_READ_UNLOCK=yCONFIG_INLINE_READ_UNLOCK_IRQ=yCONFIG_INLINE_WRITE_UNLOCK=yCONFIG_INLINE_WRITE_UNLOCK_IRQ=yCONFIG_ARCH_SUPPORTS_ATOMIC_RMW=yCONFIG_RWSEM_SPIN_ON_OWNER=yCONFIG_LOCK_SPIN_ON_OWNER=yCONFIG_ARCH_USE_QUEUED_SPINLOCKS=yCONFIG_QUEUED_SPINLOCKS=yCONFIG_ARCH_USE_QUEUED_RWLOCKS=yCONFIG_QUEUED_RWLOCKS=yCONFIG_FREEZER=y
#
# Processor type and features
#CONFIG_ZONE_DMA=yCONFIG_SMP=yCONFIG_X86_FEATURE_NAMES=y CONFIG_X86_FAST_FEATURE_TESTS=y
# CONFIG_X86_X2APIC is not set
# CONFIG_X86_MPPARSE is not set CONFIG_X86_EXTENDED_PLATFORM=yCONFIG_X86_VSMP=y
# CONFIG_X86_GOLDFISH is not set
# CONFIG_X86_INTEL_LPSS is not set CONFIG_X86_AMD_PLATFORM_DEVICE=y CONFIG_IOSF_MBI=y
# CONFIG_IOSF_MBI_DEBUG is not set CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y CONFIG_SCHED_OMIT_FRAME_POINTER=y CONFIG_HYPERVISOR_GUEST=yCONFIG_PARAVIRT=yCONFIG_PARAVIRT_DEBUG=y
# CONFIG_PARAVIRT_SPINLOCKS is not set
# CONFIG_XEN is not set
# CONFIG_KVM_GUEST is not set
# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set CONFIG_NO_BOOTMEM=yCONFIG_MK8=y
# CONFIG_MPSC is not set
# CONFIG_MCORE2 is not set
# CONFIG_MATOM is not set
# CONFIG_GENERIC_CPU is not set CONFIG_X86_INTERNODE_CACHE_SHIFT=12 CONFIG_X86_L1_CACHE_SHIFT=6 CONFIG_X86_INTEL_USERCOPY=y CONFIG_X86_USE_PPRO_CHECKSUM=yCONFIG_X86_TSC=yCONFIG_X86_CMPXCHG64=yCONFIG_X86_CMOV=y CONFIG_X86_MINIMUM_CPU_FAMILY=64 CONFIG_X86_DEBUGCTLMSR=y
# CONFIG_PROCESSOR_SELECT is not set CONFIG_CPU_SUP_INTEL=yCONFIG_CPU_SUP_AMD=yCONFIG_CPU_SUP_CENTAUR=yCONFIG_HPET_TIMER=yCONFIG_DMI=y
# CONFIG_GART_IOMMU is not set CONFIG_CALGARY_IOMMU=y
# CONFIG_CALGARY_IOMMU_ENABLED_BY_DEFAULT is not set CONFIG_SWIOTLB=yCONFIG_IOMMU_HELPER=yCONFIG_MAXSMP=yCONFIG_NR_CPUS=8192
# CONFIG_SCHED_SMT is not set
# CONFIG_SCHED_MC is not set
# CONFIG_PREEMPT_NONE is not set CONFIG_PREEMPT_VOLUNTARY=y
# CONFIG_PREEMPT is not set CONFIG_PREEMPT_COUNT=yCONFIG_X86_LOCAL_APIC=yCONFIG_X86_IO_APIC=y
# CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS is not set CONFIG_X86_MCE=yCONFIG_X86_MCE_INTEL=yCONFIG_X86_MCE_AMD=yCONFIG_X86_MCE_THRESHOLD=y
# CONFIG_X86_MCE_INJECT is not set CONFIG_X86_THERMAL_VECTOR=y
# CONFIG_VM86 is not set CONFIG_X86_VSYSCALL_EMULATION=y
# CONFIG_I8K is not set
# CONFIG_MICROCODE is not setCONFIG_X86_MSR=y
# CONFIG_X86_CPUID is not set CONFIG_ARCH_PHYS_ADDR_T_64BIT=y CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_X86_DIRECT_GBPAGES=y
# CONFIG_NUMA is not set CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_DEFAULT=y CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 CONFIG_SELECT_MEMORY_MODEL=y CONFIG_SPARSEMEM_MANUAL=yCONFIG_SPARSEMEM=yCONFIG_HAVE_MEMORY_PRESENT=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_ALLOC_MEM_MAP_TOGETHER=y
# CONFIG_SPARSEMEM_VMEMMAP is not set CONFIG_HAVE_MEMBLOCK=y CONFIG_HAVE_MEMBLOCK_NODE_MAP=y CONFIG_ARCH_DISCARD_MEMBLOCK=y CONFIG_MEMORY_ISOLATION=y
# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
# CONFIG_MEMORY_HOTPLUG is not set CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y CONFIG_MEMORY_BALLOON=y CONFIG_BALLOON_COMPACTION=yCONFIG_COMPACTION=yCONFIG_MIGRATION=yCONFIG_PHYS_ADDR_T_64BIT=y CONFIG_ZONE_DMA_FLAG=1CONFIG_BOUNCE=yCONFIG_VIRT_TO_BUS=yCONFIG_MMU_NOTIFIER=y
# CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y
# CONFIG_MEMORY_FAILURE is not set CONFIG_TRANSPARENT_HUGEPAGE=y
# CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS is not set CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y CONFIG_CLEANCACHE=yCONFIG_FRONTSWAP=yCONFIG_CMA=y
# CONFIG_CMA_DEBUG is not set
# CONFIG_CMA_DEBUGFS is not set CONFIG_CMA_AREAS=7CONFIG_ZSWAP=yCONFIG_ZPOOL=y
# CONFIG_ZBUD is not setCONFIG_ZSMALLOC=y
# CONFIG_PGTABLE_MAPPING is not set
# CONFIG_ZSMALLOC_STAT is not set CONFIG_GENERIC_EARLY_IOREMAP=y CONFIG_ARCH_SUPPORTS_DEFERRED_STRUCT_PAGE_INIT=y CONFIG_IDLE_PAGE_TRACKING=y CONFIG_FRAME_VECTOR=y CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y CONFIG_ARCH_HAS_PKEYS=y
# CONFIG_X86_PMEM_LEGACY is not set CONFIG_X86_CHECK_BIOS_CORRUPTION=y
# CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK is not set CONFIG_X86_RESERVE_LOW=64CONFIG_MTRR=yCONFIG_MTRR_SANITIZER=y CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=0 CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1 CONFIG_X86_PAT=yCONFIG_ARCH_USES_PG_UNCACHED=y
# CONFIG_ARCH_RANDOM is not set
# CONFIG_X86_SMAP is not set CONFIG_X86_INTEL_MPX=y CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS=y
# CONFIG_EFI is not setCONFIG_SECCOMP=yCONFIG_HZ_100=y
# CONFIG_HZ_250 is not set
# CONFIG_HZ_300 is not set
# CONFIG_HZ_1000 is not setCONFIG_HZ=100CONFIG_SCHED_HRTICK=y
# CONFIG_KEXEC is not setCONFIG_KEXEC_FILE=yCONFIG_KEXEC_VERIFY_SIG=yCONFIG_CRASH_DUMP=y CONFIG_PHYSICAL_START=0x1000000 CONFIG_RELOCATABLE=y
# CONFIG_RANDOMIZE_BASE is not set CONFIG_PHYSICAL_ALIGN=0x200000 CONFIG_HOTPLUG_CPU=y CONFIG_BOOTPARAM_HOTPLUG_CPU0=y
# CONFIG_DEBUG_HOTPLUG_CPU0 is not set
# CONFIG_COMPAT_VDSO is not set CONFIG_LEGACY_VSYSCALL_NATIVE=y
# CONFIG_LEGACY_VSYSCALL_EMULATE is not set
# CONFIG_LEGACY_VSYSCALL_NONE is not set
# CONFIG_CMDLINE_BOOL is not set
# CONFIG_MODIFY_LDT_SYSCALL is not set CONFIG_HAVE_LIVEPATCH=y CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
#
# Power management and ACPI options
#CONFIG_ARCH_HIBERNATION_HEADER=yCONFIG_SUSPEND=yCONFIG_SUSPEND_FREEZER=y
# CONFIG_SUSPEND_SKIP_SYNC is not setCONFIG_HIBERNATE_CALLBACKS=yCONFIG_HIBERNATION=yCONFIG_PM_STD_PARTITION=""CONFIG_PM_SLEEP=yCONFIG_PM_SLEEP_SMP=y
# CONFIG_PM_AUTOSLEEP is not set
# CONFIG_PM_WAKELOCKS is not setCONFIG_PM=y
# CONFIG_PM_DEBUG is not setCONFIG_PM_OPP=yCONFIG_PM_CLK=y
# CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not setCONFIG_ACPI=yCONFIG_ACPI_LEGACY_TABLES_LOOKUP=yCONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=yCONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y
# CONFIG_ACPI_DEBUGGER is not setCONFIG_ACPI_SLEEP=yCONFIG_ACPI_PROCFS_POWER=y
# CONFIG_ACPI_REV_OVERRIDE_POSSIBLE is not setCONFIG_ACPI_EC_DEBUGFS=yCONFIG_ACPI_AC=y
# CONFIG_ACPI_BATTERY is not set
# CONFIG_ACPI_BUTTON is not setCONFIG_ACPI_VIDEO=yCONFIG_ACPI_FAN=yCONFIG_ACPI_DOCK=yCONFIG_ACPI_CPU_FREQ_PSS=yCONFIG_ACPI_PROCESSOR_IDLE=yCONFIG_ACPI_PROCESSOR=y
# CONFIG_ACPI_IPMI is not setCONFIG_ACPI_HOTPLUG_CPU=y
# CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set
# CONFIG_ACPI_THERMAL is not set
# CONFIG_ACPI_CUSTOM_DSDT is not setCONFIG_ACPI_INITRD_TABLE_OVERRIDE=y
# CONFIG_ACPI_DEBUG is not set
# CONFIG_ACPI_PCI_SLOT is not setCONFIG_X86_PM_TIMER=yCONFIG_ACPI_CONTAINER=yCONFIG_ACPI_HOTPLUG_IOAPIC=yCONFIG_ACPI_SBS=y
# CONFIG_ACPI_HED is not set
# CONFIG_ACPI_CUSTOM_METHOD is not set
# CONFIG_ACPI_REDUCED_HARDWARE_ONLY is not set
# CONFIG_ACPI_NFIT is not setCONFIG_HAVE_ACPI_APEI=yCONFIG_HAVE_ACPI_APEI_NMI=y
# CONFIG_ACPI_APEI is not setCONFIG_ACPI_EXTLOG=yCONFIG_PMIC_OPREGION=y
# CONFIG_CRC_PMIC_OPREGION is not set
# CONFIG_SFI is not set
#
# CPU Frequency scaling
#CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_COMMON=y
# CONFIG_CPU_FREQ_STAT is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE=y CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set CONFIG_CPU_FREQ_GOV_USERSPACE=y
# CONFIG_CPU_FREQ_GOV_ONDEMAND is not set CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
#
# CPU frequency scaling drivers
#CONFIG_CPUFREQ_DT=y
# CONFIG_X86_INTEL_PSTATE is not setCONFIG_X86_PCC_CPUFREQ=yCONFIG_X86_ACPI_CPUFREQ=y
# CONFIG_X86_ACPI_CPUFREQ_CPB is not set
# CONFIG_X86_POWERNOW_K8 is not setCONFIG_X86_SPEEDSTEP_CENTRINO=yCONFIG_X86_P4_CLOCKMOD=y
#
# shared options # CONFIG_X86_SPEEDSTEP_LIB=y
#
# CPU Idle
#CONFIG_CPU_IDLE=yCONFIG_CPU_IDLE_GOV_LADDER=yCONFIG_CPU_IDLE_GOV_MENU=y
# CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not setCONFIG_INTEL_IDLE=y
#
# Memory power savings
#CONFIG_I7300_IDLE_IOAT_CHANNEL=yCONFIG_I7300_IDLE=y
#
# Bus options (PCI etc.)
#CONFIG_PCI=yCONFIG_PCI_DIRECT=y
# CONFIG_PCI_MMCONFIG is not setCONFIG_PCI_DOMAINS=yCONFIG_PCI_CNB20LE_QUIRK=y
# CONFIG_PCIEPORTBUS is not setCONFIG_PCI_BUS_ADDR_T_64BIT=y
# CONFIG_PCI_MSI is not setCONFIG_PCI_DEBUG=y
# CONFIG_PCI_REALLOC_ENABLE_AUTO is not set
# CONFIG_PCI_STUB is not set
# CONFIG_HT_IRQ is not setCONFIG_PCI_ATS=yCONFIG_PCI_IOV=yCONFIG_PCI_PRI=yCONFIG_PCI_PASID=yCONFIG_PCI_LABEL=y
#
# PCI host controller drivers
#
# CONFIG_ISA_DMA_API is not setCONFIG_AMD_NB=yCONFIG_PCCARD=yCONFIG_PCMCIA=y
# CONFIG_PCMCIA_LOAD_CIS is not set
# CONFIG_CARDBUS is not set
#
# PC-card bridges
#CONFIG_YENTA=y
# CONFIG_YENTA_O2 is not set
# CONFIG_YENTA_RICOH is not setCONFIG_YENTA_TI=yCONFIG_YENTA_TOSHIBA=yCONFIG_PD6729=yCONFIG_I82092=yCONFIG_PCCARD_NONSTATIC=y
# CONFIG_HOTPLUG_PCI is not setCONFIG_RAPIDIO=yCONFIG_RAPIDIO_DISC_TIMEOUT=30CONFIG_RAPIDIO_ENABLE_RX_TX_PORTS=yCONFIG_RAPIDIO_DMA_ENGINE=yCONFIG_RAPIDIO_DEBUG=yCONFIG_RAPIDIO_ENUM_BASIC=y
#
# RapidIO Switch drivers
#
# CONFIG_RAPIDIO_TSI57X is not setCONFIG_RAPIDIO_CPS_XX=y
# CONFIG_RAPIDIO_TSI568 is not setCONFIG_RAPIDIO_CPS_GEN2=y
# CONFIG_X86_SYSFB is not set
#
# Executable file formats / Emulations
#CONFIG_BINFMT_ELF=yCONFIG_COMPAT_BINFMT_ELF=yCONFIG_BINFMT_SCRIPT=y
# CONFIG_HAVE_AOUT is not set
# CONFIG_BINFMT_MISC is not set
# CONFIG_COREDUMP is not setCONFIG_IA32_EMULATION=yCONFIG_IA32_AOUT=y
# CONFIG_X86_X32 is not setCONFIG_COMPAT=yCONFIG_COMPAT_FOR_U64_ALIGNMENT=yCONFIG_KEYS_COMPAT=yCONFIG_X86_DEV_DMA_OPS=yCONFIG_PMC_ATOM=yCONFIG_NET=yCONFIG_COMPAT_NETLINK_MESSAGES=y
#
# Networking options
#CONFIG_PACKET=y
# CONFIG_PACKET_DIAG is not setCONFIG_UNIX=y
# CONFIG_UNIX_DIAG is not setCONFIG_XFRM=yCONFIG_XFRM_ALGO=yCONFIG_XFRM_USER=yCONFIG_XFRM_SUB_POLICY=y
# CONFIG_XFRM_MIGRATE is not set
# CONFIG_XFRM_STATISTICS is not setCONFIG_XFRM_IPCOMP=y
# CONFIG_NET_KEY is not setCONFIG_INET=yCONFIG_IP_MULTICAST=yCONFIG_IP_ADVANCED_ROUTER=y
# CONFIG_IP_FIB_TRIE_STATS is not setCONFIG_IP_MULTIPLE_TABLES=y
# CONFIG_IP_ROUTE_MULTIPATH is not set
# CONFIG_IP_ROUTE_VERBOSE is not setCONFIG_IP_PNP=y
# CONFIG_IP_PNP_DHCP is not setCONFIG_IP_PNP_BOOTP=y
# CONFIG_IP_PNP_RARP is not setCONFIG_NET_IPIP=y
# CONFIG_NET_IPGRE_DEMUX is not setCONFIG_NET_IP_TUNNEL=yCONFIG_IP_MROUTE=yCONFIG_IP_MROUTE_MULTIPLE_TABLES=y
# CONFIG_IP_PIMSM_V1 is not set
# CONFIG_IP_PIMSM_V2 is not set
# CONFIG_SYN_COOKIES is not setCONFIG_NET_IPVTI=yCONFIG_NET_UDP_TUNNEL=yCONFIG_NET_FOU=yCONFIG_NET_FOU_IP_TUNNELS=yCONFIG_INET_AH=y
# CONFIG_INET_ESP is not set
# CONFIG_INET_IPCOMP is not set
# CONFIG_INET_XFRM_TUNNEL is not setCONFIG_INET_TUNNEL=yCONFIG_INET_XFRM_MODE_TRANSPORT=yCONFIG_INET_XFRM_MODE_TUNNEL=yCONFIG_INET_XFRM_MODE_BEET=yCONFIG_INET_LRO=yCONFIG_INET_DIAG=yCONFIG_INET_TCP_DIAG=y
# CONFIG_INET_UDP_DIAG is not set
# CONFIG_INET_DIAG_DESTROY is not setCONFIG_TCP_CONG_ADVANCED=y
# CONFIG_TCP_CONG_BIC is not setCONFIG_TCP_CONG_CUBIC=yCONFIG_TCP_CONG_WESTWOOD=yCONFIG_TCP_CONG_HTCP=yCONFIG_TCP_CONG_HSTCP=yCONFIG_TCP_CONG_HYBLA=yCONFIG_TCP_CONG_VEGAS=yCONFIG_TCP_CONG_SCALABLE=y
# CONFIG_TCP_CONG_LP is not setCONFIG_TCP_CONG_VENO=yCONFIG_TCP_CONG_YEAH=y
# CONFIG_TCP_CONG_ILLINOIS is not setCONFIG_TCP_CONG_DCTCP=yCONFIG_TCP_CONG_CDG=y
# CONFIG_DEFAULT_CUBIC is not set
# CONFIG_DEFAULT_HTCP is not setCONFIG_DEFAULT_HYBLA=y
# CONFIG_DEFAULT_VEGAS is not set
# CONFIG_DEFAULT_VENO is not set
# CONFIG_DEFAULT_WESTWOOD is not set
# CONFIG_DEFAULT_DCTCP is not set
# CONFIG_DEFAULT_CDG is not set
# CONFIG_DEFAULT_RENO is not setCONFIG_DEFAULT_TCP_CONG="hybla"
# CONFIG_TCP_MD5SIG is not setCONFIG_IPV6=y
# CONFIG_IPV6_ROUTER_PREF is not set
# CONFIG_IPV6_OPTIMISTIC_DAD is not setCONFIG_INET6_AH=yCONFIG_INET6_ESP=yCONFIG_INET6_IPCOMP=yCONFIG_IPV6_MIP6=yCONFIG_INET6_XFRM_TUNNEL=yCONFIG_INET6_TUNNEL=yCONFIG_INET6_XFRM_MODE_TRANSPORT=y
# CONFIG_INET6_XFRM_MODE_TUNNEL is not setCONFIG_INET6_XFRM_MODE_BEET=yCONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=yCONFIG_IPV6_SIT=y
# CONFIG_IPV6_SIT_6RD is not setCONFIG_IPV6_NDISC_NODETYPE=yCONFIG_IPV6_TUNNEL=y
# CONFIG_IPV6_GRE is not setCONFIG_IPV6_MULTIPLE_TABLES=y
# CONFIG_IPV6_SUBTREES is not setCONFIG_IPV6_MROUTE=yCONFIG_IPV6_MROUTE_MULTIPLE_TABLES=yCONFIG_IPV6_PIMSM_V2=yCONFIG_NETLABEL=yCONFIG_NETWORK_SECMARK=yCONFIG_NET_PTP_CLASSIFY=y
# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
# CONFIG_NETFILTER is not set
# CONFIG_IP_DCCP is not setCONFIG_IP_SCTP=yCONFIG_SCTP_DBG_OBJCNT=y
# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_MD5 is not set
# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_SHA1 is not setCONFIG_SCTP_DEFAULT_COOKIE_HMAC_NONE=yCONFIG_SCTP_COOKIE_HMAC_MD5=y
# CONFIG_SCTP_COOKIE_HMAC_SHA1 is not setCONFIG_RDS=yCONFIG_RDS_RDMA=y
# CONFIG_RDS_TCP is not setCONFIG_RDS_DEBUG=yCONFIG_TIPC=y
# CONFIG_TIPC_MEDIA_UDP is not setCONFIG_ATM=y
# CONFIG_ATM_CLIP is not setCONFIG_ATM_LANE=yCONFIG_ATM_MPOA=yCONFIG_ATM_BR2684=yCONFIG_ATM_BR2684_IPFILTER=yCONFIG_L2TP=yCONFIG_L2TP_DEBUGFS=yCONFIG_L2TP_V3=y
# CONFIG_L2TP_IP is not setCONFIG_L2TP_ETH=yCONFIG_STP=yCONFIG_GARP=yCONFIG_MRP=yCONFIG_BRIDGE=y
# CONFIG_BRIDGE_IGMP_SNOOPING is not setCONFIG_BRIDGE_VLAN_FILTERING=yCONFIG_HAVE_NET_DSA=yCONFIG_VLAN_8021Q=yCONFIG_VLAN_8021Q_GVRP=yCONFIG_VLAN_8021Q_MVRP=y
# CONFIG_DECNET is not setCONFIG_LLC=y
# CONFIG_LLC2 is not setCONFIG_IPX=yCONFIG_IPX_INTERN=y
# CONFIG_ATALK is not setCONFIG_X25=y
# CONFIG_LAPB is not setCONFIG_PHONET=yCONFIG_6LOWPAN=y
# CONFIG_6LOWPAN_DEBUGFS is not set
# CONFIG_6LOWPAN_NHC is not setCONFIG_IEEE802154=yCONFIG_IEEE802154_NL802154_EXPERIMENTAL=yCONFIG_IEEE802154_SOCKET=yCONFIG_IEEE802154_6LOWPAN=y
# CONFIG_MAC802154 is not set
# CONFIG_NET_SCHED is not setCONFIG_DCB=yCONFIG_DNS_RESOLVER=yCONFIG_BATMAN_ADV=y
# CONFIG_BATMAN_ADV_BLA is not set
# CONFIG_BATMAN_ADV_DAT is not set
# CONFIG_BATMAN_ADV_NC is not setCONFIG_BATMAN_ADV_MCAST=yCONFIG_BATMAN_ADV_DEBUG=yCONFIG_OPENVSWITCH=yCONFIG_OPENVSWITCH_VXLAN=yCONFIG_OPENVSWITCH_GENEVE=y
# CONFIG_VSOCKETS is not setCONFIG_NETLINK_MMAP=yCONFIG_NETLINK_DIAG=yCONFIG_MPLS=yCONFIG_NET_MPLS_GSO=yCONFIG_MPLS_ROUTING=yCONFIG_MPLS_IPTUNNEL=y
# CONFIG_HSR is not set
# CONFIG_NET_SWITCHDEV is not set
# CONFIG_NET_L3_MASTER_DEV is not setCONFIG_RPS=yCONFIG_RFS_ACCEL=yCONFIG_XPS=yCONFIG_SOCK_CGROUP_DATA=yCONFIG_CGROUP_NET_PRIO=y
# CONFIG_CGROUP_NET_CLASSID is not setCONFIG_NET_RX_BUSY_POLL=yCONFIG_BQL=yCONFIG_NET_FLOW_LIMIT=y
#
# Network testing
#CONFIG_NET_PKTGEN=y
# CONFIG_NET_DROP_MONITOR is not setCONFIG_HAMRADIO=y
#
# Packet Radio protocols
#CONFIG_AX25=yCONFIG_AX25_DAMA_SLAVE=y
# CONFIG_NETROM is not set
# CONFIG_ROSE is not set
#
# AX.25 network device drivers
#CONFIG_MKISS=y
# CONFIG_6PACK is not set
# CONFIG_BPQETHER is not setCONFIG_BAYCOM_SER_FDX=y
# CONFIG_BAYCOM_SER_HDX is not setCONFIG_YAM=yCONFIG_CAN=y
# CONFIG_CAN_RAW is not setCONFIG_CAN_BCM=yCONFIG_CAN_GW=y
#
# CAN Device Drivers
#
# CONFIG_CAN_VCAN is not setCONFIG_CAN_SLCAN=yCONFIG_CAN_DEV=y
# CONFIG_CAN_CALC_BITTIMING is not setCONFIG_CAN_LEDS=y
# CONFIG_CAN_JANZ_ICAN3 is not setCONFIG_CAN_GRCAN=yCONFIG_CAN_SJA1000=y
# CONFIG_CAN_SJA1000_ISA is not setCONFIG_CAN_SJA1000_PLATFORM=yCONFIG_CAN_EMS_PCMCIA=yCONFIG_CAN_EMS_PCI=y
# CONFIG_CAN_PEAK_PCMCIA is not setCONFIG_CAN_PEAK_PCI=yCONFIG_CAN_PEAK_PCIEC=yCONFIG_CAN_KVASER_PCI=yCONFIG_CAN_PLX_PCI=yCONFIG_CAN_C_CAN=yCONFIG_CAN_C_CAN_PLATFORM=yCONFIG_CAN_C_CAN_PCI=yCONFIG_CAN_M_CAN=y
# CONFIG_CAN_CC770 is not set
#
# CAN SPI interfaces
#
# CONFIG_CAN_MCP251X is not set
#
# CAN USB interfaces
#CONFIG_CAN_EMS_USB=yCONFIG_CAN_ESD_USB2=yCONFIG_CAN_GS_USB=y
# CONFIG_CAN_KVASER_USB is not setCONFIG_CAN_PEAK_USB=y
# CONFIG_CAN_8DEV_USB is not setCONFIG_CAN_SOFTING=yCONFIG_CAN_SOFTING_CS=yCONFIG_CAN_DEBUG_DEVICES=y
# CONFIG_IRDA is not setCONFIG_BT=y
# CONFIG_BT_BREDR is not setCONFIG_BT_LE=yCONFIG_BT_6LOWPAN=yCONFIG_BT_SELFTEST=yCONFIG_BT_SELFTEST_ECDH=yCONFIG_BT_SELFTEST_SMP=y
# CONFIG_BT_DEBUGFS is not set
#
# Bluetooth device drivers
#CONFIG_BT_INTEL=yCONFIG_BT_BCM=yCONFIG_BT_RTL=yCONFIG_BT_QCA=yCONFIG_BT_HCIBTUSB=yCONFIG_BT_HCIBTUSB_BCM=yCONFIG_BT_HCIBTUSB_RTL=yCONFIG_BT_HCIBTSDIO=yCONFIG_BT_HCIUART=yCONFIG_BT_HCIUART_H4=y
# CONFIG_BT_HCIUART_BCSP is not setCONFIG_BT_HCIUART_ATH3K=yCONFIG_BT_HCIUART_LL=y
# CONFIG_BT_HCIUART_3WIRE is not setCONFIG_BT_HCIUART_INTEL=y
# CONFIG_BT_HCIUART_BCM is not setCONFIG_BT_HCIUART_QCA=yCONFIG_BT_HCIBCM203X=yCONFIG_BT_HCIBPA10X=yCONFIG_BT_HCIBFUSB=yCONFIG_BT_HCIDTL1=yCONFIG_BT_HCIBT3C=yCONFIG_BT_HCIBLUECARD=y
# CONFIG_BT_HCIBTUART is not setCONFIG_BT_HCIVHCI=yCONFIG_BT_MRVL=yCONFIG_BT_MRVL_SDIO=yCONFIG_BT_ATH3K=yCONFIG_BT_WILINK=yCONFIG_AF_RXRPC=yCONFIG_AF_RXRPC_DEBUG=yCONFIG_RXKAD=yCONFIG_FIB_RULES=yCONFIG_WIRELESS=yCONFIG_WEXT_CORE=yCONFIG_WEXT_PROC=yCONFIG_CFG80211=yCONFIG_NL80211_TESTMODE=y
# CONFIG_CFG80211_DEVELOPER_WARNINGS is not setCONFIG_CFG80211_REG_DEBUG=yCONFIG_CFG80211_CERTIFICATION_ONUS=yCONFIG_CFG80211_REG_CELLULAR_HINTS=yCONFIG_CFG80211_REG_RELAX_NO_IR=yCONFIG_CFG80211_DEFAULT_PS=y
# CONFIG_CFG80211_DEBUGFS is not setCONFIG_CFG80211_INTERNAL_REGDB=yCONFIG_CFG80211_CRDA_SUPPORT=yCONFIG_CFG80211_WEXT=y
# CONFIG_LIB80211 is not set
# CONFIG_MAC80211 is not setCONFIG_MAC80211_STA_HASH_MAX_SIZE=0
# CONFIG_WIMAX is not setCONFIG_RFKILL=yCONFIG_RFKILL_LEDS=y
# CONFIG_RFKILL_INPUT is not setCONFIG_RFKILL_REGULATOR=yCONFIG_RFKILL_GPIO=yCONFIG_NET_9P=yCONFIG_NET_9P_VIRTIO=yCONFIG_NET_9P_RDMA=yCONFIG_NET_9P_DEBUG=y
# CONFIG_CAIF is not setCONFIG_CEPH_LIB=y
# CONFIG_CEPH_LIB_PRETTYDEBUG is not set
# CONFIG_CEPH_LIB_USE_DNS_RESOLVER is not set
# CONFIG_NFC is not setCONFIG_LWTUNNEL=yCONFIG_HAVE_BPF_JIT=y
#
# Device Drivers
#
#
# Generic Driver Options
#
# CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=yCONFIG_DEVTMPFS_MOUNT=y CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_FW_LOADER=y
# CONFIG_FIRMWARE_IN_KERNEL is not set CONFIG_EXTRA_FIRMWARE="" CONFIG_FW_LOADER_USER_HELPER=y
# CONFIG_FW_LOADER_USER_HELPER_FALLBACK is not set CONFIG_WANT_DEV_COREDUMP=y
# CONFIG_ALLOW_DEV_COREDUMP is not set CONFIG_DEBUG_DRIVER=y CONFIG_DEBUG_DEVRES=y
# CONFIG_SYS_HYPERVISOR is not set
# CONFIG_GENERIC_CPU_DEVICES is not set CONFIG_GENERIC_CPU_AUTOPROBE=y CONFIG_REGMAP=yCONFIG_REGMAP_I2C=yCONFIG_REGMAP_SPI=yCONFIG_REGMAP_MMIO=yCONFIG_REGMAP_IRQ=y CONFIG_DMA_SHARED_BUFFER=y CONFIG_FENCE_TRACE=y
# CONFIG_DMA_CMA is not set
#
# Bus devices
#
# CONFIG_CONNECTOR is not set
# CONFIG_MTD is not setCONFIG_DTC=yCONFIG_OF=yCONFIG_OF_UNITTEST=yCONFIG_OF_FLATTREE=yCONFIG_OF_EARLY_FLATTREE=yCONFIG_OF_DYNAMIC=yCONFIG_OF_ADDRESS=yCONFIG_OF_ADDRESS_PCI=yCONFIG_OF_IRQ=yCONFIG_OF_NET=yCONFIG_OF_MDIO=yCONFIG_OF_PCI=yCONFIG_OF_PCI_IRQ=yCONFIG_OF_RESOLVE=yCONFIG_OF_OVERLAY=yCONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
# CONFIG_PARPORT is not setCONFIG_PNP=y
# CONFIG_PNP_DEBUG_MESSAGES is not set
#
# Protocols
#CONFIG_PNPACPI=yCONFIG_BLK_DEV=yCONFIG_BLK_DEV_NULL_BLK=y
# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not setCONFIG_ZRAM=y
# CONFIG_ZRAM_LZ4_COMPRESS is not setCONFIG_BLK_CPQ_CISS_DA=yCONFIG_CISS_SCSI_TAPE=yCONFIG_BLK_DEV_DAC960=y
# CONFIG_BLK_DEV_UMEM is not set
# CONFIG_BLK_DEV_COW_COMMON is not set
# CONFIG_BLK_DEV_LOOP is not set
# CONFIG_BLK_DEV_DRBD is not setCONFIG_BLK_DEV_NBD=yCONFIG_BLK_DEV_SKD=yCONFIG_BLK_DEV_OSD=y
# CONFIG_BLK_DEV_SX8 is not setCONFIG_BLK_DEV_RAM=yCONFIG_BLK_DEV_RAM_COUNT=16CONFIG_BLK_DEV_RAM_SIZE=4096CONFIG_BLK_DEV_RAM_DAX=yCONFIG_CDROM_PKTCDVD=yCONFIG_CDROM_PKTCDVD_BUFFERS=8
# CONFIG_CDROM_PKTCDVD_WCACHE is not set
# CONFIG_ATA_OVER_ETH is not setCONFIG_VIRTIO_BLK=y
# CONFIG_BLK_DEV_HD is not set
# CONFIG_BLK_DEV_RBD is not setCONFIG_BLK_DEV_RSXX=y
# CONFIG_BLK_DEV_NVME is not set
#
# Misc devices
#CONFIG_SENSORS_LIS3LV02D=yCONFIG_AD525X_DPOT=yCONFIG_AD525X_DPOT_I2C=yCONFIG_AD525X_DPOT_SPI=yCONFIG_DUMMY_IRQ=yCONFIG_IBM_ASM=yCONFIG_PHANTOM=yCONFIG_SGI_IOC4=yCONFIG_TIFM_CORE=y
# CONFIG_TIFM_7XX1 is not setCONFIG_ICS932S401=yCONFIG_ENCLOSURE_SERVICES=yCONFIG_HP_ILO=yCONFIG_APDS9802ALS=yCONFIG_ISL29003=yCONFIG_ISL29020=y
# CONFIG_SENSORS_TSL2550 is not setCONFIG_SENSORS_BH1780=yCONFIG_SENSORS_BH1770=yCONFIG_SENSORS_APDS990X=y
# CONFIG_HMC6352 is not set
# CONFIG_DS1682 is not setCONFIG_TI_DAC7512=yCONFIG_VMWARE_BALLOON=y
# CONFIG_BMP085_I2C is not set
# CONFIG_BMP085_SPI is not setCONFIG_USB_SWITCH_FSA9480=yCONFIG_LATTICE_ECP3_CONFIG=y
# CONFIG_SRAM is not setCONFIG_C2PORT=yCONFIG_C2PORT_DURAMAR_2150=y
#
# EEPROM support
#CONFIG_EEPROM_AT24=y
# CONFIG_EEPROM_AT25 is not setCONFIG_EEPROM_LEGACY=yCONFIG_EEPROM_MAX6875=yCONFIG_EEPROM_93CX6=yCONFIG_EEPROM_93XX46=yCONFIG_CB710_CORE=yCONFIG_CB710_DEBUG=yCONFIG_CB710_DEBUG_ASSUMPTIONS=y
#
# Texas Instruments shared transport line discipline #CONFIG_TI_ST=yCONFIG_SENSORS_LIS3_I2C=y
#
# Altera FPGA firmware download module
#CONFIG_ALTERA_STAPL=yCONFIG_VMWARE_VMCI=y
#
# Intel MIC Bus Driver
#
# CONFIG_INTEL_MIC_BUS is not set
#
# SCIF Bus Driver
#
# CONFIG_SCIF_BUS is not set
#
# Intel MIC Host Driver
#
#
# Intel MIC Card Driver
#
#
# SCIF Driver
#
#
# Intel MIC Coprocessor State Management (COSM) Drivers #
# CONFIG_GENWQE is not setCONFIG_ECHO=y
# CONFIG_CXL_BASE is not set
# CONFIG_CXL_KERNEL_API is not set
# CONFIG_CXL_EEH is not setCONFIG_HAVE_IDE=y
# CONFIG_IDE is not set
#
# SCSI device support
#CONFIG_SCSI_MOD=yCONFIG_RAID_ATTRS=yCONFIG_SCSI=yCONFIG_SCSI_DMA=yCONFIG_SCSI_NETLINK=yCONFIG_SCSI_MQ_DEFAULT=y
# CONFIG_SCSI_PROC_FS is not set
#
# SCSI support type (disk, tape, CD-ROM)
#CONFIG_BLK_DEV_SD=y
# CONFIG_CHR_DEV_ST is not setCONFIG_CHR_DEV_OSST=yCONFIG_BLK_DEV_SR=y
# CONFIG_BLK_DEV_SR_VENDOR is not setCONFIG_CHR_DEV_SG=yCONFIG_CHR_DEV_SCH=yCONFIG_SCSI_ENCLOSURE=y
# CONFIG_SCSI_CONSTANTS is not set
# CONFIG_SCSI_LOGGING is not set
# CONFIG_SCSI_SCAN_ASYNC is not set
#
# SCSI Transports
#CONFIG_SCSI_SPI_ATTRS=yCONFIG_SCSI_FC_ATTRS=yCONFIG_SCSI_ISCSI_ATTRS=yCONFIG_SCSI_SAS_ATTRS=yCONFIG_SCSI_SAS_LIBSAS=yCONFIG_SCSI_SAS_ATA=y
# CONFIG_SCSI_SAS_HOST_SMP is not set
# CONFIG_SCSI_SRP_ATTRS is not setCONFIG_SCSI_LOWLEVEL=yCONFIG_ISCSI_TCP=yCONFIG_ISCSI_BOOT_SYSFS=yCONFIG_SCSI_CXGB3_ISCSI=yCONFIG_SCSI_CXGB4_ISCSI=yCONFIG_SCSI_BNX2_ISCSI=yCONFIG_SCSI_BNX2X_FCOE=y
# CONFIG_BE2ISCSI is not setCONFIG_BLK_DEV_3W_XXXX_RAID=y
# CONFIG_SCSI_HPSA is not setCONFIG_SCSI_3W_9XXX=yCONFIG_SCSI_3W_SAS=y
# CONFIG_SCSI_ACARD is not set
# CONFIG_SCSI_AACRAID is not setCONFIG_SCSI_AIC7XXX=yCONFIG_AIC7XXX_CMDS_PER_DEVICE=32CONFIG_AIC7XXX_RESET_DELAY_MS=5000CONFIG_AIC7XXX_DEBUG_ENABLE=yCONFIG_AIC7XXX_DEBUG_MASK=0
# CONFIG_AIC7XXX_REG_PRETTY_PRINT is not setCONFIG_SCSI_AIC79XX=yCONFIG_AIC79XX_CMDS_PER_DEVICE=32CONFIG_AIC79XX_RESET_DELAY_MS=5000CONFIG_AIC79XX_DEBUG_ENABLE=yCONFIG_AIC79XX_DEBUG_MASK=0CONFIG_AIC79XX_REG_PRETTY_PRINT=y
# CONFIG_SCSI_AIC94XX is not set
# CONFIG_SCSI_MVSAS is not set
# CONFIG_SCSI_MVUMI is not setCONFIG_SCSI_DPT_I2O=yCONFIG_SCSI_ADVANSYS=yCONFIG_SCSI_ARCMSR=yCONFIG_SCSI_ESAS2R=y
# CONFIG_MEGARAID_NEWGEN is not setCONFIG_MEGARAID_LEGACY=y
# CONFIG_MEGARAID_SAS is not setCONFIG_SCSI_MPT3SAS=yCONFIG_SCSI_MPT2SAS_MAX_SGE=128CONFIG_SCSI_MPT3SAS_MAX_SGE=128CONFIG_SCSI_MPT2SAS=yCONFIG_SCSI_UFSHCD=yCONFIG_SCSI_UFSHCD_PCI=yCONFIG_SCSI_UFSHCD_PLATFORM=y
# CONFIG_SCSI_HPTIOP is not setCONFIG_VMWARE_PVSCSI=y
# CONFIG_HYPERV_STORAGE is not setCONFIG_LIBFC=yCONFIG_LIBFCOE=y
# CONFIG_FCOE is not setCONFIG_FCOE_FNIC=y
# CONFIG_SCSI_SNIC is not set
# CONFIG_SCSI_DMX3191D is not setCONFIG_SCSI_FUTURE_DOMAIN=yCONFIG_SCSI_ISCI=yCONFIG_SCSI_IPS=y
# CONFIG_SCSI_INITIO is not setCONFIG_SCSI_INIA100=yCONFIG_SCSI_STEX=yCONFIG_SCSI_SYM53C8XX_2=yCONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
# CONFIG_SCSI_SYM53C8XX_MMIO is not set
# CONFIG_SCSI_IPR is not set
# CONFIG_SCSI_QLOGIC_1280 is not setCONFIG_SCSI_QLA_FC=yCONFIG_TCM_QLA2XXX=y
# CONFIG_SCSI_QLA_ISCSI is not setCONFIG_SCSI_LPFC=yCONFIG_SCSI_LPFC_DEBUG_FS=y
CONFIG_SCSI_DC395x=yCONFIG_SCSI_AM53C974=y
# CONFIG_SCSI_WD719X is not setCONFIG_SCSI_DEBUG=yCONFIG_SCSI_PMCRAID=yCONFIG_SCSI_PM8001=yCONFIG_SCSI_BFA_FC=y
# CONFIG_SCSI_VIRTIO is not setCONFIG_SCSI_CHELSIO_FCOE=yCONFIG_SCSI_LOWLEVEL_PCMCIA=y
# CONFIG_SCSI_DH is not setCONFIG_SCSI_OSD_INITIATOR=yCONFIG_SCSI_OSD_ULD=yCONFIG_SCSI_OSD_DPRINT_SENSE=1CONFIG_SCSI_OSD_DEBUG=yCONFIG_ATA=y
# CONFIG_ATA_NONSTANDARD is not setCONFIG_ATA_VERBOSE_ERROR=yCONFIG_ATA_ACPI=yCONFIG_SATA_ZPODD=y
# CONFIG_SATA_PMP is not set
#
# Controllers with non-SFF native interface
#CONFIG_SATA_AHCI=y
# CONFIG_SATA_AHCI_PLATFORM is not setCONFIG_AHCI_CEVA=yCONFIG_AHCI_QORIQ=yCONFIG_SATA_INIC162X=y
# CONFIG_SATA_ACARD_AHCI is not set
# CONFIG_SATA_SIL24 is not setCONFIG_ATA_SFF=y
#
# SFF controllers with custom DMA interface
#CONFIG_PDC_ADMA=yCONFIG_SATA_QSTOR=y
# CONFIG_SATA_SX4 is not setCONFIG_ATA_BMDMA=y
#
# SATA SFF controllers with BMDMA
#CONFIG_ATA_PIIX=y
# CONFIG_SATA_MV is not setCONFIG_SATA_NV=yCONFIG_SATA_PROMISE=yCONFIG_SATA_SIL=yCONFIG_SATA_SIS=yCONFIG_SATA_SVW=yCONFIG_SATA_ULI=y
# CONFIG_SATA_VIA is not set
# CONFIG_SATA_VITESSE is not set
#
# PATA SFF controllers with BMDMA
#
# CONFIG_PATA_ALI is not setCONFIG_PATA_AMD=yCONFIG_PATA_ARTOP=y
# CONFIG_PATA_ATIIXP is not setCONFIG_PATA_ATP867X=yCONFIG_PATA_CMD64X=yCONFIG_PATA_CYPRESS=yCONFIG_PATA_EFAR=y
# CONFIG_PATA_HPT366 is not setCONFIG_PATA_HPT37X=y
# CONFIG_PATA_HPT3X2N is not setCONFIG_PATA_HPT3X3=yCONFIG_PATA_HPT3X3_DMA=y
# CONFIG_PATA_IT8213 is not set
# CONFIG_PATA_IT821X is not setCONFIG_PATA_JMICRON=yCONFIG_PATA_MARVELL=y
# CONFIG_PATA_NETCELL is not setCONFIG_PATA_NINJA32=yCONFIG_PATA_NS87415=yCONFIG_PATA_OLDPIIX=yCONFIG_PATA_OPTIDMA=yCONFIG_PATA_PDC2027X=yCONFIG_PATA_PDC_OLD=yCONFIG_PATA_RADISYS=yCONFIG_PATA_RDC=yCONFIG_PATA_SCH=yCONFIG_PATA_SERVERWORKS=yCONFIG_PATA_SIL680=yCONFIG_PATA_SIS=y
# CONFIG_PATA_TOSHIBA is not set
# CONFIG_PATA_TRIFLEX is not set
# CONFIG_PATA_VIA is not set
# CONFIG_PATA_WINBOND is not set
#
# PIO-only SFF controllers
#CONFIG_PATA_CMD640_PCI=yCONFIG_PATA_MPIIX=y
# CONFIG_PATA_NS87410 is not setCONFIG_PATA_OPTI=yCONFIG_PATA_PCMCIA=yCONFIG_PATA_PLATFORM=y
# CONFIG_PATA_OF_PLATFORM is not setCONFIG_PATA_RZ1000=y
#
# Generic fallback / legacy drivers
#CONFIG_PATA_ACPI=yCONFIG_ATA_GENERIC=yCONFIG_PATA_LEGACY=y
# CONFIG_MD is not setCONFIG_TARGET_CORE=y
# CONFIG_TCM_IBLOCK is not setCONFIG_TCM_FILEIO=y
# CONFIG_TCM_PSCSI is not set
# CONFIG_TCM_USER2 is not setCONFIG_LOOPBACK_TARGET=yCONFIG_TCM_FC=y
# CONFIG_ISCSI_TARGET is not setCONFIG_FUSION=yCONFIG_FUSION_SPI=yCONFIG_FUSION_FC=yCONFIG_FUSION_SAS=yCONFIG_FUSION_MAX_SGE=128CONFIG_FUSION_CTL=yCONFIG_FUSION_LOGGING=y
#
# IEEE 1394 (FireWire) support
#
# CONFIG_FIREWIRE is not set
# CONFIG_FIREWIRE_NOSY is not setCONFIG_MACINTOSH_DRIVERS=yCONFIG_MAC_EMUMOUSEBTN=yCONFIG_NETDEVICES=yCONFIG_MII=yCONFIG_NET_CORE=yCONFIG_BONDING=y
# CONFIG_DUMMY is not setCONFIG_EQUALIZER=y
# CONFIG_NET_FC is not set
# CONFIG_NET_TEAM is not set
# CONFIG_MACVLAN is not setCONFIG_IPVLAN=yCONFIG_VXLAN=yCONFIG_GENEVE=yCONFIG_NETCONSOLE=yCONFIG_NETCONSOLE_DYNAMIC=yCONFIG_NETPOLL=yCONFIG_NET_POLL_CONTROLLER=yCONFIG_RIONET=yCONFIG_RIONET_TX_SIZE=128CONFIG_RIONET_RX_SIZE=128CONFIG_TUN=y
# CONFIG_TUN_VNET_CROSS_LE is not setCONFIG_VETH=yCONFIG_VIRTIO_NET=y
# CONFIG_NLMON is not setCONFIG_ARCNET=yCONFIG_ARCNET_1201=y
# CONFIG_ARCNET_1051 is not setCONFIG_ARCNET_RAW=yCONFIG_ARCNET_CAP=y
CONFIG_ARCNET_COM90xx=y
CONFIG_ARCNET_COM90xxIO=y
# CONFIG_ARCNET_RIM_I is not set
# CONFIG_ARCNET_COM20020 is not setCONFIG_ATM_DRIVERS=yCONFIG_ATM_DUMMY=yCONFIG_ATM_TCP=yCONFIG_ATM_LANAI=yCONFIG_ATM_ENI=yCONFIG_ATM_ENI_DEBUG=yCONFIG_ATM_ENI_TUNE_BURST=yCONFIG_ATM_ENI_BURST_TX_16W=yCONFIG_ATM_ENI_BURST_TX_8W=y
# CONFIG_ATM_ENI_BURST_TX_4W is not set
# CONFIG_ATM_ENI_BURST_TX_2W is not setCONFIG_ATM_ENI_BURST_RX_16W=yCONFIG_ATM_ENI_BURST_RX_8W=y
# CONFIG_ATM_ENI_BURST_RX_4W is not setCONFIG_ATM_ENI_BURST_RX_2W=yCONFIG_ATM_FIRESTREAM=yCONFIG_ATM_ZATM=yCONFIG_ATM_ZATM_DEBUG=yCONFIG_ATM_NICSTAR=yCONFIG_ATM_NICSTAR_USE_SUNI=y
# CONFIG_ATM_NICSTAR_USE_IDT77105 is not set
# CONFIG_ATM_IDT77252 is not setCONFIG_ATM_AMBASSADOR=y
# CONFIG_ATM_AMBASSADOR_DEBUG is not setCONFIG_ATM_HORIZON=y
# CONFIG_ATM_HORIZON_DEBUG is not setCONFIG_ATM_IA=yCONFIG_ATM_IA_DEBUG=yCONFIG_ATM_FORE200E=yCONFIG_ATM_FORE200E_USE_TASKLET=yCONFIG_ATM_FORE200E_TX_RETRY=16CONFIG_ATM_FORE200E_DEBUG=0
# CONFIG_ATM_HE is not set
# CONFIG_ATM_SOLOS is not set
#
# CAIF transport drivers
#CONFIG_VHOST_NET=yCONFIG_VHOST_RING=yCONFIG_VHOST=yCONFIG_VHOST_CROSS_ENDIAN_LEGACY=y
#
# Distributed Switch Architecture drivers
#
# CONFIG_NET_DSA_MV88E6XXX is not set
# CONFIG_NET_DSA_MV88E6XXX_NEED_PPU is not setCONFIG_ETHERNET=yCONFIG_MDIO=y
# CONFIG_NET_VENDOR_3COM is not setCONFIG_NET_VENDOR_ADAPTEC=yCONFIG_ADAPTEC_STARFIRE=y
# CONFIG_NET_VENDOR_AGERE is not setCONFIG_NET_VENDOR_ALTEON=yCONFIG_ACENIC=y
# CONFIG_ACENIC_OMIT_TIGON_I is not set
# CONFIG_ALTERA_TSE is not setCONFIG_NET_VENDOR_AMD=y
# CONFIG_AMD8111_ETH is not set
# CONFIG_PCNET32 is not set
# CONFIG_PCMCIA_NMCLAN is not setCONFIG_NET_VENDOR_ARC=yCONFIG_ARC_EMAC_CORE=yCONFIG_ARC_EMAC=yCONFIG_EMAC_ROCKCHIP=y
# CONFIG_NET_VENDOR_ATHEROS is not set
# CONFIG_NET_VENDOR_AURORA is not setCONFIG_NET_CADENCE=yCONFIG_MACB=yCONFIG_NET_VENDOR_BROADCOM=yCONFIG_B44=yCONFIG_B44_PCI_AUTOSELECT=yCONFIG_B44_PCICORE_AUTOSELECT=yCONFIG_B44_PCI=yCONFIG_BCMGENET=yCONFIG_BNX2=yCONFIG_CNIC=yCONFIG_TIGON3=y
# CONFIG_BNX2X is not set
# CONFIG_SYSTEMPORT is not set
# CONFIG_BNXT is not setCONFIG_NET_VENDOR_BROCADE=y
# CONFIG_BNA is not setCONFIG_NET_VENDOR_CAVIUM=yCONFIG_THUNDER_NIC_PF=yCONFIG_THUNDER_NIC_VF=yCONFIG_THUNDER_NIC_BGX=yCONFIG_LIQUIDIO=yCONFIG_NET_VENDOR_CHELSIO=y
# CONFIG_CHELSIO_T1 is not setCONFIG_CHELSIO_T3=yCONFIG_CHELSIO_T4=yCONFIG_CHELSIO_T4_DCB=yCONFIG_CHELSIO_T4VF=yCONFIG_NET_VENDOR_CISCO=y
# CONFIG_ENIC is not set
# CONFIG_CX_ECAT is not set
# CONFIG_DNET is not setCONFIG_NET_VENDOR_DEC=y
# CONFIG_NET_TULIP is not setCONFIG_NET_VENDOR_DLINK=yCONFIG_DL2K=yCONFIG_SUNDANCE=yCONFIG_SUNDANCE_MMIO=yCONFIG_NET_VENDOR_EMULEX=yCONFIG_BE2NET=yCONFIG_BE2NET_HWMON=yCONFIG_BE2NET_VXLAN=y
# CONFIG_NET_VENDOR_EZCHIP is not setCONFIG_NET_VENDOR_EXAR=yCONFIG_S2IO=y
# CONFIG_VXGE is not set
# CONFIG_NET_VENDOR_FUJITSU is not set
# CONFIG_NET_VENDOR_HP is not setCONFIG_NET_VENDOR_INTEL=yCONFIG_E100=yCONFIG_E1000=yCONFIG_E1000E=y
# CONFIG_E1000E_HWTS is not setCONFIG_IGB=yCONFIG_IGB_HWMON=yCONFIG_IGB_DCA=y
# CONFIG_IGBVF is not setCONFIG_IXGB=y
# CONFIG_IXGBE is not setCONFIG_I40E=yCONFIG_I40E_VXLAN=yCONFIG_I40E_GENEVE=y
# CONFIG_I40E_DCB is not setCONFIG_NET_VENDOR_I825XX=yCONFIG_JME=yCONFIG_NET_VENDOR_MARVELL=yCONFIG_MVMDIO=yCONFIG_SKGE=y
# CONFIG_SKGE_DEBUG is not setCONFIG_SKGE_GENESIS=yCONFIG_SKY2=y
# CONFIG_SKY2_DEBUG is not setCONFIG_NET_VENDOR_MELLANOX=y
# CONFIG_MLX4_EN is not setCONFIG_MLX4_CORE=y
# CONFIG_MLX4_DEBUG is not set
# CONFIG_MLX5_CORE is not setCONFIG_MLXSW_CORE=yCONFIG_MLXSW_CORE_HWMON=yCONFIG_MLXSW_PCI=y
# CONFIG_NET_VENDOR_MICREL is not setCONFIG_NET_VENDOR_MICROCHIP=y
# CONFIG_ENC28J60 is not setCONFIG_ENCX24J600=yCONFIG_NET_VENDOR_MYRI=yCONFIG_MYRI10GE=y
# CONFIG_MYRI10GE_DCA is not setCONFIG_FEALNX=y
# CONFIG_NET_VENDOR_NATSEMI is not set
# CONFIG_NET_VENDOR_NETRONOME is not setCONFIG_NET_VENDOR_NVIDIA=yCONFIG_FORCEDETH=y
# CONFIG_NET_VENDOR_OKI is not setCONFIG_ETHOC=y
# CONFIG_NET_PACKET_ENGINE is not setCONFIG_NET_VENDOR_QLOGIC=y
# CONFIG_QLA3XXX is not set
# CONFIG_QLCNIC is not set
# CONFIG_QLGE is not set
# CONFIG_NETXEN_NIC is not setCONFIG_QED=yCONFIG_QEDE=yCONFIG_NET_VENDOR_QUALCOMM=yCONFIG_QCA7000=yCONFIG_NET_VENDOR_REALTEK=yCONFIG_8139CP=yCONFIG_8139TOO=yCONFIG_8139TOO_PIO=y
# CONFIG_8139TOO_TUNE_TWISTER is not set
# CONFIG_8139TOO_8129 is not setCONFIG_8139_OLD_RX_RESET=y
# CONFIG_R8169 is not setCONFIG_NET_VENDOR_RENESAS=y
# CONFIG_NET_VENDOR_RDC is not set
# CONFIG_NET_VENDOR_ROCKER is not set
# CONFIG_NET_VENDOR_SAMSUNG is not set
# CONFIG_NET_VENDOR_SEEQ is not set
# CONFIG_NET_VENDOR_SILAN is not set
# CONFIG_NET_VENDOR_SIS is not setCONFIG_SFC=y
# CONFIG_SFC_MCDI_MON is not set
# CONFIG_SFC_SRIOV is not setCONFIG_SFC_MCDI_LOGGING=yCONFIG_NET_VENDOR_SMSC=yCONFIG_PCMCIA_SMC91C92=yCONFIG_EPIC100=yCONFIG_SMSC911X=y
# CONFIG_SMSC911X_ARCH_HOOKS is not setCONFIG_SMSC9420=yCONFIG_NET_VENDOR_STMICRO=yCONFIG_STMMAC_ETH=y
# CONFIG_STMMAC_PLATFORM is not setCONFIG_STMMAC_PCI=yCONFIG_NET_VENDOR_SUN=yCONFIG_HAPPYMEAL=y
# CONFIG_SUNGEM is not setCONFIG_CASSINI=yCONFIG_NIU=yCONFIG_NET_VENDOR_SYNOPSYS=yCONFIG_SYNOPSYS_DWC_ETH_QOS=y
# CONFIG_NET_VENDOR_TEHUTI is not set
# CONFIG_NET_VENDOR_TI is not set
# CONFIG_NET_VENDOR_VIA is not set
# CONFIG_NET_VENDOR_WIZNET is not setCONFIG_NET_VENDOR_XIRCOM=y
# CONFIG_PCMCIA_XIRC2PS is not setCONFIG_FDDI=yCONFIG_DEFXX=yCONFIG_DEFXX_MMIO=y
# CONFIG_SKFP is not setCONFIG_HIPPI=yCONFIG_ROADRUNNER=yCONFIG_ROADRUNNER_LARGE_RINGS=yCONFIG_NET_SB1000=yCONFIG_PHYLIB=y
#
# MII PHY device drivers
#CONFIG_AQUANTIA_PHY=yCONFIG_AT803X_PHY=yCONFIG_AMD_PHY=yCONFIG_MARVELL_PHY=yCONFIG_DAVICOM_PHY=yCONFIG_QSEMI_PHY=yCONFIG_LXT_PHY=yCONFIG_CICADA_PHY=yCONFIG_VITESSE_PHY=yCONFIG_TERANETICS_PHY=yCONFIG_SMSC_PHY=yCONFIG_BCM_NET_PHYLIB=yCONFIG_BROADCOM_PHY=yCONFIG_BCM7XXX_PHY=yCONFIG_BCM87XX_PHY=yCONFIG_ICPLUS_PHY=y
# CONFIG_REALTEK_PHY is not setCONFIG_NATIONAL_PHY=y
# CONFIG_STE10XP is not setCONFIG_LSI_ET1011C_PHY=yCONFIG_MICREL_PHY=y
# CONFIG_DP83848_PHY is not setCONFIG_DP83867_PHY=y
# CONFIG_MICROCHIP_PHY is not setCONFIG_FIXED_PHY=y
# CONFIG_MDIO_BITBANG is not setCONFIG_MDIO_OCTEON=yCONFIG_MDIO_BUS_MUX=yCONFIG_MDIO_BUS_MUX_GPIO=yCONFIG_MDIO_BUS_MUX_MMIOREG=yCONFIG_MDIO_BCM_UNIMAC=yCONFIG_MICREL_KS8995MA=yCONFIG_PPP=yCONFIG_PPP_BSDCOMP=yCONFIG_PPP_DEFLATE=y
# CONFIG_PPP_FILTER is not set
# CONFIG_PPP_MPPE is not set
# CONFIG_PPP_MULTILINK is not setCONFIG_PPPOATM=yCONFIG_PPPOE=yCONFIG_PPPOL2TP=y
# CONFIG_PPP_ASYNC is not setCONFIG_PPP_SYNC_TTY=y
# CONFIG_SLIP is not setCONFIG_SLHC=y
# CONFIG_USB_NET_DRIVERS is not set
# CONFIG_WLAN is not set
#
# Enable WiMAX (Networking options) to see the WiMAX drivers #
# CONFIG_WAN is not set CONFIG_IEEE802154_DRIVERS=y
# CONFIG_VMXNET3 is not setCONFIG_FUJITSU_ES=yCONFIG_HYPERV_NET=y
# CONFIG_ISDN is not set
# CONFIG_NVM is not set
#
# Input device support
#CONFIG_INPUT=yCONFIG_INPUT_LEDS=yCONFIG_INPUT_FF_MEMLESS=yCONFIG_INPUT_POLLDEV=yCONFIG_INPUT_SPARSEKMAP=yCONFIG_INPUT_MATRIXKMAP=y
#
# Userland interfaces
#CONFIG_INPUT_MOUSEDEV=y
# CONFIG_INPUT_MOUSEDEV_PSAUX is not setCONFIG_INPUT_MOUSEDEV_SCREEN_X=1024CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
# CONFIG_INPUT_JOYDEV is not setCONFIG_INPUT_EVDEV=yCONFIG_INPUT_EVBUG=y
#
# Input Device Drivers
#CONFIG_INPUT_KEYBOARD=y
# CONFIG_KEYBOARD_ADP5520 is not setCONFIG_KEYBOARD_ADP5588=y
# CONFIG_KEYBOARD_ADP5589 is not setCONFIG_KEYBOARD_ATKBD=yCONFIG_KEYBOARD_QT1070=yCONFIG_KEYBOARD_QT2160=yCONFIG_KEYBOARD_LKKBD=yCONFIG_KEYBOARD_GPIO=y
# CONFIG_KEYBOARD_GPIO_POLLED is not setCONFIG_KEYBOARD_TCA6416=yCONFIG_KEYBOARD_TCA8418=yCONFIG_KEYBOARD_MATRIX=y
# CONFIG_KEYBOARD_LM8323 is not setCONFIG_KEYBOARD_LM8333=yCONFIG_KEYBOARD_MAX7359=yCONFIG_KEYBOARD_MCS=yCONFIG_KEYBOARD_MPR121=y
# CONFIG_KEYBOARD_NEWTON is not setCONFIG_KEYBOARD_OPENCORES=y
# CONFIG_KEYBOARD_SAMSUNG is not set
# CONFIG_KEYBOARD_STOWAWAY is not set
# CONFIG_KEYBOARD_SUNKBD is not setCONFIG_KEYBOARD_STMPE=y
# CONFIG_KEYBOARD_OMAP4 is not setCONFIG_KEYBOARD_TC3589X=yCONFIG_KEYBOARD_XTKBD=yCONFIG_KEYBOARD_CAP11XX=yCONFIG_KEYBOARD_BCM=y
# CONFIG_INPUT_MOUSE is not setCONFIG_INPUT_JOYSTICK=yCONFIG_JOYSTICK_ANALOG=yCONFIG_JOYSTICK_A3D=yCONFIG_JOYSTICK_ADI=y
# CONFIG_JOYSTICK_COBRA is not setCONFIG_JOYSTICK_GF2K=yCONFIG_JOYSTICK_GRIP=y
# CONFIG_JOYSTICK_GRIP_MP is not set
# CONFIG_JOYSTICK_GUILLEMOT is not setCONFIG_JOYSTICK_INTERACT=yCONFIG_JOYSTICK_SIDEWINDER=yCONFIG_JOYSTICK_TMDC=yCONFIG_JOYSTICK_IFORCE=yCONFIG_JOYSTICK_IFORCE_USB=yCONFIG_JOYSTICK_IFORCE_232=yCONFIG_JOYSTICK_WARRIOR=yCONFIG_JOYSTICK_MAGELLAN=yCONFIG_JOYSTICK_SPACEORB=yCONFIG_JOYSTICK_SPACEBALL=yCONFIG_JOYSTICK_STINGER=yCONFIG_JOYSTICK_TWIDJOY=yCONFIG_JOYSTICK_ZHENHUA=yCONFIG_JOYSTICK_AS5011=yCONFIG_JOYSTICK_JOYDUMP=y
# CONFIG_JOYSTICK_XPAD is not set
# CONFIG_INPUT_TABLET is not setCONFIG_INPUT_TOUCHSCREEN=yCONFIG_TOUCHSCREEN_PROPERTIES=yCONFIG_TOUCHSCREEN_88PM860X=yCONFIG_TOUCHSCREEN_ADS7846=yCONFIG_TOUCHSCREEN_AD7877=yCONFIG_TOUCHSCREEN_AD7879=yCONFIG_TOUCHSCREEN_AD7879_I2C=y
# CONFIG_TOUCHSCREEN_AD7879_SPI is not set
# CONFIG_TOUCHSCREEN_AR1021_I2C is not setCONFIG_TOUCHSCREEN_ATMEL_MXT=y
# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not setCONFIG_TOUCHSCREEN_BU21013=yCONFIG_TOUCHSCREEN_CHIPONE_ICN8318=y
# CONFIG_TOUCHSCREEN_CY8CTMG110 is not setCONFIG_TOUCHSCREEN_CYTTSP_CORE=yCONFIG_TOUCHSCREEN_CYTTSP_I2C=yCONFIG_TOUCHSCREEN_CYTTSP_SPI=yCONFIG_TOUCHSCREEN_CYTTSP4_CORE=yCONFIG_TOUCHSCREEN_CYTTSP4_I2C=y
# CONFIG_TOUCHSCREEN_CYTTSP4_SPI is not setCONFIG_TOUCHSCREEN_DA9034=yCONFIG_TOUCHSCREEN_DA9052=yCONFIG_TOUCHSCREEN_DYNAPRO=yCONFIG_TOUCHSCREEN_HAMPSHIRE=yCONFIG_TOUCHSCREEN_EETI=yCONFIG_TOUCHSCREEN_EGALAX=yCONFIG_TOUCHSCREEN_EGALAX_SERIAL=yCONFIG_TOUCHSCREEN_FT6236=yCONFIG_TOUCHSCREEN_FUJITSU=yCONFIG_TOUCHSCREEN_GOODIX=yCONFIG_TOUCHSCREEN_ILI210X=yCONFIG_TOUCHSCREEN_GUNZE=yCONFIG_TOUCHSCREEN_ELAN=yCONFIG_TOUCHSCREEN_ELO=yCONFIG_TOUCHSCREEN_WACOM_W8001=y
# CONFIG_TOUCHSCREEN_WACOM_I2C is not set
# CONFIG_TOUCHSCREEN_MAX11801 is not set
# CONFIG_TOUCHSCREEN_MCS5000 is not setCONFIG_TOUCHSCREEN_MMS114=y
# CONFIG_TOUCHSCREEN_MTOUCH is not set
# CONFIG_TOUCHSCREEN_IMX6UL_TSC is not setCONFIG_TOUCHSCREEN_INEXIO=y
# CONFIG_TOUCHSCREEN_MK712 is not setCONFIG_TOUCHSCREEN_PENMOUNT=y
# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not setCONFIG_TOUCHSCREEN_TOUCHRIGHT=yCONFIG_TOUCHSCREEN_TOUCHWIN=y
# CONFIG_TOUCHSCREEN_TI_AM335X_TSC is not set
# CONFIG_TOUCHSCREEN_UCB1400 is not setCONFIG_TOUCHSCREEN_PIXCIR=yCONFIG_TOUCHSCREEN_WDT87XX_I2C=yCONFIG_TOUCHSCREEN_WM831X=yCONFIG_TOUCHSCREEN_WM97XX=yCONFIG_TOUCHSCREEN_WM9705=y
# CONFIG_TOUCHSCREEN_WM9712 is not setCONFIG_TOUCHSCREEN_WM9713=y
# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not setCONFIG_TOUCHSCREEN_MC13783=y
# CONFIG_TOUCHSCREEN_TOUCHIT213 is not setCONFIG_TOUCHSCREEN_TS4800=y
# CONFIG_TOUCHSCREEN_TSC_SERIO is not setCONFIG_TOUCHSCREEN_TSC200X_CORE=yCONFIG_TOUCHSCREEN_TSC2004=yCONFIG_TOUCHSCREEN_TSC2005=y
# CONFIG_TOUCHSCREEN_TSC2007 is not set
# CONFIG_TOUCHSCREEN_PCAP is not setCONFIG_TOUCHSCREEN_ST1232=yCONFIG_TOUCHSCREEN_STMPE=yCONFIG_TOUCHSCREEN_SX8654=yCONFIG_TOUCHSCREEN_TPS6507X=y
# CONFIG_TOUCHSCREEN_ZFORCE is not setCONFIG_TOUCHSCREEN_ROHM_BU21023=y
# CONFIG_INPUT_MISC is not set
#
# Hardware I/O ports
#CONFIG_SERIO=yCONFIG_ARCH_MIGHT_HAVE_PC_SERIO=yCONFIG_SERIO_I8042=yCONFIG_SERIO_SERPORT=y
# CONFIG_SERIO_CT82C710 is not setCONFIG_SERIO_PCIPS2=yCONFIG_SERIO_LIBPS2=yCONFIG_SERIO_RAW=yCONFIG_SERIO_ALTERA_PS2=y
# CONFIG_SERIO_PS2MULT is not setCONFIG_SERIO_ARC_PS2=yCONFIG_SERIO_APBPS2=y
# CONFIG_HYPERV_KEYBOARD is not set
# CONFIG_USERIO is not setCONFIG_GAMEPORT=yCONFIG_GAMEPORT_NS558=yCONFIG_GAMEPORT_L4=y
# CONFIG_GAMEPORT_EMU10K1 is not setCONFIG_GAMEPORT_FM801=y
#
# Character devices
#CONFIG_TTY=yCONFIG_VT=yCONFIG_CONSOLE_TRANSLATIONS=yCONFIG_VT_CONSOLE=yCONFIG_VT_CONSOLE_SLEEP=yCONFIG_HW_CONSOLE=yCONFIG_VT_HW_CONSOLE_BINDING=yCONFIG_UNIX98_PTYS=yCONFIG_DEVPTS_MULTIPLE_INSTANCES=yCONFIG_LEGACY_PTYS=yCONFIG_LEGACY_PTY_COUNT=256CONFIG_SERIAL_NONSTANDARD=y
# CONFIG_ROCKETPORT is not setCONFIG_CYCLADES=yCONFIG_CYZ_INTR=yCONFIG_MOXA_INTELLIO=yCONFIG_MOXA_SMARTIO=yCONFIG_SYNCLINKMP=y
# CONFIG_SYNCLINK_GT is not setCONFIG_NOZOMI=y
# CONFIG_ISI is not set
# CONFIG_N_HDLC is not setCONFIG_N_GSM=y
# CONFIG_TRACE_SINK is not setCONFIG_DEVMEM=y
# CONFIG_DEVKMEM is not set
#
# Serial drivers
#CONFIG_SERIAL_EARLYCON=y CONFIG_SERIAL_8250=y
# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set # CONFIG_SERIAL_8250_PNP is not set CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_DMA=y CONFIG_SERIAL_8250_PCI=y CONFIG_SERIAL_8250_CS=y CONFIG_SERIAL_8250_NR_UARTS=4 CONFIG_SERIAL_8250_RUNTIME_UARTS=4
# CONFIG_SERIAL_8250_EXTENDED is not set
# CONFIG_SERIAL_8250_FSL is not set CONFIG_SERIAL_8250_DW=y
# CONFIG_SERIAL_8250_RT288X is not set CONFIG_SERIAL_8250_FINTEK=y CONFIG_SERIAL_8250_INGENIC=y CONFIG_SERIAL_8250_MID=y CONFIG_SERIAL_OF_PLATFORM=y
#
# Non-8250 serial port support
#CONFIG_SERIAL_MAX3100=y
# CONFIG_SERIAL_MAX310X is not set
# CONFIG_SERIAL_UARTLITE is not setCONFIG_SERIAL_CORE=yCONFIG_SERIAL_CORE_CONSOLE=yCONFIG_SERIAL_JSM=yCONFIG_SERIAL_SCCNXP=yCONFIG_SERIAL_SCCNXP_CONSOLE=yCONFIG_SERIAL_SC16IS7XX_CORE=yCONFIG_SERIAL_SC16IS7XX=yCONFIG_SERIAL_SC16IS7XX_I2C=y
# CONFIG_SERIAL_SC16IS7XX_SPI is not setCONFIG_SERIAL_ALTERA_JTAGUART=yCONFIG_SERIAL_ALTERA_JTAGUART_CONSOLE=yCONFIG_SERIAL_ALTERA_JTAGUART_CONSOLE_BYPASS=yCONFIG_SERIAL_ALTERA_UART=yCONFIG_SERIAL_ALTERA_UART_MAXPORTS=4CONFIG_SERIAL_ALTERA_UART_BAUDRATE=115200CONFIG_SERIAL_ALTERA_UART_CONSOLE=yCONFIG_SERIAL_IFX6X60=yCONFIG_SERIAL_XILINX_PS_UART=yCONFIG_SERIAL_XILINX_PS_UART_CONSOLE=y
# CONFIG_SERIAL_ARC is not setCONFIG_SERIAL_RP2=yCONFIG_SERIAL_RP2_NR_UARTS=32CONFIG_SERIAL_FSL_LPUART=y
# CONFIG_SERIAL_FSL_LPUART_CONSOLE is not setCONFIG_SERIAL_CONEXANT_DIGICOLOR=yCONFIG_SERIAL_CONEXANT_DIGICOLOR_CONSOLE=y
# CONFIG_SERIAL_MEN_Z135 is not setCONFIG_TTY_PRINTK=yCONFIG_HVC_DRIVER=yCONFIG_VIRTIO_CONSOLE=yCONFIG_IPMI_HANDLER=yCONFIG_IPMI_PANIC_EVENT=yCONFIG_IPMI_PANIC_STRING=y
# CONFIG_IPMI_DEVICE_INTERFACE is not setCONFIG_IPMI_SI=yCONFIG_IPMI_SI_PROBE_DEFAULTS=y
# CONFIG_IPMI_SSIF is not set
# CONFIG_IPMI_WATCHDOG is not set
# CONFIG_IPMI_POWEROFF is not setCONFIG_HW_RANDOM=yCONFIG_HW_RANDOM_TIMERIOMEM=yCONFIG_HW_RANDOM_INTEL=yCONFIG_HW_RANDOM_AMD=yCONFIG_HW_RANDOM_VIA=y
# CONFIG_HW_RANDOM_VIRTIO is not setCONFIG_HW_RANDOM_TPM=y
# CONFIG_NVRAM is not set
# CONFIG_R3964 is not set
# CONFIG_APPLICOM is not set
#
# PCMCIA character devices
#
# CONFIG_SYNCLINK_CS is not setCONFIG_CARDMAN_4000=yCONFIG_CARDMAN_4040=y
# CONFIG_IPWIRELESS is not setCONFIG_MWAVE=y
# CONFIG_RAW_DRIVER is not set
# CONFIG_HPET is not set
# CONFIG_HANGCHECK_TIMER is not setCONFIG_TCG_TPM=y
# CONFIG_TCG_TIS is not set
# CONFIG_TCG_TIS_I2C_ATMEL is not setCONFIG_TCG_TIS_I2C_INFINEON=y
# CONFIG_TCG_TIS_I2C_NUVOTON is not set
# CONFIG_TCG_NSC is not setCONFIG_TCG_ATMEL=yCONFIG_TCG_INFINEON=yCONFIG_TCG_CRB=y
# CONFIG_TCG_TIS_ST33ZP24 is not setCONFIG_TELCLOCK=yCONFIG_DEVPORT=yCONFIG_XILLYBUS=yCONFIG_XILLYBUS_OF=y
#
# I2C support
#CONFIG_I2C=y
# CONFIG_ACPI_I2C_OPREGION is not setCONFIG_I2C_BOARDINFO=y
# CONFIG_I2C_COMPAT is not setCONFIG_I2C_CHARDEV=yCONFIG_I2C_MUX=y
#
# Multiplexer I2C Chip support
#CONFIG_I2C_ARB_GPIO_CHALLENGE=y
# CONFIG_I2C_MUX_GPIO is not set
# CONFIG_I2C_MUX_PCA9541 is not set
CONFIG_I2C_MUX_PCA954x=y
# CONFIG_I2C_MUX_PINCTRL is not setCONFIG_I2C_MUX_REG=y
# CONFIG_I2C_HELPER_AUTO is not setCONFIG_I2C_SMBUS=y
#
# I2C Algorithms
#CONFIG_I2C_ALGOBIT=yCONFIG_I2C_ALGOPCF=yCONFIG_I2C_ALGOPCA=y
#
# I2C Hardware Bus support
#
#
# PC SMBus host controller drivers
#
# CONFIG_I2C_ALI1535 is not set
# CONFIG_I2C_ALI1563 is not setCONFIG_I2C_ALI15X3=yCONFIG_I2C_AMD756=yCONFIG_I2C_AMD756_S4882=y
# CONFIG_I2C_AMD8111 is not set
# CONFIG_I2C_I801 is not setCONFIG_I2C_ISCH=yCONFIG_I2C_ISMT=y
# CONFIG_I2C_PIIX4 is not setCONFIG_I2C_NFORCE2=yCONFIG_I2C_NFORCE2_S4985=yCONFIG_I2C_SIS5595=y
# CONFIG_I2C_SIS630 is not setCONFIG_I2C_SIS96X=yCONFIG_I2C_VIA=y
# CONFIG_I2C_VIAPRO is not set
#
# ACPI drivers
#
# CONFIG_I2C_SCMI is not set
#
# I2C system bus drivers (mostly embedded / system-on-chip) #CONFIG_I2C_CBUS_GPIO=y CONFIG_I2C_DESIGNWARE_CORE=y
# CONFIG_I2C_DESIGNWARE_PLATFORM is not set CONFIG_I2C_DESIGNWARE_PCI=yCONFIG_I2C_EMEV2=yCONFIG_I2C_GPIO=y
# CONFIG_I2C_KEMPLD is not setCONFIG_I2C_OCORES=yCONFIG_I2C_PCA_PLATFORM=y
# CONFIG_I2C_PXA_PCI is not set
# CONFIG_I2C_RK3X is not setCONFIG_I2C_SIMTEC=yCONFIG_I2C_XILINX=y
#
# External I2C/SMBus adapter drivers
#
# CONFIG_I2C_DIOLAN_U2C is not set
# CONFIG_I2C_DLN2 is not setCONFIG_I2C_PARPORT_LIGHT=yCONFIG_I2C_ROBOTFUZZ_OSIF=yCONFIG_I2C_TAOS_EVM=y
# CONFIG_I2C_TINY_USB is not set
#
# Other I2C/SMBus bus drivers
#CONFIG_I2C_SLAVE=y
# CONFIG_I2C_SLAVE_EEPROM is not setCONFIG_I2C_DEBUG_CORE=yCONFIG_I2C_DEBUG_ALGO=yCONFIG_I2C_DEBUG_BUS=yCONFIG_SPI=y
# CONFIG_SPI_DEBUG is not setCONFIG_SPI_MASTER=y
#
# SPI Master Controller Drivers
#CONFIG_SPI_ALTERA=yCONFIG_SPI_BITBANG=yCONFIG_SPI_CADENCE=y
# CONFIG_SPI_DLN2 is not setCONFIG_SPI_GPIO=yCONFIG_SPI_FSL_LIB=yCONFIG_SPI_FSL_SPI=yCONFIG_SPI_OC_TINY=yCONFIG_SPI_PXA2XX_DMA=yCONFIG_SPI_PXA2XX=yCONFIG_SPI_PXA2XX_PCI=yCONFIG_SPI_SC18IS602=yCONFIG_SPI_XCOMM=yCONFIG_SPI_XILINX=y
# CONFIG_SPI_ZYNQMP_GQSPI is not setCONFIG_SPI_DESIGNWARE=yCONFIG_SPI_DW_PCI=yCONFIG_SPI_DW_MMIO=y
#
# SPI Protocol Masters
#
# CONFIG_SPI_SPIDEV is not set
# CONFIG_SPI_TLE62X0 is not set
# CONFIG_SPMI is not setCONFIG_HSI=yCONFIG_HSI_BOARDINFO=y
#
# HSI controllers
#
#
# HSI clients
#
# CONFIG_HSI_CHAR is not set
#
# PPS support
#CONFIG_PPS=y
# CONFIG_PPS_DEBUG is not set
#
# PPS clients support
#CONFIG_PPS_CLIENT_KTIMER=yCONFIG_PPS_CLIENT_LDISC=yCONFIG_PPS_CLIENT_GPIO=y
#
# PPS generators support
#
#
# PTP clock support
#CONFIG_PTP_1588_CLOCK=y
#
# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. #CONFIG_PINCTRL=y
#
# Pin controllers
#CONFIG_PINMUX=yCONFIG_PINCONF=yCONFIG_GENERIC_PINCONF=yCONFIG_DEBUG_PINCTRL=y
# CONFIG_PINCTRL_AS3722 is not set
# CONFIG_PINCTRL_AMD is not setCONFIG_PINCTRL_SINGLE=yCONFIG_PINCTRL_BAYTRAIL=yCONFIG_PINCTRL_CHERRYVIEW=y
# CONFIG_PINCTRL_BROXTON is not set
# CONFIG_PINCTRL_SUNRISEPOINT is not setCONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=yCONFIG_GPIOLIB=yCONFIG_GPIO_DEVRES=yCONFIG_OF_GPIO=yCONFIG_GPIO_ACPI=yCONFIG_GPIOLIB_IRQCHIP=yCONFIG_DEBUG_GPIO=y
# CONFIG_GPIO_SYSFS is not setCONFIG_GPIO_GENERIC=yCONFIG_GPIO_MAX730X=y
#
# Memory mapped GPIO drivers
#CONFIG_GPIO_74XX_MMIO=yCONFIG_GPIO_ALTERA=y
# CONFIG_GPIO_AMDPT is not setCONFIG_GPIO_DWAPB=yCONFIG_GPIO_GENERIC_PLATFORM=yCONFIG_GPIO_GRGPIO=yCONFIG_GPIO_ICH=yCONFIG_GPIO_LYNXPOINT=y
# CONFIG_GPIO_SYSCON is not setCONFIG_GPIO_VX855=y
# CONFIG_GPIO_XILINX is not setCONFIG_GPIO_ZX=y
#
# Port-mapped I/O GPIO drivers
#CONFIG_GPIO_104_IDIO_16=yCONFIG_GPIO_104_IDI_48=yCONFIG_GPIO_F7188X=y
# CONFIG_GPIO_IT87 is not set
# CONFIG_GPIO_SCH is not setCONFIG_GPIO_SCH311X=y
#
# I2C GPIO expanders
#CONFIG_GPIO_ADP5588=yCONFIG_GPIO_ADP5588_IRQ=yCONFIG_GPIO_ADNP=yCONFIG_GPIO_MAX7300=yCONFIG_GPIO_MAX732X=y
# CONFIG_GPIO_MAX732X_IRQ is not set
# CONFIG_GPIO_PCA953X is not setCONFIG_GPIO_PCF857X=yCONFIG_GPIO_SX150X=y
#
# MFD GPIO expanders
#
# CONFIG_GPIO_ADP5520 is not set
# CONFIG_GPIO_ARIZONA is not setCONFIG_GPIO_CRYSTAL_COVE=yCONFIG_GPIO_DA9052=yCONFIG_GPIO_DA9055=yCONFIG_GPIO_DLN2=y
# CONFIG_GPIO_JANZ_TTL is not set
# CONFIG_GPIO_KEMPLD is not setCONFIG_GPIO_LP3943=y
# CONFIG_GPIO_STMPE is not setCONFIG_GPIO_TC3589X=y
# CONFIG_GPIO_TPS6586X is not setCONFIG_GPIO_TPS65912=yCONFIG_GPIO_UCB1400=y
# CONFIG_GPIO_WM831X is not set
# CONFIG_GPIO_WM8350 is not set
#
# PCI GPIO expanders
#CONFIG_GPIO_AMD8111=yCONFIG_GPIO_BT8XX=yCONFIG_GPIO_INTEL_MID=yCONFIG_GPIO_ML_IOH=y
# CONFIG_GPIO_RDC321X is not setCONFIG_GPIO_SODAVILLE=y
#
# SPI GPIO expanders
#CONFIG_GPIO_74X164=yCONFIG_GPIO_MAX7301=yCONFIG_GPIO_MC33880=y
#
# SPI or I2C GPIO expanders
#
# CONFIG_GPIO_MCP23S08 is not set
#
# USB GPIO expanders
#CONFIG_W1=y
#
# 1-wire Bus Masters
#CONFIG_W1_MASTER_MATROX=yCONFIG_W1_MASTER_DS2490=yCONFIG_W1_MASTER_DS2482=yCONFIG_W1_MASTER_DS1WM=y
# CONFIG_W1_MASTER_GPIO is not set
#
# 1-wire Slaves
#CONFIG_W1_SLAVE_THERM=yCONFIG_W1_SLAVE_SMEM=y
# CONFIG_W1_SLAVE_DS2408 is not setCONFIG_W1_SLAVE_DS2413=yCONFIG_W1_SLAVE_DS2406=yCONFIG_W1_SLAVE_DS2423=y
# CONFIG_W1_SLAVE_DS2431 is not set
# CONFIG_W1_SLAVE_DS2433 is not set
# CONFIG_W1_SLAVE_DS2760 is not setCONFIG_W1_SLAVE_DS2780=yCONFIG_W1_SLAVE_DS2781=yCONFIG_W1_SLAVE_DS28E04=y
# CONFIG_W1_SLAVE_BQ27000 is not setCONFIG_POWER_SUPPLY=yCONFIG_POWER_SUPPLY_DEBUG=yCONFIG_PDA_POWER=yCONFIG_GENERIC_ADC_BATTERY=yCONFIG_WM831X_BACKUP=yCONFIG_WM831X_POWER=yCONFIG_WM8350_POWER=yCONFIG_TEST_POWER=y
# CONFIG_BATTERY_88PM860X is not set
# CONFIG_BATTERY_DS2780 is not setCONFIG_BATTERY_DS2781=yCONFIG_BATTERY_DS2782=yCONFIG_BATTERY_WM97XX=yCONFIG_BATTERY_SBS=y
# CONFIG_BATTERY_BQ27XXX is not setCONFIG_BATTERY_DA9030=yCONFIG_BATTERY_DA9052=y
# CONFIG_CHARGER_DA9150 is not set
# CONFIG_BATTERY_DA9150 is not set
# CONFIG_BATTERY_MAX17040 is not setCONFIG_BATTERY_MAX17042=y
# CONFIG_CHARGER_ISP1704 is not setCONFIG_CHARGER_MAX8903=y
# CONFIG_CHARGER_LP8727 is not set
# CONFIG_CHARGER_GPIO is not set
# CONFIG_CHARGER_MANAGER is not set
# CONFIG_CHARGER_MAX77693 is not setCONFIG_CHARGER_BQ2415X=y
# CONFIG_CHARGER_BQ24190 is not setCONFIG_CHARGER_BQ24257=y
# CONFIG_CHARGER_BQ24735 is not setCONFIG_CHARGER_BQ25890=yCONFIG_CHARGER_SMB347=yCONFIG_CHARGER_TPS65217=yCONFIG_BATTERY_GAUGE_LTC2941=yCONFIG_BATTERY_RT5033=yCONFIG_CHARGER_RT9455=y
# CONFIG_POWER_RESET is not set
# CONFIG_POWER_AVS is not setCONFIG_HWMON=yCONFIG_HWMON_VID=yCONFIG_HWMON_DEBUG_CHIP=y
#
# Native drivers
#
# CONFIG_SENSORS_ABITUGURU is not setCONFIG_SENSORS_ABITUGURU3=yCONFIG_SENSORS_AD7314=yCONFIG_SENSORS_AD7414=yCONFIG_SENSORS_AD7418=yCONFIG_SENSORS_ADM1021=y
# CONFIG_SENSORS_ADM1025 is not setCONFIG_SENSORS_ADM1026=yCONFIG_SENSORS_ADM1029=yCONFIG_SENSORS_ADM1031=yCONFIG_SENSORS_ADM9240=yCONFIG_SENSORS_ADT7X10=yCONFIG_SENSORS_ADT7310=y
# CONFIG_SENSORS_ADT7410 is not setCONFIG_SENSORS_ADT7411=y
# CONFIG_SENSORS_ADT7462 is not set
# CONFIG_SENSORS_ADT7470 is not setCONFIG_SENSORS_ADT7475=y
# CONFIG_SENSORS_ASC7621 is not setCONFIG_SENSORS_K8TEMP=yCONFIG_SENSORS_K10TEMP=yCONFIG_SENSORS_FAM15H_POWER=y
# CONFIG_SENSORS_APPLESMC is not setCONFIG_SENSORS_ASB100=yCONFIG_SENSORS_ATXP1=yCONFIG_SENSORS_DS620=yCONFIG_SENSORS_DS1621=yCONFIG_SENSORS_DELL_SMM=yCONFIG_SENSORS_DA9052_ADC=yCONFIG_SENSORS_DA9055=y
# CONFIG_SENSORS_I5K_AMB is not setCONFIG_SENSORS_F71805F=yCONFIG_SENSORS_F71882FG=yCONFIG_SENSORS_F75375S=yCONFIG_SENSORS_MC13783_ADC=yCONFIG_SENSORS_FSCHMD=y
# CONFIG_SENSORS_GL518SM is not setCONFIG_SENSORS_GL520SM=y
# CONFIG_SENSORS_G760A is not setCONFIG_SENSORS_G762=yCONFIG_SENSORS_GPIO_FAN=yCONFIG_SENSORS_HIH6130=yCONFIG_SENSORS_IBMAEM=yCONFIG_SENSORS_IBMPEX=yCONFIG_SENSORS_IIO_HWMON=yCONFIG_SENSORS_I5500=y
# CONFIG_SENSORS_CORETEMP is not set
# CONFIG_SENSORS_IT87 is not setCONFIG_SENSORS_JC42=y
# CONFIG_SENSORS_POWR1220 is not set
# CONFIG_SENSORS_LINEAGE is not set
# CONFIG_SENSORS_LTC2945 is not setCONFIG_SENSORS_LTC4151=yCONFIG_SENSORS_LTC4215=yCONFIG_SENSORS_LTC4222=y
# CONFIG_SENSORS_LTC4245 is not setCONFIG_SENSORS_LTC4260=yCONFIG_SENSORS_LTC4261=y
# CONFIG_SENSORS_MAX1111 is not setCONFIG_SENSORS_MAX16065=yCONFIG_SENSORS_MAX1619=yCONFIG_SENSORS_MAX1668=yCONFIG_SENSORS_MAX197=y
# CONFIG_SENSORS_MAX6639 is not setCONFIG_SENSORS_MAX6642=yCONFIG_SENSORS_MAX6650=y
# CONFIG_SENSORS_MAX6697 is not setCONFIG_SENSORS_MAX31790=y
# CONFIG_SENSORS_MCP3021 is not set
# CONFIG_SENSORS_ADCXX is not setCONFIG_SENSORS_LM63=y
# CONFIG_SENSORS_LM70 is not setCONFIG_SENSORS_LM73=yCONFIG_SENSORS_LM75=y
# CONFIG_SENSORS_LM77 is not set
# CONFIG_SENSORS_LM78 is not setCONFIG_SENSORS_LM80=y
# CONFIG_SENSORS_LM83 is not setCONFIG_SENSORS_LM85=yCONFIG_SENSORS_LM87=yCONFIG_SENSORS_LM90=yCONFIG_SENSORS_LM92=y
# CONFIG_SENSORS_LM93 is not setCONFIG_SENSORS_LM95234=yCONFIG_SENSORS_LM95241=yCONFIG_SENSORS_LM95245=yCONFIG_SENSORS_PC87360=y
# CONFIG_SENSORS_PC87427 is not setCONFIG_SENSORS_NTC_THERMISTOR=yCONFIG_SENSORS_NCT6683=y
# CONFIG_SENSORS_NCT6775 is not setCONFIG_SENSORS_NCT7802=y
# CONFIG_SENSORS_NCT7904 is not setCONFIG_SENSORS_PCF8591=y
# CONFIG_PMBUS is not set
# CONFIG_SENSORS_SHT15 is not set
# CONFIG_SENSORS_SHT21 is not set
# CONFIG_SENSORS_SHTC1 is not setCONFIG_SENSORS_SIS5595=y
# CONFIG_SENSORS_DME1737 is not setCONFIG_SENSORS_EMC1403=yCONFIG_SENSORS_EMC2103=yCONFIG_SENSORS_EMC6W201=y
# CONFIG_SENSORS_SMSC47M1 is not set
# CONFIG_SENSORS_SMSC47M192 is not setCONFIG_SENSORS_SMSC47B397=y
# CONFIG_SENSORS_SCH56XX_COMMON is not setCONFIG_SENSORS_SMM665=y
# CONFIG_SENSORS_ADC128D818 is not set
# CONFIG_SENSORS_ADS1015 is not setCONFIG_SENSORS_ADS7828=yCONFIG_SENSORS_ADS7871=y
# CONFIG_SENSORS_AMC6821 is not setCONFIG_SENSORS_INA209=yCONFIG_SENSORS_INA2XX=y
# CONFIG_SENSORS_TC74 is not setCONFIG_SENSORS_THMC50=y
# CONFIG_SENSORS_TMP102 is not setCONFIG_SENSORS_TMP103=y
# CONFIG_SENSORS_TMP401 is not set
# CONFIG_SENSORS_TMP421 is not setCONFIG_SENSORS_VIA_CPUTEMP=yCONFIG_SENSORS_VIA686A=yCONFIG_SENSORS_VT1211=y
# CONFIG_SENSORS_VT8231 is not setCONFIG_SENSORS_W83781D=yCONFIG_SENSORS_W83791D=yCONFIG_SENSORS_W83792D=yCONFIG_SENSORS_W83793=yCONFIG_SENSORS_W83795=yCONFIG_SENSORS_W83795_FANCTRL=y
# CONFIG_SENSORS_W83L785TS is not setCONFIG_SENSORS_W83L786NG=y
# CONFIG_SENSORS_W83627HF is not set
# CONFIG_SENSORS_W83627EHF is not setCONFIG_SENSORS_WM831X=yCONFIG_SENSORS_WM8350=y
#
# ACPI drivers
#
# CONFIG_SENSORS_ACPI_POWER is not set CONFIG_SENSORS_ATK0110=yCONFIG_THERMAL=yCONFIG_THERMAL_HWMON=yCONFIG_THERMAL_OF=y CONFIG_THERMAL_WRITABLE_TRIPS=y
# CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE is not set CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE=y
# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set # CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR is not set CONFIG_THERMAL_GOV_FAIR_SHARE=y CONFIG_THERMAL_GOV_STEP_WISE=y
# CONFIG_THERMAL_GOV_BANG_BANG is not set CONFIG_THERMAL_GOV_USER_SPACE=y
# CONFIG_THERMAL_GOV_POWER_ALLOCATOR is not set # CONFIG_CPU_THERMAL is not set CONFIG_CLOCK_THERMAL=y
# CONFIG_DEVFREQ_THERMAL is not set CONFIG_THERMAL_EMULATION=y CONFIG_INTEL_POWERCLAMP=y CONFIG_X86_PKG_TEMP_THERMAL=y CONFIG_INTEL_SOC_DTS_IOSF_CORE=y CONFIG_INTEL_SOC_DTS_THERMAL=y CONFIG_INT340X_THERMAL=y CONFIG_ACPI_THERMAL_REL=y CONFIG_INTEL_PCH_THERMAL=y
# CONFIG_WATCHDOG is not set CONFIG_SSB_POSSIBLE=y
#
# Sonics Silicon Backplane
#CONFIG_SSB=yCONFIG_SSB_SPROM=yCONFIG_SSB_PCIHOST_POSSIBLE=yCONFIG_SSB_PCIHOST=y
# CONFIG_SSB_B43_PCI_BRIDGE is not setCONFIG_SSB_PCMCIAHOST_POSSIBLE=yCONFIG_SSB_PCMCIAHOST=yCONFIG_SSB_SDIOHOST_POSSIBLE=y
# CONFIG_SSB_SDIOHOST is not setCONFIG_SSB_SILENT=yCONFIG_SSB_DRIVER_PCICORE_POSSIBLE=yCONFIG_SSB_DRIVER_PCICORE=y
# CONFIG_SSB_DRIVER_GPIO is not setCONFIG_BCMA_POSSIBLE=y
#
# Broadcom specific AMBA
#
# CONFIG_BCMA is not set
#
# Multifunction device drivers
#CONFIG_MFD_CORE=yCONFIG_MFD_AS3711=yCONFIG_MFD_AS3722=yCONFIG_PMIC_ADP5520=y
# CONFIG_MFD_AAT2870_CORE is not set
# CONFIG_MFD_ATMEL_FLEXCOM is not setCONFIG_MFD_ATMEL_HLCDC=yCONFIG_MFD_BCM590XX=y
# CONFIG_MFD_AXP20X is not set
# CONFIG_MFD_CROS_EC is not setCONFIG_PMIC_DA903X=yCONFIG_PMIC_DA9052=yCONFIG_MFD_DA9052_SPI=y
# CONFIG_MFD_DA9052_I2C is not setCONFIG_MFD_DA9055=yCONFIG_MFD_DA9062=y
# CONFIG_MFD_DA9063 is not setCONFIG_MFD_DA9150=yCONFIG_MFD_DLN2=yCONFIG_MFD_MC13XXX=y
# CONFIG_MFD_MC13XXX_SPI is not setCONFIG_MFD_MC13XXX_I2C=y
# CONFIG_MFD_HI6421_PMIC is not setCONFIG_HTC_PASIC3=y
# CONFIG_HTC_I2CPLD is not setCONFIG_MFD_INTEL_QUARK_I2C_GPIO=yCONFIG_LPC_ICH=yCONFIG_LPC_SCH=yCONFIG_INTEL_SOC_PMIC=yCONFIG_MFD_INTEL_LPSS=yCONFIG_MFD_INTEL_LPSS_ACPI=yCONFIG_MFD_INTEL_LPSS_PCI=yCONFIG_MFD_JANZ_CMODIO=yCONFIG_MFD_KEMPLD=y
# CONFIG_MFD_88PM800 is not setCONFIG_MFD_88PM805=yCONFIG_MFD_88PM860X=y
# CONFIG_MFD_MAX14577 is not set
# CONFIG_MFD_MAX77686 is not setCONFIG_MFD_MAX77693=y
# CONFIG_MFD_MAX77843 is not setCONFIG_MFD_MAX8907=y
# CONFIG_MFD_MAX8925 is not set
# CONFIG_MFD_MAX8997 is not setCONFIG_MFD_MAX8998=y
# CONFIG_MFD_MT6397 is not set
# CONFIG_MFD_MENF21BMC is not setCONFIG_EZX_PCAP=y
# CONFIG_MFD_VIPERBOARD is not set
# CONFIG_MFD_RETU is not set
# CONFIG_MFD_PCF50633 is not setCONFIG_UCB1400_CORE=yCONFIG_MFD_RDC321X=yCONFIG_MFD_RTSX_PCI=yCONFIG_MFD_RT5033=y
# CONFIG_MFD_RTSX_USB is not set
# CONFIG_MFD_RC5T583 is not setCONFIG_MFD_RK808=y
# CONFIG_MFD_RN5T618 is not setCONFIG_MFD_SEC_CORE=yCONFIG_MFD_SI476X_CORE=yCONFIG_MFD_SM501=y
# CONFIG_MFD_SM501_GPIO is not setCONFIG_MFD_SKY81452=y
# CONFIG_MFD_SMSC is not setCONFIG_ABX500_CORE=y
# CONFIG_AB3100_CORE is not setCONFIG_MFD_STMPE=y
#
# STMicroelectronics STMPE Interface Drivers
#CONFIG_STMPE_I2C=y
# CONFIG_STMPE_SPI is not setCONFIG_MFD_SYSCON=yCONFIG_MFD_TI_AM335X_TSCADC=yCONFIG_MFD_LP3943=y
# CONFIG_MFD_LP8788 is not set
# CONFIG_MFD_PALMAS is not setCONFIG_TPS6105X=yCONFIG_TPS65010=y
# CONFIG_TPS6507X is not set
# CONFIG_MFD_TPS65090 is not setCONFIG_MFD_TPS65217=yCONFIG_MFD_TPS65218=yCONFIG_MFD_TPS6586X=y
# CONFIG_MFD_TPS65910 is not setCONFIG_MFD_TPS65912=yCONFIG_MFD_TPS65912_I2C=y
# CONFIG_MFD_TPS65912_SPI is not set
# CONFIG_MFD_TPS80031 is not set
# CONFIG_TWL4030_CORE is not set
# CONFIG_TWL6040_CORE is not setCONFIG_MFD_WL1273_CORE=yCONFIG_MFD_LM3533=yCONFIG_MFD_TC3589X=y
# CONFIG_MFD_TMIO is not setCONFIG_MFD_VX855=yCONFIG_MFD_ARIZONA=yCONFIG_MFD_ARIZONA_I2C=yCONFIG_MFD_ARIZONA_SPI=yCONFIG_MFD_CS47L24=yCONFIG_MFD_WM5102=y
# CONFIG_MFD_WM5110 is not setCONFIG_MFD_WM8997=yCONFIG_MFD_WM8998=y
# CONFIG_MFD_WM8400 is not setCONFIG_MFD_WM831X=y
# CONFIG_MFD_WM831X_I2C is not setCONFIG_MFD_WM831X_SPI=yCONFIG_MFD_WM8350=yCONFIG_MFD_WM8350_I2C=y
# CONFIG_MFD_WM8994 is not setCONFIG_REGULATOR=y
# CONFIG_REGULATOR_DEBUG is not setCONFIG_REGULATOR_FIXED_VOLTAGE=y
# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not setCONFIG_REGULATOR_USERSPACE_CONSUMER=y
# CONFIG_REGULATOR_88PM8607 is not setCONFIG_REGULATOR_ACT8865=yCONFIG_REGULATOR_AD5398=y
# CONFIG_REGULATOR_ANATOP is not setCONFIG_REGULATOR_ARIZONA=y
# CONFIG_REGULATOR_AS3711 is not setCONFIG_REGULATOR_AS3722=yCONFIG_REGULATOR_BCM590XX=yCONFIG_REGULATOR_DA903X=yCONFIG_REGULATOR_DA9052=yCONFIG_REGULATOR_DA9055=y
# CONFIG_REGULATOR_DA9062 is not set
# CONFIG_REGULATOR_DA9210 is not set
# CONFIG_REGULATOR_DA9211 is not setCONFIG_REGULATOR_FAN53555=y
# CONFIG_REGULATOR_GPIO is not setCONFIG_REGULATOR_ISL9305=yCONFIG_REGULATOR_ISL6271A=yCONFIG_REGULATOR_LP3971=yCONFIG_REGULATOR_LP3972=yCONFIG_REGULATOR_LP872X=y
# CONFIG_REGULATOR_LP8755 is not setCONFIG_REGULATOR_LTC3589=y
# CONFIG_REGULATOR_MAX1586 is not set
# CONFIG_REGULATOR_MAX8649 is not set
# CONFIG_REGULATOR_MAX8660 is not setCONFIG_REGULATOR_MAX8907=y
# CONFIG_REGULATOR_MAX8952 is not setCONFIG_REGULATOR_MAX8973=y
# CONFIG_REGULATOR_MAX8998 is not setCONFIG_REGULATOR_MAX77693=yCONFIG_REGULATOR_MC13XXX_CORE=y
# CONFIG_REGULATOR_MC13783 is not setCONFIG_REGULATOR_MC13892=y
# CONFIG_REGULATOR_MT6311 is not setCONFIG_REGULATOR_PCAP=yCONFIG_REGULATOR_PFUZE100=yCONFIG_REGULATOR_PV88060=yCONFIG_REGULATOR_PV88090=yCONFIG_REGULATOR_RK808=yCONFIG_REGULATOR_RT5033=y
# CONFIG_REGULATOR_S2MPA01 is not set
# CONFIG_REGULATOR_S2MPS11 is not setCONFIG_REGULATOR_S5M8767=yCONFIG_REGULATOR_SKY81452=y
# CONFIG_REGULATOR_TPS51632 is not setCONFIG_REGULATOR_TPS6105X=yCONFIG_REGULATOR_TPS62360=y
# CONFIG_REGULATOR_TPS65023 is not setCONFIG_REGULATOR_TPS6507X=yCONFIG_REGULATOR_TPS65217=yCONFIG_REGULATOR_TPS65218=y
# CONFIG_REGULATOR_TPS6524X is not setCONFIG_REGULATOR_TPS6586X=yCONFIG_REGULATOR_TPS65912=yCONFIG_REGULATOR_WM831X=y
# CONFIG_REGULATOR_WM8350 is not setCONFIG_MEDIA_SUPPORT=y
#
# Multimedia core support
#CONFIG_MEDIA_CAMERA_SUPPORT=yCONFIG_MEDIA_ANALOG_TV_SUPPORT=yCONFIG_MEDIA_DIGITAL_TV_SUPPORT=y
# CONFIG_MEDIA_RADIO_SUPPORT is not setCONFIG_MEDIA_SDR_SUPPORT=yCONFIG_MEDIA_RC_SUPPORT=y
# CONFIG_MEDIA_CONTROLLER is not setCONFIG_VIDEO_DEV=yCONFIG_VIDEO_V4L2=y
# CONFIG_VIDEO_ADV_DEBUG is not set
# CONFIG_VIDEO_FIXED_MINOR_RANGES is not setCONFIG_VIDEO_TUNER=yCONFIG_V4L2_MEM2MEM_DEV=yCONFIG_VIDEOBUF_GEN=yCONFIG_VIDEOBUF_DMA_SG=yCONFIG_VIDEOBUF_VMALLOC=yCONFIG_VIDEOBUF2_CORE=yCONFIG_VIDEOBUF2_MEMOPS=yCONFIG_VIDEOBUF2_DMA_CONTIG=yCONFIG_VIDEOBUF2_VMALLOC=yCONFIG_VIDEOBUF2_DMA_SG=yCONFIG_VIDEOBUF2_DVB=yCONFIG_DVB_CORE=yCONFIG_DVB_NET=yCONFIG_TTPCI_EEPROM=yCONFIG_DVB_MAX_ADAPTERS=8
# CONFIG_DVB_DYNAMIC_MINORS is not set
#
# Media drivers
#CONFIG_RC_CORE=yCONFIG_RC_MAP=y
# CONFIG_RC_DECODERS is not set
# CONFIG_RC_DEVICES is not set
# CONFIG_MEDIA_USB_SUPPORT is not setCONFIG_MEDIA_PCI_SUPPORT=y
#
# Media capture support
#CONFIG_VIDEO_SOLO6X10=y
# CONFIG_VIDEO_TW68 is not set
# CONFIG_VIDEO_ZORAN is not set
#
# Media capture/analog TV support
#CONFIG_VIDEO_IVTV=y
# CONFIG_VIDEO_IVTV_ALSA is not setCONFIG_VIDEO_FB_IVTV=y
# CONFIG_VIDEO_HEXIUM_GEMINI is not set
# CONFIG_VIDEO_HEXIUM_ORION is not set
# CONFIG_VIDEO_MXB is not setCONFIG_VIDEO_DT3155=y
#
# Media capture/analog/hybrid TV support
#CONFIG_VIDEO_CX18=yCONFIG_VIDEO_CX18_ALSA=yCONFIG_VIDEO_CX23885=yCONFIG_MEDIA_ALTERA_CI=y
# CONFIG_VIDEO_CX25821 is not set
# CONFIG_VIDEO_CX88 is not setCONFIG_VIDEO_SAA7134=yCONFIG_VIDEO_SAA7134_ALSA=yCONFIG_VIDEO_SAA7134_RC=yCONFIG_VIDEO_SAA7134_DVB=yCONFIG_VIDEO_SAA7164=y
#
# Media digital TV PCI Adapters
#
# CONFIG_DVB_AV7110 is not setCONFIG_DVB_BUDGET_CORE=y
# CONFIG_DVB_BUDGET is not setCONFIG_DVB_BUDGET_CI=yCONFIG_DVB_BUDGET_AV=yCONFIG_DVB_B2C2_FLEXCOP_PCI=yCONFIG_DVB_B2C2_FLEXCOP_PCI_DEBUG=yCONFIG_DVB_PLUTO2=y
# CONFIG_DVB_DM1105 is not setCONFIG_DVB_PT1=y
# CONFIG_DVB_PT3 is not set
# CONFIG_MANTIS_CORE is not setCONFIG_DVB_NGENE=yCONFIG_DVB_DDBRIDGE=yCONFIG_DVB_SMIPCIE=yCONFIG_DVB_NETUP_UNIDVB=yCONFIG_V4L_PLATFORM_DRIVERS=yCONFIG_VIDEO_CAFE_CCIC=y
# CONFIG_VIDEO_VIA_CAMERA is not setCONFIG_SOC_CAMERA=yCONFIG_SOC_CAMERA_PLATFORM=yCONFIG_V4L_MEM2MEM_DRIVERS=yCONFIG_VIDEO_MEM2MEM_DEINTERLACE=yCONFIG_VIDEO_SH_VEU=y
# CONFIG_V4L_TEST_DRIVERS is not set
# CONFIG_DVB_PLATFORM_DRIVERS is not set
#
# Supported MMC/SDIO adapters
#
# CONFIG_SMS_SDIO_DRV is not setCONFIG_VIDEO_CX2341X=yCONFIG_VIDEO_TVEEPROM=yCONFIG_CYPRESS_FIRMWARE=yCONFIG_DVB_B2C2_FLEXCOP=yCONFIG_DVB_B2C2_FLEXCOP_DEBUG=yCONFIG_VIDEO_SAA7146=yCONFIG_VIDEO_SAA7146_VV=y
#
# Media ancillary drivers (tuners, sensors, i2c, frontends) #CONFIG_MEDIA_SUBDRV_AUTOSELECT=y CONFIG_VIDEO_IR_I2C=y
#
# Audio decoders, processors and mixers
#CONFIG_VIDEO_MSP3400=yCONFIG_VIDEO_CS3308=yCONFIG_VIDEO_CS5345=yCONFIG_VIDEO_CS53L32A=yCONFIG_VIDEO_WM8775=yCONFIG_VIDEO_WM8739=yCONFIG_VIDEO_VP27SMPX=y
#
# RDS decoders
#CONFIG_VIDEO_SAA6588=y
#
# Video decoders
#CONFIG_VIDEO_SAA711X=y
#
# Video and audio decoders
#CONFIG_VIDEO_SAA717X=yCONFIG_VIDEO_CX25840=y
#
# Video encoders
#CONFIG_VIDEO_SAA7127=y
#
# Camera sensor devices
#CONFIG_VIDEO_OV7670=y
#
# Flash devices
#
#
# Video improvement chips
#CONFIG_VIDEO_UPD64031A=yCONFIG_VIDEO_UPD64083=y
#
# Audio/Video compression chips
#CONFIG_VIDEO_SAA6752HS=y
#
# Miscellaneous helper chips
#CONFIG_VIDEO_M52790=y
#
# Sensors used on soc_camera driver
#
#
# soc_camera sensor drivers # CONFIG_SOC_CAMERA_IMX074=y CONFIG_SOC_CAMERA_MT9M001=y # CONFIG_SOC_CAMERA_MT9M111 is not set CONFIG_SOC_CAMERA_MT9T031=y CONFIG_SOC_CAMERA_MT9T112=y CONFIG_SOC_CAMERA_MT9V022=y CONFIG_SOC_CAMERA_OV2640=y # CONFIG_SOC_CAMERA_OV5642 is not set # CONFIG_SOC_CAMERA_OV6650 is not set CONFIG_SOC_CAMERA_OV772X=y CONFIG_SOC_CAMERA_OV9640=y CONFIG_SOC_CAMERA_OV9740=y # CONFIG_SOC_CAMERA_RJ54N1 is not set # CONFIG_SOC_CAMERA_TW9910 is not set CONFIG_MEDIA_TUNER=y CONFIG_MEDIA_TUNER_SIMPLE=y CONFIG_MEDIA_TUNER_TDA8290=y CONFIG_MEDIA_TUNER_TDA827X=y CONFIG_MEDIA_TUNER_TDA18271=y CONFIG_MEDIA_TUNER_TDA9887=y CONFIG_MEDIA_TUNER_MT20XX=y CONFIG_MEDIA_TUNER_MT2063=y CONFIG_MEDIA_TUNER_MT2131=y CONFIG_MEDIA_TUNER_XC2028=y CONFIG_MEDIA_TUNER_XC5000=y CONFIG_MEDIA_TUNER_XC4000=y CONFIG_MEDIA_TUNER_MXL5005S=y CONFIG_MEDIA_TUNER_MC44S803=y CONFIG_MEDIA_TUNER_M88RS6000T=y CONFIG_MEDIA_TUNER_SI2157=y
#
# Multistandard (satellite) frontends
#CONFIG_DVB_STB0899=yCONFIG_DVB_STB6100=y
CONFIG_DVB_STV090x=y
CONFIG_DVB_STV6110x=yCONFIG_DVB_M88DS3103=y
#
# Multistandard (cable + terrestrial) frontends
#CONFIG_DVB_DRXK=yCONFIG_DVB_TDA18271C2DD=yCONFIG_DVB_SI2165=y
#
# DVB-S (satellite) frontends
#CONFIG_DVB_CX24123=yCONFIG_DVB_MT312=yCONFIG_DVB_ZL10036=yCONFIG_DVB_ZL10039=yCONFIG_DVB_S5H1420=yCONFIG_DVB_STV0288=yCONFIG_DVB_STB6000=yCONFIG_DVB_STV0299=yCONFIG_DVB_STV6110=yCONFIG_DVB_STV0900=yCONFIG_DVB_TDA10086=yCONFIG_DVB_TDA8261=yCONFIG_DVB_TUNER_ITD1000=yCONFIG_DVB_TUNER_CX24113=yCONFIG_DVB_TDA826X=yCONFIG_DVB_TUA6100=yCONFIG_DVB_CX24116=yCONFIG_DVB_CX24117=yCONFIG_DVB_CX24120=yCONFIG_DVB_TS2020=yCONFIG_DVB_DS3000=yCONFIG_DVB_TDA10071=y
#
# DVB-T (terrestrial) frontends
#CONFIG_DVB_TDA1004X=yCONFIG_DVB_MT352=yCONFIG_DVB_ZL10353=yCONFIG_DVB_DIB7000P=yCONFIG_DVB_TDA10048=yCONFIG_DVB_STV0367=yCONFIG_DVB_CXD2841ER=yCONFIG_DVB_SI2168=y
# CONFIG_DVB_AS102_FE is not set
#
# DVB-C (cable) frontends
#CONFIG_DVB_TDA10021=yCONFIG_DVB_TDA10023=yCONFIG_DVB_STV0297=y
#
# ATSC (North American/Korean Terrestrial/Cable DTV) frontends #CONFIG_DVB_NXT200X=yCONFIG_DVB_BCM3510=yCONFIG_DVB_LGDT330X=yCONFIG_DVB_LGDT3305=yCONFIG_DVB_S5H1409=yCONFIG_DVB_S5H1411=y
#
# ISDB-T (terrestrial) frontends
#CONFIG_DVB_MB86A20S=y
#
# ISDB-S (satellite) & ISDB-T (terrestrial) frontends #
#
# Digital terrestrial only tuners/PLL
#CONFIG_DVB_PLL=yCONFIG_DVB_TUNER_DIB0070=y
#
# SEC control devices for DVB-S
#CONFIG_DVB_LNBH25=yCONFIG_DVB_LNBP21=yCONFIG_DVB_ISL6405=yCONFIG_DVB_ISL6421=yCONFIG_DVB_A8293=yCONFIG_DVB_HORUS3A=yCONFIG_DVB_ASCOT2E=y
#
# Tools to develop new frontends
#
# CONFIG_DVB_DUMMY_FE is not set
#
# Graphics support
#
# CONFIG_AGP is not set
# CONFIG_VGA_ARB is not set
# CONFIG_VGA_SWITCHEROO is not setCONFIG_DRM=yCONFIG_DRM_KMS_HELPER=yCONFIG_DRM_KMS_FB_HELPER=yCONFIG_DRM_FBDEV_EMULATION=yCONFIG_DRM_LOAD_EDID_FIRMWARE=yCONFIG_DRM_TTM=y
#
# I2C encoder or helper chips
#CONFIG_DRM_I2C_ADV7511=yCONFIG_DRM_I2C_CH7006=y
# CONFIG_DRM_I2C_SIL164 is not set
# CONFIG_DRM_I2C_NXP_TDA998X is not set
# CONFIG_DRM_TDFX is not setCONFIG_DRM_R128=yCONFIG_DRM_RADEON=y
# CONFIG_DRM_RADEON_USERPTR is not setCONFIG_DRM_AMDGPU=y
# CONFIG_DRM_AMDGPU_CIK is not set
# CONFIG_DRM_AMDGPU_USERPTR is not setCONFIG_DRM_AMD_POWERPLAY=y
# CONFIG_DRM_NOUVEAU is not set
# CONFIG_DRM_I915 is not set
# CONFIG_DRM_MGA is not setCONFIG_DRM_VIA=yCONFIG_DRM_SAVAGE=yCONFIG_DRM_VGEM=yCONFIG_DRM_VMWGFX=y
# CONFIG_DRM_VMWGFX_FBCON is not setCONFIG_DRM_GMA500=y
# CONFIG_DRM_GMA600 is not set
# CONFIG_DRM_GMA3600 is not set
# CONFIG_DRM_UDL is not setCONFIG_DRM_AST=yCONFIG_DRM_MGAG200=y
# CONFIG_DRM_CIRRUS_QEMU is not setCONFIG_DRM_QXL=y
# CONFIG_DRM_BOCHS is not setCONFIG_DRM_VIRTIO_GPU=yCONFIG_DRM_PANEL=y
#
# Display Panels
#CONFIG_DRM_PANEL_SIMPLE=yCONFIG_DRM_PANEL_SAMSUNG_LD9040=y
# CONFIG_DRM_PANEL_LG_LG4573 is not set
# CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not setCONFIG_DRM_BRIDGE=y
#
# Display Interface Bridges
#CONFIG_DRM_NXP_PTN3460=yCONFIG_DRM_PARADE_PS8622=y
#
# Frame buffer Devices
#CONFIG_FB=y
# CONFIG_FIRMWARE_EDID is not setCONFIG_FB_CMDLINE=yCONFIG_FB_NOTIFY=yCONFIG_FB_DDC=yCONFIG_FB_BOOT_VESA_SUPPORT=yCONFIG_FB_CFB_FILLRECT=yCONFIG_FB_CFB_COPYAREA=yCONFIG_FB_CFB_IMAGEBLIT=y
# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not setCONFIG_FB_SYS_FILLRECT=yCONFIG_FB_SYS_COPYAREA=yCONFIG_FB_SYS_IMAGEBLIT=y
# CONFIG_FB_FOREIGN_ENDIAN is not setCONFIG_FB_SYS_FOPS=yCONFIG_FB_DEFERRED_IO=yCONFIG_FB_HECUBA=yCONFIG_FB_SVGALIB=y
# CONFIG_FB_MACMODES is not setCONFIG_FB_BACKLIGHT=yCONFIG_FB_MODE_HELPERS=yCONFIG_FB_TILEBLITTING=y
#
# Frame buffer hardware drivers
#
# CONFIG_FB_CIRRUS is not set
# CONFIG_FB_PM2 is not setCONFIG_FB_CYBER2000=yCONFIG_FB_CYBER2000_DDC=y
# CONFIG_FB_ARC is not set
# CONFIG_FB_ASILIANT is not set
# CONFIG_FB_IMSTT is not set
# CONFIG_FB_VGA16 is not set
# CONFIG_FB_VESA is not setCONFIG_FB_N411=yCONFIG_FB_HGA=y
# CONFIG_FB_OPENCORES is not setCONFIG_FB_S1D13XXX=y
# CONFIG_FB_NVIDIA is not setCONFIG_FB_RIVA=yCONFIG_FB_RIVA_I2C=y
# CONFIG_FB_RIVA_DEBUG is not setCONFIG_FB_RIVA_BACKLIGHT=yCONFIG_FB_I740=y
# CONFIG_FB_LE80578 is not setCONFIG_FB_MATROX=yCONFIG_FB_MATROX_MILLENIUM=yCONFIG_FB_MATROX_MYSTIQUE=y
# CONFIG_FB_MATROX_G is not setCONFIG_FB_MATROX_I2C=y
# CONFIG_FB_RADEON is not setCONFIG_FB_ATY128=y
# CONFIG_FB_ATY128_BACKLIGHT is not setCONFIG_FB_ATY=yCONFIG_FB_ATY_CT=y
# CONFIG_FB_ATY_GENERIC_LCD is not setCONFIG_FB_ATY_GX=yCONFIG_FB_ATY_BACKLIGHT=yCONFIG_FB_S3=y
# CONFIG_FB_S3_DDC is not setCONFIG_FB_SAVAGE=y
# CONFIG_FB_SAVAGE_I2C is not setCONFIG_FB_SAVAGE_ACCEL=yCONFIG_FB_SIS=y
# CONFIG_FB_SIS_300 is not setCONFIG_FB_SIS_315=yCONFIG_FB_VIA=y
# CONFIG_FB_VIA_DIRECT_PROCFS is not setCONFIG_FB_VIA_X_COMPATIBILITY=y
# CONFIG_FB_NEOMAGIC is not set
# CONFIG_FB_KYRO is not set
# CONFIG_FB_3DFX is not set
# CONFIG_FB_VOODOO1 is not setCONFIG_FB_VT8623=yCONFIG_FB_TRIDENT=y
# CONFIG_FB_ARK is not set
# CONFIG_FB_PM3 is not setCONFIG_FB_CARMINE=y
# CONFIG_FB_CARMINE_DRAM_EVAL is not setCONFIG_CARMINE_DRAM_CUSTOM=yCONFIG_FB_SM501=yCONFIG_FB_SMSCUFX=y
# CONFIG_FB_UDL is not set
# CONFIG_FB_IBM_GXT4500 is not set
# CONFIG_FB_VIRTUAL is not set
# CONFIG_FB_METRONOME is not set
# CONFIG_FB_MB862XX is not setCONFIG_FB_BROADSHEET=yCONFIG_FB_AUO_K190X=yCONFIG_FB_AUO_K1900=yCONFIG_FB_AUO_K1901=yCONFIG_FB_HYPERV=y
# CONFIG_FB_SIMPLE is not set
# CONFIG_FB_SSD1307 is not setCONFIG_FB_SM712=yCONFIG_BACKLIGHT_LCD_SUPPORT=yCONFIG_LCD_CLASS_DEVICE=y
# CONFIG_LCD_L4F00242T03 is not set
# CONFIG_LCD_LMS283GF05 is not setCONFIG_LCD_LTV350QV=yCONFIG_LCD_ILI922X=yCONFIG_LCD_ILI9320=y
# CONFIG_LCD_TDO24M is not set
# CONFIG_LCD_VGG2432A4 is not set
# CONFIG_LCD_PLATFORM is not set
# CONFIG_LCD_S6E63M0 is not set
# CONFIG_LCD_LD9040 is not setCONFIG_LCD_AMS369FG06=yCONFIG_LCD_LMS501KF03=yCONFIG_LCD_HX8357=yCONFIG_BACKLIGHT_CLASS_DEVICE=y
# CONFIG_BACKLIGHT_GENERIC is not set
# CONFIG_BACKLIGHT_LM3533 is not setCONFIG_BACKLIGHT_DA903X=yCONFIG_BACKLIGHT_DA9052=yCONFIG_BACKLIGHT_APPLE=yCONFIG_BACKLIGHT_PM8941_WLED=y
# CONFIG_BACKLIGHT_SAHARA is not setCONFIG_BACKLIGHT_WM831X=yCONFIG_BACKLIGHT_ADP5520=yCONFIG_BACKLIGHT_ADP8860=y
# CONFIG_BACKLIGHT_ADP8870 is not set
# CONFIG_BACKLIGHT_88PM860X is not setCONFIG_BACKLIGHT_LM3639=yCONFIG_BACKLIGHT_SKY81452=y
# CONFIG_BACKLIGHT_TPS65217 is not set
# CONFIG_BACKLIGHT_AS3711 is not setCONFIG_BACKLIGHT_GPIO=yCONFIG_BACKLIGHT_LV5207LP=y
# CONFIG_BACKLIGHT_BD6107 is not setCONFIG_VGASTATE=yCONFIG_VIDEOMODE_HELPERS=yCONFIG_HDMI=y
#
# Console display driver support
#CONFIG_VGA_CONSOLE=y
# CONFIG_VGACON_SOFT_SCROLLBACK is not setCONFIG_DUMMY_CONSOLE=yCONFIG_DUMMY_CONSOLE_COLUMNS=80CONFIG_DUMMY_CONSOLE_ROWS=25CONFIG_FRAMEBUFFER_CONSOLE=yCONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=yCONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
# CONFIG_LOGO is not setCONFIG_SOUND=yCONFIG_SOUND_OSS_CORE=y
# CONFIG_SOUND_OSS_CORE_PRECLAIM is not setCONFIG_SND=yCONFIG_SND_PCM=yCONFIG_SND_DMAENGINE_PCM=yCONFIG_SND_RAWMIDI=yCONFIG_SND_COMPRESS_OFFLOAD=yCONFIG_SND_JACK=y
# CONFIG_SND_SEQUENCER is not setCONFIG_SND_OSSEMUL=y
# CONFIG_SND_MIXER_OSS is not setCONFIG_SND_PCM_OSS=yCONFIG_SND_PCM_OSS_PLUGINS=y
# CONFIG_SND_PCM_TIMER is not set
# CONFIG_SND_HRTIMER is not setCONFIG_SND_DYNAMIC_MINORS=yCONFIG_SND_MAX_CARDS=32
# CONFIG_SND_SUPPORT_OLD_API is not set
# CONFIG_SND_PROC_FS is not setCONFIG_SND_VERBOSE_PRINTK=yCONFIG_SND_DEBUG=yCONFIG_SND_DEBUG_VERBOSE=yCONFIG_SND_VMASTER=yCONFIG_SND_DMA_SGBUF=y
# CONFIG_SND_RAWMIDI_SEQ is not set
# CONFIG_SND_OPL3_LIB_SEQ is not set
# CONFIG_SND_OPL4_LIB_SEQ is not set
# CONFIG_SND_SBAWE_SEQ is not set
# CONFIG_SND_EMU10K1_SEQ is not setCONFIG_SND_AC97_CODEC=y
# CONFIG_SND_DRIVERS is not set
# CONFIG_SND_PCI is not set
#
# HD-Audio
#CONFIG_SND_HDA_CORE=yCONFIG_SND_HDA_EXT_CORE=yCONFIG_SND_HDA_PREALLOC_SIZE=64
# CONFIG_SND_SPI is not set
# CONFIG_SND_USB is not set
# CONFIG_SND_PCMCIA is not setCONFIG_SND_SOC=yCONFIG_SND_SOC_AC97_BUS=yCONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=yCONFIG_SND_SOC_COMPRESS=yCONFIG_SND_SOC_TOPOLOGY=y
# CONFIG_SND_SOC_AMD_ACP is not setCONFIG_SND_ATMEL_SOC=yCONFIG_SND_DESIGNWARE_I2S=y
#
# SoC Audio for Freescale CPUs
#
#
# Common SoC Audio options for Freescale CPUs:
#CONFIG_SND_SOC_FSL_ASRC=y
# CONFIG_SND_SOC_FSL_SAI is not setCONFIG_SND_SOC_FSL_SSI=y
# CONFIG_SND_SOC_FSL_SPDIF is not set
# CONFIG_SND_SOC_FSL_ESAI is not setCONFIG_SND_SOC_IMX_AUDMUX=y
# CONFIG_SND_SOC_IMG is not setCONFIG_SND_SST_MFLD_PLATFORM=yCONFIG_SND_SST_IPC=yCONFIG_SND_SST_IPC_ACPI=yCONFIG_SND_SOC_INTEL_SST=yCONFIG_SND_SOC_INTEL_SST_ACPI=yCONFIG_SND_SOC_INTEL_SST_MATCH=yCONFIG_SND_SOC_INTEL_BYTCR_RT5640_MACH=yCONFIG_SND_SOC_INTEL_BYTCR_RT5651_MACH=yCONFIG_SND_SOC_INTEL_SKYLAKE=yCONFIG_SND_SOC_INTEL_SKL_RT286_MACH=y
#
# Allwinner SoC Audio support
#
# CONFIG_SND_SUN4I_CODEC is not setCONFIG_SND_SOC_XTFPGA_I2S=yCONFIG_SND_SOC_I2C_AND_SPI=y
#
# CODEC drivers
#CONFIG_SND_SOC_AC97_CODEC=yCONFIG_SND_SOC_ADAU1701=yCONFIG_SND_SOC_AK4104=yCONFIG_SND_SOC_AK4554=yCONFIG_SND_SOC_AK4613=yCONFIG_SND_SOC_AK4642=yCONFIG_SND_SOC_AK5386=yCONFIG_SND_SOC_ALC5623=y
# CONFIG_SND_SOC_CS35L32 is not setCONFIG_SND_SOC_CS42L51=yCONFIG_SND_SOC_CS42L51_I2C=y
# CONFIG_SND_SOC_CS42L52 is not set
# CONFIG_SND_SOC_CS42L56 is not set
# CONFIG_SND_SOC_CS42L73 is not set
# CONFIG_SND_SOC_CS4265 is not setCONFIG_SND_SOC_CS4270=yCONFIG_SND_SOC_CS4271=y
# CONFIG_SND_SOC_CS4271_I2C is not setCONFIG_SND_SOC_CS4271_SPI=y
# CONFIG_SND_SOC_CS42XX8_I2C is not set
# CONFIG_SND_SOC_CS4349 is not setCONFIG_SND_SOC_DMIC=yCONFIG_SND_SOC_ES8328=yCONFIG_SND_SOC_GTM601=y
# CONFIG_SND_SOC_INNO_RK3036 is not setCONFIG_SND_SOC_PCM1681=y
# CONFIG_SND_SOC_PCM179X is not setCONFIG_SND_SOC_PCM3168A=yCONFIG_SND_SOC_PCM3168A_I2C=y
# CONFIG_SND_SOC_PCM3168A_SPI is not set
CONFIG_SND_SOC_PCM512x=y
CONFIG_SND_SOC_PCM512x_I2C=y
# CONFIG_SND_SOC_PCM512x_SPI is not setCONFIG_SND_SOC_RL6231=yCONFIG_SND_SOC_RL6347A=yCONFIG_SND_SOC_RT286=y
# CONFIG_SND_SOC_RT5631 is not setCONFIG_SND_SOC_RT5640=yCONFIG_SND_SOC_RT5651=y
# CONFIG_SND_SOC_RT5677_SPI is not set
# CONFIG_SND_SOC_SGTL5000 is not setCONFIG_SND_SOC_SIGMADSP=yCONFIG_SND_SOC_SIGMADSP_I2C=yCONFIG_SND_SOC_SIRF_AUDIO_CODEC=y
# CONFIG_SND_SOC_SPDIF is not setCONFIG_SND_SOC_SSM2602=y
# CONFIG_SND_SOC_SSM2602_SPI is not setCONFIG_SND_SOC_SSM2602_I2C=yCONFIG_SND_SOC_SSM4567=yCONFIG_SND_SOC_STA32X=y
# CONFIG_SND_SOC_STA350 is not setCONFIG_SND_SOC_STI_SAS=yCONFIG_SND_SOC_TAS2552=yCONFIG_SND_SOC_TAS5086=y
# CONFIG_SND_SOC_TAS571X is not setCONFIG_SND_SOC_TFA9879=yCONFIG_SND_SOC_TLV320AIC23=yCONFIG_SND_SOC_TLV320AIC23_I2C=yCONFIG_SND_SOC_TLV320AIC23_SPI=yCONFIG_SND_SOC_TLV320AIC31XX=y
# CONFIG_SND_SOC_TLV320AIC3X is not setCONFIG_SND_SOC_TS3A227E=yCONFIG_SND_SOC_WM8510=y
# CONFIG_SND_SOC_WM8523 is not setCONFIG_SND_SOC_WM8580=yCONFIG_SND_SOC_WM8711=y
# CONFIG_SND_SOC_WM8728 is not set
# CONFIG_SND_SOC_WM8731 is not setCONFIG_SND_SOC_WM8737=yCONFIG_SND_SOC_WM8741=yCONFIG_SND_SOC_WM8750=y
# CONFIG_SND_SOC_WM8753 is not set
# CONFIG_SND_SOC_WM8770 is not set
# CONFIG_SND_SOC_WM8776 is not setCONFIG_SND_SOC_WM8804=yCONFIG_SND_SOC_WM8804_I2C=yCONFIG_SND_SOC_WM8804_SPI=yCONFIG_SND_SOC_WM8903=yCONFIG_SND_SOC_WM8962=yCONFIG_SND_SOC_WM8974=yCONFIG_SND_SOC_WM8978=y
# CONFIG_SND_SOC_TPA6130A2 is not setCONFIG_SND_SIMPLE_CARD=yCONFIG_SOUND_PRIME=yCONFIG_AC97_BUS=y
#
# HID support
#CONFIG_HID=yCONFIG_HID_BATTERY_STRENGTH=y
# CONFIG_HIDRAW is not setCONFIG_UHID=yCONFIG_HID_GENERIC=y
#
# Special HID drivers
#CONFIG_HID_A4TECH=yCONFIG_HID_ACRUX=yCONFIG_HID_ACRUX_FF=yCONFIG_HID_APPLE=y
# CONFIG_HID_AUREAL is not setCONFIG_HID_BELKIN=y
# CONFIG_HID_CHERRY is not setCONFIG_HID_CHICONY=yCONFIG_HID_CORSAIR=yCONFIG_HID_PRODIKEYS=yCONFIG_HID_CYPRESS=yCONFIG_HID_DRAGONRISE=y
# CONFIG_DRAGONRISE_FF is not setCONFIG_HID_EMS_FF=yCONFIG_HID_ELECOM=yCONFIG_HID_EZKEY=yCONFIG_HID_GEMBIRD=y
# CONFIG_HID_GFRM is not setCONFIG_HID_KEYTOUCH=y
# CONFIG_HID_KYE is not setCONFIG_HID_WALTOP=yCONFIG_HID_GYRATION=yCONFIG_HID_ICADE=yCONFIG_HID_TWINHAN=yCONFIG_HID_KENSINGTON=yCONFIG_HID_LCPOWER=y
# CONFIG_HID_LENOVO is not setCONFIG_HID_LOGITECH=y
# CONFIG_HID_LOGITECH_HIDPP is not setCONFIG_LOGITECH_FF=yCONFIG_LOGIRUMBLEPAD2_FF=y
# CONFIG_LOGIG940_FF is not set
# CONFIG_LOGIWHEELS_FF is not setCONFIG_HID_MAGICMOUSE=yCONFIG_HID_MICROSOFT=y
# CONFIG_HID_MONTEREY is not set
# CONFIG_HID_MULTITOUCH is not setCONFIG_HID_ORTEK=yCONFIG_HID_PANTHERLORD=yCONFIG_PANTHERLORD_FF=yCONFIG_HID_PETALYNX=yCONFIG_HID_PICOLCD=y
# CONFIG_HID_PICOLCD_FB is not setCONFIG_HID_PICOLCD_BACKLIGHT=yCONFIG_HID_PICOLCD_LCD=y
# CONFIG_HID_PICOLCD_LEDS is not setCONFIG_HID_PICOLCD_CIR=yCONFIG_HID_PLANTRONICS=yCONFIG_HID_PRIMAX=yCONFIG_HID_SAITEK=yCONFIG_HID_SAMSUNG=yCONFIG_HID_SPEEDLINK=yCONFIG_HID_STEELSERIES=yCONFIG_HID_SUNPLUS=y
# CONFIG_HID_RMI is not setCONFIG_HID_GREENASIA=yCONFIG_GREENASIA_FF=yCONFIG_HID_HYPERV_MOUSE=yCONFIG_HID_SMARTJOYPLUS=yCONFIG_SMARTJOYPLUS_FF=yCONFIG_HID_TIVO=yCONFIG_HID_TOPSEED=yCONFIG_HID_THINGM=y
# CONFIG_HID_THRUSTMASTER is not setCONFIG_HID_WACOM=yCONFIG_HID_WIIMOTE=y
# CONFIG_HID_XINMO is not setCONFIG_HID_ZEROPLUS=y
# CONFIG_ZEROPLUS_FF is not setCONFIG_HID_ZYDACRON=y
# CONFIG_HID_SENSOR_HUB is not set
#
# USB HID support
#
# CONFIG_USB_HID is not setCONFIG_HID_PID=y
#
# USB HID Boot Protocol drivers
#CONFIG_USB_KBD=yCONFIG_USB_MOUSE=y
#
# I2C HID support
#CONFIG_I2C_HID=yCONFIG_USB_OHCI_LITTLE_ENDIAN=yCONFIG_USB_SUPPORT=yCONFIG_USB_COMMON=yCONFIG_USB_ARCH_HAS_HCD=yCONFIG_USB=y
# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
#
# Miscellaneous USB options
#CONFIG_USB_DEFAULT_PERSIST=y
# CONFIG_USB_DYNAMIC_MINORS is not setCONFIG_USB_OTG=y
# CONFIG_USB_OTG_WHITELIST is not set
# CONFIG_USB_OTG_BLACKLIST_HUB is not setCONFIG_USB_OTG_FSM=y
# CONFIG_USB_ULPI_BUS is not setCONFIG_USB_MON=yCONFIG_USB_WUSB=y
# CONFIG_USB_WUSB_CBAF is not set
#
# USB Host Controller Drivers
#CONFIG_USB_C67X00_HCD=yCONFIG_USB_XHCI_HCD=yCONFIG_USB_XHCI_PCI=yCONFIG_USB_XHCI_PLATFORM=yCONFIG_USB_EHCI_HCD=y
# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
# CONFIG_USB_EHCI_TT_NEWSCHED is not setCONFIG_USB_EHCI_PCI=yCONFIG_USB_EHCI_HCD_PLATFORM=yCONFIG_USB_OXU210HP_HCD=yCONFIG_USB_ISP116X_HCD=yCONFIG_USB_ISP1362_HCD=y
# CONFIG_USB_FOTG210_HCD is not set
# CONFIG_USB_MAX3421_HCD is not setCONFIG_USB_OHCI_HCD=yCONFIG_USB_OHCI_HCD_PCI=yCONFIG_USB_OHCI_HCD_SSB=yCONFIG_USB_OHCI_HCD_PLATFORM=yCONFIG_USB_UHCI_HCD=yCONFIG_USB_U132_HCD=yCONFIG_USB_SL811_HCD=y
# CONFIG_USB_SL811_HCD_ISO is not set
# CONFIG_USB_SL811_CS is not setCONFIG_USB_R8A66597_HCD=yCONFIG_USB_WHCI_HCD=y
# CONFIG_USB_HWA_HCD is not setCONFIG_USB_HCD_SSB=yCONFIG_USB_HCD_TEST_MODE=y
#
# USB Device Class drivers
#
# CONFIG_USB_ACM is not setCONFIG_USB_PRINTER=yCONFIG_USB_WDM=yCONFIG_USB_TMC=y
#
# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may #
#
# also be needed; see USB_STORAGE Help for more info # CONFIG_USB_STORAGE=y # CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_REALTEK is not set CONFIG_USB_STORAGE_DATAFAB=y CONFIG_USB_STORAGE_FREECOM=y CONFIG_USB_STORAGE_ISD200=y # CONFIG_USB_STORAGE_USBAT is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # CONFIG_USB_STORAGE_ALAUDA is not set CONFIG_USB_STORAGE_ONETOUCH=y # CONFIG_USB_STORAGE_KARMA is not set # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set # CONFIG_USB_STORAGE_ENE_UB6250 is not set CONFIG_USB_UAS=y
#
# USB Imaging devices
#CONFIG_USB_MDC800=yCONFIG_USB_MICROTEK=y
# CONFIG_USBIP_CORE is not setCONFIG_USB_MUSB_HDRC=y
# CONFIG_USB_MUSB_HOST is not set
# CONFIG_USB_MUSB_GADGET is not setCONFIG_USB_MUSB_DUAL_ROLE=y
#
# Platform Glue Layer
#
#
# MUSB DMA mode
#
# CONFIG_MUSB_PIO_ONLY is not setCONFIG_USB_DWC3=yCONFIG_USB_DWC3_HOST=y
# CONFIG_USB_DWC3_GADGET is not set
# CONFIG_USB_DWC3_DUAL_ROLE is not set
#
# Platform Glue Driver Support
#
# CONFIG_USB_DWC3_PCI is not setCONFIG_USB_DWC3_OF_SIMPLE=y
# CONFIG_USB_DWC2 is not set
# CONFIG_USB_CHIPIDEA is not setCONFIG_USB_ISP1760=yCONFIG_USB_ISP1761_UDC=y
# CONFIG_USB_ISP1760_HOST_ROLE is not setCONFIG_USB_ISP1760_GADGET_ROLE=y
# CONFIG_USB_ISP1760_DUAL_ROLE is not set
#
# USB port drivers
#
# CONFIG_USB_SERIAL is not set
#
# USB Miscellaneous drivers
#CONFIG_USB_EMI62=y
# CONFIG_USB_EMI26 is not setCONFIG_USB_ADUTUX=yCONFIG_USB_SEVSEG=yCONFIG_USB_RIO500=y
# CONFIG_USB_LEGOTOWER is not setCONFIG_USB_LCD=yCONFIG_USB_LED=y
# CONFIG_USB_CYPRESS_CY7C63 is not setCONFIG_USB_CYTHERM=y
# CONFIG_USB_IDMOUSE is not setCONFIG_USB_FTDI_ELAN=yCONFIG_USB_APPLEDISPLAY=y
# CONFIG_USB_SISUSBVGA is not set
# CONFIG_USB_LD is not set
# CONFIG_USB_TRANCEVIBRATOR is not setCONFIG_USB_IOWARRIOR=y
# CONFIG_USB_TEST is not setCONFIG_USB_EHSET_TEST_FIXTURE=y
# CONFIG_USB_ISIGHTFW is not setCONFIG_USB_YUREX=yCONFIG_USB_EZUSB_FX2=yCONFIG_USB_HSIC_USB3503=y
# CONFIG_USB_LINK_LAYER_TEST is not setCONFIG_USB_CHAOSKEY=yCONFIG_USB_ATM=yCONFIG_USB_SPEEDTOUCH=y
# CONFIG_USB_CXACRU is not set
# CONFIG_USB_UEAGLEATM is not set
# CONFIG_USB_XUSBATM is not set
#
# USB Physical Layer drivers
#CONFIG_USB_PHY=yCONFIG_NOP_USB_XCEIV=yCONFIG_USB_GPIO_VBUS=y
# CONFIG_USB_ISP1301 is not setCONFIG_USB_GADGET=y
# CONFIG_USB_GADGET_DEBUG is not set
# CONFIG_USB_GADGET_DEBUG_FILES is not set
# CONFIG_USB_GADGET_DEBUG_FS is not setCONFIG_USB_GADGET_VBUS_DRAW=2CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2
#
# USB Peripheral Controller
#CONFIG_USB_FOTG210_UDC=yCONFIG_USB_GR_UDC=y
# CONFIG_USB_R8A66597 is not setCONFIG_USB_PXA27X=y
# CONFIG_USB_MV_UDC is not set
# CONFIG_USB_MV_U3D is not set
# CONFIG_USB_M66592 is not setCONFIG_USB_BDC_UDC=y
#
# Platform Support
#
# CONFIG_USB_BDC_PCI is not setCONFIG_USB_AMD5536UDC=yCONFIG_USB_NET2272=yCONFIG_USB_NET2272_DMA=y
# CONFIG_USB_NET2280 is not setCONFIG_USB_GOKU=yCONFIG_USB_EG20T=yCONFIG_USB_GADGET_XILINX=yCONFIG_USB_DUMMY_HCD=yCONFIG_USB_LIBCOMPOSITE=yCONFIG_USB_U_ETHER=yCONFIG_USB_F_ECM=yCONFIG_USB_F_SUBSET=yCONFIG_USB_F_RNDIS=y
# CONFIG_USB_CONFIGFS is not set
# CONFIG_USB_ZERO is not set
# CONFIG_USB_AUDIO is not setCONFIG_USB_ETH=yCONFIG_USB_ETH_RNDIS=y
# CONFIG_USB_ETH_EEM is not set
# CONFIG_USB_G_NCM is not set
# CONFIG_USB_GADGETFS is not set
# CONFIG_USB_FUNCTIONFS is not set
# CONFIG_USB_MASS_STORAGE is not set
# CONFIG_USB_GADGET_TARGET is not set
# CONFIG_USB_G_SERIAL is not set
# CONFIG_USB_MIDI_GADGET is not set
# CONFIG_USB_G_PRINTER is not set
# CONFIG_USB_CDC_COMPOSITE is not set
# CONFIG_USB_G_NOKIA is not set
# CONFIG_USB_G_ACM_MS is not set
# CONFIG_USB_G_MULTI is not set
# CONFIG_USB_G_HID is not set
# CONFIG_USB_G_DBGP is not set
# CONFIG_USB_G_WEBCAM is not set
# CONFIG_USB_LED_TRIG is not setCONFIG_UWB=y
# CONFIG_UWB_HWA is not setCONFIG_UWB_WHCI=yCONFIG_MMC=y
# CONFIG_MMC_DEBUG is not set
#
# MMC/SD/SDIO Card Drivers
#CONFIG_MMC_BLOCK=yCONFIG_MMC_BLOCK_MINORS=8
# CONFIG_MMC_BLOCK_BOUNCE is not setCONFIG_SDIO_UART=yCONFIG_MMC_TEST=y
#
# MMC/SD/SDIO Host Controller Drivers
#CONFIG_MMC_SDHCI=y
# CONFIG_MMC_SDHCI_PCI is not set
# CONFIG_MMC_SDHCI_ACPI is not setCONFIG_MMC_SDHCI_PLTFM=yCONFIG_MMC_SDHCI_OF_ARASAN=y
# CONFIG_MMC_SDHCI_OF_AT91 is not set
# CONFIG_MMC_SDHCI_F_SDH30 is not setCONFIG_MMC_TIFM_SD=y
# CONFIG_MMC_SPI is not setCONFIG_MMC_SDRICOH_CS=yCONFIG_MMC_CB710=yCONFIG_MMC_VIA_SDMMC=yCONFIG_MMC_VUB300=yCONFIG_MMC_USHC=y
# CONFIG_MMC_USDHI6ROL0 is not set
# CONFIG_MMC_REALTEK_PCI is not setCONFIG_MMC_TOSHIBA_PCI=yCONFIG_MMC_MTK=yCONFIG_MEMSTICK=y
# CONFIG_MEMSTICK_DEBUG is not set
#
# MemoryStick drivers
#CONFIG_MEMSTICK_UNSAFE_RESUME=yCONFIG_MSPRO_BLOCK=yCONFIG_MS_BLOCK=y
#
# MemoryStick Host Controller Drivers
#CONFIG_MEMSTICK_TIFM_MS=yCONFIG_MEMSTICK_JMICRON_38X=yCONFIG_MEMSTICK_R592=yCONFIG_MEMSTICK_REALTEK_PCI=yCONFIG_NEW_LEDS=yCONFIG_LEDS_CLASS=yCONFIG_LEDS_CLASS_FLASH=y
#
# LED drivers
#CONFIG_LEDS_88PM860X=yCONFIG_LEDS_AAT1290=yCONFIG_LEDS_BCM6328=yCONFIG_LEDS_BCM6358=yCONFIG_LEDS_LM3530=yCONFIG_LEDS_LM3533=y
# CONFIG_LEDS_LM3642 is not setCONFIG_LEDS_PCA9532=yCONFIG_LEDS_PCA9532_GPIO=yCONFIG_LEDS_GPIO=yCONFIG_LEDS_LP3944=yCONFIG_LEDS_LP55XX_COMMON=y
# CONFIG_LEDS_LP5521 is not set
# CONFIG_LEDS_LP5523 is not setCONFIG_LEDS_LP5562=y
# CONFIG_LEDS_LP8501 is not setCONFIG_LEDS_LP8860=yCONFIG_LEDS_CLEVO_MAIL=y
# CONFIG_LEDS_PCA955X is not set
# CONFIG_LEDS_PCA963X is not setCONFIG_LEDS_WM831X_STATUS=yCONFIG_LEDS_WM8350=yCONFIG_LEDS_DA903X=y
# CONFIG_LEDS_DA9052 is not setCONFIG_LEDS_DAC124S085=yCONFIG_LEDS_REGULATOR=yCONFIG_LEDS_BD2802=y
# CONFIG_LEDS_INTEL_SS4200 is not set
# CONFIG_LEDS_LT3593 is not setCONFIG_LEDS_ADP5520=yCONFIG_LEDS_MC13783=yCONFIG_LEDS_TCA6507=yCONFIG_LEDS_TLC591XX=y
# CONFIG_LEDS_MAX77693 is not set
# CONFIG_LEDS_LM355x is not setCONFIG_LEDS_KTD2692=y
#
# LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) #CONFIG_LEDS_BLINKM=yCONFIG_LEDS_SYSCON=y
#
# LED Triggers
#CONFIG_LEDS_TRIGGERS=yCONFIG_LEDS_TRIGGER_TIMER=y
# CONFIG_LEDS_TRIGGER_ONESHOT is not setCONFIG_LEDS_TRIGGER_HEARTBEAT=yCONFIG_LEDS_TRIGGER_BACKLIGHT=y
# CONFIG_LEDS_TRIGGER_CPU is not set
# CONFIG_LEDS_TRIGGER_GPIO is not set
# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set
#
# iptables trigger is under Netfilter config (LED target) # # CONFIG_LEDS_TRIGGER_TRANSIENT is not set # CONFIG_LEDS_TRIGGER_CAMERA is not set # CONFIG_ACCESSIBILITY is not set CONFIG_INFINIBAND=y CONFIG_INFINIBAND_USER_MAD=y # CONFIG_INFINIBAND_USER_ACCESS is not set CONFIG_INFINIBAND_ADDR_TRANS=y CONFIG_INFINIBAND_ADDR_TRANS_CONFIGFS=y # CONFIG_INFINIBAND_MTHCA is not set # CONFIG_INFINIBAND_QIB is not set CONFIG_INFINIBAND_CXGB3=y # CONFIG_INFINIBAND_CXGB3_DEBUG is not set CONFIG_INFINIBAND_CXGB4=y CONFIG_MLX4_INFINIBAND=y CONFIG_INFINIBAND_NES=y # CONFIG_INFINIBAND_NES_DEBUG is not set CONFIG_INFINIBAND_OCRDMA=y # CONFIG_INFINIBAND_IPOIB is not set # CONFIG_INFINIBAND_SRP is not set CONFIG_INFINIBAND_SRPT=y CONFIG_INFINIBAND_ISER=y CONFIG_EDAC_ATOMIC_SCRUB=y CONFIG_EDAC_SUPPORT=y # CONFIG_EDAC is not set CONFIG_RTC_LIB=y # CONFIG_RTC_CLASS is not set CONFIG_DMADEVICES=y CONFIG_DMADEVICES_DEBUG=y CONFIG_DMADEVICES_VDEBUG=y
#
# DMA Devices
#CONFIG_DMA_ENGINE=yCONFIG_DMA_VIRTUAL_CHANNELS=yCONFIG_DMA_ACPI=yCONFIG_DMA_OF=yCONFIG_FSL_EDMA=y
# CONFIG_INTEL_IDMA64 is not setCONFIG_INTEL_IOATDMA=yCONFIG_DW_DMAC_CORE=yCONFIG_DW_DMAC=y
# CONFIG_DW_DMAC_PCI is not setCONFIG_HSU_DMA=y
#
# DMA Clients
#CONFIG_ASYNC_TX_DMA=y
# CONFIG_DMATEST is not setCONFIG_DMA_ENGINE_RAID=yCONFIG_DCA=yCONFIG_AUXDISPLAY=yCONFIG_UIO=yCONFIG_UIO_CIF=yCONFIG_UIO_PDRV_GENIRQ=yCONFIG_UIO_DMEM_GENIRQ=yCONFIG_UIO_AEC=y
# CONFIG_UIO_SERCOS3 is not setCONFIG_UIO_PCI_GENERIC=yCONFIG_UIO_NETX=yCONFIG_UIO_PRUSS=y
# CONFIG_UIO_MF624 is not setCONFIG_IRQ_BYPASS_MANAGER=yCONFIG_VIRT_DRIVERS=yCONFIG_VIRTIO=y
#
# Virtio drivers
#CONFIG_VIRTIO_PCI=y
# CONFIG_VIRTIO_PCI_LEGACY is not setCONFIG_VIRTIO_BALLOON=y
# CONFIG_VIRTIO_INPUT is not setCONFIG_VIRTIO_MMIO=y
# CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES is not set
#
# Microsoft Hyper-V guest support
#CONFIG_HYPERV=y
# CONFIG_HYPERV_BALLOON is not set
# CONFIG_STAGING is not set
# CONFIG_X86_PLATFORM_DEVICES is not set
# CONFIG_CHROME_PLATFORMS is not setCONFIG_CLKDEV_LOOKUP=yCONFIG_HAVE_CLK_PREPARE=yCONFIG_COMMON_CLK=y
#
# Common Clock Framework
#CONFIG_COMMON_CLK_WM831X=y
# CONFIG_COMMON_CLK_RK808 is not setCONFIG_COMMON_CLK_SI5351=y
# CONFIG_COMMON_CLK_SI514 is not setCONFIG_COMMON_CLK_SI570=yCONFIG_COMMON_CLK_CDCE925=yCONFIG_COMMON_CLK_CS2000_CP=yCONFIG_COMMON_CLK_S2MPS11=y
# CONFIG_COMMON_CLK_NXP is not set
# CONFIG_COMMON_CLK_PXA is not set
# CONFIG_COMMON_CLK_CDCE706 is not set
#
# Hardware Spinlock drivers
#
#
# Clock Source drivers
#CONFIG_CLKEVT_I8253=yCONFIG_CLKBLD_I8253=y
# CONFIG_ATMEL_PIT is not set
# CONFIG_SH_TIMER_CMT is not set
# CONFIG_SH_TIMER_MTU2 is not set
# CONFIG_SH_TIMER_TMU is not set
# CONFIG_EM_TIMER_STI is not set
# CONFIG_MAILBOX is not set
# CONFIG_IOMMU_SUPPORT is not set
#
# Remoteproc drivers
#
# CONFIG_STE_MODEM_RPROC is not set
#
# Rpmsg drivers
#
#
# SOC (System On Chip) specific Drivers
#
# CONFIG_SUNXI_SRAM is not setCONFIG_SOC_TI=yCONFIG_PM_DEVFREQ=y
#
# DEVFREQ Governors
#CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y
# CONFIG_DEVFREQ_GOV_PERFORMANCE is not setCONFIG_DEVFREQ_GOV_POWERSAVE=yCONFIG_DEVFREQ_GOV_USERSPACE=y
#
# DEVFREQ Drivers
#
# CONFIG_PM_DEVFREQ_EVENT is not setCONFIG_EXTCON=y
#
# Extcon Device Drivers
#CONFIG_EXTCON_ADC_JACK=yCONFIG_EXTCON_ARIZONA=y
# CONFIG_EXTCON_GPIO is not setCONFIG_EXTCON_MAX3355=y
# CONFIG_EXTCON_MAX77693 is not setCONFIG_EXTCON_RT8973A=yCONFIG_EXTCON_SM5502=yCONFIG_EXTCON_USB_GPIO=y
# CONFIG_MEMORY is not setCONFIG_IIO=yCONFIG_IIO_BUFFER=y
# CONFIG_IIO_BUFFER_CB is not setCONFIG_IIO_KFIFO_BUF=yCONFIG_IIO_TRIGGERED_BUFFER=yCONFIG_IIO_CONFIGFS=yCONFIG_IIO_TRIGGER=yCONFIG_IIO_CONSUMERS_PER_TRIGGER=2
# CONFIG_IIO_SW_TRIGGER is not set
#
# Accelerometers
#CONFIG_BMA180=yCONFIG_BMC150_ACCEL=yCONFIG_BMC150_ACCEL_I2C=yCONFIG_BMC150_ACCEL_SPI=yCONFIG_IIO_ST_ACCEL_3AXIS=yCONFIG_IIO_ST_ACCEL_I2C_3AXIS=yCONFIG_IIO_ST_ACCEL_SPI_3AXIS=y
# CONFIG_KXSD9 is not setCONFIG_KXCJK1013=yCONFIG_MMA7455=yCONFIG_MMA7455_I2C=yCONFIG_MMA7455_SPI=y
# CONFIG_MMA8452 is not setCONFIG_MMA9551_CORE=y
# CONFIG_MMA9551 is not setCONFIG_MMA9553=y
# CONFIG_MXC4005 is not setCONFIG_MXC6255=yCONFIG_STK8312=y
# CONFIG_STK8BA50 is not set
#
# Analog to digital converters
#CONFIG_AD_SIGMA_DELTA=yCONFIG_AD7266=y
# CONFIG_AD7291 is not setCONFIG_AD7298=yCONFIG_AD7476=yCONFIG_AD7791=yCONFIG_AD7793=y
# CONFIG_AD7887 is not setCONFIG_AD7923=yCONFIG_AD799X=y
# CONFIG_CC10001_ADC is not setCONFIG_DA9150_GPADC=y
# CONFIG_HI8435 is not setCONFIG_MAX1027=y
# CONFIG_MAX1363 is not set
# CONFIG_MCP320X is not setCONFIG_MCP3422=y
# CONFIG_MEN_Z188_ADC is not set
# CONFIG_NAU7802 is not setCONFIG_TI_ADC081C=y
# CONFIG_TI_ADC128S052 is not setCONFIG_TI_ADS8688=yCONFIG_TI_AM335X_ADC=y
# CONFIG_VF610_ADC is not set
#
# Amplifiers
#CONFIG_AD8366=y
#
# Chemical Sensors
#CONFIG_IAQCORE=yCONFIG_VZ89X=y
#
# Hid Sensor IIO Common
#CONFIG_IIO_MS_SENSORS_I2C=y
#
# SSP Sensor Common
#
# CONFIG_IIO_SSP_SENSORHUB is not setCONFIG_IIO_ST_SENSORS_I2C=yCONFIG_IIO_ST_SENSORS_SPI=yCONFIG_IIO_ST_SENSORS_CORE=y
#
# Digital to analog converters
#CONFIG_AD5064=yCONFIG_AD5360=y
# CONFIG_AD5380 is not set
# CONFIG_AD5421 is not setCONFIG_AD5446=yCONFIG_AD5449=yCONFIG_AD5504=yCONFIG_AD5624R_SPI=y
# CONFIG_AD5686 is not setCONFIG_AD5755=yCONFIG_AD5764=yCONFIG_AD5791=yCONFIG_AD7303=yCONFIG_M62332=y
# CONFIG_MAX517 is not set
# CONFIG_MAX5821 is not setCONFIG_MCP4725=yCONFIG_MCP4922=y
#
# IIO dummy driver
#CONFIG_IIO_DUMMY_EVGEN=yCONFIG_IIO_SIMPLE_DUMMY=yCONFIG_IIO_SIMPLE_DUMMY_EVENTS=yCONFIG_IIO_SIMPLE_DUMMY_BUFFER=y
#
# Frequency Synthesizers DDS/PLL
#
#
# Clock Generator/Distribution
#CONFIG_AD9523=y
#
# Phase-Locked Loop (PLL) frequency synthesizers
#
# CONFIG_ADF4350 is not set
#
# Digital gyroscope sensors
#CONFIG_ADIS16080=yCONFIG_ADIS16130=yCONFIG_ADIS16136=yCONFIG_ADIS16260=y
# CONFIG_ADXRS450 is not set
# CONFIG_BMG160 is not setCONFIG_IIO_ST_GYRO_3AXIS=yCONFIG_IIO_ST_GYRO_I2C_3AXIS=yCONFIG_IIO_ST_GYRO_SPI_3AXIS=y
# CONFIG_ITG3200 is not set
#
# Health sensors
#
# CONFIG_MAX30100 is not set
#
# Humidity sensors
#CONFIG_DHT11=y
# CONFIG_HDC100X is not set
# CONFIG_HTU21 is not setCONFIG_SI7005=yCONFIG_SI7020=y
#
# Inertial measurement units
#CONFIG_ADIS16400=y
# CONFIG_ADIS16480 is not setCONFIG_KMX61=yCONFIG_INV_MPU6050_IIO=yCONFIG_IIO_ADIS_LIB=yCONFIG_IIO_ADIS_LIB_BUFFER=y
#
# Light sensors
#
# CONFIG_ACPI_ALS is not set
# CONFIG_ADJD_S311 is not set
# CONFIG_AL3320A is not setCONFIG_APDS9300=yCONFIG_APDS9960=yCONFIG_BH1750=yCONFIG_CM32181=y
# CONFIG_CM3232 is not set
# CONFIG_CM3323 is not set
# CONFIG_CM36651 is not setCONFIG_GP2AP020A00F=y
# CONFIG_ISL29125 is not setCONFIG_JSA1212=yCONFIG_RPR0521=yCONFIG_SENSORS_LM3533=yCONFIG_LTR501=yCONFIG_OPT3001=y
# CONFIG_PA12203001 is not set
# CONFIG_STK3310 is not setCONFIG_TCS3414=y
# CONFIG_TCS3472 is not set
# CONFIG_SENSORS_TSL2563 is not set
# CONFIG_TSL4531 is not setCONFIG_US5182D=yCONFIG_VCNL4000=y
#
# Magnetometer sensors
#CONFIG_AK8975=yCONFIG_AK09911=yCONFIG_BMC150_MAGN=y
# CONFIG_MAG3110 is not set
# CONFIG_MMC35240 is not setCONFIG_IIO_ST_MAGN_3AXIS=yCONFIG_IIO_ST_MAGN_I2C_3AXIS=yCONFIG_IIO_ST_MAGN_SPI_3AXIS=y
#
# Inclinometer sensors
#
#
# Triggers - standalone
#CONFIG_IIO_INTERRUPT_TRIGGER=y
# CONFIG_IIO_SYSFS_TRIGGER is not set
#
# Digital potentiometers
#CONFIG_MCP4531=y
#
# Pressure sensors
#CONFIG_BMP280=yCONFIG_MPL115=y
# CONFIG_MPL3115 is not setCONFIG_MS5611=yCONFIG_MS5611_I2C=yCONFIG_MS5611_SPI=y
# CONFIG_MS5637 is not set
# CONFIG_IIO_ST_PRESS is not setCONFIG_T5403=y
#
# Lightning sensors
#CONFIG_AS3935=y
#
# Proximity sensors
#
# CONFIG_LIDAR_LITE_V2 is not setCONFIG_SX9500=y
#
# Temperature sensors
#CONFIG_MLX90614=yCONFIG_TMP006=yCONFIG_TSYS01=yCONFIG_TSYS02D=y
# CONFIG_NTB is not set
# CONFIG_VME_BUS is not set
# CONFIG_PWM is not setCONFIG_IRQCHIP=yCONFIG_ARM_GIC_MAX_NR=1
# CONFIG_IPACK_BUS is not setCONFIG_RESET_CONTROLLER=y
# CONFIG_FMC is not set
#
# PHY Subsystem
#CONFIG_GENERIC_PHY=yCONFIG_PHY_PXA_28NM_HSIC=yCONFIG_PHY_PXA_28NM_USB2=y
# CONFIG_BCM_KONA_USB2_PHY is not set
# CONFIG_POWERCAP is not setCONFIG_MCB=yCONFIG_MCB_PCI=y
#
# Performance monitor support
#CONFIG_RAS=yCONFIG_THUNDERBOLT=y
#
# Android
#CONFIG_ANDROID=y
# CONFIG_ANDROID_BINDER_IPC is not setCONFIG_LIBNVDIMM=yCONFIG_BLK_DEV_PMEM=yCONFIG_ND_BLK=yCONFIG_ND_CLAIM=yCONFIG_ND_BTT=yCONFIG_BTT=yCONFIG_NVMEM=yCONFIG_STM=y
# CONFIG_STM_DUMMY is not set
# CONFIG_STM_SOURCE_CONSOLE is not setCONFIG_INTEL_TH=yCONFIG_INTEL_TH_PCI=yCONFIG_INTEL_TH_GTH=yCONFIG_INTEL_TH_STH=y
# CONFIG_INTEL_TH_MSU is not set
# CONFIG_INTEL_TH_PTI is not set
# CONFIG_INTEL_TH_DEBUG is not set
#
# FPGA Configuration Support
#CONFIG_FPGA=y
# CONFIG_FPGA_MGR_ZYNQ_FPGA is not set
#
# Firmware Drivers
#
# CONFIG_EDD is not setCONFIG_FIRMWARE_MEMMAP=yCONFIG_DELL_RBU=yCONFIG_DCDBAS=yCONFIG_DMIID=yCONFIG_DMI_SYSFS=yCONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=yCONFIG_ISCSI_IBFT_FIND=yCONFIG_ISCSI_IBFT=y
# CONFIG_GOOGLE_FIRMWARE is not setCONFIG_UEFI_CPER=y
#
# File systems
#CONFIG_DCACHE_WORD_ACCESS=yCONFIG_EXT2_FS=y
# CONFIG_EXT2_FS_XATTR is not setCONFIG_EXT3_FS=yCONFIG_EXT3_FS_POSIX_ACL=yCONFIG_EXT3_FS_SECURITY=yCONFIG_EXT4_FS=yCONFIG_EXT4_FS_POSIX_ACL=yCONFIG_EXT4_FS_SECURITY=y
# CONFIG_EXT4_ENCRYPTION is not setCONFIG_EXT4_DEBUG=yCONFIG_JBD2=y
# CONFIG_JBD2_DEBUG is not setCONFIG_FS_MBCACHE=yCONFIG_REISERFS_FS=yCONFIG_REISERFS_CHECK=y
# CONFIG_REISERFS_PROC_INFO is not set
# CONFIG_REISERFS_FS_XATTR is not setCONFIG_JFS_FS=yCONFIG_JFS_POSIX_ACL=y
# CONFIG_JFS_SECURITY is not set
# CONFIG_JFS_DEBUG is not set
# CONFIG_JFS_STATISTICS is not setCONFIG_XFS_FS=y
# CONFIG_XFS_QUOTA is not setCONFIG_XFS_POSIX_ACL=y
# CONFIG_XFS_RT is not setCONFIG_XFS_DEBUG=y
# CONFIG_GFS2_FS is not setCONFIG_OCFS2_FS=yCONFIG_OCFS2_FS_O2CB=y
# CONFIG_OCFS2_FS_USERSPACE_CLUSTER is not set
# CONFIG_OCFS2_FS_STATS is not set
# CONFIG_OCFS2_DEBUG_MASKLOG is not set
# CONFIG_OCFS2_DEBUG_FS is not setCONFIG_BTRFS_FS=yCONFIG_BTRFS_FS_POSIX_ACL=y
# CONFIG_BTRFS_FS_CHECK_INTEGRITY is not setCONFIG_BTRFS_FS_RUN_SANITY_TESTS=yCONFIG_BTRFS_DEBUG=yCONFIG_BTRFS_ASSERT=yCONFIG_NILFS2_FS=y
# CONFIG_F2FS_FS is not setCONFIG_FS_DAX=yCONFIG_FS_POSIX_ACL=yCONFIG_EXPORTFS=yCONFIG_FILE_LOCKING=yCONFIG_MANDATORY_FILE_LOCKING=yCONFIG_FSNOTIFY=y
# CONFIG_DNOTIFY is not setCONFIG_INOTIFY_USER=y
# CONFIG_FANOTIFY is not setCONFIG_QUOTA=yCONFIG_QUOTA_NETLINK_INTERFACE=y
# CONFIG_PRINT_QUOTA_WARNING is not setCONFIG_QUOTA_DEBUG=yCONFIG_QUOTA_TREE=y
# CONFIG_QFMT_V1 is not setCONFIG_QFMT_V2=yCONFIG_QUOTACTL=yCONFIG_QUOTACTL_COMPAT=yCONFIG_AUTOFS4_FS=y
# CONFIG_FUSE_FS is not setCONFIG_OVERLAY_FS=y
#
# Caches
#CONFIG_FSCACHE=y
# CONFIG_FSCACHE_STATS is not set
# CONFIG_FSCACHE_HISTOGRAM is not setCONFIG_FSCACHE_DEBUG=y
# CONFIG_FSCACHE_OBJECT_LIST is not setCONFIG_CACHEFILES=y
# CONFIG_CACHEFILES_DEBUG is not setCONFIG_CACHEFILES_HISTOGRAM=y
#
# CD-ROM/DVD Filesystems
#CONFIG_ISO9660_FS=y
# CONFIG_JOLIET is not set
# CONFIG_ZISOFS is not set
# CONFIG_UDF_FS is not set
#
# DOS/FAT/NT Filesystems
#CONFIG_FAT_FS=yCONFIG_MSDOS_FS=yCONFIG_VFAT_FS=yCONFIG_FAT_DEFAULT_CODEPAGE=437CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"CONFIG_NTFS_FS=y
# CONFIG_NTFS_DEBUG is not set
# CONFIG_NTFS_RW is not set
#
# Pseudo filesystems
#CONFIG_PROC_FS=y
# CONFIG_PROC_KCORE is not set CONFIG_PROC_VMCORE=yCONFIG_PROC_SYSCTL=y
# CONFIG_PROC_PAGE_MONITOR is not set
# CONFIG_PROC_CHILDREN is not set CONFIG_KERNFS=yCONFIG_SYSFS=yCONFIG_TMPFS=y
# CONFIG_TMPFS_POSIX_ACL is not set CONFIG_TMPFS_XATTR=y
# CONFIG_HUGETLBFS is not set
# CONFIG_HUGETLB_PAGE is not set CONFIG_CONFIGFS_FS=y CONFIG_MISC_FILESYSTEMS=yCONFIG_ADFS_FS=y
# CONFIG_ADFS_FS_RW is not set CONFIG_AFFS_FS=y
# CONFIG_ECRYPT_FS is not setCONFIG_HFS_FS=yCONFIG_HFSPLUS_FS=y CONFIG_HFSPLUS_FS_POSIX_ACL=y CONFIG_BEFS_FS=yCONFIG_BEFS_DEBUG=y
# CONFIG_BFS_FS is not set
# CONFIG_EFS_FS is not set
# CONFIG_LOGFS is not set
# CONFIG_CRAMFS is not setCONFIG_SQUASHFS=y CONFIG_SQUASHFS_FILE_CACHE=y
# CONFIG_SQUASHFS_FILE_DIRECT is not set
# CONFIG_SQUASHFS_DECOMP_SINGLE is not set
# CONFIG_SQUASHFS_DECOMP_MULTI is not set CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y
# CONFIG_SQUASHFS_XATTR is not set CONFIG_SQUASHFS_ZLIB=yCONFIG_SQUASHFS_LZ4=yCONFIG_SQUASHFS_LZO=yCONFIG_SQUASHFS_XZ=y CONFIG_SQUASHFS_4K_DEVBLK_SIZE=y
# CONFIG_SQUASHFS_EMBEDDED is not set CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
# CONFIG_VXFS_FS is not setCONFIG_MINIX_FS=yCONFIG_OMFS_FS=yCONFIG_HPFS_FS=yCONFIG_QNX4FS_FS=y
# CONFIG_QNX6FS_FS is not set
# CONFIG_ROMFS_FS is not setCONFIG_PSTORE=yCONFIG_PSTORE_CONSOLE=yCONFIG_PSTORE_PMSG=y
# CONFIG_PSTORE_FTRACE is not set
# CONFIG_PSTORE_RAM is not set CONFIG_SYSV_FS=yCONFIG_UFS_FS=y
# CONFIG_UFS_FS_WRITE is not set CONFIG_UFS_DEBUG=y
# CONFIG_EXOFS_FS is not setCONFIG_ORE=yCONFIG_NETWORK_FILESYSTEMS=yCONFIG_NFS_FS=y
# CONFIG_NFS_V2 is not set
# CONFIG_NFS_V3 is not setCONFIG_NFS_V4=yCONFIG_NFS_SWAP=yCONFIG_NFS_V4_1=y
# CONFIG_NFS_V4_2 is not set CONFIG_PNFS_FILE_LAYOUT=y CONFIG_PNFS_OBJLAYOUT=y CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" # CONFIG_NFS_V4_1_MIGRATION is not set
# CONFIG_ROOT_NFS is not set CONFIG_NFS_FSCACHE=y
# CONFIG_NFS_USE_LEGACY_DNS is not set CONFIG_NFS_USE_KERNEL_DNS=y CONFIG_NFS_DEBUG=y
# CONFIG_NFSD is not set CONFIG_GRACE_PERIOD=yCONFIG_LOCKD=yCONFIG_NFS_COMMON=yCONFIG_SUNRPC=yCONFIG_SUNRPC_GSS=y CONFIG_SUNRPC_BACKCHANNEL=y CONFIG_SUNRPC_SWAP=yCONFIG_SUNRPC_DEBUG=y CONFIG_SUNRPC_XPRT_RDMA=yCONFIG_CEPH_FS=yCONFIG_CEPH_FSCACHE=y CONFIG_CEPH_FS_POSIX_ACL=yCONFIG_CIFS=y
# CONFIG_CIFS_STATS is not set CONFIG_CIFS_WEAK_PW_HASH=y
# CONFIG_CIFS_UPCALL is not set
# CONFIG_CIFS_XATTR is not set
# CONFIG_CIFS_DEBUG is not set CONFIG_CIFS_DFS_UPCALL=y
# CONFIG_CIFS_SMB2 is not set
# CONFIG_CIFS_FSCACHE is not set CONFIG_NCP_FS=y
# CONFIG_NCPFS_PACKET_SIGNING is not set
# CONFIG_NCPFS_IOCTL_LOCKING is not set CONFIG_NCPFS_STRONG=y
# CONFIG_NCPFS_NFS_NS is not set
# CONFIG_NCPFS_OS2_NS is not set CONFIG_NCPFS_SMALLDOS=y
# CONFIG_NCPFS_NLS is not set CONFIG_NCPFS_EXTRAS=y
# CONFIG_CODA_FS is not setCONFIG_AFS_FS=yCONFIG_AFS_DEBUG=yCONFIG_AFS_FSCACHE=yCONFIG_9P_FS=yCONFIG_9P_FSCACHE=y
# CONFIG_9P_FS_POSIX_ACL is not set CONFIG_9P_FS_SECURITY=yCONFIG_NLS=yCONFIG_NLS_DEFAULT="iso8859-1" CONFIG_NLS_CODEPAGE_437=y CONFIG_NLS_CODEPAGE_737=y CONFIG_NLS_CODEPAGE_775=y CONFIG_NLS_CODEPAGE_850=y CONFIG_NLS_CODEPAGE_852=y CONFIG_NLS_CODEPAGE_855=y
# CONFIG_NLS_CODEPAGE_857 is not set
# CONFIG_NLS_CODEPAGE_860 is not set CONFIG_NLS_CODEPAGE_861=y CONFIG_NLS_CODEPAGE_862=y
# CONFIG_NLS_CODEPAGE_863 is not set CONFIG_NLS_CODEPAGE_864=y
# CONFIG_NLS_CODEPAGE_865 is not set
# CONFIG_NLS_CODEPAGE_866 is not set CONFIG_NLS_CODEPAGE_869=y CONFIG_NLS_CODEPAGE_936=y
# CONFIG_NLS_CODEPAGE_950 is not set CONFIG_NLS_CODEPAGE_932=y CONFIG_NLS_CODEPAGE_949=y CONFIG_NLS_CODEPAGE_874=y
# CONFIG_NLS_ISO8859_8 is not set CONFIG_NLS_CODEPAGE_1250=y CONFIG_NLS_CODEPAGE_1251=yCONFIG_NLS_ASCII=yCONFIG_NLS_ISO8859_1=yCONFIG_NLS_ISO8859_2=y
# CONFIG_NLS_ISO8859_3 is not set CONFIG_NLS_ISO8859_4=yCONFIG_NLS_ISO8859_5=y
# CONFIG_NLS_ISO8859_6 is not set CONFIG_NLS_ISO8859_7=yCONFIG_NLS_ISO8859_9=y CONFIG_NLS_ISO8859_13=y CONFIG_NLS_ISO8859_14=y
# CONFIG_NLS_ISO8859_15 is not set
# CONFIG_NLS_KOI8_R is not set CONFIG_NLS_KOI8_U=y
# CONFIG_NLS_MAC_ROMAN is not set
# CONFIG_NLS_MAC_CELTIC is not set
# CONFIG_NLS_MAC_CENTEURO is not set CONFIG_NLS_MAC_CROATIAN=y CONFIG_NLS_MAC_CYRILLIC=y CONFIG_NLS_MAC_GAELIC=y CONFIG_NLS_MAC_GREEK=y CONFIG_NLS_MAC_ICELAND=y
# CONFIG_NLS_MAC_INUIT is not set
# CONFIG_NLS_MAC_ROMANIAN is not set
# CONFIG_NLS_MAC_TURKISH is not set CONFIG_NLS_UTF8=yCONFIG_DLM=yCONFIG_DLM_DEBUG=y
#
# Kernel hacking
#CONFIG_TRACE_IRQFLAGS_SUPPORT=y
#
# printk and dmesg options # CONFIG_PRINTK_TIME=y CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 CONFIG_BOOT_PRINTK_DELAY=y CONFIG_DYNAMIC_DEBUG=y
#
# Compile-time checks and compiler options
#
# CONFIG_DEBUG_INFO is not setCONFIG_ENABLE_WARN_DEPRECATED=yCONFIG_ENABLE_MUST_CHECK=yCONFIG_FRAME_WARN=2048
# CONFIG_STRIP_ASM_SYMS is not setCONFIG_READABLE_ASM=yCONFIG_UNUSED_SYMBOLS=yCONFIG_PAGE_OWNER=yCONFIG_DEBUG_FS=yCONFIG_HEADERS_CHECK=yCONFIG_DEBUG_SECTION_MISMATCH=yCONFIG_SECTION_MISMATCH_WARN_ONLY=yCONFIG_ARCH_WANT_FRAME_POINTERS=y
# CONFIG_FRAME_POINTER is not setCONFIG_STACK_VALIDATION=yCONFIG_DEBUG_FORCE_WEAK_PER_CPU=yCONFIG_MAGIC_SYSRQ=yCONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1CONFIG_DEBUG_KERNEL=y
#
# Memory Debugging
#CONFIG_PAGE_EXTENSION=y
# CONFIG_DEBUG_PAGEALLOC is not set
# CONFIG_DEBUG_OBJECTS is not setCONFIG_SLUB_STATS=yCONFIG_HAVE_DEBUG_KMEMLEAK=yCONFIG_DEBUG_KMEMLEAK=yCONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=400
# CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF is not setCONFIG_DEBUG_STACK_USAGE=y
# CONFIG_DEBUG_VM is not setCONFIG_DEBUG_VIRTUAL=y
# CONFIG_DEBUG_MEMORY_INIT is not setCONFIG_DEBUG_PER_CPU_MAPS=yCONFIG_HAVE_DEBUG_STACKOVERFLOW=y
# CONFIG_DEBUG_STACKOVERFLOW is not setCONFIG_HAVE_ARCH_KMEMCHECK=yCONFIG_DEBUG_SHIRQ=y
#
# Debug Lockups and Hangs
#CONFIG_LOCKUP_DETECTOR=yCONFIG_HARDLOCKUP_DETECTOR=yCONFIG_BOOTPARAM_HARDLOCKUP_PANIC=yCONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=1
# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not setCONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
# CONFIG_DETECT_HUNG_TASK is not setCONFIG_WQ_WATCHDOG=yCONFIG_PANIC_ON_OOPS=yCONFIG_PANIC_ON_OOPS_VALUE=1CONFIG_PANIC_TIMEOUT=0
# CONFIG_SCHED_DEBUG is not setCONFIG_SCHED_INFO=yCONFIG_SCHEDSTATS=yCONFIG_SCHED_STACK_END_CHECK=yCONFIG_DEBUG_TIMEKEEPING=yCONFIG_TIMER_STATS=y
#
# Lock Debugging (spinlocks, mutexes, etc...)
#
# CONFIG_DEBUG_RT_MUTEXES is not set
# CONFIG_DEBUG_SPINLOCK is not setCONFIG_DEBUG_MUTEXES=y
# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set
# CONFIG_DEBUG_LOCK_ALLOC is not set
# CONFIG_PROVE_LOCKING is not set
# CONFIG_LOCK_STAT is not setCONFIG_DEBUG_ATOMIC_SLEEP=y
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
# CONFIG_LOCK_TORTURE_TEST is not setCONFIG_TRACE_IRQFLAGS=yCONFIG_STACKTRACE=y
# CONFIG_DEBUG_KOBJECT is not set
# CONFIG_DEBUG_LIST is not setCONFIG_DEBUG_PI_LIST=y
# CONFIG_DEBUG_SG is not setCONFIG_DEBUG_NOTIFIERS=y
# CONFIG_DEBUG_CREDENTIALS is not set
#
# RCU Debugging
#
# CONFIG_PROVE_RCU is not set
# CONFIG_SPARSE_RCU_POINTER is not setCONFIG_TORTURE_TEST=yCONFIG_RCU_TORTURE_TEST=y
# CONFIG_RCU_TORTURE_TEST_RUNNABLE is not set
# CONFIG_RCU_TORTURE_TEST_SLOW_PREINIT is not set
# CONFIG_RCU_TORTURE_TEST_SLOW_INIT is not set
# CONFIG_RCU_TORTURE_TEST_SLOW_CLEANUP is not setCONFIG_RCU_CPU_STALL_TIMEOUT=21CONFIG_RCU_TRACE=y
# CONFIG_RCU_EQS_DEBUG is not setCONFIG_DEBUG_WQ_FORCE_RR_CPU=y
# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set
# CONFIG_NOTIFIER_ERROR_INJECTION is not setCONFIG_FAULT_INJECTION=y
# CONFIG_FAILSLAB is not setCONFIG_FAIL_PAGE_ALLOC=y
# CONFIG_FAIL_MAKE_REQUEST is not set
# CONFIG_FAIL_IO_TIMEOUT is not setCONFIG_FAIL_FUTEX=y
# CONFIG_FAULT_INJECTION_DEBUG_FS is not set
# CONFIG_LATENCYTOP is not setCONFIG_ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS=yCONFIG_DEBUG_STRICT_USER_COPY_CHECKS=yCONFIG_USER_STACKTRACE_SUPPORT=yCONFIG_NOP_TRACER=yCONFIG_HAVE_FUNCTION_TRACER=yCONFIG_HAVE_FUNCTION_GRAPH_TRACER=yCONFIG_HAVE_FUNCTION_GRAPH_FP_TEST=yCONFIG_HAVE_DYNAMIC_FTRACE=yCONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=yCONFIG_HAVE_FTRACE_MCOUNT_RECORD=yCONFIG_HAVE_SYSCALL_TRACEPOINTS=yCONFIG_HAVE_FENTRY=yCONFIG_HAVE_C_RECORDMCOUNT=yCONFIG_TRACER_MAX_TRACE=yCONFIG_TRACE_CLOCK=yCONFIG_RING_BUFFER=yCONFIG_EVENT_TRACING=yCONFIG_CONTEXT_SWITCH_TRACER=yCONFIG_RING_BUFFER_ALLOW_SWAP=yCONFIG_TRACING=yCONFIG_GENERIC_TRACER=yCONFIG_TRACING_SUPPORT=yCONFIG_FTRACE=yCONFIG_FUNCTION_TRACER=y
# CONFIG_FUNCTION_GRAPH_TRACER is not setCONFIG_IRQSOFF_TRACER=y
# CONFIG_SCHED_TRACER is not setCONFIG_FTRACE_SYSCALLS=yCONFIG_TRACER_SNAPSHOT=yCONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP=yCONFIG_BRANCH_PROFILE_NONE=y
# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
# CONFIG_PROFILE_ALL_BRANCHES is not setCONFIG_STACK_TRACER=yCONFIG_BLK_DEV_IO_TRACE=y
# CONFIG_UPROBE_EVENT is not set
# CONFIG_PROBE_EVENTS is not setCONFIG_DYNAMIC_FTRACE=yCONFIG_DYNAMIC_FTRACE_WITH_REGS=yCONFIG_FUNCTION_PROFILER=yCONFIG_FTRACE_MCOUNT_RECORD=yCONFIG_FTRACE_SELFTEST=yCONFIG_FTRACE_STARTUP_TEST=y
# CONFIG_EVENT_TRACE_TEST_SYSCALLS is not set
# CONFIG_MMIOTRACE is not setCONFIG_TRACEPOINT_BENCHMARK=yCONFIG_RING_BUFFER_BENCHMARK=y
# CONFIG_RING_BUFFER_STARTUP_TEST is not set
# CONFIG_TRACE_ENUM_MAP_FILE is not setCONFIG_TRACING_EVENTS_GPIO=y
#
# Runtime Testing
#CONFIG_LKDTM=y
# CONFIG_TEST_LIST_SORT is not setCONFIG_BACKTRACE_SELF_TEST=yCONFIG_RBTREE_TEST=y
# CONFIG_ATOMIC64_SELFTEST is not set
# CONFIG_TEST_HEXDUMP is not setCONFIG_TEST_STRING_HELPERS=yCONFIG_TEST_KSTRTOX=yCONFIG_TEST_PRINTF=yCONFIG_TEST_RHASHTABLE=y
# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set
# CONFIG_BUILD_DOCSRC is not setCONFIG_DMA_API_DEBUG=yCONFIG_TEST_FIRMWARE=y
# CONFIG_TEST_UDELAY is not setCONFIG_MEMTEST=y
# CONFIG_SAMPLES is not setCONFIG_HAVE_ARCH_KGDB=yCONFIG_KGDB=y
# CONFIG_KGDB_SERIAL_CONSOLE is not setCONFIG_KGDB_TESTS=y
# CONFIG_KGDB_TESTS_ON_BOOT is not setCONFIG_KGDB_LOW_LEVEL_TRAP=y
# CONFIG_KGDB_KDB is not setCONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y
# CONFIG_UBSAN is not setCONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=yCONFIG_STRICT_DEVMEM=y
# CONFIG_IO_STRICT_DEVMEM is not setCONFIG_X86_VERBOSE_BOOTUP=yCONFIG_EARLY_PRINTK=y
# CONFIG_EARLY_PRINTK_DBGP is not setCONFIG_X86_PTDUMP_CORE=yCONFIG_X86_PTDUMP=y
# CONFIG_DEBUG_RODATA_TEST is not setCONFIG_DEBUG_WX=yCONFIG_DOUBLEFAULT=yCONFIG_DEBUG_TLBFLUSH=yCONFIG_IOMMU_STRESS=yCONFIG_HAVE_MMIOTRACE_SUPPORT=yCONFIG_IO_DELAY_TYPE_0X80=0CONFIG_IO_DELAY_TYPE_0XED=1CONFIG_IO_DELAY_TYPE_UDELAY=2CONFIG_IO_DELAY_TYPE_NONE=3CONFIG_IO_DELAY_0X80=y
# CONFIG_IO_DELAY_0XED is not set
# CONFIG_IO_DELAY_UDELAY is not set
# CONFIG_IO_DELAY_NONE is not setCONFIG_DEFAULT_IO_DELAY_TYPE=0CONFIG_DEBUG_BOOT_PARAMS=yCONFIG_CPA_DEBUG=y
# CONFIG_OPTIMIZE_INLINING is not set
# CONFIG_DEBUG_ENTRY is not set
# CONFIG_DEBUG_NMI_SELFTEST is not setCONFIG_X86_DEBUG_FPU=yCONFIG_PUNIT_ATOM_DEBUG=y
#
# Security options
#CONFIG_KEYS=y
# CONFIG_PERSISTENT_KEYRINGS is not set CONFIG_BIG_KEYS=y
# CONFIG_TRUSTED_KEYS is not set CONFIG_ENCRYPTED_KEYS=y CONFIG_SECURITY_DMESG_RESTRICT=y CONFIG_SECURITY=yCONFIG_SECURITYFS=yCONFIG_SECURITY_NETWORK=y CONFIG_SECURITY_NETWORK_XFRM=y CONFIG_SECURITY_PATH=y CONFIG_LSM_MMAP_MIN_ADDR=65536 CONFIG_SECURITY_SELINUX=y
# CONFIG_SECURITY_SELINUX_BOOTPARAM is not set
# CONFIG_SECURITY_SELINUX_DISABLE is not set
# CONFIG_SECURITY_SELINUX_DEVELOP is not set CONFIG_SECURITY_SELINUX_AVC_STATS=y CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=0
# CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set # CONFIG_SECURITY_SMACK is not set CONFIG_SECURITY_TOMOYO=y CONFIG_SECURITY_TOMOYO_MAX_ACCEPT_ENTRY=2048 CONFIG_SECURITY_TOMOYO_MAX_AUDIT_LOG=1024
# CONFIG_SECURITY_TOMOYO_OMIT_USERSPACE_LOADER is not set CONFIG_SECURITY_TOMOYO_POLICY_LOADER="/sbin/tomoyo-init" CONFIG_SECURITY_TOMOYO_ACTIVATION_TRIGGER="/sbin/init" CONFIG_SECURITY_APPARMOR=y CONFIG_SECURITY_APPARMOR_BOOTPARAM_VALUE=1
# CONFIG_SECURITY_APPARMOR_HASH is not set
# CONFIG_SECURITY_YAMA is not set CONFIG_INTEGRITY=y
# CONFIG_INTEGRITY_SIGNATURE is not set CONFIG_INTEGRITY_AUDIT=y
# CONFIG_IMA is not set
# CONFIG_EVM is not set
# CONFIG_DEFAULT_SECURITY_SELINUX is not set
# CONFIG_DEFAULT_SECURITY_TOMOYO is not set CONFIG_DEFAULT_SECURITY_APPARMOR=y
# CONFIG_DEFAULT_SECURITY_DAC is not set CONFIG_DEFAULT_SECURITY="apparmor" CONFIG_XOR_BLOCKS=yCONFIG_ASYNC_CORE=yCONFIG_ASYNC_XOR=yCONFIG_ASYNC_PQ=yCONFIG_CRYPTO=y
#
# Crypto core or helper
#CONFIG_CRYPTO_ALGAPI=yCONFIG_CRYPTO_ALGAPI2=yCONFIG_CRYPTO_AEAD=yCONFIG_CRYPTO_AEAD2=yCONFIG_CRYPTO_BLKCIPHER=yCONFIG_CRYPTO_BLKCIPHER2=yCONFIG_CRYPTO_HASH=yCONFIG_CRYPTO_HASH2=yCONFIG_CRYPTO_RNG=yCONFIG_CRYPTO_RNG2=yCONFIG_CRYPTO_RNG_DEFAULT=yCONFIG_CRYPTO_PCOMP=yCONFIG_CRYPTO_PCOMP2=yCONFIG_CRYPTO_AKCIPHER2=yCONFIG_CRYPTO_AKCIPHER=yCONFIG_CRYPTO_RSA=yCONFIG_CRYPTO_MANAGER=yCONFIG_CRYPTO_MANAGER2=y
# CONFIG_CRYPTO_USER is not set
# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not setCONFIG_CRYPTO_GF128MUL=yCONFIG_CRYPTO_NULL=yCONFIG_CRYPTO_NULL2=yCONFIG_CRYPTO_PCRYPT=yCONFIG_CRYPTO_WORKQUEUE=yCONFIG_CRYPTO_CRYPTD=yCONFIG_CRYPTO_MCRYPTD=yCONFIG_CRYPTO_AUTHENC=yCONFIG_CRYPTO_ABLK_HELPER=yCONFIG_CRYPTO_GLUE_HELPER_X86=y
#
# Authenticated Encryption with Associated Data
#CONFIG_CRYPTO_CCM=y
# CONFIG_CRYPTO_GCM is not setCONFIG_CRYPTO_CHACHA20POLY1305=yCONFIG_CRYPTO_SEQIV=yCONFIG_CRYPTO_ECHAINIV=y
#
# Block modes
#CONFIG_CRYPTO_CBC=yCONFIG_CRYPTO_CTR=y
# CONFIG_CRYPTO_CTS is not setCONFIG_CRYPTO_ECB=yCONFIG_CRYPTO_LRW=yCONFIG_CRYPTO_PCBC=yCONFIG_CRYPTO_XTS=yCONFIG_CRYPTO_KEYWRAP=y
#
# Hash modes
#CONFIG_CRYPTO_CMAC=yCONFIG_CRYPTO_HMAC=yCONFIG_CRYPTO_XCBC=y
# CONFIG_CRYPTO_VMAC is not set
#
# Digest
#CONFIG_CRYPTO_CRC32C=y
# CONFIG_CRYPTO_CRC32C_INTEL is not setCONFIG_CRYPTO_CRC32=yCONFIG_CRYPTO_CRC32_PCLMUL=yCONFIG_CRYPTO_CRCT10DIF=yCONFIG_CRYPTO_CRCT10DIF_PCLMUL=y
# CONFIG_CRYPTO_GHASH is not setCONFIG_CRYPTO_POLY1305=yCONFIG_CRYPTO_POLY1305_X86_64=yCONFIG_CRYPTO_MD4=yCONFIG_CRYPTO_MD5=yCONFIG_CRYPTO_MICHAEL_MIC=y
# CONFIG_CRYPTO_RMD128 is not setCONFIG_CRYPTO_RMD160=y
# CONFIG_CRYPTO_RMD256 is not setCONFIG_CRYPTO_RMD320=yCONFIG_CRYPTO_SHA1=yCONFIG_CRYPTO_SHA1_SSSE3=yCONFIG_CRYPTO_SHA256_SSSE3=yCONFIG_CRYPTO_SHA512_SSSE3=yCONFIG_CRYPTO_SHA1_MB=yCONFIG_CRYPTO_SHA256=yCONFIG_CRYPTO_SHA512=yCONFIG_CRYPTO_TGR192=yCONFIG_CRYPTO_WP512=yCONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL=y
#
# Ciphers
#CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_AES_X86_64=y CONFIG_CRYPTO_AES_NI_INTEL=y CONFIG_CRYPTO_ANUBIS=yCONFIG_CRYPTO_ARC4=yCONFIG_CRYPTO_BLOWFISH=y CONFIG_CRYPTO_BLOWFISH_COMMON=y CONFIG_CRYPTO_BLOWFISH_X86_64=y CONFIG_CRYPTO_CAMELLIA=y CONFIG_CRYPTO_CAMELLIA_X86_64=y
# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set # CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set CONFIG_CRYPTO_CAST_COMMON=y CONFIG_CRYPTO_CAST5=y
# CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set CONFIG_CRYPTO_CAST6=y CONFIG_CRYPTO_CAST6_AVX_X86_64=y CONFIG_CRYPTO_DES=y
# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set CONFIG_CRYPTO_FCRYPT=yCONFIG_CRYPTO_KHAZAD=y CONFIG_CRYPTO_SALSA20=y CONFIG_CRYPTO_SALSA20_X86_64=y CONFIG_CRYPTO_CHACHA20=y
# CONFIG_CRYPTO_CHACHA20_X86_64 is not set
# CONFIG_CRYPTO_SEED is not set CONFIG_CRYPTO_SERPENT=y CONFIG_CRYPTO_SERPENT_SSE2_X86_64=y CONFIG_CRYPTO_SERPENT_AVX_X86_64=y CONFIG_CRYPTO_SERPENT_AVX2_X86_64=y CONFIG_CRYPTO_TEA=y
# CONFIG_CRYPTO_TWOFISH is not set CONFIG_CRYPTO_TWOFISH_COMMON=y CONFIG_CRYPTO_TWOFISH_X86_64=y CONFIG_CRYPTO_TWOFISH_X86_64_3WAY=y CONFIG_CRYPTO_TWOFISH_AVX_X86_64=y
#
# Compression
#CONFIG_CRYPTO_DEFLATE=yCONFIG_CRYPTO_ZLIB=yCONFIG_CRYPTO_LZO=yCONFIG_CRYPTO_842=y
# CONFIG_CRYPTO_LZ4 is not setCONFIG_CRYPTO_LZ4HC=y
#
# Random Number Generation
#CONFIG_CRYPTO_ANSI_CPRNG=yCONFIG_CRYPTO_DRBG_MENU=yCONFIG_CRYPTO_DRBG_HMAC=yCONFIG_CRYPTO_DRBG_HASH=y
# CONFIG_CRYPTO_DRBG_CTR is not setCONFIG_CRYPTO_DRBG=yCONFIG_CRYPTO_JITTERENTROPY=yCONFIG_CRYPTO_USER_API=yCONFIG_CRYPTO_USER_API_HASH=yCONFIG_CRYPTO_USER_API_SKCIPHER=yCONFIG_CRYPTO_USER_API_RNG=yCONFIG_CRYPTO_USER_API_AEAD=yCONFIG_CRYPTO_HW=y
# CONFIG_CRYPTO_DEV_PADLOCK is not set
# CONFIG_CRYPTO_DEV_CCP is not setCONFIG_CRYPTO_DEV_QAT=y
CONFIG_CRYPTO_DEV_QAT_DH895xCC=y
# CONFIG_CRYPTO_DEV_QAT_C3XXX is not setCONFIG_CRYPTO_DEV_QAT_C62X=y
# CONFIG_CRYPTO_DEV_QAT_DH895xCCVF is not setCONFIG_CRYPTO_DEV_QAT_C3XXXVF=yCONFIG_CRYPTO_DEV_QAT_C62XVF=y
# CONFIG_ASYMMETRIC_KEY_TYPE is not set
#
# Certificates for signature checking
#
# CONFIG_SYSTEM_TRUSTED_KEYRING is not setCONFIG_HAVE_KVM=yCONFIG_HAVE_KVM_IRQCHIP=yCONFIG_HAVE_KVM_IRQFD=yCONFIG_HAVE_KVM_IRQ_ROUTING=yCONFIG_HAVE_KVM_EVENTFD=yCONFIG_KVM_APIC_ARCHITECTURE=yCONFIG_KVM_MMIO=yCONFIG_KVM_ASYNC_PF=yCONFIG_HAVE_KVM_MSI=yCONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=yCONFIG_KVM_VFIO=yCONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=yCONFIG_KVM_COMPAT=yCONFIG_HAVE_KVM_IRQ_BYPASS=yCONFIG_VIRTUALIZATION=yCONFIG_KVM=yCONFIG_KVM_INTEL=yCONFIG_KVM_AMD=yCONFIG_KVM_MMU_AUDIT=yCONFIG_BINARY_PRINTF=y
#
# Library routines
#CONFIG_RAID6_PQ=yCONFIG_BITREVERSE=y
# CONFIG_HAVE_ARCH_BITREVERSE is not setCONFIG_RATIONAL=yCONFIG_GENERIC_STRNCPY_FROM_USER=yCONFIG_GENERIC_STRNLEN_USER=yCONFIG_GENERIC_NET_UTILS=yCONFIG_GENERIC_FIND_FIRST_BIT=yCONFIG_GENERIC_PCI_IOMAP=yCONFIG_GENERIC_IOMAP=yCONFIG_GENERIC_IO=yCONFIG_ARCH_USE_CMPXCHG_LOCKREF=yCONFIG_ARCH_HAS_FAST_MULTIPLIER=yCONFIG_CRC_CCITT=yCONFIG_CRC16=yCONFIG_CRC_T10DIF=yCONFIG_CRC_ITU_T=yCONFIG_CRC32=yCONFIG_CRC32_SELFTEST=y
# CONFIG_CRC32_SLICEBY8 is not set
# CONFIG_CRC32_SLICEBY4 is not set
# CONFIG_CRC32_SARWATE is not setCONFIG_CRC32_BIT=yCONFIG_CRC7=yCONFIG_LIBCRC32C=yCONFIG_CRC8=y
# CONFIG_AUDIT_ARCH_COMPAT_GENERIC is not setCONFIG_RANDOM32_SELFTEST=yCONFIG_842_COMPRESS=yCONFIG_842_DECOMPRESS=yCONFIG_ZLIB_INFLATE=yCONFIG_ZLIB_DEFLATE=yCONFIG_LZO_COMPRESS=yCONFIG_LZO_DECOMPRESS=yCONFIG_LZ4HC_COMPRESS=yCONFIG_LZ4_DECOMPRESS=yCONFIG_XZ_DEC=yCONFIG_XZ_DEC_X86=yCONFIG_XZ_DEC_POWERPC=yCONFIG_XZ_DEC_IA64=y
# CONFIG_XZ_DEC_ARM is not set
# CONFIG_XZ_DEC_ARMTHUMB is not set
# CONFIG_XZ_DEC_SPARC is not setCONFIG_XZ_DEC_BCJ=y
# CONFIG_XZ_DEC_TEST is not setCONFIG_DECOMPRESS_GZIP=yCONFIG_DECOMPRESS_BZIP2=yCONFIG_DECOMPRESS_LZMA=yCONFIG_DECOMPRESS_LZO=yCONFIG_DECOMPRESS_LZ4=yCONFIG_GENERIC_ALLOCATOR=yCONFIG_BTREE=yCONFIG_INTERVAL_TREE=yCONFIG_ASSOCIATIVE_ARRAY=yCONFIG_HAS_IOMEM=yCONFIG_HAS_IOPORT_MAP=yCONFIG_HAS_DMA=yCONFIG_CHECK_SIGNATURE=yCONFIG_CPUMASK_OFFSTACK=yCONFIG_CPU_RMAP=yCONFIG_DQL=yCONFIG_GLOB=yCONFIG_GLOB_SELFTEST=yCONFIG_NLATTR=yCONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=yCONFIG_CLZ_TAB=y
# CONFIG_CORDIC is not set
# CONFIG_DDR is not setCONFIG_IRQ_POLL=yCONFIG_MPILIB=yCONFIG_LIBFDT=yCONFIG_OID_REGISTRY=yCONFIG_FONT_SUPPORT=y
# CONFIG_FONTS is not set
CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y
# CONFIG_SG_SPLIT is not setCONFIG_ARCH_HAS_SG_CHAIN=yCONFIG_ARCH_HAS_PMEM_API=yCONFIG_ARCH_HAS_MMIO_FLUSH=y
cover Various objtool fixes
Based on tip/master.
These patches fix all known objtool issues:
- infinite loop
- sibling call false positives
- switch statement jump table fix
- performance improvements
- print one warning per function
Josh Poimboeuf (11):
objtool: Prevent infinite recursion in noreturn detection
objtool: Detect infinite recursion
objtool: Compile with debugging symbols
objtool: Fix false positive warnings related to sibling calls
objtool: Add helper macros for traversing instructions
objtool: Remove superflous INIT_LIST_HEAD
objtool: Rename some variables and functions
objtool: Fix false positive warnings for functions with multiple
switch statements
tools/objtool: Copy hashtable.h into tools directory
objtool: Add several performance improvements
objtool: Only print one warning per function
tools/include/asm-generic/bitops/__fls.h | 2 +- tools/include/asm-generic/bitops/fls.h | 2 +- tools/include/asm-generic/bitops/fls64.h | 2 +- tools/include/linux/hashtable.h | 152 +++++++++++ tools/objtool/Makefile | 2 +- tools/objtool/builtin-check.c | 429 +++++++++++++++++++------------ tools/objtool/elf.c | 37 ++- tools/objtool/elf.h | 14 +- 8 files changed, 447 insertions(+), 193 deletions(-) create mode 100644 tools/include/linux/hashtable.h
Signature · 1 line
2.4.3
PATCH 1/11 objtool: Prevent infinite recursion in noreturn detection
Ingo reported an infinite loop in objtool with a certain randconfig [1]. With the given config, two functions in crypto/ablkcipher.o contained sibling calls to each other, which threw the recursive call in dead_end_function() for a loop (literally!).
Split the noreturn detection into two passes. In the first pass, check for return instructions. In the second pass, do the potentially recursive sibling call check. In most cases, the first pass will be good enough. In the rare case where a second pass is needed, recursion should hopefully no longer be possible.
[1] https://lkml.kernel.org/r/[email protected]
--- tools/objtool/builtin-check.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-)
tools/objtool/builtin-check.c +20 -4
@@ -125,7 +125,7 @@ static bool ignore_func(struct objtool_file *file, struct symbol *func)static bool dead_end_function (struct objtool_file *file,struct symbol *func) {int i; -struct instruction *insn; +struct instruction *insn, *func_insn;bool empty = true;/*
@@ -154,10 +154,11 @@ static bool dead_end_function(struct objtool_file *file, struct symbol *func)if (!func->sec)return false; - insn =find_instruction (file, func->sec, func->offset); -if (!insn) + func_insn =find_instruction (file, func->sec, func->offset); +if (!func_insn)return false; + insn = func_insn;list_for_each_entry_from (insn, &file->insns, list) {if (insn->sec != func->sec || insn->offset >= func->offset + func->len)
@@ -167,6 +168,21 @@ static bool dead_end_function(struct objtool_file *file, struct symbol *func)if (insn->type ==INSN_RETURN )return false; + } + +if (empty) +return false; + +/* +* A function can have a sibling call instead of a return. In that +* case, the function's dead-end status depends on whether the target +* of the sibling call returns. +*/ + insn = func_insn; +list_for_each_entry_from (insn, &file->insns, list) { +if (insn->sec != func->sec || + insn->offset >= func->offset + func->len) +break ;if (insn->type ==INSN_JUMP_UNCONDITIONAL ) {struct instruction *dest = insn->jump_dest;
@@ -194,7 +210,7 @@ static bool dead_end_function(struct objtool_file *file, struct symbol *func)return false; } -return !empty; +return true; }/*
Signature · 1 line
2.4.3
tip-bot for Josh Poimboeuf
merge bot[tip:core/objtool] objtool: Prevent infinite recursion in noreturn detection
objtool: Prevent infinite recursion in noreturn detection
Commit-ID: 81bfafca1332869160e9da789252276e2f34a14e Gitweb: http://git.kernel.org/tip/81bfafca1332869160e9da789252276e2f34a14e Author: Josh Poimboeuf <[email protected]> AuthorDate: Wed, 9 Mar 2016 00:06:51 -0600 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 9 Mar 2016 10:48:07 +0100
objtool: Prevent infinite recursion in noreturn detection
Ingo reported an infinite loop in objtool with a certain randconfig [1]. With the given config, two functions in crypto/ablkcipher.o contained sibling calls to each other, which threw the recursive call in dead_end_function() for a loop (literally!).
Split the noreturn detection into two passes. In the first pass, check for return instructions. In the second pass, do the potentially recursive sibling call check. In most cases, the first pass will be good enough. In the rare case where a second pass is needed, recursion should hopefully no longer be possible.
[1] https://lkml.kernel.org/r/[email protected]
--- tools/objtool/builtin-check.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-)
tools/objtool/builtin-check.c +20 -4
@@ -125,7 +125,7 @@ static bool ignore_func(struct objtool_file *file, struct symbol *func)static bool dead_end_function (struct objtool_file *file,struct symbol *func) {int i; -struct instruction *insn; +struct instruction *insn, *func_insn;bool empty = true;/*
@@ -154,10 +154,11 @@ static bool dead_end_function(struct objtool_file *file, struct symbol *func)if (!func->sec)return false; - insn =find_instruction (file, func->sec, func->offset); -if (!insn) + func_insn =find_instruction (file, func->sec, func->offset); +if (!func_insn)return false; + insn = func_insn;list_for_each_entry_from (insn, &file->insns, list) {if (insn->sec != func->sec || insn->offset >= func->offset + func->len)
@@ -167,6 +168,21 @@ static bool dead_end_function(struct objtool_file *file, struct symbol *func)if (insn->type ==INSN_RETURN )return false; + } + +if (empty) +return false; + +/* +* A function can have a sibling call instead of a return. In that +* case, the function's dead-end status depends on whether the target +* of the sibling call returns. +*/ + insn = func_insn; +list_for_each_entry_from (insn, &file->insns, list) { +if (insn->sec != func->sec || + insn->offset >= func->offset + func->len) +break ;if (insn->type ==INSN_JUMP_UNCONDITIONAL ) {struct instruction *dest = insn->jump_dest;
@@ -194,7 +210,7 @@ static bool dead_end_function(struct objtool_file *file, struct symbol *func)return false; } -return !empty; +return true; }/*
PATCH 2/11 objtool: Detect infinite recursion
In reply to Josh PoimboeufI don't _think_ dead_end_function() can get into a recursive loop, but just in case, stop the loop and print a warning.
--- tools/objtool/builtin-check.c | 45 +++++++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 12 deletions(-)
tools/objtool/builtin-check.c +33 -12
@@ -121,8 +121,14 @@ static bool ignore_func(struct objtool_file *file, struct symbol *func)* * For local functions, we have to detect them manually by simply looking for * the lack of a return instruction. +* +* Returns: +* -1: error +* 0: no dead end +* 1: dead end */ -static bool dead_end_function (struct objtool_file *file,struct symbol *func) +static int __dead_end_function (struct objtool_file *file,struct symbol *func, +int recursion) {int i;struct instruction *insn, *func_insn;
@@ -144,19 +150,19 @@ static bool dead_end_function(struct objtool_file *file, struct symbol *func) };if (func->bind ==STB_WEAK ) -return false; +return 0 ;if (func->bind ==STB_GLOBAL )for (i =0 ; i <ARRAY_SIZE (global_noreturns); i++)if (!strcmp (func->name, global_noreturns[i])) -return true; +return 1 ;if (!func->sec) -return false; +return 0 ; func_insn =find_instruction (file, func->sec, func->offset);if (!func_insn) -return false; +return 0 ; insn = func_insn;list_for_each_entry_from (insn, &file->insns, list) {
@@ -167,11 +173,11 @@ static bool dead_end_function(struct objtool_file *file, struct symbol *func) empty = false;if (insn->type ==INSN_RETURN ) -return false; +return 0 ; }if (empty) -return false; +return 0 ;/* * A function can have a sibling call instead of a return. In that
@@ -190,7 +196,7 @@ static bool dead_end_function(struct objtool_file *file, struct symbol *func)if (!dest)/* sibling call to another file */ -return false; +return 0 ; if (dest->sec != func->sec || dest->offset < func->offset ||
@@ -201,16 +207,28 @@ static bool dead_end_function(struct objtool_file *file, struct symbol *func)if (!dest_func)continue ; -return dead_end_function (file, dest_func); +if (recursion ==5 ) { +WARN_FUNC ("infinite recursion (objtool bug!)" , + dest->sec, dest->offset); +return -1 ; + } + +return __dead_end_function (file, dest_func, + recursion +1 ); } }if (insn->type ==INSN_JUMP_DYNAMIC )/* sibling call */ -return false; +return 0 ; } -return true; +return 1 ; +} + +static int dead_end_function (struct objtool_file *file,struct symbol *func) +{ +return __dead_end_function (file, func,0 ); }/*
@@ -809,8 +827,11 @@ static int validate_branch(struct objtool_file *file,break ; } -if (dead_end_function (file, insn->call_dest)) + ret =dead_end_function (file, insn->call_dest); +if (ret ==1 )return warnings; +if (ret ==-1 ) + warnings++;/* fallthrough */ case INSN_CALL_DYNAMIC :
Signature · 1 line
2.4.3
tip-bot for Josh Poimboeuf
merge bot[tip:core/objtool] objtool: Detect infinite recursion
objtool: Detect infinite recursion
Commit-ID: b1e03249510b32645826bbf61a1452dd766c2e5c Gitweb: http://git.kernel.org/tip/b1e03249510b32645826bbf61a1452dd766c2e5c Author: Josh Poimboeuf <[email protected]> AuthorDate: Wed, 9 Mar 2016 00:06:52 -0600 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 9 Mar 2016 10:48:07 +0100
objtool: Detect infinite recursion
I don't _think_ dead_end_function() can get into a recursive loop, but just in case, stop the loop and print a warning.
--- tools/objtool/builtin-check.c | 45 +++++++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 12 deletions(-)
tools/objtool/builtin-check.c +33 -12
@@ -121,8 +121,14 @@ static bool ignore_func(struct objtool_file *file, struct symbol *func)* * For local functions, we have to detect them manually by simply looking for * the lack of a return instruction. +* +* Returns: +* -1: error +* 0: no dead end +* 1: dead end */ -static bool dead_end_function (struct objtool_file *file,struct symbol *func) +static int __dead_end_function (struct objtool_file *file,struct symbol *func, +int recursion) {int i;struct instruction *insn, *func_insn;
@@ -144,19 +150,19 @@ static bool dead_end_function(struct objtool_file *file, struct symbol *func) };if (func->bind ==STB_WEAK ) -return false; +return 0 ;if (func->bind ==STB_GLOBAL )for (i =0 ; i <ARRAY_SIZE (global_noreturns); i++)if (!strcmp (func->name, global_noreturns[i])) -return true; +return 1 ;if (!func->sec) -return false; +return 0 ; func_insn =find_instruction (file, func->sec, func->offset);if (!func_insn) -return false; +return 0 ; insn = func_insn;list_for_each_entry_from (insn, &file->insns, list) {
@@ -167,11 +173,11 @@ static bool dead_end_function(struct objtool_file *file, struct symbol *func) empty = false;if (insn->type ==INSN_RETURN ) -return false; +return 0 ; }if (empty) -return false; +return 0 ;/* * A function can have a sibling call instead of a return. In that
@@ -190,7 +196,7 @@ static bool dead_end_function(struct objtool_file *file, struct symbol *func)if (!dest)/* sibling call to another file */ -return false; +return 0 ; if (dest->sec != func->sec || dest->offset < func->offset ||
@@ -201,16 +207,28 @@ static bool dead_end_function(struct objtool_file *file, struct symbol *func)if (!dest_func)continue ; -return dead_end_function (file, dest_func); +if (recursion ==5 ) { +WARN_FUNC ("infinite recursion (objtool bug!)" , + dest->sec, dest->offset); +return -1 ; + } + +return __dead_end_function (file, dest_func, + recursion +1 ); } }if (insn->type ==INSN_JUMP_DYNAMIC )/* sibling call */ -return false; +return 0 ; } -return true; +return 1 ; +} + +static int dead_end_function (struct objtool_file *file,struct symbol *func) +{ +return __dead_end_function (file, func,0 ); }/*
@@ -809,8 +827,11 @@ static int validate_branch(struct objtool_file *file,break ; } -if (dead_end_function (file, insn->call_dest)) + ret =dead_end_function (file, insn->call_dest); +if (ret ==1 )return warnings; +if (ret ==-1 ) + warnings++;/* fallthrough */ case INSN_CALL_DYNAMIC :
PATCH 3/11 objtool: Compile with debugging symbols
In reply to Josh PoimboeufCompile objtool with debugging symbols ('-g') to help tools like perf and gdb understand what it's doing. Combined with '-O2', it's not always helpful, but it's better than nothing.
--- tools/objtool/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/objtool/Makefile +1 -1
@@ -27,7 +27,7 @@ OBJTOOL_IN := $(OBJTOOL)-in.o all: $(OBJTOOL) INCLUDES := -I$(srctree)/tools/include -CFLAGS += -Wall -Werror $(EXTRA_WARNINGS) -fomit-frame-pointer -O2 $(INCLUDES) +CFLAGS += -Wall -Werror $(EXTRA_WARNINGS) -fomit-frame-pointer -O2 -g $(INCLUDES) LDFLAGS += -lelf $(LIBSUBCMD) AWK = awk
Signature · 1 line
2.4.3
tip-bot for Josh Poimboeuf
merge bot[tip:core/objtool] objtool: Compile with debugging symbols
objtool: Compile with debugging symbols
Commit-ID: d435fb5ef74c31909ca58f93aa87ad09b17bbe9a Gitweb: http://git.kernel.org/tip/d435fb5ef74c31909ca58f93aa87ad09b17bbe9a Author: Josh Poimboeuf <[email protected]> AuthorDate: Wed, 9 Mar 2016 00:06:53 -0600 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 9 Mar 2016 10:48:08 +0100
objtool: Compile with debugging symbols
Compile objtool with debugging symbols ('-g') to help tools like perf and gdb understand what it's doing. Combined with '-O2', it's not always helpful, but it's better than nothing.
--- tools/objtool/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/objtool/Makefile +1 -1
@@ -27,7 +27,7 @@ OBJTOOL_IN := $(OBJTOOL)-in.o all: $(OBJTOOL) INCLUDES := -I$(srctree)/tools/include -CFLAGS += -Wall -Werror $(EXTRA_WARNINGS) -fomit-frame-pointer -O2 $(INCLUDES) +CFLAGS += -Wall -Werror $(EXTRA_WARNINGS) -fomit-frame-pointer -O2 -g $(INCLUDES) LDFLAGS += -lelf $(LIBSUBCMD) AWK = awk
PATCH 4/11 objtool: Fix false positive warnings related to sibling calls
In reply to Josh PoimboeufWith some configs [1], objtool prints a bunch of false positive warnings like:
arch/x86/events/core.o: warning: objtool: x86_del_exclusive()+0x0: frame pointer state mismatch
For some reason this config has a bunch of sibling calls. When objtool follows a sibling call jump, it attempts to compare the frame pointer state. But it also accidentally compares the FENTRY state, resulting in a false positive warning.
[1] https://lkml.kernel.org/r/[email protected]
--- tools/objtool/builtin-check.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
tools/objtool/builtin-check.c +6 -1
@@ -729,6 +729,11 @@ static bool has_valid_stack_frame(struct instruction *insn) (insn->state &STATE_FP_SETUP ); } +static unsigned int frame_state (unsigned long state) +{ +return (state & (STATE_FP_SAVED |STATE_FP_SETUP )); +} +/* * Follow the branch starting at the given instruction, and recursively follow * any other branches (jumps). Meanwhile, track the frame pointer state at
@@ -756,7 +761,7 @@ static int validate_branch(struct objtool_file *file,while (1 ) {if (insn->visited) { -if (insn->state != state) { +if (frame_state (insn->state) !=frame_state (state)) {WARN_FUNC ("frame pointer state mismatch" , sec, insn->offset); warnings++;
Signature · 1 line
2.4.3
tip-bot for Josh Poimboeuf
merge bot[tip:core/objtool] objtool: Fix false positive warnings related to sibling calls
objtool: Fix false positive warnings related to sibling calls
Commit-ID: d8d1b2cb58540b0cf572be4715167c473193888e Gitweb: http://git.kernel.org/tip/d8d1b2cb58540b0cf572be4715167c473193888e Author: Josh Poimboeuf <[email protected]> AuthorDate: Wed, 9 Mar 2016 00:06:54 -0600 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 9 Mar 2016 10:48:08 +0100
objtool: Fix false positive warnings related to sibling calls
With some configs [1], objtool prints a bunch of false positive warnings like:
arch/x86/events/core.o: warning: objtool: x86_del_exclusive()+0x0: frame pointer state mismatch
For some reason this config has a bunch of sibling calls. When objtool follows a sibling call jump, it attempts to compare the frame pointer state. But it also accidentally compares the FENTRY state, resulting in a false positive warning.
[1] https://lkml.kernel.org/r/[email protected]
--- tools/objtool/builtin-check.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
tools/objtool/builtin-check.c +6 -1
@@ -729,6 +729,11 @@ static bool has_valid_stack_frame(struct instruction *insn) (insn->state &STATE_FP_SETUP ); } +static unsigned int frame_state (unsigned long state) +{ +return (state & (STATE_FP_SAVED |STATE_FP_SETUP )); +} +/* * Follow the branch starting at the given instruction, and recursively follow * any other branches (jumps). Meanwhile, track the frame pointer state at
@@ -756,7 +761,7 @@ static int validate_branch(struct objtool_file *file,while (1 ) {if (insn->visited) { -if (insn->state != state) { +if (frame_state (insn->state) !=frame_state (state)) {WARN_FUNC ("frame pointer state mismatch" , sec, insn->offset); warnings++;
PATCH 5/11 objtool: Add helper macros for traversing instructions
In reply to Josh PoimboeufAdd some helper macros to make it easier to traverse instructions, and to abstract the details of the instruction list implementation in preparation for creating a hash structure.
--- tools/objtool/builtin-check.c | 128 ++++++++++++++++++------------------------ 1 file changed, 55 insertions(+), 73 deletions(-)
tools/objtool/builtin-check.c +55 -73
@@ -66,9 +66,8 @@ struct objtool_file {const char *objname;static bool nofp; -static struct instruction *find_instruction (struct objtool_file *file, -struct section *sec, -unsigned long offset) +static struct instruction *find_insn (struct objtool_file *file, +struct section *sec,unsigned long offset) {struct instruction *insn;
@@ -79,6 +78,31 @@ static struct instruction *find_instruction(struct objtool_file *file,return NULL ; } +static struct instruction *next_insn_same_sec (struct objtool_file *file, +struct instruction *insn) +{ +struct instruction *next =list_next_entry (insn, list); + +if (&next->list == &file->insns || next->sec != insn->sec) +return NULL ; + +return next; +} + +#define for_each_insn (file, insn) \ + list_for_each_entry(insn, &file->insns, list) + +#define func_for_each_insn (file, func, insn) \ + for (insn = find_insn(file, func->sec, func->offset); \ + insn && &insn->list != &file->insns && \ + insn->sec == func->sec && \ + insn->offset < func->offset + func->len; \ + insn = list_next_entry(insn, list)) + +#define sec_for_each_insn_from (file, insn) \ + for (; insn; insn = next_insn_same_sec(file, insn)) + +/* * Check if the function has been manually whitelisted with the * STACK_FRAME_NON_STANDARD macro, or if it should be automatically whitelisted
@@ -99,16 +123,9 @@ static bool ignore_func(struct objtool_file *file, struct symbol *func)return true;/* check if it has a context switching instruction */ - insn =find_instruction (file, func->sec, func->offset); -if (!insn) -return false; -list_for_each_entry_from (insn, &file->insns, list) { -if (insn->sec != func->sec || - insn->offset >= func->offset + func->len) -break ; +func_for_each_insn (file, func, insn)if (insn->type ==INSN_CONTEXT_SWITCH )return true; - }return false; }
@@ -131,7 +148,7 @@ static int __dead_end_function(struct objtool_file *file, struct symbol *func, int recursion) {int i; -struct instruction *insn, *func_insn; +struct instruction *insn;bool empty = true;/*
@@ -160,16 +177,7 @@ static int __dead_end_function(struct objtool_file *file, struct symbol *func,if (!func->sec)return 0 ; - func_insn =find_instruction (file, func->sec, func->offset); -if (!func_insn) -return 0 ; - - insn = func_insn; -list_for_each_entry_from (insn, &file->insns, list) { -if (insn->sec != func->sec || - insn->offset >= func->offset + func->len) -break ; - +func_for_each_insn (file, func, insn) { empty = false;if (insn->type ==INSN_RETURN )
@@ -184,8 +192,7 @@ static int __dead_end_function(struct objtool_file *file, struct symbol *func,* case, the function's dead-end status depends on whether the target * of the sibling call returns. */ - insn = func_insn; -list_for_each_entry_from (insn, &file->insns, list) { +func_for_each_insn (file, func, insn) {if (insn->sec != func->sec || insn->offset >= func->offset + func->len)break ;
@@ -294,17 +301,8 @@ static void get_ignores(struct objtool_file *file)if (!ignore_func (file, func))continue ; - insn =find_instruction (file, sec, func->offset); -if (!insn) -continue ; - -list_for_each_entry_from (insn, &file->insns, list) { -if (insn->sec != func->sec || - insn->offset >= func->offset + func->len) -break ; - +func_for_each_insn (file, func, insn) insn->visited = true; - } } } }
@@ -319,7 +317,7 @@ static int get_jump_destinations(struct objtool_file *file)struct section *dest_sec;unsigned long dest_off; -list_for_each_entry (insn, &file->insns, list) { +for_each_insn (file, insn) {if (insn->type !=INSN_JUMP_CONDITIONAL && insn->type !=INSN_JUMP_UNCONDITIONAL )continue ;
@@ -345,7 +343,7 @@ static int get_jump_destinations(struct objtool_file *file)continue ; } - insn->jump_dest =find_instruction (file, dest_sec, dest_off); + insn->jump_dest =find_insn (file, dest_sec, dest_off);if (!insn->jump_dest) {/*
@@ -375,7 +373,7 @@ static int get_call_destinations(struct objtool_file *file)unsigned long dest_off;struct rela *rela; -list_for_each_entry (insn, &file->insns, list) { +for_each_insn (file, insn) {if (insn->type !=INSN_CALL )continue ;
@@ -438,9 +436,8 @@ static int handle_group_alt(struct objtool_file *file, last_orig_insn =NULL ; insn = orig_insn; -list_for_each_entry_from (insn, &file->insns, list) { -if (insn->sec != special_alt->orig_sec || - insn->offset >= special_alt->orig_off + special_alt->orig_len) +sec_for_each_insn_from (file, insn) { +if (insn->offset >= special_alt->orig_off + special_alt->orig_len)break ;if (special_alt->skip_orig)
@@ -450,8 +447,7 @@ static int handle_group_alt(struct objtool_file *file, last_orig_insn = insn; } -if (list_is_last (&last_orig_insn->list, &file->insns) || -list_next_entry (last_orig_insn, list)->sec != special_alt->orig_sec) { +if (!next_insn_same_sec (file, last_orig_insn)) {WARN ("%s: don't know how to handle alternatives at end of section" , special_alt->orig_sec->name);return -1 ;
@@ -476,9 +472,8 @@ static int handle_group_alt(struct objtool_file *file, last_new_insn =NULL ; insn = *new_insn; -list_for_each_entry_from (insn, &file->insns, list) { -if (insn->sec != special_alt->new_sec || - insn->offset >= special_alt->new_off + special_alt->new_len) +sec_for_each_insn_from (file, insn) { +if (insn->offset >= special_alt->new_off + special_alt->new_len)break ; last_new_insn = insn;
@@ -561,8 +556,8 @@ static int get_special_section_alts(struct objtool_file *file) goto out; } - orig_insn =find_instruction (file, special_alt->orig_sec, - special_alt->orig_off); + orig_insn =find_insn (file, special_alt->orig_sec, + special_alt->orig_off);if (!orig_insn) {WARN_FUNC ("special: can't find orig instruction" , special_alt->orig_sec, special_alt->orig_off);
@@ -572,8 +567,8 @@ static int get_special_section_alts(struct objtool_file *file) new_insn =NULL ;if (!special_alt->group || special_alt->new_len) { - new_insn =find_instruction (file, special_alt->new_sec, - special_alt->new_off); + new_insn =find_insn (file, special_alt->new_sec, + special_alt->new_off);if (!new_insn) { WARN_FUNC("special: can't find new instruction", special_alt->new_sec,
@@ -619,7 +614,7 @@ static int get_switch_alts(struct objtool_file *file)struct symbol *func;struct alternative *alt; -list_for_each_entry (insn, &file->insns, list) { +for_each_insn (file, insn) {if (insn->type !=INSN_JUMP_DYNAMIC )continue ;
@@ -655,8 +650,7 @@ static int get_switch_alts(struct objtool_file *file) rela->addend >= func->offset + func->len)break ; - alt_insn =find_instruction (file, insn->sec, - rela->addend); + alt_insn =find_insn (file, insn->sec, rela->addend);if (!alt_insn) { WARN("%s: can't find instruction at %s+0x%x", rodata->rela->name, insn->sec->name,
@@ -881,9 +875,8 @@ static int validate_branch(struct objtool_file *file,break ; } - insn =list_next_entry (insn, list); - -if (&insn->list == &file->insns || insn->sec != sec) { + insn =next_insn_same_sec (file, insn); +if (!insn) {WARN ("%s: unexpected end of section" , sec->name); warnings++;return warnings;
@@ -934,8 +927,8 @@ static bool is_ubsan_insn(struct instruction *insn) "__ubsan_handle_builtin_unreachable")); } -static bool ignore_unreachable_insn (struct instruction *insn, -unsigned long func_end) +static bool ignore_unreachable_insn (struct symbol *func, +struct instruction *insn) {int i;
@@ -961,7 +954,7 @@ static bool ignore_unreachable_insn(struct instruction *insn,continue ; } -if (insn->offset + insn->len >= func_end) +if (insn->offset + insn->len >= func->offset + func->len)break ; insn =list_next_entry (insn, list); }
@@ -974,7 +967,6 @@ static int validate_functions(struct objtool_file *file)struct section *sec;struct symbol *func;struct instruction *insn; -unsigned long func_end;int ret, warnings =0 ;list_for_each_entry (sec, &file->elf->sections, list) {
@@ -982,7 +974,7 @@ static int validate_functions(struct objtool_file *file)if (func->type !=STT_FUNC )continue ; - insn =find_instruction (file, sec, func->offset); + insn =find_insn (file, sec, func->offset);if (!insn) {WARN ("%s(): can't find starting instruction" , func->name);
@@ -1000,21 +992,11 @@ static int validate_functions(struct objtool_file *file)if (func->type !=STT_FUNC )continue ; - insn =find_instruction (file, sec, func->offset); -if (!insn) -continue ; - - func_end = func->offset + func->len; - -list_for_each_entry_from (insn, &file->insns, list) { -if (insn->sec != func->sec || - insn->offset >= func_end) -break ; - +func_for_each_insn (file, func, insn) {if (insn->visited)continue ; -if (!ignore_unreachable_insn (insn, func_end)) { +if (!ignore_unreachable_insn (func, insn)) {WARN_FUNC ("function has unreachable instruction" , insn->sec, insn->offset); warnings++; }
@@ -1032,7 +1014,7 @@ static int validate_uncallable_instructions(struct objtool_file *file)struct instruction *insn;int warnings =0 ; -list_for_each_entry (insn, &file->insns, list) { +for_each_insn (file, insn) {if (!insn->visited && insn->type ==INSN_RETURN ) {WARN_FUNC ("return instruction outside of a callable function" , insn->sec, insn->offset);
Signature · 1 line
2.4.3
tip-bot for Josh Poimboeuf
merge bot[tip:core/objtool] objtool: Add helper macros for traversing instructions
objtool: Add helper macros for traversing instructions
Commit-ID: 74aec058beb0bdaf64454291ef4ba176932bfad3 Gitweb: http://git.kernel.org/tip/74aec058beb0bdaf64454291ef4ba176932bfad3 Author: Josh Poimboeuf <[email protected]> AuthorDate: Wed, 9 Mar 2016 00:06:55 -0600 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 9 Mar 2016 10:48:08 +0100
objtool: Add helper macros for traversing instructions
Add some helper macros to make it easier to traverse instructions, and to abstract the details of the instruction list implementation in preparation for creating a hash structure.
--- tools/objtool/builtin-check.c | 128 ++++++++++++++++++------------------------ 1 file changed, 55 insertions(+), 73 deletions(-)
tools/objtool/builtin-check.c +55 -73
@@ -66,9 +66,8 @@ struct objtool_file {const char *objname;static bool nofp; -static struct instruction *find_instruction (struct objtool_file *file, -struct section *sec, -unsigned long offset) +static struct instruction *find_insn (struct objtool_file *file, +struct section *sec,unsigned long offset) {struct instruction *insn;
@@ -79,6 +78,31 @@ static struct instruction *find_instruction(struct objtool_file *file,return NULL ; } +static struct instruction *next_insn_same_sec (struct objtool_file *file, +struct instruction *insn) +{ +struct instruction *next =list_next_entry (insn, list); + +if (&next->list == &file->insns || next->sec != insn->sec) +return NULL ; + +return next; +} + +#define for_each_insn (file, insn) \ + list_for_each_entry(insn, &file->insns, list) + +#define func_for_each_insn (file, func, insn) \ + for (insn = find_insn(file, func->sec, func->offset); \ + insn && &insn->list != &file->insns && \ + insn->sec == func->sec && \ + insn->offset < func->offset + func->len; \ + insn = list_next_entry(insn, list)) + +#define sec_for_each_insn_from (file, insn) \ + for (; insn; insn = next_insn_same_sec(file, insn)) + +/* * Check if the function has been manually whitelisted with the * STACK_FRAME_NON_STANDARD macro, or if it should be automatically whitelisted
@@ -99,16 +123,9 @@ static bool ignore_func(struct objtool_file *file, struct symbol *func)return true;/* check if it has a context switching instruction */ - insn =find_instruction (file, func->sec, func->offset); -if (!insn) -return false; -list_for_each_entry_from (insn, &file->insns, list) { -if (insn->sec != func->sec || - insn->offset >= func->offset + func->len) -break ; +func_for_each_insn (file, func, insn)if (insn->type ==INSN_CONTEXT_SWITCH )return true; - }return false; }
@@ -131,7 +148,7 @@ static int __dead_end_function(struct objtool_file *file, struct symbol *func, int recursion) {int i; -struct instruction *insn, *func_insn; +struct instruction *insn;bool empty = true;/*
@@ -160,16 +177,7 @@ static int __dead_end_function(struct objtool_file *file, struct symbol *func,if (!func->sec)return 0 ; - func_insn =find_instruction (file, func->sec, func->offset); -if (!func_insn) -return 0 ; - - insn = func_insn; -list_for_each_entry_from (insn, &file->insns, list) { -if (insn->sec != func->sec || - insn->offset >= func->offset + func->len) -break ; - +func_for_each_insn (file, func, insn) { empty = false;if (insn->type ==INSN_RETURN )
@@ -184,8 +192,7 @@ static int __dead_end_function(struct objtool_file *file, struct symbol *func,* case, the function's dead-end status depends on whether the target * of the sibling call returns. */ - insn = func_insn; -list_for_each_entry_from (insn, &file->insns, list) { +func_for_each_insn (file, func, insn) {if (insn->sec != func->sec || insn->offset >= func->offset + func->len)break ;
@@ -294,17 +301,8 @@ static void get_ignores(struct objtool_file *file)if (!ignore_func (file, func))continue ; - insn =find_instruction (file, sec, func->offset); -if (!insn) -continue ; - -list_for_each_entry_from (insn, &file->insns, list) { -if (insn->sec != func->sec || - insn->offset >= func->offset + func->len) -break ; - +func_for_each_insn (file, func, insn) insn->visited = true; - } } } }
@@ -319,7 +317,7 @@ static int get_jump_destinations(struct objtool_file *file)struct section *dest_sec;unsigned long dest_off; -list_for_each_entry (insn, &file->insns, list) { +for_each_insn (file, insn) {if (insn->type !=INSN_JUMP_CONDITIONAL && insn->type !=INSN_JUMP_UNCONDITIONAL )continue ;
@@ -345,7 +343,7 @@ static int get_jump_destinations(struct objtool_file *file)continue ; } - insn->jump_dest =find_instruction (file, dest_sec, dest_off); + insn->jump_dest =find_insn (file, dest_sec, dest_off);if (!insn->jump_dest) {/*
@@ -375,7 +373,7 @@ static int get_call_destinations(struct objtool_file *file)unsigned long dest_off;struct rela *rela; -list_for_each_entry (insn, &file->insns, list) { +for_each_insn (file, insn) {if (insn->type !=INSN_CALL )continue ;
@@ -438,9 +436,8 @@ static int handle_group_alt(struct objtool_file *file, last_orig_insn =NULL ; insn = orig_insn; -list_for_each_entry_from (insn, &file->insns, list) { -if (insn->sec != special_alt->orig_sec || - insn->offset >= special_alt->orig_off + special_alt->orig_len) +sec_for_each_insn_from (file, insn) { +if (insn->offset >= special_alt->orig_off + special_alt->orig_len)break ;if (special_alt->skip_orig)
@@ -450,8 +447,7 @@ static int handle_group_alt(struct objtool_file *file, last_orig_insn = insn; } -if (list_is_last (&last_orig_insn->list, &file->insns) || -list_next_entry (last_orig_insn, list)->sec != special_alt->orig_sec) { +if (!next_insn_same_sec (file, last_orig_insn)) {WARN ("%s: don't know how to handle alternatives at end of section" , special_alt->orig_sec->name);return -1 ;
@@ -476,9 +472,8 @@ static int handle_group_alt(struct objtool_file *file, last_new_insn =NULL ; insn = *new_insn; -list_for_each_entry_from (insn, &file->insns, list) { -if (insn->sec != special_alt->new_sec || - insn->offset >= special_alt->new_off + special_alt->new_len) +sec_for_each_insn_from (file, insn) { +if (insn->offset >= special_alt->new_off + special_alt->new_len)break ; last_new_insn = insn;
@@ -561,8 +556,8 @@ static int get_special_section_alts(struct objtool_file *file) goto out; } - orig_insn =find_instruction (file, special_alt->orig_sec, - special_alt->orig_off); + orig_insn =find_insn (file, special_alt->orig_sec, + special_alt->orig_off);if (!orig_insn) {WARN_FUNC ("special: can't find orig instruction" , special_alt->orig_sec, special_alt->orig_off);
@@ -572,8 +567,8 @@ static int get_special_section_alts(struct objtool_file *file) new_insn =NULL ;if (!special_alt->group || special_alt->new_len) { - new_insn =find_instruction (file, special_alt->new_sec, - special_alt->new_off); + new_insn =find_insn (file, special_alt->new_sec, + special_alt->new_off);if (!new_insn) { WARN_FUNC("special: can't find new instruction", special_alt->new_sec,
@@ -619,7 +614,7 @@ static int get_switch_alts(struct objtool_file *file)struct symbol *func;struct alternative *alt; -list_for_each_entry (insn, &file->insns, list) { +for_each_insn (file, insn) {if (insn->type !=INSN_JUMP_DYNAMIC )continue ;
@@ -655,8 +650,7 @@ static int get_switch_alts(struct objtool_file *file) rela->addend >= func->offset + func->len)break ; - alt_insn =find_instruction (file, insn->sec, - rela->addend); + alt_insn =find_insn (file, insn->sec, rela->addend);if (!alt_insn) { WARN("%s: can't find instruction at %s+0x%x", rodata->rela->name, insn->sec->name,
@@ -881,9 +875,8 @@ static int validate_branch(struct objtool_file *file,break ; } - insn =list_next_entry (insn, list); - -if (&insn->list == &file->insns || insn->sec != sec) { + insn =next_insn_same_sec (file, insn); +if (!insn) {WARN ("%s: unexpected end of section" , sec->name); warnings++;return warnings;
@@ -934,8 +927,8 @@ static bool is_ubsan_insn(struct instruction *insn) "__ubsan_handle_builtin_unreachable")); } -static bool ignore_unreachable_insn (struct instruction *insn, -unsigned long func_end) +static bool ignore_unreachable_insn (struct symbol *func, +struct instruction *insn) {int i;
@@ -961,7 +954,7 @@ static bool ignore_unreachable_insn(struct instruction *insn,continue ; } -if (insn->offset + insn->len >= func_end) +if (insn->offset + insn->len >= func->offset + func->len)break ; insn =list_next_entry (insn, list); }
@@ -974,7 +967,6 @@ static int validate_functions(struct objtool_file *file)struct section *sec;struct symbol *func;struct instruction *insn; -unsigned long func_end;int ret, warnings =0 ;list_for_each_entry (sec, &file->elf->sections, list) {
@@ -982,7 +974,7 @@ static int validate_functions(struct objtool_file *file)if (func->type !=STT_FUNC )continue ; - insn =find_instruction (file, sec, func->offset); + insn =find_insn (file, sec, func->offset);if (!insn) {WARN ("%s(): can't find starting instruction" , func->name);
@@ -1000,21 +992,11 @@ static int validate_functions(struct objtool_file *file)if (func->type !=STT_FUNC )continue ; - insn =find_instruction (file, sec, func->offset); -if (!insn) -continue ; - - func_end = func->offset + func->len; - -list_for_each_entry_from (insn, &file->insns, list) { -if (insn->sec != func->sec || - insn->offset >= func_end) -break ; - +func_for_each_insn (file, func, insn) {if (insn->visited)continue ; -if (!ignore_unreachable_insn (insn, func_end)) { +if (!ignore_unreachable_insn (func, insn)) {WARN_FUNC ("function has unreachable instruction" , insn->sec, insn->offset); warnings++; }
@@ -1032,7 +1014,7 @@ static int validate_uncallable_instructions(struct objtool_file *file)struct instruction *insn;int warnings =0 ; -list_for_each_entry (insn, &file->insns, list) { +for_each_insn (file, insn) {if (!insn->visited && insn->type ==INSN_RETURN ) {WARN_FUNC ("return instruction outside of a callable function" , insn->sec, insn->offset);
PATCH 6/11 objtool: Remove superflous INIT_LIST_HEAD
In reply to Josh PoimboeufThe insns list is initialized twice, in cmd_check() and in decode_instructions(). Remove the latter.
--- tools/objtool/builtin-check.c | 2 -- 1 file changed, 2 deletions(-)
tools/objtool/builtin-check.c +0 -2
@@ -249,8 +249,6 @@ static int decode_instructions(struct objtool_file *file)struct instruction *insn;int ret; -INIT_LIST_HEAD (&file->insns); -list_for_each_entry (sec, &file->elf->sections, list) {if (!(sec->sh.sh_flags &SHF_EXECINSTR ))
Signature · 1 line
2.4.3
tip-bot for Josh Poimboeuf
merge bot[tip:core/objtool] objtool: Remove superflous INIT_LIST_HEAD
objtool: Remove superflous INIT_LIST_HEAD
Commit-ID: e2a5f18a1ba11e8b1e9ee53b6fca4be12bb5749e Gitweb: http://git.kernel.org/tip/e2a5f18a1ba11e8b1e9ee53b6fca4be12bb5749e Author: Josh Poimboeuf <[email protected]> AuthorDate: Wed, 9 Mar 2016 00:06:56 -0600 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 9 Mar 2016 10:48:08 +0100
objtool: Remove superflous INIT_LIST_HEAD
The insns list is initialized twice, in cmd_check() and in decode_instructions(). Remove the latter.
--- tools/objtool/builtin-check.c | 2 -- 1 file changed, 2 deletions(-)
tools/objtool/builtin-check.c +0 -2
@@ -249,8 +249,6 @@ static int decode_instructions(struct objtool_file *file)struct instruction *insn;int ret; -INIT_LIST_HEAD (&file->insns); -list_for_each_entry (sec, &file->elf->sections, list) {if (!(sec->sh.sh_flags &SHF_EXECINSTR ))
PATCH 7/11 objtool: Rename some variables and functions
In reply to Josh PoimboeufRename some list heads to distinguish them from hash node heads, which are added later in the patch series.
Also rename the get_*() functions to add_*(), which is more descriptive:
they "add" data to the objtool_file struct.
Also rename rodata_rela and text_rela to be clearer:
- text_rela refers to a rela entry in .rela.text.
- rodata_rela refers to a rela entry in .rela.rodata.
--- tools/objtool/builtin-check.c | 80 ++++++++++++++++++++++--------------------- tools/objtool/elf.c | 22 ++++++------ tools/objtool/elf.h | 4 +-- 3 files changed, 54 insertions(+), 52 deletions(-)
tools/objtool/builtin-check.c +41 -39
@@ -60,7 +60,7 @@ struct alternative {struct objtool_file {struct elf *elf; -struct list_head insns; +struct list_head insn_list; };const char *objname;
@@ -71,7 +71,7 @@ static struct instruction *find_insn(struct objtool_file *file, {struct instruction *insn; -list_for_each_entry (insn, &file->insns, list) +list_for_each_entry (insn, &file->insn_list, list)if (insn->sec == sec && insn->offset == offset)return insn;
@@ -83,18 +83,18 @@ static struct instruction *next_insn_same_sec(struct objtool_file *file, {struct instruction *next =list_next_entry (insn, list); -if (&next->list == &file->insns || next->sec != insn->sec) +if (&next->list == &file->insn_list || next->sec != insn->sec)return NULL ;return next; }#define for_each_insn (file, insn) \ - list_for_each_entry(insn, &file->insns, list) + list_for_each_entry(insn, &file->insn_list, list)#define func_for_each_insn (file, func, insn) \ for (insn = find_insn(file, func->sec, func->offset); \ - insn && &insn->list != &file->insns && \ + insn && &insn->list != &file->insn_list && \ insn->sec == func->sec && \ insn->offset < func->offset + func->len; \ insn = list_next_entry(insn, list))
@@ -117,7 +117,7 @@ static bool ignore_func(struct objtool_file *file, struct symbol *func)/* check for STACK_FRAME_NON_STANDARD */ macro_sec =find_section_by_name (file->elf,"__func_stack_frame_non_standard" );if (macro_sec && macro_sec->rela) -list_for_each_entry (rela, ¯o_sec->rela->relas, list) +list_for_each_entry (rela, ¯o_sec->rela->rela_list, list)if (rela->sym->sec == func->sec && rela->addend == func->offset)return true;
@@ -240,7 +240,7 @@ static int dead_end_function(struct objtool_file *file, struct symbol *func)/* * Call the arch-specific instruction decoder for all the instructions and add -* them to the global insns list. +* them to the global instruction list. */ static int decode_instructions (struct objtool_file *file) {
@@ -275,7 +275,7 @@ static int decode_instructions(struct objtool_file *file)return -1 ; } -list_add_tail (&insn->list, &file->insns); +list_add_tail (&insn->list, &file->insn_list); } }
@@ -285,14 +285,14 @@ static int decode_instructions(struct objtool_file *file)/* * Warnings shouldn't be reported for ignored functions. */ -static void get_ignores (struct objtool_file *file) +static void add_ignores (struct objtool_file *file) {struct instruction *insn;struct section *sec;struct symbol *func;list_for_each_entry (sec, &file->elf->sections, list) { -list_for_each_entry (func, &sec->symbols, list) { +list_for_each_entry (func, &sec->symbol_list, list) {if (func->type !=STT_FUNC )continue ;
@@ -308,7 +308,7 @@ static void get_ignores(struct objtool_file *file)/* * Find the destination instructions for all jumps. */ -static int get_jump_destinations (struct objtool_file *file) +static int add_jump_destinations (struct objtool_file *file) {struct instruction *insn;struct rela *rela;
@@ -365,7 +365,7 @@ static int get_jump_destinations(struct objtool_file *file)/* * Find the destination instructions for all calls. */ -static int get_call_destinations (struct objtool_file *file) +static int add_call_destinations (struct objtool_file *file) {struct instruction *insn;unsigned long dest_off;
@@ -534,7 +534,7 @@ static int handle_jump_alt(struct objtool_file *file,* instruction(s) has them added to its insn->alts list, which will be * traversed in validate_branch(). */ -static int get_special_section_alts (struct objtool_file *file) +static int add_special_section_alts (struct objtool_file *file) {struct list_head special_alts;struct instruction *orig_insn, *new_insn;
@@ -604,10 +604,10 @@ out:* section which contains a list of addresses within the function to jump to. * This finds these jump tables and adds them to the insn->alts lists. */ -static int get_switch_alts (struct objtool_file *file) +static int add_switch_table_alts (struct objtool_file *file) {struct instruction *insn, *alt_insn; -struct rela *rodata_rela, *rela; +struct rela *rodata_rela, *text_rela;struct section *rodata;struct symbol *func;struct alternative *alt;
@@ -616,9 +616,9 @@ static int get_switch_alts(struct objtool_file *file)if (insn->type !=INSN_JUMP_DYNAMIC )continue ; - rodata_rela =find_rela_by_dest_range (insn->sec, insn->offset, - insn->len); -if (!rodata_rela ||strcmp (rodata_rela->sym->name,".rodata" )) + text_rela =find_rela_by_dest_range (insn->sec, insn->offset, + insn->len); +if (!text_rela ||strcmp (text_rela->sym->name,".rodata" ))continue ; rodata =find_section_by_name (file->elf,".rodata" );
@@ -626,13 +626,13 @@ static int get_switch_alts(struct objtool_file *file)continue ;/* common case: jmpq *[addr](,%rax,8) */ - rela =find_rela_by_dest (rodata, rodata_rela->addend); + rodata_rela =find_rela_by_dest (rodata, text_rela->addend);/* rare case: jmpq *[addr](%rip) */ -if (!rela) - rela =find_rela_by_dest (rodata, - rodata_rela->addend +4 ); -if (!rela) +if (!rodata_rela) + rodata_rela =find_rela_by_dest (rodata, + text_rela->addend +4 ); +if (!rodata_rela)continue ; func =find_containing_func (insn->sec, insn->offset);
@@ -642,17 +642,19 @@ static int get_switch_alts(struct objtool_file *file)return -1 ; } -list_for_each_entry_from (rela, &rodata->rela->relas, list) { -if (rela->sym->sec != insn->sec || - rela->addend <= func->offset || - rela->addend >= func->offset + func->len) +list_for_each_entry_from (rodata_rela, &rodata->rela->rela_list, + list) { +if (rodata_rela->sym->sec != insn->sec || + rodata_rela->addend <= func->offset || + rodata_rela->addend >= func->offset + func->len)break ; - alt_insn =find_insn (file, insn->sec, rela->addend); + alt_insn =find_insn (file, insn->sec, + rodata_rela->addend);if (!alt_insn) {WARN ("%s: can't find instruction at %s+0x%x" , rodata->rela->name, insn->sec->name, - rela->addend); + rodata_rela->addend);return -1 ; }
@@ -678,21 +680,21 @@ static int decode_sections(struct objtool_file *file)if (ret)return ret; -get_ignores (file); +add_ignores (file); - ret =get_jump_destinations (file); + ret =add_jump_destinations (file);if (ret)return ret; - ret =get_call_destinations (file); + ret =add_call_destinations (file);if (ret)return ret; - ret =get_special_section_alts (file); + ret =add_special_section_alts (file);if (ret)return ret; - ret =get_switch_alts (file); + ret =add_switch_table_alts (file);if (ret)return ret;
@@ -901,7 +903,7 @@ static bool is_gcov_insn(struct instruction *insn) sec = rela->sym->sec; offset = rela->addend + insn->offset + insn->len - rela->offset; -list_for_each_entry (sym, &sec->symbols, list) { +list_for_each_entry (sym, &sec->symbol_list, list) {if (sym->type !=STT_OBJECT )continue ;
@@ -968,7 +970,7 @@ static int validate_functions(struct objtool_file *file)int ret, warnings =0 ;list_for_each_entry (sec, &file->elf->sections, list) { -list_for_each_entry (func, &sec->symbols, list) { +list_for_each_entry (func, &sec->symbol_list, list) {if (func->type !=STT_FUNC )continue ;
@@ -986,7 +988,7 @@ static int validate_functions(struct objtool_file *file) }list_for_each_entry (sec, &file->elf->sections, list) { -list_for_each_entry (func, &sec->symbols, list) { +list_for_each_entry (func, &sec->symbol_list, list) {if (func->type !=STT_FUNC )continue ;
@@ -1028,7 +1030,7 @@ static void cleanup(struct objtool_file *file)struct instruction *insn, *tmpinsn;struct alternative *alt, *tmpalt; -list_for_each_entry_safe (insn, tmpinsn, &file->insns, list) { +list_for_each_entry_safe (insn, tmpinsn, &file->insn_list, list) {list_for_each_entry_safe (alt, tmpalt, &insn->alts, list) {list_del (&alt->list);free (alt);
@@ -1067,7 +1069,7 @@ int cmd_check(int argc, const char **argv)return 1 ; } -INIT_LIST_HEAD (&file.insns); +INIT_LIST_HEAD (&file.insn_list); ret =decode_sections (&file);if (ret <0 )
tools/objtool/elf.c +11 -11
@@ -59,7 +59,7 @@ static struct symbol *find_symbol_by_index(struct elf *elf, unsigned int idx)struct symbol *sym;list_for_each_entry (sec, &elf->sections, list) -list_for_each_entry (sym, &sec->symbols, list) +list_for_each_entry (sym, &sec->symbol_list, list)if (sym->idx == idx)return sym;
@@ -70,7 +70,7 @@ struct symbol *find_symbol_by_offset(struct section *sec, unsigned long offset) {struct symbol *sym; -list_for_each_entry (sym, &sec->symbols, list) +list_for_each_entry (sym, &sec->symbol_list, list)if (sym->type !=STT_SECTION && sym->offset == offset)return sym;
@@ -86,7 +86,7 @@ struct rela *find_rela_by_dest_range(struct section *sec, unsigned long offset,if (!sec->rela)return NULL ; -list_for_each_entry (rela, &sec->rela->relas, list) +list_for_each_entry (rela, &sec->rela->rela_list, list)if (rela->offset >= offset && rela->offset < offset + len)return rela;
@@ -102,7 +102,7 @@ struct symbol *find_containing_func(struct section *sec, unsigned long offset) {struct symbol *func; -list_for_each_entry (func, &sec->symbols, list) +list_for_each_entry (func, &sec->symbol_list, list)if (func->type ==STT_FUNC && offset >= func->offset && offset < func->offset + func->len)return func;
@@ -135,8 +135,8 @@ static int read_sections(struct elf *elf) }memset (sec,0 ,sizeof (*sec)); -INIT_LIST_HEAD (&sec->symbols); -INIT_LIST_HEAD (&sec->relas); +INIT_LIST_HEAD (&sec->symbol_list); +INIT_LIST_HEAD (&sec->rela_list);list_add_tail (&sec->list, &elf->sections);
@@ -244,8 +244,8 @@ static int read_symbols(struct elf *elf) sym->len = sym->sym.st_size;/* sorted insert into a per-section list */ - entry = &sym->sec->symbols; -list_for_each_prev (tmp, &sym->sec->symbols) { + entry = &sym->sec->symbol_list; +list_for_each_prev (tmp, &sym->sec->symbol_list) {struct symbol *s; s = list_entry(tmp, struct symbol, list);
@@ -298,7 +298,7 @@ static int read_relas(struct elf *elf) }memset (rela,0 ,sizeof (*rela)); -list_add_tail (&rela->list, &sec->relas); +list_add_tail (&rela->list, &sec->rela_list);if (!gelf_getrela (sec->elf_data, i, &rela->rela)) {perror ("gelf_getrela" );
@@ -382,11 +382,11 @@ void elf_close(struct elf *elf)struct rela *rela, *tmprela;list_for_each_entry_safe (sec, tmpsec, &elf->sections, list) { -list_for_each_entry_safe (sym, tmpsym, &sec->symbols, list) { +list_for_each_entry_safe (sym, tmpsym, &sec->symbol_list, list) {list_del (&sym->list);free (sym); } -list_for_each_entry_safe (rela, tmprela, &sec->relas, list) { +list_for_each_entry_safe (rela, tmprela, &sec->rela_list, list) {list_del (&rela->list);free (rela); }
tools/objtool/elf.h +2 -2
@@ -25,8 +25,8 @@struct section {struct list_head list;GElf_Shdr sh; -struct list_head symbols; -struct list_head relas; +struct list_head symbol_list; +struct list_head rela_list;struct section *base, *rela;struct symbol *sym;Elf_Data *elf_data;
Signature · 1 line
2.4.3
tip-bot for Josh Poimboeuf
merge bot[tip:core/objtool] objtool: Rename some variables and functions
objtool: Rename some variables and functions
Commit-ID: a196e17198224cacd2d992f12cb6d81d354de82f Gitweb: http://git.kernel.org/tip/a196e17198224cacd2d992f12cb6d81d354de82f Author: Josh Poimboeuf <[email protected]> AuthorDate: Wed, 9 Mar 2016 00:06:57 -0600 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 9 Mar 2016 10:48:09 +0100
objtool: Rename some variables and functions
Rename some list heads to distinguish them from hash node heads, which are added later in the patch series.
Also rename the get_*() functions to add_*(), which is more descriptive:
they "add" data to the objtool_file struct.
Also rename rodata_rela and text_rela to be clearer:
- text_rela refers to a rela entry in .rela.text.
- rodata_rela refers to a rela entry in .rela.rodata.
--- tools/objtool/builtin-check.c | 80 ++++++++++++++++++++++--------------------- tools/objtool/elf.c | 22 ++++++------ tools/objtool/elf.h | 4 +-- 3 files changed, 54 insertions(+), 52 deletions(-)
tools/objtool/builtin-check.c +41 -39
@@ -60,7 +60,7 @@ struct alternative {struct objtool_file {struct elf *elf; -struct list_head insns; +struct list_head insn_list; };const char *objname;
@@ -71,7 +71,7 @@ static struct instruction *find_insn(struct objtool_file *file, {struct instruction *insn; -list_for_each_entry (insn, &file->insns, list) +list_for_each_entry (insn, &file->insn_list, list)if (insn->sec == sec && insn->offset == offset)return insn;
@@ -83,18 +83,18 @@ static struct instruction *next_insn_same_sec(struct objtool_file *file, {struct instruction *next =list_next_entry (insn, list); -if (&next->list == &file->insns || next->sec != insn->sec) +if (&next->list == &file->insn_list || next->sec != insn->sec)return NULL ;return next; }#define for_each_insn (file, insn) \ - list_for_each_entry(insn, &file->insns, list) + list_for_each_entry(insn, &file->insn_list, list)#define func_for_each_insn (file, func, insn) \ for (insn = find_insn(file, func->sec, func->offset); \ - insn && &insn->list != &file->insns && \ + insn && &insn->list != &file->insn_list && \ insn->sec == func->sec && \ insn->offset < func->offset + func->len; \ insn = list_next_entry(insn, list))
@@ -117,7 +117,7 @@ static bool ignore_func(struct objtool_file *file, struct symbol *func)/* check for STACK_FRAME_NON_STANDARD */ macro_sec =find_section_by_name (file->elf,"__func_stack_frame_non_standard" );if (macro_sec && macro_sec->rela) -list_for_each_entry (rela, ¯o_sec->rela->relas, list) +list_for_each_entry (rela, ¯o_sec->rela->rela_list, list)if (rela->sym->sec == func->sec && rela->addend == func->offset)return true;
@@ -240,7 +240,7 @@ static int dead_end_function(struct objtool_file *file, struct symbol *func)/* * Call the arch-specific instruction decoder for all the instructions and add -* them to the global insns list. +* them to the global instruction list. */ static int decode_instructions (struct objtool_file *file) {
@@ -275,7 +275,7 @@ static int decode_instructions(struct objtool_file *file)return -1 ; } -list_add_tail (&insn->list, &file->insns); +list_add_tail (&insn->list, &file->insn_list); } }
@@ -285,14 +285,14 @@ static int decode_instructions(struct objtool_file *file)/* * Warnings shouldn't be reported for ignored functions. */ -static void get_ignores (struct objtool_file *file) +static void add_ignores (struct objtool_file *file) {struct instruction *insn;struct section *sec;struct symbol *func;list_for_each_entry (sec, &file->elf->sections, list) { -list_for_each_entry (func, &sec->symbols, list) { +list_for_each_entry (func, &sec->symbol_list, list) {if (func->type !=STT_FUNC )continue ;
@@ -308,7 +308,7 @@ static void get_ignores(struct objtool_file *file)/* * Find the destination instructions for all jumps. */ -static int get_jump_destinations (struct objtool_file *file) +static int add_jump_destinations (struct objtool_file *file) {struct instruction *insn;struct rela *rela;
@@ -365,7 +365,7 @@ static int get_jump_destinations(struct objtool_file *file)/* * Find the destination instructions for all calls. */ -static int get_call_destinations (struct objtool_file *file) +static int add_call_destinations (struct objtool_file *file) {struct instruction *insn;unsigned long dest_off;
@@ -534,7 +534,7 @@ static int handle_jump_alt(struct objtool_file *file,* instruction(s) has them added to its insn->alts list, which will be * traversed in validate_branch(). */ -static int get_special_section_alts (struct objtool_file *file) +static int add_special_section_alts (struct objtool_file *file) {struct list_head special_alts;struct instruction *orig_insn, *new_insn;
@@ -604,10 +604,10 @@ out:* section which contains a list of addresses within the function to jump to. * This finds these jump tables and adds them to the insn->alts lists. */ -static int get_switch_alts (struct objtool_file *file) +static int add_switch_table_alts (struct objtool_file *file) {struct instruction *insn, *alt_insn; -struct rela *rodata_rela, *rela; +struct rela *rodata_rela, *text_rela;struct section *rodata;struct symbol *func;struct alternative *alt;
@@ -616,9 +616,9 @@ static int get_switch_alts(struct objtool_file *file)if (insn->type !=INSN_JUMP_DYNAMIC )continue ; - rodata_rela =find_rela_by_dest_range (insn->sec, insn->offset, - insn->len); -if (!rodata_rela ||strcmp (rodata_rela->sym->name,".rodata" )) + text_rela =find_rela_by_dest_range (insn->sec, insn->offset, + insn->len); +if (!text_rela ||strcmp (text_rela->sym->name,".rodata" ))continue ; rodata =find_section_by_name (file->elf,".rodata" );
@@ -626,13 +626,13 @@ static int get_switch_alts(struct objtool_file *file)continue ;/* common case: jmpq *[addr](,%rax,8) */ - rela =find_rela_by_dest (rodata, rodata_rela->addend); + rodata_rela =find_rela_by_dest (rodata, text_rela->addend);/* rare case: jmpq *[addr](%rip) */ -if (!rela) - rela =find_rela_by_dest (rodata, - rodata_rela->addend +4 ); -if (!rela) +if (!rodata_rela) + rodata_rela =find_rela_by_dest (rodata, + text_rela->addend +4 ); +if (!rodata_rela)continue ; func =find_containing_func (insn->sec, insn->offset);
@@ -642,17 +642,19 @@ static int get_switch_alts(struct objtool_file *file)return -1 ; } -list_for_each_entry_from (rela, &rodata->rela->relas, list) { -if (rela->sym->sec != insn->sec || - rela->addend <= func->offset || - rela->addend >= func->offset + func->len) +list_for_each_entry_from (rodata_rela, &rodata->rela->rela_list, + list) { +if (rodata_rela->sym->sec != insn->sec || + rodata_rela->addend <= func->offset || + rodata_rela->addend >= func->offset + func->len)break ; - alt_insn =find_insn (file, insn->sec, rela->addend); + alt_insn =find_insn (file, insn->sec, + rodata_rela->addend);if (!alt_insn) {WARN ("%s: can't find instruction at %s+0x%x" , rodata->rela->name, insn->sec->name, - rela->addend); + rodata_rela->addend);return -1 ; }
@@ -678,21 +680,21 @@ static int decode_sections(struct objtool_file *file)if (ret)return ret; -get_ignores (file); +add_ignores (file); - ret =get_jump_destinations (file); + ret =add_jump_destinations (file);if (ret)return ret; - ret =get_call_destinations (file); + ret =add_call_destinations (file);if (ret)return ret; - ret =get_special_section_alts (file); + ret =add_special_section_alts (file);if (ret)return ret; - ret =get_switch_alts (file); + ret =add_switch_table_alts (file);if (ret)return ret;
@@ -901,7 +903,7 @@ static bool is_gcov_insn(struct instruction *insn) sec = rela->sym->sec; offset = rela->addend + insn->offset + insn->len - rela->offset; -list_for_each_entry (sym, &sec->symbols, list) { +list_for_each_entry (sym, &sec->symbol_list, list) {if (sym->type !=STT_OBJECT )continue ;
@@ -968,7 +970,7 @@ static int validate_functions(struct objtool_file *file)int ret, warnings =0 ;list_for_each_entry (sec, &file->elf->sections, list) { -list_for_each_entry (func, &sec->symbols, list) { +list_for_each_entry (func, &sec->symbol_list, list) {if (func->type !=STT_FUNC )continue ;
@@ -986,7 +988,7 @@ static int validate_functions(struct objtool_file *file) }list_for_each_entry (sec, &file->elf->sections, list) { -list_for_each_entry (func, &sec->symbols, list) { +list_for_each_entry (func, &sec->symbol_list, list) {if (func->type !=STT_FUNC )continue ;
@@ -1028,7 +1030,7 @@ static void cleanup(struct objtool_file *file)struct instruction *insn, *tmpinsn;struct alternative *alt, *tmpalt; -list_for_each_entry_safe (insn, tmpinsn, &file->insns, list) { +list_for_each_entry_safe (insn, tmpinsn, &file->insn_list, list) {list_for_each_entry_safe (alt, tmpalt, &insn->alts, list) {list_del (&alt->list);free (alt);
@@ -1067,7 +1069,7 @@ int cmd_check(int argc, const char **argv)return 1 ; } -INIT_LIST_HEAD (&file.insns); +INIT_LIST_HEAD (&file.insn_list); ret =decode_sections (&file);if (ret <0 )
tools/objtool/elf.c +11 -11
@@ -59,7 +59,7 @@ static struct symbol *find_symbol_by_index(struct elf *elf, unsigned int idx)struct symbol *sym;list_for_each_entry (sec, &elf->sections, list) -list_for_each_entry (sym, &sec->symbols, list) +list_for_each_entry (sym, &sec->symbol_list, list)if (sym->idx == idx)return sym;
@@ -70,7 +70,7 @@ struct symbol *find_symbol_by_offset(struct section *sec, unsigned long offset) {struct symbol *sym; -list_for_each_entry (sym, &sec->symbols, list) +list_for_each_entry (sym, &sec->symbol_list, list)if (sym->type !=STT_SECTION && sym->offset == offset)return sym;
@@ -86,7 +86,7 @@ struct rela *find_rela_by_dest_range(struct section *sec, unsigned long offset,if (!sec->rela)return NULL ; -list_for_each_entry (rela, &sec->rela->relas, list) +list_for_each_entry (rela, &sec->rela->rela_list, list)if (rela->offset >= offset && rela->offset < offset + len)return rela;
@@ -102,7 +102,7 @@ struct symbol *find_containing_func(struct section *sec, unsigned long offset) {struct symbol *func; -list_for_each_entry (func, &sec->symbols, list) +list_for_each_entry (func, &sec->symbol_list, list)if (func->type ==STT_FUNC && offset >= func->offset && offset < func->offset + func->len)return func;
@@ -135,8 +135,8 @@ static int read_sections(struct elf *elf) }memset (sec,0 ,sizeof (*sec)); -INIT_LIST_HEAD (&sec->symbols); -INIT_LIST_HEAD (&sec->relas); +INIT_LIST_HEAD (&sec->symbol_list); +INIT_LIST_HEAD (&sec->rela_list);list_add_tail (&sec->list, &elf->sections);
@@ -244,8 +244,8 @@ static int read_symbols(struct elf *elf) sym->len = sym->sym.st_size;/* sorted insert into a per-section list */ - entry = &sym->sec->symbols; -list_for_each_prev (tmp, &sym->sec->symbols) { + entry = &sym->sec->symbol_list; +list_for_each_prev (tmp, &sym->sec->symbol_list) {struct symbol *s; s = list_entry(tmp, struct symbol, list);
@@ -298,7 +298,7 @@ static int read_relas(struct elf *elf) }memset (rela,0 ,sizeof (*rela)); -list_add_tail (&rela->list, &sec->relas); +list_add_tail (&rela->list, &sec->rela_list);if (!gelf_getrela (sec->elf_data, i, &rela->rela)) {perror ("gelf_getrela" );
@@ -382,11 +382,11 @@ void elf_close(struct elf *elf)struct rela *rela, *tmprela;list_for_each_entry_safe (sec, tmpsec, &elf->sections, list) { -list_for_each_entry_safe (sym, tmpsym, &sec->symbols, list) { +list_for_each_entry_safe (sym, tmpsym, &sec->symbol_list, list) {list_del (&sym->list);free (sym); } -list_for_each_entry_safe (rela, tmprela, &sec->relas, list) { +list_for_each_entry_safe (rela, tmprela, &sec->rela_list, list) {list_del (&rela->list);free (rela); }
tools/objtool/elf.h +2 -2
@@ -25,8 +25,8 @@struct section {struct list_head list;GElf_Shdr sh; -struct list_head symbols; -struct list_head relas; +struct list_head symbol_list; +struct list_head rela_list;struct section *base, *rela;struct symbol *sym;Elf_Data *elf_data;
PATCH 8/11 objtool: Fix false positive warnings for functions with multiple switch statements
In reply to Josh PoimboeufIngo reported [1] some false positive objtool warnings:
drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2e7: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2f3: frame pointer state mismatch
...
And so did the 0-day bot [2]:
drivers/gpu/drm/radeon/cik.o: warning: objtool: cik_tiling_mode_table_init()+0x6ce: call without frame pointer save/setup drivers/gpu/drm/radeon/cik.o: warning: objtool: cik_tiling_mode_table_init()+0x72b: call without frame pointer save/setup
...
Both sets of warnings involve functions which have multiple switch statements. When there's more than one switch statement in a function, objtool interprets all the switch jump tables as a single table. If the targets of one jump table assume a stack frame and the targets of another one don't, it prints false positive warnings.
Fix the bug by detecting the size of each switch jump table. For multiple tables, each one ends where the next one begins.
[1] https://lkml.kernel.org/r/[email protected]
[2] https://lists.01.org/pipermail/kbuild-all/2016-March/018124.html
--- tools/objtool/builtin-check.c | 145 +++++++++++++++++++++++++++++------------- 1 file changed, 100 insertions(+), 45 deletions(-)
tools/objtool/builtin-check.c +100 -45
@@ -61,6 +61,7 @@ struct alternative {struct objtool_file {struct elf *elf;struct list_head insn_list; +struct section *rodata; };const char *objname;
@@ -599,73 +600,125 @@ out:return ret; } -/* -* For some switch statements, gcc generates a jump table in the .rodata -* section which contains a list of addresses within the function to jump to. -* This finds these jump tables and adds them to the insn->alts lists. -*/ -static int add_switch_table_alts (struct objtool_file *file) +static int add_switch_table (struct objtool_file *file,struct symbol *func, +struct instruction *insn,struct rela *table, +struct rela *next_table) { -struct instruction *insn, *alt_insn; -struct rela *rodata_rela, *text_rela; -struct section *rodata; -struct symbol *func; +struct rela *rela = table; +struct instruction *alt_insn;struct alternative *alt; -for_each_insn (file, insn) { +list_for_each_entry_from (rela, &file->rodata->rela->rela_list, list) { +if (rela == next_table) +break ; + +if (rela->sym->sec != insn->sec || + rela->addend <= func->offset || + rela->addend >= func->offset + func->len) +break ; + + alt_insn =find_insn (file, insn->sec, rela->addend); +if (!alt_insn) { +WARN ("%s: can't find instruction at %s+0x%x" , + file->rodata->rela->name, insn->sec->name, + rela->addend); +return -1 ; + } + + alt =malloc (sizeof (*alt)); +if (!alt) { +WARN ("malloc failed" ); +return -1 ; + } + + alt->insn = alt_insn; +list_add_tail (&alt->list, &insn->alts); + } + +return 0 ; +} + +static int add_func_switch_tables (struct objtool_file *file, +struct symbol *func) +{ +struct instruction *insn, *prev_jump; +struct rela *text_rela, *rodata_rela, *prev_rela; +int ret; + + prev_jump =NULL ; + +func_for_each_insn (file, func, insn) {if (insn->type !=INSN_JUMP_DYNAMIC )continue ; text_rela =find_rela_by_dest_range (insn->sec, insn->offset, insn->len); -if (!text_rela ||strcmp (text_rela->sym->name,".rodata" )) -continue ; - - rodata =find_section_by_name (file->elf,".rodata" ); -if (!rodata || !rodata->rela) +if (!text_rela || text_rela->sym != file->rodata->sym)continue ;/* common case: jmpq *[addr](,%rax,8) */ - rodata_rela =find_rela_by_dest (rodata, text_rela->addend); + rodata_rela =find_rela_by_dest (file->rodata, + text_rela->addend); -/* rare case: jmpq *[addr](%rip) */ +/* +* TODO: Document where this is needed, or get rid of it. +* +* rare case: jmpq *[addr](%rip) +*/ if (!rodata_rela) - rodata_rela =find_rela_by_dest (rodata, + rodata_rela =find_rela_by_dest (file->rodata, text_rela->addend +4 ); +if (!rodata_rela)continue ; - func =find_containing_func (insn->sec, insn->offset); -if (!func) { -WARN_FUNC ("can't find containing func" , - insn->sec, insn->offset); -return -1 ; +/* +* We found a switch table, but we don't know yet how big it +* is. Don't add it until we reach the end of the function or +* the beginning of another switch table in the same function. +*/ +if (prev_jump) { + ret =add_switch_table (file, func, prev_jump, prev_rela, + rodata_rela); +if (ret) +return ret; } -list_for_each_entry_from (rodata_rela, &rodata->rela->rela_list, - list) { -if (rodata_rela->sym->sec != insn->sec || - rodata_rela->addend <= func->offset || - rodata_rela->addend >= func->offset + func->len) -break ; + prev_jump = insn; + prev_rela = rodata_rela; + } - alt_insn =find_insn (file, insn->sec, - rodata_rela->addend); -if (!alt_insn) { -WARN ("%s: can't find instruction at %s+0x%x" , - rodata->rela->name, insn->sec->name, - rodata_rela->addend); -return -1 ; - } +if (prev_jump) { + ret =add_switch_table (file, func, prev_jump, prev_rela,NULL ); +if (ret) +return ret; + } - alt =malloc (sizeof (*alt)); -if (!alt) { -WARN ("malloc failed" ); -return -1 ; - } +return 0 ; +} - alt->insn = alt_insn; -list_add_tail (&alt->list, &insn->alts); +/* +* For some switch statements, gcc generates a jump table in the .rodata +* section which contains a list of addresses within the function to jump to. +* This finds these jump tables and adds them to the insn->alts lists. +*/ +static int add_switch_table_alts (struct objtool_file *file) +{ +struct section *sec; +struct symbol *func; +int ret; + +if (!file->rodata || !file->rodata->rela) +return 0 ; + +list_for_each_entry (sec, &file->elf->sections, list) { +list_for_each_entry (func, &sec->symbol_list, list) { +if (func->type !=STT_FUNC ) +continue ; + + ret =add_func_switch_tables (file, func); +if (ret) +return ret; } }
@@ -676,6 +729,8 @@ static int decode_sections(struct objtool_file *file) {int ret; + file->rodata =find_section_by_name (file->elf,".rodata" ); + ret =decode_instructions (file);if (ret)return ret;
Signature · 1 line
2.4.3
tip-bot for Josh Poimboeuf
merge bot[tip:core/objtool] objtool: Fix false positive warnings for functions with multiple switch statements
objtool: Fix false positive warnings for functions with multiple switch statements
Commit-ID: 8133fbb4240ae2918d993defa0f6824864412f56 Gitweb: http://git.kernel.org/tip/8133fbb4240ae2918d993defa0f6824864412f56 Author: Josh Poimboeuf <[email protected]> AuthorDate: Wed, 9 Mar 2016 00:06:58 -0600 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 9 Mar 2016 10:48:09 +0100
objtool: Fix false positive warnings for functions with multiple switch statements
Ingo reported [1] some false positive objtool warnings:
drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2e7: frame pointer state mismatch drivers/net/wireless/realtek/rtlwifi/base.o: warning: objtool: rtlwifi_rate_mapping()+0x2f3: frame pointer state mismatch
...
And so did the 0-day bot [2]:
drivers/gpu/drm/radeon/cik.o: warning: objtool: cik_tiling_mode_table_init()+0x6ce: call without frame pointer save/setup drivers/gpu/drm/radeon/cik.o: warning: objtool: cik_tiling_mode_table_init()+0x72b: call without frame pointer save/setup
...
Both sets of warnings involve functions which have multiple switch statements. When there's more than one switch statement in a function, objtool interprets all the switch jump tables as a single table. If the targets of one jump table assume a stack frame and the targets of another one don't, it prints false positive warnings.
Fix the bug by detecting the size of each switch jump table. For multiple tables, each one ends where the next one begins.
[1] https://lkml.kernel.org/r/[email protected]
[2] https://lists.01.org/pipermail/kbuild-all/2016-March/018124.html
--- tools/objtool/builtin-check.c | 145 +++++++++++++++++++++++++++++------------- 1 file changed, 100 insertions(+), 45 deletions(-)
tools/objtool/builtin-check.c +100 -45
@@ -61,6 +61,7 @@ struct alternative {struct objtool_file {struct elf *elf;struct list_head insn_list; +struct section *rodata; };const char *objname;
@@ -599,73 +600,125 @@ out:return ret; } -/* -* For some switch statements, gcc generates a jump table in the .rodata -* section which contains a list of addresses within the function to jump to. -* This finds these jump tables and adds them to the insn->alts lists. -*/ -static int add_switch_table_alts (struct objtool_file *file) +static int add_switch_table (struct objtool_file *file,struct symbol *func, +struct instruction *insn,struct rela *table, +struct rela *next_table) { -struct instruction *insn, *alt_insn; -struct rela *rodata_rela, *text_rela; -struct section *rodata; -struct symbol *func; +struct rela *rela = table; +struct instruction *alt_insn;struct alternative *alt; -for_each_insn (file, insn) { +list_for_each_entry_from (rela, &file->rodata->rela->rela_list, list) { +if (rela == next_table) +break ; + +if (rela->sym->sec != insn->sec || + rela->addend <= func->offset || + rela->addend >= func->offset + func->len) +break ; + + alt_insn =find_insn (file, insn->sec, rela->addend); +if (!alt_insn) { +WARN ("%s: can't find instruction at %s+0x%x" , + file->rodata->rela->name, insn->sec->name, + rela->addend); +return -1 ; + } + + alt =malloc (sizeof (*alt)); +if (!alt) { +WARN ("malloc failed" ); +return -1 ; + } + + alt->insn = alt_insn; +list_add_tail (&alt->list, &insn->alts); + } + +return 0 ; +} + +static int add_func_switch_tables (struct objtool_file *file, +struct symbol *func) +{ +struct instruction *insn, *prev_jump; +struct rela *text_rela, *rodata_rela, *prev_rela; +int ret; + + prev_jump =NULL ; + +func_for_each_insn (file, func, insn) {if (insn->type !=INSN_JUMP_DYNAMIC )continue ; text_rela =find_rela_by_dest_range (insn->sec, insn->offset, insn->len); -if (!text_rela ||strcmp (text_rela->sym->name,".rodata" )) -continue ; - - rodata =find_section_by_name (file->elf,".rodata" ); -if (!rodata || !rodata->rela) +if (!text_rela || text_rela->sym != file->rodata->sym)continue ;/* common case: jmpq *[addr](,%rax,8) */ - rodata_rela =find_rela_by_dest (rodata, text_rela->addend); + rodata_rela =find_rela_by_dest (file->rodata, + text_rela->addend); -/* rare case: jmpq *[addr](%rip) */ +/* +* TODO: Document where this is needed, or get rid of it. +* +* rare case: jmpq *[addr](%rip) +*/ if (!rodata_rela) - rodata_rela =find_rela_by_dest (rodata, + rodata_rela =find_rela_by_dest (file->rodata, text_rela->addend +4 ); +if (!rodata_rela)continue ; - func =find_containing_func (insn->sec, insn->offset); -if (!func) { -WARN_FUNC ("can't find containing func" , - insn->sec, insn->offset); -return -1 ; +/* +* We found a switch table, but we don't know yet how big it +* is. Don't add it until we reach the end of the function or +* the beginning of another switch table in the same function. +*/ +if (prev_jump) { + ret =add_switch_table (file, func, prev_jump, prev_rela, + rodata_rela); +if (ret) +return ret; } -list_for_each_entry_from (rodata_rela, &rodata->rela->rela_list, - list) { -if (rodata_rela->sym->sec != insn->sec || - rodata_rela->addend <= func->offset || - rodata_rela->addend >= func->offset + func->len) -break ; + prev_jump = insn; + prev_rela = rodata_rela; + } - alt_insn =find_insn (file, insn->sec, - rodata_rela->addend); -if (!alt_insn) { -WARN ("%s: can't find instruction at %s+0x%x" , - rodata->rela->name, insn->sec->name, - rodata_rela->addend); -return -1 ; - } +if (prev_jump) { + ret =add_switch_table (file, func, prev_jump, prev_rela,NULL ); +if (ret) +return ret; + } - alt =malloc (sizeof (*alt)); -if (!alt) { -WARN ("malloc failed" ); -return -1 ; - } +return 0 ; +} - alt->insn = alt_insn; -list_add_tail (&alt->list, &insn->alts); +/* +* For some switch statements, gcc generates a jump table in the .rodata +* section which contains a list of addresses within the function to jump to. +* This finds these jump tables and adds them to the insn->alts lists. +*/ +static int add_switch_table_alts (struct objtool_file *file) +{ +struct section *sec; +struct symbol *func; +int ret; + +if (!file->rodata || !file->rodata->rela) +return 0 ; + +list_for_each_entry (sec, &file->elf->sections, list) { +list_for_each_entry (func, &sec->symbol_list, list) { +if (func->type !=STT_FUNC ) +continue ; + + ret =add_func_switch_tables (file, func); +if (ret) +return ret; } }
@@ -676,6 +729,8 @@ static int decode_sections(struct objtool_file *file) {int ret; + file->rodata =find_section_by_name (file->elf,".rodata" ); + ret =decode_instructions (file);if (ret)return ret;
PATCH 9/11 tools/objtool: Copy hashtable.h into tools directory
In reply to Josh PoimboeufCopy hashtable.h from include/linux/tools.h. It's needed by objtool in the next patch in the series.
Add some includes that it needs, and remove references to kernel-specific features like RCU and __read_mostly.
Also change some if its dependency headers' includes to use quotes instead of brackets so gcc can find them.
--- tools/include/asm-generic/bitops/__fls.h | 2 +- tools/include/asm-generic/bitops/fls.h | 2 +- tools/include/asm-generic/bitops/fls64.h | 2 +- tools/include/linux/hashtable.h | 152 +++++++++++++++++++++++++++++++ 4 files changed, 155 insertions(+), 3 deletions(-) create mode 100644 tools/include/linux/hashtable.h
tools/include/asm-generic/bitops/__fls.h +1 -1
@@ -1 +1 @@ -#include <../../../../include/asm-generic/bitops/__fls.h> +#include "../../../../include/asm-generic/bitops/__fls.h"
tools/include/asm-generic/bitops/fls.h +1 -1
@@ -1 +1 @@ -#include <../../../../include/asm-generic/bitops/fls.h> +#include "../../../../include/asm-generic/bitops/fls.h"
tools/include/asm-generic/bitops/fls64.h +1 -1
@@ -1 +1 @@ -#include <../../../../include/asm-generic/bitops/fls64.h> +#include "../../../../include/asm-generic/bitops/fls64.h"
tools/include/linux/hashtable.h new file +152 -0
152 lines not on this page · raw message
Signature · 1 line
2.4.3
Re: [PATCH 09/11] tools/objtool: Copy hashtable.h into tools directory
Quoted 9 lines · Josh Poimboeuf
Copy
hashtable.hfrominclude/linux/tools.h. It's needed by objtool in the next patch in the series.Add some includes that it needs, and remove references to kernel-specific features like RCU and
__read_mostly.Also change some if its dependency headers' includes to use quotes instead of brackets so gcc can find them.
Quoted 7 lines
Signed-off-by Josh Poimboeuf <[email protected]>--- tools/include/asm-generic/bitops/__fls.h | 2 +- tools/include/asm-generic/bitops/fls.h | 2 +- tools/include/asm-generic/bitops/fls64.h | 2 +- tools/include/linux/hashtable.h | 152 +++++++++++++++++++++++++++++++ 4 files changed, 155 insertions(+), 3 deletions(-)
So it would be nice to also add a build time warning if the 'upstream' copy of hashtable.h deviates from the tooling file.
Just like you are already doing it for other files:
objtool/Makefile: diff -I'^#include' arch/x86/insn/insn.c ../../arch/x86/lib/insn.c >/dev/null && \
Btw., eventually we might want to factor out such duplication into a single place in tools/lib/ or so, to only have a 'master copy' (upstream kernel source), and the tooling copy.
Thanks,
Ingo
Re: [PATCH 09/11] tools/objtool: Copy hashtable.h into tools directory
Quoted 23 lines · Ingo Molnar
Quoted 9 lines · Josh Poimboeuf
Copy
hashtable.hfrominclude/linux/tools.h. It's needed by objtool in the next patch in the series.Add some includes that it needs, and remove references to kernel-specific features like RCU and
__read_mostly.Also change some if its dependency headers' includes to use quotes instead of brackets so gcc can find them.
Quoted 7 lines
Signed-off-by Josh Poimboeuf <[email protected]>--- tools/include/asm-generic/bitops/__fls.h | 2 +- tools/include/asm-generic/bitops/fls.h | 2 +- tools/include/asm-generic/bitops/fls64.h | 2 +- tools/include/linux/hashtable.h | 152 +++++++++++++++++++++++++++++++ 4 files changed, 155 insertions(+), 3 deletions(-)So it would be nice to also add a build time warning if the 'upstream' copy of
hashtable.hdeviates from the tooling file.
Quoted 7 lines
Just like you are already doing it for other files:
objtool/Makefile: diff -I'^#include'
arch/x86/insn/insn.c../../arch/x86/lib/insn.c>/dev/null && \Btw., eventually we might want to factor out such duplication into a single place in
tools/lib/or so, to only have a 'master copy' (upstream kernel source), and the tooling copy.
Yeah, since we already have at least two instances of this type of diffing in the tools tree, it would be good to generalize these diffs in a common place with a common kernel build target. I'll add it to my TODOs.
BTW, do you know why the policy is to copy them instead of just including the kernel versions?
If the goal is to make it easier to package the tools separately, wouldn't something like the perf MANIFEST file make that possible without copying?
Or if the goal is only to make it possible to compile kernel headers in user space, then we may only need to copy or recreate some headers and I may have been overzealous with my copying.
Signature · 1 line
Josh
Re: [PATCH 09/11] tools/objtool: Copy hashtable.h into tools directory
Quoted 11 lines · Josh Poimboeuf
Quoted 10 lines
So it would be nice to also add a build time warning if the 'upstream' copy of
hashtable.hdeviates from the tooling file.Just like you are already doing it for other files:
objtool/Makefile: diff -I'^#include'
arch/x86/insn/insn.c../../arch/x86/lib/insn.c>/dev/null && \Btw., eventually we might want to factor out such duplication into a single place in
tools/lib/or so, to only have a 'master copy' (upstream kernel source), and the tooling copy.
Quoted 6 lines
Yeah, since we already have at least two instances of this type of diffing in the tools tree, it would be good to generalize these diffs in a common place with a common kernel build target. I'll add it to my TODOs.
BTW, do you know why the policy is to copy them instead of just including the kernel versions?
Yeah, so we started with that, but it occasionally resulted in build failures being introduced on the kernel side, which wasn't noticed on the tooling side immediately. (as you don't normally build tooling if you build the kernel.)
Linus (rightfully) complained about that kind of overly tight coupling, and we figured out the diff method you can see on the tooling side: we copy files but don't let them stay forked too long: we detect differences and warn about them in a soft fashion (just emit a warning), without breaking the tooling side or the kernel side.
And you are perfectly right that this should be made an integral, easy to utilize part of the tooling build system.
Quoted 3 lines
Or if the goal is only to make it possible to compile kernel headers in user space, then we may only need to copy or recreate some headers and I may have been overzealous with my copying.
So the goal is to have all the benefits of sharing code (kernel libraries and headers are cool and well-maintained), without any of the disadvantages of such tight code sharing! ;-)
That's why we came up with this method, which is essentially a distributed file system with a manual, high latency cache coherency protocol.
Thanks,
Ingo
tip-bot for Josh Poimboeuf
merge bot[tip:core/objtool] tools: Copy hashtable.h into tools directory
In reply to Josh Poimboeuftools: Copy hashtable.h into tools directory
Commit-ID: 1698872b5c772aebc5c43ca445cc0a79f12b9fcc Gitweb: http://git.kernel.org/tip/1698872b5c772aebc5c43ca445cc0a79f12b9fcc Author: Josh Poimboeuf <[email protected]> AuthorDate: Wed, 9 Mar 2016 00:06:59 -0600 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 9 Mar 2016 10:48:09 +0100
tools: Copy hashtable.h into tools directory
Copy hashtable.h from include/linux/tools.h. It's needed by objtool in the next patch in the series.
Add some includes that it needs, and remove references to kernel-specific features like RCU and __read_mostly.
Also change some if its dependency headers' includes to use quotes instead of brackets so gcc can find them.
---
tools/include/asm-generic/bitops/__fls.h | 2 +-
tools/include/asm-generic/bitops/fls.h | 2 +-
tools/include/asm-generic/bitops/fls64.h | 2 +-
{include => tools/include}/linux/hashtable.h | 69 +++-------------------------
4 files changed, 9 insertions(+), 66 deletions(-)tools/include/asm-generic/bitops/__fls.h +1 -1
@@ -1 +1 @@ -#include <../../../../include/asm-generic/bitops/__fls.h> +#include "../../../../include/asm-generic/bitops/__fls.h"
tools/include/asm-generic/bitops/fls.h +1 -1
@@ -1 +1 @@ -#include <../../../../include/asm-generic/bitops/fls.h> +#include "../../../../include/asm-generic/bitops/fls.h"
tools/include/asm-generic/bitops/fls64.h +1 -1
@@ -1 +1 @@ -#include <../../../../include/asm-generic/bitops/fls64.h> +#include "../../../../include/asm-generic/bitops/fls64.h"
tools/include/linux/hashtable.h renamed from include/linux/hashtable.h +6 -63
105 lines not on this page · raw message
PATCH 10/11 objtool: Add several performance improvements
In reply to Josh PoimboeufUse hash tables for instruction and rela lookups (and keep the linked lists around for sequential access).
Also cache the section struct for the "__func_stack_frame_non_standard" section.
With this change, "objtool check net/wireless/nl80211.o" goes from:
real 0m1.168s
user 0m1.163s
sys 0m0.005s
to:
real 0m0.059s
user 0m0.042s
sys 0m0.017s
for a 20x speedup.
With the same object, it should be noted that the memory heap usage grew from 8MB to 62MB. Reducing the memory usage is on the TODO list.
--- tools/objtool/builtin-check.c | 18 ++++++++++++------ tools/objtool/elf.c | 21 +++++++++++++++------ tools/objtool/elf.h | 10 ++++++++-- 3 files changed, 35 insertions(+), 14 deletions(-)
tools/objtool/builtin-check.c +12 -6
@@ -34,6 +34,8 @@#include "arch.h" #include "warn.h" +#include <linux/hashtable.h> +#define ARRAY_SIZE (x) (sizeof(x) / sizeof((x)[0]))#define STATE_FP_SAVED 0x1
@@ -42,6 +44,7 @@struct instruction {struct list_head list; +struct hlist_node hash;struct section *sec;unsigned long offset;unsigned int len, state;
@@ -61,7 +64,8 @@ struct alternative {struct objtool_file {struct elf *elf;struct list_head insn_list; -struct section *rodata; + DECLARE_HASHTABLE(insn_hash, 16); +struct section *rodata, *whitelist; };const char *objname;
@@ -72,7 +76,7 @@ static struct instruction *find_insn(struct objtool_file *file, {struct instruction *insn; -list_for_each_entry (insn, &file->insn_list, list) +hash_for_each_possible (file->insn_hash, insn, hash, offset)if (insn->sec == sec && insn->offset == offset)return insn;
@@ -111,14 +115,12 @@ static struct instruction *next_insn_same_sec(struct objtool_file *file,*/ static bool ignore_func (struct objtool_file *file,struct symbol *func) { -struct section *macro_sec;struct rela *rela;struct instruction *insn;/* check for STACK_FRAME_NON_STANDARD */ - macro_sec =find_section_by_name (file->elf,"__func_stack_frame_non_standard" ); -if (macro_sec && macro_sec->rela) -list_for_each_entry (rela, ¯o_sec->rela->rela_list, list) +if (file->whitelist && file->whitelist->rela) +list_for_each_entry (rela, &file->whitelist->rela->rela_list, list)if (rela->sym->sec == func->sec && rela->addend == func->offset)return true;
@@ -276,6 +278,7 @@ static int decode_instructions(struct objtool_file *file)return -1 ; } +hash_add (file->insn_hash, &insn->hash, insn->offset);list_add_tail (&insn->list, &file->insn_list); } }
@@ -729,6 +732,7 @@ static int decode_sections(struct objtool_file *file) {int ret; + file->whitelist =find_section_by_name (file->elf,"__func_stack_frame_non_standard" ); file->rodata =find_section_by_name (file->elf,".rodata" ); ret =decode_instructions (file);
@@ -1091,6 +1095,7 @@ static void cleanup(struct objtool_file *file)free (alt); }list_del (&insn->list); +hash_del (&insn->hash);free (insn); }elf_close (file->elf);
@@ -1125,6 +1130,7 @@ int cmd_check(int argc, const char **argv) }INIT_LIST_HEAD (&file.insn_list); +hash_init (file.insn_hash); ret =decode_sections (&file);if (ret <0 )
tools/objtool/elf.c +15 -6
@@ -59,7 +59,7 @@ static struct symbol *find_symbol_by_index(struct elf *elf, unsigned int idx)struct symbol *sym;list_for_each_entry (sec, &elf->sections, list) -list_for_each_entry (sym, &sec->symbol_list, list) +hash_for_each_possible (sec->symbol_hash, sym, hash, idx)if (sym->idx == idx)return sym;
@@ -82,13 +82,15 @@ struct rela *find_rela_by_dest_range(struct section *sec, unsigned long offset, unsigned int len) {struct rela *rela; +unsigned long o;if (!sec->rela)return NULL ; -list_for_each_entry (rela, &sec->rela->rela_list, list) -if (rela->offset >= offset && rela->offset < offset + len) -return rela; +for (o = offset; o < offset + len; o++) +hash_for_each_possible (sec->rela->rela_hash, rela, hash, o) +if (rela->offset == o) +return rela;return NULL ; }
@@ -137,6 +139,8 @@ static int read_sections(struct elf *elf)INIT_LIST_HEAD (&sec->symbol_list);INIT_LIST_HEAD (&sec->rela_list); +hash_init (sec->rela_hash); +hash_init (sec->symbol_hash);list_add_tail (&sec->list, &elf->sections);
@@ -261,6 +265,7 @@ static int read_symbols(struct elf *elf) } }list_add (&sym->list, entry); +hash_add (sym->sec->symbol_hash, &sym->hash, sym->idx); }return 0 ;
@@ -298,8 +303,6 @@ static int read_relas(struct elf *elf) }memset (rela,0 ,sizeof (*rela)); -list_add_tail (&rela->list, &sec->rela_list); -if (!gelf_getrela (sec->elf_data, i, &rela->rela)) {perror ("gelf_getrela" );return -1 ;
@@ -315,6 +318,10 @@ static int read_relas(struct elf *elf) symndx, sec->name);return -1 ; } + +list_add_tail (&rela->list, &sec->rela_list); +hash_add (sec->rela_hash, &rela->hash, rela->offset); + } }
@@ -384,10 +391,12 @@ void elf_close(struct elf *elf)list_for_each_entry_safe (sec, tmpsec, &elf->sections, list) {list_for_each_entry_safe (sym, tmpsym, &sec->symbol_list, list) {list_del (&sym->list); +hash_del (&sym->hash);free (sym); }list_for_each_entry_safe (rela, tmprela, &sec->rela_list, list) {list_del (&rela->list); +hash_del (&rela->hash);free (rela); }list_del (&sec->list);
tools/objtool/elf.h +8 -2
@@ -21,12 +21,15 @@#include <stdio.h> #include <gelf.h> #include <linux/list.h> +#include <linux/hashtable.h> struct section {struct list_head list;GElf_Shdr sh;struct list_head symbol_list; + DECLARE_HASHTABLE(symbol_hash, 8);struct list_head rela_list; + DECLARE_HASHTABLE(rela_hash, 16);struct section *base, *rela;struct symbol *sym;Elf_Data *elf_data;
@@ -38,10 +41,11 @@ struct section {struct symbol {struct list_head list; +struct hlist_node hash;GElf_Sym sym;struct section *sec;char *name; -int idx; +unsigned int idx;unsigned char bind, type;unsigned long offset;unsigned int len;
@@ -49,10 +53,11 @@ struct symbol {struct rela {struct list_head list; +struct hlist_node hash;GElf_Rela rela;struct symbol *sym;unsigned int type; -int offset; +unsigned long offset;int addend; };
@@ -62,6 +67,7 @@ struct elf {int fd;char *name;struct list_head sections; +DECLARE_HASHTABLE (rela_hash,16 ); };
Signature · 1 line
2.4.3
tip-bot for Josh Poimboeuf
merge bot[tip:core/objtool] objtool: Add several performance improvements
objtool: Add several performance improvements
Commit-ID: 042ba73fe7eb63872ee2d6ac86410052210c1f16 Gitweb: http://git.kernel.org/tip/042ba73fe7eb63872ee2d6ac86410052210c1f16 Author: Josh Poimboeuf <[email protected]> AuthorDate: Wed, 9 Mar 2016 00:07:00 -0600 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 9 Mar 2016 10:48:10 +0100
objtool: Add several performance improvements
Use hash tables for instruction and rela lookups (and keep the linked lists around for sequential access).
Also cache the section struct for the "__func_stack_frame_non_standard" section.
With this change, "objtool check net/wireless/nl80211.o" goes from:
real 0m1.168s
user 0m1.163s
sys 0m0.005s
to:
real 0m0.059s
user 0m0.042s
sys 0m0.017s
for a 20x speedup.
With the same object, it should be noted that the memory heap usage grew from 8MB to 62MB. Reducing the memory usage is on the TODO list.
--- tools/objtool/builtin-check.c | 18 ++++++++++++------ tools/objtool/elf.c | 21 +++++++++++++++------ tools/objtool/elf.h | 10 ++++++++-- 3 files changed, 35 insertions(+), 14 deletions(-)
tools/objtool/builtin-check.c +12 -6
@@ -34,6 +34,8 @@#include "arch.h" #include "warn.h" +#include <linux/hashtable.h> +#define ARRAY_SIZE (x) (sizeof(x) / sizeof((x)[0]))#define STATE_FP_SAVED 0x1
@@ -42,6 +44,7 @@struct instruction {struct list_head list; +struct hlist_node hash;struct section *sec;unsigned long offset;unsigned int len, state;
@@ -61,7 +64,8 @@ struct alternative {struct objtool_file {struct elf *elf;struct list_head insn_list; -struct section *rodata; + DECLARE_HASHTABLE(insn_hash, 16); +struct section *rodata, *whitelist; };const char *objname;
@@ -72,7 +76,7 @@ static struct instruction *find_insn(struct objtool_file *file, {struct instruction *insn; -list_for_each_entry (insn, &file->insn_list, list) +hash_for_each_possible (file->insn_hash, insn, hash, offset)if (insn->sec == sec && insn->offset == offset)return insn;
@@ -111,14 +115,12 @@ static struct instruction *next_insn_same_sec(struct objtool_file *file,*/ static bool ignore_func (struct objtool_file *file,struct symbol *func) { -struct section *macro_sec;struct rela *rela;struct instruction *insn;/* check for STACK_FRAME_NON_STANDARD */ - macro_sec =find_section_by_name (file->elf,"__func_stack_frame_non_standard" ); -if (macro_sec && macro_sec->rela) -list_for_each_entry (rela, ¯o_sec->rela->rela_list, list) +if (file->whitelist && file->whitelist->rela) +list_for_each_entry (rela, &file->whitelist->rela->rela_list, list)if (rela->sym->sec == func->sec && rela->addend == func->offset)return true;
@@ -276,6 +278,7 @@ static int decode_instructions(struct objtool_file *file)return -1 ; } +hash_add (file->insn_hash, &insn->hash, insn->offset);list_add_tail (&insn->list, &file->insn_list); } }
@@ -729,6 +732,7 @@ static int decode_sections(struct objtool_file *file) {int ret; + file->whitelist =find_section_by_name (file->elf,"__func_stack_frame_non_standard" ); file->rodata =find_section_by_name (file->elf,".rodata" ); ret =decode_instructions (file);
@@ -1091,6 +1095,7 @@ static void cleanup(struct objtool_file *file)free (alt); }list_del (&insn->list); +hash_del (&insn->hash);free (insn); }elf_close (file->elf);
@@ -1125,6 +1130,7 @@ int cmd_check(int argc, const char **argv) }INIT_LIST_HEAD (&file.insn_list); +hash_init (file.insn_hash); ret =decode_sections (&file);if (ret <0 )
tools/objtool/elf.c +15 -6
@@ -59,7 +59,7 @@ static struct symbol *find_symbol_by_index(struct elf *elf, unsigned int idx)struct symbol *sym;list_for_each_entry (sec, &elf->sections, list) -list_for_each_entry (sym, &sec->symbol_list, list) +hash_for_each_possible (sec->symbol_hash, sym, hash, idx)if (sym->idx == idx)return sym;
@@ -82,13 +82,15 @@ struct rela *find_rela_by_dest_range(struct section *sec, unsigned long offset, unsigned int len) {struct rela *rela; +unsigned long o;if (!sec->rela)return NULL ; -list_for_each_entry (rela, &sec->rela->rela_list, list) -if (rela->offset >= offset && rela->offset < offset + len) -return rela; +for (o = offset; o < offset + len; o++) +hash_for_each_possible (sec->rela->rela_hash, rela, hash, o) +if (rela->offset == o) +return rela;return NULL ; }
@@ -137,6 +139,8 @@ static int read_sections(struct elf *elf)INIT_LIST_HEAD (&sec->symbol_list);INIT_LIST_HEAD (&sec->rela_list); +hash_init (sec->rela_hash); +hash_init (sec->symbol_hash);list_add_tail (&sec->list, &elf->sections);
@@ -261,6 +265,7 @@ static int read_symbols(struct elf *elf) } }list_add (&sym->list, entry); +hash_add (sym->sec->symbol_hash, &sym->hash, sym->idx); }return 0 ;
@@ -298,8 +303,6 @@ static int read_relas(struct elf *elf) }memset (rela,0 ,sizeof (*rela)); -list_add_tail (&rela->list, &sec->rela_list); -if (!gelf_getrela (sec->elf_data, i, &rela->rela)) {perror ("gelf_getrela" );return -1 ;
@@ -315,6 +318,10 @@ static int read_relas(struct elf *elf) symndx, sec->name);return -1 ; } + +list_add_tail (&rela->list, &sec->rela_list); +hash_add (sec->rela_hash, &rela->hash, rela->offset); + } }
@@ -384,10 +391,12 @@ void elf_close(struct elf *elf)list_for_each_entry_safe (sec, tmpsec, &elf->sections, list) {list_for_each_entry_safe (sym, tmpsym, &sec->symbol_list, list) {list_del (&sym->list); +hash_del (&sym->hash);free (sym); }list_for_each_entry_safe (rela, tmprela, &sec->rela_list, list) {list_del (&rela->list); +hash_del (&rela->hash);free (rela); }list_del (&sec->list);
tools/objtool/elf.h +8 -2
@@ -21,12 +21,15 @@#include <stdio.h> #include <gelf.h> #include <linux/list.h> +#include <linux/hashtable.h> struct section {struct list_head list;GElf_Shdr sh;struct list_head symbol_list; + DECLARE_HASHTABLE(symbol_hash, 8);struct list_head rela_list; + DECLARE_HASHTABLE(rela_hash, 16);struct section *base, *rela;struct symbol *sym;Elf_Data *elf_data;
@@ -38,10 +41,11 @@ struct section {struct symbol {struct list_head list; +struct hlist_node hash;GElf_Sym sym;struct section *sec;char *name; -int idx; +unsigned int idx;unsigned char bind, type;unsigned long offset;unsigned int len;
@@ -49,10 +53,11 @@ struct symbol {struct rela {struct list_head list; +struct hlist_node hash;GElf_Rela rela;struct symbol *sym;unsigned int type; -int offset; +unsigned long offset;int addend; };
@@ -62,6 +67,7 @@ struct elf {int fd;char *name;struct list_head sections; +DECLARE_HASHTABLE (rela_hash,16 ); };
PATCH 11/11 objtool: Only print one warning per function
In reply to Josh PoimboeufWhen objtool discovers an issue, it's very common for it to flood the terminal with a lot of duplicate warnings. For example:
warning: objtool: rtlwifi_rate_mapping()+0x2e7: frame pointer state mismatch
warning: objtool: rtlwifi_rate_mapping()+0x2f3: frame pointer state mismatch
warning: objtool: rtlwifi_rate_mapping()+0x2ff: frame pointer state mismatch
warning: objtool: rtlwifi_rate_mapping()+0x30b: frame pointer state mismatch
...
The first warning is usually all you need. Change it to only warn once per function.
--- tools/objtool/builtin-check.c | 48 ++++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 23 deletions(-)
tools/objtool/builtin-check.c +25 -23
@@ -800,7 +800,7 @@ static int validate_branch(struct objtool_file *file,struct instruction *insn;struct section *sec;unsigned char state; -int ret, warnings =0 ; +int ret; insn = first; sec = insn->sec;
@@ -809,7 +809,7 @@ static int validate_branch(struct objtool_file *file,if (insn->alt_group &&list_empty (&insn->alts)) {WARN_FUNC ("don't know how to handle branch to middle of alternative instruction group" , sec, insn->offset); - warnings++; +return 1 ; }while (1 ) {
@@ -817,10 +817,10 @@ static int validate_branch(struct objtool_file *file,if (frame_state (insn->state) !=frame_state (state)) {WARN_FUNC ("frame pointer state mismatch" , sec, insn->offset); - warnings++; +return 1 ; } -return warnings; +return 0 ; }/*
@@ -828,14 +828,15 @@ static int validate_branch(struct objtool_file *file,* the next function. */ if (is_fentry_call (insn) && (state &STATE_FENTRY )) -return warnings; +return 0 ; insn->visited = true; insn->state = state;list_for_each_entry (alt, &insn->alts, list) { ret =validate_branch (file, alt->insn, state); - warnings += ret; +if (ret) +return 1 ; }switch (insn->type) {
@@ -845,7 +846,7 @@ static int validate_branch(struct objtool_file *file,if (state &STATE_FP_SAVED ) {WARN_FUNC ("duplicate frame pointer save" , sec, insn->offset); - warnings++; +return 1 ; } state |=STATE_FP_SAVED ; }
@@ -856,7 +857,7 @@ static int validate_branch(struct objtool_file *file,if (state &STATE_FP_SETUP ) {WARN_FUNC ("duplicate frame pointer setup" , sec, insn->offset); - warnings++; +return 1 ; } state |=STATE_FP_SETUP ; }
@@ -875,9 +876,9 @@ static int validate_branch(struct objtool_file *file,if (!nofp &&has_modified_stack_frame (insn)) {WARN_FUNC ("return without frame pointer restore" , sec, insn->offset); - warnings++; +return 1 ; } -return warnings; +return 0 ;case INSN_CALL :if (is_fentry_call (insn)) {
@@ -887,16 +888,16 @@ static int validate_branch(struct objtool_file *file, ret =dead_end_function (file, insn->call_dest);if (ret ==1 ) -return warnings; +return 0 ;if (ret ==-1 ) - warnings++; +return 1 ;/* fallthrough */ case INSN_CALL_DYNAMIC :if (!nofp && !has_valid_stack_frame (insn)) {WARN_FUNC ("call without frame pointer save/setup" , sec, insn->offset); - warnings++; +return 1 ; }break ;
@@ -905,15 +906,16 @@ static int validate_branch(struct objtool_file *file,if (insn->jump_dest) { ret =validate_branch (file, insn->jump_dest, state); - warnings += ret; +if (ret) +return 1 ; }else if (has_modified_stack_frame (insn)) {WARN_FUNC ("sibling call from callable instruction with changed frame pointer" , sec, insn->offset); - warnings++; +return 1 ; }/* else it's a sibling call */ if (insn->type ==INSN_JUMP_UNCONDITIONAL ) -return warnings; +return 0 ;break ;
@@ -922,13 +924,13 @@ static int validate_branch(struct objtool_file *file, has_modified_stack_frame(insn)) {WARN_FUNC ("sibling call from callable instruction with changed frame pointer" , sec, insn->offset); - warnings++; +return 1 ; } -return warnings; +return 0 ;case INSN_BUG : -return warnings; +return 0 ;default :break ;
@@ -937,12 +939,11 @@ static int validate_branch(struct objtool_file *file, insn =next_insn_same_sec (file, insn);if (!insn) {WARN ("%s: unexpected end of section" , sec->name); - warnings++; -return warnings; +return 1 ; } } -return warnings; +return 0 ; }static bool is_gcov_insn (struct instruction *insn)
@@ -1055,7 +1056,8 @@ static int validate_functions(struct objtool_file *file)if (insn->visited)continue ; -if (!ignore_unreachable_insn (func, insn)) { +if (!ignore_unreachable_insn (func, insn) && + !warnings) {WARN_FUNC ("function has unreachable instruction" , insn->sec, insn->offset); warnings++; }
Signature · 1 line
2.4.3
tip-bot for Josh Poimboeuf
merge bot[tip:core/objtool] objtool: Only print one warning per function
objtool: Only print one warning per function
Commit-ID: 1bcb58a099938c33acda78b212ed67b06b3359ef Gitweb: http://git.kernel.org/tip/1bcb58a099938c33acda78b212ed67b06b3359ef Author: Josh Poimboeuf <[email protected]> AuthorDate: Wed, 9 Mar 2016 00:07:01 -0600 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 9 Mar 2016 10:48:10 +0100
objtool: Only print one warning per function
When objtool discovers an issue, it's very common for it to flood the terminal with a lot of duplicate warnings. For example:
warning: objtool: rtlwifi_rate_mapping()+0x2e7: frame pointer state mismatch
warning: objtool: rtlwifi_rate_mapping()+0x2f3: frame pointer state mismatch
warning: objtool: rtlwifi_rate_mapping()+0x2ff: frame pointer state mismatch
warning: objtool: rtlwifi_rate_mapping()+0x30b: frame pointer state mismatch
...
The first warning is usually all you need. Change it to only warn once per function.
--- tools/objtool/builtin-check.c | 48 ++++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 23 deletions(-)
tools/objtool/builtin-check.c +25 -23
@@ -800,7 +800,7 @@ static int validate_branch(struct objtool_file *file,struct instruction *insn;struct section *sec;unsigned char state; -int ret, warnings =0 ; +int ret; insn = first; sec = insn->sec;
@@ -809,7 +809,7 @@ static int validate_branch(struct objtool_file *file,if (insn->alt_group &&list_empty (&insn->alts)) {WARN_FUNC ("don't know how to handle branch to middle of alternative instruction group" , sec, insn->offset); - warnings++; +return 1 ; }while (1 ) {
@@ -817,10 +817,10 @@ static int validate_branch(struct objtool_file *file,if (frame_state (insn->state) !=frame_state (state)) {WARN_FUNC ("frame pointer state mismatch" , sec, insn->offset); - warnings++; +return 1 ; } -return warnings; +return 0 ; }/*
@@ -828,14 +828,15 @@ static int validate_branch(struct objtool_file *file,* the next function. */ if (is_fentry_call (insn) && (state &STATE_FENTRY )) -return warnings; +return 0 ; insn->visited = true; insn->state = state;list_for_each_entry (alt, &insn->alts, list) { ret =validate_branch (file, alt->insn, state); - warnings += ret; +if (ret) +return 1 ; }switch (insn->type) {
@@ -845,7 +846,7 @@ static int validate_branch(struct objtool_file *file,if (state &STATE_FP_SAVED ) {WARN_FUNC ("duplicate frame pointer save" , sec, insn->offset); - warnings++; +return 1 ; } state |=STATE_FP_SAVED ; }
@@ -856,7 +857,7 @@ static int validate_branch(struct objtool_file *file,if (state &STATE_FP_SETUP ) {WARN_FUNC ("duplicate frame pointer setup" , sec, insn->offset); - warnings++; +return 1 ; } state |=STATE_FP_SETUP ; }
@@ -875,9 +876,9 @@ static int validate_branch(struct objtool_file *file,if (!nofp &&has_modified_stack_frame (insn)) {WARN_FUNC ("return without frame pointer restore" , sec, insn->offset); - warnings++; +return 1 ; } -return warnings; +return 0 ;case INSN_CALL :if (is_fentry_call (insn)) {
@@ -887,16 +888,16 @@ static int validate_branch(struct objtool_file *file, ret =dead_end_function (file, insn->call_dest);if (ret ==1 ) -return warnings; +return 0 ;if (ret ==-1 ) - warnings++; +return 1 ;/* fallthrough */ case INSN_CALL_DYNAMIC :if (!nofp && !has_valid_stack_frame (insn)) {WARN_FUNC ("call without frame pointer save/setup" , sec, insn->offset); - warnings++; +return 1 ; }break ;
@@ -905,15 +906,16 @@ static int validate_branch(struct objtool_file *file,if (insn->jump_dest) { ret =validate_branch (file, insn->jump_dest, state); - warnings += ret; +if (ret) +return 1 ; }else if (has_modified_stack_frame (insn)) {WARN_FUNC ("sibling call from callable instruction with changed frame pointer" , sec, insn->offset); - warnings++; +return 1 ; }/* else it's a sibling call */ if (insn->type ==INSN_JUMP_UNCONDITIONAL ) -return warnings; +return 0 ;break ;
@@ -922,13 +924,13 @@ static int validate_branch(struct objtool_file *file, has_modified_stack_frame(insn)) {WARN_FUNC ("sibling call from callable instruction with changed frame pointer" , sec, insn->offset); - warnings++; +return 1 ; } -return warnings; +return 0 ;case INSN_BUG : -return warnings; +return 0 ;default :break ;
@@ -937,12 +939,11 @@ static int validate_branch(struct objtool_file *file, insn =next_insn_same_sec (file, insn);if (!insn) {WARN ("%s: unexpected end of section" , sec->name); - warnings++; -return warnings; +return 1 ; } } -return warnings; +return 0 ; }static bool is_gcov_insn (struct instruction *insn)
@@ -1055,7 +1056,8 @@ static int validate_functions(struct objtool_file *file)if (insn->visited)continue ; -if (!ignore_unreachable_insn (func, insn)) { +if (!ignore_unreachable_insn (func, insn) && + !warnings) {WARN_FUNC ("function has unreachable instruction" , insn->sec, insn->offset); warnings++; }