2007-10-25 21:42:04 +04:00
# Unified Makefile for i386 and x86_64
2007-10-25 22:31:19 +04:00
# select defconfig based on actual architecture
2007-11-12 22:14:19 +03:00
i f e q ( $( ARCH ) , x 8 6 )
2012-12-21 01:51:55 +04:00
ifeq ( $( shell uname -m) ,x86_64)
KBUILD_DEFCONFIG := x86_64_defconfig
else
2007-11-12 22:14:19 +03:00
KBUILD_DEFCONFIG := i386_defconfig
2012-12-21 01:51:55 +04:00
endif
2007-11-12 22:14:19 +03:00
e l s e
KBUILD_DEFCONFIG := $( ARCH) _defconfig
e n d i f
2007-10-25 22:31:19 +04:00
2014-01-08 15:21:20 +04:00
# How to compile the 16-bit code. Note we always compile for -march=i386;
# that way we can complain to the user if the CPU is insufficient.
2014-01-29 16:16:47 +04:00
#
# The -m16 option is supported by GCC >= 4.9 and clang >= 3.5. For
# older versions of GCC, we need to play evil and unreliable tricks to
# attempt to ensure that our asm(".code16gcc") is first in the asm
# output.
CODE16GCC_CFLAGS := -m32 -include $( srctree) /arch/x86/boot/code16gcc.h \
$( call cc-option, -fno-toplevel-reorder,\
$( call cc-option, -fno-unit-at-a-time) )
M16_CFLAGS := $( call cc-option, -m16, $( CODE16GCC_CFLAGS) )
REALMODE_CFLAGS := $( M16_CFLAGS) -g -Os -D__KERNEL__ \
-DDISABLE_BRANCH_PROFILING \
2014-01-08 15:21:20 +04:00
-Wall -Wstrict-prototypes -march= i386 -mregparm= 3 \
-fno-strict-aliasing -fomit-frame-pointer -fno-pic \
-mno-mmx -mno-sse \
$( call cc-option, -ffreestanding) \
$( call cc-option, -fno-stack-protector) \
$( call cc-option, -mpreferred-stack-boundary= 2)
export REALMODE_CFLAGS
2008-01-30 15:32:20 +03:00
# BITS is used as extension for files which are available in a 32 bit
# and a 64 bit version to simplify shared Makefiles.
# e.g.: obj-y += foo_$(BITS).o
export BITS
2007-10-25 21:42:04 +04:00
2013-07-08 20:15:17 +04:00
i f d e f C O N F I G _ X 8 6 _ N E E D _ R E L O C S
LDFLAGS_vmlinux := --emit-relocs
e n d i f
2007-11-12 22:14:19 +03:00
i f e q ( $( CONFIG_X 86_ 32) , y )
2008-01-30 15:32:20 +03:00
BITS := 32
2007-11-20 01:58:57 +03:00
UTS_MACHINE := i386
2008-01-30 15:32:23 +03:00
CHECKFLAGS += -D__i386__
2008-01-30 15:32:20 +03:00
2008-01-30 15:32:23 +03:00
biarch := $( call cc-option,-m32)
KBUILD_AFLAGS += $( biarch)
KBUILD_CFLAGS += $( biarch)
2008-01-30 15:32:20 +03:00
KBUILD_CFLAGS += -msoft-float -mregparm= 3 -freg-struct-return
x86, build: Pass in additional -mno-mmx, -mno-sse options
In checkin
5551a34e5aea x86-64, build: Always pass in -mno-sse
we unconditionally added -mno-sse to the main build, to keep newer
compilers from generating SSE instructions from autovectorization.
However, this did not extend to the special environments
(arch/x86/boot, arch/x86/boot/compressed, and arch/x86/realmode/rm).
Add -mno-sse to the compiler command line for these environments, and
add -mno-mmx to all the environments as well, as we don't want a
compiler to generate MMX code either.
This patch also removes a $(cc-option) call for -m32, since we have
long since stopped supporting compilers too old for the -m32 option,
and in fact hardcode it in other places in the Makefiles.
Reported-by: Kevin B. Smith <kevin.b.smith@intel.com>
Cc: Sunil K. Pandey <sunil.k.pandey@intel.com>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Cc: H. J. Lu <hjl.tools@gmail.com>
Link: http://lkml.kernel.org/n/tip-j21wzqv790q834n7yc6g80j1@git.kernel.org
Cc: <stable@vger.kernel.org> # build fix only
2013-12-10 03:43:38 +04:00
# Don't autogenerate MMX or SSE instructions
KBUILD_CFLAGS += -mno-mmx -mno-sse
2013-11-21 01:31:49 +04:00
2012-08-10 22:49:06 +04:00
# Never want PIC in a 32-bit kernel, prevent breakage with GCC built
# with nonstandard options
KBUILD_CFLAGS += -fno-pic
2008-01-30 15:32:20 +03:00
# prevent gcc from keeping the stack 16 byte aligned
KBUILD_CFLAGS += $( call cc-option,-mpreferred-stack-boundary= 2)
# Disable unit-at-a-time mode on pre-gcc-4.0 compilers, it makes gcc use
# a lot more stack due to the lack of sharing of stacklots:
2009-07-23 22:56:27 +04:00
KBUILD_CFLAGS += $( call cc-ifversion, -lt, 0400, \
$( call cc-option,-fno-unit-at-a-time) )
2008-01-30 15:32:20 +03:00
# CPU-specific tuning. Anything which can be shared with UML should go here.
include $( srctree) /arch/x86/Makefile_32.cpu
KBUILD_CFLAGS += $( cflags-y)
# temporary until string.h is fixed
KBUILD_CFLAGS += -ffreestanding
2007-10-25 21:42:04 +04:00
e l s e
2008-01-30 15:32:20 +03:00
BITS := 64
2007-11-20 01:58:57 +03:00
UTS_MACHINE := x86_64
2008-01-30 15:32:20 +03:00
CHECKFLAGS += -D__x86_64__ -m64
2014-05-08 01:05:52 +04:00
biarch := -m64
2008-01-30 15:32:20 +03:00
KBUILD_AFLAGS += -m64
KBUILD_CFLAGS += -m64
2014-02-05 04:55:11 +04:00
# Don't autogenerate traditional x87, MMX or SSE instructions
2014-04-22 09:40:27 +04:00
KBUILD_CFLAGS += -mno-mmx -mno-sse
KBUILD_CFLAGS += $( call cc-option,-mno-80387)
KBUILD_CFLAGS += $( call cc-option,-mno-fp-ret-in-387)
2013-11-21 01:31:49 +04:00
2012-05-30 01:31:23 +04:00
# Use -mpreferred-stack-boundary=3 if supported.
2013-11-21 01:31:49 +04:00
KBUILD_CFLAGS += $( call cc-option,-mpreferred-stack-boundary= 3)
2012-05-30 01:31:23 +04:00
2008-01-30 15:32:20 +03:00
# FIXME - should be integrated in Makefile.cpu (Makefile_32.cpu)
cflags-$( CONFIG_MK8) += $( call cc-option,-march= k8)
cflags-$( CONFIG_MPSC) += $( call cc-option,-march= nocona)
cflags-$( CONFIG_MCORE2) += \
$( call cc-option,-march= core2,$( call cc-option,-mtune= generic) )
2009-08-22 01:06:23 +04:00
cflags-$( CONFIG_MATOM) += $( call cc-option,-march= atom) \
$( call cc-option,-mtune= atom,$( call cc-option,-mtune= generic) )
2008-01-30 15:32:20 +03:00
cflags-$( CONFIG_GENERIC_CPU) += $( call cc-option,-mtune= generic)
KBUILD_CFLAGS += $( cflags-y)
KBUILD_CFLAGS += -mno-red-zone
KBUILD_CFLAGS += -mcmodel= kernel
# -funit-at-a-time shrinks the kernel .text considerably
# unfortunately it makes reading oopses harder.
KBUILD_CFLAGS += $( call cc-option,-funit-at-a-time)
# this works around some issues with generating unwind tables in older gccs
# newer gccs do it by default
2013-10-20 02:36:47 +04:00
KBUILD_CFLAGS += $( call cc-option,-maccumulate-outgoing-args)
2009-02-09 16:17:39 +03:00
e n d i f
2008-01-30 15:32:20 +03:00
2013-12-19 23:35:58 +04:00
# Make sure compiler does not have buggy stack-protector support.
2009-02-09 16:17:39 +03:00
i f d e f C O N F I G _ C C _ S T A C K P R O T E C T O R
cc_has_sp := $( srctree) /scripts/gcc-x86_$( BITS) -has-stack-protector.sh
2013-12-19 23:35:58 +04:00
ifneq ( $( shell $( CONFIG_SHELL) $( cc_has_sp) $( CC) $( KBUILD_CPPFLAGS) $( biarch) ) ,y)
$( warning stack-protector enabled but compiler support broken)
2009-02-09 16:17:39 +03:00
endif
2008-01-30 15:32:20 +03:00
e n d i f
2012-02-28 02:09:10 +04:00
i f d e f C O N F I G _ X 8 6 _ X 3 2
x32_ld_ok := $( call try-run,\
/bin/echo -e '1: .quad 1b' | \
2012-10-02 18:42:36 +04:00
$( CC) $( KBUILD_AFLAGS) -c -x assembler -o " $$ TMP " - && \
2012-02-28 02:09:10 +04:00
$( OBJCOPY) -O elf32-x86-64 " $$ TMP " " $$ TMPO " && \
$( LD) -m elf32_x86_64 " $$ TMPO " -o " $$ TMP " ,y,n)
2012-02-28 13:35:06 +04:00
ifeq ( $( x32_ld_ok) ,y)
CONFIG_X86_X32_ABI := y
KBUILD_AFLAGS += -DCONFIG_X86_X32_ABI
KBUILD_CFLAGS += -DCONFIG_X86_X32_ABI
else
$( warning CONFIG_X86_X32 enabled but no binutils support)
endif
2012-02-28 02:09:10 +04:00
e n d i f
export CONFIG_X86_X32_ABI
2008-04-04 02:51:41 +04:00
# Don't unroll struct assignments with kmemcheck enabled
i f e q ( $( CONFIG_KMEMCHECK ) , y )
KBUILD_CFLAGS += $( call cc-option,-fno-builtin-memcpy)
e n d i f
2008-01-30 15:32:20 +03:00
# Stackpointer is addressed different for 32 bit and 64 bit x86
sp-$(CONFIG_X86_32) := esp
sp-$(CONFIG_X86_64) := rsp
# do binutils support CFI?
cfi := $( call as-instr,.cfi_startproc\n .cfi_rel_offset $( sp-y) $( comma) 0\n .cfi_endproc,-DCONFIG_AS_CFI= 1)
# is .cfi_signal_frame supported too?
cfi-sigframe := $( call as-instr,.cfi_startproc\n .cfi_signal_frame\n .cfi_endproc,-DCONFIG_AS_CFI_SIGNAL_FRAME= 1)
2010-05-14 08:43:03 +04:00
cfi-sections := $( call as-instr,.cfi_sections .debug_frame,-DCONFIG_AS_CFI_SECTIONS= 1)
2010-10-14 03:00:29 +04:00
# does binutils support specific instructions?
asinstr := $( call as-instr,fxsaveq ( %rax) ,-DCONFIG_AS_FXSAVEQ= 1)
2014-02-27 12:47:02 +04:00
asinstr += $( call as-instr,crc32l %eax$( comma) %eax,-DCONFIG_AS_CRC32= 1)
2012-05-22 07:54:04 +04:00
avx_instr := $( call as-instr,vxorps %ymm0$( comma) %ymm1$( comma) %ymm2,-DCONFIG_AS_AVX= 1)
2012-11-09 01:47:44 +04:00
avx2_instr := $( call as-instr,vpbroadcastb %xmm0$( comma) %ymm1,-DCONFIG_AS_AVX2= 1)
2010-10-14 03:00:29 +04:00
2012-11-09 01:47:44 +04:00
KBUILD_AFLAGS += $( cfi) $( cfi-sigframe) $( cfi-sections) $( asinstr) $( avx_instr) $( avx2_instr)
KBUILD_CFLAGS += $( cfi) $( cfi-sigframe) $( cfi-sections) $( asinstr) $( avx_instr) $( avx2_instr)
2008-01-30 15:32:20 +03:00
LDFLAGS := -m elf_$( UTS_MACHINE)
2008-01-30 15:32:21 +03:00
# Speed up the build
2008-01-30 15:32:20 +03:00
KBUILD_CFLAGS += -pipe
2008-01-30 15:32:21 +03:00
# Workaround for a gcc prelease that unfortunately was shipped in a suse release
KBUILD_CFLAGS += -Wno-sign-compare
#
KBUILD_CFLAGS += -fno-asynchronous-unwind-tables
# prevent gcc from generating any FP code by mistake
KBUILD_CFLAGS += $( call cc-option,-mno-sse -mno-mmx -mno-sse2 -mno-3dnow,)
2012-03-28 22:51:17 +04:00
KBUILD_CFLAGS += $( call cc-option,-mno-avx,)
2008-01-30 15:32:20 +03:00
KBUILD_CFLAGS += $( mflags-y)
KBUILD_AFLAGS += $( mflags-y)
2012-10-15 23:16:56 +04:00
archscripts : scripts_basic
2012-05-08 22:22:24 +04:00
$( Q) $( MAKE) $( build) = arch/x86/tools relocs
2011-11-12 04:07:41 +04:00
###
# Syscall table generation
archheaders :
$( Q) $( MAKE) $( build) = arch/x86/syscalls all
2008-01-30 15:32:20 +03:00
###
# Kernel objects
2008-02-23 11:58:20 +03:00
head-y := arch/x86/kernel/head_$( BITS) .o
head-y += arch/x86/kernel/head$( BITS) .o
2008-06-02 10:26:23 +04:00
head-y += arch/x86/kernel/head.o
2008-01-30 15:32:20 +03:00
libs-y += arch/x86/lib/
2009-04-15 23:34:55 +04:00
# See arch/x86/Kbuild for content of core part of the kernel
core-y += arch/x86/
2008-01-30 15:32:20 +03:00
# drivers-y are linked after core-y
drivers-$(CONFIG_MATH_EMULATION) += arch/x86/math-emu/
drivers-$(CONFIG_PCI) += arch/x86/pci/
# must be linked after kernel/
drivers-$(CONFIG_OPROFILE) += arch/x86/oprofile/
2008-02-10 01:24:09 +03:00
# suspend and hibernation support
2008-01-30 15:32:20 +03:00
drivers-$(CONFIG_PM) += arch/x86/power/
2008-02-10 01:24:09 +03:00
2008-01-30 15:32:20 +03:00
drivers-$(CONFIG_FB) += arch/x86/video/
####
# boot loader support. Several targets are kept for legacy purposes
boot := arch/x86/boot
2009-04-17 21:46:37 +04:00
BOOT_TARGETS = bzlilo bzdisk fdimage fdimage144 fdimage288 isoimage
2009-03-12 22:50:33 +03:00
PHONY += bzImage $( BOOT_TARGETS)
2008-01-30 15:32:20 +03:00
# Default kernel to build
all : bzImage
# KBUILD_IMAGE specify target image being built
2009-03-12 22:50:33 +03:00
KBUILD_IMAGE := $( boot) /bzImage
2008-01-30 15:32:20 +03:00
2009-03-12 22:50:33 +03:00
bzImage : vmlinux
2009-08-14 00:34:21 +04:00
i f e q ( $( CONFIG_X 86_DECODER_SELFTEST ) , y )
$( Q) $( MAKE) $( build) = arch/x86/tools posttest
e n d i f
2008-01-30 15:32:20 +03:00
$( Q) $( MAKE) $( build) = $( boot) $( KBUILD_IMAGE)
$( Q) mkdir -p $( objtree) /arch/$( UTS_MACHINE) /boot
2008-04-22 19:29:26 +04:00
$( Q) ln -fsn ../../x86/boot/bzImage $( objtree) /arch/$( UTS_MACHINE) /boot/$@
2008-01-30 15:32:20 +03:00
2009-03-12 22:50:33 +03:00
$(BOOT_TARGETS) : vmlinux
$( Q) $( MAKE) $( build) = $( boot) $@
2008-01-30 15:32:20 +03:00
2009-04-17 21:46:37 +04:00
PHONY += install
install :
$( Q) $( MAKE) $( build) = $( boot) $@
2008-01-30 15:32:20 +03:00
PHONY += vdso_install
vdso_install :
$( Q) $( MAKE) $( build) = arch/x86/vdso $@
archclean :
$( Q) rm -rf $( objtree) /arch/i386
$( Q) rm -rf $( objtree) /arch/x86_64
$( Q) $( MAKE) $( clean) = $( boot)
2012-05-21 21:51:24 +04:00
$( Q) $( MAKE) $( clean) = arch/x86/tools
2008-01-30 15:32:20 +03:00
2013-06-21 12:04:51 +04:00
PHONY += kvmconfig
2013-05-22 18:46:39 +04:00
kvmconfig :
$( if $( wildcard $( objtree) /.config) ,, $( error You need an existing .config for this target) )
2014-04-13 12:26:08 +04:00
$( Q) $( CONFIG_SHELL) $( srctree) /scripts/kconfig/merge_config.sh -m -O $( objtree) $( objtree) /.config $( srctree) /arch/x86/configs/kvm_guest.config
$( Q) yes "" | $( MAKE) -f $( srctree) /Makefile oldconfig
2013-05-22 18:46:39 +04:00
2008-01-30 15:32:20 +03:00
d e f i n e a r c h h e l p
2008-01-30 15:32:49 +03:00
echo '* bzImage - Compressed kernel image (arch/x86/boot/bzImage)'
echo ' install - Install kernel using'
2009-07-20 23:37:11 +04:00
echo ' (your) ~/bin/$(INSTALLKERNEL) or'
echo ' (distribution) /sbin/$(INSTALLKERNEL) or'
2008-01-30 15:32:49 +03:00
echo ' install to $$(INSTALL_PATH) and run lilo'
echo ' fdimage - Create 1.4MB boot floppy image (arch/x86/boot/fdimage)'
echo ' fdimage144 - Create 1.4MB boot floppy image (arch/x86/boot/fdimage)'
echo ' fdimage288 - Create 2.8MB boot floppy image (arch/x86/boot/fdimage)'
echo ' isoimage - Create a boot CD-ROM image (arch/x86/boot/image.iso)'
echo ' bzdisk/fdimage*/isoimage also accept:'
echo ' FDARGS="..." arguments for the booted kernel'
echo ' FDINITRD=file initrd for the booted kernel'
2013-05-22 18:46:39 +04:00
echo ' kvmconfig - Enable additional options for guest kernel support'
2008-01-30 15:32:20 +03:00
e n d e f