qemu with hax to log dma reads & writes jcs.org/2018/11/12/vfio
at master 287 lines 8.5 kB view raw
1# -*- Mode: makefile -*- 2 3BUILD_DIR?=$(CURDIR)/.. 4 5include ../config-host.mak 6include config-target.mak 7include $(SRC_PATH)/rules.mak 8 9ifdef CONFIG_SOFTMMU 10include config-devices.mak 11endif 12 13$(call set-vpath, $(SRC_PATH):$(BUILD_DIR)) 14ifdef CONFIG_LINUX 15QEMU_CFLAGS += -isystem ../linux-headers 16endif 17QEMU_CFLAGS += -iquote .. -iquote $(SRC_PATH)/target/$(TARGET_BASE_ARCH) -DNEED_CPU_H 18 19QEMU_CFLAGS+=-iquote $(SRC_PATH)/include 20 21ifdef CONFIG_USER_ONLY 22# user emulator name 23QEMU_PROG=qemu-$(TARGET_NAME) 24QEMU_PROG_BUILD = $(QEMU_PROG) 25else 26# system emulator name 27QEMU_PROG=qemu-system-$(TARGET_NAME)$(EXESUF) 28ifneq (,$(findstring -mwindows,$(SDL_LIBS))) 29# Terminate program name with a 'w' because the linker builds a windows executable. 30QEMU_PROGW=qemu-system-$(TARGET_NAME)w$(EXESUF) 31$(QEMU_PROG): $(QEMU_PROGW) 32 $(call quiet-command,$(OBJCOPY) --subsystem console $(QEMU_PROGW) $(QEMU_PROG),"GEN","$(TARGET_DIR)$(QEMU_PROG)") 33QEMU_PROG_BUILD = $(QEMU_PROGW) 34else 35QEMU_PROG_BUILD = $(QEMU_PROG) 36endif 37endif 38 39PROGS=$(QEMU_PROG) $(QEMU_PROGW) 40STPFILES= 41 42config-target.h: config-target.h-timestamp 43config-target.h-timestamp: config-target.mak 44 45config-devices.h: config-devices.h-timestamp 46config-devices.h-timestamp: config-devices.mak 47 48ifdef CONFIG_TRACE_SYSTEMTAP 49stap: $(QEMU_PROG).stp-installed $(QEMU_PROG).stp $(QEMU_PROG)-simpletrace.stp $(QEMU_PROG)-log.stp 50 51ifdef CONFIG_USER_ONLY 52TARGET_TYPE=user 53else 54TARGET_TYPE=system 55endif 56 57tracetool-y = $(SRC_PATH)/scripts/tracetool.py 58tracetool-y += $(shell find $(SRC_PATH)/scripts/tracetool -name "*.py") 59 60$(QEMU_PROG).stp-installed: $(BUILD_DIR)/trace-events-all $(tracetool-y) 61 $(call quiet-command,$(TRACETOOL) \ 62 --group=all \ 63 --format=stap \ 64 --backends=$(TRACE_BACKENDS) \ 65 --binary=$(bindir)/$(QEMU_PROG) \ 66 --target-name=$(TARGET_NAME) \ 67 --target-type=$(TARGET_TYPE) \ 68 $< > $@,"GEN","$(TARGET_DIR)$(QEMU_PROG).stp-installed") 69 70$(QEMU_PROG).stp: $(BUILD_DIR)/trace-events-all $(tracetool-y) 71 $(call quiet-command,$(TRACETOOL) \ 72 --group=all \ 73 --format=stap \ 74 --backends=$(TRACE_BACKENDS) \ 75 --binary=$(realpath .)/$(QEMU_PROG) \ 76 --target-name=$(TARGET_NAME) \ 77 --target-type=$(TARGET_TYPE) \ 78 $< > $@,"GEN","$(TARGET_DIR)$(QEMU_PROG).stp") 79 80$(QEMU_PROG)-simpletrace.stp: $(BUILD_DIR)/trace-events-all $(tracetool-y) 81 $(call quiet-command,$(TRACETOOL) \ 82 --group=all \ 83 --format=simpletrace-stap \ 84 --backends=$(TRACE_BACKENDS) \ 85 --probe-prefix=qemu.$(TARGET_TYPE).$(TARGET_NAME) \ 86 $< > $@,"GEN","$(TARGET_DIR)$(QEMU_PROG)-simpletrace.stp") 87 88$(QEMU_PROG)-log.stp: $(BUILD_DIR)/trace-events-all $(tracetool-y) 89 $(call quiet-command,$(TRACETOOL) \ 90 --group=all \ 91 --format=log-stap \ 92 --backends=$(TRACE_BACKENDS) \ 93 --probe-prefix=qemu.$(TARGET_TYPE).$(TARGET_NAME) \ 94 $< > $@,"GEN","$(TARGET_DIR)$(QEMU_PROG)-log.stp") 95 96else 97stap: 98endif 99.PHONY: stap 100 101all: $(PROGS) stap 102 103# Dummy command so that make thinks it has done something 104 @true 105 106obj-y += trace/ 107 108######################################################### 109# cpu emulator library 110obj-y += exec.o exec-vary.o 111obj-y += accel/ 112obj-$(CONFIG_TCG) += tcg/tcg.o tcg/tcg-op.o tcg/tcg-op-vec.o tcg/tcg-op-gvec.o 113obj-$(CONFIG_TCG) += tcg/tcg-common.o tcg/optimize.o 114obj-$(CONFIG_TCG_INTERPRETER) += tcg/tci.o 115obj-$(CONFIG_TCG_INTERPRETER) += disas/tci.o 116obj-$(CONFIG_TCG) += fpu/softfloat.o 117obj-y += target/$(TARGET_BASE_ARCH)/ 118obj-y += disas.o 119obj-$(call notempty,$(TARGET_XML_FILES)) += gdbstub-xml.o 120LIBS := $(libs_cpu) $(LIBS) 121 122obj-$(CONFIG_PLUGIN) += plugins/ 123 124######################################################### 125# Linux user emulator target 126 127ifdef CONFIG_LINUX_USER 128 129QEMU_CFLAGS+=-I$(SRC_PATH)/linux-user/$(TARGET_ABI_DIR) \ 130 -I$(SRC_PATH)/linux-user/host/$(ARCH) \ 131 -I$(SRC_PATH)/linux-user \ 132 -Ilinux-user/$(TARGET_ABI_DIR) 133 134obj-y += linux-user/ 135obj-y += gdbstub.o thunk.o 136 137endif #CONFIG_LINUX_USER 138 139######################################################### 140# BSD user emulator target 141 142ifdef CONFIG_BSD_USER 143 144QEMU_CFLAGS+=-I$(SRC_PATH)/bsd-user -I$(SRC_PATH)/bsd-user/$(TARGET_ABI_DIR) \ 145 -I$(SRC_PATH)/bsd-user/$(HOST_VARIANT_DIR) 146 147obj-y += bsd-user/ 148obj-y += gdbstub.o 149 150endif #CONFIG_BSD_USER 151 152######################################################### 153# System emulator target 154ifdef CONFIG_SOFTMMU 155obj-y += softmmu/ 156obj-y += gdbstub.o 157obj-y += dump/ 158obj-y += hw/ 159obj-y += monitor/ 160obj-y += qapi/ 161obj-y += migration/ram.o 162LIBS := $(libs_softmmu) $(LIBS) 163 164# Hardware support 165ifeq ($(TARGET_NAME), sparc64) 166obj-y += hw/sparc64/ 167else 168obj-y += hw/$(TARGET_BASE_ARCH)/ 169endif 170 171generated-files-y += hmp-commands.h hmp-commands-info.h 172generated-files-y += config-devices.h 173 174endif # CONFIG_SOFTMMU 175 176dummy := $(call unnest-vars,,obj-y) 177all-obj-y := $(obj-y) 178 179# 180# common-obj-m has some crap here, probably as side effect from 181# unnest-vars recursing into target directories to fill obj-y and not 182# properly handling the -m case. 183# 184# Clear common-obj-m as workaround. Fixes suspious dependency errors 185# when building devices as modules. A bit hackish, but should be ok 186# as long as we do not have any target-specific modules. 187# 188# The meson-based build system currently in development doesn't need 189# unnest-vars and will obsolete this workaround. 190# 191common-obj-m := 192 193include $(SRC_PATH)/Makefile.objs 194dummy := $(call unnest-vars,.., \ 195 authz-obj-y \ 196 block-obj-y \ 197 block-obj-m \ 198 chardev-obj-y \ 199 crypto-obj-y \ 200 qom-obj-y \ 201 io-obj-y \ 202 common-obj-y \ 203 common-obj-m) 204all-obj-y += $(common-obj-y) 205all-obj-y += $(qom-obj-y) 206all-obj-$(CONFIG_SOFTMMU) += $(authz-obj-y) 207all-obj-$(CONFIG_SOFTMMU) += $(block-obj-y) $(chardev-obj-y) 208all-obj-$(CONFIG_SOFTMMU) += $(crypto-obj-y) 209all-obj-$(CONFIG_SOFTMMU) += $(io-obj-y) 210 211ifdef CONFIG_SOFTMMU 212$(QEMU_PROG_BUILD): config-devices.mak 213endif 214 215COMMON_LDADDS = ../libqemuutil.a 216 217# build either PROG or PROGW 218$(QEMU_PROG_BUILD): $(all-obj-y) $(COMMON_LDADDS) $(softmmu-main-y) 219 $(call LINK, $(filter-out %.mak, $^)) 220ifdef CONFIG_DARWIN 221 $(call quiet-command,Rez -append $(SRC_PATH)/pc-bios/qemu.rsrc -o $@,"REZ","$(TARGET_DIR)$@") 222 $(call quiet-command,SetFile -a C $@,"SETFILE","$(TARGET_DIR)$@") 223endif 224 225gdbstub-xml.c: $(TARGET_XML_FILES) $(SRC_PATH)/scripts/feature_to_c.sh 226 $(call quiet-command,rm -f $@ && $(SHELL) $(SRC_PATH)/scripts/feature_to_c.sh $@ $(TARGET_XML_FILES),"GEN","$(TARGET_DIR)$@") 227 228hmp-commands.h: $(SRC_PATH)/hmp-commands.hx $(SRC_PATH)/scripts/hxtool 229 $(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -h < $< > $@,"GEN","$(TARGET_DIR)$@") 230 231hmp-commands-info.h: $(SRC_PATH)/hmp-commands-info.hx $(SRC_PATH)/scripts/hxtool 232 $(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -h < $< > $@,"GEN","$(TARGET_DIR)$@") 233 234clean: clean-target 235 rm -f *.a *~ $(PROGS) 236 rm -f $(shell find . -name '*.[od]') 237 rm -f hmp-commands.h gdbstub-xml.c 238 rm -f trace/generated-helpers.c trace/generated-helpers.c-timestamp 239ifdef CONFIG_TRACE_SYSTEMTAP 240 rm -f *.stp 241endif 242 243ifdef CONFIG_FUZZ 244include $(SRC_PATH)/tests/qtest/fuzz/Makefile.include 245include $(SRC_PATH)/tests/qtest/Makefile.include 246 247fuzz: fuzz-vars 248fuzz-vars: QEMU_CFLAGS := $(FUZZ_CFLAGS) $(QEMU_CFLAGS) 249fuzz-vars: QEMU_LDFLAGS := $(FUZZ_LDFLAGS) $(QEMU_LDFLAGS) 250fuzz-vars: $(QEMU_PROG_FUZZ) 251dummy := $(call unnest-vars,, fuzz-obj-y) 252 253 254$(QEMU_PROG_FUZZ): config-devices.mak $(all-obj-y) $(COMMON_LDADDS) $(fuzz-obj-y) 255 $(call LINK, $(filter-out %.mak, $^)) 256 257endif 258 259install: all 260ifneq ($(PROGS),) 261 $(call install-prog,$(PROGS),$(DESTDIR)$(bindir)) 262endif 263ifdef CONFIG_TRACE_SYSTEMTAP 264 $(INSTALL_DIR) "$(DESTDIR)$(qemu_datadir)/../systemtap/tapset" 265 $(INSTALL_DATA) $(QEMU_PROG).stp-installed "$(DESTDIR)$(qemu_datadir)/../systemtap/tapset/$(QEMU_PROG).stp" 266 $(INSTALL_DATA) $(QEMU_PROG)-simpletrace.stp "$(DESTDIR)$(qemu_datadir)/../systemtap/tapset/$(QEMU_PROG)-simpletrace.stp" 267 $(INSTALL_DATA) $(QEMU_PROG)-log.stp "$(DESTDIR)$(qemu_datadir)/../systemtap/tapset/$(QEMU_PROG)-log.stp" 268endif 269 270generated-files-y += config-target.h 271Makefile: $(generated-files-y) 272 273# Reports/Analysis 274# 275# The target specific coverage report only cares about target specific 276# blobs and not the shared code. 277# 278 279%/coverage-report.html: 280 @mkdir -p $* 281 $(call quiet-command,\ 282 gcovr -r $(SRC_PATH) --object-directory $(CURDIR) \ 283 -p --html --html-details -o $@, \ 284 "GEN", "coverage-report.html") 285 286.PHONY: coverage-report 287coverage-report: $(CURDIR)/reports/coverage/coverage-report.html