1# SPDX-License-Identifier: GPL-2.0-only 2# 3# Create a self-extracting compressed vmlinux image from the original 4# vmlinux. aboot loads and enters it like a plain vmlinux. 5# 6 7OBJECTS := head.o misc.o trampoline.o piggy.o 8OBJECTS += memcpy.o memmove.o memset.o 9OBJECTS += __divqu.o __remqu.o __divlu.o __remlu.o 10targets := vmlinux.lds vmlinux vmlinux.bin 11targets += vmlinux.bin.bz2 vmlinux.bin.gz vmlinux.bin.lz4 12targets += vmlinux.bin.lzma vmlinux.bin.lzo vmlinux.bin.xz 13targets += vmlinux.bin.zst 14targets += $(OBJECTS) 15 16# The stub runs before the kernel has identified the CPU it booted on, so 17# build it for the base Alpha instruction set rather than inheriting the 18# kernel's -mcpu=. 19KBUILD_CFLAGS := -D__KERNEL__ -std=gnu11 -Os -fno-strict-aliasing 20KBUILD_CFLAGS += -fno-PIE -ffreestanding -fno-stack-protector 21KBUILD_CFLAGS += -fno-asynchronous-unwind-tables 22KBUILD_CFLAGS += -pipe -mcpu=ev4 -mno-fp-regs -ffixed-8 23KBUILD_CFLAGS += -DDISABLE_BRANCH_PROFILING -D__DISABLE_EXPORTS 24KBUILD_CFLAGS += $(CC_FLAGS_DIALECT) 25KBUILD_AFLAGS := -D__ASSEMBLY__ $(KBUILD_CFLAGS) 26 27# The stub has no sanitizer or coverage runtime. arch/alpha/lib/lib.a is 28# built with the kernel's instrumentation and -mcpu=, so build private 29# copies of the library routines the stub needs instead of linking it. 30UBSAN_SANITIZE := n 31GCOV_PROFILE := n 32 33$(obj)/memcpy.o: $(srctree)/arch/alpha/lib/memcpy.c FORCE 34 $(call if_changed_dep,cc_o_c) 35 36$(obj)/memmove.o: $(srctree)/arch/alpha/lib/memmove.S FORCE 37 $(call if_changed_dep,as_o_S) 38 39$(obj)/memset.o: $(srctree)/arch/alpha/lib/memset.S FORCE 40 $(call if_changed_dep,as_o_S) 41 42AFLAGS___divqu.o := -DDIV 43AFLAGS___remqu.o := -DREM 44AFLAGS___divlu.o := -DDIV -DINTSIZE 45AFLAGS___remlu.o := -DREM -DINTSIZE 46 47$(addprefix $(obj)/,__divqu.o __remqu.o __divlu.o __remlu.o): $(srctree)/arch/alpha/lib/divide.S FORCE 48 $(call if_changed_dep,as_o_S) 49 50# zstd's decompressor uses __builtin_ctzll()/__builtin_clzll(). Those are 51# inline code only with the CIX extension, which the base instruction set 52# the stub is built for does not have, so they become calls to libgcc's 53# __ctzdi2/__clzdi2. 54LIBGCC := $(shell $(CC) -print-libgcc-file-name) 55 56LDFLAGS_vmlinux := -X --orphan-handling=warn -T 57$(obj)/vmlinux: $(obj)/vmlinux.lds $(addprefix $(obj)/, $(OBJECTS)) $(LIBGCC) FORCE 58 $(call if_changed,ld) 59 60OBJCOPYFLAGS_vmlinux.bin := -R .comment -R .note -S 61$(obj)/vmlinux.bin: vmlinux FORCE 62 $(call if_changed,objcopy) 63 64suffix-$(CONFIG_KERNEL_BZIP2) := bz2 65suffix-$(CONFIG_KERNEL_GZIP) := gz 66suffix-$(CONFIG_KERNEL_LZ4) := lz4 67suffix-$(CONFIG_KERNEL_LZMA) := lzma 68suffix-$(CONFIG_KERNEL_LZO) := lzo 69suffix-$(CONFIG_KERNEL_XZ) := xz 70suffix-$(CONFIG_KERNEL_ZSTD) := zst 71 72$(obj)/vmlinux.bin.bz2: $(obj)/vmlinux.bin FORCE 73 $(call if_changed,bzip2_with_size) 74$(obj)/vmlinux.bin.gz: $(obj)/vmlinux.bin FORCE 75 $(call if_changed,gzip) 76$(obj)/vmlinux.bin.lz4: $(obj)/vmlinux.bin FORCE 77 $(call if_changed,lz4_with_size) 78$(obj)/vmlinux.bin.lzma: $(obj)/vmlinux.bin FORCE 79 $(call if_changed,lzma_with_size) 80$(obj)/vmlinux.bin.lzo: $(obj)/vmlinux.bin FORCE 81 $(call if_changed,lzo_with_size) 82$(obj)/vmlinux.bin.xz: $(obj)/vmlinux.bin FORCE 83 $(call if_changed,xzkern_with_size) 84$(obj)/vmlinux.bin.zst: $(obj)/vmlinux.bin FORCE 85 $(call if_changed,zstd22_with_size) 86 87LDFLAGS_piggy.o := -r --format binary --oformat elf64-alpha -T 88$(obj)/piggy.o: $(obj)/vmlinux.scr $(obj)/vmlinux.bin.$(suffix-y) FORCE 89 $(call if_changed,ld) 90