linux/arch/x86/Makefile
<<
>>
Prefs
   1# SPDX-License-Identifier: GPL-2.0
   2# Unified Makefile for i386 and x86_64
   3
   4# select defconfig based on actual architecture
   5ifeq ($(ARCH),x86)
   6  ifeq ($(shell uname -m),x86_64)
   7        KBUILD_DEFCONFIG := x86_64_defconfig
   8  else
   9        KBUILD_DEFCONFIG := i386_defconfig
  10  endif
  11else
  12        KBUILD_DEFCONFIG := $(ARCH)_defconfig
  13endif
  14
  15# For gcc stack alignment is specified with -mpreferred-stack-boundary,
  16# clang has the option -mstack-alignment for that purpose.
  17ifneq ($(call cc-option, -mpreferred-stack-boundary=4),)
  18      cc_stack_align4 := -mpreferred-stack-boundary=2
  19      cc_stack_align8 := -mpreferred-stack-boundary=3
  20else ifneq ($(call cc-option, -mstack-alignment=16),)
  21      cc_stack_align4 := -mstack-alignment=4
  22      cc_stack_align8 := -mstack-alignment=8
  23endif
  24
  25# How to compile the 16-bit code.  Note we always compile for -march=i386;
  26# that way we can complain to the user if the CPU is insufficient.
  27REALMODE_CFLAGS := -m16 -g -Os -DDISABLE_BRANCH_PROFILING \
  28                   -Wall -Wstrict-prototypes -march=i386 -mregparm=3 \
  29                   -fno-strict-aliasing -fomit-frame-pointer -fno-pic \
  30                   -mno-mmx -mno-sse $(call cc-option,-fcf-protection=none)
  31
  32REALMODE_CFLAGS += -ffreestanding
  33REALMODE_CFLAGS += -fno-stack-protector
  34REALMODE_CFLAGS += $(call __cc-option, $(CC), $(REALMODE_CFLAGS), -Wno-address-of-packed-member)
  35REALMODE_CFLAGS += $(call __cc-option, $(CC), $(REALMODE_CFLAGS), $(cc_stack_align4))
  36REALMODE_CFLAGS += $(CLANG_FLAGS)
  37export REALMODE_CFLAGS
  38
  39# BITS is used as extension for files which are available in a 32 bit
  40# and a 64 bit version to simplify shared Makefiles.
  41# e.g.: obj-y += foo_$(BITS).o
  42export BITS
  43
  44#
  45# Prevent GCC from generating any FP code by mistake.
  46#
  47# This must happen before we try the -mpreferred-stack-boundary, see:
  48#
  49#    https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53383
  50#
  51KBUILD_CFLAGS += -mno-sse -mno-mmx -mno-sse2 -mno-3dnow
  52KBUILD_CFLAGS += $(call cc-option,-mno-avx,)
  53
  54# Intel CET isn't enabled in the kernel
  55KBUILD_CFLAGS += $(call cc-option,-fcf-protection=none)
  56
  57ifeq ($(CONFIG_X86_32),y)
  58        BITS := 32
  59        UTS_MACHINE := i386
  60        CHECKFLAGS += -D__i386__
  61
  62        biarch := $(call cc-option,-m32)
  63        KBUILD_AFLAGS += $(biarch)
  64        KBUILD_CFLAGS += $(biarch)
  65
  66        KBUILD_CFLAGS += -msoft-float -mregparm=3 -freg-struct-return
  67
  68        # Never want PIC in a 32-bit kernel, prevent breakage with GCC built
  69        # with nonstandard options
  70        KBUILD_CFLAGS += -fno-pic
  71
  72        # Align the stack to the register width instead of using the default
  73        # alignment of 16 bytes. This reduces stack usage and the number of
  74        # alignment instructions.
  75        KBUILD_CFLAGS += $(call cc-option,$(cc_stack_align4))
  76
  77        # CPU-specific tuning. Anything which can be shared with UML should go here.
  78        include arch/x86/Makefile_32.cpu
  79        KBUILD_CFLAGS += $(cflags-y)
  80
  81        # temporary until string.h is fixed
  82        KBUILD_CFLAGS += -ffreestanding
  83
  84        ifeq ($(CONFIG_STACKPROTECTOR),y)
  85                ifeq ($(CONFIG_SMP),y)
  86                        KBUILD_CFLAGS += -mstack-protector-guard-reg=fs -mstack-protector-guard-symbol=__stack_chk_guard
  87                else
  88                        KBUILD_CFLAGS += -mstack-protector-guard=global
  89                endif
  90        endif
  91else
  92        BITS := 64
  93        UTS_MACHINE := x86_64
  94        CHECKFLAGS += -D__x86_64__
  95
  96        biarch := -m64
  97        KBUILD_AFLAGS += -m64
  98        KBUILD_CFLAGS += -m64
  99
 100        # Align jump targets to 1 byte, not the default 16 bytes:
 101        KBUILD_CFLAGS += $(call cc-option,-falign-jumps=1)
 102
 103        # Pack loops tightly as well:
 104        KBUILD_CFLAGS += $(call cc-option,-falign-loops=1)
 105
 106        # Don't autogenerate traditional x87 instructions
 107        KBUILD_CFLAGS += $(call cc-option,-mno-80387)
 108        KBUILD_CFLAGS += $(call cc-option,-mno-fp-ret-in-387)
 109
 110        # By default gcc and clang use a stack alignment of 16 bytes for x86.
 111        # However the standard kernel entry on x86-64 leaves the stack on an
 112        # 8-byte boundary. If the compiler isn't informed about the actual
 113        # alignment it will generate extra alignment instructions for the
 114        # default alignment which keep the stack *mis*aligned.
 115        # Furthermore an alignment to the register width reduces stack usage
 116        # and the number of alignment instructions.
 117        KBUILD_CFLAGS += $(call cc-option,$(cc_stack_align8))
 118
 119        # Use -mskip-rax-setup if supported.
 120        KBUILD_CFLAGS += $(call cc-option,-mskip-rax-setup)
 121
 122        # FIXME - should be integrated in Makefile.cpu (Makefile_32.cpu)
 123        cflags-$(CONFIG_MK8) += $(call cc-option,-march=k8)
 124        cflags-$(CONFIG_MPSC) += $(call cc-option,-march=nocona)
 125
 126        cflags-$(CONFIG_MCORE2) += \
 127                $(call cc-option,-march=core2,$(call cc-option,-mtune=generic))
 128        cflags-$(CONFIG_MATOM) += $(call cc-option,-march=atom) \
 129                $(call cc-option,-mtune=atom,$(call cc-option,-mtune=generic))
 130        cflags-$(CONFIG_GENERIC_CPU) += $(call cc-option,-mtune=generic)
 131        KBUILD_CFLAGS += $(cflags-y)
 132
 133        KBUILD_CFLAGS += -mno-red-zone
 134        KBUILD_CFLAGS += -mcmodel=kernel
 135endif
 136
 137ifdef CONFIG_X86_X32
 138        x32_ld_ok := $(call try-run,\
 139                        /bin/echo -e '1: .quad 1b' | \
 140                        $(CC) $(KBUILD_AFLAGS) -c -x assembler -o "$$TMP" - && \
 141                        $(OBJCOPY) -O elf32-x86-64 "$$TMP" "$$TMP.o" && \
 142                        $(LD) -m elf32_x86_64 "$$TMP.o" -o "$$TMP",y,n)
 143        ifeq ($(x32_ld_ok),y)
 144                CONFIG_X86_X32_ABI := y
 145                KBUILD_AFLAGS += -DCONFIG_X86_X32_ABI
 146                KBUILD_CFLAGS += -DCONFIG_X86_X32_ABI
 147        else
 148                $(warning CONFIG_X86_X32 enabled but no binutils support)
 149        endif
 150endif
 151export CONFIG_X86_X32_ABI
 152
 153#
 154# If the function graph tracer is used with mcount instead of fentry,
 155# '-maccumulate-outgoing-args' is needed to prevent a GCC bug
 156# (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=42109)
 157#
 158ifdef CONFIG_FUNCTION_GRAPH_TRACER
 159  ifndef CONFIG_HAVE_FENTRY
 160        ACCUMULATE_OUTGOING_ARGS := 1
 161  else
 162    ifeq ($(call cc-option-yn, -mfentry), n)
 163        ACCUMULATE_OUTGOING_ARGS := 1
 164
 165        # GCC ignores '-maccumulate-outgoing-args' when used with '-Os'.
 166        # If '-Os' is enabled, disable it and print a warning.
 167        ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
 168          undefine CONFIG_CC_OPTIMIZE_FOR_SIZE
 169          $(warning Disabling CONFIG_CC_OPTIMIZE_FOR_SIZE.  Your compiler does not have -mfentry so you cannot optimize for size with CONFIG_FUNCTION_GRAPH_TRACER.)
 170        endif
 171
 172    endif
 173  endif
 174endif
 175
 176ifeq ($(ACCUMULATE_OUTGOING_ARGS), 1)
 177        # This compiler flag is not supported by Clang:
 178        KBUILD_CFLAGS += $(call cc-option,-maccumulate-outgoing-args,)
 179endif
 180
 181# Workaround for a gcc prelease that unfortunately was shipped in a suse release
 182KBUILD_CFLAGS += -Wno-sign-compare
 183#
 184KBUILD_CFLAGS += -fno-asynchronous-unwind-tables
 185
 186# Avoid indirect branches in kernel to deal with Spectre
 187ifdef CONFIG_RETPOLINE
 188  KBUILD_CFLAGS += $(RETPOLINE_CFLAGS)
 189  # Additionally, avoid generating expensive indirect jumps which
 190  # are subject to retpolines for small number of switch cases.
 191  # clang turns off jump table generation by default when under
 192  # retpoline builds, however, gcc does not for x86. This has
 193  # only been fixed starting from gcc stable version 8.4.0 and
 194  # onwards, but not for older ones. See gcc bug #86952.
 195  ifndef CONFIG_CC_IS_CLANG
 196    KBUILD_CFLAGS += $(call cc-option,-fno-jump-tables)
 197  endif
 198endif
 199
 200KBUILD_LDFLAGS += -m elf_$(UTS_MACHINE)
 201
 202ifdef CONFIG_LTO_CLANG
 203ifeq ($(shell test $(CONFIG_LLD_VERSION) -lt 130000; echo $$?),0)
 204KBUILD_LDFLAGS  += -plugin-opt=-stack-alignment=$(if $(CONFIG_X86_32),4,8)
 205endif
 206endif
 207
 208ifdef CONFIG_X86_NEED_RELOCS
 209LDFLAGS_vmlinux := --emit-relocs --discard-none
 210else
 211LDFLAGS_vmlinux :=
 212endif
 213
 214#
 215# The 64-bit kernel must be aligned to 2MB.  Pass -z max-page-size=0x200000 to
 216# the linker to force 2MB page size regardless of the default page size used
 217# by the linker.
 218#
 219ifdef CONFIG_X86_64
 220LDFLAGS_vmlinux += -z max-page-size=0x200000
 221endif
 222
 223
 224archscripts: scripts_basic
 225        $(Q)$(MAKE) $(build)=arch/x86/tools relocs
 226
 227###
 228# Syscall table generation
 229
 230archheaders:
 231        $(Q)$(MAKE) $(build)=arch/x86/entry/syscalls all
 232
 233###
 234# Kernel objects
 235
 236head-y := arch/x86/kernel/head_$(BITS).o
 237head-y += arch/x86/kernel/head$(BITS).o
 238head-y += arch/x86/kernel/ebda.o
 239head-y += arch/x86/kernel/platform-quirks.o
 240
 241libs-y  += arch/x86/lib/
 242
 243# drivers-y are linked after core-y
 244drivers-$(CONFIG_MATH_EMULATION) += arch/x86/math-emu/
 245drivers-$(CONFIG_PCI)            += arch/x86/pci/
 246
 247# suspend and hibernation support
 248drivers-$(CONFIG_PM) += arch/x86/power/
 249
 250drivers-$(CONFIG_FB) += arch/x86/video/
 251
 252####
 253# boot loader support. Several targets are kept for legacy purposes
 254
 255boot := arch/x86/boot
 256
 257BOOT_TARGETS = bzdisk fdimage fdimage144 fdimage288 hdimage isoimage
 258
 259PHONY += bzImage $(BOOT_TARGETS)
 260
 261# Default kernel to build
 262all: bzImage
 263
 264# KBUILD_IMAGE specify target image being built
 265KBUILD_IMAGE := $(boot)/bzImage
 266
 267bzImage: vmlinux
 268ifeq ($(CONFIG_X86_DECODER_SELFTEST),y)
 269        $(Q)$(MAKE) $(build)=arch/x86/tools posttest
 270endif
 271        $(Q)$(MAKE) $(build)=$(boot) $(KBUILD_IMAGE)
 272        $(Q)mkdir -p $(objtree)/arch/$(UTS_MACHINE)/boot
 273        $(Q)ln -fsn ../../x86/boot/bzImage $(objtree)/arch/$(UTS_MACHINE)/boot/$@
 274
 275$(BOOT_TARGETS): vmlinux
 276        $(Q)$(MAKE) $(build)=$(boot) $@
 277
 278PHONY += install bzlilo
 279install bzlilo:
 280        $(Q)$(MAKE) $(build)=$(boot) $@
 281
 282PHONY += vdso_install
 283vdso_install:
 284        $(Q)$(MAKE) $(build)=arch/x86/entry/vdso $@
 285
 286archprepare: checkbin
 287checkbin:
 288ifndef CONFIG_CC_HAS_ASM_GOTO
 289        @echo Compiler lacks asm-goto support.
 290        @exit 1
 291endif
 292ifdef CONFIG_RETPOLINE
 293ifeq ($(RETPOLINE_CFLAGS),)
 294        @echo "You are building kernel with non-retpoline compiler." >&2
 295        @echo "Please update your compiler." >&2
 296        @false
 297endif
 298endif
 299
 300archclean:
 301        $(Q)rm -rf $(objtree)/arch/i386
 302        $(Q)rm -rf $(objtree)/arch/x86_64
 303        $(Q)$(MAKE) $(clean)=$(boot)
 304        $(Q)$(MAKE) $(clean)=arch/x86/tools
 305
 306define archhelp
 307  echo  '* bzImage              - Compressed kernel image (arch/x86/boot/bzImage)'
 308  echo  '  install              - Install kernel using (your) ~/bin/$(INSTALLKERNEL) or'
 309  echo  '                         (distribution) /sbin/$(INSTALLKERNEL) or install to '
 310  echo  '                         $$(INSTALL_PATH) and run lilo'
 311  echo  ''
 312  echo  '  fdimage              - Create 1.4MB boot floppy image (arch/x86/boot/fdimage)'
 313  echo  '  fdimage144           - Create 1.4MB boot floppy image (arch/x86/boot/fdimage)'
 314  echo  '  fdimage288           - Create 2.8MB boot floppy image (arch/x86/boot/fdimage)'
 315  echo  '  hdimage              - Create a BIOS/EFI hard disk image (arch/x86/boot/hdimage)'
 316  echo  '  isoimage             - Create a boot CD-ROM image (arch/x86/boot/image.iso)'
 317  echo  '                         bzdisk/fdimage*/hdimage/isoimage also accept:'
 318  echo  '                         FDARGS="..."  arguments for the booted kernel'
 319  echo  '                         FDINITRD=file initrd for the booted kernel'
 320  echo  ''
 321  echo  '  kvm_guest.config     - Enable Kconfig items for running this kernel as a KVM guest'
 322  echo  '  xen.config           - Enable Kconfig items for running this kernel as a Xen guest'
 323
 324endef
 325