From de83cd02e0124536e05e6ad1fd5e4dc783156dab Mon Sep 17 00:00:00 2001 From: bellard Date: Sun, 15 Jun 2003 20:25:43 +0000 Subject: [PATCH] arm emulation support git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@246 c046a42c-6fe2-441c-8c8c-71466251a162 --- Changelog | 5 ++++ Makefile | 76 +++++++++++++++++++++++++++++++++++++---------------- VERSION | 2 +- configure | 39 ++++++++++++++++++++++++++- translate.c | 2 +- 5 files changed, 98 insertions(+), 26 deletions(-) diff --git a/Changelog b/Changelog index 013555e843..df93b28059 100644 --- a/Changelog +++ b/Changelog @@ -1,7 +1,12 @@ version 0.3: + + - initial support for ARM emulation - added fnsave, frstor, fnstenv, fldenv FPU instructions - added FPU register save in signal emulation - ARM port + - Sparc and Alpha ports work on the regression test + - generic ioctl number conversion + - fixed ioctl type conversion version 0.2: diff --git a/Makefile b/Makefile index 12cba2927a..df17f599a8 100644 --- a/Makefile +++ b/Makefile @@ -86,24 +86,38 @@ LDFLAGS+=-p main.o: CFLAGS+=-p endif -OBJS= elfload.o main.o syscall.o mmap.o signal.o vm86.o path.o +OBJS= elfload.o main.o syscall.o mmap.o signal.o path.o +ifeq ($(TARGET_ARCH), i386) +OBJS+= vm86.o +endif SRCS:= $(OBJS:.o=.c) OBJS+= libqemu.a -LIBOBJS+=thunk.o translate-i386.o op-i386.o helper-i386.o exec-i386.o exec.o +# cpu emulator library +LIBOBJS=thunk.o exec.o translate.o cpu-exec.o + +ifeq ($(TARGET_ARCH), i386) +LIBOBJS+=translate-i386.o op-i386.o helper-i386.o +endif +ifeq ($(TARGET_ARCH), arm) +LIBOBJS+=translate-arm.o op-arm.o +endif # NOTE: the disassembler code is only needed for debugging -LIBOBJS+=disas.o i386-dis.o -ifeq ($(ARCH),alpha) +LIBOBJS+=disas.o +ifeq ($(findstring i386, $(TARGET_ARCH) $(ARCH)),i386) +LIBOBJS+=i386-dis.o +endif +ifeq ($(findstring alpha, $(TARGET_ARCH) $(ARCH)),alpha) LIBOBJS+=alpha-dis.o endif -ifeq ($(ARCH),ppc) +ifeq ($(findstring ppc, $(TARGET_ARCH) $(ARCH)),ppc) LIBOBJS+=ppc-dis.o endif -ifeq ($(ARCH),sparc) +ifeq ($(findstring sparc, $(TARGET_ARCH) $(ARCH)),sparc) LIBOBJS+=sparc-dis.o endif -ifeq ($(ARCH),arm) +ifeq ($(findstring arm, $(TARGET_ARCH) $(ARCH)),arm) LIBOBJS+=arm-dis.o endif @@ -133,20 +147,29 @@ libqemu.a: $(LIBOBJS) dyngen: dyngen.c $(HOST_CC) -O2 -Wall -g $< -o $@ -translate-i386.o: translate-i386.c op-i386.h opc-i386.h cpu-i386.h +translate-$(TARGET_ARCH).o: translate-$(TARGET_ARCH).c gen-op-$(TARGET_ARCH).h opc-$(TARGET_ARCH).h cpu-$(TARGET_ARCH).h -op-i386.h: op-i386.o dyngen +translate.o: translate.c op-$(TARGET_ARCH).h opc-$(TARGET_ARCH).h cpu-$(TARGET_ARCH).h + +op-$(TARGET_ARCH).h: op-$(TARGET_ARCH).o dyngen ./dyngen -o $@ $< -opc-i386.h: op-i386.o dyngen +opc-$(TARGET_ARCH).h: op-$(TARGET_ARCH).o dyngen ./dyngen -c -o $@ $< -op-i386.o: op-i386.c opreg_template.h ops_template.h +gen-op-$(TARGET_ARCH).h: op-$(TARGET_ARCH).o dyngen + ./dyngen -g -o $@ $< + +op-$(TARGET_ARCH).o: op-$(TARGET_ARCH).c $(CC) $(OP_CFLAGS) $(DEFINES) -c -o $@ $< -helper-i386.o: helper-i386.c +helper-$(TARGET_ARCH).o: helper-$(TARGET_ARCH).c $(CC) $(HELPER_CFLAGS) $(DEFINES) -c -o $@ $< +op-i386.o: op-i386.c opreg_template.h ops_template.h + +op-arm.o: op-arm.c op-arm-template.h + %.o: %.c $(CC) $(CFLAGS) $(DEFINES) -c -o $@ $< @@ -173,17 +196,24 @@ qemu-doc.html: qemu-doc.texi FILES= \ README README.distrib COPYING COPYING.LIB TODO Changelog VERSION \ -dyngen.c dyngen.h ioctls.h ops_template.h op_string.h syscall_types.h\ -Makefile elf.h thunk.c\ -elfload.c main.c signal.c thunk.h exec.h\ -cpu-i386.h qemu.h op-i386.c helper-i386.c syscall-i386.h translate-i386.c\ -syscall.c opreg_template.h syscall_defs.h vm86.c\ -dis-asm.h disas.c disas.h alpha-dis.c ppc-dis.c i386-dis.c sparc-dis.c arm-dis.c\ -ppc.ld alpha.ld s390.ld sparc.ld arm.ld exec-i386.h exec-i386.c path.c exec.c mmap.c configure \ -tests/Makefile\ -tests/test-i386.c tests/test-i386-shift.h tests/test-i386.h\ -tests/test-i386-muldiv.h tests/test-i386-code16.S\ -tests/hello.c tests/hello tests/sha1.c \ +configure \ +dyngen.c dyngen.h dyngen-exec.h ioctls.h syscall_types.h \ +Makefile elf.h elfload.c main.c signal.c qemu.h \ +syscall.c syscall_defs.h vm86.c path.c mmap.c \ +ppc.ld alpha.ld s390.ld sparc.ld arm.ld\ +thunk.c cpu-exec.c translate.c cpu-all.h thunk.h exec.h\ +exec.c cpu-exec.c\ +cpu-i386.h op-i386.c helper-i386.c syscall-i386.h translate-i386.c \ +exec-i386.h ops_template.h op_string.h opreg_template.h \ +cpu-arm.h syscall-arm.h exec-arm.h op-arm.c translate-arm.c op-arm-template.h \ +dis-asm.h disas.c disas.h alpha-dis.c ppc-dis.c i386-dis.c sparc-dis.c \ +arm-dis.c \ +tests/Makefile \ +tests/test-i386.c tests/test-i386-shift.h tests/test-i386.h \ +tests/test-i386-muldiv.h tests/test-i386-code16.S tests/test-i386-vm86.S \ +tests/hello.c tests/hello \ +tests/hello-arm.c tests/hello-arm \ +tests/sha1.c \ tests/testsig.c tests/testclone.c tests/testthread.c \ tests/runcom.c tests/pi_10.com \ tests/test_path.c \ diff --git a/VERSION b/VERSION index 2f4536184b..1d71ef9744 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.2 \ No newline at end of file +0.3 \ No newline at end of file diff --git a/configure b/configure index 9a7a5f9088..b09487de93 100755 --- a/configure +++ b/configure @@ -28,6 +28,7 @@ ar="ar" make="make" strip="strip" target_cpu="x86" +target_bigendian="default" cpu=`uname -m` case "$cpu" in i386|i486|i586|i686|i86pc|BePC) @@ -103,6 +104,12 @@ for opt do ;; --cpu=*) cpu=`echo $opt | cut -d '=' -f 2` ;; + --target-cpu=*) target_cpu=`echo $opt | cut -d '=' -f 2` + ;; + --target-big-endian) target_bigendian="yes" + ;; + --target-little-endian) target_bigendian="no" + ;; --enable-gprof) gprof="yes" ;; --static) static="yes" @@ -162,6 +169,16 @@ if $cc -o $TMPO $TMPC 2> /dev/null ; then gcc_major="3" fi +if test "$target_bigendian" = "default" ; then + if test "$target_cpu" = "x86" ; then + target_bigendian="no" + elif test "$target_cpu" = "arm" ; then + target_bigendian="no" + else + target_bigendian="no" + fi +fi + if test x"$1" = x"-h" -o x"$1" = x"--help" ; then cat << EOF @@ -173,6 +190,7 @@ echo "Standard options:" echo " --help print this message" echo " --prefix=PREFIX install in PREFIX [$prefix]" echo " --interp-prefix=PREFIX where to find shared libraries, etc. [$interp_prefix]" +echo " --target_cpu=CPU set target cpu (x86 or arm) [$target_cpu]" echo "" echo "Advanced options (experts only):" echo " --source-path=PATH path of source code [$source_path]" @@ -191,8 +209,9 @@ echo "ELF interp prefix $interp_prefix" echo "C compiler $cc" echo "make $make" echo "host CPU $cpu" -echo "Big Endian $bigendian" +echo "host big endian $bigendian" echo "target CPU $target_cpu" +echo "target big endian $target_bigendian" echo "gprof enabled $gprof" echo "static build $static" @@ -246,6 +265,24 @@ if test "$bigendian" = "yes" ; then echo "WORDS_BIGENDIAN=yes" >> config.mak echo "#define WORDS_BIGENDIAN 1" >> $TMPH fi + +if test "$target_cpu" = "x86" ; then + echo "TARGET_ARCH=i386" >> config.mak + echo "#define TARGET_ARCH \"i386\"" >> $TMPH + echo "#define TARGET_I386 1" >> $TMPH +elif test "$target_cpu" = "arm" ; then + echo "TARGET_ARCH=arm" >> config.mak + echo "#define TARGET_ARCH \"arm\"" >> $TMPH + echo "#define TARGET_ARM 1" >> $TMPH +else + echo "Unsupported target CPU" + exit 1 +fi +if test "$target_bigendian" = "yes" ; then + echo "TARGET_WORDS_BIGENDIAN=yes" >> config.mak + echo "#define TARGET_WORDS_BIGENDIAN 1" >> $TMPH +fi + if test "$gprof" = "yes" ; then echo "TARGET_GPROF=yes" >> config.mak echo "#define HAVE_GPROF 1" >> $TMPH diff --git a/translate.c b/translate.c index 6ed6f190b7..1309d17c5c 100644 --- a/translate.c +++ b/translate.c @@ -123,7 +123,7 @@ int cpu_gen_code(TranslationBlock *tb, static const unsigned short opc_copy_size[] = { #define DEF(s, n, copy_size) copy_size, -#include "opc-i386.h" +#include "opc-" TARGET_ARCH ".h" #undef DEF };