Makefile 10.3 KB
Newer Older
1 2
# Unified Makefile for i386 and x86_64

3
# select defconfig based on actual architecture
4
ifeq ($(ARCH),x86)
5 6 7
  ifeq ($(shell uname -m),x86_64)
        KBUILD_DEFCONFIG := x86_64_defconfig
  else
8
        KBUILD_DEFCONFIG := i386_defconfig
9
  endif
10 11 12
else
        KBUILD_DEFCONFIG := $(ARCH)_defconfig
endif
13

14 15
# 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.
16 17
#
# The -m16 option is supported by GCC >= 4.9 and clang >= 3.5. For
18 19 20
# older versions of GCC, include an *assembly* header to make sure that
# gcc doesn't play any games behind our back.
CODE16GCC_CFLAGS := -m32 -Wa,$(srctree)/arch/x86/boot/code16gcc.h
21 22 23 24
M16_CFLAGS	 := $(call cc-option, -m16, $(CODE16GCC_CFLAGS))

REALMODE_CFLAGS	:= $(M16_CFLAGS) -g -Os -D__KERNEL__ \
		   -DDISABLE_BRANCH_PROFILING \
25 26 27 28 29 30 31 32
		   -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

33 34 35 36
# 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
37

38 39 40 41
ifdef CONFIG_X86_NEED_RELOCS
        LDFLAGS_vmlinux := --emit-relocs
endif

42 43 44 45 46 47 48 49 50 51
#
# Prevent GCC from generating any FP code by mistake.
#
# This must happen before we try the -mpreferred-stack-boundary, see:
#
#    https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53383
#
KBUILD_CFLAGS += -mno-sse -mno-mmx -mno-sse2 -mno-3dnow
KBUILD_CFLAGS += $(call cc-option,-mno-avx,)

52
ifeq ($(CONFIG_X86_32),y)
53
        BITS := 32
54
        UTS_MACHINE := i386
55
        CHECKFLAGS += -D__i386__
56

57 58 59
        biarch := $(call cc-option,-m32)
        KBUILD_AFLAGS += $(biarch)
        KBUILD_CFLAGS += $(biarch)
60 61 62

        KBUILD_CFLAGS += -msoft-float -mregparm=3 -freg-struct-return

A
Andrew Boie 已提交
63 64 65 66
        # Never want PIC in a 32-bit kernel, prevent breakage with GCC built
        # with nonstandard options
        KBUILD_CFLAGS += -fno-pic

67 68 69 70 71
        # 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:
72 73
        KBUILD_CFLAGS += $(call cc-ifversion, -lt, 0400, \
				$(call cc-option,-fno-unit-at-a-time))
74 75

        # CPU-specific tuning. Anything which can be shared with UML should go here.
76
        include arch/x86/Makefile_32.cpu
77 78 79 80
        KBUILD_CFLAGS += $(cflags-y)

        # temporary until string.h is fixed
        KBUILD_CFLAGS += -ffreestanding
81
else
82
        BITS := 64
83
        UTS_MACHINE := x86_64
84 85
        CHECKFLAGS += -D__x86_64__ -m64

86
        biarch := -m64
87 88 89
        KBUILD_AFLAGS += -m64
        KBUILD_CFLAGS += -m64

90 91 92
        # Align jump targets to 1 byte, not the default 16 bytes:
        KBUILD_CFLAGS += -falign-jumps=1

I
Ingo Molnar 已提交
93 94 95
        # Pack loops tightly as well:
        KBUILD_CFLAGS += -falign-loops=1

96
        # Don't autogenerate traditional x87 instructions
97 98
        KBUILD_CFLAGS += $(call cc-option,-mno-80387)
        KBUILD_CFLAGS += $(call cc-option,-mno-fp-ret-in-387)
99

100
	# Use -mpreferred-stack-boundary=3 if supported.
101
	KBUILD_CFLAGS += $(call cc-option,-mpreferred-stack-boundary=3)
102

103 104 105
	# Use -mskip-rax-setup if supported.
	KBUILD_CFLAGS += $(call cc-option,-mskip-rax-setup)

106 107 108 109 110 111
        # 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))
112 113
	cflags-$(CONFIG_MATOM) += $(call cc-option,-march=atom) \
		$(call cc-option,-mtune=atom,$(call cc-option,-mtune=generic))
114 115 116 117 118 119 120 121 122
        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)
T
Tejun Heo 已提交
123
endif
124

125 126 127
ifdef CONFIG_X86_X32
	x32_ld_ok := $(call try-run,\
			/bin/echo -e '1: .quad 1b' | \
J
Jean Delvare 已提交
128
			$(CC) $(KBUILD_AFLAGS) -c -x assembler -o "$$TMP" - && \
129 130
			$(OBJCOPY) -O elf32-x86-64 "$$TMP" "$$TMPO" && \
			$(LD) -m elf32_x86_64 "$$TMPO" -o "$$TMP",y,n)
131 132 133 134 135 136 137
        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
138 139 140
endif
export CONFIG_X86_X32_ABI

141 142 143 144 145
# Don't unroll struct assignments with kmemcheck enabled
ifeq ($(CONFIG_KMEMCHECK),y)
	KBUILD_CFLAGS += $(call cc-option,-fno-builtin-memcpy)
endif

146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
#
# If the function graph tracer is used with mcount instead of fentry,
# '-maccumulate-outgoing-args' is needed to prevent a GCC bug
# (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=42109)
#
ifdef CONFIG_FUNCTION_GRAPH_TRACER
  ifndef CONFIG_HAVE_FENTRY
	ACCUMULATE_OUTGOING_ARGS := 1
  else
    ifeq ($(call cc-option-yn, -mfentry), n)
	ACCUMULATE_OUTGOING_ARGS := 1
    endif
  endif
endif

#
# Jump labels need '-maccumulate-outgoing-args' for gcc < 4.5.2 to prevent a
# GCC bug (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=46226).  There's no way
# to test for this bug at compile-time because the test case needs to execute,
# which is a no-go for cross compilers.  So check the GCC version instead.
#
ifdef CONFIG_JUMP_LABEL
  ifneq ($(ACCUMULATE_OUTGOING_ARGS), 1)
	ACCUMULATE_OUTGOING_ARGS = $(call cc-if-fullversion, -lt, 040502, 1)
  endif
endif

ifeq ($(ACCUMULATE_OUTGOING_ARGS), 1)
	KBUILD_CFLAGS += -maccumulate-outgoing-args
endif

177 178 179 180
# Stackpointer is addressed different for 32 bit and 64 bit x86
sp-$(CONFIG_X86_32) := esp
sp-$(CONFIG_X86_64) := rsp

181 182 183 184 185 186
# 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)
cfi-sections := $(call as-instr,.cfi_sections .debug_frame,-DCONFIG_AS_CFI_SECTIONS=1)

187 188
# does binutils support specific instructions?
asinstr := $(call as-instr,fxsaveq (%rax),-DCONFIG_AS_FXSAVEQ=1)
189
asinstr += $(call as-instr,pshufb %xmm0$(comma)%xmm0,-DCONFIG_AS_SSSE3=1)
190
asinstr += $(call as-instr,crc32l %eax$(comma)%eax,-DCONFIG_AS_CRC32=1)
191
avx_instr := $(call as-instr,vxorps %ymm0$(comma)%ymm1$(comma)%ymm2,-DCONFIG_AS_AVX=1)
192
avx2_instr :=$(call as-instr,vpbroadcastb %xmm0$(comma)%ymm1,-DCONFIG_AS_AVX2=1)
193
avx512_instr :=$(call as-instr,vpmovm2b %k1$(comma)%zmm5,-DCONFIG_AS_AVX512=1)
194 195
sha1_ni_instr :=$(call as-instr,sha1msg1 %xmm0$(comma)%xmm1,-DCONFIG_AS_SHA1_NI=1)
sha256_ni_instr :=$(call as-instr,sha256msg1 %xmm0$(comma)%xmm1,-DCONFIG_AS_SHA256_NI=1)
196

197 198
KBUILD_AFLAGS += $(cfi) $(cfi-sigframe) $(cfi-sections) $(asinstr) $(avx_instr) $(avx2_instr) $(avx512_instr) $(sha1_ni_instr) $(sha256_ni_instr)
KBUILD_CFLAGS += $(cfi) $(cfi-sigframe) $(cfi-sections) $(asinstr) $(avx_instr) $(avx2_instr) $(avx512_instr) $(sha1_ni_instr) $(sha256_ni_instr)
199 200

LDFLAGS := -m elf_$(UTS_MACHINE)
201 202

# Speed up the build
203
KBUILD_CFLAGS += -pipe
204 205 206 207
# Workaround for a gcc prelease that unfortunately was shipped in a suse release
KBUILD_CFLAGS += -Wno-sign-compare
#
KBUILD_CFLAGS += -fno-asynchronous-unwind-tables
208 209 210 211

KBUILD_CFLAGS += $(mflags-y)
KBUILD_AFLAGS += $(mflags-y)

212
archscripts: scripts_basic
213 214
	$(Q)$(MAKE) $(build)=arch/x86/tools relocs

215 216 217 218
###
# Syscall table generation

archheaders:
219
	$(Q)$(MAKE) $(build)=arch/x86/entry/syscalls all
220

221
archprepare:
222
ifeq ($(CONFIG_KEXEC_FILE),y)
223 224 225
	$(Q)$(MAKE) $(build)=arch/x86/purgatory arch/x86/purgatory/kexec-purgatory.c
endif

226 227 228
###
# Kernel objects

229 230
head-y := arch/x86/kernel/head_$(BITS).o
head-y += arch/x86/kernel/head$(BITS).o
231
head-y += arch/x86/kernel/ebda.o
232
head-y += arch/x86/kernel/platform-quirks.o
233 234 235

libs-y  += arch/x86/lib/

S
Sam Ravnborg 已提交
236 237
# See arch/x86/Kbuild for content of core part of the kernel
core-y += arch/x86/
238 239 240 241 242 243 244 245

# 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/

246
# suspend and hibernation support
247
drivers-$(CONFIG_PM) += arch/x86/power/
248

249 250
drivers-$(CONFIG_FB) += arch/x86/video/

251 252
drivers-$(CONFIG_RAS) += arch/x86/ras/

253 254 255 256 257
####
# boot loader support. Several targets are kept for legacy purposes

boot := arch/x86/boot

258
BOOT_TARGETS = bzlilo bzdisk fdimage fdimage144 fdimage288 isoimage
259 260

PHONY += bzImage $(BOOT_TARGETS)
261 262 263 264 265

# Default kernel to build
all: bzImage

# KBUILD_IMAGE specify target image being built
266
KBUILD_IMAGE := $(boot)/bzImage
267

268
bzImage: vmlinux
269 270 271
ifeq ($(CONFIG_X86_DECODER_SELFTEST),y)
	$(Q)$(MAKE) $(build)=arch/x86/tools posttest
endif
272 273
	$(Q)$(MAKE) $(build)=$(boot) $(KBUILD_IMAGE)
	$(Q)mkdir -p $(objtree)/arch/$(UTS_MACHINE)/boot
274
	$(Q)ln -fsn ../../x86/boot/bzImage $(objtree)/arch/$(UTS_MACHINE)/boot/$@
275

276 277
$(BOOT_TARGETS): vmlinux
	$(Q)$(MAKE) $(build)=$(boot) $@
278

279 280 281 282
PHONY += install
install:
	$(Q)$(MAKE) $(build)=$(boot) $@

283 284
PHONY += vdso_install
vdso_install:
285
	$(Q)$(MAKE) $(build)=arch/x86/entry/vdso $@
286 287 288 289 290

archclean:
	$(Q)rm -rf $(objtree)/arch/i386
	$(Q)rm -rf $(objtree)/arch/x86_64
	$(Q)$(MAKE) $(clean)=$(boot)
J
Jarkko Sakkinen 已提交
291
	$(Q)$(MAKE) $(clean)=arch/x86/tools
292
	$(Q)$(MAKE) $(clean)=arch/x86/purgatory
293 294

define archhelp
295 296
  echo  '* bzImage      - Compressed kernel image (arch/x86/boot/bzImage)'
  echo  '  install      - Install kernel using'
297 298
  echo  '                  (your) ~/bin/$(INSTALLKERNEL) or'
  echo  '                  (distribution) /sbin/$(INSTALLKERNEL) or'
299 300 301 302 303 304 305 306
  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'
307
endef