From fa12120d752562365ac01db317a641a1c93961c6 Mon Sep 17 00:00:00 2001 From: Nguyen Anh Quynh Date: Sat, 21 Jan 2017 11:02:17 +0800 Subject: [PATCH 01/31] termios.h & strings.h are not needed --- qemu/include/qemu-common.h | 2 -- qemu/util/oslib-posix.c | 1 - 2 files changed, 3 deletions(-) diff --git a/qemu/include/qemu-common.h b/qemu/include/qemu-common.h index 8ddddb40..8100e852 100644 --- a/qemu/include/qemu-common.h +++ b/qemu/include/qemu-common.h @@ -29,7 +29,6 @@ #include #include #include -#include #include #include #include @@ -40,7 +39,6 @@ #include #include #include -#include #include "glib_compat.h" #ifdef _WIN32 diff --git a/qemu/util/oslib-posix.c b/qemu/util/oslib-posix.c index 47b73495..3328a18f 100644 --- a/qemu/util/oslib-posix.c +++ b/qemu/util/oslib-posix.c @@ -39,7 +39,6 @@ #endif #define HUGETLBFS_MAGIC 0x958458f6 -#include #include #include "config-host.h" From 647c97ddc399041b7e690221ba0479ec6e275161 Mon Sep 17 00:00:00 2001 From: Nguyen Anh Quynh Date: Sat, 21 Jan 2017 11:10:48 +0800 Subject: [PATCH 02/31] ffs() is redundant --- qemu/include/sysemu/os-win32.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/qemu/include/sysemu/os-win32.h b/qemu/include/sysemu/os-win32.h index 4b391305..44fd8b9b 100644 --- a/qemu/include/sysemu/os-win32.h +++ b/qemu/include/sysemu/os-win32.h @@ -72,9 +72,6 @@ #define sigsetjmp(env, savemask) setjmp(env) #define siglongjmp(env, val) longjmp(env, val) -/* Declaration of ffs() is missing in MinGW's strings.h. */ -int ffs(int i); - size_t getpagesize(void); #if !defined(EPROTONOSUPPORT) From 45717c61bab9509b2b41b4bc942f54818f11358a Mon Sep 17 00:00:00 2001 From: Nguyen Anh Quynh Date: Sat, 21 Jan 2017 14:53:33 +0800 Subject: [PATCH 03/31] cleanup qemu/util/qemu-timer-common.c --- qemu/include/qemu/timer.h | 2 -- qemu/util/qemu-timer-common.c | 17 ----------------- 2 files changed, 19 deletions(-) diff --git a/qemu/include/qemu/timer.h b/qemu/include/qemu/timer.h index 6772165b..644a5bc0 100644 --- a/qemu/include/qemu/timer.h +++ b/qemu/include/qemu/timer.h @@ -181,8 +181,6 @@ static inline int64_t get_clock(void) #else -extern int use_rt_clock; - static inline int64_t get_clock(void) { return get_clock_realtime(); diff --git a/qemu/util/qemu-timer-common.c b/qemu/util/qemu-timer-common.c index 95e0847c..9c83bcf2 100644 --- a/qemu/util/qemu-timer-common.c +++ b/qemu/util/qemu-timer-common.c @@ -41,21 +41,4 @@ static void __attribute__((constructor)) init_get_clock(void) } clock_freq = freq.QuadPart; } - -#else - -int use_rt_clock; - -static void __attribute__((constructor)) init_get_clock(void) -{ - use_rt_clock = 0; -#ifdef CLOCK_MONOTONIC - { - struct timespec ts; - if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) { - use_rt_clock = 1; - } - } -#endif -} #endif From 2a1b9d8e1b6066090647726d3009c78407ff7f7d Mon Sep 17 00:00:00 2001 From: Nguyen Anh Quynh Date: Sat, 21 Jan 2017 21:50:12 +0800 Subject: [PATCH 04/31] cleanup qemu/Makefile.objs --- qemu/Makefile.objs | 3 --- 1 file changed, 3 deletions(-) diff --git a/qemu/Makefile.objs b/qemu/Makefile.objs index d3091e39..e8d4dfa5 100644 --- a/qemu/Makefile.objs +++ b/qemu/Makefile.objs @@ -7,8 +7,6 @@ util-obj-y = util/ qobject/ qapi/ qapi-types.o qapi-visit.o block-obj-y = block-obj-y += ../uc.o ../list.o glib_compat.o -#block-obj-$(CONFIG_POSIX) += aio-posix.o -#block-obj-$(CONFIG_WIN32) += aio-win32.o ####################################################################### # Target independent part of system emulation. The long term path is to @@ -18,7 +16,6 @@ block-obj-y += ../uc.o ../list.o glib_compat.o ifeq ($(CONFIG_SOFTMMU),y) common-obj-y += hw/ common-obj-y += accel.o - common-obj-y += vl.o qemu-timer.o endif From de9083a5329c001395dcabc0425f390dee2f6e73 Mon Sep 17 00:00:00 2001 From: Nguyen Anh Quynh Date: Sat, 21 Jan 2017 22:22:09 +0800 Subject: [PATCH 05/31] test: fix missng pthread functions --- tests/regress/Makefile | 4 ++-- tests/unit/Makefile | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/regress/Makefile b/tests/regress/Makefile index c7da4ec4..67c779df 100644 --- a/tests/regress/Makefile +++ b/tests/regress/Makefile @@ -1,9 +1,9 @@ CFLAGS += -Wall -Werror -I../../include -LDLIBS += -L../../ -lpthread -lm -lunicorn +LDLIBS += -L../../ -lm -lunicorn UNAME_S := $(shell uname -s) ifeq ($(UNAME_S), Linux) -LDLIBS += -lrt +LDLIBS += -lrt -pthread endif EXECUTE_VARS = LD_LIBRARY_PATH=../../cmocka/src:../../ DYLD_LIBRARY_PATH=../../ diff --git a/tests/unit/Makefile b/tests/unit/Makefile index 57b8c038..dba6b210 100644 --- a/tests/unit/Makefile +++ b/tests/unit/Makefile @@ -1,13 +1,13 @@ CFLAGS += -Wall -Werror -Wno-unused-function -g CFLAGS += -L ../../ -I ../../include CFLAGS += -L ../../cmocka/src -I ../../cmocka/include -LDLIBS += -lcmocka -lunicorn UNAME_S := $(shell uname -s) ifeq ($(UNAME_S), Linux) -LDLIBS += -lrt +LDLIBS += -lrt -pthread endif +LDLIBS += -lcmocka -lunicorn EXECUTE_VARS = LD_LIBRARY_PATH=../../cmocka/src:../../ DYLD_LIBRARY_PATH=../../ From 5a1e86d46be3e72adad7451ef6173eadd4c3654e Mon Sep 17 00:00:00 2001 From: Nguyen Anh Quynh Date: Sun, 22 Jan 2017 00:39:21 +0800 Subject: [PATCH 06/31] update Windows DLL dependency --- bindings/python/setup.py | 3 --- bindings/python/unicorn/unicorn.py | 3 --- docs/COMPILE-WINDOWS.md | 6 ------ 3 files changed, 12 deletions(-) diff --git a/bindings/python/setup.py b/bindings/python/setup.py index 9466e0c4..6ea8d2d2 100755 --- a/bindings/python/setup.py +++ b/bindings/python/setup.py @@ -24,9 +24,6 @@ IS_64BITS = platform.architecture()[0] == '64bit' ALL_WINDOWS_DLLS = ( "libwinpthread-1.dll", "libgcc_s_seh-1.dll" if IS_64BITS else "libgcc_s_dw2-1.dll", - "libiconv-2.dll", - "libpcre-1.dll", - "libintl-8.dll", ) # are we building from the repository or from a source distribution? diff --git a/bindings/python/unicorn/unicorn.py b/bindings/python/unicorn/unicorn.py index df13bde3..b1e48d73 100644 --- a/bindings/python/unicorn/unicorn.py +++ b/bindings/python/unicorn/unicorn.py @@ -30,9 +30,6 @@ _all_windows_dlls = ( "libwinpthread-1.dll", "libgcc_s_seh-1.dll", "libgcc_s_dw2-1.dll", - "libiconv-2.dll", - "libpcre-1.dll", - "libintl-8.dll", ) _loaded_windows_dlls = set() diff --git a/docs/COMPILE-WINDOWS.md b/docs/COMPILE-WINDOWS.md index c56d1649..b5cf9a7d 100644 --- a/docs/COMPILE-WINDOWS.md +++ b/docs/COMPILE-WINDOWS.md @@ -98,18 +98,12 @@ To run sample_x86.exe on Windows 32-bit, you need the following files: unicorn.dll %MSYS2%\mingw32\bin\libgcc_s_dw2-1.dll - %MSYS2%\mingw32\bin\libiconv-2.dll - %MSYS2%\mingw32\bin\libintl-8.dll - %MSYS2%\mingw32\bin\libpcre-1.dll %MSYS2%\mingw32\bin\libwinpthread-1.dll To run sample_x86.exe on Windows 64-bit, you need the following files: unicorn.dll %MSYS2%\mingw64\bin\libgcc_s_seh-1.dll - %MSYS2%\mingw64\bin\libiconv-2.dll - %MSYS2%\mingw64\bin\libintl-8.dll - %MSYS2%\mingw64\bin\libpcre-1.dll %MSYS2%\mingw64\bin\libwinpthread-1.dll From d04cc8671d46e7b837f5aa51e3e5a21fc1ab2586 Mon Sep 17 00:00:00 2001 From: Nguyen Anh Quynh Date: Sun, 22 Jan 2017 05:56:37 +0800 Subject: [PATCH 07/31] cleanup qemu/configure --- qemu/configure | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/qemu/configure b/qemu/configure index 7ce325d1..bcd0403f 100755 --- a/qemu/configure +++ b/qemu/configure @@ -168,7 +168,6 @@ mingw32="no" EXESUF="" DSOSUF=".so" LDFLAGS_SHARED="-shared" -confsuffix="/qemu" bsd="no" linux="no" solaris="no" @@ -372,9 +371,6 @@ fi # OS specific -# host *BSD for user mode -HOST_VARIANT_DIR="" - case $targetos in CYGWIN*) linux="yes" @@ -390,22 +386,18 @@ FreeBSD) make="${MAKE-gmake}" # needed for kinfo_getvmmap(3) in libutil.h LIBS="-lutil $LIBS" - HOST_VARIANT_DIR="freebsd" ;; DragonFly) bsd="yes" make="${MAKE-gmake}" - HOST_VARIANT_DIR="dragonfly" ;; NetBSD) bsd="yes" make="${MAKE-gmake}" - HOST_VARIANT_DIR="netbsd" ;; OpenBSD) bsd="yes" make="${MAKE-gmake}" - HOST_VARIANT_DIR="openbsd" ;; Darwin) bsd="yes" @@ -418,7 +410,6 @@ Darwin) # Disable attempts to use ObjectiveC features in os/object.h since they # won't work when we're compiling with gcc as a C compiler. QEMU_CFLAGS="-DOS_OBJECT_USE_OBJC=0 $QEMU_CFLAGS" - HOST_VARIANT_DIR="darwin" ;; SunOS) solaris="yes" @@ -486,7 +477,6 @@ EOF if compile_prog "" "-liberty" ; then LIBS="-liberty $LIBS" fi - confsuffix="" fi werror="" @@ -1269,7 +1259,6 @@ bflt="no" TARGET_ARCH="$target_name" TARGET_BASE_ARCH="" -TARGET_ABI_DIR="" case "$target_name" in i386) @@ -1325,21 +1314,17 @@ case "$target_name" in ;; ppcemb) TARGET_BASE_ARCH=ppc - TARGET_ABI_DIR=ppc ;; ppc64) TARGET_BASE_ARCH=ppc - TARGET_ABI_DIR=ppc ;; ppc64le) TARGET_ARCH=ppc64 TARGET_BASE_ARCH=ppc - TARGET_ABI_DIR=ppc ;; ppc64abi32) TARGET_ARCH=ppc64 TARGET_BASE_ARCH=ppc - TARGET_ABI_DIR=ppc echo "TARGET_ABI32=y" >> $config_target_mak ;; sh4|sh4eb) @@ -1354,7 +1339,6 @@ case "$target_name" in sparc32plus) TARGET_ARCH=sparc64 TARGET_BASE_ARCH=sparc - TARGET_ABI_DIR=sparc echo "TARGET_ABI32=y" >> $config_target_mak ;; s390x) @@ -1383,13 +1367,6 @@ target_arch_name="`upper $TARGET_ARCH`" echo "TARGET_$target_arch_name=y" >> $config_target_mak echo "TARGET_NAME=$target_name" >> $config_target_mak echo "TARGET_BASE_ARCH=$TARGET_BASE_ARCH" >> $config_target_mak -if [ "$TARGET_ABI_DIR" = "" ]; then - TARGET_ABI_DIR=$TARGET_ARCH -fi -echo "TARGET_ABI_DIR=$TARGET_ABI_DIR" >> $config_target_mak -if [ "$HOST_VARIANT_DIR" != "" ]; then - echo "HOST_VARIANT_DIR=$HOST_VARIANT_DIR" >> $config_target_mak -fi if test "$target_bigendian" = "yes" ; then echo "TARGET_WORDS_BIGENDIAN=y" >> $config_target_mak fi @@ -1402,10 +1379,6 @@ fi cflags="" ldflags="" -if test "$tcg_interpreter" = "yes" ; then - echo "CONFIG_TCI_DIS=y" >> $config_target_mak -fi - case "$ARCH" in alpha) # Ensure there's only a single GP From 5de0785a1bf047cac3e100b796fddb95789a018c Mon Sep 17 00:00:00 2001 From: Nguyen Anh Quynh Date: Sun, 22 Jan 2017 23:07:17 +0800 Subject: [PATCH 08/31] cleanup qemu/memory.c --- qemu/aarch64.h | 10 -- qemu/arm.h | 10 -- qemu/header_gen.py | 10 -- qemu/include/exec/memory.h | 71 --------- qemu/m68k.h | 10 -- qemu/memory.c | 286 ------------------------------------- qemu/mips.h | 10 -- qemu/mips64.h | 10 -- qemu/mips64el.h | 10 -- qemu/mipsel.h | 10 -- qemu/powerpc.h | 10 -- qemu/sparc.h | 10 -- qemu/sparc64.h | 10 -- qemu/x86_64.h | 10 -- 14 files changed, 477 deletions(-) diff --git a/qemu/aarch64.h b/qemu/aarch64.h index 0a6ec4fd..6cb47c34 100644 --- a/qemu/aarch64.h +++ b/qemu/aarch64.h @@ -56,7 +56,6 @@ #define addFloatx80Sigs addFloatx80Sigs_aarch64 #define add_qemu_ldst_label add_qemu_ldst_label_aarch64 #define address_space_access_valid address_space_access_valid_aarch64 -#define address_space_add_del_ioeventfds address_space_add_del_ioeventfds_aarch64 #define address_space_destroy address_space_destroy_aarch64 #define address_space_destroy_dispatch address_space_destroy_dispatch_aarch64 #define address_space_get_flatview address_space_get_flatview_aarch64 @@ -70,7 +69,6 @@ #define address_space_translate_for_iotlb address_space_translate_for_iotlb_aarch64 #define address_space_translate_internal address_space_translate_internal_aarch64 #define address_space_unmap address_space_unmap_aarch64 -#define address_space_update_ioeventfds address_space_update_ioeventfds_aarch64 #define address_space_update_topology address_space_update_topology_aarch64 #define address_space_update_topology_pass address_space_update_topology_pass_aarch64 #define address_space_write address_space_write_aarch64 @@ -80,7 +78,6 @@ #define addrrange_intersection addrrange_intersection_aarch64 #define addrrange_intersects addrrange_intersects_aarch64 #define addrrange_make addrrange_make_aarch64 -#define addrrange_shift addrrange_shift_aarch64 #define adjust_endianness adjust_endianness_aarch64 #define all_helpers all_helpers_aarch64 #define alloc_code_gen_buffer alloc_code_gen_buffer_aarch64 @@ -2011,14 +2008,11 @@ #define memory_mapping_list_free memory_mapping_list_free_aarch64 #define memory_mapping_list_init memory_mapping_list_init_aarch64 #define memory_region_access_valid memory_region_access_valid_aarch64 -#define memory_region_add_eventfd memory_region_add_eventfd_aarch64 #define memory_region_add_subregion memory_region_add_subregion_aarch64 #define memory_region_add_subregion_common memory_region_add_subregion_common_aarch64 #define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_aarch64 #define memory_region_big_endian memory_region_big_endian_aarch64 -#define memory_region_clear_coalescing memory_region_clear_coalescing_aarch64 #define memory_region_clear_pending memory_region_clear_pending_aarch64 -#define memory_region_del_eventfd memory_region_del_eventfd_aarch64 #define memory_region_del_subregion memory_region_del_subregion_aarch64 #define memory_region_destructor_alias memory_region_destructor_alias_aarch64 #define memory_region_destructor_none memory_region_destructor_none_aarch64 @@ -2047,8 +2041,6 @@ #define memory_region_init_ram memory_region_init_ram_aarch64 #define memory_region_init_ram_ptr memory_region_init_ram_ptr_aarch64 #define memory_region_init_reservation memory_region_init_reservation_aarch64 -#define memory_region_ioeventfd_before memory_region_ioeventfd_before_aarch64 -#define memory_region_ioeventfd_equal memory_region_ioeventfd_equal_aarch64 #define memory_region_is_iommu memory_region_is_iommu_aarch64 #define memory_region_is_logging memory_region_is_logging_aarch64 #define memory_region_is_mapped memory_region_is_mapped_aarch64 @@ -2078,8 +2070,6 @@ #define memory_region_transaction_begin memory_region_transaction_begin_aarch64 #define memory_region_transaction_commit memory_region_transaction_commit_aarch64 #define memory_region_unref memory_region_unref_aarch64 -#define memory_region_update_coalesced_range memory_region_update_coalesced_range_aarch64 -#define memory_region_update_coalesced_range_as memory_region_update_coalesced_range_as_aarch64 #define memory_region_update_container_subregions memory_region_update_container_subregions_aarch64 #define memory_region_write_accessor memory_region_write_accessor_aarch64 #define memory_region_wrong_endianness memory_region_wrong_endianness_aarch64 diff --git a/qemu/arm.h b/qemu/arm.h index bb29d7b2..5ab27471 100644 --- a/qemu/arm.h +++ b/qemu/arm.h @@ -56,7 +56,6 @@ #define addFloatx80Sigs addFloatx80Sigs_arm #define add_qemu_ldst_label add_qemu_ldst_label_arm #define address_space_access_valid address_space_access_valid_arm -#define address_space_add_del_ioeventfds address_space_add_del_ioeventfds_arm #define address_space_destroy address_space_destroy_arm #define address_space_destroy_dispatch address_space_destroy_dispatch_arm #define address_space_get_flatview address_space_get_flatview_arm @@ -70,7 +69,6 @@ #define address_space_translate_for_iotlb address_space_translate_for_iotlb_arm #define address_space_translate_internal address_space_translate_internal_arm #define address_space_unmap address_space_unmap_arm -#define address_space_update_ioeventfds address_space_update_ioeventfds_arm #define address_space_update_topology address_space_update_topology_arm #define address_space_update_topology_pass address_space_update_topology_pass_arm #define address_space_write address_space_write_arm @@ -80,7 +78,6 @@ #define addrrange_intersection addrrange_intersection_arm #define addrrange_intersects addrrange_intersects_arm #define addrrange_make addrrange_make_arm -#define addrrange_shift addrrange_shift_arm #define adjust_endianness adjust_endianness_arm #define all_helpers all_helpers_arm #define alloc_code_gen_buffer alloc_code_gen_buffer_arm @@ -2011,14 +2008,11 @@ #define memory_mapping_list_free memory_mapping_list_free_arm #define memory_mapping_list_init memory_mapping_list_init_arm #define memory_region_access_valid memory_region_access_valid_arm -#define memory_region_add_eventfd memory_region_add_eventfd_arm #define memory_region_add_subregion memory_region_add_subregion_arm #define memory_region_add_subregion_common memory_region_add_subregion_common_arm #define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_arm #define memory_region_big_endian memory_region_big_endian_arm -#define memory_region_clear_coalescing memory_region_clear_coalescing_arm #define memory_region_clear_pending memory_region_clear_pending_arm -#define memory_region_del_eventfd memory_region_del_eventfd_arm #define memory_region_del_subregion memory_region_del_subregion_arm #define memory_region_destructor_alias memory_region_destructor_alias_arm #define memory_region_destructor_none memory_region_destructor_none_arm @@ -2047,8 +2041,6 @@ #define memory_region_init_ram memory_region_init_ram_arm #define memory_region_init_ram_ptr memory_region_init_ram_ptr_arm #define memory_region_init_reservation memory_region_init_reservation_arm -#define memory_region_ioeventfd_before memory_region_ioeventfd_before_arm -#define memory_region_ioeventfd_equal memory_region_ioeventfd_equal_arm #define memory_region_is_iommu memory_region_is_iommu_arm #define memory_region_is_logging memory_region_is_logging_arm #define memory_region_is_mapped memory_region_is_mapped_arm @@ -2078,8 +2070,6 @@ #define memory_region_transaction_begin memory_region_transaction_begin_arm #define memory_region_transaction_commit memory_region_transaction_commit_arm #define memory_region_unref memory_region_unref_arm -#define memory_region_update_coalesced_range memory_region_update_coalesced_range_arm -#define memory_region_update_coalesced_range_as memory_region_update_coalesced_range_as_arm #define memory_region_update_container_subregions memory_region_update_container_subregions_arm #define memory_region_write_accessor memory_region_write_accessor_arm #define memory_region_wrong_endianness memory_region_wrong_endianness_arm diff --git a/qemu/header_gen.py b/qemu/header_gen.py index 37e20633..0561817d 100644 --- a/qemu/header_gen.py +++ b/qemu/header_gen.py @@ -62,7 +62,6 @@ symbols = ( 'addFloatx80Sigs', 'add_qemu_ldst_label', 'address_space_access_valid', - 'address_space_add_del_ioeventfds', 'address_space_destroy', 'address_space_destroy_dispatch', 'address_space_get_flatview', @@ -76,7 +75,6 @@ symbols = ( 'address_space_translate_for_iotlb', 'address_space_translate_internal', 'address_space_unmap', - 'address_space_update_ioeventfds', 'address_space_update_topology', 'address_space_update_topology_pass', 'address_space_write', @@ -86,7 +84,6 @@ symbols = ( 'addrrange_intersection', 'addrrange_intersects', 'addrrange_make', - 'addrrange_shift', 'adjust_endianness', 'all_helpers', 'alloc_code_gen_buffer', @@ -2017,14 +2014,11 @@ symbols = ( 'memory_mapping_list_free', 'memory_mapping_list_init', 'memory_region_access_valid', - 'memory_region_add_eventfd', 'memory_region_add_subregion', 'memory_region_add_subregion_common', 'memory_region_add_subregion_overlap', 'memory_region_big_endian', - 'memory_region_clear_coalescing', 'memory_region_clear_pending', - 'memory_region_del_eventfd', 'memory_region_del_subregion', 'memory_region_destructor_alias', 'memory_region_destructor_none', @@ -2053,8 +2047,6 @@ symbols = ( 'memory_region_init_ram', 'memory_region_init_ram_ptr', 'memory_region_init_reservation', - 'memory_region_ioeventfd_before', - 'memory_region_ioeventfd_equal', 'memory_region_is_iommu', 'memory_region_is_logging', 'memory_region_is_mapped', @@ -2084,8 +2076,6 @@ symbols = ( 'memory_region_transaction_begin', 'memory_region_transaction_commit', 'memory_region_unref', - 'memory_region_update_coalesced_range', - 'memory_region_update_coalesced_range_as', 'memory_region_update_container_subregions', 'memory_region_write_accessor', 'memory_region_wrong_endianness', diff --git a/qemu/include/exec/memory.h b/qemu/include/exec/memory.h index 2989edc0..08aabf54 100644 --- a/qemu/include/exec/memory.h +++ b/qemu/include/exec/memory.h @@ -129,9 +129,6 @@ struct MemoryRegionIOMMUOps { IOMMUTLBEntry (*translate)(MemoryRegion *iommu, hwaddr addr, bool is_write); }; -typedef struct CoalescedMemoryRange CoalescedMemoryRange; -typedef struct MemoryRegionIoeventfd MemoryRegionIoeventfd; - struct MemoryRegion { Object parent_obj; /* All fields are private - violators will be prosecuted */ @@ -153,18 +150,14 @@ struct MemoryRegion { bool enabled; bool rom_device; bool warning_printed; /* For reservations */ - bool flush_coalesced_mmio; MemoryRegion *alias; hwaddr alias_offset; int32_t priority; bool may_overlap; QTAILQ_HEAD(subregions, MemoryRegion) subregions; QTAILQ_ENTRY(MemoryRegion) subregions_link; - QTAILQ_HEAD(coalesced_ranges, CoalescedMemoryRange) coalesced; const char *name; uint8_t dirty_log_mask; - unsigned ioeventfd_nb; - MemoryRegionIoeventfd *ioeventfds; struct uc_struct *uc; uint32_t perms; //all perms, partially redundant with readonly uint64_t end; @@ -187,14 +180,6 @@ struct MemoryListener { void (*log_sync)(MemoryListener *listener, MemoryRegionSection *section); void (*log_global_start)(MemoryListener *listener); void (*log_global_stop)(MemoryListener *listener); - void (*eventfd_add)(MemoryListener *listener, MemoryRegionSection *section, - bool match_data, uint64_t data, EventNotifier *e); - void (*eventfd_del)(MemoryListener *listener, MemoryRegionSection *section, - bool match_data, uint64_t data, EventNotifier *e); - void (*coalesced_mmio_add)(MemoryListener *listener, MemoryRegionSection *section, - hwaddr addr, hwaddr len); - void (*coalesced_mmio_del)(MemoryListener *listener, MemoryRegionSection *section, - hwaddr addr, hwaddr len); /* Lower = earlier (during add), later (during del) */ unsigned priority; AddressSpace *address_space_filter; @@ -209,8 +194,6 @@ struct AddressSpace { char *name; MemoryRegion *root; struct FlatView *current_map; - int ioeventfd_nb; - struct MemoryRegionIoeventfd *ioeventfds; struct AddressSpaceDispatch *dispatch; struct AddressSpaceDispatch *next_dispatch; MemoryListener dispatch_listener; @@ -555,60 +538,6 @@ void memory_region_set_readonly(MemoryRegion *mr, bool readonly); */ void memory_region_rom_device_set_romd(MemoryRegion *mr, bool romd_mode); -/** - * memory_region_clear_coalescing: Disable MMIO coalescing for the region. - * - * Disables any coalescing caused by memory_region_set_coalescing() or - * memory_region_add_coalescing(). Roughly equivalent to uncacheble memory - * hardware. - * - * @mr: the memory region to be updated. - */ -void memory_region_clear_coalescing(MemoryRegion *mr); - -/** - * memory_region_add_eventfd: Request an eventfd to be triggered when a word - * is written to a location. - * - * Marks a word in an IO region (initialized with memory_region_init_io()) - * as a trigger for an eventfd event. The I/O callback will not be called. - * The caller must be prepared to handle failure (that is, take the required - * action if the callback _is_ called). - * - * @mr: the memory region being updated. - * @addr: the address within @mr that is to be monitored - * @size: the size of the access to trigger the eventfd - * @match_data: whether to match against @data, instead of just @addr - * @data: the data to match against the guest write - * @fd: the eventfd to be triggered when @addr, @size, and @data all match. - **/ -void memory_region_add_eventfd(MemoryRegion *mr, - hwaddr addr, - unsigned size, - bool match_data, - uint64_t data, - EventNotifier *e); - -/** - * memory_region_del_eventfd: Cancel an eventfd. - * - * Cancels an eventfd trigger requested by a previous - * memory_region_add_eventfd() call. - * - * @mr: the memory region being updated. - * @addr: the address within @mr that is to be monitored - * @size: the size of the access to trigger the eventfd - * @match_data: whether to match against @data, instead of just @addr - * @data: the data to match against the guest write - * @fd: the eventfd to be triggered when @addr, @size, and @data all match. - */ -void memory_region_del_eventfd(MemoryRegion *mr, - hwaddr addr, - unsigned size, - bool match_data, - uint64_t data, - EventNotifier *e); - /** * memory_region_add_subregion: Add a subregion to a container. * diff --git a/qemu/m68k.h b/qemu/m68k.h index 8297a9ec..9a265549 100644 --- a/qemu/m68k.h +++ b/qemu/m68k.h @@ -56,7 +56,6 @@ #define addFloatx80Sigs addFloatx80Sigs_m68k #define add_qemu_ldst_label add_qemu_ldst_label_m68k #define address_space_access_valid address_space_access_valid_m68k -#define address_space_add_del_ioeventfds address_space_add_del_ioeventfds_m68k #define address_space_destroy address_space_destroy_m68k #define address_space_destroy_dispatch address_space_destroy_dispatch_m68k #define address_space_get_flatview address_space_get_flatview_m68k @@ -70,7 +69,6 @@ #define address_space_translate_for_iotlb address_space_translate_for_iotlb_m68k #define address_space_translate_internal address_space_translate_internal_m68k #define address_space_unmap address_space_unmap_m68k -#define address_space_update_ioeventfds address_space_update_ioeventfds_m68k #define address_space_update_topology address_space_update_topology_m68k #define address_space_update_topology_pass address_space_update_topology_pass_m68k #define address_space_write address_space_write_m68k @@ -80,7 +78,6 @@ #define addrrange_intersection addrrange_intersection_m68k #define addrrange_intersects addrrange_intersects_m68k #define addrrange_make addrrange_make_m68k -#define addrrange_shift addrrange_shift_m68k #define adjust_endianness adjust_endianness_m68k #define all_helpers all_helpers_m68k #define alloc_code_gen_buffer alloc_code_gen_buffer_m68k @@ -2011,14 +2008,11 @@ #define memory_mapping_list_free memory_mapping_list_free_m68k #define memory_mapping_list_init memory_mapping_list_init_m68k #define memory_region_access_valid memory_region_access_valid_m68k -#define memory_region_add_eventfd memory_region_add_eventfd_m68k #define memory_region_add_subregion memory_region_add_subregion_m68k #define memory_region_add_subregion_common memory_region_add_subregion_common_m68k #define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_m68k #define memory_region_big_endian memory_region_big_endian_m68k -#define memory_region_clear_coalescing memory_region_clear_coalescing_m68k #define memory_region_clear_pending memory_region_clear_pending_m68k -#define memory_region_del_eventfd memory_region_del_eventfd_m68k #define memory_region_del_subregion memory_region_del_subregion_m68k #define memory_region_destructor_alias memory_region_destructor_alias_m68k #define memory_region_destructor_none memory_region_destructor_none_m68k @@ -2047,8 +2041,6 @@ #define memory_region_init_ram memory_region_init_ram_m68k #define memory_region_init_ram_ptr memory_region_init_ram_ptr_m68k #define memory_region_init_reservation memory_region_init_reservation_m68k -#define memory_region_ioeventfd_before memory_region_ioeventfd_before_m68k -#define memory_region_ioeventfd_equal memory_region_ioeventfd_equal_m68k #define memory_region_is_iommu memory_region_is_iommu_m68k #define memory_region_is_logging memory_region_is_logging_m68k #define memory_region_is_mapped memory_region_is_mapped_m68k @@ -2078,8 +2070,6 @@ #define memory_region_transaction_begin memory_region_transaction_begin_m68k #define memory_region_transaction_commit memory_region_transaction_commit_m68k #define memory_region_unref memory_region_unref_m68k -#define memory_region_update_coalesced_range memory_region_update_coalesced_range_m68k -#define memory_region_update_coalesced_range_as memory_region_update_coalesced_range_as_m68k #define memory_region_update_container_subregions memory_region_update_container_subregions_m68k #define memory_region_write_accessor memory_region_write_accessor_m68k #define memory_region_wrong_endianness memory_region_wrong_endianness_m68k diff --git a/qemu/memory.c b/qemu/memory.c index 97c95583..2e5e658a 100644 --- a/qemu/memory.c +++ b/qemu/memory.c @@ -92,7 +92,6 @@ void memory_unmap(struct uc_struct *uc, MemoryRegion *mr) obj = OBJECT(mr); obj->ref = 1; obj->free = g_free; - g_free(mr->ioeventfds); g_free((char *)mr->name); mr->name = NULL; object_property_del_child(mr->uc, qdev_get_machine(mr->uc), obj, &error_abort); @@ -115,7 +114,6 @@ int memory_free(struct uc_struct *uc) obj = OBJECT(mr); obj->ref = 1; obj->free = g_free; - g_free(mr->ioeventfds); object_property_del_child(mr->uc, qdev_get_machine(mr->uc), obj, &error_abort); } @@ -152,12 +150,6 @@ static Int128 addrrange_end(AddrRange r) return int128_add(r.start, r.size); } -static AddrRange addrrange_shift(AddrRange range, Int128 delta) -{ - int128_addto(&range.start, delta); - return range; -} - static bool addrrange_contains(AddrRange range, Int128 addr) { return int128_ge(addr, range.start) @@ -249,55 +241,6 @@ static bool memory_listener_match(MemoryListener *listener, .readonly = (fr)->readonly, \ })) -struct CoalescedMemoryRange { - AddrRange addr; - QTAILQ_ENTRY(CoalescedMemoryRange) link; -}; - -struct MemoryRegionIoeventfd { - AddrRange addr; - bool match_data; - uint64_t data; - EventNotifier *e; -}; - -static bool memory_region_ioeventfd_before(MemoryRegionIoeventfd a, - MemoryRegionIoeventfd b) -{ - if (int128_lt(a.addr.start, b.addr.start)) { - return true; - } else if (int128_gt(a.addr.start, b.addr.start)) { - return false; - } else if (int128_lt(a.addr.size, b.addr.size)) { - return true; - } else if (int128_gt(a.addr.size, b.addr.size)) { - return false; - } else if (a.match_data < b.match_data) { - return true; - } else if (a.match_data > b.match_data) { - return false; - } else if (a.match_data) { - if (a.data < b.data) { - return true; - } else if (a.data > b.data) { - return false; - } - } - if (a.e < b.e) { - return true; - } else if (a.e > b.e) { - return false; - } - return false; -} - -static bool memory_region_ioeventfd_equal(MemoryRegionIoeventfd a, - MemoryRegionIoeventfd b) -{ - return !memory_region_ioeventfd_before(a, b) - && !memory_region_ioeventfd_before(b, a); -} - typedef struct FlatRange FlatRange; typedef struct FlatView FlatView; @@ -664,56 +607,6 @@ static FlatView *generate_memory_topology(MemoryRegion *mr) return view; } -static void address_space_add_del_ioeventfds(AddressSpace *as, - MemoryRegionIoeventfd *fds_new, - unsigned fds_new_nb, - MemoryRegionIoeventfd *fds_old, - unsigned fds_old_nb) -{ - unsigned iold, inew; - MemoryRegionIoeventfd *fd; - MemoryRegionSection section; - struct uc_struct *uc = as->uc; - - /* Generate a symmetric difference of the old and new fd sets, adding - * and deleting as necessary. - */ - - iold = inew = 0; - while (iold < fds_old_nb || inew < fds_new_nb) { - if (iold < fds_old_nb - && (inew == fds_new_nb - || memory_region_ioeventfd_before(fds_old[iold], - fds_new[inew]))) { - fd = &fds_old[iold]; - section = (MemoryRegionSection) { - .address_space = as, - .offset_within_address_space = int128_get64(fd->addr.start), - .size = fd->addr.size, - }; - MEMORY_LISTENER_CALL(eventfd_del, Forward, §ion, - fd->match_data, fd->data, fd->e); - ++iold; - } else if (inew < fds_new_nb - && (iold == fds_old_nb - || memory_region_ioeventfd_before(fds_new[inew], - fds_old[iold]))) { - fd = &fds_new[inew]; - section = (MemoryRegionSection) { - .address_space = as, - .offset_within_address_space = int128_get64(fd->addr.start), - .size = fd->addr.size, - }; - MEMORY_LISTENER_CALL(eventfd_add, Reverse, §ion, - fd->match_data, fd->data, fd->e); - ++inew; - } else { - ++iold; - ++inew; - } - } -} - static FlatView *address_space_get_flatview(AddressSpace *as) { FlatView *view; @@ -723,40 +616,6 @@ static FlatView *address_space_get_flatview(AddressSpace *as) return view; } -static void address_space_update_ioeventfds(AddressSpace *as) -{ - FlatView *view; - FlatRange *fr; - unsigned ioeventfd_nb = 0; - MemoryRegionIoeventfd *ioeventfds = NULL; - AddrRange tmp; - unsigned i; - - view = address_space_get_flatview(as); - FOR_EACH_FLAT_RANGE(fr, view) { - for (i = 0; i < fr->mr->ioeventfd_nb; ++i) { - tmp = addrrange_shift(fr->mr->ioeventfds[i].addr, - int128_sub(fr->addr.start, - int128_make64(fr->offset_in_region))); - if (addrrange_intersects(fr->addr, tmp)) { - ++ioeventfd_nb; - ioeventfds = g_realloc(ioeventfds, - ioeventfd_nb * sizeof(*ioeventfds)); - ioeventfds[ioeventfd_nb-1] = fr->mr->ioeventfds[i]; - ioeventfds[ioeventfd_nb-1].addr = tmp; - } - } - } - - address_space_add_del_ioeventfds(as, ioeventfds, ioeventfd_nb, - as->ioeventfds, as->ioeventfd_nb); - - g_free(as->ioeventfds); - as->ioeventfds = ioeventfds; - as->ioeventfd_nb = ioeventfd_nb; - flatview_unref(view); -} - static void address_space_update_topology_pass(AddressSpace *as, const FlatView *old_view, const FlatView *new_view, @@ -839,8 +698,6 @@ static void address_space_update_topology(AddressSpace *as) * counting is necessary. */ flatview_unref(old_view); - - address_space_update_ioeventfds(as); } void memory_region_transaction_begin(struct uc_struct *uc) @@ -851,7 +708,6 @@ void memory_region_transaction_begin(struct uc_struct *uc) static void memory_region_clear_pending(struct uc_struct *uc) { uc->memory_region_update_pending = false; - uc->ioeventfd_update_pending = false; } void memory_region_transaction_commit(struct uc_struct *uc) @@ -869,10 +725,6 @@ void memory_region_transaction_commit(struct uc_struct *uc) } MEMORY_LISTENER_CALL_GLOBAL(commit, Forward); - } else if (uc->ioeventfd_update_pending) { - QTAILQ_FOREACH(as, &uc->address_spaces, address_spaces_link) { - address_space_update_ioeventfds(as); - } } memory_region_clear_pending(uc); } @@ -1026,7 +878,6 @@ static void memory_region_initfn(struct uc_struct *uc, Object *obj, void *opaque mr->romd_mode = true; mr->destructor = memory_region_destructor_none; QTAILQ_INIT(&mr->subregions); - QTAILQ_INIT(&mr->coalesced); op = object_property_add(OBJECT(mr), "container", "link<" TYPE_MEMORY_REGION ">", @@ -1263,9 +1114,7 @@ static void memory_region_finalize(struct uc_struct *uc, Object *obj, void *opaq assert(QTAILQ_EMPTY(&mr->subregions)); // assert(memory_region_transaction_depth == 0); mr->destructor(mr); - memory_region_clear_coalescing(mr); g_free((char *)mr->name); - g_free(mr->ioeventfds); } void memory_region_ref(MemoryRegion *mr) @@ -1388,138 +1237,6 @@ void *memory_region_get_ram_ptr(MemoryRegion *mr) return qemu_get_ram_ptr(mr->uc, mr->ram_addr & TARGET_PAGE_MASK); } -static void memory_region_update_coalesced_range_as(MemoryRegion *mr, AddressSpace *as) -{ - FlatView *view; - FlatRange *fr; - CoalescedMemoryRange *cmr; - AddrRange tmp; - MemoryRegionSection section; - struct uc_struct *uc = mr->uc; - - view = address_space_get_flatview(as); - FOR_EACH_FLAT_RANGE(fr, view) { - if (fr->mr == mr) { - section = (MemoryRegionSection) { - .address_space = as, - .offset_within_address_space = int128_get64(fr->addr.start), - .size = fr->addr.size, - }; - - MEMORY_LISTENER_CALL(coalesced_mmio_del, Reverse, §ion, - int128_get64(fr->addr.start), - int128_get64(fr->addr.size)); - QTAILQ_FOREACH(cmr, &mr->coalesced, link) { - tmp = addrrange_shift(cmr->addr, - int128_sub(fr->addr.start, - int128_make64(fr->offset_in_region))); - if (!addrrange_intersects(tmp, fr->addr)) { - continue; - } - tmp = addrrange_intersection(tmp, fr->addr); - MEMORY_LISTENER_CALL(coalesced_mmio_add, Forward, §ion, - int128_get64(tmp.start), - int128_get64(tmp.size)); - } - } - } - flatview_unref(view); -} - -static void memory_region_update_coalesced_range(MemoryRegion *mr) -{ - AddressSpace *as; - - QTAILQ_FOREACH(as, &mr->uc->address_spaces, address_spaces_link) { - memory_region_update_coalesced_range_as(mr, as); - } -} - -void memory_region_clear_coalescing(MemoryRegion *mr) -{ - CoalescedMemoryRange *cmr; - bool updated = false; - - mr->flush_coalesced_mmio = false; - - while (!QTAILQ_EMPTY(&mr->coalesced)) { - cmr = QTAILQ_FIRST(&mr->coalesced); - QTAILQ_REMOVE(&mr->coalesced, cmr, link); - g_free(cmr); - updated = true; - } - - if (updated) { - memory_region_update_coalesced_range(mr); - } -} - -void memory_region_add_eventfd(MemoryRegion *mr, - hwaddr addr, - unsigned size, - bool match_data, - uint64_t data, - EventNotifier *e) -{ - MemoryRegionIoeventfd mrfd = { - .addr.start = int128_make64(addr), - .addr.size = int128_make64(size), - .match_data = match_data, - .data = data, - .e = e, - }; - unsigned i; - - adjust_endianness(mr, &mrfd.data, size); - memory_region_transaction_begin(mr->uc); - for (i = 0; i < mr->ioeventfd_nb; ++i) { - if (memory_region_ioeventfd_before(mrfd, mr->ioeventfds[i])) { - break; - } - } - ++mr->ioeventfd_nb; - mr->ioeventfds = g_realloc(mr->ioeventfds, - sizeof(*mr->ioeventfds) * mr->ioeventfd_nb); - memmove(&mr->ioeventfds[i+1], &mr->ioeventfds[i], - sizeof(*mr->ioeventfds) * (mr->ioeventfd_nb-1 - i)); - mr->ioeventfds[i] = mrfd; - mr->uc->ioeventfd_update_pending |= mr->enabled; - memory_region_transaction_commit(mr->uc); -} - -void memory_region_del_eventfd(MemoryRegion *mr, - hwaddr addr, - unsigned size, - bool match_data, - uint64_t data, - EventNotifier *e) -{ - MemoryRegionIoeventfd mrfd = { - .addr.start = int128_make64(addr), - .addr.size = int128_make64(size), - .match_data = match_data, - .data = data, - .e = e, - }; - unsigned i; - - adjust_endianness(mr, &mrfd.data, size); - memory_region_transaction_begin(mr->uc); - for (i = 0; i < mr->ioeventfd_nb; ++i) { - if (memory_region_ioeventfd_equal(mrfd, mr->ioeventfds[i])) { - break; - } - } - assert(i != mr->ioeventfd_nb); - memmove(&mr->ioeventfds[i], &mr->ioeventfds[i+1], - sizeof(*mr->ioeventfds) * (mr->ioeventfd_nb - (i+1))); - --mr->ioeventfd_nb; - mr->ioeventfds = g_realloc(mr->ioeventfds, - sizeof(*mr->ioeventfds)*mr->ioeventfd_nb + 1); - mr->uc->ioeventfd_update_pending |= mr->enabled; - memory_region_transaction_commit(mr->uc); -} - static void memory_region_update_container_subregions(MemoryRegion *subregion) { hwaddr offset = subregion->addr; @@ -1818,8 +1535,6 @@ void address_space_init(struct uc_struct *uc, AddressSpace *as, MemoryRegion *ro as->root = root; as->current_map = g_new(FlatView, 1); flatview_init(as->current_map); - as->ioeventfd_nb = 0; - as->ioeventfds = NULL; QTAILQ_INSERT_TAIL(&uc->address_spaces, as, address_spaces_link); as->name = g_strdup(name ? name : "anonymous"); address_space_init_dispatch(as); @@ -1847,7 +1562,6 @@ void address_space_destroy(AddressSpace *as) flatview_unref(as->current_map); g_free(as->name); - g_free(as->ioeventfds); } bool io_mem_read(MemoryRegion *mr, hwaddr addr, uint64_t *pval, unsigned size) diff --git a/qemu/mips.h b/qemu/mips.h index a0c5727b..57bb375a 100644 --- a/qemu/mips.h +++ b/qemu/mips.h @@ -56,7 +56,6 @@ #define addFloatx80Sigs addFloatx80Sigs_mips #define add_qemu_ldst_label add_qemu_ldst_label_mips #define address_space_access_valid address_space_access_valid_mips -#define address_space_add_del_ioeventfds address_space_add_del_ioeventfds_mips #define address_space_destroy address_space_destroy_mips #define address_space_destroy_dispatch address_space_destroy_dispatch_mips #define address_space_get_flatview address_space_get_flatview_mips @@ -70,7 +69,6 @@ #define address_space_translate_for_iotlb address_space_translate_for_iotlb_mips #define address_space_translate_internal address_space_translate_internal_mips #define address_space_unmap address_space_unmap_mips -#define address_space_update_ioeventfds address_space_update_ioeventfds_mips #define address_space_update_topology address_space_update_topology_mips #define address_space_update_topology_pass address_space_update_topology_pass_mips #define address_space_write address_space_write_mips @@ -80,7 +78,6 @@ #define addrrange_intersection addrrange_intersection_mips #define addrrange_intersects addrrange_intersects_mips #define addrrange_make addrrange_make_mips -#define addrrange_shift addrrange_shift_mips #define adjust_endianness adjust_endianness_mips #define all_helpers all_helpers_mips #define alloc_code_gen_buffer alloc_code_gen_buffer_mips @@ -2011,14 +2008,11 @@ #define memory_mapping_list_free memory_mapping_list_free_mips #define memory_mapping_list_init memory_mapping_list_init_mips #define memory_region_access_valid memory_region_access_valid_mips -#define memory_region_add_eventfd memory_region_add_eventfd_mips #define memory_region_add_subregion memory_region_add_subregion_mips #define memory_region_add_subregion_common memory_region_add_subregion_common_mips #define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_mips #define memory_region_big_endian memory_region_big_endian_mips -#define memory_region_clear_coalescing memory_region_clear_coalescing_mips #define memory_region_clear_pending memory_region_clear_pending_mips -#define memory_region_del_eventfd memory_region_del_eventfd_mips #define memory_region_del_subregion memory_region_del_subregion_mips #define memory_region_destructor_alias memory_region_destructor_alias_mips #define memory_region_destructor_none memory_region_destructor_none_mips @@ -2047,8 +2041,6 @@ #define memory_region_init_ram memory_region_init_ram_mips #define memory_region_init_ram_ptr memory_region_init_ram_ptr_mips #define memory_region_init_reservation memory_region_init_reservation_mips -#define memory_region_ioeventfd_before memory_region_ioeventfd_before_mips -#define memory_region_ioeventfd_equal memory_region_ioeventfd_equal_mips #define memory_region_is_iommu memory_region_is_iommu_mips #define memory_region_is_logging memory_region_is_logging_mips #define memory_region_is_mapped memory_region_is_mapped_mips @@ -2078,8 +2070,6 @@ #define memory_region_transaction_begin memory_region_transaction_begin_mips #define memory_region_transaction_commit memory_region_transaction_commit_mips #define memory_region_unref memory_region_unref_mips -#define memory_region_update_coalesced_range memory_region_update_coalesced_range_mips -#define memory_region_update_coalesced_range_as memory_region_update_coalesced_range_as_mips #define memory_region_update_container_subregions memory_region_update_container_subregions_mips #define memory_region_write_accessor memory_region_write_accessor_mips #define memory_region_wrong_endianness memory_region_wrong_endianness_mips diff --git a/qemu/mips64.h b/qemu/mips64.h index b2c62cff..a6af4eeb 100644 --- a/qemu/mips64.h +++ b/qemu/mips64.h @@ -56,7 +56,6 @@ #define addFloatx80Sigs addFloatx80Sigs_mips64 #define add_qemu_ldst_label add_qemu_ldst_label_mips64 #define address_space_access_valid address_space_access_valid_mips64 -#define address_space_add_del_ioeventfds address_space_add_del_ioeventfds_mips64 #define address_space_destroy address_space_destroy_mips64 #define address_space_destroy_dispatch address_space_destroy_dispatch_mips64 #define address_space_get_flatview address_space_get_flatview_mips64 @@ -70,7 +69,6 @@ #define address_space_translate_for_iotlb address_space_translate_for_iotlb_mips64 #define address_space_translate_internal address_space_translate_internal_mips64 #define address_space_unmap address_space_unmap_mips64 -#define address_space_update_ioeventfds address_space_update_ioeventfds_mips64 #define address_space_update_topology address_space_update_topology_mips64 #define address_space_update_topology_pass address_space_update_topology_pass_mips64 #define address_space_write address_space_write_mips64 @@ -80,7 +78,6 @@ #define addrrange_intersection addrrange_intersection_mips64 #define addrrange_intersects addrrange_intersects_mips64 #define addrrange_make addrrange_make_mips64 -#define addrrange_shift addrrange_shift_mips64 #define adjust_endianness adjust_endianness_mips64 #define all_helpers all_helpers_mips64 #define alloc_code_gen_buffer alloc_code_gen_buffer_mips64 @@ -2011,14 +2008,11 @@ #define memory_mapping_list_free memory_mapping_list_free_mips64 #define memory_mapping_list_init memory_mapping_list_init_mips64 #define memory_region_access_valid memory_region_access_valid_mips64 -#define memory_region_add_eventfd memory_region_add_eventfd_mips64 #define memory_region_add_subregion memory_region_add_subregion_mips64 #define memory_region_add_subregion_common memory_region_add_subregion_common_mips64 #define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_mips64 #define memory_region_big_endian memory_region_big_endian_mips64 -#define memory_region_clear_coalescing memory_region_clear_coalescing_mips64 #define memory_region_clear_pending memory_region_clear_pending_mips64 -#define memory_region_del_eventfd memory_region_del_eventfd_mips64 #define memory_region_del_subregion memory_region_del_subregion_mips64 #define memory_region_destructor_alias memory_region_destructor_alias_mips64 #define memory_region_destructor_none memory_region_destructor_none_mips64 @@ -2047,8 +2041,6 @@ #define memory_region_init_ram memory_region_init_ram_mips64 #define memory_region_init_ram_ptr memory_region_init_ram_ptr_mips64 #define memory_region_init_reservation memory_region_init_reservation_mips64 -#define memory_region_ioeventfd_before memory_region_ioeventfd_before_mips64 -#define memory_region_ioeventfd_equal memory_region_ioeventfd_equal_mips64 #define memory_region_is_iommu memory_region_is_iommu_mips64 #define memory_region_is_logging memory_region_is_logging_mips64 #define memory_region_is_mapped memory_region_is_mapped_mips64 @@ -2078,8 +2070,6 @@ #define memory_region_transaction_begin memory_region_transaction_begin_mips64 #define memory_region_transaction_commit memory_region_transaction_commit_mips64 #define memory_region_unref memory_region_unref_mips64 -#define memory_region_update_coalesced_range memory_region_update_coalesced_range_mips64 -#define memory_region_update_coalesced_range_as memory_region_update_coalesced_range_as_mips64 #define memory_region_update_container_subregions memory_region_update_container_subregions_mips64 #define memory_region_write_accessor memory_region_write_accessor_mips64 #define memory_region_wrong_endianness memory_region_wrong_endianness_mips64 diff --git a/qemu/mips64el.h b/qemu/mips64el.h index 617bc44d..c453400d 100644 --- a/qemu/mips64el.h +++ b/qemu/mips64el.h @@ -56,7 +56,6 @@ #define addFloatx80Sigs addFloatx80Sigs_mips64el #define add_qemu_ldst_label add_qemu_ldst_label_mips64el #define address_space_access_valid address_space_access_valid_mips64el -#define address_space_add_del_ioeventfds address_space_add_del_ioeventfds_mips64el #define address_space_destroy address_space_destroy_mips64el #define address_space_destroy_dispatch address_space_destroy_dispatch_mips64el #define address_space_get_flatview address_space_get_flatview_mips64el @@ -70,7 +69,6 @@ #define address_space_translate_for_iotlb address_space_translate_for_iotlb_mips64el #define address_space_translate_internal address_space_translate_internal_mips64el #define address_space_unmap address_space_unmap_mips64el -#define address_space_update_ioeventfds address_space_update_ioeventfds_mips64el #define address_space_update_topology address_space_update_topology_mips64el #define address_space_update_topology_pass address_space_update_topology_pass_mips64el #define address_space_write address_space_write_mips64el @@ -80,7 +78,6 @@ #define addrrange_intersection addrrange_intersection_mips64el #define addrrange_intersects addrrange_intersects_mips64el #define addrrange_make addrrange_make_mips64el -#define addrrange_shift addrrange_shift_mips64el #define adjust_endianness adjust_endianness_mips64el #define all_helpers all_helpers_mips64el #define alloc_code_gen_buffer alloc_code_gen_buffer_mips64el @@ -2011,14 +2008,11 @@ #define memory_mapping_list_free memory_mapping_list_free_mips64el #define memory_mapping_list_init memory_mapping_list_init_mips64el #define memory_region_access_valid memory_region_access_valid_mips64el -#define memory_region_add_eventfd memory_region_add_eventfd_mips64el #define memory_region_add_subregion memory_region_add_subregion_mips64el #define memory_region_add_subregion_common memory_region_add_subregion_common_mips64el #define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_mips64el #define memory_region_big_endian memory_region_big_endian_mips64el -#define memory_region_clear_coalescing memory_region_clear_coalescing_mips64el #define memory_region_clear_pending memory_region_clear_pending_mips64el -#define memory_region_del_eventfd memory_region_del_eventfd_mips64el #define memory_region_del_subregion memory_region_del_subregion_mips64el #define memory_region_destructor_alias memory_region_destructor_alias_mips64el #define memory_region_destructor_none memory_region_destructor_none_mips64el @@ -2047,8 +2041,6 @@ #define memory_region_init_ram memory_region_init_ram_mips64el #define memory_region_init_ram_ptr memory_region_init_ram_ptr_mips64el #define memory_region_init_reservation memory_region_init_reservation_mips64el -#define memory_region_ioeventfd_before memory_region_ioeventfd_before_mips64el -#define memory_region_ioeventfd_equal memory_region_ioeventfd_equal_mips64el #define memory_region_is_iommu memory_region_is_iommu_mips64el #define memory_region_is_logging memory_region_is_logging_mips64el #define memory_region_is_mapped memory_region_is_mapped_mips64el @@ -2078,8 +2070,6 @@ #define memory_region_transaction_begin memory_region_transaction_begin_mips64el #define memory_region_transaction_commit memory_region_transaction_commit_mips64el #define memory_region_unref memory_region_unref_mips64el -#define memory_region_update_coalesced_range memory_region_update_coalesced_range_mips64el -#define memory_region_update_coalesced_range_as memory_region_update_coalesced_range_as_mips64el #define memory_region_update_container_subregions memory_region_update_container_subregions_mips64el #define memory_region_write_accessor memory_region_write_accessor_mips64el #define memory_region_wrong_endianness memory_region_wrong_endianness_mips64el diff --git a/qemu/mipsel.h b/qemu/mipsel.h index 1dc1af12..4ad7be8d 100644 --- a/qemu/mipsel.h +++ b/qemu/mipsel.h @@ -56,7 +56,6 @@ #define addFloatx80Sigs addFloatx80Sigs_mipsel #define add_qemu_ldst_label add_qemu_ldst_label_mipsel #define address_space_access_valid address_space_access_valid_mipsel -#define address_space_add_del_ioeventfds address_space_add_del_ioeventfds_mipsel #define address_space_destroy address_space_destroy_mipsel #define address_space_destroy_dispatch address_space_destroy_dispatch_mipsel #define address_space_get_flatview address_space_get_flatview_mipsel @@ -70,7 +69,6 @@ #define address_space_translate_for_iotlb address_space_translate_for_iotlb_mipsel #define address_space_translate_internal address_space_translate_internal_mipsel #define address_space_unmap address_space_unmap_mipsel -#define address_space_update_ioeventfds address_space_update_ioeventfds_mipsel #define address_space_update_topology address_space_update_topology_mipsel #define address_space_update_topology_pass address_space_update_topology_pass_mipsel #define address_space_write address_space_write_mipsel @@ -80,7 +78,6 @@ #define addrrange_intersection addrrange_intersection_mipsel #define addrrange_intersects addrrange_intersects_mipsel #define addrrange_make addrrange_make_mipsel -#define addrrange_shift addrrange_shift_mipsel #define adjust_endianness adjust_endianness_mipsel #define all_helpers all_helpers_mipsel #define alloc_code_gen_buffer alloc_code_gen_buffer_mipsel @@ -2011,14 +2008,11 @@ #define memory_mapping_list_free memory_mapping_list_free_mipsel #define memory_mapping_list_init memory_mapping_list_init_mipsel #define memory_region_access_valid memory_region_access_valid_mipsel -#define memory_region_add_eventfd memory_region_add_eventfd_mipsel #define memory_region_add_subregion memory_region_add_subregion_mipsel #define memory_region_add_subregion_common memory_region_add_subregion_common_mipsel #define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_mipsel #define memory_region_big_endian memory_region_big_endian_mipsel -#define memory_region_clear_coalescing memory_region_clear_coalescing_mipsel #define memory_region_clear_pending memory_region_clear_pending_mipsel -#define memory_region_del_eventfd memory_region_del_eventfd_mipsel #define memory_region_del_subregion memory_region_del_subregion_mipsel #define memory_region_destructor_alias memory_region_destructor_alias_mipsel #define memory_region_destructor_none memory_region_destructor_none_mipsel @@ -2047,8 +2041,6 @@ #define memory_region_init_ram memory_region_init_ram_mipsel #define memory_region_init_ram_ptr memory_region_init_ram_ptr_mipsel #define memory_region_init_reservation memory_region_init_reservation_mipsel -#define memory_region_ioeventfd_before memory_region_ioeventfd_before_mipsel -#define memory_region_ioeventfd_equal memory_region_ioeventfd_equal_mipsel #define memory_region_is_iommu memory_region_is_iommu_mipsel #define memory_region_is_logging memory_region_is_logging_mipsel #define memory_region_is_mapped memory_region_is_mapped_mipsel @@ -2078,8 +2070,6 @@ #define memory_region_transaction_begin memory_region_transaction_begin_mipsel #define memory_region_transaction_commit memory_region_transaction_commit_mipsel #define memory_region_unref memory_region_unref_mipsel -#define memory_region_update_coalesced_range memory_region_update_coalesced_range_mipsel -#define memory_region_update_coalesced_range_as memory_region_update_coalesced_range_as_mipsel #define memory_region_update_container_subregions memory_region_update_container_subregions_mipsel #define memory_region_write_accessor memory_region_write_accessor_mipsel #define memory_region_wrong_endianness memory_region_wrong_endianness_mipsel diff --git a/qemu/powerpc.h b/qemu/powerpc.h index 8ca1c9a7..80520561 100644 --- a/qemu/powerpc.h +++ b/qemu/powerpc.h @@ -56,7 +56,6 @@ #define addFloatx80Sigs addFloatx80Sigs_powerpc #define add_qemu_ldst_label add_qemu_ldst_label_powerpc #define address_space_access_valid address_space_access_valid_powerpc -#define address_space_add_del_ioeventfds address_space_add_del_ioeventfds_powerpc #define address_space_destroy address_space_destroy_powerpc #define address_space_destroy_dispatch address_space_destroy_dispatch_powerpc #define address_space_get_flatview address_space_get_flatview_powerpc @@ -70,7 +69,6 @@ #define address_space_translate_for_iotlb address_space_translate_for_iotlb_powerpc #define address_space_translate_internal address_space_translate_internal_powerpc #define address_space_unmap address_space_unmap_powerpc -#define address_space_update_ioeventfds address_space_update_ioeventfds_powerpc #define address_space_update_topology address_space_update_topology_powerpc #define address_space_update_topology_pass address_space_update_topology_pass_powerpc #define address_space_write address_space_write_powerpc @@ -80,7 +78,6 @@ #define addrrange_intersection addrrange_intersection_powerpc #define addrrange_intersects addrrange_intersects_powerpc #define addrrange_make addrrange_make_powerpc -#define addrrange_shift addrrange_shift_powerpc #define adjust_endianness adjust_endianness_powerpc #define all_helpers all_helpers_powerpc #define alloc_code_gen_buffer alloc_code_gen_buffer_powerpc @@ -2011,14 +2008,11 @@ #define memory_mapping_list_free memory_mapping_list_free_powerpc #define memory_mapping_list_init memory_mapping_list_init_powerpc #define memory_region_access_valid memory_region_access_valid_powerpc -#define memory_region_add_eventfd memory_region_add_eventfd_powerpc #define memory_region_add_subregion memory_region_add_subregion_powerpc #define memory_region_add_subregion_common memory_region_add_subregion_common_powerpc #define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_powerpc #define memory_region_big_endian memory_region_big_endian_powerpc -#define memory_region_clear_coalescing memory_region_clear_coalescing_powerpc #define memory_region_clear_pending memory_region_clear_pending_powerpc -#define memory_region_del_eventfd memory_region_del_eventfd_powerpc #define memory_region_del_subregion memory_region_del_subregion_powerpc #define memory_region_destructor_alias memory_region_destructor_alias_powerpc #define memory_region_destructor_none memory_region_destructor_none_powerpc @@ -2047,8 +2041,6 @@ #define memory_region_init_ram memory_region_init_ram_powerpc #define memory_region_init_ram_ptr memory_region_init_ram_ptr_powerpc #define memory_region_init_reservation memory_region_init_reservation_powerpc -#define memory_region_ioeventfd_before memory_region_ioeventfd_before_powerpc -#define memory_region_ioeventfd_equal memory_region_ioeventfd_equal_powerpc #define memory_region_is_iommu memory_region_is_iommu_powerpc #define memory_region_is_logging memory_region_is_logging_powerpc #define memory_region_is_mapped memory_region_is_mapped_powerpc @@ -2078,8 +2070,6 @@ #define memory_region_transaction_begin memory_region_transaction_begin_powerpc #define memory_region_transaction_commit memory_region_transaction_commit_powerpc #define memory_region_unref memory_region_unref_powerpc -#define memory_region_update_coalesced_range memory_region_update_coalesced_range_powerpc -#define memory_region_update_coalesced_range_as memory_region_update_coalesced_range_as_powerpc #define memory_region_update_container_subregions memory_region_update_container_subregions_powerpc #define memory_region_write_accessor memory_region_write_accessor_powerpc #define memory_region_wrong_endianness memory_region_wrong_endianness_powerpc diff --git a/qemu/sparc.h b/qemu/sparc.h index 2151cff7..b3c6d853 100644 --- a/qemu/sparc.h +++ b/qemu/sparc.h @@ -56,7 +56,6 @@ #define addFloatx80Sigs addFloatx80Sigs_sparc #define add_qemu_ldst_label add_qemu_ldst_label_sparc #define address_space_access_valid address_space_access_valid_sparc -#define address_space_add_del_ioeventfds address_space_add_del_ioeventfds_sparc #define address_space_destroy address_space_destroy_sparc #define address_space_destroy_dispatch address_space_destroy_dispatch_sparc #define address_space_get_flatview address_space_get_flatview_sparc @@ -70,7 +69,6 @@ #define address_space_translate_for_iotlb address_space_translate_for_iotlb_sparc #define address_space_translate_internal address_space_translate_internal_sparc #define address_space_unmap address_space_unmap_sparc -#define address_space_update_ioeventfds address_space_update_ioeventfds_sparc #define address_space_update_topology address_space_update_topology_sparc #define address_space_update_topology_pass address_space_update_topology_pass_sparc #define address_space_write address_space_write_sparc @@ -80,7 +78,6 @@ #define addrrange_intersection addrrange_intersection_sparc #define addrrange_intersects addrrange_intersects_sparc #define addrrange_make addrrange_make_sparc -#define addrrange_shift addrrange_shift_sparc #define adjust_endianness adjust_endianness_sparc #define all_helpers all_helpers_sparc #define alloc_code_gen_buffer alloc_code_gen_buffer_sparc @@ -2011,14 +2008,11 @@ #define memory_mapping_list_free memory_mapping_list_free_sparc #define memory_mapping_list_init memory_mapping_list_init_sparc #define memory_region_access_valid memory_region_access_valid_sparc -#define memory_region_add_eventfd memory_region_add_eventfd_sparc #define memory_region_add_subregion memory_region_add_subregion_sparc #define memory_region_add_subregion_common memory_region_add_subregion_common_sparc #define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_sparc #define memory_region_big_endian memory_region_big_endian_sparc -#define memory_region_clear_coalescing memory_region_clear_coalescing_sparc #define memory_region_clear_pending memory_region_clear_pending_sparc -#define memory_region_del_eventfd memory_region_del_eventfd_sparc #define memory_region_del_subregion memory_region_del_subregion_sparc #define memory_region_destructor_alias memory_region_destructor_alias_sparc #define memory_region_destructor_none memory_region_destructor_none_sparc @@ -2047,8 +2041,6 @@ #define memory_region_init_ram memory_region_init_ram_sparc #define memory_region_init_ram_ptr memory_region_init_ram_ptr_sparc #define memory_region_init_reservation memory_region_init_reservation_sparc -#define memory_region_ioeventfd_before memory_region_ioeventfd_before_sparc -#define memory_region_ioeventfd_equal memory_region_ioeventfd_equal_sparc #define memory_region_is_iommu memory_region_is_iommu_sparc #define memory_region_is_logging memory_region_is_logging_sparc #define memory_region_is_mapped memory_region_is_mapped_sparc @@ -2078,8 +2070,6 @@ #define memory_region_transaction_begin memory_region_transaction_begin_sparc #define memory_region_transaction_commit memory_region_transaction_commit_sparc #define memory_region_unref memory_region_unref_sparc -#define memory_region_update_coalesced_range memory_region_update_coalesced_range_sparc -#define memory_region_update_coalesced_range_as memory_region_update_coalesced_range_as_sparc #define memory_region_update_container_subregions memory_region_update_container_subregions_sparc #define memory_region_write_accessor memory_region_write_accessor_sparc #define memory_region_wrong_endianness memory_region_wrong_endianness_sparc diff --git a/qemu/sparc64.h b/qemu/sparc64.h index b19b68ce..c8860863 100644 --- a/qemu/sparc64.h +++ b/qemu/sparc64.h @@ -56,7 +56,6 @@ #define addFloatx80Sigs addFloatx80Sigs_sparc64 #define add_qemu_ldst_label add_qemu_ldst_label_sparc64 #define address_space_access_valid address_space_access_valid_sparc64 -#define address_space_add_del_ioeventfds address_space_add_del_ioeventfds_sparc64 #define address_space_destroy address_space_destroy_sparc64 #define address_space_destroy_dispatch address_space_destroy_dispatch_sparc64 #define address_space_get_flatview address_space_get_flatview_sparc64 @@ -70,7 +69,6 @@ #define address_space_translate_for_iotlb address_space_translate_for_iotlb_sparc64 #define address_space_translate_internal address_space_translate_internal_sparc64 #define address_space_unmap address_space_unmap_sparc64 -#define address_space_update_ioeventfds address_space_update_ioeventfds_sparc64 #define address_space_update_topology address_space_update_topology_sparc64 #define address_space_update_topology_pass address_space_update_topology_pass_sparc64 #define address_space_write address_space_write_sparc64 @@ -80,7 +78,6 @@ #define addrrange_intersection addrrange_intersection_sparc64 #define addrrange_intersects addrrange_intersects_sparc64 #define addrrange_make addrrange_make_sparc64 -#define addrrange_shift addrrange_shift_sparc64 #define adjust_endianness adjust_endianness_sparc64 #define all_helpers all_helpers_sparc64 #define alloc_code_gen_buffer alloc_code_gen_buffer_sparc64 @@ -2011,14 +2008,11 @@ #define memory_mapping_list_free memory_mapping_list_free_sparc64 #define memory_mapping_list_init memory_mapping_list_init_sparc64 #define memory_region_access_valid memory_region_access_valid_sparc64 -#define memory_region_add_eventfd memory_region_add_eventfd_sparc64 #define memory_region_add_subregion memory_region_add_subregion_sparc64 #define memory_region_add_subregion_common memory_region_add_subregion_common_sparc64 #define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_sparc64 #define memory_region_big_endian memory_region_big_endian_sparc64 -#define memory_region_clear_coalescing memory_region_clear_coalescing_sparc64 #define memory_region_clear_pending memory_region_clear_pending_sparc64 -#define memory_region_del_eventfd memory_region_del_eventfd_sparc64 #define memory_region_del_subregion memory_region_del_subregion_sparc64 #define memory_region_destructor_alias memory_region_destructor_alias_sparc64 #define memory_region_destructor_none memory_region_destructor_none_sparc64 @@ -2047,8 +2041,6 @@ #define memory_region_init_ram memory_region_init_ram_sparc64 #define memory_region_init_ram_ptr memory_region_init_ram_ptr_sparc64 #define memory_region_init_reservation memory_region_init_reservation_sparc64 -#define memory_region_ioeventfd_before memory_region_ioeventfd_before_sparc64 -#define memory_region_ioeventfd_equal memory_region_ioeventfd_equal_sparc64 #define memory_region_is_iommu memory_region_is_iommu_sparc64 #define memory_region_is_logging memory_region_is_logging_sparc64 #define memory_region_is_mapped memory_region_is_mapped_sparc64 @@ -2078,8 +2070,6 @@ #define memory_region_transaction_begin memory_region_transaction_begin_sparc64 #define memory_region_transaction_commit memory_region_transaction_commit_sparc64 #define memory_region_unref memory_region_unref_sparc64 -#define memory_region_update_coalesced_range memory_region_update_coalesced_range_sparc64 -#define memory_region_update_coalesced_range_as memory_region_update_coalesced_range_as_sparc64 #define memory_region_update_container_subregions memory_region_update_container_subregions_sparc64 #define memory_region_write_accessor memory_region_write_accessor_sparc64 #define memory_region_wrong_endianness memory_region_wrong_endianness_sparc64 diff --git a/qemu/x86_64.h b/qemu/x86_64.h index 3f23d57e..df86439d 100644 --- a/qemu/x86_64.h +++ b/qemu/x86_64.h @@ -56,7 +56,6 @@ #define addFloatx80Sigs addFloatx80Sigs_x86_64 #define add_qemu_ldst_label add_qemu_ldst_label_x86_64 #define address_space_access_valid address_space_access_valid_x86_64 -#define address_space_add_del_ioeventfds address_space_add_del_ioeventfds_x86_64 #define address_space_destroy address_space_destroy_x86_64 #define address_space_destroy_dispatch address_space_destroy_dispatch_x86_64 #define address_space_get_flatview address_space_get_flatview_x86_64 @@ -70,7 +69,6 @@ #define address_space_translate_for_iotlb address_space_translate_for_iotlb_x86_64 #define address_space_translate_internal address_space_translate_internal_x86_64 #define address_space_unmap address_space_unmap_x86_64 -#define address_space_update_ioeventfds address_space_update_ioeventfds_x86_64 #define address_space_update_topology address_space_update_topology_x86_64 #define address_space_update_topology_pass address_space_update_topology_pass_x86_64 #define address_space_write address_space_write_x86_64 @@ -80,7 +78,6 @@ #define addrrange_intersection addrrange_intersection_x86_64 #define addrrange_intersects addrrange_intersects_x86_64 #define addrrange_make addrrange_make_x86_64 -#define addrrange_shift addrrange_shift_x86_64 #define adjust_endianness adjust_endianness_x86_64 #define all_helpers all_helpers_x86_64 #define alloc_code_gen_buffer alloc_code_gen_buffer_x86_64 @@ -2011,14 +2008,11 @@ #define memory_mapping_list_free memory_mapping_list_free_x86_64 #define memory_mapping_list_init memory_mapping_list_init_x86_64 #define memory_region_access_valid memory_region_access_valid_x86_64 -#define memory_region_add_eventfd memory_region_add_eventfd_x86_64 #define memory_region_add_subregion memory_region_add_subregion_x86_64 #define memory_region_add_subregion_common memory_region_add_subregion_common_x86_64 #define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_x86_64 #define memory_region_big_endian memory_region_big_endian_x86_64 -#define memory_region_clear_coalescing memory_region_clear_coalescing_x86_64 #define memory_region_clear_pending memory_region_clear_pending_x86_64 -#define memory_region_del_eventfd memory_region_del_eventfd_x86_64 #define memory_region_del_subregion memory_region_del_subregion_x86_64 #define memory_region_destructor_alias memory_region_destructor_alias_x86_64 #define memory_region_destructor_none memory_region_destructor_none_x86_64 @@ -2047,8 +2041,6 @@ #define memory_region_init_ram memory_region_init_ram_x86_64 #define memory_region_init_ram_ptr memory_region_init_ram_ptr_x86_64 #define memory_region_init_reservation memory_region_init_reservation_x86_64 -#define memory_region_ioeventfd_before memory_region_ioeventfd_before_x86_64 -#define memory_region_ioeventfd_equal memory_region_ioeventfd_equal_x86_64 #define memory_region_is_iommu memory_region_is_iommu_x86_64 #define memory_region_is_logging memory_region_is_logging_x86_64 #define memory_region_is_mapped memory_region_is_mapped_x86_64 @@ -2078,8 +2070,6 @@ #define memory_region_transaction_begin memory_region_transaction_begin_x86_64 #define memory_region_transaction_commit memory_region_transaction_commit_x86_64 #define memory_region_unref memory_region_unref_x86_64 -#define memory_region_update_coalesced_range memory_region_update_coalesced_range_x86_64 -#define memory_region_update_coalesced_range_as memory_region_update_coalesced_range_as_x86_64 #define memory_region_update_container_subregions memory_region_update_container_subregions_x86_64 #define memory_region_write_accessor memory_region_write_accessor_x86_64 #define memory_region_wrong_endianness memory_region_wrong_endianness_x86_64 From a95fdbc5aa2009a0c27eb10d3e1a754693b443b9 Mon Sep 17 00:00:00 2001 From: Nguyen Anh Quynh Date: Sun, 22 Jan 2017 23:21:47 +0800 Subject: [PATCH 09/31] cleanup qemu/include/exec/memory.h --- qemu/include/exec/memory.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/qemu/include/exec/memory.h b/qemu/include/exec/memory.h index 08aabf54..927161b2 100644 --- a/qemu/include/exec/memory.h +++ b/qemu/include/exec/memory.h @@ -23,9 +23,7 @@ #include #include "qemu-common.h" #include "exec/cpu-common.h" -#ifndef CONFIG_USER_ONLY #include "exec/hwaddr.h" -#endif #include "qemu/queue.h" #include "qemu/int128.h" #include "qapi/error.h" From 0c55648deec70927b00c83bd7cd69aebeb8583af Mon Sep 17 00:00:00 2001 From: Nguyen Anh Quynh Date: Sun, 22 Jan 2017 23:53:28 +0800 Subject: [PATCH 10/31] make.sh: build_linux32() appends, but does not overwrite UNICORN_QEMU_FLAGS --- make.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/make.sh b/make.sh index 967c983e..e8cc2eb0 100755 --- a/make.sh +++ b/make.sh @@ -48,7 +48,7 @@ build_linux32() { LDFLAGS=-m32 \ LDFLAGS_STATIC=-m32 \ LIBRARY_PATH="/usr/lib/i386-linux-gnu" \ - UNICORN_QEMU_FLAGS="--cpu=i386" \ + UNICORN_QEMU_FLAGS="--cpu=i386 ${UNICORN_QEMU_FLAGS}" \ ${MAKE} } From b3faed1df99ed031d521365fe25604e9180252e8 Mon Sep 17 00:00:00 2001 From: Nguyen Anh Quynh Date: Mon, 23 Jan 2017 00:30:13 +0800 Subject: [PATCH 11/31] cleanup --- qemu/hw/i386/Makefile.objs | 1 - 1 file changed, 1 deletion(-) diff --git a/qemu/hw/i386/Makefile.objs b/qemu/hw/i386/Makefile.objs index f6aaa63e..649888e4 100644 --- a/qemu/hw/i386/Makefile.objs +++ b/qemu/hw/i386/Makefile.objs @@ -1,2 +1 @@ -obj-$(CONFIG_KVM) += kvm/ obj-y += pc.o pc_piix.o From 55d472c62c61c3e141a7425c6fbcb3a23de081bb Mon Sep 17 00:00:00 2001 From: Nguyen Anh Quynh Date: Mon, 23 Jan 2017 00:53:31 +0800 Subject: [PATCH 12/31] cleanup Monitor related code --- qemu/hw/sparc/sun4m.c | 12 ------------ qemu/include/hw/qdev-core.h | 1 - qemu/include/hw/sparc/sun4m.h | 11 ----------- qemu/include/qemu/typedefs.h | 2 -- qemu/target-i386/helper.c | 1 - 5 files changed, 27 deletions(-) diff --git a/qemu/hw/sparc/sun4m.c b/qemu/hw/sparc/sun4m.c index 3e9ac2b7..55578323 100644 --- a/qemu/hw/sparc/sun4m.c +++ b/qemu/hw/sparc/sun4m.c @@ -175,18 +175,6 @@ static void nvram_init(M48t59State *nvram, uint8_t *macaddr, static DeviceState *slavio_intctl; -void sun4m_pic_info(Monitor *mon, const QDict *qdict) -{ - if (slavio_intctl) - slavio_pic_info(mon, slavio_intctl); -} - -void sun4m_irq_info(Monitor *mon, const QDict *qdict) -{ - if (slavio_intctl) - slavio_irq_info(mon, slavio_intctl); -} - void cpu_check_irqs(CPUSPARCState *env) { CPUState *cs; diff --git a/qemu/include/hw/qdev-core.h b/qemu/include/hw/qdev-core.h index 780cbb90..f10312e3 100644 --- a/qemu/include/hw/qdev-core.h +++ b/qemu/include/hw/qdev-core.h @@ -169,7 +169,6 @@ struct BusClass { ObjectClass parent_class; /* FIXME first arg should be BusState */ - void (*print_dev)(Monitor *mon, DeviceState *dev, int indent); char *(*get_dev_path)(DeviceState *dev); /* * This callback is used to create Open Firmware device path in accordance diff --git a/qemu/include/hw/sparc/sun4m.h b/qemu/include/hw/sparc/sun4m.h index a587700a..eb76d541 100644 --- a/qemu/include/hw/sparc/sun4m.h +++ b/qemu/include/hw/sparc/sun4m.h @@ -24,15 +24,4 @@ static inline void sparc_iommu_memory_write(void *opaque, sparc_iommu_memory_rw(opaque, addr, buf, len, 1); } -/* slavio_intctl.c */ -void slavio_pic_info(Monitor *mon, DeviceState *dev); -void slavio_irq_info(Monitor *mon, DeviceState *dev); - -/* sun4m.c */ -void sun4m_pic_info(Monitor *mon, const QDict *qdict); -void sun4m_irq_info(Monitor *mon, const QDict *qdict); - -/* sparc32_dma.c */ -#include "hw/sparc/sparc32_dma.h" - #endif diff --git a/qemu/include/qemu/typedefs.h b/qemu/include/qemu/typedefs.h index 34751778..d9759fc0 100644 --- a/qemu/include/qemu/typedefs.h +++ b/qemu/include/qemu/typedefs.h @@ -12,8 +12,6 @@ typedef struct AioContext AioContext; typedef struct Visitor Visitor; -struct Monitor; -typedef struct Monitor Monitor; typedef struct MigrationParams MigrationParams; typedef struct Property Property; diff --git a/qemu/target-i386/helper.c b/qemu/target-i386/helper.c index 5341094e..b530f9b8 100644 --- a/qemu/target-i386/helper.c +++ b/qemu/target-i386/helper.c @@ -1045,7 +1045,6 @@ void breakpoint_handler(CPUState *cs) } typedef struct MCEInjectionParams { - Monitor *mon; X86CPU *cpu; int bank; uint64_t status; From e4c7c3dbe4a7de4122692d6630386cda8ab660ed Mon Sep 17 00:00:00 2001 From: Nguyen Anh Quynh Date: Mon, 23 Jan 2017 12:33:39 +0800 Subject: [PATCH 13/31] cleanup Sparc unused code --- qemu/hw/sparc/sun4m.c | 1510 ------------------------------- qemu/include/hw/sparc/sun4m.h | 27 - qemu/target-sparc/Makefile.objs | 1 - qemu/target-sparc/gdbstub.c | 208 ----- qemu/target-sparc/machine.c | 218 ----- 5 files changed, 1964 deletions(-) delete mode 100644 qemu/hw/sparc/sun4m.c delete mode 100644 qemu/include/hw/sparc/sun4m.h delete mode 100644 qemu/target-sparc/gdbstub.c delete mode 100644 qemu/target-sparc/machine.c diff --git a/qemu/hw/sparc/sun4m.c b/qemu/hw/sparc/sun4m.c deleted file mode 100644 index 55578323..00000000 --- a/qemu/hw/sparc/sun4m.c +++ /dev/null @@ -1,1510 +0,0 @@ -/* - * QEMU Sun4m & Sun4d & Sun4c System Emulator - * - * Copyright (c) 2003-2005 Fabrice Bellard - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#include "qemu/error-report.h" -#include "qemu/timer.h" -#include "hw/sparc/sun4m.h" -#include "hw/timer/m48t59.h" -#include "hw/sparc/sparc32_dma.h" -#include "hw/block/fdc.h" -#include "sysemu/sysemu.h" -#include "net/net.h" -#include "hw/boards.h" -#include "hw/nvram/openbios_firmware_abi.h" -#include "hw/scsi/esp.h" -#include "hw/i386/pc.h" -#include "hw/isa/isa.h" -#include "hw/nvram/fw_cfg.h" -#include "hw/char/escc.h" -#include "hw/empty_slot.h" -#include "hw/loader.h" -#include "elf.h" -#include "sysemu/block-backend.h" -#include "trace.h" - -/* - * Sun4m architecture was used in the following machines: - * - * SPARCserver 6xxMP/xx - * SPARCclassic (SPARCclassic Server)(SPARCstation LC) (4/15), - * SPARCclassic X (4/10) - * SPARCstation LX/ZX (4/30) - * SPARCstation Voyager - * SPARCstation 10/xx, SPARCserver 10/xx - * SPARCstation 5, SPARCserver 5 - * SPARCstation 20/xx, SPARCserver 20 - * SPARCstation 4 - * - * See for example: http://www.sunhelp.org/faq/sunref1.html - */ - -#define KERNEL_LOAD_ADDR 0x00004000 -#define CMDLINE_ADDR 0x007ff000 -#define INITRD_LOAD_ADDR 0x00800000 -#define PROM_SIZE_MAX (1024 * 1024) -#define PROM_VADDR 0xffd00000 -#define PROM_FILENAME "openbios-sparc32" -#define CFG_ADDR 0xd00000510ULL -#define FW_CFG_SUN4M_DEPTH (FW_CFG_ARCH_LOCAL + 0x00) -#define FW_CFG_SUN4M_WIDTH (FW_CFG_ARCH_LOCAL + 0x01) -#define FW_CFG_SUN4M_HEIGHT (FW_CFG_ARCH_LOCAL + 0x02) - -#define MAX_CPUS 16 -#define MAX_PILS 16 -#define MAX_VSIMMS 4 - -#define ESCC_CLOCK 4915200 - -struct sun4m_hwdef { - hwaddr iommu_base, iommu_pad_base, iommu_pad_len, slavio_base; - hwaddr intctl_base, counter_base, nvram_base, ms_kb_base; - hwaddr serial_base, fd_base; - hwaddr afx_base, idreg_base, dma_base, esp_base, le_base; - hwaddr tcx_base, cs_base, apc_base, aux1_base, aux2_base; - hwaddr bpp_base, dbri_base, sx_base; - struct { - hwaddr reg_base, vram_base; - } vsimm[MAX_VSIMMS]; - hwaddr ecc_base; - uint64_t max_mem; - const char * const default_cpu_model; - uint32_t ecc_version; - uint32_t iommu_version; - uint16_t machine_id; - uint8_t nvram_machine_id; -}; - -int DMA_get_channel_mode (int nchan) -{ - return 0; -} -int DMA_read_memory (int nchan, void *buf, int pos, int size) -{ - return 0; -} -int DMA_write_memory (int nchan, void *buf, int pos, int size) -{ - return 0; -} -void DMA_hold_DREQ (int nchan) {} -void DMA_release_DREQ (int nchan) {} -void DMA_schedule(int nchan) {} - -void DMA_init(int high_page_enable, qemu_irq *cpu_request_exit) -{ -} - -void DMA_register_channel (int nchan, - DMA_transfer_handler transfer_handler, - void *opaque) -{ -} - -static int fw_cfg_boot_set(void *opaque, const char *boot_device) -{ - fw_cfg_add_i16(opaque, FW_CFG_BOOT_DEVICE, boot_device[0]); - return 0; -} - -static void nvram_init(M48t59State *nvram, uint8_t *macaddr, - const char *cmdline, const char *boot_devices, - ram_addr_t RAM_size, uint32_t kernel_size, - int width, int height, int depth, - int nvram_machine_id, const char *arch) -{ - unsigned int i; - uint32_t start, end; - uint8_t image[0x1ff0]; - struct OpenBIOS_nvpart_v1 *part_header; - - memset(image, '\0', sizeof(image)); - - start = 0; - - // OpenBIOS nvram variables - // Variable partition - part_header = (struct OpenBIOS_nvpart_v1 *)&image[start]; - part_header->signature = OPENBIOS_PART_SYSTEM; - pstrcpy(part_header->name, sizeof(part_header->name), "system"); - - end = start + sizeof(struct OpenBIOS_nvpart_v1); - for (i = 0; i < nb_prom_envs; i++) - end = OpenBIOS_set_var(image, end, prom_envs[i]); - - // End marker - image[end++] = '\0'; - - end = start + ((end - start + 15) & ~15); - OpenBIOS_finish_partition(part_header, end - start); - - // free partition - start = end; - part_header = (struct OpenBIOS_nvpart_v1 *)&image[start]; - part_header->signature = OPENBIOS_PART_FREE; - pstrcpy(part_header->name, sizeof(part_header->name), "free"); - - end = 0x1fd0; - OpenBIOS_finish_partition(part_header, end - start); - - Sun_init_header((struct Sun_nvram *)&image[0x1fd8], macaddr, - nvram_machine_id); - - for (i = 0; i < sizeof(image); i++) - m48t59_write(nvram, i, image[i]); -} - -static DeviceState *slavio_intctl; - -void cpu_check_irqs(CPUSPARCState *env) -{ - CPUState *cs; - - if (env->pil_in && (env->interrupt_index == 0 || - (env->interrupt_index & ~15) == TT_EXTINT)) { - unsigned int i; - - for (i = 15; i > 0; i--) { - if (env->pil_in & (1 << i)) { - int old_interrupt = env->interrupt_index; - - env->interrupt_index = TT_EXTINT | i; - if (old_interrupt != env->interrupt_index) { - cs = CPU(sparc_env_get_cpu(env)); - trace_sun4m_cpu_interrupt(i); - cpu_interrupt(cs, CPU_INTERRUPT_HARD); - } - break; - } - } - } else if (!env->pil_in && (env->interrupt_index & ~15) == TT_EXTINT) { - cs = CPU(sparc_env_get_cpu(env)); - trace_sun4m_cpu_reset_interrupt(env->interrupt_index & 15); - env->interrupt_index = 0; - cpu_reset_interrupt(cs, CPU_INTERRUPT_HARD); - } -} - -static void cpu_kick_irq(SPARCCPU *cpu) -{ - CPUSPARCState *env = &cpu->env; - CPUState *cs = CPU(cpu); - - cs->halted = 0; - cpu_check_irqs(env); - qemu_cpu_kick(cs); -} - -static void cpu_set_irq(void *opaque, int irq, int level) -{ - SPARCCPU *cpu = opaque; - CPUSPARCState *env = &cpu->env; - - if (level) { - trace_sun4m_cpu_set_irq_raise(irq); - env->pil_in |= 1 << irq; - cpu_kick_irq(cpu); - } else { - trace_sun4m_cpu_set_irq_lower(irq); - env->pil_in &= ~(1 << irq); - cpu_check_irqs(env); - } -} - -static void dummy_cpu_set_irq(void *opaque, int irq, int level) -{ -} - -static void main_cpu_reset(void *opaque) -{ - SPARCCPU *cpu = opaque; - CPUState *cs = CPU(cpu); - - cpu_reset(cs); - cs->halted = 0; -} - -static void secondary_cpu_reset(void *opaque) -{ - SPARCCPU *cpu = opaque; - CPUState *cs = CPU(cpu); - - cpu_reset(cs); - cs->halted = 1; -} - -static void cpu_halt_signal(void *opaque, int irq, int level) -{ - if (level && current_cpu) { - cpu_interrupt(current_cpu, CPU_INTERRUPT_HALT); - } -} - -static uint64_t translate_kernel_address(void *opaque, uint64_t addr) -{ - return addr - 0xf0000000ULL; -} - -static unsigned long sun4m_load_kernel(const char *kernel_filename, - const char *initrd_filename, - ram_addr_t RAM_size) -{ - int linux_boot; - unsigned int i; - long initrd_size, kernel_size; - uint8_t *ptr; - - linux_boot = (kernel_filename != NULL); - - kernel_size = 0; - if (linux_boot) { - int bswap_needed; - -#ifdef BSWAP_NEEDED - bswap_needed = 1; -#else - bswap_needed = 0; -#endif - kernel_size = load_elf(kernel_filename, translate_kernel_address, NULL, - NULL, NULL, NULL, 1, ELF_MACHINE, 0); - if (kernel_size < 0) - kernel_size = load_aout(kernel_filename, KERNEL_LOAD_ADDR, - RAM_size - KERNEL_LOAD_ADDR, bswap_needed, - TARGET_PAGE_SIZE); - if (kernel_size < 0) - kernel_size = load_image_targphys(kernel_filename, - KERNEL_LOAD_ADDR, - RAM_size - KERNEL_LOAD_ADDR); - if (kernel_size < 0) { - fprintf(stderr, "qemu: could not load kernel '%s'\n", - kernel_filename); - exit(1); - } - - /* load initrd */ - initrd_size = 0; - if (initrd_filename) { - initrd_size = load_image_targphys(initrd_filename, - INITRD_LOAD_ADDR, - RAM_size - INITRD_LOAD_ADDR); - if (initrd_size < 0) { - fprintf(stderr, "qemu: could not load initial ram disk '%s'\n", - initrd_filename); - exit(1); - } - } - if (initrd_size > 0) { - for (i = 0; i < 64 * TARGET_PAGE_SIZE; i += TARGET_PAGE_SIZE) { - ptr = rom_ptr(KERNEL_LOAD_ADDR + i); - if (ldl_p(ptr) == 0x48647253) { // HdrS - stl_p(ptr + 16, INITRD_LOAD_ADDR); - stl_p(ptr + 20, initrd_size); - break; - } - } - } - } - return kernel_size; -} - -static void *iommu_init(hwaddr addr, uint32_t version, qemu_irq irq) -{ - DeviceState *dev; - SysBusDevice *s; - - dev = qdev_create(NULL, "iommu"); - qdev_prop_set_uint32(dev, "version", version); - qdev_init_nofail(dev); - s = SYS_BUS_DEVICE(dev); - sysbus_connect_irq(s, 0, irq); - sysbus_mmio_map(s, 0, addr); - - return s; -} - -static void *sparc32_dma_init(hwaddr daddr, qemu_irq parent_irq, - void *iommu, qemu_irq *dev_irq, int is_ledma) -{ - DeviceState *dev; - SysBusDevice *s; - - dev = qdev_create(NULL, "sparc32_dma"); - qdev_prop_set_ptr(dev, "iommu_opaque", iommu); - qdev_prop_set_uint32(dev, "is_ledma", is_ledma); - qdev_init_nofail(dev); - s = SYS_BUS_DEVICE(dev); - sysbus_connect_irq(s, 0, parent_irq); - *dev_irq = qdev_get_gpio_in(dev, 0); - sysbus_mmio_map(s, 0, daddr); - - return s; -} - -static void lance_init(NICInfo *nd, hwaddr leaddr, - void *dma_opaque, qemu_irq irq) -{ - DeviceState *dev; - SysBusDevice *s; - qemu_irq reset; - - qemu_check_nic_model(&nd_table[0], "lance"); - - dev = qdev_create(NULL, "lance"); - qdev_set_nic_properties(dev, nd); - qdev_prop_set_ptr(dev, "dma", dma_opaque); - qdev_init_nofail(dev); - s = SYS_BUS_DEVICE(dev); - sysbus_mmio_map(s, 0, leaddr); - sysbus_connect_irq(s, 0, irq); - reset = qdev_get_gpio_in(dev, 0); - qdev_connect_gpio_out(dma_opaque, 0, reset); -} - -static DeviceState *slavio_intctl_init(hwaddr addr, - hwaddr addrg, - qemu_irq **parent_irq) -{ - DeviceState *dev; - SysBusDevice *s; - unsigned int i, j; - - dev = qdev_create(NULL, "slavio_intctl"); - qdev_init_nofail(dev); - - s = SYS_BUS_DEVICE(dev); - - for (i = 0; i < MAX_CPUS; i++) { - for (j = 0; j < MAX_PILS; j++) { - sysbus_connect_irq(s, i * MAX_PILS + j, parent_irq[i][j]); - } - } - sysbus_mmio_map(s, 0, addrg); - for (i = 0; i < MAX_CPUS; i++) { - sysbus_mmio_map(s, i + 1, addr + i * TARGET_PAGE_SIZE); - } - - return dev; -} - -#define SYS_TIMER_OFFSET 0x10000ULL -#define CPU_TIMER_OFFSET(cpu) (0x1000ULL * cpu) - -static void slavio_timer_init_all(hwaddr addr, qemu_irq master_irq, - qemu_irq *cpu_irqs, unsigned int num_cpus) -{ - DeviceState *dev; - SysBusDevice *s; - unsigned int i; - - dev = qdev_create(NULL, "slavio_timer"); - qdev_prop_set_uint32(dev, "num_cpus", num_cpus); - qdev_init_nofail(dev); - s = SYS_BUS_DEVICE(dev); - sysbus_connect_irq(s, 0, master_irq); - sysbus_mmio_map(s, 0, addr + SYS_TIMER_OFFSET); - - for (i = 0; i < MAX_CPUS; i++) { - sysbus_mmio_map(s, i + 1, addr + (hwaddr)CPU_TIMER_OFFSET(i)); - sysbus_connect_irq(s, i + 1, cpu_irqs[i]); - } -} - -static qemu_irq slavio_system_powerdown; - -static void slavio_powerdown_req(Notifier *n, void *opaque) -{ - qemu_irq_raise(slavio_system_powerdown); -} - -static Notifier slavio_system_powerdown_notifier = { - .notify = slavio_powerdown_req -}; - -#define MISC_LEDS 0x01600000 -#define MISC_CFG 0x01800000 -#define MISC_DIAG 0x01a00000 -#define MISC_MDM 0x01b00000 -#define MISC_SYS 0x01f00000 - -static void slavio_misc_init(hwaddr base, - hwaddr aux1_base, - hwaddr aux2_base, qemu_irq irq, - qemu_irq fdc_tc) -{ - DeviceState *dev; - SysBusDevice *s; - - dev = qdev_create(NULL, "slavio_misc"); - qdev_init_nofail(dev); - s = SYS_BUS_DEVICE(dev); - if (base) { - /* 8 bit registers */ - /* Slavio control */ - sysbus_mmio_map(s, 0, base + MISC_CFG); - /* Diagnostics */ - sysbus_mmio_map(s, 1, base + MISC_DIAG); - /* Modem control */ - sysbus_mmio_map(s, 2, base + MISC_MDM); - /* 16 bit registers */ - /* ss600mp diag LEDs */ - sysbus_mmio_map(s, 3, base + MISC_LEDS); - /* 32 bit registers */ - /* System control */ - sysbus_mmio_map(s, 4, base + MISC_SYS); - } - if (aux1_base) { - /* AUX 1 (Misc System Functions) */ - sysbus_mmio_map(s, 5, aux1_base); - } - if (aux2_base) { - /* AUX 2 (Software Powerdown Control) */ - sysbus_mmio_map(s, 6, aux2_base); - } - sysbus_connect_irq(s, 0, irq); - sysbus_connect_irq(s, 1, fdc_tc); - slavio_system_powerdown = qdev_get_gpio_in(dev, 0); - qemu_register_powerdown_notifier(&slavio_system_powerdown_notifier); -} - -static void ecc_init(hwaddr base, qemu_irq irq, uint32_t version) -{ - DeviceState *dev; - SysBusDevice *s; - - dev = qdev_create(NULL, "eccmemctl"); - qdev_prop_set_uint32(dev, "version", version); - qdev_init_nofail(dev); - s = SYS_BUS_DEVICE(dev); - sysbus_connect_irq(s, 0, irq); - sysbus_mmio_map(s, 0, base); - if (version == 0) { // SS-600MP only - sysbus_mmio_map(s, 1, base + 0x1000); - } -} - -static void apc_init(hwaddr power_base, qemu_irq cpu_halt) -{ - DeviceState *dev; - SysBusDevice *s; - - dev = qdev_create(NULL, "apc"); - qdev_init_nofail(dev); - s = SYS_BUS_DEVICE(dev); - /* Power management (APC) XXX: not a Slavio device */ - sysbus_mmio_map(s, 0, power_base); - sysbus_connect_irq(s, 0, cpu_halt); -} - -static void tcx_init(hwaddr addr, qemu_irq irq, int vram_size, int width, - int height, int depth) -{ - DeviceState *dev; - SysBusDevice *s; - - dev = qdev_create(NULL, "SUNW,tcx"); - qdev_prop_set_uint32(dev, "vram_size", vram_size); - qdev_prop_set_uint16(dev, "width", width); - qdev_prop_set_uint16(dev, "height", height); - qdev_prop_set_uint16(dev, "depth", depth); - qdev_prop_set_uint64(dev, "prom_addr", addr); - qdev_init_nofail(dev); - s = SYS_BUS_DEVICE(dev); - - /* 10/ROM : FCode ROM */ - sysbus_mmio_map(s, 0, addr); - /* 2/STIP : Stipple */ - sysbus_mmio_map(s, 1, addr + 0x04000000ULL); - /* 3/BLIT : Blitter */ - sysbus_mmio_map(s, 2, addr + 0x06000000ULL); - /* 5/RSTIP : Raw Stipple */ - sysbus_mmio_map(s, 3, addr + 0x0c000000ULL); - /* 6/RBLIT : Raw Blitter */ - sysbus_mmio_map(s, 4, addr + 0x0e000000ULL); - /* 7/TEC : Transform Engine */ - sysbus_mmio_map(s, 5, addr + 0x00700000ULL); - /* 8/CMAP : DAC */ - sysbus_mmio_map(s, 6, addr + 0x00200000ULL); - /* 9/THC : */ - if (depth == 8) { - sysbus_mmio_map(s, 7, addr + 0x00300000ULL); - } else { - sysbus_mmio_map(s, 7, addr + 0x00301000ULL); - } - /* 11/DHC : */ - sysbus_mmio_map(s, 8, addr + 0x00240000ULL); - /* 12/ALT : */ - sysbus_mmio_map(s, 9, addr + 0x00280000ULL); - /* 0/DFB8 : 8-bit plane */ - sysbus_mmio_map(s, 10, addr + 0x00800000ULL); - /* 1/DFB24 : 24bit plane */ - sysbus_mmio_map(s, 11, addr + 0x02000000ULL); - /* 4/RDFB32: Raw framebuffer. Control plane */ - sysbus_mmio_map(s, 12, addr + 0x0a000000ULL); - /* 9/THC24bits : NetBSD writes here even with 8-bit display: dummy */ - if (depth == 8) { - sysbus_mmio_map(s, 13, addr + 0x00301000ULL); - } - - sysbus_connect_irq(s, 0, irq); -} - -static void cg3_init(hwaddr addr, qemu_irq irq, int vram_size, int width, - int height, int depth) -{ - DeviceState *dev; - SysBusDevice *s; - - dev = qdev_create(NULL, "cgthree"); - qdev_prop_set_uint32(dev, "vram-size", vram_size); - qdev_prop_set_uint16(dev, "width", width); - qdev_prop_set_uint16(dev, "height", height); - qdev_prop_set_uint16(dev, "depth", depth); - qdev_prop_set_uint64(dev, "prom-addr", addr); - qdev_init_nofail(dev); - s = SYS_BUS_DEVICE(dev); - - /* FCode ROM */ - sysbus_mmio_map(s, 0, addr); - /* DAC */ - sysbus_mmio_map(s, 1, addr + 0x400000ULL); - /* 8-bit plane */ - sysbus_mmio_map(s, 2, addr + 0x800000ULL); - - sysbus_connect_irq(s, 0, irq); -} - -/* NCR89C100/MACIO Internal ID register */ - -#define TYPE_MACIO_ID_REGISTER "macio_idreg" - -static const uint8_t idreg_data[] = { 0xfe, 0x81, 0x01, 0x03 }; - -static void idreg_init(hwaddr addr) -{ - DeviceState *dev; - SysBusDevice *s; - - dev = qdev_create(NULL, TYPE_MACIO_ID_REGISTER); - qdev_init_nofail(dev); - s = SYS_BUS_DEVICE(dev); - - sysbus_mmio_map(s, 0, addr); - cpu_physical_memory_write_rom(&address_space_memory, - addr, idreg_data, sizeof(idreg_data)); -} - -#define MACIO_ID_REGISTER(obj) \ - OBJECT_CHECK(IDRegState, (obj), TYPE_MACIO_ID_REGISTER) - -typedef struct IDRegState { - SysBusDevice parent_obj; - - MemoryRegion mem; -} IDRegState; - -static int idreg_init1(SysBusDevice *dev) -{ - IDRegState *s = MACIO_ID_REGISTER(dev); - - memory_region_init_ram(&s->mem, OBJECT(s), - "sun4m.idreg", sizeof(idreg_data), &error_abort); - vmstate_register_ram_global(&s->mem); - memory_region_set_readonly(&s->mem, true); - sysbus_init_mmio(dev, &s->mem); - return 0; -} - -static void idreg_class_init(ObjectClass *klass, void *data) -{ - SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass); - - k->init = idreg_init1; -} - -static const TypeInfo idreg_info = { - .name = TYPE_MACIO_ID_REGISTER, - .parent = TYPE_SYS_BUS_DEVICE, - .instance_size = sizeof(IDRegState), - .class_init = idreg_class_init, -}; - -#define TYPE_TCX_AFX "tcx_afx" -#define TCX_AFX(obj) OBJECT_CHECK(AFXState, (obj), TYPE_TCX_AFX) - -typedef struct AFXState { - SysBusDevice parent_obj; - - MemoryRegion mem; -} AFXState; - -/* SS-5 TCX AFX register */ -static void afx_init(hwaddr addr) -{ - DeviceState *dev; - SysBusDevice *s; - - dev = qdev_create(NULL, TYPE_TCX_AFX); - qdev_init_nofail(dev); - s = SYS_BUS_DEVICE(dev); - - sysbus_mmio_map(s, 0, addr); -} - -static int afx_init1(SysBusDevice *dev) -{ - AFXState *s = TCX_AFX(dev); - - memory_region_init_ram(&s->mem, OBJECT(s), "sun4m.afx", 4, &error_abort); - vmstate_register_ram_global(&s->mem); - sysbus_init_mmio(dev, &s->mem); - return 0; -} - -static void afx_class_init(ObjectClass *klass, void *data) -{ - SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass); - - k->init = afx_init1; -} - -static const TypeInfo afx_info = { - .name = TYPE_TCX_AFX, - .parent = TYPE_SYS_BUS_DEVICE, - .instance_size = sizeof(AFXState), - .class_init = afx_class_init, -}; - -#define TYPE_OPENPROM "openprom" -#define OPENPROM(obj) OBJECT_CHECK(PROMState, (obj), TYPE_OPENPROM) - -typedef struct PROMState { - SysBusDevice parent_obj; - - MemoryRegion prom; -} PROMState; - -/* Boot PROM (OpenBIOS) */ -static uint64_t translate_prom_address(void *opaque, uint64_t addr) -{ - hwaddr *base_addr = (hwaddr *)opaque; - return addr + *base_addr - PROM_VADDR; -} - -static void prom_init(hwaddr addr, const char *bios_name) -{ - DeviceState *dev; - SysBusDevice *s; - char *filename; - int ret; - - dev = qdev_create(NULL, TYPE_OPENPROM); - qdev_init_nofail(dev); - s = SYS_BUS_DEVICE(dev); - - sysbus_mmio_map(s, 0, addr); - - /* load boot prom */ - if (bios_name == NULL) { - bios_name = PROM_FILENAME; - } - filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name); - if (filename) { - ret = load_elf(filename, translate_prom_address, &addr, NULL, - NULL, NULL, 1, ELF_MACHINE, 0); - if (ret < 0 || ret > PROM_SIZE_MAX) { - ret = load_image_targphys(filename, addr, PROM_SIZE_MAX); - } - g_free(filename); - } else { - ret = -1; - } - if (ret < 0 || ret > PROM_SIZE_MAX) { - fprintf(stderr, "qemu: could not load prom '%s'\n", bios_name); - exit(1); - } -} - -static int prom_init1(SysBusDevice *dev) -{ - PROMState *s = OPENPROM(dev); - - memory_region_init_ram(&s->prom, OBJECT(s), "sun4m.prom", PROM_SIZE_MAX, - &error_abort); - vmstate_register_ram_global(&s->prom); - memory_region_set_readonly(&s->prom, true); - sysbus_init_mmio(dev, &s->prom); - return 0; -} - -static Property prom_properties[] = { - {/* end of property list */}, -}; - -static void prom_class_init(ObjectClass *klass, void *data) -{ - DeviceClass *dc = DEVICE_CLASS(klass); - SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass); - - k->init = prom_init1; - dc->props = prom_properties; -} - -static const TypeInfo prom_info = { - .name = TYPE_OPENPROM, - .parent = TYPE_SYS_BUS_DEVICE, - .instance_size = sizeof(PROMState), - .class_init = prom_class_init, -}; - -#define TYPE_SUN4M_MEMORY "memory" -#define SUN4M_RAM(obj) OBJECT_CHECK(RamDevice, (obj), TYPE_SUN4M_MEMORY) - -typedef struct RamDevice { - SysBusDevice parent_obj; - - MemoryRegion ram; - uint64_t size; -} RamDevice; - -/* System RAM */ -static int ram_init1(SysBusDevice *dev) -{ - RamDevice *d = SUN4M_RAM(dev); - - memory_region_init_ram(&d->ram, OBJECT(d), "sun4m.ram", d->size, - &error_abort); - vmstate_register_ram_global(&d->ram); - sysbus_init_mmio(dev, &d->ram); - return 0; -} - -static void ram_init(hwaddr addr, ram_addr_t RAM_size, - uint64_t max_mem) -{ - DeviceState *dev; - SysBusDevice *s; - RamDevice *d; - - /* allocate RAM */ - if ((uint64_t)RAM_size > max_mem) { - fprintf(stderr, - "qemu: Too much memory for this machine: %d, maximum %d\n", - (unsigned int)(RAM_size / (1024 * 1024)), - (unsigned int)(max_mem / (1024 * 1024))); - exit(1); - } - dev = qdev_create(NULL, "memory"); - s = SYS_BUS_DEVICE(dev); - - d = SUN4M_RAM(dev); - d->size = RAM_size; - qdev_init_nofail(dev); - - sysbus_mmio_map(s, 0, addr); -} - -static Property ram_properties[] = { - DEFINE_PROP_UINT64("size", RamDevice, size, 0), - DEFINE_PROP_END_OF_LIST(), -}; - -static void ram_class_init(ObjectClass *klass, void *data) -{ - DeviceClass *dc = DEVICE_CLASS(klass); - SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass); - - k->init = ram_init1; - dc->props = ram_properties; -} - -static const TypeInfo ram_info = { - .name = TYPE_SUN4M_MEMORY, - .parent = TYPE_SYS_BUS_DEVICE, - .instance_size = sizeof(RamDevice), - .class_init = ram_class_init, -}; - -static void cpu_devinit(const char *cpu_model, unsigned int id, - uint64_t prom_addr, qemu_irq **cpu_irqs) -{ - CPUState *cs; - SPARCCPU *cpu; - CPUSPARCState *env; - - cpu = cpu_sparc_init(cpu_model); - if (cpu == NULL) { - fprintf(stderr, "qemu: Unable to find Sparc CPU definition\n"); - exit(1); - } - env = &cpu->env; - - cpu_sparc_set_id(env, id); - if (id == 0) { - qemu_register_reset(main_cpu_reset, cpu); - } else { - qemu_register_reset(secondary_cpu_reset, cpu); - cs = CPU(cpu); - cs->halted = 1; - } - *cpu_irqs = qemu_allocate_irqs(cpu_set_irq, cpu, MAX_PILS); - env->prom_addr = prom_addr; -} - -static void dummy_fdc_tc(void *opaque, int irq, int level) -{ -} - -static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, - MachineState *machine) -{ - const char *cpu_model = machine->cpu_model; - unsigned int i; - void *iommu, *espdma, *ledma, *nvram; - qemu_irq *cpu_irqs[MAX_CPUS], slavio_irq[32], slavio_cpu_irq[MAX_CPUS], - espdma_irq, ledma_irq; - qemu_irq esp_reset, dma_enable; - qemu_irq fdc_tc; - qemu_irq *cpu_halt; - unsigned long kernel_size; - DriveInfo *fd[MAX_FD]; - FWCfgState *fw_cfg; - unsigned int num_vsimms; - - /* init CPUs */ - if (!cpu_model) - cpu_model = hwdef->default_cpu_model; - - for(i = 0; i < smp_cpus; i++) { - cpu_devinit(cpu_model, i, hwdef->slavio_base, &cpu_irqs[i]); - } - - for (i = smp_cpus; i < MAX_CPUS; i++) - cpu_irqs[i] = qemu_allocate_irqs(dummy_cpu_set_irq, NULL, MAX_PILS); - - - /* set up devices */ - ram_init(0, machine->ram_size, hwdef->max_mem); - /* models without ECC don't trap when missing ram is accessed */ - if (!hwdef->ecc_base) { - empty_slot_init(machine->ram_size, hwdef->max_mem - machine->ram_size); - } - - prom_init(hwdef->slavio_base, bios_name); - - slavio_intctl = slavio_intctl_init(hwdef->intctl_base, - hwdef->intctl_base + 0x10000ULL, - cpu_irqs); - - for (i = 0; i < 32; i++) { - slavio_irq[i] = qdev_get_gpio_in(slavio_intctl, i); - } - for (i = 0; i < MAX_CPUS; i++) { - slavio_cpu_irq[i] = qdev_get_gpio_in(slavio_intctl, 32 + i); - } - - if (hwdef->idreg_base) { - idreg_init(hwdef->idreg_base); - } - - if (hwdef->afx_base) { - afx_init(hwdef->afx_base); - } - - iommu = iommu_init(hwdef->iommu_base, hwdef->iommu_version, - slavio_irq[30]); - - if (hwdef->iommu_pad_base) { - /* On the real hardware (SS-5, LX) the MMU is not padded, but aliased. - Software shouldn't use aliased addresses, neither should it crash - when does. Using empty_slot instead of aliasing can help with - debugging such accesses */ - empty_slot_init(hwdef->iommu_pad_base,hwdef->iommu_pad_len); - } - - espdma = sparc32_dma_init(hwdef->dma_base, slavio_irq[18], - iommu, &espdma_irq, 0); - - ledma = sparc32_dma_init(hwdef->dma_base + 16ULL, - slavio_irq[16], iommu, &ledma_irq, 1); - - if (graphic_depth != 8 && graphic_depth != 24) { - error_report("Unsupported depth: %d", graphic_depth); - exit (1); - } - num_vsimms = 0; - if (num_vsimms == 0) { - if (vga_interface_type == VGA_CG3) { - if (graphic_depth != 8) { - error_report("Unsupported depth: %d", graphic_depth); - exit(1); - } - - if (!(graphic_width == 1024 && graphic_height == 768) && - !(graphic_width == 1152 && graphic_height == 900)) { - error_report("Unsupported resolution: %d x %d", graphic_width, - graphic_height); - exit(1); - } - - /* sbus irq 5 */ - cg3_init(hwdef->tcx_base, slavio_irq[11], 0x00100000, - graphic_width, graphic_height, graphic_depth); - } else { - /* If no display specified, default to TCX */ - if (graphic_depth != 8 && graphic_depth != 24) { - error_report("Unsupported depth: %d", graphic_depth); - exit(1); - } - - if (!(graphic_width == 1024 && graphic_height == 768)) { - error_report("Unsupported resolution: %d x %d", - graphic_width, graphic_height); - exit(1); - } - - tcx_init(hwdef->tcx_base, slavio_irq[11], 0x00100000, - graphic_width, graphic_height, graphic_depth); - } - } - - for (i = num_vsimms; i < MAX_VSIMMS; i++) { - /* vsimm registers probed by OBP */ - if (hwdef->vsimm[i].reg_base) { - empty_slot_init(hwdef->vsimm[i].reg_base, 0x2000); - } - } - - if (hwdef->sx_base) { - empty_slot_init(hwdef->sx_base, 0x2000); - } - - lance_init(&nd_table[0], hwdef->le_base, ledma, ledma_irq); - - nvram = m48t59_init(slavio_irq[0], hwdef->nvram_base, 0, 0x2000, 8); - - slavio_timer_init_all(hwdef->counter_base, slavio_irq[19], slavio_cpu_irq, smp_cpus); - - slavio_serial_ms_kbd_init(hwdef->ms_kb_base, slavio_irq[14], - display_type == DT_NOGRAPHIC, ESCC_CLOCK, 1); - /* Slavio TTYA (base+4, Linux ttyS0) is the first QEMU serial device - Slavio TTYB (base+0, Linux ttyS1) is the second QEMU serial device */ - escc_init(hwdef->serial_base, slavio_irq[15], slavio_irq[15], - serial_hds[0], serial_hds[1], ESCC_CLOCK, 1); - - cpu_halt = qemu_allocate_irqs(cpu_halt_signal, NULL, 1); - if (hwdef->apc_base) { - apc_init(hwdef->apc_base, cpu_halt[0]); - } - - if (hwdef->fd_base) { - /* there is zero or one floppy drive */ - memset(fd, 0, sizeof(fd)); - fd[0] = drive_get(IF_FLOPPY, 0, 0); - sun4m_fdctrl_init(slavio_irq[22], hwdef->fd_base, fd, - &fdc_tc); - } else { - fdc_tc = *qemu_allocate_irqs(dummy_fdc_tc, NULL, 1); - } - - slavio_misc_init(hwdef->slavio_base, hwdef->aux1_base, hwdef->aux2_base, - slavio_irq[30], fdc_tc); - - if (drive_get_max_bus(IF_SCSI) > 0) { - fprintf(stderr, "qemu: too many SCSI bus\n"); - exit(1); - } - - esp_init(hwdef->esp_base, 2, - espdma_memory_read, espdma_memory_write, - espdma, espdma_irq, &esp_reset, &dma_enable); - - qdev_connect_gpio_out(espdma, 0, esp_reset); - qdev_connect_gpio_out(espdma, 1, dma_enable); - - if (hwdef->cs_base) { - sysbus_create_simple("SUNW,CS4231", hwdef->cs_base, - slavio_irq[5]); - } - - if (hwdef->dbri_base) { - /* ISDN chip with attached CS4215 audio codec */ - /* prom space */ - empty_slot_init(hwdef->dbri_base+0x1000, 0x30); - /* reg space */ - empty_slot_init(hwdef->dbri_base+0x10000, 0x100); - } - - if (hwdef->bpp_base) { - /* parallel port */ - empty_slot_init(hwdef->bpp_base, 0x20); - } - - kernel_size = sun4m_load_kernel(machine->kernel_filename, - machine->initrd_filename, - machine->ram_size); - - nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, machine->kernel_cmdline, - machine->boot_order, machine->ram_size, kernel_size, - graphic_width, graphic_height, graphic_depth, - hwdef->nvram_machine_id, "Sun4m"); - - if (hwdef->ecc_base) - ecc_init(hwdef->ecc_base, slavio_irq[28], - hwdef->ecc_version); - - fw_cfg = fw_cfg_init(0, 0, CFG_ADDR, CFG_ADDR + 2); - fw_cfg_add_i16(fw_cfg, FW_CFG_MAX_CPUS, (uint16_t)max_cpus); - fw_cfg_add_i32(fw_cfg, FW_CFG_ID, 1); - fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size); - fw_cfg_add_i16(fw_cfg, FW_CFG_MACHINE_ID, hwdef->machine_id); - fw_cfg_add_i16(fw_cfg, FW_CFG_SUN4M_DEPTH, graphic_depth); - fw_cfg_add_i16(fw_cfg, FW_CFG_SUN4M_WIDTH, graphic_width); - fw_cfg_add_i16(fw_cfg, FW_CFG_SUN4M_HEIGHT, graphic_height); - fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_ADDR, KERNEL_LOAD_ADDR); - fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_SIZE, kernel_size); - if (machine->kernel_cmdline) { - fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_CMDLINE, CMDLINE_ADDR); - pstrcpy_targphys("cmdline", CMDLINE_ADDR, TARGET_PAGE_SIZE, - machine->kernel_cmdline); - fw_cfg_add_string(fw_cfg, FW_CFG_CMDLINE_DATA, machine->kernel_cmdline); - fw_cfg_add_i32(fw_cfg, FW_CFG_CMDLINE_SIZE, - strlen(machine->kernel_cmdline) + 1); - } else { - fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_CMDLINE, 0); - fw_cfg_add_i32(fw_cfg, FW_CFG_CMDLINE_SIZE, 0); - } - fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_ADDR, INITRD_LOAD_ADDR); - fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_SIZE, 0); // not used - fw_cfg_add_i16(fw_cfg, FW_CFG_BOOT_DEVICE, machine->boot_order[0]); - qemu_register_boot_set(fw_cfg_boot_set, fw_cfg); -} - -enum { - ss5_id = 32, - vger_id, - lx_id, - ss4_id, - scls_id, - sbook_id, - ss10_id = 64, - ss20_id, - ss600mp_id, -}; - -static const struct sun4m_hwdef sun4m_hwdefs[] = { - /* SS-5 */ - { - .iommu_base = 0x10000000, - .iommu_pad_base = 0x10004000, - .iommu_pad_len = 0x0fffb000, - .tcx_base = 0x50000000, - .cs_base = 0x6c000000, - .slavio_base = 0x70000000, - .ms_kb_base = 0x71000000, - .serial_base = 0x71100000, - .nvram_base = 0x71200000, - .fd_base = 0x71400000, - .counter_base = 0x71d00000, - .intctl_base = 0x71e00000, - .idreg_base = 0x78000000, - .dma_base = 0x78400000, - .esp_base = 0x78800000, - .le_base = 0x78c00000, - .apc_base = 0x6a000000, - .afx_base = 0x6e000000, - .aux1_base = 0x71900000, - .aux2_base = 0x71910000, - .nvram_machine_id = 0x80, - .machine_id = ss5_id, - .iommu_version = 0x05000000, - .max_mem = 0x10000000, - .default_cpu_model = "Fujitsu MB86904", - }, - /* SS-10 */ - { - .iommu_base = 0xfe0000000ULL, - .tcx_base = 0xe20000000ULL, - .slavio_base = 0xff0000000ULL, - .ms_kb_base = 0xff1000000ULL, - .serial_base = 0xff1100000ULL, - .nvram_base = 0xff1200000ULL, - .fd_base = 0xff1700000ULL, - .counter_base = 0xff1300000ULL, - .intctl_base = 0xff1400000ULL, - .idreg_base = 0xef0000000ULL, - .dma_base = 0xef0400000ULL, - .esp_base = 0xef0800000ULL, - .le_base = 0xef0c00000ULL, - .apc_base = 0xefa000000ULL, // XXX should not exist - .aux1_base = 0xff1800000ULL, - .aux2_base = 0xff1a01000ULL, - .ecc_base = 0xf00000000ULL, - .ecc_version = 0x10000000, // version 0, implementation 1 - .nvram_machine_id = 0x72, - .machine_id = ss10_id, - .iommu_version = 0x03000000, - .max_mem = 0xf00000000ULL, - .default_cpu_model = "TI SuperSparc II", - }, - /* SS-600MP */ - { - .iommu_base = 0xfe0000000ULL, - .tcx_base = 0xe20000000ULL, - .slavio_base = 0xff0000000ULL, - .ms_kb_base = 0xff1000000ULL, - .serial_base = 0xff1100000ULL, - .nvram_base = 0xff1200000ULL, - .counter_base = 0xff1300000ULL, - .intctl_base = 0xff1400000ULL, - .dma_base = 0xef0081000ULL, - .esp_base = 0xef0080000ULL, - .le_base = 0xef0060000ULL, - .apc_base = 0xefa000000ULL, // XXX should not exist - .aux1_base = 0xff1800000ULL, - .aux2_base = 0xff1a01000ULL, // XXX should not exist - .ecc_base = 0xf00000000ULL, - .ecc_version = 0x00000000, // version 0, implementation 0 - .nvram_machine_id = 0x71, - .machine_id = ss600mp_id, - .iommu_version = 0x01000000, - .max_mem = 0xf00000000ULL, - .default_cpu_model = "TI SuperSparc II", - }, - /* SS-20 */ - { - .iommu_base = 0xfe0000000ULL, - .tcx_base = 0xe20000000ULL, - .slavio_base = 0xff0000000ULL, - .ms_kb_base = 0xff1000000ULL, - .serial_base = 0xff1100000ULL, - .nvram_base = 0xff1200000ULL, - .fd_base = 0xff1700000ULL, - .counter_base = 0xff1300000ULL, - .intctl_base = 0xff1400000ULL, - .idreg_base = 0xef0000000ULL, - .dma_base = 0xef0400000ULL, - .esp_base = 0xef0800000ULL, - .le_base = 0xef0c00000ULL, - .bpp_base = 0xef4800000ULL, - .apc_base = 0xefa000000ULL, // XXX should not exist - .aux1_base = 0xff1800000ULL, - .aux2_base = 0xff1a01000ULL, - .dbri_base = 0xee0000000ULL, - .sx_base = 0xf80000000ULL, - .vsimm = { - { - .reg_base = 0x9c000000ULL, - .vram_base = 0xfc000000ULL - }, { - .reg_base = 0x90000000ULL, - .vram_base = 0xf0000000ULL - }, { - .reg_base = 0x94000000ULL - }, { - .reg_base = 0x98000000ULL - } - }, - .ecc_base = 0xf00000000ULL, - .ecc_version = 0x20000000, // version 0, implementation 2 - .nvram_machine_id = 0x72, - .machine_id = ss20_id, - .iommu_version = 0x13000000, - .max_mem = 0xf00000000ULL, - .default_cpu_model = "TI SuperSparc II", - }, - /* Voyager */ - { - .iommu_base = 0x10000000, - .tcx_base = 0x50000000, - .slavio_base = 0x70000000, - .ms_kb_base = 0x71000000, - .serial_base = 0x71100000, - .nvram_base = 0x71200000, - .fd_base = 0x71400000, - .counter_base = 0x71d00000, - .intctl_base = 0x71e00000, - .idreg_base = 0x78000000, - .dma_base = 0x78400000, - .esp_base = 0x78800000, - .le_base = 0x78c00000, - .apc_base = 0x71300000, // pmc - .aux1_base = 0x71900000, - .aux2_base = 0x71910000, - .nvram_machine_id = 0x80, - .machine_id = vger_id, - .iommu_version = 0x05000000, - .max_mem = 0x10000000, - .default_cpu_model = "Fujitsu MB86904", - }, - /* LX */ - { - .iommu_base = 0x10000000, - .iommu_pad_base = 0x10004000, - .iommu_pad_len = 0x0fffb000, - .tcx_base = 0x50000000, - .slavio_base = 0x70000000, - .ms_kb_base = 0x71000000, - .serial_base = 0x71100000, - .nvram_base = 0x71200000, - .fd_base = 0x71400000, - .counter_base = 0x71d00000, - .intctl_base = 0x71e00000, - .idreg_base = 0x78000000, - .dma_base = 0x78400000, - .esp_base = 0x78800000, - .le_base = 0x78c00000, - .aux1_base = 0x71900000, - .aux2_base = 0x71910000, - .nvram_machine_id = 0x80, - .machine_id = lx_id, - .iommu_version = 0x04000000, - .max_mem = 0x10000000, - .default_cpu_model = "TI MicroSparc I", - }, - /* SS-4 */ - { - .iommu_base = 0x10000000, - .tcx_base = 0x50000000, - .cs_base = 0x6c000000, - .slavio_base = 0x70000000, - .ms_kb_base = 0x71000000, - .serial_base = 0x71100000, - .nvram_base = 0x71200000, - .fd_base = 0x71400000, - .counter_base = 0x71d00000, - .intctl_base = 0x71e00000, - .idreg_base = 0x78000000, - .dma_base = 0x78400000, - .esp_base = 0x78800000, - .le_base = 0x78c00000, - .apc_base = 0x6a000000, - .aux1_base = 0x71900000, - .aux2_base = 0x71910000, - .nvram_machine_id = 0x80, - .machine_id = ss4_id, - .iommu_version = 0x05000000, - .max_mem = 0x10000000, - .default_cpu_model = "Fujitsu MB86904", - }, - /* SPARCClassic */ - { - .iommu_base = 0x10000000, - .tcx_base = 0x50000000, - .slavio_base = 0x70000000, - .ms_kb_base = 0x71000000, - .serial_base = 0x71100000, - .nvram_base = 0x71200000, - .fd_base = 0x71400000, - .counter_base = 0x71d00000, - .intctl_base = 0x71e00000, - .idreg_base = 0x78000000, - .dma_base = 0x78400000, - .esp_base = 0x78800000, - .le_base = 0x78c00000, - .apc_base = 0x6a000000, - .aux1_base = 0x71900000, - .aux2_base = 0x71910000, - .nvram_machine_id = 0x80, - .machine_id = scls_id, - .iommu_version = 0x05000000, - .max_mem = 0x10000000, - .default_cpu_model = "TI MicroSparc I", - }, - /* SPARCbook */ - { - .iommu_base = 0x10000000, - .tcx_base = 0x50000000, // XXX - .slavio_base = 0x70000000, - .ms_kb_base = 0x71000000, - .serial_base = 0x71100000, - .nvram_base = 0x71200000, - .fd_base = 0x71400000, - .counter_base = 0x71d00000, - .intctl_base = 0x71e00000, - .idreg_base = 0x78000000, - .dma_base = 0x78400000, - .esp_base = 0x78800000, - .le_base = 0x78c00000, - .apc_base = 0x6a000000, - .aux1_base = 0x71900000, - .aux2_base = 0x71910000, - .nvram_machine_id = 0x80, - .machine_id = sbook_id, - .iommu_version = 0x05000000, - .max_mem = 0x10000000, - .default_cpu_model = "TI MicroSparc I", - }, -}; - -/* SPARCstation 5 hardware initialisation */ -static void ss5_init(MachineState *machine) -{ - sun4m_hw_init(&sun4m_hwdefs[0], machine); -} - -/* SPARCstation 10 hardware initialisation */ -static void ss10_init(MachineState *machine) -{ - sun4m_hw_init(&sun4m_hwdefs[1], machine); -} - -/* SPARCserver 600MP hardware initialisation */ -static void ss600mp_init(MachineState *machine) -{ - sun4m_hw_init(&sun4m_hwdefs[2], machine); -} - -/* SPARCstation 20 hardware initialisation */ -static void ss20_init(MachineState *machine) -{ - sun4m_hw_init(&sun4m_hwdefs[3], machine); -} - -/* SPARCstation Voyager hardware initialisation */ -static void vger_init(MachineState *machine) -{ - sun4m_hw_init(&sun4m_hwdefs[4], machine); -} - -/* SPARCstation LX hardware initialisation */ -static void ss_lx_init(MachineState *machine) -{ - sun4m_hw_init(&sun4m_hwdefs[5], machine); -} - -/* SPARCstation 4 hardware initialisation */ -static void ss4_init(MachineState *machine) -{ - sun4m_hw_init(&sun4m_hwdefs[6], machine); -} - -/* SPARCClassic hardware initialisation */ -static void scls_init(MachineState *machine) -{ - sun4m_hw_init(&sun4m_hwdefs[7], machine); -} - -/* SPARCbook hardware initialisation */ -static void sbook_init(MachineState *machine) -{ - sun4m_hw_init(&sun4m_hwdefs[8], machine); -} - -static QEMUMachine ss5_machine = { - .name = "SS-5", - .desc = "Sun4m platform, SPARCstation 5", - .init = ss5_init, - .block_default_type = IF_SCSI, - .is_default = 1, - .default_boot_order = "c", -}; - -static QEMUMachine ss10_machine = { - .name = "SS-10", - .desc = "Sun4m platform, SPARCstation 10", - .init = ss10_init, - .block_default_type = IF_SCSI, - .max_cpus = 4, - .default_boot_order = "c", -}; - -static QEMUMachine ss600mp_machine = { - .name = "SS-600MP", - .desc = "Sun4m platform, SPARCserver 600MP", - .init = ss600mp_init, - .block_default_type = IF_SCSI, - .max_cpus = 4, - .default_boot_order = "c", -}; - -static QEMUMachine ss20_machine = { - .name = "SS-20", - .desc = "Sun4m platform, SPARCstation 20", - .init = ss20_init, - .block_default_type = IF_SCSI, - .max_cpus = 4, - .default_boot_order = "c", -}; - -static QEMUMachine voyager_machine = { - .name = "Voyager", - .desc = "Sun4m platform, SPARCstation Voyager", - .init = vger_init, - .block_default_type = IF_SCSI, - .default_boot_order = "c", -}; - -static QEMUMachine ss_lx_machine = { - .name = "LX", - .desc = "Sun4m platform, SPARCstation LX", - .init = ss_lx_init, - .block_default_type = IF_SCSI, - .default_boot_order = "c", -}; - -static QEMUMachine ss4_machine = { - .name = "SS-4", - .desc = "Sun4m platform, SPARCstation 4", - .init = ss4_init, - .block_default_type = IF_SCSI, - .default_boot_order = "c", -}; - -static QEMUMachine scls_machine = { - .name = "SPARCClassic", - .desc = "Sun4m platform, SPARCClassic", - .init = scls_init, - .block_default_type = IF_SCSI, - .default_boot_order = "c", -}; - -static QEMUMachine sbook_machine = { - .name = "SPARCbook", - .desc = "Sun4m platform, SPARCbook", - .init = sbook_init, - .block_default_type = IF_SCSI, - .default_boot_order = "c", -}; - -static void sun4m_register_types(void) -{ - type_register_static(&idreg_info); - type_register_static(&afx_info); - type_register_static(&prom_info); - type_register_static(&ram_info); -} - -static void sun4m_machine_init(void) -{ - qemu_register_machine(&ss5_machine); - qemu_register_machine(&ss10_machine); - qemu_register_machine(&ss600mp_machine); - qemu_register_machine(&ss20_machine); - qemu_register_machine(&voyager_machine); - qemu_register_machine(&ss_lx_machine); - qemu_register_machine(&ss4_machine); - qemu_register_machine(&scls_machine); - qemu_register_machine(&sbook_machine); -} - -type_init(sun4m_register_types) -machine_init(sun4m_machine_init); diff --git a/qemu/include/hw/sparc/sun4m.h b/qemu/include/hw/sparc/sun4m.h deleted file mode 100644 index eb76d541..00000000 --- a/qemu/include/hw/sparc/sun4m.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef SUN4M_H -#define SUN4M_H - -#include "qemu-common.h" -#include "exec/hwaddr.h" -#include "qapi/qmp/types.h" - -/* Devices used by sparc32 system. */ - -/* iommu.c */ -void sparc_iommu_memory_rw(void *opaque, hwaddr addr, - uint8_t *buf, int len, int is_write); -static inline void sparc_iommu_memory_read(void *opaque, - hwaddr addr, - uint8_t *buf, int len) -{ - sparc_iommu_memory_rw(opaque, addr, buf, len, 0); -} - -static inline void sparc_iommu_memory_write(void *opaque, - hwaddr addr, - uint8_t *buf, int len) -{ - sparc_iommu_memory_rw(opaque, addr, buf, len, 1); -} - -#endif diff --git a/qemu/target-sparc/Makefile.objs b/qemu/target-sparc/Makefile.objs index 3e90e91f..a04ffad4 100644 --- a/qemu/target-sparc/Makefile.objs +++ b/qemu/target-sparc/Makefile.objs @@ -1,4 +1,3 @@ -#obj-$(CONFIG_SOFTMMU) += machine.o obj-y += translate.o helper.o cpu.o obj-y += fop_helper.o cc_helper.o win_helper.o mmu_helper.o ldst_helper.o obj-$(TARGET_SPARC) += int32_helper.o diff --git a/qemu/target-sparc/gdbstub.c b/qemu/target-sparc/gdbstub.c deleted file mode 100644 index 3de3242b..00000000 --- a/qemu/target-sparc/gdbstub.c +++ /dev/null @@ -1,208 +0,0 @@ -/* - * SPARC gdb server stub - * - * Copyright (c) 2003-2005 Fabrice Bellard - * Copyright (c) 2013 SUSE LINUX Products GmbH - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see . - */ -#include "config.h" -#include "qemu-common.h" -#include "exec/gdbstub.h" - -#ifdef TARGET_ABI32 -#define gdb_get_rega(buf, val) gdb_get_reg32(buf, val) -#else -#define gdb_get_rega(buf, val) gdb_get_regl(buf, val) -#endif - -int sparc_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) -{ - SPARCCPU *cpu = SPARC_CPU(cs); - CPUSPARCState *env = &cpu->env; - - if (n < 8) { - /* g0..g7 */ - return gdb_get_rega(mem_buf, env->gregs[n]); - } - if (n < 32) { - /* register window */ - return gdb_get_rega(mem_buf, env->regwptr[n - 8]); - } -#if defined(TARGET_ABI32) || !defined(TARGET_SPARC64) - if (n < 64) { - /* fprs */ - if (n & 1) { - return gdb_get_reg32(mem_buf, env->fpr[(n - 32) / 2].l.lower); - } else { - return gdb_get_reg32(mem_buf, env->fpr[(n - 32) / 2].l.upper); - } - } - /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */ - switch (n) { - case 64: - return gdb_get_rega(mem_buf, env->y); - case 65: - return gdb_get_rega(mem_buf, cpu_get_psr(env)); - case 66: - return gdb_get_rega(mem_buf, env->wim); - case 67: - return gdb_get_rega(mem_buf, env->tbr); - case 68: - return gdb_get_rega(mem_buf, env->pc); - case 69: - return gdb_get_rega(mem_buf, env->npc); - case 70: - return gdb_get_rega(mem_buf, env->fsr); - case 71: - return gdb_get_rega(mem_buf, 0); /* csr */ - default: - return gdb_get_rega(mem_buf, 0); - } -#else - if (n < 64) { - /* f0-f31 */ - if (n & 1) { - return gdb_get_reg32(mem_buf, env->fpr[(n - 32) / 2].l.lower); - } else { - return gdb_get_reg32(mem_buf, env->fpr[(n - 32) / 2].l.upper); - } - } - if (n < 80) { - /* f32-f62 (double width, even numbers only) */ - return gdb_get_reg64(mem_buf, env->fpr[(n - 32) / 2].ll); - } - switch (n) { - case 80: - return gdb_get_regl(mem_buf, env->pc); - case 81: - return gdb_get_regl(mem_buf, env->npc); - case 82: - return gdb_get_regl(mem_buf, (cpu_get_ccr(env) << 32) | - ((env->asi & 0xff) << 24) | - ((env->pstate & 0xfff) << 8) | - cpu_get_cwp64(env)); - case 83: - return gdb_get_regl(mem_buf, env->fsr); - case 84: - return gdb_get_regl(mem_buf, env->fprs); - case 85: - return gdb_get_regl(mem_buf, env->y); - } -#endif - return 0; -} - -int sparc_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) -{ - SPARCCPU *cpu = SPARC_CPU(cs); - CPUSPARCState *env = &cpu->env; -#if defined(TARGET_ABI32) - abi_ulong tmp; - - tmp = ldl_p(mem_buf); -#else - target_ulong tmp; - - tmp = ldtul_p(mem_buf); -#endif - - if (n < 8) { - /* g0..g7 */ - env->gregs[n] = tmp; - } else if (n < 32) { - /* register window */ - env->regwptr[n - 8] = tmp; - } -#if defined(TARGET_ABI32) || !defined(TARGET_SPARC64) - else if (n < 64) { - /* fprs */ - /* f0-f31 */ - if (n & 1) { - env->fpr[(n - 32) / 2].l.lower = tmp; - } else { - env->fpr[(n - 32) / 2].l.upper = tmp; - } - } else { - /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */ - switch (n) { - case 64: - env->y = tmp; - break; - case 65: - cpu_put_psr(env, tmp); - break; - case 66: - env->wim = tmp; - break; - case 67: - env->tbr = tmp; - break; - case 68: - env->pc = tmp; - break; - case 69: - env->npc = tmp; - break; - case 70: - env->fsr = tmp; - break; - default: - return 0; - } - } - return 4; -#else - else if (n < 64) { - /* f0-f31 */ - tmp = ldl_p(mem_buf); - if (n & 1) { - env->fpr[(n - 32) / 2].l.lower = tmp; - } else { - env->fpr[(n - 32) / 2].l.upper = tmp; - } - return 4; - } else if (n < 80) { - /* f32-f62 (double width, even numbers only) */ - env->fpr[(n - 32) / 2].ll = tmp; - } else { - switch (n) { - case 80: - env->pc = tmp; - break; - case 81: - env->npc = tmp; - break; - case 82: - cpu_put_ccr(env, tmp >> 32); - env->asi = (tmp >> 24) & 0xff; - env->pstate = (tmp >> 8) & 0xfff; - cpu_put_cwp64(env, tmp & 0xff); - break; - case 83: - env->fsr = tmp; - break; - case 84: - env->fprs = tmp; - break; - case 85: - env->y = tmp; - break; - default: - return 0; - } - } - return 8; -#endif -} diff --git a/qemu/target-sparc/machine.c b/qemu/target-sparc/machine.c deleted file mode 100644 index 3f3de4c6..00000000 --- a/qemu/target-sparc/machine.c +++ /dev/null @@ -1,218 +0,0 @@ -#include "hw/hw.h" -#include "hw/boards.h" -#include "qemu/timer.h" - -#include "cpu.h" - -void cpu_save(QEMUFile *f, void *opaque) -{ - CPUSPARCState *env = opaque; - int i; - uint32_t tmp; - - // if env->cwp == env->nwindows - 1, this will set the ins of the last - // window as the outs of the first window - cpu_set_cwp(env, env->cwp); - - for(i = 0; i < 8; i++) - qemu_put_betls(f, &env->gregs[i]); - qemu_put_be32s(f, &env->nwindows); - for(i = 0; i < env->nwindows * 16; i++) - qemu_put_betls(f, &env->regbase[i]); - - /* FPU */ - for (i = 0; i < TARGET_DPREGS; i++) { - qemu_put_be32(f, env->fpr[i].l.upper); - qemu_put_be32(f, env->fpr[i].l.lower); - } - - qemu_put_betls(f, &env->pc); - qemu_put_betls(f, &env->npc); - qemu_put_betls(f, &env->y); - tmp = cpu_get_psr(env); - qemu_put_be32(f, tmp); - qemu_put_betls(f, &env->fsr); - qemu_put_betls(f, &env->tbr); - tmp = env->interrupt_index; - qemu_put_be32(f, tmp); - qemu_put_be32s(f, &env->pil_in); -#ifndef TARGET_SPARC64 - qemu_put_be32s(f, &env->wim); - /* MMU */ - for (i = 0; i < 32; i++) - qemu_put_be32s(f, &env->mmuregs[i]); - for (i = 0; i < 4; i++) { - qemu_put_be64s(f, &env->mxccdata[i]); - } - for (i = 0; i < 8; i++) { - qemu_put_be64s(f, &env->mxccregs[i]); - } - qemu_put_be32s(f, &env->mmubpctrv); - qemu_put_be32s(f, &env->mmubpctrc); - qemu_put_be32s(f, &env->mmubpctrs); - qemu_put_be64s(f, &env->mmubpaction); - for (i = 0; i < 4; i++) { - qemu_put_be64s(f, &env->mmubpregs[i]); - } -#else - qemu_put_be64s(f, &env->lsu); - for (i = 0; i < 16; i++) { - qemu_put_be64s(f, &env->immuregs[i]); - qemu_put_be64s(f, &env->dmmuregs[i]); - } - for (i = 0; i < 64; i++) { - qemu_put_be64s(f, &env->itlb[i].tag); - qemu_put_be64s(f, &env->itlb[i].tte); - qemu_put_be64s(f, &env->dtlb[i].tag); - qemu_put_be64s(f, &env->dtlb[i].tte); - } - qemu_put_be32s(f, &env->mmu_version); - for (i = 0; i < MAXTL_MAX; i++) { - qemu_put_be64s(f, &env->ts[i].tpc); - qemu_put_be64s(f, &env->ts[i].tnpc); - qemu_put_be64s(f, &env->ts[i].tstate); - qemu_put_be32s(f, &env->ts[i].tt); - } - qemu_put_be32s(f, &env->xcc); - qemu_put_be32s(f, &env->asi); - qemu_put_be32s(f, &env->pstate); - qemu_put_be32s(f, &env->tl); - qemu_put_be32s(f, &env->cansave); - qemu_put_be32s(f, &env->canrestore); - qemu_put_be32s(f, &env->otherwin); - qemu_put_be32s(f, &env->wstate); - qemu_put_be32s(f, &env->cleanwin); - for (i = 0; i < 8; i++) - qemu_put_be64s(f, &env->agregs[i]); - for (i = 0; i < 8; i++) - qemu_put_be64s(f, &env->bgregs[i]); - for (i = 0; i < 8; i++) - qemu_put_be64s(f, &env->igregs[i]); - for (i = 0; i < 8; i++) - qemu_put_be64s(f, &env->mgregs[i]); - qemu_put_be64s(f, &env->fprs); - qemu_put_be64s(f, &env->tick_cmpr); - qemu_put_be64s(f, &env->stick_cmpr); - cpu_put_timer(f, env->tick); - cpu_put_timer(f, env->stick); - qemu_put_be64s(f, &env->gsr); - qemu_put_be32s(f, &env->gl); - qemu_put_be64s(f, &env->hpstate); - for (i = 0; i < MAXTL_MAX; i++) - qemu_put_be64s(f, &env->htstate[i]); - qemu_put_be64s(f, &env->hintp); - qemu_put_be64s(f, &env->htba); - qemu_put_be64s(f, &env->hver); - qemu_put_be64s(f, &env->hstick_cmpr); - qemu_put_be64s(f, &env->ssr); - cpu_put_timer(f, env->hstick); -#endif -} - -int cpu_load(QEMUFile *f, void *opaque, int version_id) -{ - CPUSPARCState *env = opaque; - SPARCCPU *cpu = sparc_env_get_cpu(env); - int i; - uint32_t tmp; - - if (version_id < 6) - return -EINVAL; - for(i = 0; i < 8; i++) - qemu_get_betls(f, &env->gregs[i]); - qemu_get_be32s(f, &env->nwindows); - for(i = 0; i < env->nwindows * 16; i++) - qemu_get_betls(f, &env->regbase[i]); - - /* FPU */ - for (i = 0; i < TARGET_DPREGS; i++) { - env->fpr[i].l.upper = qemu_get_be32(f); - env->fpr[i].l.lower = qemu_get_be32(f); - } - - qemu_get_betls(f, &env->pc); - qemu_get_betls(f, &env->npc); - qemu_get_betls(f, &env->y); - tmp = qemu_get_be32(f); - env->cwp = 0; /* needed to ensure that the wrapping registers are - correctly updated */ - cpu_put_psr(env, tmp); - qemu_get_betls(f, &env->fsr); - qemu_get_betls(f, &env->tbr); - tmp = qemu_get_be32(f); - env->interrupt_index = tmp; - qemu_get_be32s(f, &env->pil_in); -#ifndef TARGET_SPARC64 - qemu_get_be32s(f, &env->wim); - /* MMU */ - for (i = 0; i < 32; i++) - qemu_get_be32s(f, &env->mmuregs[i]); - for (i = 0; i < 4; i++) { - qemu_get_be64s(f, &env->mxccdata[i]); - } - for (i = 0; i < 8; i++) { - qemu_get_be64s(f, &env->mxccregs[i]); - } - qemu_get_be32s(f, &env->mmubpctrv); - qemu_get_be32s(f, &env->mmubpctrc); - qemu_get_be32s(f, &env->mmubpctrs); - qemu_get_be64s(f, &env->mmubpaction); - for (i = 0; i < 4; i++) { - qemu_get_be64s(f, &env->mmubpregs[i]); - } -#else - qemu_get_be64s(f, &env->lsu); - for (i = 0; i < 16; i++) { - qemu_get_be64s(f, &env->immuregs[i]); - qemu_get_be64s(f, &env->dmmuregs[i]); - } - for (i = 0; i < 64; i++) { - qemu_get_be64s(f, &env->itlb[i].tag); - qemu_get_be64s(f, &env->itlb[i].tte); - qemu_get_be64s(f, &env->dtlb[i].tag); - qemu_get_be64s(f, &env->dtlb[i].tte); - } - qemu_get_be32s(f, &env->mmu_version); - for (i = 0; i < MAXTL_MAX; i++) { - qemu_get_be64s(f, &env->ts[i].tpc); - qemu_get_be64s(f, &env->ts[i].tnpc); - qemu_get_be64s(f, &env->ts[i].tstate); - qemu_get_be32s(f, &env->ts[i].tt); - } - qemu_get_be32s(f, &env->xcc); - qemu_get_be32s(f, &env->asi); - qemu_get_be32s(f, &env->pstate); - qemu_get_be32s(f, &env->tl); - qemu_get_be32s(f, &env->cansave); - qemu_get_be32s(f, &env->canrestore); - qemu_get_be32s(f, &env->otherwin); - qemu_get_be32s(f, &env->wstate); - qemu_get_be32s(f, &env->cleanwin); - for (i = 0; i < 8; i++) - qemu_get_be64s(f, &env->agregs[i]); - for (i = 0; i < 8; i++) - qemu_get_be64s(f, &env->bgregs[i]); - for (i = 0; i < 8; i++) - qemu_get_be64s(f, &env->igregs[i]); - for (i = 0; i < 8; i++) - qemu_get_be64s(f, &env->mgregs[i]); - qemu_get_be64s(f, &env->fprs); - qemu_get_be64s(f, &env->tick_cmpr); - qemu_get_be64s(f, &env->stick_cmpr); - cpu_get_timer(f, env->tick); - cpu_get_timer(f, env->stick); - qemu_get_be64s(f, &env->gsr); - qemu_get_be32s(f, &env->gl); - qemu_get_be64s(f, &env->hpstate); - for (i = 0; i < MAXTL_MAX; i++) - qemu_get_be64s(f, &env->htstate[i]); - qemu_get_be64s(f, &env->hintp); - qemu_get_be64s(f, &env->htba); - qemu_get_be64s(f, &env->hver); - qemu_get_be64s(f, &env->hstick_cmpr); - qemu_get_be64s(f, &env->ssr); - cpu_get_timer(f, env->hstick); -#endif - tlb_flush(CPU(cpu), 1); - return 0; -} From a735576dd3b2ac6199b38f4c16bf3157066c69eb Mon Sep 17 00:00:00 2001 From: Nguyen Anh Quynh Date: Tue, 24 Jan 2017 12:47:27 +0800 Subject: [PATCH 14/31] python: support uc_mem_regions() API --- bindings/python/unicorn/unicorn.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/bindings/python/unicorn/unicorn.py b/bindings/python/unicorn/unicorn.py index b1e48d73..18751ae4 100644 --- a/bindings/python/unicorn/unicorn.py +++ b/bindings/python/unicorn/unicorn.py @@ -105,6 +105,14 @@ uc_engine = ctypes.c_void_p uc_context = ctypes.c_void_p uc_hook_h = ctypes.c_size_t +class _uc_mem_region(ctypes.Structure): + _fields_ = [ + ("begin", ctypes.c_uint64), + ("end", ctypes.c_uint64), + ("perms", ctypes.c_uint32), + ] + + _setup_prototype(_uc, "uc_version", ctypes.c_uint, ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int)) _setup_prototype(_uc, "uc_arch_supported", ctypes.c_bool, ctypes.c_int) _setup_prototype(_uc, "uc_open", ucerr, ctypes.c_uint, ctypes.c_uint, ctypes.POINTER(uc_engine)) @@ -127,6 +135,7 @@ _setup_prototype(_uc, "uc_context_alloc", ucerr, uc_engine, ctypes.POINTER(uc_co _setup_prototype(_uc, "uc_free", ucerr, ctypes.c_void_p) _setup_prototype(_uc, "uc_context_save", ucerr, uc_engine, uc_context) _setup_prototype(_uc, "uc_context_restore", ucerr, uc_engine, uc_context) +_setup_prototype(_uc, "uc_mem_regions", ucerr, uc_engine, ctypes.POINTER(ctypes.POINTER(_uc_mem_region)), ctypes.POINTER(ctypes.c_uint32)) # uc_hook_add is special due to variable number of arguments _uc.uc_hook_add = _uc.uc_hook_add @@ -508,6 +517,21 @@ class Uc(object): if status != uc.UC_ERR_OK: raise UcError(status) + # this returns a generator of regions in the form (begin, end, perms) + def mem_regions(self): + regions = ctypes.POINTER(_uc_mem_region)() + count = ctypes.c_uint32() + status = _uc.uc_mem_regions(self._uch, ctypes.byref(regions), ctypes.byref(count)) + if status != uc.UC_ERR_OK: + raise UcError(status) + + try: + for i in range(count.value): + yield (regions[i].begin, regions[i].end, regions[i].perms) + finally: + _uc.uc_free(regions) + + class SavedContext(object): def __init__(self, pointer): self.pointer = pointer From 053ecd7bf4c3eb869fb93cb13c1e4c9cd4658636 Mon Sep 17 00:00:00 2001 From: Parker Thompson Date: Tue, 24 Jan 2017 19:56:19 -0800 Subject: [PATCH 15/31] Added ARM coproc registers (#684) * Added ARM coproc registers * Added regression test for vfp --- include/unicorn/arm.h | 3 ++ qemu/target-arm/unicorn_arm.c | 19 ++++++++++ tests/regress/arm_enable_vfp.c | 65 ++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+) create mode 100644 tests/regress/arm_enable_vfp.c diff --git a/include/unicorn/arm.h b/include/unicorn/arm.h index 783e418f..1293be0d 100644 --- a/include/unicorn/arm.h +++ b/include/unicorn/arm.h @@ -24,6 +24,9 @@ typedef enum uc_arm_reg { UC_ARM_REG_FPSCR_NZCV, UC_ARM_REG_FPSID, UC_ARM_REG_ITSTATE, + UC_ARM_REG_C1_C0_2, + UC_ARM_REG_C13_C0_2, + UC_ARM_REG_C13_C0_3, UC_ARM_REG_LR, UC_ARM_REG_PC, UC_ARM_REG_SP, diff --git a/qemu/target-arm/unicorn_arm.c b/qemu/target-arm/unicorn_arm.c index 69f7363a..7bb985e2 100644 --- a/qemu/target-arm/unicorn_arm.c +++ b/qemu/target-arm/unicorn_arm.c @@ -77,6 +77,15 @@ int arm_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int coun case UC_ARM_REG_R15: *(int32_t *)value = ARM_CPU(uc, mycpu)->env.regs[15]; break; + case UC_ARM_REG_C1_C0_2: + *(int32_t *)value = ARM_CPU(uc, mycpu)->env.cp15.c1_coproc; + break; + case UC_ARM_REG_C13_C0_3: + *(int32_t *)value = ARM_CPU(uc, mycpu)->env.cp15.tpidrro_el0; + break; + case UC_ARM_REG_FPEXC: + *(int32_t *)value = ARM_CPU(uc, mycpu)->env.vfp.xregs[ARM_VFP_FPEXC]; + break; } } } @@ -119,6 +128,16 @@ int arm_reg_write(struct uc_struct *uc, unsigned int *regs, void* const* vals, i uc->quit_request = true; uc_emu_stop(uc); + break; + case UC_ARM_REG_C1_C0_2: + ARM_CPU(uc, mycpu)->env.cp15.c1_coproc = *(int32_t *)value; + break; + + case UC_ARM_REG_C13_C0_3: + ARM_CPU(uc, mycpu)->env.cp15.tpidrro_el0 = *(int32_t *)value; + break; + case UC_ARM_REG_FPEXC: + ARM_CPU(uc, mycpu)->env.vfp.xregs[ARM_VFP_FPEXC] = *(int32_t *)value; break; } } diff --git a/tests/regress/arm_enable_vfp.c b/tests/regress/arm_enable_vfp.c new file mode 100644 index 00000000..aebcd983 --- /dev/null +++ b/tests/regress/arm_enable_vfp.c @@ -0,0 +1,65 @@ +#include +#include +#include +#include + +#define ADDRESS 0x1000 +#define ARM_VMOV "\xC0\xEF\x10\x00" // VMOV.I32 D16, #0 ; Vector Move + +int main() +{ + uc_engine *uc; + uc_err err; + + err = uc_open(UC_ARCH_ARM, UC_MODE_ARM, &uc); + if (err) { + printf("uc_open %d\n", err); + return 1; + } + + uint64_t tmp_val; + + err = uc_reg_read(uc, UC_ARM_REG_C1_C0_2, &tmp_val); + if (err) { + printf("uc_open %d\n", err); + return 1; + } + + tmp_val = tmp_val | (0xf << 20); + err = uc_reg_write(uc, UC_ARM_REG_C1_C0_2, &tmp_val); + if (err) { + printf("uc_open %d\n", err); + return 1; + } + + size_t enable_vfp = 0x40000000; + err = uc_reg_write(uc, UC_ARM_REG_FPEXC, &enable_vfp); + if (err) { + printf("uc_open %d\n", err); + return 1; + } + + err = uc_mem_map(uc, ADDRESS, 4 * 1024, UC_PROT_ALL); + if (err) { + printf("uc_mem_map %d\n", err); + return 1; + } + + err = uc_mem_write(uc, ADDRESS, ARM_VMOV, sizeof(ARM_VMOV) - 1); + if (err) { + printf("uc_mem_map %s\n", uc_strerror(err)); + return 1; + } + + err = uc_emu_start(uc, ADDRESS, 0, 0, 1); + if (err) { + printf("uc_emu_start: %s\n", uc_strerror(err)); + return 1; + } + + printf("Success\n"); + + uc_close(uc); + + return 0; +} From b616115df15d688a331d60a6e6f47a5d4e898249 Mon Sep 17 00:00:00 2001 From: Nguyen Anh Quynh Date: Wed, 25 Jan 2017 12:00:18 +0800 Subject: [PATCH 16/31] update ChangeLog --- ChangeLog | 18 +++++++++++++++++- bindings/dotnet/UnicornManaged/Const/Arm.fs | 5 ++++- bindings/go/unicorn/arm_const.go | 5 ++++- bindings/java/unicorn/ArmConst.java | 5 ++++- bindings/python/unicorn/arm_const.py | 5 ++++- .../ruby/unicorn_gem/lib/unicorn/arm_const.rb | 5 ++++- include/unicorn/arm.h | 7 ++++--- 7 files changed, 41 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 339e11c4..2573431d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,23 @@ This file details the changelog of Unicorn Engine. ---------------------------------- -[Version 1.0-rc2]: Janyary 4th, 2017 +[Version 1.0-rc3]: Janyary 25st, 2017 + +- Rename API uc_context_free() to uc_free(). +- ARM: + - uc_reg_write() now can modify CPSR register. + - Add some ARM coproc registers. +- ARM64: uc_reg_read|write() now handles W0-W31 registers. +- Windows: fix a double free bug in uc_close(). +- New VB6 binding. +- Java: update to support new APIs from v1.0-rc1. +- Python: + - Fix memory leaking that prevents UC instances from being GC. + - Remove some dependencies leftover from glib time. + - Add new method mem_regions() (linked to uc_mem_regions() API) + +---------------------------------- +[Version 1.0-rc2]: January 4th, 2017 - Remove glib & pkconfig dependency. - Python: fix an issue to restore support for FreeBSD (and other *BSD Unix). diff --git a/bindings/dotnet/UnicornManaged/Const/Arm.fs b/bindings/dotnet/UnicornManaged/Const/Arm.fs index 34eb91b6..00e511e8 100644 --- a/bindings/dotnet/UnicornManaged/Const/Arm.fs +++ b/bindings/dotnet/UnicornManaged/Const/Arm.fs @@ -120,7 +120,10 @@ module Arm = let UC_ARM_REG_S29 = 108 let UC_ARM_REG_S30 = 109 let UC_ARM_REG_S31 = 110 - let UC_ARM_REG_ENDING = 111 + let UC_ARM_REG_C1_C0_2 = 111 + let UC_ARM_REG_C13_C0_2 = 112 + let UC_ARM_REG_C13_C0_3 = 113 + let UC_ARM_REG_ENDING = 114 // alias registers let UC_ARM_REG_R13 = 12 diff --git a/bindings/go/unicorn/arm_const.go b/bindings/go/unicorn/arm_const.go index 60b57d20..e2cb8e8c 100644 --- a/bindings/go/unicorn/arm_const.go +++ b/bindings/go/unicorn/arm_const.go @@ -115,7 +115,10 @@ const ( ARM_REG_S29 = 108 ARM_REG_S30 = 109 ARM_REG_S31 = 110 - ARM_REG_ENDING = 111 + ARM_REG_C1_C0_2 = 111 + ARM_REG_C13_C0_2 = 112 + ARM_REG_C13_C0_3 = 113 + ARM_REG_ENDING = 114 // alias registers ARM_REG_R13 = 12 diff --git a/bindings/java/unicorn/ArmConst.java b/bindings/java/unicorn/ArmConst.java index b2c4644a..e3484ca3 100644 --- a/bindings/java/unicorn/ArmConst.java +++ b/bindings/java/unicorn/ArmConst.java @@ -117,7 +117,10 @@ public interface ArmConst { public static final int UC_ARM_REG_S29 = 108; public static final int UC_ARM_REG_S30 = 109; public static final int UC_ARM_REG_S31 = 110; - public static final int UC_ARM_REG_ENDING = 111; + public static final int UC_ARM_REG_C1_C0_2 = 111; + public static final int UC_ARM_REG_C13_C0_2 = 112; + public static final int UC_ARM_REG_C13_C0_3 = 113; + public static final int UC_ARM_REG_ENDING = 114; // alias registers public static final int UC_ARM_REG_R13 = 12; diff --git a/bindings/python/unicorn/arm_const.py b/bindings/python/unicorn/arm_const.py index 703dce33..fc74742c 100644 --- a/bindings/python/unicorn/arm_const.py +++ b/bindings/python/unicorn/arm_const.py @@ -113,7 +113,10 @@ UC_ARM_REG_S28 = 107 UC_ARM_REG_S29 = 108 UC_ARM_REG_S30 = 109 UC_ARM_REG_S31 = 110 -UC_ARM_REG_ENDING = 111 +UC_ARM_REG_C1_C0_2 = 111 +UC_ARM_REG_C13_C0_2 = 112 +UC_ARM_REG_C13_C0_3 = 113 +UC_ARM_REG_ENDING = 114 # alias registers UC_ARM_REG_R13 = 12 diff --git a/bindings/ruby/unicorn_gem/lib/unicorn/arm_const.rb b/bindings/ruby/unicorn_gem/lib/unicorn/arm_const.rb index 2a80d44c..50e7852e 100644 --- a/bindings/ruby/unicorn_gem/lib/unicorn/arm_const.rb +++ b/bindings/ruby/unicorn_gem/lib/unicorn/arm_const.rb @@ -115,7 +115,10 @@ module Unicorn UC_ARM_REG_S29 = 108 UC_ARM_REG_S30 = 109 UC_ARM_REG_S31 = 110 - UC_ARM_REG_ENDING = 111 + UC_ARM_REG_C1_C0_2 = 111 + UC_ARM_REG_C13_C0_2 = 112 + UC_ARM_REG_C13_C0_3 = 113 + UC_ARM_REG_ENDING = 114 # alias registers UC_ARM_REG_R13 = 12 diff --git a/include/unicorn/arm.h b/include/unicorn/arm.h index 1293be0d..2bf053e2 100644 --- a/include/unicorn/arm.h +++ b/include/unicorn/arm.h @@ -24,9 +24,6 @@ typedef enum uc_arm_reg { UC_ARM_REG_FPSCR_NZCV, UC_ARM_REG_FPSID, UC_ARM_REG_ITSTATE, - UC_ARM_REG_C1_C0_2, - UC_ARM_REG_C13_C0_2, - UC_ARM_REG_C13_C0_3, UC_ARM_REG_LR, UC_ARM_REG_PC, UC_ARM_REG_SP, @@ -129,6 +126,10 @@ typedef enum uc_arm_reg { UC_ARM_REG_S30, UC_ARM_REG_S31, + UC_ARM_REG_C1_C0_2, + UC_ARM_REG_C13_C0_2, + UC_ARM_REG_C13_C0_3, + UC_ARM_REG_ENDING, // <-- mark the end of the list or registers //> alias registers From 7854bf9e574d7d69b367d0f64fc650d545f7877a Mon Sep 17 00:00:00 2001 From: Nguyen Anh Quynh Date: Wed, 25 Jan 2017 12:02:41 +0800 Subject: [PATCH 17/31] typo --- ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 2573431d..3d1ac99a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,7 @@ This file details the changelog of Unicorn Engine. ---------------------------------- -[Version 1.0-rc3]: Janyary 25st, 2017 +[Version 1.0-rc3]: January 25st, 2017 - Rename API uc_context_free() to uc_free(). - ARM: From 1d73d72c6952c6eb3e13967e2d6b70d5e03f49f8 Mon Sep 17 00:00:00 2001 From: Nguyen Anh Quynh Date: Wed, 25 Jan 2017 12:03:09 +0800 Subject: [PATCH 18/31] typo --- ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 3d1ac99a..6a0bdae2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,7 @@ This file details the changelog of Unicorn Engine. ---------------------------------- -[Version 1.0-rc3]: January 25st, 2017 +[Version 1.0-rc3]: January 25th, 2017 - Rename API uc_context_free() to uc_free(). - ARM: From c961e1a4d5a5c7d4281de736aacd01e3bd16c40e Mon Sep 17 00:00:00 2001 From: Nguyen Anh Quynh Date: Wed, 25 Jan 2017 22:01:54 +0800 Subject: [PATCH 19/31] bump package name to 1.0-rc3 --- pkgconfig.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgconfig.mk b/pkgconfig.mk index ec2a14c6..1dd1e8ae 100644 --- a/pkgconfig.mk +++ b/pkgconfig.mk @@ -10,4 +10,4 @@ PKG_MINOR = 0 PKG_EXTRA = 0 # version tag. Examples: rc1, b2, post1 -PKG_TAG = rc2 +PKG_TAG = rc3 From 89d536df5a740f518fb5455bca4b35e3d648d72b Mon Sep 17 00:00:00 2001 From: hedger Date: Sun, 29 Jan 2017 03:12:38 +0300 Subject: [PATCH 20/31] Fixed build script for *BSD (#743) --- make.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/make.sh b/make.sh index e8cc2eb0..538c93e2 100755 --- a/make.sh +++ b/make.sh @@ -80,6 +80,10 @@ uninstall() { fi } +[ -z "${UNAME}" ] && UNAME=$(uname) +[ -z "${MAKE}" ] && MAKE=make +#[ -n "${MAKE_JOBS}" ] && MAKE="$MAKE -j${MAKE_JOBS}" + if [ "$UNAME" = SunOS ]; then [ -z "${MAKE}" ] && MAKE=gmake INSTALL_BIN=ginstall @@ -91,9 +95,6 @@ if [ -n "`echo "$UNAME" | grep BSD`" ]; then PREFIX="${PREFIX-/usr/local}" fi -[ -z "${UNAME}" ] && UNAME=$(uname) -[ -z "${MAKE}" ] && MAKE=make -#[ -n "${MAKE_JOBS}" ] && MAKE="$MAKE -j${MAKE_JOBS}" export CC INSTALL_BIN PREFIX PKGCFGDIR LIBDIRARCH LIBARCHS CFLAGS LDFLAGS case "$1" in From eb4dc61c66482cf075367903f60bad41320bc66a Mon Sep 17 00:00:00 2001 From: Sascha Schirra Date: Sun, 29 Jan 2017 01:13:17 +0100 Subject: [PATCH 21/31] Updated ruby bindings (#744) * added methods for uc_context_save, uc_context_restore * added test for context_save * changed version of the lib --- bindings/ruby/Makefile | 2 +- bindings/ruby/sample_x86.rb | 45 +++++++++++++++++++- bindings/ruby/unicorn_gem/ext/unicorn.c | 55 +++++++++++++++++++++++++ bindings/ruby/unicorn_gem/ext/unicorn.h | 5 ++- 4 files changed, 104 insertions(+), 3 deletions(-) diff --git a/bindings/ruby/Makefile b/bindings/ruby/Makefile index 6fa1faf3..2eb376eb 100644 --- a/bindings/ruby/Makefile +++ b/bindings/ruby/Makefile @@ -5,7 +5,7 @@ # Use bundle install && rake to install gem and test install: gen_const cd unicorn_gem && rake build - cd unicorn_gem && gem install --local pkg/unicorn-0.9.0.gem + cd unicorn_gem && gem install --local pkg/unicorn-1.0.0.gem gen_const: cd .. && python const_generator.py ruby diff --git a/bindings/ruby/sample_x86.rb b/bindings/ruby/sample_x86.rb index 86496d9b..9a9740e6 100644 --- a/bindings/ruby/sample_x86.rb +++ b/bindings/ruby/sample_x86.rb @@ -258,7 +258,7 @@ def test_i386_invalid_mem_write() r_ecx = mu.reg_read(UC_X86_REG_ECX) r_edx = mu.reg_read(UC_X86_REG_EDX) - puts ">>> ECX = 0x%x" % r_ecx + puts ">>> ECX = 0x%x" % r_ecx puts ">>> EDX = 0x%x" % r_edx begin @@ -282,6 +282,47 @@ def test_i386_invalid_mem_write() end end +def test_i386_context_save() + + puts("Save/restore CPU context in opaque blob") + address = 0 + code = '\x40' # inc eax + begin + # Initialize emulator + mu = Uc.new UC_ARCH_X86, UC_MODE_32 + + # map 8KB memory for this emulation + mu.mem_map(address, 8 * 1024, UC_PROT_ALL) + + # write machine code to be emulated to memory + mu.mem_write(address, code) + + # set eax to 1 + mu.reg_write(UC_X86_REG_EAX, 1) + + puts(">>> Running emulation for the first time") + mu.emu_start(address, address+1) + + puts(">>> Emulation done. Below is the CPU context") + puts(">>> EAX = 0x%x" %(mu.reg_read(UC_X86_REG_EAX))) + puts(">>> Saving CPU context") + saved_context = mu.context_save() + + puts(">>> Running emulation for the second time") + mu.emu_start(address, address+1) + puts(">>> Emulation done. Below is the CPU context") + puts(">>> EAX = 0x%x" %(mu.reg_read(UC_X86_REG_EAX))) + + puts(">>> CPU context restored. Below is the CPU context") + mu.context_restore(saved_context) + puts(">>> EAX = 0x%x" %(mu.reg_read(UC_X86_REG_EAX))) + + rescue UcError => e + puts("ERROR: %s" % e) + end + +end + # Test X86 32 bit with IN/OUT instruction def test_i386_inout() puts("Emulate i386 code with IN/OUT instructions") @@ -500,6 +541,8 @@ test_i386_invalid_mem_read() puts("=" * 20) test_i386_invalid_mem_write() puts("=" * 20) +test_i386_context_save() +puts("=" * 20) test_i386_inout() puts("=" * 20) test_x86_64() diff --git a/bindings/ruby/unicorn_gem/ext/unicorn.c b/bindings/ruby/unicorn_gem/ext/unicorn.c index bd23086c..ea20f10b 100644 --- a/bindings/ruby/unicorn_gem/ext/unicorn.c +++ b/bindings/ruby/unicorn_gem/ext/unicorn.c @@ -26,12 +26,14 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. VALUE UnicornModule = Qnil; VALUE UcClass = Qnil; VALUE UcError = Qnil; +VALUE SavedContext = Qnil; void Init_unicorn() { rb_require("unicorn/unicorn_const"); UnicornModule = rb_define_module("Unicorn"); UcError = rb_define_class_under(UnicornModule, "UcError", rb_eStandardError); + SavedContext = rb_define_class_under(UnicornModule, "SavedContext", rb_cObject); UcClass = rb_define_class_under(UnicornModule, "Uc", rb_cObject); rb_define_method(UcClass, "initialize", m_uc_initialize, 2); @@ -47,6 +49,9 @@ void Init_unicorn() { rb_define_method(UcClass, "hook_add", m_uc_hook_add, -1); rb_define_method(UcClass, "hook_del", m_uc_hook_del, 1); rb_define_method(UcClass, "query", m_uc_hook_del, 1); + rb_define_method(UcClass, "context_save", m_uc_context_save, 0); + rb_define_method(UcClass, "context_update", m_uc_context_update, 1); + rb_define_method(UcClass, "contest_restore", m_uc_context_restore, 1); } VALUE m_uc_initialize(VALUE self, VALUE arch, VALUE mode) { @@ -422,3 +427,53 @@ VALUE m_uc_query(VALUE self, VALUE query_mode){ } return INT2NUM(result); } + +VALUE m_uc_context_save(VALUE self){ + uc_err err; + uc_engine *_uc; + Data_Get_Struct(rb_iv_get(self,"@uch"), uc_engine, _uc); + + uc_context *_context; + err = uc_context_alloc(_uc, &_context); + if (err != UC_ERR_OK) { + rb_raise(UcError, "%s", uc_strerror(err)); + } + + err = uc_context_save(_uc, _context); + if (err != UC_ERR_OK) { + rb_raise(UcError, "%s", uc_strerror(err)); + } + + VALUE sc = Data_Wrap_Struct(SavedContext, 0, uc_free, _context); + return sc; +} + +VALUE m_uc_context_update(VALUE self, VALUE context){ + uc_err err; + uc_engine *_uc; + Data_Get_Struct(rb_iv_get(self,"@uch"), uc_engine, _uc); + + uc_context *_context; + Data_Get_Struct(context, uc_context, _context); + + err = uc_context_save(_uc, _context); + if (err != UC_ERR_OK) { + rb_raise(UcError, "%s", uc_strerror(err)); + } + return Qnil; +} + +VALUE m_uc_context_restore(VALUE self, VALUE context){ + uc_err err; + uc_engine *_uc; + Data_Get_Struct(rb_iv_get(self,"@uch"), uc_engine, _uc); + + uc_context *_context; + Data_Get_Struct(context, uc_context, _context); + + err = uc_context_restore(_uc, _context); + if (err != UC_ERR_OK) { + rb_raise(UcError, "%s", uc_strerror(err)); + } + return Qnil; +} diff --git a/bindings/ruby/unicorn_gem/ext/unicorn.h b/bindings/ruby/unicorn_gem/ext/unicorn.h index 05fb2608..a6cd09af 100644 --- a/bindings/ruby/unicorn_gem/ext/unicorn.h +++ b/bindings/ruby/unicorn_gem/ext/unicorn.h @@ -30,4 +30,7 @@ VALUE m_uc_mem_unmap(VALUE self, VALUE address, VALUE size); VALUE m_uc_mem_protect(VALUE self, VALUE address, VALUE size, VALUE perms); VALUE m_uc_hook_add(int argc, VALUE* argv, VALUE self); VALUE m_uc_hook_del(VALUE self, VALUE hook); -VALUE m_uc_query(VALUE self, VALUE query_mode); \ No newline at end of file +VALUE m_uc_query(VALUE self, VALUE query_mode); +VALUE m_uc_context_save(VALUE self); +VALUE m_uc_context_update(VALUE self, VALUE context); +VALUE m_uc_context_restore(VALUE self, VALUE context); From f05984961bc5d476cfd2ac6c4a763c04a73a3044 Mon Sep 17 00:00:00 2001 From: Chris Eagle Date: Tue, 7 Feb 2017 17:37:41 -0800 Subject: [PATCH 22/31] Fix 16-bit address computations (#747) * Remove glib from samples makefile * changes to 16 bit segment registers needs to update segment base as well as segment selector * change how x86 segment registers are set in 16-bit mode --- qemu/target-i386/unicorn.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/qemu/target-i386/unicorn.c b/qemu/target-i386/unicorn.c index 5005c2f9..1aaae579 100644 --- a/qemu/target-i386/unicorn.c +++ b/qemu/target-i386/unicorn.c @@ -11,6 +11,10 @@ #include /* needed for uc_x86_mmr */ #include "uc_priv.h" +static void load_seg_16_helper(CPUX86State *env, int seg, uint32_t selector) +{ + cpu_x86_load_seg_cache(env, seg, selector, (selector << 4), 0xffff, 0); +} const int X86_REGS_STORAGE_SIZE = offsetof(CPUX86State, tlb_table); @@ -694,19 +698,19 @@ int x86_reg_write(struct uc_struct *uc, unsigned int *regs, void *const *vals, i switch(regid) { default: break; case UC_X86_REG_ES: - X86_CPU(uc, mycpu)->env.segs[R_ES].selector = *(uint16_t *)value; + load_seg_16_helper(&X86_CPU(uc, mycpu)->env, R_ES, *(uint16_t *)value); continue; case UC_X86_REG_SS: - X86_CPU(uc, mycpu)->env.segs[R_SS].selector = *(uint16_t *)value; + load_seg_16_helper(&X86_CPU(uc, mycpu)->env, R_SS, *(uint16_t *)value); continue; case UC_X86_REG_DS: - X86_CPU(uc, mycpu)->env.segs[R_DS].selector = *(uint16_t *)value; + load_seg_16_helper(&X86_CPU(uc, mycpu)->env, R_DS, *(uint16_t *)value); continue; case UC_X86_REG_FS: - X86_CPU(uc, mycpu)->env.segs[R_FS].selector = *(uint16_t *)value; + load_seg_16_helper(&X86_CPU(uc, mycpu)->env, R_FS, *(uint16_t *)value); continue; case UC_X86_REG_GS: - X86_CPU(uc, mycpu)->env.segs[R_GS].selector = *(uint16_t *)value; + load_seg_16_helper(&X86_CPU(uc, mycpu)->env, R_GS, *(uint16_t *)value); continue; } // fall-thru From a03e90861170c338549702970b41a5b44d6fd973 Mon Sep 17 00:00:00 2001 From: Chris Eagle Date: Thu, 9 Feb 2017 07:49:54 -0800 Subject: [PATCH 23/31] Fix initial state of segment registers (#751) * Remove glib from samples makefile * changes to 16 bit segment registers needs to update segment base as well as segment selector * change how x86 segment registers are set in 16-bit mode * more appropriate solution to initial state of x86 segment registers in 16-bit mode * remove commented lines --- qemu/target-i386/unicorn.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/qemu/target-i386/unicorn.c b/qemu/target-i386/unicorn.c index 1aaae579..817799db 100644 --- a/qemu/target-i386/unicorn.c +++ b/qemu/target-i386/unicorn.c @@ -11,9 +11,10 @@ #include /* needed for uc_x86_mmr */ #include "uc_priv.h" +#define X86_NON_CS_FLAGS (DESC_P_MASK | DESC_S_MASK | DESC_W_MASK | DESC_A_MASK) static void load_seg_16_helper(CPUX86State *env, int seg, uint32_t selector) { - cpu_x86_load_seg_cache(env, seg, selector, (selector << 4), 0xffff, 0); + cpu_x86_load_seg_cache(env, seg, selector, (selector << 4), 0xffff, X86_NON_CS_FLAGS); } const int X86_REGS_STORAGE_SIZE = offsetof(CPUX86State, tlb_table); @@ -130,6 +131,18 @@ void x86_reg_reset(struct uc_struct *uc) case UC_MODE_16: env->hflags = 0; env->cr[0] = 0; + //undo the damage done by the memset of env->segs above + //for R_CS, not quite the same as x86_cpu_reset + cpu_x86_load_seg_cache(env, R_CS, 0, 0, 0xffff, + DESC_P_MASK | DESC_S_MASK | DESC_CS_MASK | + DESC_R_MASK | DESC_A_MASK); + //remainder yields same state as x86_cpu_reset + load_seg_16_helper(env, R_DS, 0); + load_seg_16_helper(env, R_ES, 0); + load_seg_16_helper(env, R_SS, 0); + load_seg_16_helper(env, R_FS, 0); + load_seg_16_helper(env, R_GS, 0); + break; case UC_MODE_32: env->hflags |= HF_CS32_MASK | HF_SS32_MASK | HF_OSFXSR_MASK; From 736d9857d2c5e30426fd4cc01c773e676c6048e0 Mon Sep 17 00:00:00 2001 From: Nguyen Anh Quynh Date: Mon, 20 Feb 2017 15:16:50 +0800 Subject: [PATCH 24/31] recover some ELF symbols for building on Arm, PPC, Sparc & S390. issue #752 --- qemu/include/elf.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/qemu/include/elf.h b/qemu/include/elf.h index 5d9b4183..61dd1fb9 100644 --- a/qemu/include/elf.h +++ b/qemu/include/elf.h @@ -116,6 +116,22 @@ #define R_SPARC_5 44 #define R_SPARC_6 45 + +/* Bits present in AT_HWCAP for ARM. */ +#define HWCAP_ARM_IDIVA (1 << 17) + +/* Bits present in AT_HWCAP for s390. */ +#define HWCAP_S390_STFLE 4 + +/* Bits present in AT_HWCAP for Sparc. */ +#define HWCAP_SPARC_VIS3 0x00020000 + +/* Symbolic values for the entries in the auxiliary table + put on the initial stack */ +#define AT_PLATFORM 15 /* string identifying CPU for optimizations */ +#define AT_HWCAP 16 /* arch dependent hints at CPU capabilities */ + + /* * 68k ELF relocation types */ From d5870ff47dbe69289d4785ecea2f21545137a6eb Mon Sep 17 00:00:00 2001 From: fG! Date: Tue, 21 Feb 2017 02:22:17 +0000 Subject: [PATCH 25/31] Update unicorn.h (#753) Make it clear that only very few instructions can be hooked --- include/unicorn/unicorn.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/unicorn/unicorn.h b/include/unicorn/unicorn.h index 6640706e..40cb9930 100644 --- a/include/unicorn/unicorn.h +++ b/include/unicorn/unicorn.h @@ -208,7 +208,7 @@ typedef enum uc_mem_type { typedef enum uc_hook_type { // Hook all interrupt/syscall events UC_HOOK_INTR = 1 << 0, - // Hook a particular instruction + // Hook a particular instruction - only a very small subset of instructions supported here UC_HOOK_INSN = 1 << 1, // Hook a range of code UC_HOOK_CODE = 1 << 2, From f3f2a4d7a92e76db3476341aa06cc0389ec410ac Mon Sep 17 00:00:00 2001 From: Nguyen Anh Quynh Date: Thu, 23 Feb 2017 20:17:02 +0800 Subject: [PATCH 26/31] prepare for v1.0 --- ChangeLog | 9 +++++++++ pkgconfig.mk | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 6a0bdae2..2ae4a4f8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,14 @@ This file details the changelog of Unicorn Engine. +---------------------------------- +[Version 1.0]: February 23th, 2017 + +- Fix build script for BSD host. +- Fix building Unicorn on Arm/PPC/Sparc/S390 hosts. +- X86: + - Fix 16bit address computation. + - Fix initial state of segment registers. + ---------------------------------- [Version 1.0-rc3]: January 25th, 2017 diff --git a/pkgconfig.mk b/pkgconfig.mk index 1dd1e8ae..b9680f3e 100644 --- a/pkgconfig.mk +++ b/pkgconfig.mk @@ -10,4 +10,4 @@ PKG_MINOR = 0 PKG_EXTRA = 0 # version tag. Examples: rc1, b2, post1 -PKG_TAG = rc3 +PKG_TAG = From 714cf2c609c6fcc6324dd3884f3b3c4f780e43ce Mon Sep 17 00:00:00 2001 From: Nguyen Anh Quynh Date: Thu, 23 Feb 2017 20:32:09 +0800 Subject: [PATCH 27/31] arm: fix a warning --- qemu/target-arm/helper.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/qemu/target-arm/helper.c b/qemu/target-arm/helper.c index b3ba828b..81796e86 100644 --- a/qemu/target-arm/helper.c +++ b/qemu/target-arm/helper.c @@ -5661,6 +5661,8 @@ static bool round_to_inf(float_status *fpst, bool sign_bit) return sign_bit; case float_round_to_zero: /* Round to Zero */ return false; + default: + break; } g_assert_not_reached(); From e7ecbf7889e6ff42445fa88d8497ed1479ebe96e Mon Sep 17 00:00:00 2001 From: Nguyen Anh Quynh Date: Thu, 23 Feb 2017 20:34:17 +0800 Subject: [PATCH 28/31] m68k: fix a compilation warning --- qemu/target-m68k/translate.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/qemu/target-m68k/translate.c b/qemu/target-m68k/translate.c index f50ef2b4..530f8ed9 100644 --- a/qemu/target-m68k/translate.c +++ b/qemu/target-m68k/translate.c @@ -428,6 +428,8 @@ static inline int opsize_bytes(int opsize) default: g_assert_not_reached(); } + + return 0; } /* Assign value to a register. If the width is less than the register width From ed7e19e1b71a48d9449f413520559ee7edaccf10 Mon Sep 17 00:00:00 2001 From: Nguyen Anh Quynh Date: Thu, 23 Feb 2017 20:50:36 +0800 Subject: [PATCH 29/31] fix ChangeLog --- ChangeLog | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2ae4a4f8..4fba368a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,13 +1,13 @@ This file details the changelog of Unicorn Engine. ---------------------------------- -[Version 1.0]: February 23th, 2017 +[Version 1.0]: February 23rd, 2017 - Fix build script for BSD host. - Fix building Unicorn on Arm/PPC/Sparc/S390 hosts. - X86: - Fix 16bit address computation. - - Fix initial state of segment registers. + - Fix initial state of segment registers. ---------------------------------- [Version 1.0-rc3]: January 25th, 2017 From 8f488a101c912573732bc6dbadafea10897b28c0 Mon Sep 17 00:00:00 2001 From: Nguyen Anh Quynh Date: Thu, 23 Feb 2017 20:57:14 +0800 Subject: [PATCH 30/31] Makefile: clean remove library *.{a,def} --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index c728d255..bc79b8b3 100644 --- a/Makefile +++ b/Makefile @@ -307,7 +307,7 @@ uninstall: clean: $(MAKE) -C qemu clean rm -rf *.d *.o - rm -rf lib$(LIBNAME)* $(LIBNAME)*.lib $(LIBNAME)*.dll $(LIBNAME)*.exp cyg$(LIBNAME)*.dll + rm -rf lib$(LIBNAME)* $(LIBNAME)*.lib $(LIBNAME)*.dll $(LIBNAME)*.a $(LIBNAME)*.def $(LIBNAME)*.exp cyg$(LIBNAME)*.dll $(MAKE) -C samples clean $(MAKE) -C tests/unit clean From 8acd6d47c90557e0083371ec83fffec23d3df184 Mon Sep 17 00:00:00 2001 From: radare Date: Fri, 24 Feb 2017 03:00:36 +0100 Subject: [PATCH 31/31] Properly honor UNICORN_HAS_ (#757) * Properly honor UNICORN_HAS_ * Oops missed that --- uc.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/uc.c b/uc.c index 348e47c1..744aa589 100644 --- a/uc.c +++ b/uc.c @@ -130,7 +130,6 @@ bool uc_arch_supported(uc_arch arch) #ifdef UNICORN_HAS_X86 case UC_ARCH_X86: return true; #endif - /* Invalid or disabled arch */ default: return false; } @@ -535,11 +534,12 @@ uc_err uc_emu_start(uc_engine* uc, uint64_t begin, uint64_t until, uint64_t time switch(uc->arch) { default: break; - +#ifdef UNICORN_HAS_M68K case UC_ARCH_M68K: uc_reg_write(uc, UC_M68K_REG_PC, &begin); break; - +#endif +#ifdef UNICORN_HAS_X86 case UC_ARCH_X86: switch(uc->mode) { default: @@ -555,24 +555,29 @@ uc_err uc_emu_start(uc_engine* uc, uint64_t begin, uint64_t until, uint64_t time break; } break; - +#endif +#ifdef UNICORN_HAS_ARM case UC_ARCH_ARM: uc_reg_write(uc, UC_ARM_REG_R15, &begin); break; - +#endif +#ifdef UNICORN_HAS_ARM64 case UC_ARCH_ARM64: uc_reg_write(uc, UC_ARM64_REG_PC, &begin); break; - +#endif +#ifdef UNICORN_HAS_MIPS case UC_ARCH_MIPS: // TODO: MIPS32/MIPS64/BIGENDIAN etc uc_reg_write(uc, UC_MIPS_REG_PC, &begin); break; - +#endif +#ifdef UNICORN_HAS_SPARC case UC_ARCH_SPARC: // TODO: Sparc/Sparc64 uc_reg_write(uc, UC_SPARC_REG_PC, &begin); break; +#endif } uc->stop_request = false; @@ -1138,8 +1143,10 @@ uc_err uc_query(uc_engine *uc, uc_query_type type, size_t *result) } switch(uc->arch) { +#ifdef UNICORN_HAS_ARM case UC_ARCH_ARM: return uc->query(uc, type, result); +#endif default: return UC_ERR_ARG; }