mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 13:55:32 +00:00
![Yinghai Lu](/assets/img/avatar_default.png)
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>
198 lines
6.7 KiB
Makefile
198 lines
6.7 KiB
Makefile
#
|
|
# arch/x86/boot/Makefile
|
|
#
|
|
# 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
|
|
# Changed by many, many contributors over the years.
|
|
#
|
|
|
|
KASAN_SANITIZE := n
|
|
OBJECT_FILES_NON_STANDARD := y
|
|
|
|
# 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
|
|
|
|
# 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.
|
|
|
|
SVGA_MODE := -DSVGA_MODE=NORMAL_VGA
|
|
|
|
targets := vmlinux.bin setup.bin setup.elf bzImage
|
|
targets += fdimage fdimage144 fdimage288 image.iso mtools.conf
|
|
subdir- := compressed
|
|
|
|
setup-y += a20.o bioscall.o cmdline.o copy.o cpu.o cpuflags.o cpucheck.o
|
|
setup-y += early_serial_console.o edd.o header.o main.o memory.o
|
|
setup-y += pm.o pmjump.o printf.o regs.o string.o tty.o video.o
|
|
setup-y += video-mode.o version.o
|
|
setup-$(CONFIG_X86_APM_BOOT) += apm.o
|
|
|
|
# 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
|
|
|
|
targets += $(setup-y)
|
|
hostprogs-y := tools/build
|
|
hostprogs-$(CONFIG_X86_FEATURE_NAMES) += mkcpustr
|
|
|
|
HOST_EXTRACFLAGS += -I$(srctree)/tools/include \
|
|
-include include/generated/autoconf.h \
|
|
-D__EXPORTED_HEADERS__
|
|
|
|
ifdef CONFIG_X86_FEATURE_NAMES
|
|
$(obj)/cpu.o: $(obj)/cpustr.h
|
|
|
|
quiet_cmd_cpustr = CPUSTR $@
|
|
cmd_cpustr = $(obj)/mkcpustr > $@
|
|
targets += cpustr.h
|
|
$(obj)/cpustr.h: $(obj)/mkcpustr FORCE
|
|
$(call if_changed,cpustr)
|
|
endif
|
|
clean-files += cpustr.h
|
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
KBUILD_CFLAGS := $(USERINCLUDE) $(REALMODE_CFLAGS) -D_SETUP
|
|
KBUILD_AFLAGS := $(KBUILD_CFLAGS) -D__ASSEMBLY__
|
|
GCOV_PROFILE := n
|
|
UBSAN_SANITIZE := n
|
|
|
|
$(obj)/bzImage: asflags-y := $(SVGA_MODE)
|
|
|
|
quiet_cmd_image = BUILD $@
|
|
cmd_image = $(obj)/tools/build $(obj)/setup.bin $(obj)/vmlinux.bin \
|
|
$(obj)/zoffset.h $@
|
|
|
|
$(obj)/bzImage: $(obj)/setup.bin $(obj)/vmlinux.bin $(obj)/tools/build FORCE
|
|
$(call if_changed,image)
|
|
@echo 'Kernel: $@ is ready' ' (#'`cat .version`')'
|
|
|
|
OBJCOPYFLAGS_vmlinux.bin := -O binary -R .note -R .comment -S
|
|
$(obj)/vmlinux.bin: $(obj)/compressed/vmlinux FORCE
|
|
$(call if_changed,objcopy)
|
|
|
|
SETUP_OBJS = $(addprefix $(obj)/,$(setup-y))
|
|
|
|
sed-voffset := -e 's/^\([0-9a-fA-F]*\) [ABCDGRSTVW] \(_text\|_end\)$$/\#define VO_\2 0x\1/p'
|
|
|
|
quiet_cmd_voffset = VOFFSET $@
|
|
cmd_voffset = $(NM) $< | sed -n $(sed-voffset) > $@
|
|
|
|
targets += voffset.h
|
|
$(obj)/voffset.h: vmlinux FORCE
|
|
$(call if_changed,voffset)
|
|
|
|
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'
|
|
|
|
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)
|
|
|
|
|
|
AFLAGS_header.o += -I$(obj)
|
|
$(obj)/header.o: $(obj)/voffset.h $(obj)/zoffset.h
|
|
|
|
LDFLAGS_setup.elf := -T
|
|
$(obj)/setup.elf: $(src)/setup.ld $(SETUP_OBJS) FORCE
|
|
$(call if_changed,ld)
|
|
|
|
OBJCOPYFLAGS_setup.bin := -O binary
|
|
$(obj)/setup.bin: $(obj)/setup.elf FORCE
|
|
$(call if_changed,objcopy)
|
|
|
|
$(obj)/compressed/vmlinux: FORCE
|
|
$(Q)$(MAKE) $(build)=$(obj)/compressed $@
|
|
|
|
# Set this if you want to pass append arguments to the
|
|
# bzdisk/fdimage/isoimage kernel
|
|
FDARGS =
|
|
# Set this if you want an initrd included with the
|
|
# bzdisk/fdimage/isoimage kernel
|
|
FDINITRD =
|
|
|
|
image_cmdline = default linux $(FDARGS) $(if $(FDINITRD),initrd=initrd.img,)
|
|
|
|
$(obj)/mtools.conf: $(src)/mtools.conf.in
|
|
sed -e 's|@OBJ@|$(obj)|g' < $< > $@
|
|
|
|
# This requires write access to /dev/fd0
|
|
bzdisk: $(obj)/bzImage $(obj)/mtools.conf
|
|
MTOOLSRC=$(obj)/mtools.conf mformat a: ; sync
|
|
syslinux /dev/fd0 ; sync
|
|
echo '$(image_cmdline)' | \
|
|
MTOOLSRC=$(src)/mtools.conf mcopy - a:syslinux.cfg
|
|
if [ -f '$(FDINITRD)' ] ; then \
|
|
MTOOLSRC=$(obj)/mtools.conf mcopy '$(FDINITRD)' a:initrd.img ; \
|
|
fi
|
|
MTOOLSRC=$(obj)/mtools.conf mcopy $(obj)/bzImage a:linux ; sync
|
|
|
|
# These require being root or having syslinux 2.02 or higher installed
|
|
fdimage fdimage144: $(obj)/bzImage $(obj)/mtools.conf
|
|
dd if=/dev/zero of=$(obj)/fdimage bs=1024 count=1440
|
|
MTOOLSRC=$(obj)/mtools.conf mformat v: ; sync
|
|
syslinux $(obj)/fdimage ; sync
|
|
echo '$(image_cmdline)' | \
|
|
MTOOLSRC=$(obj)/mtools.conf mcopy - v:syslinux.cfg
|
|
if [ -f '$(FDINITRD)' ] ; then \
|
|
MTOOLSRC=$(obj)/mtools.conf mcopy '$(FDINITRD)' v:initrd.img ; \
|
|
fi
|
|
MTOOLSRC=$(obj)/mtools.conf mcopy $(obj)/bzImage v:linux ; sync
|
|
|
|
fdimage288: $(obj)/bzImage $(obj)/mtools.conf
|
|
dd if=/dev/zero of=$(obj)/fdimage bs=1024 count=2880
|
|
MTOOLSRC=$(obj)/mtools.conf mformat w: ; sync
|
|
syslinux $(obj)/fdimage ; sync
|
|
echo '$(image_cmdline)' | \
|
|
MTOOLSRC=$(obj)/mtools.conf mcopy - w:syslinux.cfg
|
|
if [ -f '$(FDINITRD)' ] ; then \
|
|
MTOOLSRC=$(obj)/mtools.conf mcopy '$(FDINITRD)' w:initrd.img ; \
|
|
fi
|
|
MTOOLSRC=$(obj)/mtools.conf mcopy $(obj)/bzImage w:linux ; sync
|
|
|
|
isoimage: $(obj)/bzImage
|
|
-rm -rf $(obj)/isoimage
|
|
mkdir $(obj)/isoimage
|
|
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
|
|
cp $(obj)/bzImage $(obj)/isoimage/linux
|
|
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
|
|
isohybrid $(obj)/image.iso 2>/dev/null || true
|
|
rm -rf $(obj)/isoimage
|
|
|
|
bzlilo: $(obj)/bzImage
|
|
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
|
|
cat $(obj)/bzImage > $(INSTALL_PATH)/vmlinuz
|
|
cp System.map $(INSTALL_PATH)/
|
|
if [ -x /sbin/lilo ]; then /sbin/lilo; else /etc/lilo/install; fi
|
|
|
|
install:
|
|
sh $(srctree)/$(src)/install.sh $(KERNELRELEASE) $(obj)/bzImage \
|
|
System.map "$(INSTALL_PATH)"
|