
Now Kbuild provides reasonable defaults for objtool, sanitizers, and profilers. Remove redundant variables. Note: This commit changes the coverage for some objects: - include arch/mips/vdso/vdso-image.o into UBSAN, GCOV, KCOV - include arch/sparc/vdso/vdso-image-*.o into UBSAN - include arch/sparc/vdso/vma.o into UBSAN - include arch/x86/entry/vdso/extable.o into KASAN, KCSAN, UBSAN, GCOV, KCOV - include arch/x86/entry/vdso/vdso-image-*.o into KASAN, KCSAN, UBSAN, GCOV, KCOV - include arch/x86/entry/vdso/vdso32-setup.o into KASAN, KCSAN, UBSAN, GCOV, KCOV - include arch/x86/entry/vdso/vma.o into GCOV, KCOV - include arch/x86/um/vdso/vma.o into KASAN, GCOV, KCOV I believe these are positive effects because all of them are kernel space objects. Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> Reviewed-by: Kees Cook <keescook@chromium.org> Tested-by: Roberto Sassu <roberto.sassu@huawei.com>
4.4 KiB
SPDX-License-Identifier: GPL-2.0
Makefile for Kernel-based Virtual Machine module, HYP/nVHE part
asflags-y := -D__KVM_NVHE_HYPERVISOR__ -D__DISABLE_EXPORTS
Tracepoint and MMIO logging symbols should not be visible at nVHE KVM as
there is no way to execute them and any such MMIO access from nVHE KVM
will explode instantly (Words of Marc Zyngier). So introduce a generic flag
DISABLE_TRACE_MMIO to disable MMIO tracing for nVHE KVM.
ccflags-y := -D__KVM_NVHE_HYPERVISOR__ -D__DISABLE_EXPORTS -D__DISABLE_TRACE_MMIO__
ccflags-y += -fno-stack-protector
-DDISABLE_BRANCH_PROFILING
$(DISABLE_STACKLEAK_PLUGIN)
hostprogs := gen-hyprel HOST_EXTRACFLAGS += -I$(objtree)/include
lib-objs := clear_page.o copy_page.o memcpy.o memset.o lib-objs := $(addprefix ../../../lib/, $(lib-objs))
hyp-obj-y := timer-sr.o sysreg-sr.o debug-sr.o switch.o tlb.o hyp-init.o host.o
hyp-main.o hyp-smp.o psci-relay.o early_alloc.o page_alloc.o
cache.o setup.o mm.o mem_protect.o sys_regs.o pkvm.o stacktrace.o ffa.o
hyp-obj-y += ../vgic-v3-sr.o ../aarch32.o ../vgic-v2-cpuif-proxy.o ../entry.o
../fpsimd.o ../hyp-entry.o ../exception.o ../pgtable.o
hyp-obj-$(CONFIG_LIST_HARDENED) += list_debug.o
hyp-obj-y += $(lib-objs)
Build rules for compiling nVHE hyp code
Output of this folder is kvm_nvhe.o
, a partially linked object
file containing all nVHE hyp code and data.
hyp-obj := $(patsubst %.o,%.nvhe.o,$(hyp-obj-y)) obj-y := kvm_nvhe.o targets += $(hyp-obj) kvm_nvhe.tmp.o kvm_nvhe.rel.o hyp.lds hyp-reloc.S hyp-reloc.o
1) Compile all source files to .nvhe.o
object files. The file extension
avoids file name clashes for files shared with VHE.
$(obj)/%.nvhe.o: $(src)/%.c FORCE $(call if_changed_rule,cc_o_c) $(obj)/%.nvhe.o: $(src)/%.S FORCE $(call if_changed_rule,as_o_S)
2) Compile linker script.
$(obj)/hyp.lds: $(src)/hyp.lds.S FORCE $(call if_changed_dep,cpp_lds_S)
3) Partially link all '.nvhe.o' files and apply the linker script.
Prefixes names of ELF sections with '.hyp', eg. '.hyp.text'.
Note: The following rule assumes that the 'ld' rule puts LDFLAGS before
the list of dependencies to form '-T $(obj)/hyp.lds'. This is to
keep the dependency on the target while avoiding an error from
GNU ld if the linker script is passed to it twice.
LDFLAGS_kvm_nvhe.tmp.o := -r -T $(obj)/kvm_nvhe.tmp.o: $(obj)/hyp.lds $(addprefix $(obj)/,$(hyp-obj)) FORCE $(call if_changed,ld)
4) Generate list of hyp code/data positions that need to be relocated at
runtime. Because the hypervisor is part of the kernel binary, relocations
produce a kernel VA. We enumerate relocations targeting hyp at build time
and convert the kernel VAs at those positions to hyp VAs.
$(obj)/hyp-reloc.S: $(obj)/kvm_nvhe.tmp.o $(obj)/gen-hyprel FORCE $(call if_changed,hyprel)
5) Compile hyp-reloc.S and link it into the existing partially linked object.
The object file now contains a section with pointers to hyp positions that
will contain kernel VAs at runtime. These pointers have relocations on them
so that they get updated as the hyp object is linked into vmlinux
.
LDFLAGS_kvm_nvhe.rel.o := -r $(obj)/kvm_nvhe.rel.o: $(obj)/kvm_nvhe.tmp.o $(obj)/hyp-reloc.o FORCE $(call if_changed,ld)
6) Produce the final 'kvm_nvhe.o', ready to be linked into 'vmlinux'.
Prefixes names of ELF symbols with '_kvm_nvhe'.
$(obj)/kvm_nvhe.o: $(obj)/kvm_nvhe.rel.o FORCE $(call if_changed,hypcopy)
The HYPREL command calls gen-hyprel
to generate an assembly file with
a list of relocations targeting hyp code/data.
quiet_cmd_hyprel = HYPREL $@ cmd_hyprel = $(obj)/gen-hyprel $< > $@
The HYPCOPY command uses objcopy
to prefix all ELF symbol names
to avoid clashes with VHE code/data.
quiet_cmd_hypcopy = HYPCOPY $@ cmd_hypcopy = $(OBJCOPY) --prefix-symbols=_kvm_nvhe $< $@
Remove ftrace, Shadow Call Stack, and CFI CFLAGS.
This is equivalent to the 'notrace', '__noscs', and '__nocfi' annotations.
KBUILD_CFLAGS := $(filter-out $(CC_FLAGS_FTRACE) $(CC_FLAGS_SCS) $(CC_FLAGS_CFI), $(KBUILD_CFLAGS))
Starting from 13.0.0 llvm emits SHT_REL section '.llvm.call-graph-profile'
when profile optimization is applied. gen-hyprel does not support SHT_REL and
causes a build failure. Remove profile optimization flags.
KBUILD_CFLAGS := $(filter-out -fprofile-sample-use=% -fprofile-use=%, $(KBUILD_CFLAGS)) KBUILD_CFLAGS += -fno-asynchronous-unwind-tables -fno-unwind-tables