mirror of
https://github.com/xemu-project/xemu.git
synced 2024-12-02 00:26:18 +00:00
3c529d9359
glibc implements posix-aio as a thread pool and imposes a number of limitations. 1) it limits one request per-file descriptor. we hack around this by dup()'ing file descriptors which is hideously ugly 2) it's impossible to add new interfaces and we need a vectored read/write operation to properly support a zero-copy API. What has been suggested to me by glibc folks, is to implement whatever new interfaces we want and then it can eventually be proposed for standardization. This requires that we implement our own posix-aio implementation though. This patch implements posix-aio using pthreads. It immediately eliminates the need for fd pooling. It performs at least as well as the current posix-aio code (in some circumstances, even better). Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5996 c046a42c-6fe2-441c-8c8c-71466251a162
799 lines
18 KiB
Makefile
799 lines
18 KiB
Makefile
include config.mak
|
|
|
|
TARGET_BASE_ARCH:=$(TARGET_ARCH)
|
|
ifeq ($(TARGET_ARCH), x86_64)
|
|
TARGET_BASE_ARCH:=i386
|
|
endif
|
|
ifeq ($(TARGET_ARCH), mipsn32)
|
|
TARGET_BASE_ARCH:=mips
|
|
endif
|
|
ifeq ($(TARGET_ARCH), mips64)
|
|
TARGET_BASE_ARCH:=mips
|
|
endif
|
|
ifeq ($(TARGET_ARCH), ppc64)
|
|
TARGET_BASE_ARCH:=ppc
|
|
endif
|
|
ifeq ($(TARGET_ARCH), ppc64h)
|
|
TARGET_BASE_ARCH:=ppc
|
|
endif
|
|
ifeq ($(TARGET_ARCH), ppcemb)
|
|
TARGET_BASE_ARCH:=ppc
|
|
endif
|
|
ifeq ($(TARGET_ARCH), sparc64)
|
|
TARGET_BASE_ARCH:=sparc
|
|
endif
|
|
TARGET_PATH=$(SRC_PATH)/target-$(TARGET_BASE_ARCH)
|
|
VPATH=$(SRC_PATH):$(TARGET_PATH):$(SRC_PATH)/hw
|
|
CPPFLAGS=-I. -I.. -I$(TARGET_PATH) -I$(SRC_PATH) -MMD -MT $@ -MP -DNEED_CPU_H
|
|
#CFLAGS+=-Werror
|
|
LIBS=
|
|
# user emulator name
|
|
ifndef TARGET_ARCH2
|
|
TARGET_ARCH2=$(TARGET_ARCH)
|
|
endif
|
|
ifeq ($(TARGET_ARCH),arm)
|
|
ifeq ($(TARGET_WORDS_BIGENDIAN),yes)
|
|
TARGET_ARCH2=armeb
|
|
endif
|
|
endif
|
|
ifeq ($(TARGET_ARCH),sh4)
|
|
ifeq ($(TARGET_WORDS_BIGENDIAN),yes)
|
|
TARGET_ARCH2=sh4eb
|
|
endif
|
|
endif
|
|
ifeq ($(TARGET_ARCH),mips)
|
|
ifneq ($(TARGET_WORDS_BIGENDIAN),yes)
|
|
TARGET_ARCH2=mipsel
|
|
endif
|
|
endif
|
|
ifeq ($(TARGET_ARCH),mipsn32)
|
|
ifneq ($(TARGET_WORDS_BIGENDIAN),yes)
|
|
TARGET_ARCH2=mipsn32el
|
|
endif
|
|
endif
|
|
ifeq ($(TARGET_ARCH),mips64)
|
|
ifneq ($(TARGET_WORDS_BIGENDIAN),yes)
|
|
TARGET_ARCH2=mips64el
|
|
endif
|
|
endif
|
|
|
|
ifdef CONFIG_USER_ONLY
|
|
# user emulator name
|
|
QEMU_PROG=qemu-$(TARGET_ARCH2)
|
|
else
|
|
# system emulator name
|
|
ifeq ($(TARGET_ARCH), i386)
|
|
QEMU_PROG=qemu$(EXESUF)
|
|
else
|
|
QEMU_PROG=qemu-system-$(TARGET_ARCH2)$(EXESUF)
|
|
endif
|
|
endif
|
|
|
|
PROGS=$(QEMU_PROG)
|
|
|
|
# We require -O2 to avoid the stack setup prologue in EXIT_TB
|
|
OP_CFLAGS := -O2 -g -fno-strict-aliasing
|
|
OP_CFLAGS += -Wall -Wundef -Wendif-labels -Wwrite-strings -Wmissing-prototypes -Wstrict-prototypes -Wredundant-decls
|
|
|
|
# cc-option
|
|
# Usage: OP_CFLAGS+=$(call cc-option, -falign-functions=0, -malign-functions=0)
|
|
|
|
cc-option = $(shell if $(CC) $(OP_CFLAGS) $(1) -S -o /dev/null -xc /dev/null \
|
|
> /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;)
|
|
|
|
OP_CFLAGS+=$(call cc-option, -fno-reorder-blocks, "")
|
|
OP_CFLAGS+=$(call cc-option, -fno-gcse, "")
|
|
OP_CFLAGS+=$(call cc-option, -fno-tree-ch, "")
|
|
OP_CFLAGS+=$(call cc-option, -fno-optimize-sibling-calls, "")
|
|
OP_CFLAGS+=$(call cc-option, -fno-crossjumping, "")
|
|
OP_CFLAGS+=$(call cc-option, -fno-align-labels, "")
|
|
OP_CFLAGS+=$(call cc-option, -fno-align-jumps, "")
|
|
OP_CFLAGS+=$(call cc-option, -fno-align-functions, $(call cc-option, -malign-functions=0, ""))
|
|
OP_CFLAGS+=$(call cc-option, -fno-section-anchors, "")
|
|
|
|
HELPER_CFLAGS=
|
|
|
|
ifeq ($(ARCH),i386)
|
|
HELPER_CFLAGS+=-fomit-frame-pointer
|
|
OP_CFLAGS+=-mpreferred-stack-boundary=2 -fomit-frame-pointer
|
|
endif
|
|
|
|
ifeq ($(ARCH),ppc)
|
|
CPPFLAGS+= -D__powerpc__
|
|
OP_CFLAGS+= -mlongcall
|
|
endif
|
|
|
|
ifeq ($(ARCH),sparc)
|
|
CFLAGS+=-ffixed-g2 -ffixed-g3
|
|
OP_CFLAGS+=-fno-delayed-branch -ffixed-i0
|
|
ifeq ($(CONFIG_SOLARIS),yes)
|
|
OP_CFLAGS+=-fno-omit-frame-pointer
|
|
else
|
|
CFLAGS+=-ffixed-g1 -ffixed-g6
|
|
HELPER_CFLAGS+=-ffixed-i0
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(ARCH),sparc64)
|
|
OP_CFLAGS+=-mcpu=ultrasparc -m64 -fno-delayed-branch -ffixed-i0
|
|
ifneq ($(CONFIG_SOLARIS),yes)
|
|
CFLAGS+=-ffixed-g5 -ffixed-g6 -ffixed-g7
|
|
OP_CFLAGS+=-ffixed-g5 -ffixed-g6 -ffixed-g7
|
|
else
|
|
CFLAGS+=-ffixed-g1 -ffixed-g4 -ffixed-g5 -ffixed-g7
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(ARCH),alpha)
|
|
# -msmall-data is not used for OP_CFLAGS because we want two-instruction
|
|
# relocations for the constant constructions
|
|
# Ensure there's only a single GP
|
|
CFLAGS+=-msmall-data
|
|
endif
|
|
|
|
ifeq ($(ARCH),hppa)
|
|
OP_CFLAGS=-O1 -fno-delayed-branch
|
|
BASE_LDFLAGS+=-Wl,-T,$(SRC_PATH)/$(ARCH).ld
|
|
endif
|
|
|
|
ifeq ($(ARCH),ia64)
|
|
CFLAGS+=-mno-sdata
|
|
OP_CFLAGS+=-mno-sdata
|
|
endif
|
|
|
|
ifeq ($(ARCH),arm)
|
|
OP_CFLAGS+=-mno-sched-prolog -fno-omit-frame-pointer
|
|
endif
|
|
|
|
ifeq ($(ARCH),m68k)
|
|
OP_CFLAGS+=-fomit-frame-pointer
|
|
endif
|
|
|
|
ifeq ($(ARCH),mips)
|
|
OP_CFLAGS+=-mabi=32 -G0 -fno-PIC -mno-abicalls -fomit-frame-pointer -fno-delayed-branch -Wa,-O0
|
|
endif
|
|
|
|
ifeq ($(ARCH),mips64)
|
|
OP_CFLAGS+=-mabi=n32 -G0 -fno-PIC -mno-abicalls -fomit-frame-pointer -fno-delayed-branch -Wa,-O0
|
|
endif
|
|
|
|
CFLAGS+=$(OS_CFLAGS) $(ARCH_CFLAGS)
|
|
LDFLAGS+=$(OS_LDFLAGS) $(ARCH_LDFLAGS)
|
|
OP_CFLAGS+=$(OS_CFLAGS) $(ARCH_CFLAGS)
|
|
|
|
CPPFLAGS+=-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
|
|
LIBS+=-lm
|
|
ifdef CONFIG_WIN32
|
|
LIBS+=-lwinmm -lws2_32 -liphlpapi
|
|
endif
|
|
ifdef CONFIG_SOLARIS
|
|
LIBS+=-lsocket -lnsl -lresolv
|
|
ifdef NEEDS_LIBSUNMATH
|
|
LIBS+=-lsunmath
|
|
LDFLAGS+=-L/opt/SUNWspro/prod/lib -R/opt/SUNWspro/prod/lib
|
|
OP_CFLAGS+=-I/opt/SUNWspro/prod/include/cc
|
|
CFLAGS+=-I/opt/SUNWspro/prod/include/cc
|
|
endif
|
|
endif
|
|
|
|
kvm.o: CFLAGS+=$(KVM_CFLAGS)
|
|
kvm-all.o: CFLAGS+=$(KVM_CFLAGS)
|
|
|
|
all: $(PROGS)
|
|
|
|
#########################################################
|
|
# cpu emulator library
|
|
LIBOBJS=exec.o kqemu.o translate-all.o cpu-exec.o\
|
|
translate.o host-utils.o
|
|
# TCG code generator
|
|
LIBOBJS+= tcg/tcg.o tcg/tcg-runtime.o
|
|
CPPFLAGS+=-I$(SRC_PATH)/tcg -I$(SRC_PATH)/tcg/$(ARCH)
|
|
ifeq ($(ARCH),sparc64)
|
|
CPPFLAGS+=-I$(SRC_PATH)/tcg/sparc
|
|
endif
|
|
ifdef CONFIG_SOFTFLOAT
|
|
LIBOBJS+=fpu/softfloat.o
|
|
else
|
|
LIBOBJS+=fpu/softfloat-native.o
|
|
endif
|
|
CPPFLAGS+=-I$(SRC_PATH)/fpu
|
|
LIBOBJS+= op_helper.o helper.o
|
|
|
|
ifeq ($(TARGET_BASE_ARCH), arm)
|
|
LIBOBJS+= neon_helper.o iwmmxt_helper.o
|
|
endif
|
|
|
|
ifeq ($(TARGET_BASE_ARCH), alpha)
|
|
LIBOBJS+= alpha_palcode.o
|
|
endif
|
|
|
|
ifeq ($(TARGET_BASE_ARCH), cris)
|
|
LIBOBJS+= cris-dis.o
|
|
|
|
ifndef CONFIG_USER_ONLY
|
|
LIBOBJS+= mmu.o
|
|
endif
|
|
endif
|
|
|
|
# NOTE: the disassembler code is only needed for debugging
|
|
LIBOBJS+=disas.o
|
|
ifeq ($(findstring i386, $(TARGET_ARCH) $(ARCH)),i386)
|
|
USE_I386_DIS=y
|
|
endif
|
|
ifeq ($(findstring x86_64, $(TARGET_ARCH) $(ARCH)),x86_64)
|
|
USE_I386_DIS=y
|
|
endif
|
|
ifdef USE_I386_DIS
|
|
LIBOBJS+=i386-dis.o
|
|
endif
|
|
ifeq ($(findstring alpha, $(TARGET_ARCH) $(ARCH)),alpha)
|
|
LIBOBJS+=alpha-dis.o
|
|
endif
|
|
ifeq ($(findstring ppc, $(TARGET_BASE_ARCH) $(ARCH)),ppc)
|
|
LIBOBJS+=ppc-dis.o
|
|
endif
|
|
ifeq ($(findstring mips, $(TARGET_BASE_ARCH) $(ARCH)),mips)
|
|
LIBOBJS+=mips-dis.o
|
|
endif
|
|
ifeq ($(findstring sparc, $(TARGET_BASE_ARCH) $(ARCH)),sparc)
|
|
LIBOBJS+=sparc-dis.o
|
|
endif
|
|
ifeq ($(findstring arm, $(TARGET_ARCH) $(ARCH)),arm)
|
|
LIBOBJS+=arm-dis.o
|
|
endif
|
|
ifeq ($(findstring m68k, $(TARGET_ARCH) $(ARCH)),m68k)
|
|
LIBOBJS+=m68k-dis.o
|
|
endif
|
|
ifeq ($(findstring sh4, $(TARGET_ARCH) $(ARCH)),sh4)
|
|
LIBOBJS+=sh4-dis.o
|
|
endif
|
|
ifeq ($(findstring hppa, $(TARGET_BASE_ARCH) $(ARCH)),hppa)
|
|
LIBOBJS+=hppa-dis.o
|
|
endif
|
|
ifeq ($(findstring s390, $(TARGET_ARCH) $(ARCH)),s390)
|
|
LIBOBJS+=s390-dis.o
|
|
endif
|
|
|
|
# libqemu
|
|
|
|
libqemu.a: $(LIBOBJS)
|
|
rm -f $@
|
|
$(AR) rcs $@ $(LIBOBJS)
|
|
|
|
translate.o: translate.c cpu.h
|
|
|
|
translate-all.o: translate-all.c cpu.h
|
|
|
|
tcg/tcg.o: cpu.h
|
|
|
|
machine.o: machine.c
|
|
$(CC) $(OP_CFLAGS) $(CPPFLAGS) -c -o $@ $<
|
|
|
|
# HELPER_CFLAGS is used for all the code compiled with static register
|
|
# variables
|
|
op_helper.o: op_helper.c
|
|
$(CC) $(HELPER_CFLAGS) $(CPPFLAGS) $(CFLAGS) $(I386_CFLAGS) -c -o $@ $<
|
|
|
|
cpu-exec.o: cpu-exec.c
|
|
$(CC) $(HELPER_CFLAGS) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
|
|
|
|
#########################################################
|
|
# Linux user emulator target
|
|
|
|
ifdef CONFIG_LINUX_USER
|
|
|
|
ifndef TARGET_ABI_DIR
|
|
TARGET_ABI_DIR=$(TARGET_ARCH)
|
|
endif
|
|
VPATH+=:$(SRC_PATH)/linux-user:$(SRC_PATH)/linux-user/$(TARGET_ABI_DIR)
|
|
CPPFLAGS+=-I$(SRC_PATH)/linux-user -I$(SRC_PATH)/linux-user/$(TARGET_ABI_DIR)
|
|
|
|
ifdef CONFIG_STATIC
|
|
LDFLAGS+=-static
|
|
endif
|
|
|
|
ifeq ($(ARCH),i386)
|
|
ifdef TARGET_GPROF
|
|
USE_I386_LD=y
|
|
endif
|
|
ifdef CONFIG_STATIC
|
|
USE_I386_LD=y
|
|
endif
|
|
ifdef USE_I386_LD
|
|
LDFLAGS+=-Wl,-T,$(SRC_PATH)/$(ARCH).ld
|
|
else
|
|
# WARNING: this LDFLAGS is _very_ tricky : qemu is an ELF shared object
|
|
# that the kernel ELF loader considers as an executable. I think this
|
|
# is the simplest way to make it self virtualizable!
|
|
LDFLAGS+=-Wl,-shared
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(ARCH),x86_64)
|
|
LDFLAGS+=-Wl,-T,$(SRC_PATH)/$(ARCH).ld
|
|
endif
|
|
|
|
ifeq ($(ARCH),ppc)
|
|
LDFLAGS+=-Wl,-T,$(SRC_PATH)/$(ARCH).ld
|
|
endif
|
|
|
|
ifeq ($(ARCH),ppc64)
|
|
LDFLAGS+=-Wl,-T,$(SRC_PATH)/$(ARCH).ld
|
|
endif
|
|
|
|
ifeq ($(ARCH),s390)
|
|
LDFLAGS+=-Wl,-T,$(SRC_PATH)/$(ARCH).ld
|
|
endif
|
|
|
|
ifeq ($(ARCH),sparc)
|
|
# -static is used to avoid g1/g3 usage by the dynamic linker
|
|
LDFLAGS+=-Wl,-T,$(SRC_PATH)/$(ARCH).ld -static
|
|
endif
|
|
|
|
ifeq ($(ARCH),sparc64)
|
|
LDFLAGS+=-Wl,-T,$(SRC_PATH)/$(ARCH).ld
|
|
endif
|
|
|
|
ifeq ($(ARCH),alpha)
|
|
LDFLAGS+=-Wl,-T,$(SRC_PATH)/$(ARCH).ld
|
|
endif
|
|
|
|
ifeq ($(ARCH),ia64)
|
|
LDFLAGS+=-Wl,-G0 -Wl,-T,$(SRC_PATH)/$(ARCH).ld
|
|
endif
|
|
|
|
ifeq ($(ARCH),arm)
|
|
LDFLAGS+=-Wl,-T,$(SRC_PATH)/$(ARCH).ld
|
|
endif
|
|
|
|
ifeq ($(ARCH),m68k)
|
|
LDFLAGS+=-Wl,-T,$(SRC_PATH)/$(ARCH).ld
|
|
endif
|
|
|
|
ifeq ($(ARCH),mips)
|
|
ifeq ($(WORDS_BIGENDIAN),yes)
|
|
LDFLAGS+=-Wl,-T,$(SRC_PATH)/$(ARCH).ld
|
|
else
|
|
LDFLAGS+=-Wl,-T,$(SRC_PATH)/$(ARCH)el.ld
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(ARCH),mips64)
|
|
ifeq ($(WORDS_BIGENDIAN),yes)
|
|
LDFLAGS+=-Wl,-T,$(SRC_PATH)/$(ARCH).ld
|
|
else
|
|
LDFLAGS+=-Wl,-T,$(SRC_PATH)/$(ARCH)el.ld
|
|
endif
|
|
endif
|
|
|
|
# profiling code
|
|
ifdef TARGET_GPROF
|
|
LDFLAGS+=-p
|
|
CFLAGS+=-p
|
|
endif
|
|
|
|
OBJS= main.o syscall.o strace.o mmap.o signal.o path.o thunk.o \
|
|
elfload.o linuxload.o uaccess.o
|
|
LIBS+= $(AIOLIBS)
|
|
ifdef TARGET_HAS_BFLT
|
|
OBJS+= flatload.o
|
|
endif
|
|
ifdef TARGET_HAS_ELFLOAD32
|
|
OBJS+= elfload32.o
|
|
elfload32.o: elfload.c
|
|
endif
|
|
|
|
ifeq ($(TARGET_ARCH), i386)
|
|
OBJS+= vm86.o
|
|
endif
|
|
ifeq ($(TARGET_ARCH), arm)
|
|
OBJS+=nwfpe/fpa11.o nwfpe/fpa11_cpdo.o \
|
|
nwfpe/fpa11_cpdt.o nwfpe/fpa11_cprt.o nwfpe/fpopcode.o nwfpe/single_cpdo.o \
|
|
nwfpe/double_cpdo.o nwfpe/extended_cpdo.o arm-semi.o
|
|
endif
|
|
ifeq ($(TARGET_ARCH), m68k)
|
|
OBJS+= m68k-sim.o m68k-semi.o
|
|
endif
|
|
|
|
ifdef CONFIG_GDBSTUB
|
|
OBJS+=gdbstub.o gdbstub-xml.o
|
|
endif
|
|
|
|
OBJS+= libqemu.a
|
|
|
|
# Note: this is a workaround. The real fix is to avoid compiling
|
|
# cpu_signal_handler() in cpu-exec.c.
|
|
signal.o: signal.c
|
|
$(CC) $(HELPER_CFLAGS) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
|
|
|
|
$(QEMU_PROG): $(OBJS) ../libqemu_user.a
|
|
$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
|
|
ifeq ($(ARCH),alpha)
|
|
# Mark as 32 bit binary, i. e. it will be mapped into the low 31 bit of
|
|
# the address space (31 bit so sign extending doesn't matter)
|
|
echo -ne '\001\000\000\000' | dd of=qemu bs=1 seek=48 count=4 conv=notrunc
|
|
endif
|
|
|
|
endif #CONFIG_LINUX_USER
|
|
|
|
#########################################################
|
|
# Darwin user emulator target
|
|
|
|
ifdef CONFIG_DARWIN_USER
|
|
|
|
VPATH+=:$(SRC_PATH)/darwin-user
|
|
CPPFLAGS+=-I$(SRC_PATH)/darwin-user -I$(SRC_PATH)/darwin-user/$(TARGET_ARCH)
|
|
|
|
# Leave some space for the regular program loading zone
|
|
LDFLAGS+=-Wl,-segaddr,__STD_PROG_ZONE,0x1000 -image_base 0x0e000000
|
|
|
|
LIBS+=-lmx
|
|
|
|
OBJS= main.o commpage.o machload.o mmap.o signal.o syscall.o thunk.o
|
|
|
|
OBJS+= libqemu.a
|
|
|
|
ifdef CONFIG_GDBSTUB
|
|
OBJS+=gdbstub.o gdbstub-xml.o
|
|
endif
|
|
|
|
# Note: this is a workaround. The real fix is to avoid compiling
|
|
# cpu_signal_handler() in cpu-exec.c.
|
|
signal.o: signal.c
|
|
$(CC) $(HELPER_CFLAGS) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
|
|
|
|
$(QEMU_PROG): $(OBJS)
|
|
$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
|
|
|
|
endif #CONFIG_DARWIN_USER
|
|
|
|
#########################################################
|
|
# BSD user emulator target
|
|
|
|
ifdef CONFIG_BSD_USER
|
|
|
|
VPATH+=:$(SRC_PATH)/bsd-user
|
|
CPPFLAGS+=-I$(SRC_PATH)/bsd-user -I$(SRC_PATH)/bsd-user/$(TARGET_ARCH)
|
|
|
|
ifdef CONFIG_STATIC
|
|
LDFLAGS+=-static
|
|
endif
|
|
|
|
ifeq ($(ARCH),i386)
|
|
ifdef TARGET_GPROF
|
|
USE_I386_LD=y
|
|
endif
|
|
ifdef CONFIG_STATIC
|
|
USE_I386_LD=y
|
|
endif
|
|
ifdef USE_I386_LD
|
|
LDFLAGS+=-Wl,-T,$(SRC_PATH)/$(ARCH).ld
|
|
else
|
|
# WARNING: this LDFLAGS is _very_ tricky : qemu is an ELF shared object
|
|
# that the kernel ELF loader considers as an executable. I think this
|
|
# is the simplest way to make it self virtualizable!
|
|
LDFLAGS+=-Wl,-shared
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(ARCH),x86_64)
|
|
LDFLAGS+=-Wl,-T,$(SRC_PATH)/$(ARCH).ld
|
|
endif
|
|
|
|
ifeq ($(ARCH),ppc)
|
|
LDFLAGS+=-Wl,-T,$(SRC_PATH)/$(ARCH).ld
|
|
endif
|
|
|
|
ifeq ($(ARCH),ppc64)
|
|
LDFLAGS+=-Wl,-T,$(SRC_PATH)/$(ARCH).ld
|
|
endif
|
|
|
|
ifeq ($(ARCH),s390)
|
|
LDFLAGS+=-Wl,-T,$(SRC_PATH)/$(ARCH).ld
|
|
endif
|
|
|
|
ifeq ($(ARCH),sparc)
|
|
# -static is used to avoid g1/g3 usage by the dynamic linker
|
|
LDFLAGS+=-Wl,-T,$(SRC_PATH)/$(ARCH).ld -static
|
|
endif
|
|
|
|
ifeq ($(ARCH),sparc64)
|
|
LDFLAGS+=-Wl,-T,$(SRC_PATH)/$(ARCH).ld
|
|
endif
|
|
|
|
ifeq ($(ARCH),alpha)
|
|
LDFLAGS+=-Wl,-T,$(SRC_PATH)/$(ARCH).ld
|
|
endif
|
|
|
|
ifeq ($(ARCH),ia64)
|
|
LDFLAGS+=-Wl,-G0 -Wl,-T,$(SRC_PATH)/$(ARCH).ld
|
|
endif
|
|
|
|
ifeq ($(ARCH),arm)
|
|
LDFLAGS+=-Wl,-T,$(SRC_PATH)/$(ARCH).ld
|
|
endif
|
|
|
|
ifeq ($(ARCH),m68k)
|
|
LDFLAGS+=-Wl,-T,$(SRC_PATH)/$(ARCH).ld
|
|
endif
|
|
|
|
ifeq ($(ARCH),mips)
|
|
ifeq ($(WORDS_BIGENDIAN),yes)
|
|
LDFLAGS+=-Wl,-T,$(SRC_PATH)/$(ARCH).ld
|
|
else
|
|
LDFLAGS+=-Wl,-T,$(SRC_PATH)/$(ARCH)el.ld
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(ARCH),mips64)
|
|
ifeq ($(WORDS_BIGENDIAN),yes)
|
|
LDFLAGS+=-Wl,-T,$(SRC_PATH)/$(ARCH).ld
|
|
else
|
|
LDFLAGS+=-Wl,-T,$(SRC_PATH)/$(ARCH)el.ld
|
|
endif
|
|
endif
|
|
|
|
OBJS= main.o bsdload.o elfload.o mmap.o path.o signal.o strace.o syscall.o
|
|
OBJS+= uaccess.o
|
|
|
|
OBJS+= libqemu.a
|
|
|
|
ifdef CONFIG_GDBSTUB
|
|
OBJS+=gdbstub.o
|
|
endif
|
|
|
|
# Note: this is a workaround. The real fix is to avoid compiling
|
|
# cpu_signal_handler() in cpu-exec.c.
|
|
signal.o: signal.c
|
|
$(CC) $(HELPER_CFLAGS) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
|
|
|
|
$(QEMU_PROG): $(OBJS) ../libqemu_user.a
|
|
$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
|
|
|
|
endif #CONFIG_BSD_USER
|
|
|
|
#########################################################
|
|
# System emulator target
|
|
ifndef CONFIG_USER_ONLY
|
|
|
|
OBJS=vl.o osdep.o monitor.o pci.o loader.o isa_mmio.o machine.o
|
|
OBJS+=fw_cfg.o
|
|
ifdef CONFIG_KVM
|
|
OBJS+=kvm.o kvm-all.o
|
|
endif
|
|
ifdef CONFIG_WIN32
|
|
OBJS+=block-raw-win32.o
|
|
else
|
|
ifdef CONFIG_AIO
|
|
OBJS+=posix-aio-compat.o
|
|
endif
|
|
OBJS+=block-raw-posix.o
|
|
endif
|
|
|
|
LIBS+=-lz
|
|
ifdef CONFIG_ALSA
|
|
LIBS += -lasound
|
|
endif
|
|
ifdef CONFIG_ESD
|
|
LIBS += -lesd
|
|
endif
|
|
ifdef CONFIG_PA
|
|
LIBS += -lpulse-simple
|
|
endif
|
|
ifdef CONFIG_DSOUND
|
|
LIBS += -lole32 -ldxguid
|
|
endif
|
|
ifdef CONFIG_FMOD
|
|
LIBS += $(CONFIG_FMOD_LIB)
|
|
endif
|
|
ifdef CONFIG_OSS
|
|
LIBS += $(CONFIG_OSS_LIB)
|
|
endif
|
|
|
|
SOUND_HW = sb16.o es1370.o
|
|
ifdef CONFIG_AC97
|
|
SOUND_HW += ac97.o
|
|
endif
|
|
ifdef CONFIG_ADLIB
|
|
SOUND_HW += fmopl.o adlib.o
|
|
adlib.o fmopl.o: CFLAGS := ${CFLAGS} -DBUILD_Y8950=0
|
|
endif
|
|
ifdef CONFIG_GUS
|
|
SOUND_HW += gus.o gusemu_hal.o gusemu_mixer.o
|
|
endif
|
|
ifdef CONFIG_CS4231A
|
|
SOUND_HW += cs4231a.o
|
|
endif
|
|
|
|
ifdef CONFIG_VNC_TLS
|
|
CPPFLAGS += $(CONFIG_VNC_TLS_CFLAGS)
|
|
LIBS += $(CONFIG_VNC_TLS_LIBS)
|
|
endif
|
|
|
|
ifdef CONFIG_BLUEZ
|
|
LIBS += $(CONFIG_BLUEZ_LIBS)
|
|
endif
|
|
|
|
# SCSI layer
|
|
OBJS+= lsi53c895a.o esp.o
|
|
|
|
# USB layer
|
|
OBJS+= usb-ohci.o
|
|
|
|
# EEPROM emulation
|
|
OBJS += eeprom93xx.o
|
|
|
|
# PCI network cards
|
|
OBJS += eepro100.o
|
|
OBJS += ne2000.o
|
|
OBJS += pcnet.o
|
|
OBJS += rtl8139.o
|
|
OBJS += e1000.o
|
|
|
|
ifeq ($(TARGET_BASE_ARCH), i386)
|
|
# Hardware support
|
|
OBJS+= ide.o pckbd.o ps2.o vga.o $(SOUND_HW) dma.o
|
|
OBJS+= fdc.o mc146818rtc.o serial.o i8259.o i8254.o pcspk.o pc.o
|
|
OBJS+= cirrus_vga.o apic.o parallel.o acpi.o piix_pci.o
|
|
OBJS+= usb-uhci.o vmmouse.o vmport.o vmware_vga.o
|
|
# virtio support
|
|
OBJS+= virtio.o virtio-blk.o virtio-balloon.o
|
|
CPPFLAGS += -DHAS_AUDIO -DHAS_AUDIO_CHOICE
|
|
endif
|
|
ifeq ($(TARGET_BASE_ARCH), ppc)
|
|
CPPFLAGS += -DHAS_AUDIO -DHAS_AUDIO_CHOICE
|
|
# shared objects
|
|
OBJS+= ppc.o ide.o vga.o $(SOUND_HW) dma.o openpic.o
|
|
# PREP target
|
|
OBJS+= pckbd.o ps2.o serial.o i8259.o i8254.o fdc.o m48t59.o mc146818rtc.o
|
|
OBJS+= prep_pci.o ppc_prep.o
|
|
# Mac shared devices
|
|
OBJS+= macio.o cuda.o adb.o mac_nvram.o mac_dbdma.o
|
|
# OldWorld PowerMac
|
|
OBJS+= heathrow_pic.o grackle_pci.o ppc_oldworld.o
|
|
# NewWorld PowerMac
|
|
OBJS+= unin_pci.o ppc_chrp.o
|
|
# PowerPC 4xx boards
|
|
OBJS+= pflash_cfi02.o ppc4xx_devs.o ppc4xx_pci.o ppc405_uc.o ppc405_boards.o
|
|
# virtio support
|
|
OBJS+= virtio.o virtio-blk.o virtio-balloon.o
|
|
endif
|
|
ifeq ($(TARGET_BASE_ARCH), mips)
|
|
OBJS+= mips_r4k.o mips_jazz.o mips_malta.o mips_mipssim.o
|
|
OBJS+= mips_timer.o mips_int.o dma.o vga.o serial.o i8254.o i8259.o rc4030.o
|
|
OBJS+= g364fb.o jazz_led.o
|
|
OBJS+= ide.o gt64xxx.o pckbd.o ps2.o fdc.o mc146818rtc.o usb-uhci.o acpi.o ds1225y.o
|
|
OBJS+= piix_pci.o parallel.o cirrus_vga.o pcspk.o $(SOUND_HW)
|
|
OBJS+= mipsnet.o
|
|
OBJS+= pflash_cfi01.o
|
|
CPPFLAGS += -DHAS_AUDIO -DHAS_AUDIO_CHOICE
|
|
endif
|
|
ifeq ($(TARGET_BASE_ARCH), cris)
|
|
OBJS+= etraxfs.o
|
|
OBJS+= etraxfs_dma.o
|
|
OBJS+= etraxfs_pic.o
|
|
OBJS+= etraxfs_eth.o
|
|
OBJS+= etraxfs_timer.o
|
|
OBJS+= etraxfs_ser.o
|
|
|
|
OBJS+= ptimer.o
|
|
OBJS+= pflash_cfi02.o
|
|
endif
|
|
ifeq ($(TARGET_BASE_ARCH), sparc)
|
|
ifeq ($(TARGET_ARCH), sparc64)
|
|
OBJS+= sun4u.o ide.o pckbd.o ps2.o vga.o apb_pci.o
|
|
OBJS+= fdc.o mc146818rtc.o serial.o m48t59.o
|
|
OBJS+= cirrus_vga.o parallel.o ptimer.o
|
|
else
|
|
OBJS+= sun4m.o tcx.o pcnet.o iommu.o m48t59.o slavio_intctl.o
|
|
OBJS+= slavio_timer.o slavio_serial.o slavio_misc.o fdc.o sparc32_dma.o
|
|
OBJS+= cs4231.o ptimer.o eccmemctl.o sbi.o sun4c_intctl.o
|
|
endif
|
|
endif
|
|
ifeq ($(TARGET_BASE_ARCH), arm)
|
|
OBJS+= integratorcp.o versatilepb.o ps2.o smc91c111.o arm_pic.o arm_timer.o
|
|
OBJS+= arm_boot.o pl011.o pl031.o pl050.o pl080.o pl110.o pl181.o pl190.o
|
|
OBJS+= versatile_pci.o ptimer.o
|
|
OBJS+= realview_gic.o realview.o arm_sysctl.o mpcore.o
|
|
OBJS+= armv7m.o armv7m_nvic.o stellaris.o pl022.o stellaris_enet.o
|
|
OBJS+= pl061.o
|
|
OBJS+= arm-semi.o
|
|
OBJS+= pxa2xx.o pxa2xx_pic.o pxa2xx_gpio.o pxa2xx_timer.o pxa2xx_dma.o
|
|
OBJS+= pxa2xx_lcd.o pxa2xx_mmci.o pxa2xx_pcmcia.o pxa2xx_keypad.o
|
|
OBJS+= pflash_cfi01.o gumstix.o
|
|
OBJS+= zaurus.o ide.o serial.o nand.o ecc.o spitz.o tosa.o tc6393xb.o
|
|
OBJS+= omap1.o omap_lcdc.o omap_dma.o omap_clk.o omap_mmc.o omap_i2c.o
|
|
OBJS+= omap2.o omap_dss.o soc_dma.o
|
|
OBJS+= palm.o tsc210x.o
|
|
OBJS+= nseries.o blizzard.o onenand.o vga.o cbus.o tusb6010.o usb-musb.o
|
|
OBJS+= tsc2005.o bt-hci-csr.o
|
|
OBJS+= mst_fpga.o mainstone.o
|
|
OBJS+= musicpal.o pflash_cfi02.o
|
|
CPPFLAGS += -DHAS_AUDIO
|
|
endif
|
|
ifeq ($(TARGET_BASE_ARCH), sh4)
|
|
OBJS+= shix.o r2d.o sh7750.o sh7750_regnames.o tc58128.o
|
|
OBJS+= sh_timer.o ptimer.o sh_serial.o sh_intc.o sh_pci.o sm501.o serial.o
|
|
OBJS+= ide.o
|
|
endif
|
|
ifeq ($(TARGET_BASE_ARCH), m68k)
|
|
OBJS+= an5206.o mcf5206.o ptimer.o mcf_uart.o mcf_intc.o mcf5208.o mcf_fec.o
|
|
OBJS+= m68k-semi.o dummy_m68k.o
|
|
endif
|
|
ifdef CONFIG_GDBSTUB
|
|
OBJS+=gdbstub.o gdbstub-xml.o
|
|
endif
|
|
ifdef CONFIG_COCOA
|
|
COCOA_LIBS=-F/System/Library/Frameworks -framework Cocoa -framework IOKit
|
|
ifdef CONFIG_COREAUDIO
|
|
COCOA_LIBS+=-framework CoreAudio
|
|
endif
|
|
endif
|
|
ifdef CONFIG_SLIRP
|
|
CPPFLAGS+=-I$(SRC_PATH)/slirp
|
|
endif
|
|
|
|
LIBS+=$(AIOLIBS)
|
|
# specific flags are needed for non soft mmu emulator
|
|
ifdef CONFIG_STATIC
|
|
LDFLAGS+=-static
|
|
endif
|
|
ifndef CONFIG_DARWIN
|
|
ifndef CONFIG_WIN32
|
|
ifndef CONFIG_SOLARIS
|
|
ifndef CONFIG_AIX
|
|
LIBS+=-lutil
|
|
endif
|
|
endif
|
|
endif
|
|
endif
|
|
ifdef TARGET_GPROF
|
|
vl.o: CFLAGS+=-p
|
|
LDFLAGS+=-p
|
|
endif
|
|
|
|
ifeq ($(ARCH),ia64)
|
|
LDFLAGS+=-Wl,-G0 -Wl,-T,$(SRC_PATH)/ia64.ld
|
|
endif
|
|
|
|
ifdef CONFIG_WIN32
|
|
SDL_LIBS := $(filter-out -mwindows, $(SDL_LIBS)) -mconsole
|
|
endif
|
|
|
|
# profiling code
|
|
ifdef TARGET_GPROF
|
|
LDFLAGS+=-p
|
|
main.o: CFLAGS+=-p
|
|
endif
|
|
|
|
$(QEMU_PROG): $(OBJS) ../libqemu_common.a libqemu.a
|
|
$(CC) $(LDFLAGS) -o $@ $^ $(LIBS) $(SDL_LIBS) $(COCOA_LIBS) $(CURSES_LIBS) $(BRLAPI_LIBS) $(VDE_LIBS)
|
|
|
|
endif # !CONFIG_USER_ONLY
|
|
|
|
gdbstub-xml.c: $(TARGET_XML_FILES) feature_to_c.sh
|
|
rm -f $@
|
|
ifeq ($(TARGET_XML_FILES),)
|
|
echo > $@
|
|
else
|
|
$(SHELL) $(SRC_PATH)/feature_to_c.sh $@ $(TARGET_XML_FILES)
|
|
endif
|
|
|
|
%.o: %.c
|
|
$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
|
|
|
|
%.o: %.S
|
|
$(CC) $(CPPFLAGS) -c -o $@ $<
|
|
|
|
clean:
|
|
rm -f *.o *.a *~ $(PROGS) nwfpe/*.o fpu/*.o
|
|
rm -f *.d */*.d tcg/*.o
|
|
|
|
install: all
|
|
ifneq ($(PROGS),)
|
|
$(INSTALL) -m 755 -s $(PROGS) "$(DESTDIR)$(bindir)"
|
|
endif
|
|
|
|
# Include automatically generated dependency files
|
|
-include $(wildcard *.d */*.d)
|