[PATCH] kcov: allow more fine-grained coverage instrumentation

34 views
Skip to first unread message

Vegard Nossum

unread,
May 23, 2016, 8:59:53 AM5/23/16
to Dmitry Vyukov, Andrew Morton, syzkaller, linux-...@vger.kernel.org, Vegard Nossum, Quentin Casasnovas
For more targeted fuzzing, it's better to disable kernel-wide
instrumentation and instead enable it on a per-subsystem basis. This
follows the pattern of UBSAN and allows you to compile in the kcov driver
without instrumenting the whole kernel.

To instrument a part of the kernel, you can use either

# for a single file in the current directory
KCOV_INSTRUMENT_filename.o := y

or

# for all the files in the current directory (excluding subdirectories)
KCOV_INSTRUMENT := y

or

# (same as above)
ccflags-y += $(CFLAGS_KCOV)

or

# for all the files in the current directory (including subdirectories)
subdir-ccflags-y += $(CFLAGS_KCOV)

Cc: Dmitry Vyukov <dvy...@google.com>
Cc: Quentin Casasnovas <quentin.c...@oracle.com>
Signed-off-by: Vegard Nossum <vegard...@oracle.com>
---
lib/Kconfig.debug | 11 +++++++++++
scripts/Makefile.lib | 2 +-
2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index f4b797a..6c64243 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -717,6 +717,17 @@ config KCOV

For more details, see Documentation/kcov.txt.

+config KCOV_INSTRUMENT_ALL
+ bool "Instrument all code by default"
+ depends on KCOV
+ default y if KCOV
+ help
+ If you are doing generic system call fuzzing (like e.g. syzkaller),
+ then you will want to instrument the whole kernel and you should
+ say y here. If you are doing more targeted fuzzing (like e.g.
+ filesystem fuzzing with AFL) then you will want to enable coverage
+ for more specific subsets of files, and should say n here.
+
config DEBUG_SHIRQ
bool "Debug shared IRQ handlers"
depends on DEBUG_KERNEL
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
index ddf83d0..859a837 100644
--- a/scripts/Makefile.lib
+++ b/scripts/Makefile.lib
@@ -138,7 +138,7 @@ endif

ifeq ($(CONFIG_KCOV),y)
_c_flags += $(if $(patsubst n%,, \
- $(KCOV_INSTRUMENT_$(basetarget).o)$(KCOV_INSTRUMENT)y), \
+ $(KCOV_INSTRUMENT_$(basetarget).o)$(KCOV_INSTRUMENT)$(CONFIG_KCOV_INSTRUMENT_ALL)), \
$(CFLAGS_KCOV))
endif

--
1.9.1

Reply all
Reply to author
Forward
0 new messages