1 # SPDX-License-Identifier: GPL-2.0
2 # Unified Makefile for i386 and x86_64
4 # select defconfig based on actual architecture
6 ifeq ($(shell uname
-m | sed
-e
's/i.86/i386/'),i386
)
7 KBUILD_DEFCONFIG
:= i386_defconfig
9 KBUILD_DEFCONFIG
:= x86_64_defconfig
12 KBUILD_DEFCONFIG
:= $(ARCH
)_defconfig
15 ifdef CONFIG_CC_IS_GCC
16 RETPOLINE_CFLAGS
:= $(call cc-option
,-mindirect-branch
=thunk-extern
-mindirect-branch-register
)
17 RETPOLINE_VDSO_CFLAGS
:= $(call cc-option
,-mindirect-branch
=thunk-inline
-mindirect-branch-register
)
19 ifdef CONFIG_CC_IS_CLANG
20 RETPOLINE_CFLAGS
:= -mretpoline-external-thunk
21 RETPOLINE_VDSO_CFLAGS
:= -mretpoline
23 RETPOLINE_CFLAGS
+= $(call cc-option
,-mindirect-branch-cs-prefix
)
25 ifdef CONFIG_MITIGATION_RETHUNK
26 RETHUNK_CFLAGS
:= -mfunction-return
=thunk-extern
27 RETHUNK_RUSTFLAGS
:= -Zfunction-return
=thunk-extern
28 RETPOLINE_CFLAGS
+= $(RETHUNK_CFLAGS
)
29 RETPOLINE_RUSTFLAGS
+= $(RETHUNK_RUSTFLAGS
)
33 export RETHUNK_RUSTFLAGS
34 export RETPOLINE_CFLAGS
35 export RETPOLINE_RUSTFLAGS
36 export RETPOLINE_VDSO_CFLAGS
38 # For gcc stack alignment is specified with -mpreferred-stack-boundary,
39 # clang has the option -mstack-alignment for that purpose.
40 ifneq ($(call cc-option
, -mpreferred-stack-boundary
=4),)
41 cc_stack_align4
:= -mpreferred-stack-boundary
=2
42 cc_stack_align8
:= -mpreferred-stack-boundary
=3
43 else ifneq ($(call cc-option
, -mstack-alignment
=16),)
44 cc_stack_align4
:= -mstack-alignment
=4
45 cc_stack_align8
:= -mstack-alignment
=8
48 # How to compile the 16-bit code. Note we always compile for -march=i386;
49 # that way we can complain to the user if the CPU is insufficient.
50 REALMODE_CFLAGS
:= -std
=gnu11
-m16
-g
-Os
-DDISABLE_BRANCH_PROFILING
-D__DISABLE_EXPORTS \
51 -Wall
-Wstrict-prototypes
-march
=i386
-mregparm
=3 \
52 -fno-strict-aliasing
-fomit-frame-pointer
-fno-pic \
53 -mno-mmx
-mno-sse
$(call cc-option
,-fcf-protection
=none
)
55 REALMODE_CFLAGS
+= -ffreestanding
56 REALMODE_CFLAGS
+= -fno-stack-protector
57 REALMODE_CFLAGS
+= -Wno-address-of-packed-member
58 REALMODE_CFLAGS
+= $(cc_stack_align4
)
59 REALMODE_CFLAGS
+= $(CLANG_FLAGS
)
60 ifdef CONFIG_CC_IS_CLANG
61 REALMODE_CFLAGS
+= -Wno-gnu
63 export REALMODE_CFLAGS
65 # BITS is used as extension for files which are available in a 32 bit
66 # and a 64 bit version to simplify shared Makefiles.
67 # e.g.: obj-y += foo_$(BITS).o
71 # Prevent GCC from generating any FP code by mistake.
73 # This must happen before we try the -mpreferred-stack-boundary, see:
75 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53383
77 KBUILD_CFLAGS
+= -mno-sse
-mno-mmx
-mno-sse2
-mno-3dnow
-mno-avx
78 KBUILD_RUSTFLAGS
+= --target
=$(objtree
)/scripts
/target.json
79 KBUILD_RUSTFLAGS
+= -Ctarget-feature
=-sse
,-sse2
,-sse3
,-ssse3
,-sse4.1
,-sse4.2
,-avx
,-avx2
82 # CFLAGS for compiling floating point code inside the kernel.
84 CC_FLAGS_FPU
:= -msse
-msse2
85 ifdef CONFIG_CC_IS_GCC
86 # Stack alignment mismatch, proceed with caution.
87 # GCC < 7.1 cannot compile code using `double` and -mpreferred-stack-boundary=3
88 # (8B stack alignment).
89 # See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53383
91 # The "-msse" in the first argument is there so that the
92 # -mpreferred-stack-boundary=3 build error:
94 # -mpreferred-stack-boundary=3 is not between 4 and 12
96 # can be triggered. Otherwise gcc doesn't complain.
97 CC_FLAGS_FPU
+= -mhard-float
98 CC_FLAGS_FPU
+= $(call cc-option
,-msse
-mpreferred-stack-boundary
=3,-mpreferred-stack-boundary
=4)
101 ifeq ($(CONFIG_X86_KERNEL_IBT
),y
)
103 # Kernel IBT has S_CET.NOTRACK_EN=0, as such the compilers must not generate
104 # NOTRACK prefixes. Current generation compilers unconditionally employ NOTRACK
105 # for jump-tables, as such, disable jump-tables for now.
107 # (jump-tables are implicitly disabled by RETPOLINE)
109 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104816
111 KBUILD_CFLAGS
+= $(call cc-option
,-fcf-protection
=branch
-fno-jump-tables
)
112 KBUILD_RUSTFLAGS
+= -Zcf-protection
=branch
-Zno-jump-tables
114 KBUILD_CFLAGS
+= $(call cc-option
,-fcf-protection
=none
)
117 ifeq ($(CONFIG_X86_32
),y
)
120 CHECKFLAGS
+= -D__i386__
122 KBUILD_AFLAGS
+= -m32
123 KBUILD_CFLAGS
+= -m32
125 KBUILD_CFLAGS
+= -msoft-float
-mregparm
=3 -freg-struct-return
127 # Never want PIC in a 32-bit kernel, prevent breakage with GCC built
128 # with nonstandard options
129 KBUILD_CFLAGS
+= -fno-pic
131 # Align the stack to the register width instead of using the default
132 # alignment of 16 bytes. This reduces stack usage and the number of
133 # alignment instructions.
134 KBUILD_CFLAGS
+= $(cc_stack_align4
)
136 # CPU-specific tuning. Anything which can be shared with UML should go here.
137 include $(srctree
)/arch
/x86
/Makefile_32.cpu
138 KBUILD_CFLAGS
+= $(cflags-y
)
140 # temporary until string.h is fixed
141 KBUILD_CFLAGS
+= -ffreestanding
143 ifeq ($(CONFIG_STACKPROTECTOR
),y
)
144 ifeq ($(CONFIG_SMP
),y
)
145 KBUILD_CFLAGS
+= -mstack-protector-guard-reg
=fs \
146 -mstack-protector-guard-symbol
=__ref_stack_chk_guard
148 KBUILD_CFLAGS
+= -mstack-protector-guard
=global
153 UTS_MACHINE
:= x86_64
154 CHECKFLAGS
+= -D__x86_64__
156 KBUILD_AFLAGS
+= -m64
157 KBUILD_CFLAGS
+= -m64
159 # Align jump targets to 1 byte, not the default 16 bytes:
160 KBUILD_CFLAGS
+= $(call cc-option
,-falign-jumps
=1)
162 # Pack loops tightly as well:
163 KBUILD_CFLAGS
+= $(call cc-option
,-falign-loops
=1)
165 # Don't autogenerate traditional x87 instructions
166 KBUILD_CFLAGS
+= -mno-80387
167 KBUILD_CFLAGS
+= $(call cc-option
,-mno-fp-ret-in-387
)
169 # By default gcc and clang use a stack alignment of 16 bytes for x86.
170 # However the standard kernel entry on x86-64 leaves the stack on an
171 # 8-byte boundary. If the compiler isn't informed about the actual
172 # alignment it will generate extra alignment instructions for the
173 # default alignment which keep the stack *mis*aligned.
174 # Furthermore an alignment to the register width reduces stack usage
175 # and the number of alignment instructions.
176 KBUILD_CFLAGS
+= $(cc_stack_align8
)
178 # Use -mskip-rax-setup if supported.
179 KBUILD_CFLAGS
+= $(call cc-option
,-mskip-rax-setup
)
181 # FIXME - should be integrated in Makefile.cpu (Makefile_32.cpu)
182 cflags-
$(CONFIG_MK8
) += -march
=k8
183 cflags-
$(CONFIG_MPSC
) += -march
=nocona
184 cflags-
$(CONFIG_MCORE2
) += -march
=core2
185 cflags-
$(CONFIG_MATOM
) += -march
=atom
186 cflags-
$(CONFIG_GENERIC_CPU
) += -mtune
=generic
187 KBUILD_CFLAGS
+= $(cflags-y
)
189 rustflags-
$(CONFIG_MK8
) += -Ctarget-cpu
=k8
190 rustflags-
$(CONFIG_MPSC
) += -Ctarget-cpu
=nocona
191 rustflags-
$(CONFIG_MCORE2
) += -Ctarget-cpu
=core2
192 rustflags-
$(CONFIG_MATOM
) += -Ctarget-cpu
=atom
193 rustflags-
$(CONFIG_GENERIC_CPU
) += -Ztune-cpu
=generic
194 KBUILD_RUSTFLAGS
+= $(rustflags-y
)
196 KBUILD_CFLAGS
+= -mno-red-zone
197 KBUILD_CFLAGS
+= -mcmodel
=kernel
198 KBUILD_RUSTFLAGS
+= -Cno-redzone
=y
199 KBUILD_RUSTFLAGS
+= -Ccode-model
=kernel
203 # If the function graph tracer is used with mcount instead of fentry,
204 # '-maccumulate-outgoing-args' is needed to prevent a GCC bug
205 # (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=42109)
207 ifdef CONFIG_FUNCTION_GRAPH_TRACER
208 ifndef CONFIG_HAVE_FENTRY
209 ACCUMULATE_OUTGOING_ARGS
:= 1
213 ifeq ($(ACCUMULATE_OUTGOING_ARGS
), 1)
214 # This compiler flag is not supported by Clang:
215 KBUILD_CFLAGS
+= $(call cc-option
,-maccumulate-outgoing-args
,)
218 # Workaround for a gcc prelease that unfortunately was shipped in a suse release
219 KBUILD_CFLAGS
+= -Wno-sign-compare
221 KBUILD_CFLAGS
+= -fno-asynchronous-unwind-tables
223 # Avoid indirect branches in kernel to deal with Spectre
224 ifdef CONFIG_MITIGATION_RETPOLINE
225 KBUILD_CFLAGS
+= $(RETPOLINE_CFLAGS
)
226 KBUILD_RUSTFLAGS
+= $(RETPOLINE_RUSTFLAGS
)
227 # Additionally, avoid generating expensive indirect jumps which
228 # are subject to retpolines for small number of switch cases.
229 # LLVM turns off jump table generation by default when under
230 # retpoline builds, however, gcc does not for x86. This has
231 # only been fixed starting from gcc stable version 8.4.0 and
232 # onwards, but not for older ones. See gcc bug #86952.
233 ifndef CONFIG_CC_IS_CLANG
234 KBUILD_CFLAGS
+= -fno-jump-tables
238 ifdef CONFIG_MITIGATION_SLS
239 KBUILD_CFLAGS
+= -mharden-sls
=all
242 ifdef CONFIG_CALL_PADDING
243 PADDING_CFLAGS
:= -fpatchable-function-entry
=$(CONFIG_FUNCTION_PADDING_BYTES
),$(CONFIG_FUNCTION_PADDING_BYTES
)
244 KBUILD_CFLAGS
+= $(PADDING_CFLAGS
)
245 export PADDING_CFLAGS
247 PADDING_RUSTFLAGS
:= -Zpatchable-function-entry
=$(CONFIG_FUNCTION_PADDING_BYTES
),$(CONFIG_FUNCTION_PADDING_BYTES
)
248 KBUILD_RUSTFLAGS
+= $(PADDING_RUSTFLAGS
)
249 export PADDING_RUSTFLAGS
252 KBUILD_LDFLAGS
+= -m elf_
$(UTS_MACHINE
)
254 ifdef CONFIG_X86_NEED_RELOCS
255 LDFLAGS_vmlinux
:= --emit-relocs
--discard-none
261 # The 64-bit kernel must be aligned to 2MB. Pass -z max-page-size=0x200000 to
262 # the linker to force 2MB page size regardless of the default page size used
266 LDFLAGS_vmlinux
+= -z max-page-size
=0x200000
270 archscripts
: scripts_basic
271 $(Q
)$(MAKE
) $(build
)=arch
/x86
/tools relocs
274 # Syscall table generation
277 $(Q
)$(MAKE
) $(build
)=arch
/x86
/entry
/syscalls
all
282 libs-y
+= arch
/x86
/lib
/
284 # drivers-y are linked after core-y
285 drivers-
$(CONFIG_MATH_EMULATION
) += arch
/x86
/math-emu
/
286 drivers-
$(CONFIG_PCI
) += arch
/x86
/pci
/
288 # suspend and hibernation support
289 drivers-
$(CONFIG_PM
) += arch
/x86
/power
/
291 drivers-
$(CONFIG_VIDEO
) += arch
/x86
/video
/
294 # boot loader support. Several targets are kept for legacy purposes
296 boot
:= arch
/x86
/boot
298 BOOT_TARGETS
= bzdisk fdimage fdimage144 fdimage288 hdimage isoimage
300 PHONY
+= bzImage
$(BOOT_TARGETS
)
302 # Default kernel to build
305 # KBUILD_IMAGE specify target image being built
306 KBUILD_IMAGE
:= $(boot
)/bzImage
309 ifeq ($(CONFIG_X86_DECODER_SELFTEST
),y
)
310 $(Q
)$(MAKE
) $(build
)=arch
/x86
/tools posttest
312 $(Q
)$(MAKE
) $(build
)=$(boot
) $(KBUILD_IMAGE
)
313 $(Q
)mkdir
-p
$(objtree
)/arch
/$(UTS_MACHINE
)/boot
314 $(Q
)ln
-fsn ..
/..
/x86
/boot
/bzImage
$(objtree
)/arch
/$(UTS_MACHINE
)/boot
/$@
316 $(BOOT_TARGETS
): vmlinux
317 $(Q
)$(MAKE
) $(build
)=$(boot
) $@
323 vdso-install-
$(CONFIG_X86_64
) += arch
/x86
/entry
/vdso
/vdso64.so.dbg
324 vdso-install-
$(CONFIG_X86_X32_ABI
) += arch
/x86
/entry
/vdso
/vdsox32.so.dbg
325 vdso-install-
$(CONFIG_COMPAT_32
) += arch
/x86
/entry
/vdso
/vdso32.so.dbg
327 archprepare
: checkbin
329 ifdef CONFIG_MITIGATION_RETPOLINE
330 ifeq ($(RETPOLINE_CFLAGS
),)
331 @echo
"You are building kernel with non-retpoline compiler." >&2
332 @echo
"Please update your compiler." >&2
337 ifdef CONFIG_UNWINDER_ORC
338 orc_hash_h
:= arch
/$(SRCARCH
)/include/generated
/asm
/orc_hash.h
339 orc_hash_sh
:= $(srctree
)/scripts
/orc_hash.sh
340 targets
+= $(orc_hash_h
)
341 quiet_cmd_orc_hash
= GEN
$@
342 cmd_orc_hash
= mkdir
-p
$(dir $@
); \
343 $(CONFIG_SHELL
) $(orc_hash_sh
) < $< > $@
344 $(orc_hash_h
): $(srctree
)/arch
/x86
/include/asm
/orc_types.h
$(orc_hash_sh
) FORCE
345 $(call if_changed
,orc_hash
)
346 archprepare
: $(orc_hash_h
)
350 $(Q
)rm -rf
$(objtree
)/arch
/i386
351 $(Q
)rm -rf
$(objtree
)/arch
/x86_64
354 echo
'* bzImage - Compressed kernel image (arch/x86/boot/bzImage)'
355 echo
' install - Install kernel using (your) ~/bin/$(INSTALLKERNEL) or'
356 echo
' (distribution) /sbin/$(INSTALLKERNEL) or install to '
357 echo
' $$(INSTALL_PATH) and run lilo'
359 echo
' fdimage - Create 1.4MB boot floppy image (arch/x86/boot/fdimage)'
360 echo
' fdimage144 - Create 1.4MB boot floppy image (arch/x86/boot/fdimage)'
361 echo
' fdimage288 - Create 2.8MB boot floppy image (arch/x86/boot/fdimage)'
362 echo
' hdimage - Create a BIOS/EFI hard disk image (arch/x86/boot/hdimage)'
363 echo
' isoimage - Create a boot CD-ROM image (arch/x86/boot/image.iso)'
364 echo
' bzdisk/fdimage*/hdimage/isoimage also accept:'
365 echo
' FDARGS="..." arguments for the booted kernel'
366 echo
' FDINITRD=file initrd for the booted kernel'