2005-04-17 06:20:36 +08:00
|
|
|
#
|
2007-10-11 17:16:45 +08:00
|
|
|
# arch/x86/boot/Makefile
|
2005-04-17 06:20:36 +08:00
|
|
|
#
|
|
|
|
# This file is subject to the terms and conditions of the GNU General Public
|
|
|
|
# License. See the file "COPYING" in the main directory of this archive
|
|
|
|
# for more details.
|
|
|
|
#
|
|
|
|
# Copyright (C) 1994 by Linus Torvalds
|
2009-03-12 01:55:33 +08:00
|
|
|
# Changed by many, many contributors over the years.
|
2005-04-17 06:20:36 +08:00
|
|
|
#
|
|
|
|
|
2016-02-29 12:22:34 +08:00
|
|
|
KASAN_SANITIZE := n
|
|
|
|
OBJECT_FILES_NON_STANDARD := y
|
2015-11-06 10:51:09 +08:00
|
|
|
|
kernel: add kcov code coverage
kcov provides code coverage collection for coverage-guided fuzzing
(randomized testing). Coverage-guided fuzzing is a testing technique
that uses coverage feedback to determine new interesting inputs to a
system. A notable user-space example is AFL
(http://lcamtuf.coredump.cx/afl/). However, this technique is not
widely used for kernel testing due to missing compiler and kernel
support.
kcov does not aim to collect as much coverage as possible. It aims to
collect more or less stable coverage that is function of syscall inputs.
To achieve this goal it does not collect coverage in soft/hard
interrupts and instrumentation of some inherently non-deterministic or
non-interesting parts of kernel is disbled (e.g. scheduler, locking).
Currently there is a single coverage collection mode (tracing), but the
API anticipates additional collection modes. Initially I also
implemented a second mode which exposes coverage in a fixed-size hash
table of counters (what Quentin used in his original patch). I've
dropped the second mode for simplicity.
This patch adds the necessary support on kernel side. The complimentary
compiler support was added in gcc revision 231296.
We've used this support to build syzkaller system call fuzzer, which has
found 90 kernel bugs in just 2 months:
https://github.com/google/syzkaller/wiki/Found-Bugs
We've also found 30+ bugs in our internal systems with syzkaller.
Another (yet unexplored) direction where kcov coverage would greatly
help is more traditional "blob mutation". For example, mounting a
random blob as a filesystem, or receiving a random blob over wire.
Why not gcov. Typical fuzzing loop looks as follows: (1) reset
coverage, (2) execute a bit of code, (3) collect coverage, repeat. A
typical coverage can be just a dozen of basic blocks (e.g. an invalid
input). In such context gcov becomes prohibitively expensive as
reset/collect coverage steps depend on total number of basic
blocks/edges in program (in case of kernel it is about 2M). Cost of
kcov depends only on number of executed basic blocks/edges. On top of
that, kernel requires per-thread coverage because there are always
background threads and unrelated processes that also produce coverage.
With inlined gcov instrumentation per-thread coverage is not possible.
kcov exposes kernel PCs and control flow to user-space which is
insecure. But debugfs should not be mapped as user accessible.
Based on a patch by Quentin Casasnovas.
[akpm@linux-foundation.org: make task_struct.kcov_mode have type `enum kcov_mode']
[akpm@linux-foundation.org: unbreak allmodconfig]
[akpm@linux-foundation.org: follow x86 Makefile layout standards]
Signed-off-by: Dmitry Vyukov <dvyukov@google.com>
Reviewed-by: Kees Cook <keescook@chromium.org>
Cc: syzkaller <syzkaller@googlegroups.com>
Cc: Vegard Nossum <vegard.nossum@oracle.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Tavis Ormandy <taviso@google.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Quentin Casasnovas <quentin.casasnovas@oracle.com>
Cc: Kostya Serebryany <kcc@google.com>
Cc: Eric Dumazet <edumazet@google.com>
Cc: Alexander Potapenko <glider@google.com>
Cc: Kees Cook <keescook@google.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Sasha Levin <sasha.levin@oracle.com>
Cc: David Drysdale <drysdale@google.com>
Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Andrey Ryabinin <ryabinin.a.a@gmail.com>
Cc: Kirill A. Shutemov <kirill@shutemov.name>
Cc: Jiri Slaby <jslaby@suse.cz>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2016-03-23 05:27:30 +08:00
|
|
|
# Kernel does not boot with kcov instrumentation here.
|
|
|
|
# One of the problems observed was insertion of __sanitizer_cov_trace_pc()
|
|
|
|
# callback into middle of per-cpu data enabling code. Thus the callback observed
|
|
|
|
# inconsistent state and crashed. We are interested mostly in syscall coverage,
|
|
|
|
# so boot code is not interesting anyway.
|
|
|
|
KCOV_INSTRUMENT := n
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
# If you want to preset the SVGA mode, uncomment the next line and
|
|
|
|
# set SVGA_MODE to whatever number you want.
|
|
|
|
# Set it to -DSVGA_MODE=NORMAL_VGA if you just want the EGA/VGA mode.
|
|
|
|
# The number is the same as you would ordinarily press at bootup.
|
|
|
|
|
2009-03-12 01:55:33 +08:00
|
|
|
SVGA_MODE := -DSVGA_MODE=NORMAL_VGA
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2009-03-12 01:55:33 +08:00
|
|
|
targets := vmlinux.bin setup.bin setup.elf bzImage
|
2009-03-13 04:43:14 +08:00
|
|
|
targets += fdimage fdimage144 fdimage288 image.iso mtools.conf
|
2008-02-04 23:48:00 +08:00
|
|
|
subdir- := compressed
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2013-10-11 08:18:13 +08:00
|
|
|
setup-y += a20.o bioscall.o cmdline.o copy.o cpu.o cpuflags.o cpucheck.o
|
2015-07-21 00:23:50 +08:00
|
|
|
setup-y += early_serial_console.o edd.o header.o main.o memory.o
|
2010-08-02 17:17:31 +08:00
|
|
|
setup-y += pm.o pmjump.o printf.o regs.o string.o tty.o video.o
|
|
|
|
setup-y += video-mode.o version.o
|
2008-01-30 20:32:49 +08:00
|
|
|
setup-$(CONFIG_X86_APM_BOOT) += apm.o
|
2007-07-12 03:18:56 +08:00
|
|
|
|
|
|
|
# The link order of the video-*.o modules can matter. In particular,
|
|
|
|
# video-vga.o *must* be listed first, followed by video-vesa.o.
|
|
|
|
# Hardware-specific drivers should follow in the order they should be
|
|
|
|
# probed, and video-bios.o should typically be last.
|
|
|
|
setup-y += video-vga.o
|
|
|
|
setup-y += video-vesa.o
|
|
|
|
setup-y += video-bios.o
|
2007-10-16 08:13:22 +08:00
|
|
|
|
2007-07-18 04:27:22 +08:00
|
|
|
targets += $(setup-y)
|
2013-10-30 23:09:45 +08:00
|
|
|
hostprogs-y := tools/build
|
|
|
|
hostprogs-$(CONFIG_X86_FEATURE_NAMES) += mkcpustr
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2012-10-12 18:19:59 +08:00
|
|
|
HOST_EXTRACFLAGS += -I$(srctree)/tools/include \
|
|
|
|
-include include/generated/autoconf.h \
|
2012-03-23 02:08:18 +08:00
|
|
|
-D__EXPORTED_HEADERS__
|
|
|
|
|
2013-10-30 23:09:45 +08:00
|
|
|
ifdef CONFIG_X86_FEATURE_NAMES
|
2008-02-04 23:48:00 +08:00
|
|
|
$(obj)/cpu.o: $(obj)/cpustr.h
|
|
|
|
|
|
|
|
quiet_cmd_cpustr = CPUSTR $@
|
|
|
|
cmd_cpustr = $(obj)/mkcpustr > $@
|
2013-10-30 23:09:45 +08:00
|
|
|
targets += cpustr.h
|
2008-02-04 23:48:00 +08:00
|
|
|
$(obj)/cpustr.h: $(obj)/mkcpustr FORCE
|
|
|
|
$(call if_changed,cpustr)
|
2013-10-30 23:09:45 +08:00
|
|
|
endif
|
2014-12-23 19:57:43 +08:00
|
|
|
clean-files += cpustr.h
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
2014-01-08 19:21:20 +08:00
|
|
|
KBUILD_CFLAGS := $(USERINCLUDE) $(REALMODE_CFLAGS) -D_SETUP
|
2007-10-16 03:59:31 +08:00
|
|
|
KBUILD_AFLAGS := $(KBUILD_CFLAGS) -D__ASSEMBLY__
|
2009-06-18 07:28:09 +08:00
|
|
|
GCOV_PROFILE := n
|
2016-01-21 07:00:55 +08:00
|
|
|
UBSAN_SANITIZE := n
|
2007-07-12 03:18:56 +08:00
|
|
|
|
2009-03-12 01:55:33 +08:00
|
|
|
$(obj)/bzImage: asflags-y := $(SVGA_MODE)
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
quiet_cmd_image = BUILD $@
|
2013-09-07 02:15:32 +08:00
|
|
|
cmd_image = $(obj)/tools/build $(obj)/setup.bin $(obj)/vmlinux.bin \
|
|
|
|
$(obj)/zoffset.h $@
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2009-03-12 01:55:33 +08:00
|
|
|
$(obj)/bzImage: $(obj)/setup.bin $(obj)/vmlinux.bin $(obj)/tools/build FORCE
|
2005-04-17 06:20:36 +08:00
|
|
|
$(call if_changed,image)
|
2005-06-22 08:15:15 +08:00
|
|
|
@echo 'Kernel: $@ is ready' ' (#'`cat .version`')'
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2008-02-04 23:47:56 +08:00
|
|
|
OBJCOPYFLAGS_vmlinux.bin := -O binary -R .note -R .comment -S
|
2005-04-17 06:20:36 +08:00
|
|
|
$(obj)/vmlinux.bin: $(obj)/compressed/vmlinux FORCE
|
|
|
|
$(call if_changed,objcopy)
|
|
|
|
|
2007-07-12 03:18:56 +08:00
|
|
|
SETUP_OBJS = $(addprefix $(obj)/,$(setup-y))
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2014-05-06 06:23:35 +08:00
|
|
|
sed-voffset := -e 's/^\([0-9a-fA-F]*\) [ABCDGRSTVW] \(_text\|_end\)$$/\#define VO_\2 0x\1/p'
|
2008-02-14 04:54:58 +08:00
|
|
|
|
2009-05-12 05:21:12 +08:00
|
|
|
quiet_cmd_voffset = VOFFSET $@
|
|
|
|
cmd_voffset = $(NM) $< | sed -n $(sed-voffset) > $@
|
2008-02-14 04:54:58 +08:00
|
|
|
|
2009-05-12 05:21:12 +08:00
|
|
|
targets += voffset.h
|
|
|
|
$(obj)/voffset.h: vmlinux FORCE
|
|
|
|
$(call if_changed,voffset)
|
|
|
|
|
x86/boot: Calculate decompression size during boot not build
Currently z_extract_offset is calculated in boot/compressed/mkpiggy.c.
This doesn't work well because mkpiggy.c doesn't know the details of the
decompressor in use. As a result, it can only make an estimation, which
has risks:
- output + output_len (VO) could be much bigger than input + input_len
(ZO). In this case, the decompressed kernel plus relocs could overwrite
the decompression code while it is running.
- The head code of ZO could be bigger than z_extract_offset. In this case
an overwrite could happen when the head code is running to move ZO to
the end of buffer. Though currently the size of the head code is very
small it's still a potential risk. Since there is no rule to limit the
size of the head code of ZO, it runs the risk of suddenly becoming a
(hard to find) bug.
Instead, this moves the z_extract_offset calculation into header.S, and
makes adjustments to be sure that the above two cases can never happen,
and further corrects the comments describing the calculations.
Since we have (in the previous patch) made ZO always be located against
the end of decompression buffer, z_extract_offset is only used here to
calculate an appropriate buffer size (INIT_SIZE), and is not longer used
elsewhere. As such, it can be removed from voffset.h.
Additionally clean up #if/#else #define to improve readability.
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Signed-off-by: Baoquan He <bhe@redhat.com>
[ Rewrote the changelog and comments. ]
Signed-off-by: Kees Cook <keescook@chromium.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Dave Young <dyoung@redhat.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Vivek Goyal <vgoyal@redhat.com>
Cc: lasse.collin@tukaani.org
Link: http://lkml.kernel.org/r/1461888548-32439-4-git-send-email-keescook@chromium.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
2016-04-29 08:09:05 +08:00
|
|
|
sed-zoffset := -e 's/^\([0-9a-fA-F]*\) [ABCDGRSTVW] \(startup_32\|startup_64\|efi32_stub_entry\|efi64_stub_entry\|efi_pe_entry\|input_data\|_end\|_ehead\|_text\|z_.*\)$$/\#define ZO_\2 0x\1/p'
|
2009-05-12 05:21:12 +08:00
|
|
|
|
|
|
|
quiet_cmd_zoffset = ZOFFSET $@
|
|
|
|
cmd_zoffset = $(NM) $< | sed -n $(sed-zoffset) > $@
|
|
|
|
|
|
|
|
targets += zoffset.h
|
|
|
|
$(obj)/zoffset.h: $(obj)/compressed/vmlinux FORCE
|
|
|
|
$(call if_changed,zoffset)
|
2008-02-14 04:54:58 +08:00
|
|
|
|
|
|
|
|
|
|
|
AFLAGS_header.o += -I$(obj)
|
2009-05-12 05:21:12 +08:00
|
|
|
$(obj)/header.o: $(obj)/voffset.h $(obj)/zoffset.h
|
2008-02-14 04:54:58 +08:00
|
|
|
|
2007-07-12 03:18:56 +08:00
|
|
|
LDFLAGS_setup.elf := -T
|
|
|
|
$(obj)/setup.elf: $(src)/setup.ld $(SETUP_OBJS) FORCE
|
2005-04-17 06:20:36 +08:00
|
|
|
$(call if_changed,ld)
|
|
|
|
|
2007-07-12 03:18:56 +08:00
|
|
|
OBJCOPYFLAGS_setup.bin := -O binary
|
|
|
|
$(obj)/setup.bin: $(obj)/setup.elf FORCE
|
|
|
|
$(call if_changed,objcopy)
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
$(obj)/compressed/vmlinux: FORCE
|
2008-10-05 03:18:51 +08:00
|
|
|
$(Q)$(MAKE) $(build)=$(obj)/compressed $@
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2009-03-13 03:50:33 +08:00
|
|
|
# Set this if you want to pass append arguments to the
|
|
|
|
# bzdisk/fdimage/isoimage kernel
|
2008-02-04 23:48:00 +08:00
|
|
|
FDARGS =
|
2009-03-13 03:50:33 +08:00
|
|
|
# Set this if you want an initrd included with the
|
|
|
|
# bzdisk/fdimage/isoimage kernel
|
2006-03-26 17:36:59 +08:00
|
|
|
FDINITRD =
|
|
|
|
|
|
|
|
image_cmdline = default linux $(FDARGS) $(if $(FDINITRD),initrd=initrd.img,)
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
$(obj)/mtools.conf: $(src)/mtools.conf.in
|
|
|
|
sed -e 's|@OBJ@|$(obj)|g' < $< > $@
|
|
|
|
|
|
|
|
# This requires write access to /dev/fd0
|
2009-03-13 03:50:33 +08:00
|
|
|
bzdisk: $(obj)/bzImage $(obj)/mtools.conf
|
2005-04-17 06:20:36 +08:00
|
|
|
MTOOLSRC=$(obj)/mtools.conf mformat a: ; sync
|
|
|
|
syslinux /dev/fd0 ; sync
|
2006-03-26 17:36:59 +08:00
|
|
|
echo '$(image_cmdline)' | \
|
2005-04-17 06:20:36 +08:00
|
|
|
MTOOLSRC=$(src)/mtools.conf mcopy - a:syslinux.cfg
|
2006-03-26 17:36:59 +08:00
|
|
|
if [ -f '$(FDINITRD)' ] ; then \
|
|
|
|
MTOOLSRC=$(obj)/mtools.conf mcopy '$(FDINITRD)' a:initrd.img ; \
|
|
|
|
fi
|
2009-03-13 03:50:33 +08:00
|
|
|
MTOOLSRC=$(obj)/mtools.conf mcopy $(obj)/bzImage a:linux ; sync
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
# These require being root or having syslinux 2.02 or higher installed
|
2009-03-13 03:50:33 +08:00
|
|
|
fdimage fdimage144: $(obj)/bzImage $(obj)/mtools.conf
|
2005-04-17 06:20:36 +08:00
|
|
|
dd if=/dev/zero of=$(obj)/fdimage bs=1024 count=1440
|
|
|
|
MTOOLSRC=$(obj)/mtools.conf mformat v: ; sync
|
|
|
|
syslinux $(obj)/fdimage ; sync
|
2006-03-26 17:36:59 +08:00
|
|
|
echo '$(image_cmdline)' | \
|
2005-04-17 06:20:36 +08:00
|
|
|
MTOOLSRC=$(obj)/mtools.conf mcopy - v:syslinux.cfg
|
2006-03-26 17:36:59 +08:00
|
|
|
if [ -f '$(FDINITRD)' ] ; then \
|
|
|
|
MTOOLSRC=$(obj)/mtools.conf mcopy '$(FDINITRD)' v:initrd.img ; \
|
|
|
|
fi
|
2009-03-13 03:50:33 +08:00
|
|
|
MTOOLSRC=$(obj)/mtools.conf mcopy $(obj)/bzImage v:linux ; sync
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2009-03-13 03:50:33 +08:00
|
|
|
fdimage288: $(obj)/bzImage $(obj)/mtools.conf
|
2005-04-17 06:20:36 +08:00
|
|
|
dd if=/dev/zero of=$(obj)/fdimage bs=1024 count=2880
|
|
|
|
MTOOLSRC=$(obj)/mtools.conf mformat w: ; sync
|
|
|
|
syslinux $(obj)/fdimage ; sync
|
2006-03-26 17:36:59 +08:00
|
|
|
echo '$(image_cmdline)' | \
|
2005-04-17 06:20:36 +08:00
|
|
|
MTOOLSRC=$(obj)/mtools.conf mcopy - w:syslinux.cfg
|
2006-03-26 17:36:59 +08:00
|
|
|
if [ -f '$(FDINITRD)' ] ; then \
|
|
|
|
MTOOLSRC=$(obj)/mtools.conf mcopy '$(FDINITRD)' w:initrd.img ; \
|
|
|
|
fi
|
2009-03-13 03:50:33 +08:00
|
|
|
MTOOLSRC=$(obj)/mtools.conf mcopy $(obj)/bzImage w:linux ; sync
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2009-03-13 03:50:33 +08:00
|
|
|
isoimage: $(obj)/bzImage
|
2006-03-26 17:36:59 +08:00
|
|
|
-rm -rf $(obj)/isoimage
|
|
|
|
mkdir $(obj)/isoimage
|
2006-06-26 19:58:41 +08:00
|
|
|
for i in lib lib64 share end ; do \
|
|
|
|
if [ -f /usr/$$i/syslinux/isolinux.bin ] ; then \
|
|
|
|
cp /usr/$$i/syslinux/isolinux.bin $(obj)/isoimage ; \
|
|
|
|
break ; \
|
|
|
|
fi ; \
|
|
|
|
if [ $$i = end ] ; then exit 1 ; fi ; \
|
|
|
|
done
|
2009-03-13 03:50:33 +08:00
|
|
|
cp $(obj)/bzImage $(obj)/isoimage/linux
|
2006-03-26 17:36:59 +08:00
|
|
|
echo '$(image_cmdline)' > $(obj)/isoimage/isolinux.cfg
|
|
|
|
if [ -f '$(FDINITRD)' ] ; then \
|
|
|
|
cp '$(FDINITRD)' $(obj)/isoimage/initrd.img ; \
|
|
|
|
fi
|
|
|
|
mkisofs -J -r -o $(obj)/image.iso -b isolinux.bin -c boot.cat \
|
|
|
|
-no-emul-boot -boot-load-size 4 -boot-info-table \
|
|
|
|
$(obj)/isoimage
|
2008-09-06 12:28:27 +08:00
|
|
|
isohybrid $(obj)/image.iso 2>/dev/null || true
|
2006-03-26 17:36:59 +08:00
|
|
|
rm -rf $(obj)/isoimage
|
|
|
|
|
2009-03-13 03:50:33 +08:00
|
|
|
bzlilo: $(obj)/bzImage
|
2005-04-17 06:20:36 +08:00
|
|
|
if [ -f $(INSTALL_PATH)/vmlinuz ]; then mv $(INSTALL_PATH)/vmlinuz $(INSTALL_PATH)/vmlinuz.old; fi
|
|
|
|
if [ -f $(INSTALL_PATH)/System.map ]; then mv $(INSTALL_PATH)/System.map $(INSTALL_PATH)/System.old; fi
|
2009-03-13 03:50:33 +08:00
|
|
|
cat $(obj)/bzImage > $(INSTALL_PATH)/vmlinuz
|
2005-04-17 06:20:36 +08:00
|
|
|
cp System.map $(INSTALL_PATH)/
|
|
|
|
if [ -x /sbin/lilo ]; then /sbin/lilo; else /etc/lilo/install; fi
|
|
|
|
|
2006-01-08 09:38:39 +08:00
|
|
|
install:
|
2009-03-13 03:50:33 +08:00
|
|
|
sh $(srctree)/$(src)/install.sh $(KERNELRELEASE) $(obj)/bzImage \
|
|
|
|
System.map "$(INSTALL_PATH)"
|