mirror of
https://github.com/torvalds/linux.git
synced 2024-11-17 09:31:50 +00:00
b8ff87a615
The EFI handover code only works if the "bitness" of the firmware and the kernel match, i.e. 64-bit firmware and 64-bit kernel - it is not possible to mix the two. This goes against the tradition that a 32-bit kernel can be loaded on a 64-bit BIOS platform without having to do anything special in the boot loader. Linux distributions, for one thing, regularly run only 32-bit kernels on their live media. Despite having only one 'handover_offset' field in the kernel header, EFI boot loaders use two separate entry points to enter the kernel based on the architecture the boot loader was compiled for, (1) 32-bit loader: handover_offset (2) 64-bit loader: handover_offset + 512 Since we already have two entry points, we can leverage them to infer the bitness of the firmware we're running on, without requiring any boot loader modifications, by making (1) and (2) valid entry points for both CONFIG_X86_32 and CONFIG_X86_64 kernels. To be clear, a 32-bit boot loader will always use (1) and a 64-bit boot loader will always use (2). It's just that, if a single kernel image supports (1) and (2) that image can be used with both 32-bit and 64-bit boot loaders, and hence both 32-bit and 64-bit EFI. (1) and (2) must be 512 bytes apart at all times, but that is already part of the boot ABI and we could never change that delta without breaking existing boot loaders anyhow. Signed-off-by: Matt Fleming <matt.fleming@intel.com>
184 lines
6.2 KiB
Makefile
184 lines
6.2 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.
|
|
#
|
|
|
|
# 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 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
|
|
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 := mkcpustr tools/build
|
|
|
|
HOST_EXTRACFLAGS += -I$(srctree)/tools/include \
|
|
-include include/generated/autoconf.h \
|
|
-D__EXPORTED_HEADERS__
|
|
|
|
$(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)
|
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
KBUILD_CFLAGS := $(USERINCLUDE) $(REALMODE_CFLAGS) -D_SETUP
|
|
KBUILD_AFLAGS := $(KBUILD_CFLAGS) -D__ASSEMBLY__
|
|
GCOV_PROFILE := 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]*\) . \(_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]*\) . \(startup_32\|startup_64\|efi32_stub_entry\|efi64_stub_entry\|efi_pe_entry\|input_data\|_end\|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)"
|