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
|
|
|
#
|
|
|
|
|
|
|
|
# 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
|
|
|
|
2010-08-02 17:17:31 +08:00
|
|
|
setup-y += a20.o bioscall.o cmdline.o copy.o cpu.o cpucheck.o
|
|
|
|
setup-y += early_serial_console.o edd.o header.o main.o mca.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
|
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)
|
2008-02-04 23:48:00 +08:00
|
|
|
hostprogs-y := mkcpustr tools/build
|
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__
|
|
|
|
|
2008-02-04 23:48:00 +08:00
|
|
|
$(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)
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
2007-07-12 03:18:56 +08:00
|
|
|
# How to compile the 16-bit code. Note we always compile for -march=i386,
|
|
|
|
# that way we can complain to the user if the CPU is insufficient.
|
2012-10-03 01:01:26 +08:00
|
|
|
KBUILD_CFLAGS := $(USERINCLUDE) -g -Os -D_SETUP -D__KERNEL__ \
|
2009-04-02 08:35:00 +08:00
|
|
|
-DDISABLE_BRANCH_PROFILING \
|
2007-07-12 03:18:56 +08:00
|
|
|
-Wall -Wstrict-prototypes \
|
|
|
|
-march=i386 -mregparm=3 \
|
|
|
|
-include $(srctree)/$(src)/code16gcc.h \
|
2012-08-11 02:49:06 +08:00
|
|
|
-fno-strict-aliasing -fomit-frame-pointer -fno-pic \
|
2007-07-12 03:18:56 +08:00
|
|
|
$(call cc-option, -ffreestanding) \
|
|
|
|
$(call cc-option, -fno-toplevel-reorder,\
|
|
|
|
$(call cc-option, -fno-unit-at-a-time)) \
|
|
|
|
$(call cc-option, -fno-stack-protector) \
|
|
|
|
$(call cc-option, -mpreferred-stack-boundary=2)
|
2009-04-02 08:35:00 +08:00
|
|
|
KBUILD_CFLAGS += $(call cc-option, -m32)
|
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
|
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 $@
|
x86, build: Dynamically find entry points in compressed startup code
We have historically hard-coded entry points in head.S just so it's easy
to build the executable/bzImage headers with references to them.
Unfortunately, this leads to boot loaders abusing these "known" addresses
even when they are *explicitly* told that they "should look at the ELF
header to find this address, as it may change in the future". And even
when the address in question *has* actually been changed in the past,
without fanfare or thought to compatibility.
Thus we have bootloaders doing stunningly broken things like jumping
to offset 0x200 in the kernel startup code in 64-bit mode, *hoping*
that startup_64 is still there (it has moved at least once
before). And hoping that it's actually a 64-bit kernel despite the
fact that we don't give them any indication of that fact.
This patch should hopefully remove the temptation to abuse internal
addresses in future, where sternly worded comments have not sufficed.
Instead of having hard-coded addresses and saying "please don't abuse
these", we actually pull the addresses out of the ELF payload into
zoffset.h, and make build.c shove them back into the right places in
the bzImage header.
Rather than including zoffset.h into build.c and thus having to rebuild
the tool for every kernel build, we parse it instead. The parsing code
is small and simple.
This patch doesn't actually move any of the interesting entry points, so
any offending bootloader will still continue to "work" after this patch
is applied. For some version of "work" which includes jumping into the
compressed payload and crashing, if the bzImage it's given is a 32-bit
kernel. No change there then.
[ hpa: some of the issues in the description are addressed or
retconned by the 2.12 boot protocol. This patch has been edited to
only remove fixed addresses that were *not* thus retconned. ]
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Link: http://lkml.kernel.org/r/1358513837.2397.247.camel@shinybook.infradead.org
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Cc: Matt Fleming <matt.fleming@intel.com>
2013-01-10 22:31:59 +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
|
|
|
|
2009-05-12 05:21:12 +08:00
|
|
|
sed-voffset := -e 's/^\([0-9a-fA-F]*\) . \(_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, build: Dynamically find entry points in compressed startup code
We have historically hard-coded entry points in head.S just so it's easy
to build the executable/bzImage headers with references to them.
Unfortunately, this leads to boot loaders abusing these "known" addresses
even when they are *explicitly* told that they "should look at the ELF
header to find this address, as it may change in the future". And even
when the address in question *has* actually been changed in the past,
without fanfare or thought to compatibility.
Thus we have bootloaders doing stunningly broken things like jumping
to offset 0x200 in the kernel startup code in 64-bit mode, *hoping*
that startup_64 is still there (it has moved at least once
before). And hoping that it's actually a 64-bit kernel despite the
fact that we don't give them any indication of that fact.
This patch should hopefully remove the temptation to abuse internal
addresses in future, where sternly worded comments have not sufficed.
Instead of having hard-coded addresses and saying "please don't abuse
these", we actually pull the addresses out of the ELF payload into
zoffset.h, and make build.c shove them back into the right places in
the bzImage header.
Rather than including zoffset.h into build.c and thus having to rebuild
the tool for every kernel build, we parse it instead. The parsing code
is small and simple.
This patch doesn't actually move any of the interesting entry points, so
any offending bootloader will still continue to "work" after this patch
is applied. For some version of "work" which includes jumping into the
compressed payload and crashing, if the bzImage it's given is a 32-bit
kernel. No change there then.
[ hpa: some of the issues in the description are addressed or
retconned by the 2.12 boot protocol. This patch has been edited to
only remove fixed addresses that were *not* thus retconned. ]
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Link: http://lkml.kernel.org/r/1358513837.2397.247.camel@shinybook.infradead.org
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Cc: Matt Fleming <matt.fleming@intel.com>
2013-01-10 22:31:59 +08:00
|
|
|
sed-zoffset := -e 's/^\([0-9a-fA-F]*\) . \(startup_32\|startup_64\|efi_pe_entry\|efi_stub_entry\|input_data\|_end\|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)"
|