1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
# SPDX-License-Identifier: GPL-2.0
ccflags-y += -I $(srctree)/arch/x86/kvm
ccflags-$(CONFIG_KVM_WERROR) += -Werror
include $(srctree)/virt/kvm/Makefile.kvm
kvm-y += x86.o emulate.o irq.o lapic.o cpuid.o pmu.o mtrr.o \
debugfs.o mmu/mmu.o mmu/page_track.o mmu/spte.o
kvm-$(CONFIG_X86_64) += mmu/tdp_iter.o mmu/tdp_mmu.o
kvm-$(CONFIG_KVM_IOAPIC) += i8259.o i8254.o ioapic.o
kvm-$(CONFIG_KVM_HYPERV) += hyperv.o
kvm-$(CONFIG_KVM_XEN) += xen.o
kvm-$(CONFIG_KVM_SMM) += smm.o
kvm-intel-y += vmx/vmx.o vmx/vmenter.o vmx/pmu_intel.o vmx/vmcs12.o \
vmx/nested.o vmx/posted_intr.o vmx/main.o
kvm-intel-$(CONFIG_X86_SGX_KVM) += vmx/sgx.o
kvm-intel-$(CONFIG_KVM_HYPERV) += vmx/hyperv.o vmx/hyperv_evmcs.o
kvm-intel-$(CONFIG_KVM_INTEL_TDX) += vmx/tdx.o
kvm-amd-y += svm/svm.o svm/vmenter.o svm/pmu.o svm/nested.o svm/avic.o
kvm-amd-$(CONFIG_KVM_AMD_SEV) += svm/sev.o
kvm-amd-$(CONFIG_KVM_HYPERV) += svm/hyperv.o
ifdef CONFIG_HYPERV
kvm-y += kvm_onhyperv.o
kvm-intel-y += vmx/vmx_onhyperv.o vmx/hyperv_evmcs.o
kvm-amd-y += svm/svm_onhyperv.o
endif
obj-$(CONFIG_KVM_X86) += kvm.o
obj-$(CONFIG_KVM_INTEL) += kvm-intel.o
obj-$(CONFIG_KVM_AMD) += kvm-amd.o
AFLAGS_svm/vmenter.o := -iquote $(obj)
$(obj)/svm/vmenter.o: $(obj)/kvm-asm-offsets.h
AFLAGS_vmx/vmenter.o := -iquote $(obj)
$(obj)/vmx/vmenter.o: $(obj)/kvm-asm-offsets.h
$(obj)/kvm-asm-offsets.h: $(obj)/kvm-asm-offsets.s FORCE
$(call filechk,offsets,__KVM_ASM_OFFSETS_H__)
targets += kvm-asm-offsets.s
clean-files += kvm-asm-offsets.h
# Fail the build if there is unexpected EXPORT_SYMBOL_GPL (or EXPORT_SYMBOL)
# usage. All KVM-internal exports should use EXPORT_SYMBOL_FOR_KVM_INTERNAL.
# Only a handful of exports intended for other modules (VFIO, KVMGT) should
# use EXPORT_SYMBOL_GPL, and EXPORT_SYMBOL should never be used.
ifdef CONFIG_KVM_X86
# Search recursively for whole words and print line numbers. Filter out the
# allowed set of exports, i.e. those that are intended for external usage.
exports_grep_trailer := --include='*.[ch]' -nrw $(srctree)/virt/kvm $(srctree)/arch/x86/kvm | \
grep -v -e kvm_page_track_register_notifier \
-e kvm_page_track_unregister_notifier \
-e kvm_write_track_add_gfn \
-e kvm_write_track_remove_gfn \
-e kvm_get_kvm \
-e kvm_get_kvm_safe \
-e kvm_put_kvm
# Force grep to emit a goofy group separator that can in turn be replaced with
# the above newline macro (newlines in Make are a nightmare). Note, grep only
# prints the group separator when N lines of context are requested via -C,
# a.k.a. --NUM. Simply request zero lines. Print the separator only after
# filtering out expected exports to avoid extra newlines in the error message.
define get_kvm_exports
$(shell grep "$(1)" -C0 $(exports_grep_trailer) | grep "$(1)" -C0 --group-separator="!SEP!")
endef
define check_kvm_exports
nr_kvm_exports := $(shell grep "$(1)" $(exports_grep_trailer) | wc -l)
ifneq (0,$$(nr_kvm_exports))
$$(error ERROR ***\
$$(newline)found $$(nr_kvm_exports) unwanted occurrences of $(1):\
$$(newline) $(subst !SEP!,$$(newline) ,$(call get_kvm_exports,$(1)))\
$$(newline)in directories:\
$$(newline) $(srctree)/arch/x86/kvm\
$$(newline) $(srctree)/virt/kvm\
$$(newline)Use EXPORT_SYMBOL_FOR_KVM_INTERNAL, not $(1))
endif # nr_kvm_exports != 0
undefine nr_kvm_exports
endef # check_kvm_exports
$(eval $(call check_kvm_exports,EXPORT_SYMBOL_GPL))
$(eval $(call check_kvm_exports,EXPORT_SYMBOL))
undefine check_kvm_exports
undefine get_kvm_exports
undefine exports_grep_trailer
endif # CONFIG_KVM_X86
|