1# Unified Makefile for i386 and x86_64 2 3# select defconfig based on actual architecture 4ifeq ($(ARCH),x86) 5 ifeq ($(shell uname -m),x86_64) 6 KBUILD_DEFCONFIG := x86_64_defconfig 7 else 8 KBUILD_DEFCONFIG := i386_defconfig 9 endif 10else 11 KBUILD_DEFCONFIG := $(ARCH)_defconfig 12endif 13 14# BITS is used as extension for files which are available in a 32 bit 15# and a 64 bit version to simplify shared Makefiles. 16# e.g.: obj-y += foo_$(BITS).o 17export BITS 18 19ifeq ($(CONFIG_X86_32),y) 20 BITS := 32 21 UTS_MACHINE := i386 22 CHECKFLAGS += -D__i386__ 23 24 biarch := $(call cc-option,-m32) 25 KBUILD_AFLAGS += $(biarch) 26 KBUILD_CFLAGS += $(biarch) 27 28 ifdef CONFIG_RELOCATABLE 29 LDFLAGS_vmlinux := --emit-relocs 30 endif 31 32 KBUILD_CFLAGS += -msoft-float -mregparm=3 -freg-struct-return 33 34 # Never want PIC in a 32-bit kernel, prevent breakage with GCC built 35 # with nonstandard options 36 KBUILD_CFLAGS += -fno-pic 37 38 # prevent gcc from keeping the stack 16 byte aligned 39 KBUILD_CFLAGS += $(call cc-option,-mpreferred-stack-boundary=2) 40 41 # Disable unit-at-a-time mode on pre-gcc-4.0 compilers, it makes gcc use 42 # a lot more stack due to the lack of sharing of stacklots: 43 KBUILD_CFLAGS += $(call cc-ifversion, -lt, 0400, \ 44 $(call cc-option,-fno-unit-at-a-time)) 45 46 # CPU-specific tuning. Anything which can be shared with UML should go here. 47 include $(srctree)/arch/x86/Makefile_32.cpu 48 KBUILD_CFLAGS += $(cflags-y) 49 50 # temporary until string.h is fixed 51 KBUILD_CFLAGS += -ffreestanding 52else 53 BITS := 64 54 UTS_MACHINE := x86_64 55 CHECKFLAGS += -D__x86_64__ -m64 56 57 KBUILD_AFLAGS += -m64 58 KBUILD_CFLAGS += -m64 59 60 # Use -mpreferred-stack-boundary=3 if supported. 61 KBUILD_CFLAGS += $(call cc-option,-mno-sse -mpreferred-stack-boundary=3) 62 63 # FIXME - should be integrated in Makefile.cpu (Makefile_32.cpu) 64 cflags-$(CONFIG_MK8) += $(call cc-option,-march=k8) 65 cflags-$(CONFIG_MPSC) += $(call cc-option,-march=nocona) 66 67 cflags-$(CONFIG_MCORE2) += \ 68 $(call cc-option,-march=core2,$(call cc-option,-mtune=generic)) 69 cflags-$(CONFIG_MATOM) += $(call cc-option,-march=atom) \ 70 $(call cc-option,-mtune=atom,$(call cc-option,-mtune=generic)) 71 cflags-$(CONFIG_GENERIC_CPU) += $(call cc-option,-mtune=generic) 72 KBUILD_CFLAGS += $(cflags-y) 73 74 KBUILD_CFLAGS += -mno-red-zone 75 KBUILD_CFLAGS += -mcmodel=kernel 76 77 # -funit-at-a-time shrinks the kernel .text considerably 78 # unfortunately it makes reading oopses harder. 79 KBUILD_CFLAGS += $(call cc-option,-funit-at-a-time) 80 81 # this works around some issues with generating unwind tables in older gccs 82 # newer gccs do it by default 83 KBUILD_CFLAGS += -maccumulate-outgoing-args 84endif 85 86ifdef CONFIG_CC_STACKPROTECTOR 87 cc_has_sp := $(srctree)/scripts/gcc-x86_$(BITS)-has-stack-protector.sh 88 ifeq ($(shell $(CONFIG_SHELL) $(cc_has_sp) $(CC) $(KBUILD_CPPFLAGS) $(biarch)),y) 89 stackp-y := -fstack-protector 90 KBUILD_CFLAGS += $(stackp-y) 91 else 92 $(warning stack protector enabled but no compiler support) 93 endif 94endif 95 96ifdef CONFIG_X86_X32 97 x32_ld_ok := $(call try-run,\ 98 /bin/echo -e '1: .quad 1b' | \ 99 $(CC) $(KBUILD_AFLAGS) -c -x assembler -o "$$TMP" - && \ 100 $(OBJCOPY) -O elf32-x86-64 "$$TMP" "$$TMPO" && \ 101 $(LD) -m elf32_x86_64 "$$TMPO" -o "$$TMP",y,n) 102 ifeq ($(x32_ld_ok),y) 103 CONFIG_X86_X32_ABI := y 104 KBUILD_AFLAGS += -DCONFIG_X86_X32_ABI 105 KBUILD_CFLAGS += -DCONFIG_X86_X32_ABI 106 else 107 $(warning CONFIG_X86_X32 enabled but no binutils support) 108 endif 109endif 110export CONFIG_X86_X32_ABI 111 112# Don't unroll struct assignments with kmemcheck enabled 113ifeq ($(CONFIG_KMEMCHECK),y) 114 KBUILD_CFLAGS += $(call cc-option,-fno-builtin-memcpy) 115endif 116 117# Stackpointer is addressed different for 32 bit and 64 bit x86 118sp-$(CONFIG_X86_32) := esp 119sp-$(CONFIG_X86_64) := rsp 120 121# do binutils support CFI? 122cfi := $(call as-instr,.cfi_startproc\n.cfi_rel_offset $(sp-y)$(comma)0\n.cfi_endproc,-DCONFIG_AS_CFI=1) 123# is .cfi_signal_frame supported too? 124cfi-sigframe := $(call as-instr,.cfi_startproc\n.cfi_signal_frame\n.cfi_endproc,-DCONFIG_AS_CFI_SIGNAL_FRAME=1) 125cfi-sections := $(call as-instr,.cfi_sections .debug_frame,-DCONFIG_AS_CFI_SECTIONS=1) 126 127# does binutils support specific instructions? 128asinstr := $(call as-instr,fxsaveq (%rax),-DCONFIG_AS_FXSAVEQ=1) 129avx_instr := $(call as-instr,vxorps %ymm0$(comma)%ymm1$(comma)%ymm2,-DCONFIG_AS_AVX=1) 130avx2_instr :=$(call as-instr,vpbroadcastb %xmm0$(comma)%ymm1,-DCONFIG_AS_AVX2=1) 131 132KBUILD_AFLAGS += $(cfi) $(cfi-sigframe) $(cfi-sections) $(asinstr) $(avx_instr) $(avx2_instr) 133KBUILD_CFLAGS += $(cfi) $(cfi-sigframe) $(cfi-sections) $(asinstr) $(avx_instr) $(avx2_instr) 134 135LDFLAGS := -m elf_$(UTS_MACHINE) 136 137# Speed up the build 138KBUILD_CFLAGS += -pipe 139# Workaround for a gcc prelease that unfortunately was shipped in a suse release 140KBUILD_CFLAGS += -Wno-sign-compare 141# 142KBUILD_CFLAGS += -fno-asynchronous-unwind-tables 143# prevent gcc from generating any FP code by mistake 144KBUILD_CFLAGS += $(call cc-option,-mno-sse -mno-mmx -mno-sse2 -mno-3dnow,) 145KBUILD_CFLAGS += $(call cc-option,-mno-avx,) 146 147KBUILD_CFLAGS += $(mflags-y) 148KBUILD_AFLAGS += $(mflags-y) 149 150archscripts: scripts_basic 151 $(Q)$(MAKE) $(build)=arch/x86/tools relocs 152 153### 154# Syscall table generation 155 156archheaders: 157 $(Q)$(MAKE) $(build)=arch/x86/syscalls all 158 159### 160# Kernel objects 161 162head-y := arch/x86/kernel/head_$(BITS).o 163head-y += arch/x86/kernel/head$(BITS).o 164head-y += arch/x86/kernel/head.o 165 166libs-y += arch/x86/lib/ 167 168# See arch/x86/Kbuild for content of core part of the kernel 169core-y += arch/x86/ 170 171# drivers-y are linked after core-y 172drivers-$(CONFIG_MATH_EMULATION) += arch/x86/math-emu/ 173drivers-$(CONFIG_PCI) += arch/x86/pci/ 174 175# must be linked after kernel/ 176drivers-$(CONFIG_OPROFILE) += arch/x86/oprofile/ 177 178# suspend and hibernation support 179drivers-$(CONFIG_PM) += arch/x86/power/ 180 181drivers-$(CONFIG_FB) += arch/x86/video/ 182 183#### 184# boot loader support. Several targets are kept for legacy purposes 185 186boot := arch/x86/boot 187 188BOOT_TARGETS = bzlilo bzdisk fdimage fdimage144 fdimage288 isoimage 189 190PHONY += bzImage $(BOOT_TARGETS) 191 192# Default kernel to build 193all: bzImage 194 195# KBUILD_IMAGE specify target image being built 196KBUILD_IMAGE := $(boot)/bzImage 197 198bzImage: vmlinux 199ifeq ($(CONFIG_X86_DECODER_SELFTEST),y) 200 $(Q)$(MAKE) $(build)=arch/x86/tools posttest 201endif 202 $(Q)$(MAKE) $(build)=$(boot) $(KBUILD_IMAGE) 203 $(Q)mkdir -p $(objtree)/arch/$(UTS_MACHINE)/boot 204 $(Q)ln -fsn ../../x86/boot/bzImage $(objtree)/arch/$(UTS_MACHINE)/boot/$@ 205 206$(BOOT_TARGETS): vmlinux 207 $(Q)$(MAKE) $(build)=$(boot) $@ 208 209PHONY += install 210install: 211 $(Q)$(MAKE) $(build)=$(boot) $@ 212 213PHONY += vdso_install 214vdso_install: 215 $(Q)$(MAKE) $(build)=arch/x86/vdso $@ 216 217archclean: 218 $(Q)rm -rf $(objtree)/arch/i386 219 $(Q)rm -rf $(objtree)/arch/x86_64 220 $(Q)$(MAKE) $(clean)=$(boot) 221 $(Q)$(MAKE) $(clean)=arch/x86/tools 222 223PHONY += kvmconfig 224kvmconfig: 225 $(if $(wildcard $(objtree)/.config),, $(error You need an existing .config for this target)) 226 $(Q)$(CONFIG_SHELL) $(srctree)/scripts/kconfig/merge_config.sh -m -O $(objtree) $(objtree)/.config arch/x86/configs/kvm_guest.config 227 $(Q)yes "" | $(MAKE) oldconfig 228 229define archhelp 230 echo '* bzImage - Compressed kernel image (arch/x86/boot/bzImage)' 231 echo ' install - Install kernel using' 232 echo ' (your) ~/bin/$(INSTALLKERNEL) or' 233 echo ' (distribution) /sbin/$(INSTALLKERNEL) or' 234 echo ' install to $$(INSTALL_PATH) and run lilo' 235 echo ' fdimage - Create 1.4MB boot floppy image (arch/x86/boot/fdimage)' 236 echo ' fdimage144 - Create 1.4MB boot floppy image (arch/x86/boot/fdimage)' 237 echo ' fdimage288 - Create 2.8MB boot floppy image (arch/x86/boot/fdimage)' 238 echo ' isoimage - Create a boot CD-ROM image (arch/x86/boot/image.iso)' 239 echo ' bzdisk/fdimage*/isoimage also accept:' 240 echo ' FDARGS="..." arguments for the booted kernel' 241 echo ' FDINITRD=file initrd for the booted kernel' 242 echo ' kvmconfig - Enable additional options for guest kernel support' 243endef 244