Merge tag 'arm-drivers-5.14' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc
[linux-2.6-microblaze.git] / arch / arm64 / kvm / hyp / nvhe / Makefile
1 # SPDX-License-Identifier: GPL-2.0
2 #
3 # Makefile for Kernel-based Virtual Machine module, HYP/nVHE part
4 #
5
6 asflags-y := -D__KVM_NVHE_HYPERVISOR__ -D__DISABLE_EXPORTS
7 ccflags-y := -D__KVM_NVHE_HYPERVISOR__ -D__DISABLE_EXPORTS
8
9 hostprogs := gen-hyprel
10 HOST_EXTRACFLAGS += -I$(objtree)/include
11
12 lib-objs := clear_page.o copy_page.o memcpy.o memset.o
13 lib-objs := $(addprefix ../../../lib/, $(lib-objs))
14
15 obj-y := timer-sr.o sysreg-sr.o debug-sr.o switch.o tlb.o hyp-init.o host.o \
16          hyp-main.o hyp-smp.o psci-relay.o early_alloc.o stub.o page_alloc.o \
17          cache.o setup.o mm.o mem_protect.o
18 obj-y += ../vgic-v3-sr.o ../aarch32.o ../vgic-v2-cpuif-proxy.o ../entry.o \
19          ../fpsimd.o ../hyp-entry.o ../exception.o ../pgtable.o
20 obj-y += $(lib-objs)
21
22 ##
23 ## Build rules for compiling nVHE hyp code
24 ## Output of this folder is `kvm_nvhe.o`, a partially linked object
25 ## file containing all nVHE hyp code and data.
26 ##
27
28 hyp-obj := $(patsubst %.o,%.nvhe.o,$(obj-y))
29 obj-y := kvm_nvhe.o
30 extra-y := $(hyp-obj) kvm_nvhe.tmp.o kvm_nvhe.rel.o hyp.lds hyp-reloc.S hyp-reloc.o
31
32 # 1) Compile all source files to `.nvhe.o` object files. The file extension
33 #    avoids file name clashes for files shared with VHE.
34 $(obj)/%.nvhe.o: $(src)/%.c FORCE
35         $(call if_changed_rule,cc_o_c)
36 $(obj)/%.nvhe.o: $(src)/%.S FORCE
37         $(call if_changed_rule,as_o_S)
38
39 # 2) Compile linker script.
40 $(obj)/hyp.lds: $(src)/hyp.lds.S FORCE
41         $(call if_changed_dep,cpp_lds_S)
42
43 # 3) Partially link all '.nvhe.o' files and apply the linker script.
44 #    Prefixes names of ELF sections with '.hyp', eg. '.hyp.text'.
45 #    Note: The following rule assumes that the 'ld' rule puts LDFLAGS before
46 #          the list of dependencies to form '-T $(obj)/hyp.lds'. This is to
47 #          keep the dependency on the target while avoiding an error from
48 #          GNU ld if the linker script is passed to it twice.
49 LDFLAGS_kvm_nvhe.tmp.o := -r -T
50 $(obj)/kvm_nvhe.tmp.o: $(obj)/hyp.lds $(addprefix $(obj)/,$(hyp-obj)) FORCE
51         $(call if_changed,ld)
52
53 # 4) Generate list of hyp code/data positions that need to be relocated at
54 #    runtime. Because the hypervisor is part of the kernel binary, relocations
55 #    produce a kernel VA. We enumerate relocations targeting hyp at build time
56 #    and convert the kernel VAs at those positions to hyp VAs.
57 $(obj)/hyp-reloc.S: $(obj)/kvm_nvhe.tmp.o $(obj)/gen-hyprel
58         $(call if_changed,hyprel)
59
60 # 5) Compile hyp-reloc.S and link it into the existing partially linked object.
61 #    The object file now contains a section with pointers to hyp positions that
62 #    will contain kernel VAs at runtime. These pointers have relocations on them
63 #    so that they get updated as the hyp object is linked into `vmlinux`.
64 LDFLAGS_kvm_nvhe.rel.o := -r
65 $(obj)/kvm_nvhe.rel.o: $(obj)/kvm_nvhe.tmp.o $(obj)/hyp-reloc.o FORCE
66         $(call if_changed,ld)
67
68 # 6) Produce the final 'kvm_nvhe.o', ready to be linked into 'vmlinux'.
69 #    Prefixes names of ELF symbols with '__kvm_nvhe_'.
70 $(obj)/kvm_nvhe.o: $(obj)/kvm_nvhe.rel.o FORCE
71         $(call if_changed,hypcopy)
72
73 # The HYPREL command calls `gen-hyprel` to generate an assembly file with
74 # a list of relocations targeting hyp code/data.
75 quiet_cmd_hyprel = HYPREL  $@
76       cmd_hyprel = $(obj)/gen-hyprel $< > $@
77
78 # The HYPCOPY command uses `objcopy` to prefix all ELF symbol names
79 # to avoid clashes with VHE code/data.
80 quiet_cmd_hypcopy = HYPCOPY $@
81       cmd_hypcopy = $(OBJCOPY) --prefix-symbols=__kvm_nvhe_ $< $@
82
83 # Remove ftrace, Shadow Call Stack, and CFI CFLAGS.
84 # This is equivalent to the 'notrace', '__noscs', and '__nocfi' annotations.
85 KBUILD_CFLAGS := $(filter-out $(CC_FLAGS_FTRACE) $(CC_FLAGS_SCS) $(CC_FLAGS_CFI), $(KBUILD_CFLAGS))
86
87 # KVM nVHE code is run at a different exception code with a different map, so
88 # compiler instrumentation that inserts callbacks or checks into the code may
89 # cause crashes. Just disable it.
90 GCOV_PROFILE    := n
91 KASAN_SANITIZE  := n
92 UBSAN_SANITIZE  := n
93 KCOV_INSTRUMENT := n
94
95 # Skip objtool checking for this directory because nVHE code is compiled with
96 # non-standard build rules.
97 OBJECT_FILES_NON_STANDARD := y