2012-04-20 07:45:54 -06:00
|
|
|
#
|
|
|
|
# arch/arm64/Makefile
|
|
|
|
#
|
|
|
|
# This file is included by the global makefile so that you can add your own
|
|
|
|
# architecture-specific flags and dependencies.
|
|
|
|
#
|
|
|
|
# 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) 1995-2001 by Russell King
|
|
|
|
|
|
|
|
LDFLAGS_vmlinux :=-p --no-undefined -X
|
|
|
|
CPPFLAGS_vmlinux.lds = -DTEXT_OFFSET=$(TEXT_OFFSET)
|
|
|
|
GZFLAGS :=-9
|
|
|
|
|
arm64: prevent regressions in compressed kernel image size when upgrading to binutils 2.27
Upon upgrading to binutils 2.27, we found that our lz4 and gzip
compressed kernel images were significantly larger, resulting is 10ms
boot time regressions.
As noted by Rahul:
"aarch64 binaries uses RELA relocations, where each relocation entry
includes an addend value. This is similar to x86_64. On x86_64, the
addend values are also stored at the relocation offset for relative
relocations. This is an optimization: in the case where code does not
need to be relocated, the loader can simply skip processing relative
relocations. In binutils-2.25, both bfd and gold linkers did this for
x86_64, but only the gold linker did this for aarch64. The kernel build
here is using the bfd linker, which stored zeroes at the relocation
offsets for relative relocations. Since a set of zeroes compresses
better than a set of non-zero addend values, this behavior was resulting
in much better lz4 compression.
The bfd linker in binutils-2.27 is now storing the actual addend values
at the relocation offsets. The behavior is now consistent with what it
does for x86_64 and what gold linker does for both architectures. The
change happened in this upstream commit:
https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=1f56df9d0d5ad89806c24e71f296576d82344613
Since a bunch of zeroes got replaced by non-zero addend values, we see
the side effect of lz4 compressed image being a bit bigger.
To get the old behavior from the bfd linker, "--no-apply-dynamic-relocs"
flag can be used:
$ LDFLAGS="--no-apply-dynamic-relocs" make
With this flag, the compressed image size is back to what it was with
binutils-2.25.
If the kernel is using ASLR, there aren't additional runtime costs to
--no-apply-dynamic-relocs, as the relocations will need to be applied
again anyway after the kernel is relocated to a random address.
If the kernel is not using ASLR, then presumably the current default
behavior of the linker is better. Since the static linker performed the
dynamic relocs, and the kernel is not moved to a different address at
load time, it can skip applying the relocations all over again."
Some measurements:
$ ld -v
GNU ld (binutils-2.25-f3d35cf6) 2.25.51.20141117
^
$ ls -l vmlinux
-rwxr-x--- 1 ndesaulniers eng 300652760 Oct 26 11:57 vmlinux
$ ls -l Image.lz4-dtb
-rw-r----- 1 ndesaulniers eng 16932627 Oct 26 11:57 Image.lz4-dtb
$ ld -v
GNU ld (binutils-2.27-53dd00a1) 2.27.0.20170315
^
pre patch:
$ ls -l vmlinux
-rwxr-x--- 1 ndesaulniers eng 300376208 Oct 26 11:43 vmlinux
$ ls -l Image.lz4-dtb
-rw-r----- 1 ndesaulniers eng 18159474 Oct 26 11:43 Image.lz4-dtb
post patch:
$ ls -l vmlinux
-rwxr-x--- 1 ndesaulniers eng 300376208 Oct 26 12:06 vmlinux
$ ls -l Image.lz4-dtb
-rw-r----- 1 ndesaulniers eng 16932466 Oct 26 12:06 Image.lz4-dtb
By Siqi's measurement w/ gzip:
binutils 2.27 with this patch (with --no-apply-dynamic-relocs):
Image 41535488
Image.gz 13404067
binutils 2.27 without this patch (without --no-apply-dynamic-relocs):
Image 41535488
Image.gz 14125516
Any compression scheme should be able to get better results from the
longer runs of zeros, not just GZIP and LZ4.
10ms boot time savings isn't anything to get excited about, but users of
arm64+compression+bfd-2.27 should not have to pay a penalty for no
runtime improvement.
Reported-by: Gopinath Elanchezhian <gelanchezhian@google.com>
Reported-by: Sindhuri Pentyala <spentyala@google.com>
Reported-by: Wei Wang <wvw@google.com>
Suggested-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Suggested-by: Rahul Chaudhry <rahulchaudhry@google.com>
Suggested-by: Siqi Lin <siqilin@google.com>
Suggested-by: Stephen Hines <srhines@google.com>
Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>
Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
[will: added comment to Makefile]
Signed-off-by: Will Deacon <will.deacon@arm.com>
2017-10-27 10:33:41 -06:00
|
|
|
ifeq ($(CONFIG_RELOCATABLE), y)
|
|
|
|
# Pass --no-apply-dynamic-relocs to restore pre-binutils-2.27 behaviour
|
|
|
|
# for relative relocs, since this leads to better Image compression
|
|
|
|
# with the relocation offsets always being zero.
|
|
|
|
LDFLAGS_vmlinux += -pie -shared -Bsymbolic \
|
|
|
|
$(call ld-option, --no-apply-dynamic-relocs)
|
2016-01-26 01:13:44 -07:00
|
|
|
endif
|
|
|
|
|
2016-08-22 04:58:36 -06:00
|
|
|
ifeq ($(CONFIG_ARM64_ERRATUM_843419),y)
|
|
|
|
ifeq ($(call ld-option, --fix-cortex-a53-843419),)
|
|
|
|
$(warning ld does not support --fix-cortex-a53-843419; kernel may be susceptible to erratum)
|
|
|
|
else
|
|
|
|
LDFLAGS_vmlinux += --fix-cortex-a53-843419
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
2012-04-20 07:45:54 -06:00
|
|
|
KBUILD_DEFCONFIG := defconfig
|
|
|
|
|
2015-02-03 09:14:13 -07:00
|
|
|
# Check for binutils support for specific extensions
|
|
|
|
lseinstr := $(call as-instr,.arch_extension lse,-DCONFIG_AS_LSE=1)
|
|
|
|
|
|
|
|
ifeq ($(CONFIG_ARM64_LSE_ATOMICS), y)
|
|
|
|
ifeq ($(lseinstr),)
|
|
|
|
$(warning LSE atomics not supported by binutils)
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
2017-04-11 10:32:30 -06:00
|
|
|
ifeq ($(CONFIG_ARM64), y)
|
2016-12-06 08:27:43 -07:00
|
|
|
brokengasinst := $(call as-instr,1:\n.inst 0\n.rept . - 1b\n\nnop\n.endr\n,,-DCONFIG_BROKEN_GAS_INST=1)
|
|
|
|
|
2017-04-11 10:32:30 -06:00
|
|
|
ifneq ($(brokengasinst),)
|
2016-12-06 08:27:43 -07:00
|
|
|
$(warning Detected assembler with broken .inst; disassembly will be unreliable)
|
2017-04-11 10:32:30 -06:00
|
|
|
endif
|
2016-12-06 08:27:43 -07:00
|
|
|
endif
|
|
|
|
|
|
|
|
KBUILD_CFLAGS += -mgeneral-regs-only $(lseinstr) $(brokengasinst)
|
2016-01-21 20:56:26 -07:00
|
|
|
KBUILD_CFLAGS += -fno-asynchronous-unwind-tables
|
2016-12-06 08:27:43 -07:00
|
|
|
KBUILD_AFLAGS += $(lseinstr) $(brokengasinst)
|
2015-02-03 09:14:13 -07:00
|
|
|
|
2017-09-18 04:20:20 -06:00
|
|
|
KBUILD_CFLAGS += $(call cc-option,-mabi=lp64)
|
|
|
|
KBUILD_AFLAGS += $(call cc-option,-mabi=lp64)
|
|
|
|
|
2017-12-22 17:43:23 -07:00
|
|
|
ifeq ($(cc-name),clang)
|
|
|
|
KBUILD_CFLAGS += -DCONFIG_ARCH_SUPPORTS_INT128
|
|
|
|
else
|
arm64: support __int128 on gcc 5+
Versions of gcc prior to gcc 5 emitted a __multi3 function call when
dealing with TI types, resulting in failures when trying to link to
libgcc, and more generally, bad performance. However, since gcc 5,
the compiler supports actually emitting fast instructions, which means
we can at long last enable this option and receive the speedups.
The gcc commit that added proper Aarch64 support is:
https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=d1ae7bb994f49316f6f63e6173f2931e837a351d
This commit appears to be part of the gcc 5 release.
There are still a few instructions, __ashlti3 and __ashrti3, which
require libgcc, which is fine. Rather than linking to libgcc, we
simply provide them ourselves, since they're not that complicated.
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
2017-11-03 08:18:58 -06:00
|
|
|
KBUILD_CFLAGS += $(call cc-ifversion, -ge, 0500, -DCONFIG_ARCH_SUPPORTS_INT128)
|
2017-12-22 17:43:23 -07:00
|
|
|
endif
|
arm64: support __int128 on gcc 5+
Versions of gcc prior to gcc 5 emitted a __multi3 function call when
dealing with TI types, resulting in failures when trying to link to
libgcc, and more generally, bad performance. However, since gcc 5,
the compiler supports actually emitting fast instructions, which means
we can at long last enable this option and receive the speedups.
The gcc commit that added proper Aarch64 support is:
https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=d1ae7bb994f49316f6f63e6173f2931e837a351d
This commit appears to be part of the gcc 5 release.
There are still a few instructions, __ashlti3 and __ashrti3, which
require libgcc, which is fine. Rather than linking to libgcc, we
simply provide them ourselves, since they're not that complicated.
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
2017-11-03 08:18:58 -06:00
|
|
|
|
2013-10-11 07:52:08 -06:00
|
|
|
ifeq ($(CONFIG_CPU_BIG_ENDIAN), y)
|
|
|
|
KBUILD_CPPFLAGS += -mbig-endian
|
2017-06-24 09:42:11 -06:00
|
|
|
CHECKFLAGS += -D__AARCH64EB__
|
2013-10-11 07:52:08 -06:00
|
|
|
AS += -EB
|
|
|
|
LD += -EB
|
2017-09-18 04:20:20 -06:00
|
|
|
LDFLAGS += -maarch64linuxb
|
2016-08-30 02:31:35 -06:00
|
|
|
UTS_MACHINE := aarch64_be
|
2013-10-11 07:52:08 -06:00
|
|
|
else
|
2012-04-20 07:45:54 -06:00
|
|
|
KBUILD_CPPFLAGS += -mlittle-endian
|
2017-06-24 09:42:11 -06:00
|
|
|
CHECKFLAGS += -D__AARCH64EL__
|
2012-04-20 07:45:54 -06:00
|
|
|
AS += -EL
|
|
|
|
LD += -EL
|
2017-09-18 04:20:20 -06:00
|
|
|
LDFLAGS += -maarch64linux
|
2016-08-30 02:31:35 -06:00
|
|
|
UTS_MACHINE := aarch64
|
2013-10-11 07:52:08 -06:00
|
|
|
endif
|
2012-04-20 07:45:54 -06:00
|
|
|
|
2017-06-20 06:24:43 -06:00
|
|
|
CHECKFLAGS += -D__aarch64__ -m64
|
2012-04-20 07:45:54 -06:00
|
|
|
|
2015-11-24 04:37:35 -07:00
|
|
|
ifeq ($(CONFIG_ARM64_MODULE_PLTS),y)
|
|
|
|
KBUILD_LDFLAGS_MODULE += -T $(srctree)/arch/arm64/kernel/module.lds
|
|
|
|
endif
|
|
|
|
|
2012-04-20 07:45:54 -06:00
|
|
|
# Default value
|
|
|
|
head-y := arch/arm64/kernel/head.o
|
|
|
|
|
|
|
|
# The byte offset of the kernel image in RAM from the start of RAM.
|
2014-06-24 09:51:37 -06:00
|
|
|
ifeq ($(CONFIG_ARM64_RANDOMIZE_TEXT_OFFSET), y)
|
2016-05-31 08:58:00 -06:00
|
|
|
TEXT_OFFSET := $(shell awk "BEGIN {srand(); printf \"0x%06x\n\", \
|
|
|
|
int(2 * 1024 * 1024 / (2 ^ $(CONFIG_ARM64_PAGE_SHIFT)) * \
|
|
|
|
rand()) * (2 ^ $(CONFIG_ARM64_PAGE_SHIFT))}")
|
2014-06-24 09:51:37 -06:00
|
|
|
else
|
2012-04-20 07:45:54 -06:00
|
|
|
TEXT_OFFSET := 0x00080000
|
2014-06-24 09:51:37 -06:00
|
|
|
endif
|
2012-04-20 07:45:54 -06:00
|
|
|
|
2018-03-01 10:07:12 -07:00
|
|
|
# KASAN_SHADOW_OFFSET = VA_START + (1 << (VA_BITS - KASAN_SHADOW_SCALE_SHIFT))
|
|
|
|
# - (1 << (64 - KASAN_SHADOW_SCALE_SHIFT))
|
2015-10-12 09:52:58 -06:00
|
|
|
# in 32-bit arithmetic
|
2018-03-01 10:07:12 -07:00
|
|
|
KASAN_SHADOW_SCALE_SHIFT := 3
|
2015-10-12 09:52:58 -06:00
|
|
|
KASAN_SHADOW_OFFSET := $(shell printf "0x%08x00000000\n" $$(( \
|
2018-03-01 10:07:12 -07:00
|
|
|
(0xffffffff & (-1 << ($(CONFIG_ARM64_VA_BITS) - 32))) \
|
|
|
|
+ (1 << ($(CONFIG_ARM64_VA_BITS) - 32 - $(KASAN_SHADOW_SCALE_SHIFT))) \
|
|
|
|
- (1 << (64 - 32 - $(KASAN_SHADOW_SCALE_SHIFT))) )) )
|
2015-10-12 09:52:58 -06:00
|
|
|
|
2012-04-20 07:45:54 -06:00
|
|
|
export TEXT_OFFSET GZFLAGS
|
|
|
|
|
|
|
|
core-y += arch/arm64/kernel/ arch/arm64/mm/
|
2014-08-26 22:15:30 -06:00
|
|
|
core-$(CONFIG_NET) += arch/arm64/net/
|
2012-12-10 09:41:44 -07:00
|
|
|
core-$(CONFIG_KVM) += arch/arm64/kvm/
|
2013-06-12 09:48:38 -06:00
|
|
|
core-$(CONFIG_XEN) += arch/arm64/xen/
|
2014-03-06 01:23:33 -07:00
|
|
|
core-$(CONFIG_CRYPTO) += arch/arm64/crypto/
|
2012-04-20 07:45:54 -06:00
|
|
|
libs-y := arch/arm64/lib/ $(libs-y)
|
2015-03-16 03:30:39 -06:00
|
|
|
core-$(CONFIG_EFI_STUB) += $(objtree)/drivers/firmware/efi/libstub/lib.a
|
2012-04-20 07:45:54 -06:00
|
|
|
|
|
|
|
# Default target when executing plain make
|
2016-11-22 14:34:29 -07:00
|
|
|
boot := arch/arm64/boot
|
|
|
|
KBUILD_IMAGE := $(boot)/Image.gz
|
2012-12-03 16:17:21 -07:00
|
|
|
KBUILD_DTBS := dtbs
|
2012-04-20 07:45:54 -06:00
|
|
|
|
2016-11-22 14:34:29 -07:00
|
|
|
all: Image.gz $(KBUILD_DTBS)
|
2012-04-20 07:45:54 -06:00
|
|
|
|
|
|
|
|
2015-07-16 14:26:16 -06:00
|
|
|
Image: vmlinux
|
|
|
|
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
|
|
|
|
|
2016-06-20 19:44:00 -06:00
|
|
|
Image.%: Image
|
2012-12-03 16:17:21 -07:00
|
|
|
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
|
2012-04-20 07:45:54 -06:00
|
|
|
|
2016-02-18 23:05:50 -07:00
|
|
|
zinstall install:
|
2012-12-03 16:17:21 -07:00
|
|
|
$(Q)$(MAKE) $(build)=$(boot) $@
|
2012-04-20 07:45:54 -06:00
|
|
|
|
2012-12-03 16:17:21 -07:00
|
|
|
%.dtb: scripts
|
|
|
|
$(Q)$(MAKE) $(build)=$(boot)/dts $(boot)/dts/$@
|
|
|
|
|
2014-08-29 06:17:02 -06:00
|
|
|
PHONY += dtbs dtbs_install
|
2014-09-03 07:29:24 -06:00
|
|
|
|
|
|
|
dtbs: prepare scripts
|
2014-09-03 07:54:55 -06:00
|
|
|
$(Q)$(MAKE) $(build)=$(boot)/dts
|
2012-04-20 07:45:54 -06:00
|
|
|
|
2014-09-03 07:29:24 -06:00
|
|
|
dtbs_install:
|
|
|
|
$(Q)$(MAKE) $(dtbinst)=$(boot)/dts
|
|
|
|
|
2013-06-16 13:32:44 -06:00
|
|
|
PHONY += vdso_install
|
|
|
|
vdso_install:
|
|
|
|
$(Q)$(MAKE) $(build)=arch/arm64/kernel/vdso $@
|
|
|
|
|
2012-04-20 07:45:54 -06:00
|
|
|
# We use MRPROPER_FILES and CLEAN_FILES now
|
|
|
|
archclean:
|
|
|
|
$(Q)$(MAKE) $(clean)=$(boot)
|
2015-01-19 07:57:00 -07:00
|
|
|
$(Q)$(MAKE) $(clean)=$(boot)/dts
|
2012-04-20 07:45:54 -06:00
|
|
|
|
arm64: fix vdso-offsets.h dependency
arm64/kernel/{vdso,signal}.c include vdso-offsets.h, as well as any
file that includes asm/vdso.h. Therefore, vdso-offsets.h must be
generated before these files are compiled.
The current rules in arm64/kernel/Makefile do not actually enforce
this, because even though $(obj)/vdso is listed as a prerequisite for
vdso-offsets.h, this does not result in the intended effect of
building the vdso subdirectory (before all the other objects). As a
consequence, depending on the order in which the rules are followed,
vdso-offsets.h is updated or not before arm64/kernel/{vdso,signal}.o
are built. The current rules also impose an unnecessary dependency on
vdso-offsets.h for all arm64/kernel/*.o, resulting in unnecessary
rebuilds. This is made obvious when using make -j:
touch arch/arm64/kernel/vdso/gettimeofday.S && make -j$NCPUS arch/arm64/kernel
will sometimes result in none of arm64/kernel/*.o being
rebuilt, sometimes all of them, or even just some of them.
It is quite difficult to ensure that a header is generated before it
is used with recursive Makefiles by using normal rules. Instead,
arch-specific generated headers are normally built in the archprepare
recipe in the arch Makefile (see for instance arch/ia64/Makefile).
Unfortunately, asm-offsets.h is included in gettimeofday.S, and must
therefore be generated before vdso-offsets.h, which is not the case if
archprepare is used. For this reason, a rule run after archprepare has
to be used.
This commit adds rules in arm64/Makefile to build vdso-offsets.h
during the prepare step, ensuring that vdso-offsets.h is generated
before building anything. It also removes the now-unnecessary
dependencies on vdso-offsets.h in arm64/kernel/Makefile. Finally, it
removes the duplication of asm-offsets.h between arm64/kernel/vdso/
and include/generated/ and makes include/generated/vdso-offsets.h a
target in arm64/kernel/vdso/Makefile.
Cc: Will Deacon <will.deacon@arm.com>
Cc: Michal Marek <mmarek@suse.com>
Signed-off-by: Kevin Brodsky <kevin.brodsky@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
2016-05-12 10:39:15 -06:00
|
|
|
# We need to generate vdso-offsets.h before compiling certain files in kernel/.
|
|
|
|
# In order to do that, we should use the archprepare target, but we can't since
|
|
|
|
# asm-offsets.h is included in some files used to generate vdso-offsets.h, and
|
|
|
|
# asm-offsets.h is built in prepare0, for which archprepare is a dependency.
|
|
|
|
# Therefore we need to generate the header after prepare0 has been made, hence
|
|
|
|
# this hack.
|
|
|
|
prepare: vdso_prepare
|
|
|
|
vdso_prepare: prepare0
|
|
|
|
$(Q)$(MAKE) $(build)=arch/arm64/kernel/vdso include/generated/vdso-offsets.h
|
|
|
|
|
2012-04-20 07:45:54 -06:00
|
|
|
define archhelp
|
|
|
|
echo '* Image.gz - Compressed kernel image (arch/$(ARCH)/boot/Image.gz)'
|
|
|
|
echo ' Image - Uncompressed kernel image (arch/$(ARCH)/boot/Image)'
|
2012-12-03 16:17:21 -07:00
|
|
|
echo '* dtbs - Build device tree blobs for enabled boards'
|
2014-08-29 06:17:02 -06:00
|
|
|
echo ' dtbs_install - Install dtbs to $(INSTALL_DTBS_PATH)'
|
2012-04-20 07:45:54 -06:00
|
|
|
echo ' install - Install uncompressed kernel'
|
|
|
|
echo ' zinstall - Install compressed kernel'
|
|
|
|
echo ' Install using (your) ~/bin/installkernel or'
|
|
|
|
echo ' (distribution) /sbin/installkernel or'
|
|
|
|
echo ' install to $$(INSTALL_PATH) and run lilo'
|
|
|
|
endef
|