diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..5fa5fc9a --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,890 @@ +# Tested on window10(x64) with vs2019. +# Open the "x86 Native Tools Command Prompt for VS 2019", +# cd ${UNICORN_SOURCE_DIR} +# mkdir build +# cd build +# cmake -G "NMake Makefiles" .. +# nmake +# Or Open "x64 Native Tools Command Prompt for VS 2019" for 64bit binary. +# Tested on Ubuntu-1804-amd64 with gcc. +# cd ${UNICORN_SOURCE_DIR} +# mkdir build +# cd build +# cmake .. +# make +# By Huitao Chen, 2019 +cmake_minimum_required(VERSION 3.1) +project(unicorn C) + +set(UNICORN_VERSION_MAJOR 1) +set(UNICORN_VERSION_MINOR 0) +set(UNICORN_VERSION_PATCH 2) + +if(NOT UNICORN_ARCH) + set(UNICORN_ARCH "x86 arm aarch64 m68k mips sparc") +endif() + +string(TOUPPER ${UNICORN_ARCH} UNICORN_ARCH) +string(REPLACE " " ";" UNICORN_ARCH_LIST ${UNICORN_ARCH}) + +foreach(ARCH_LOOP ${UNICORN_ARCH_LIST}) + set(UNICORN_HAS_${ARCH_LOOP} TRUE) +endforeach(ARCH_LOOP) + +# qemu uses assert(). It is not recommended to define NDEBUG if using assert() +# to detect error conditions since the software may behave +# non-deterministically. Remove the NDEBUG macro. +if(CMAKE_BUILD_TYPE STREQUAL "Release") + string(REPLACE "-DNDEBUG" "" CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE}) +endif() + +if(MSVC) + include_directories( + ${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn + ) +else() + include_directories( + ${CMAKE_BINARY_DIR} + ) +endif() + +include_directories( + qemu + qemu/include + qemu/tcg + include +) + +if(MSVC) + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(MSVC_FLAG -D__x86_64__) + elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) + set(MSVC_FLAG -D__i386__) + else() + message(FATAL_ERROR "Neither WIN64 or WIN32!") + endif() + add_compile_options( + -Dinline=__inline + -D__func__=__FUNCTION__ + -D_CRT_SECURE_NO_WARNINGS + -DWIN32_LEAN_AND_MEAN + ${MSVC_FLAG} + /I${CMAKE_CURRENT_SOURCE_DIR}/qemu/tcg/i386 + /wd4018 /wd4244 /wd4267 + ) + if(CMAKE_BUILD_TYPE STREQUAL "Debug") + string(REPLACE "/ZI" "/Zi" CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG}) + endif() + # default use the multithread, static version of the run-time library. + option(UNICORN_STATIC_MSVCRT "Embed static runtime library" ON) + if (UNICORN_STATIC_MSVCRT) + string(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG}) + string(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE}) + endif() +else() +# check python + find_program(PYTHON_CMD python) + if (NOT PYTHON_CMD) + message(FATAL_ERROR "Please install python.") + endif() + + set(EXTRA_CFLAGS "--extra-cflags=") + if (UNICORN_HAS_X86) + set (EXTRA_CFLAGS "${EXTRA_CFLAGS}-DUNICORN_HAS_X86 ") + endif() + if (UNICORN_HAS_ARM) + set (EXTRA_CFLAGS "${EXTRA_CFLAGS}-DUNICORN_HAS_ARM -DUNICORN_HAS_ARMEB ") + endif() + if (UNICORN_HAS_AARCH64) + set (EXTRA_CFLAGS "${EXTRA_CFLAGS}-DUNICORN_HAS_ARM64 -DUNICORN_HAS_ARM64EB ") + endif() + if (UNICORN_HAS_M68K) + set (EXTRA_CFLAGS "${EXTRA_CFLAGS}-DUNICORN_HAS_M68K ") + endif() + if (UNICORN_HAS_MIPS) + set (EXTRA_CFLAGS "${EXTRA_CFLAGS}-DUNICORN_HAS_MIPS -DUNICORN_HAS_MIPSEL -DUNICORN_HAS_MIPS64 -DUNICORN_HAS_MIPS64EL ") + endif() + if (UNICORN_HAS_SPARC) + set (EXTRA_CFLAGS "${EXTRA_CFLAGS}-DUNICORN_HAS_SPARC ") + endif() + set (EXTRA_CFLAGS "${EXTRA_CFLAGS}-fPIC -fvisibility=hidden") + + set(TARGET_LIST "--target-list=") + if (UNICORN_HAS_X86) + set (TARGET_LIST "${TARGET_LIST}x86_64-softmmu, ") + endif() + if (UNICORN_HAS_ARM) + set (TARGET_LIST "${TARGET_LIST}arm-softmmu, armeb-softmmu, ") + endif() + if (UNICORN_HAS_AARCH64) + set (TARGET_LIST "${TARGET_LIST}aarch64-softmmu, aarch64eb-softmmu, ") + endif() + if (UNICORN_HAS_M68K) + set (TARGET_LIST "${TARGET_LIST}m68k-softmmu, ") + endif() + if (UNICORN_HAS_MIPS) + set (TARGET_LIST "${TARGET_LIST}mips-softmmu, mipsel-softmmu, mips64-softmmu, mips64el-softmmu, ") + endif() + if (UNICORN_HAS_SPARC) + set (TARGET_LIST "${TARGET_LIST}sparc-softmmu, sparc64-softmmu, ") + endif() + set (TARGET_LIST "${TARGET_LIST} ") + +# GEN dynamic source files + execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/configure + ${EXTRA_CFLAGS} + ${TARGET_LIST} + ) + execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config + INPUT_FILE ${CMAKE_BINARY_DIR}/config-host.mak + OUTPUT_FILE ${CMAKE_BINARY_DIR}/config-host.h + ) + if (UNICORN_HAS_X86) + execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config + INPUT_FILE ${CMAKE_BINARY_DIR}/x86_64-softmmu/config-target.mak + OUTPUT_FILE ${CMAKE_BINARY_DIR}/x86_64-softmmu/config-target.h + ) + endif() + if (UNICORN_HAS_ARM) + execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config + INPUT_FILE ${CMAKE_BINARY_DIR}/arm-softmmu/config-target.mak + OUTPUT_FILE ${CMAKE_BINARY_DIR}/arm-softmmu/config-target.h + ) + execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config + INPUT_FILE ${CMAKE_BINARY_DIR}/armeb-softmmu/config-target.mak + OUTPUT_FILE ${CMAKE_BINARY_DIR}/armeb-softmmu/config-target.h + ) + endif() + if (UNICORN_HAS_AARCH64) + execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config + INPUT_FILE ${CMAKE_BINARY_DIR}/aarch64-softmmu/config-target.mak + OUTPUT_FILE ${CMAKE_BINARY_DIR}/aarch64-softmmu/config-target.h + ) + execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config + INPUT_FILE ${CMAKE_BINARY_DIR}/aarch64eb-softmmu/config-target.mak + OUTPUT_FILE ${CMAKE_BINARY_DIR}/aarch64eb-softmmu/config-target.h + ) + endif() + if (UNICORN_HAS_M68K) + execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config + INPUT_FILE ${CMAKE_BINARY_DIR}/m68k-softmmu/config-target.mak + OUTPUT_FILE ${CMAKE_BINARY_DIR}/m68k-softmmu/config-target.h + ) + endif() + if (UNICORN_HAS_MIPS) + execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config + INPUT_FILE ${CMAKE_BINARY_DIR}/mips-softmmu/config-target.mak + OUTPUT_FILE ${CMAKE_BINARY_DIR}/mips-softmmu/config-target.h + ) + execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config + INPUT_FILE ${CMAKE_BINARY_DIR}/mipsel-softmmu/config-target.mak + OUTPUT_FILE ${CMAKE_BINARY_DIR}/mipsel-softmmu/config-target.h + ) + execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config + INPUT_FILE ${CMAKE_BINARY_DIR}/mips64-softmmu/config-target.mak + OUTPUT_FILE ${CMAKE_BINARY_DIR}/mips64-softmmu/config-target.h + ) + execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config + INPUT_FILE ${CMAKE_BINARY_DIR}/mips64el-softmmu/config-target.mak + OUTPUT_FILE ${CMAKE_BINARY_DIR}/mips64el-softmmu/config-target.h + ) + endif() + if (UNICORN_HAS_SPARC) + execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config + INPUT_FILE ${CMAKE_BINARY_DIR}/sparc-softmmu/config-target.mak + OUTPUT_FILE ${CMAKE_BINARY_DIR}/sparc-softmmu/config-target.h + ) + execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config + INPUT_FILE ${CMAKE_BINARY_DIR}/sparc64-softmmu/config-target.mak + OUTPUT_FILE ${CMAKE_BINARY_DIR}/sparc64-softmmu/config-target.h + ) + endif() + execute_process(COMMAND python -B ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/qapi-types.py + -h -o ${CMAKE_BINARY_DIR} -b -i ${CMAKE_CURRENT_SOURCE_DIR}/qemu/qapi-schema.json + ) + execute_process(COMMAND python -B ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/qapi-types.py + -c -o ${CMAKE_BINARY_DIR} -b -i ${CMAKE_CURRENT_SOURCE_DIR}/qemu/qapi-schema.json + ) + execute_process(COMMAND python -B ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/qapi-visit.py + -h -o ${CMAKE_BINARY_DIR} -b -i ${CMAKE_CURRENT_SOURCE_DIR}/qemu/qapi-schema.json + ) + execute_process(COMMAND python -B ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/qapi-visit.py + -c -o ${CMAKE_BINARY_DIR} -b -i ${CMAKE_CURRENT_SOURCE_DIR}/qemu/qapi-schema.json + ) + add_compile_options( + -I${CMAKE_CURRENT_SOURCE_DIR}/qemu/tcg/i386 + -D_GNU_SOURCE + -D_FILE_OFFSET_BITS=64 + -D_LARGEFILE_SOURCE + -Wall -O2 + -fPIC -fpic -fvisibility=hidden + ) +endif() + +if (UNICORN_HAS_X86) +add_library(x86_64-softmmu + qemu/cpu-exec.c + qemu/cpus.c + qemu/cputlb.c + qemu/exec.c + qemu/fpu/softfloat.c + qemu/hw/i386/pc.c + qemu/hw/i386/pc_piix.c + qemu/hw/intc/apic.c + qemu/hw/intc/apic_common.c + qemu/ioport.c + qemu/memory.c + qemu/memory_mapping.c + qemu/target-i386/arch_memory_mapping.c + qemu/target-i386/cc_helper.c + qemu/target-i386/cpu.c + qemu/target-i386/excp_helper.c + qemu/target-i386/fpu_helper.c + qemu/target-i386/helper.c + qemu/target-i386/int_helper.c + qemu/target-i386/mem_helper.c + qemu/target-i386/misc_helper.c + qemu/target-i386/seg_helper.c + qemu/target-i386/smm_helper.c + qemu/target-i386/svm_helper.c + qemu/target-i386/translate.c + qemu/target-i386/unicorn.c + qemu/tcg/optimize.c + qemu/tcg/tcg.c + qemu/translate-all.c +) + +if(MSVC) + target_compile_options(x86_64-softmmu PRIVATE + -DNEED_CPU_H + /FI x86_64.h + /I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/x86_64-softmmu + /I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-i386 + ) +else() + target_compile_options(x86_64-softmmu PRIVATE + -DNEED_CPU_H + -include x86_64.h + -I${CMAKE_BINARY_DIR}/x86_64-softmmu + -I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-i386 + ) +endif() +endif() + +if (UNICORN_HAS_ARM) +add_library(arm-softmmu + qemu/cpu-exec.c + qemu/cpus.c + qemu/cputlb.c + qemu/exec.c + qemu/fpu/softfloat.c + qemu/hw/arm/tosa.c + qemu/hw/arm/virt.c + qemu/ioport.c + qemu/memory.c + qemu/memory_mapping.c + qemu/target-arm/cpu.c + qemu/target-arm/crypto_helper.c + qemu/target-arm/helper.c + qemu/target-arm/iwmmxt_helper.c + qemu/target-arm/neon_helper.c + qemu/target-arm/op_helper.c + qemu/target-arm/psci.c + qemu/target-arm/translate.c + qemu/target-arm/unicorn_arm.c + qemu/tcg/optimize.c + qemu/tcg/tcg.c + qemu/translate-all.c +) + +if(MSVC) + target_compile_options(arm-softmmu PRIVATE + -DNEED_CPU_H + /FI arm.h + /I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/arm-softmmu + /I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-arm + ) +else() + target_compile_options(arm-softmmu PRIVATE + -DNEED_CPU_H + -include arm.h + -I${CMAKE_BINARY_DIR}/arm-softmmu + -I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-arm + ) +endif() + +add_library(armeb-softmmu + qemu/cpu-exec.c + qemu/cpus.c + qemu/cputlb.c + qemu/exec.c + qemu/fpu/softfloat.c + qemu/hw/arm/tosa.c + qemu/hw/arm/virt.c + qemu/ioport.c + qemu/memory.c + qemu/memory_mapping.c + qemu/target-arm/cpu.c + qemu/target-arm/crypto_helper.c + qemu/target-arm/helper.c + qemu/target-arm/iwmmxt_helper.c + qemu/target-arm/neon_helper.c + qemu/target-arm/op_helper.c + qemu/target-arm/psci.c + qemu/target-arm/translate.c + qemu/target-arm/unicorn_arm.c + qemu/tcg/optimize.c + qemu/tcg/tcg.c + qemu/translate-all.c +) + +if(MSVC) + target_compile_options(armeb-softmmu PRIVATE + -DNEED_CPU_H + /FI armeb.h + /I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/armeb-softmmu + /I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-arm + ) +else() + target_compile_options(armeb-softmmu PRIVATE + -DNEED_CPU_H + -include armeb.h + -I${CMAKE_BINARY_DIR}/armeb-softmmu + -I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-arm + ) +endif() +endif() + +if (UNICORN_HAS_AARCH64) +add_library(aarch64-softmmu + qemu/cpu-exec.c + qemu/cpus.c + qemu/cputlb.c + qemu/exec.c + qemu/fpu/softfloat.c + qemu/hw/arm/tosa.c + qemu/hw/arm/virt.c + qemu/ioport.c + qemu/memory.c + qemu/memory_mapping.c + qemu/target-arm/cpu.c + qemu/target-arm/cpu64.c + qemu/target-arm/crypto_helper.c + qemu/target-arm/helper-a64.c + qemu/target-arm/helper.c + qemu/target-arm/iwmmxt_helper.c + qemu/target-arm/neon_helper.c + qemu/target-arm/op_helper.c + qemu/target-arm/psci.c + qemu/target-arm/translate-a64.c + qemu/target-arm/translate.c + qemu/target-arm/unicorn_aarch64.c + qemu/tcg/optimize.c + qemu/tcg/tcg.c + qemu/translate-all.c +) + +if(MSVC) + target_compile_options(aarch64-softmmu PRIVATE + -DNEED_CPU_H + /FI aarch64.h + /I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/aarch64-softmmu + /I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-arm + ) +else() + target_compile_options(aarch64-softmmu PRIVATE + -DNEED_CPU_H + -include aarch64.h + -I${CMAKE_BINARY_DIR}/aarch64-softmmu + -I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-arm + ) +endif() + +add_library(aarch64eb-softmmu + qemu/cpu-exec.c + qemu/cpus.c + qemu/cputlb.c + qemu/exec.c + qemu/fpu/softfloat.c + qemu/hw/arm/tosa.c + qemu/hw/arm/virt.c + qemu/ioport.c + qemu/memory.c + qemu/memory_mapping.c + qemu/target-arm/cpu.c + qemu/target-arm/cpu64.c + qemu/target-arm/crypto_helper.c + qemu/target-arm/helper-a64.c + qemu/target-arm/helper.c + qemu/target-arm/iwmmxt_helper.c + qemu/target-arm/neon_helper.c + qemu/target-arm/op_helper.c + qemu/target-arm/psci.c + qemu/target-arm/translate-a64.c + qemu/target-arm/translate.c + qemu/target-arm/unicorn_aarch64.c + qemu/tcg/optimize.c + qemu/tcg/tcg.c + qemu/translate-all.c +) + +if(MSVC) + target_compile_options(aarch64eb-softmmu PRIVATE + -DNEED_CPU_H + /FI aarch64eb.h + /I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/aarch64eb-softmmu + /I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-arm + ) +else() + target_compile_options(aarch64eb-softmmu PRIVATE + -DNEED_CPU_H + -include aarch64eb.h + -I${CMAKE_BINARY_DIR}/aarch64eb-softmmu + -I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-arm + ) +endif() +endif() + +if (UNICORN_HAS_M68K) +add_library(m68k-softmmu + qemu/cpu-exec.c + qemu/cpus.c + qemu/cputlb.c + qemu/exec.c + qemu/fpu/softfloat.c + qemu/hw/m68k/dummy_m68k.c + qemu/ioport.c + qemu/memory.c + qemu/memory_mapping.c + qemu/target-m68k/cpu.c + qemu/target-m68k/helper.c + qemu/target-m68k/op_helper.c + qemu/target-m68k/translate.c + qemu/target-m68k/unicorn.c + qemu/tcg/optimize.c + qemu/tcg/tcg.c + qemu/translate-all.c +) + +if(MSVC) + target_compile_options(m68k-softmmu PRIVATE + -DNEED_CPU_H + /FI m68k.h + /I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/m68k-softmmu + /I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-m68k + ) +else() + target_compile_options(m68k-softmmu PRIVATE + -DNEED_CPU_H + -include m68k.h + -I${CMAKE_BINARY_DIR}/m68k-softmmu + -I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-m68k + ) +endif() +endif() + +if (UNICORN_HAS_MIPS) +add_library(mips-softmmu + qemu/cpu-exec.c + qemu/cpus.c + qemu/cputlb.c + qemu/exec.c + qemu/fpu/softfloat.c + qemu/hw/mips/addr.c + qemu/hw/mips/cputimer.c + qemu/hw/mips/mips_r4k.c + qemu/ioport.c + qemu/memory.c + qemu/memory_mapping.c + qemu/target-mips/cpu.c + qemu/target-mips/dsp_helper.c + qemu/target-mips/helper.c + qemu/target-mips/lmi_helper.c + qemu/target-mips/msa_helper.c + qemu/target-mips/op_helper.c + qemu/target-mips/translate.c + qemu/target-mips/unicorn.c + qemu/tcg/optimize.c + qemu/tcg/tcg.c + qemu/translate-all.c +) + +if(MSVC) + target_compile_options(mips-softmmu PRIVATE + -DNEED_CPU_H + /FI mips.h + /I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/mips-softmmu + /I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-mips + ) +else() + target_compile_options(mips-softmmu PRIVATE + -DNEED_CPU_H + -include mips.h + -I${CMAKE_BINARY_DIR}/mips-softmmu + -I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-mips + ) +endif() + +add_library(mipsel-softmmu + qemu/cpu-exec.c + qemu/cpus.c + qemu/cputlb.c + qemu/exec.c + qemu/fpu/softfloat.c + qemu/hw/mips/addr.c + qemu/hw/mips/cputimer.c + qemu/hw/mips/mips_r4k.c + qemu/ioport.c + qemu/memory.c + qemu/memory_mapping.c + qemu/target-mips/cpu.c + qemu/target-mips/dsp_helper.c + qemu/target-mips/helper.c + qemu/target-mips/lmi_helper.c + qemu/target-mips/msa_helper.c + qemu/target-mips/op_helper.c + qemu/target-mips/translate.c + qemu/target-mips/unicorn.c + qemu/tcg/optimize.c + qemu/tcg/tcg.c + qemu/translate-all.c +) + +if(MSVC) + target_compile_options(mipsel-softmmu PRIVATE + -DNEED_CPU_H + /FI mipsel.h + /I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/mipsel-softmmu + /I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-mips + ) +else() + target_compile_options(mipsel-softmmu PRIVATE + -DNEED_CPU_H + -include mipsel.h + -I${CMAKE_BINARY_DIR}/mipsel-softmmu + -I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-mips + ) +endif() + +add_library(mips64-softmmu + qemu/cpu-exec.c + qemu/cpus.c + qemu/cputlb.c + qemu/exec.c + qemu/fpu/softfloat.c + qemu/hw/mips/addr.c + qemu/hw/mips/cputimer.c + qemu/hw/mips/mips_r4k.c + qemu/ioport.c + qemu/memory.c + qemu/memory_mapping.c + qemu/target-mips/cpu.c + qemu/target-mips/dsp_helper.c + qemu/target-mips/helper.c + qemu/target-mips/lmi_helper.c + qemu/target-mips/msa_helper.c + qemu/target-mips/op_helper.c + qemu/target-mips/translate.c + qemu/target-mips/unicorn.c + qemu/tcg/optimize.c + qemu/tcg/tcg.c + qemu/translate-all.c +) + +if(MSVC) + target_compile_options(mips64-softmmu PRIVATE + -DNEED_CPU_H + /FI mips64.h + /I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/mips64-softmmu + /I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-mips + ) +else() + target_compile_options(mips64-softmmu PRIVATE + -DNEED_CPU_H + -include mips64.h + -I${CMAKE_BINARY_DIR}/mips64-softmmu + -I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-mips + ) +endif() + +add_library(mips64el-softmmu + qemu/cpu-exec.c + qemu/cpus.c + qemu/cputlb.c + qemu/exec.c + qemu/fpu/softfloat.c + qemu/hw/mips/addr.c + qemu/hw/mips/cputimer.c + qemu/hw/mips/mips_r4k.c + qemu/ioport.c + qemu/memory.c + qemu/memory_mapping.c + qemu/target-mips/cpu.c + qemu/target-mips/dsp_helper.c + qemu/target-mips/helper.c + qemu/target-mips/lmi_helper.c + qemu/target-mips/msa_helper.c + qemu/target-mips/op_helper.c + qemu/target-mips/translate.c + qemu/target-mips/unicorn.c + qemu/tcg/optimize.c + qemu/tcg/tcg.c + qemu/translate-all.c +) + +if(MSVC) + target_compile_options(mips64el-softmmu PRIVATE + -DNEED_CPU_H + /FI mips64el.h + /I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/mips64el-softmmu + /I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-mips + ) +else() + target_compile_options(mips64el-softmmu PRIVATE + -DNEED_CPU_H + -include mips64el.h + -I${CMAKE_BINARY_DIR}/mips64el-softmmu + -I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-mips + ) +endif() +endif() + +if (UNICORN_HAS_SPARC) +add_library(sparc-softmmu + qemu/cpu-exec.c + qemu/cpus.c + qemu/cputlb.c + qemu/exec.c + qemu/fpu/softfloat.c + qemu/hw/sparc/leon3.c + qemu/ioport.c + qemu/memory.c + qemu/memory_mapping.c + qemu/target-sparc/cc_helper.c + qemu/target-sparc/cpu.c + qemu/target-sparc/fop_helper.c + qemu/target-sparc/helper.c + qemu/target-sparc/int32_helper.c + qemu/target-sparc/ldst_helper.c + qemu/target-sparc/mmu_helper.c + qemu/target-sparc/translate.c + qemu/target-sparc/unicorn.c + qemu/target-sparc/win_helper.c + qemu/tcg/optimize.c + qemu/tcg/tcg.c + qemu/translate-all.c +) + +if(MSVC) + target_compile_options(sparc-softmmu PRIVATE + -DNEED_CPU_H + /FI sparc.h + /I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/sparc-softmmu + /I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-sparc + ) +else() + target_compile_options(sparc-softmmu PRIVATE + -DNEED_CPU_H + -include sparc.h + -I${CMAKE_BINARY_DIR}/sparc-softmmu + -I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-sparc + ) +endif() + +add_library(sparc64-softmmu + qemu/cpu-exec.c + qemu/cpus.c + qemu/cputlb.c + qemu/exec.c + qemu/fpu/softfloat.c + qemu/hw/sparc64/sun4u.c + qemu/ioport.c + qemu/memory.c + qemu/memory_mapping.c + qemu/target-sparc/cc_helper.c + qemu/target-sparc/cpu.c + qemu/target-sparc/fop_helper.c + qemu/target-sparc/helper.c + qemu/target-sparc/int64_helper.c + qemu/target-sparc/ldst_helper.c + qemu/target-sparc/mmu_helper.c + qemu/target-sparc/translate.c + qemu/target-sparc/unicorn64.c + qemu/target-sparc/vis_helper.c + qemu/target-sparc/win_helper.c + qemu/tcg/optimize.c + qemu/tcg/tcg.c + qemu/translate-all.c +) + +if(MSVC) + target_compile_options(sparc64-softmmu PRIVATE + -DNEED_CPU_H + /FI sparc64.h + /I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/sparc64-softmmu + /I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-sparc + ) +else() + target_compile_options(sparc64-softmmu PRIVATE + -DNEED_CPU_H + -include sparc64.h + -I${CMAKE_BINARY_DIR}/sparc64-softmmu + -I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-sparc + ) +endif() +endif() + +set(UNICORN_SRCS_COMMON + list.c + qemu/accel.c + qemu/glib_compat.c + qemu/hw/core/machine.c + qemu/hw/core/qdev.c + qemu/qapi/qapi-dealloc-visitor.c + qemu/qapi/qapi-visit-core.c + qemu/qapi/qmp-input-visitor.c + qemu/qapi/qmp-output-visitor.c + qemu/qapi/string-input-visitor.c + qemu/qemu-log.c + qemu/qemu-timer.c + qemu/qobject/qbool.c + qemu/qobject/qdict.c + qemu/qobject/qerror.c + qemu/qobject/qfloat.c + qemu/qobject/qint.c + qemu/qobject/qlist.c + qemu/qobject/qstring.c + qemu/qom/container.c + qemu/qom/cpu.c + qemu/qom/object.c + qemu/qom/qom-qobject.c + qemu/tcg-runtime.c + qemu/util/aes.c + qemu/util/bitmap.c + qemu/util/bitops.c + qemu/util/crc32c.c + qemu/util/cutils.c + qemu/util/error.c + qemu/util/getauxval.c + qemu/util/host-utils.c + qemu/util/module.c + qemu/util/qemu-timer-common.c + qemu/vl.c + uc.c +) + +if (MSVC) + set(UNICORN_SRCS + ${UNICORN_SRCS_COMMON} + qemu/util/oslib-win32.c + qemu/util/qemu-thread-win32.c + qemu/util/qemu-error.c + ${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/qapi-types.c + ${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/qapi-visit.c + ) +else() + set(UNICORN_SRCS + ${UNICORN_SRCS_COMMON} + qemu/util/oslib-posix.c + qemu/util/qemu-thread-posix.c + ${CMAKE_BINARY_DIR}/qapi-types.c + ${CMAKE_BINARY_DIR}/qapi-visit.c + ) +endif() + +add_library(unicorn SHARED + ${UNICORN_SRCS} +) + +if (UNICORN_HAS_X86) + set(UNICRON_COMPILE_OPTIONS ${UNICRON_COMPILE_OPTIONS} -DUNICORN_HAS_X86) + set(UNICRON_LINK_LIBRARIES ${UNICRON_LINK_LIBRARIES} x86_64-softmmu) + set(UNICRON_SAMPLE_FILE ${UNICRON_SAMPLE_FILE} sample_x86 sample_x86_32_gdt_and_seg_regs sample_batch_reg mem_apis shellcode) +endif() +if (UNICORN_HAS_ARM) + set(UNICRON_COMPILE_OPTIONS ${UNICRON_COMPILE_OPTIONS} -DUNICORN_HAS_ARM) + set(UNICRON_LINK_LIBRARIES ${UNICRON_LINK_LIBRARIES} arm-softmmu armeb-softmmu) + set(UNICRON_SAMPLE_FILE ${UNICRON_SAMPLE_FILE} sample_arm sample_armeb) +endif() +if (UNICORN_HAS_AARCH64) + set(UNICRON_COMPILE_OPTIONS ${UNICRON_COMPILE_OPTIONS} -DUNICORN_HAS_ARM64) + set(UNICRON_LINK_LIBRARIES ${UNICRON_LINK_LIBRARIES} aarch64-softmmu aarch64eb-softmmu) + set(UNICRON_SAMPLE_FILE ${UNICRON_SAMPLE_FILE} sample_arm64 sample_arm64eb) +endif() +if (UNICORN_HAS_M68K) + set(UNICRON_COMPILE_OPTIONS ${UNICRON_COMPILE_OPTIONS} -DUNICORN_HAS_M68K) + set(UNICRON_LINK_LIBRARIES ${UNICRON_LINK_LIBRARIES} m68k-softmmu) + set(UNICRON_SAMPLE_FILE ${UNICRON_SAMPLE_FILE} sample_m68k) +endif() +if (UNICORN_HAS_MIPS) + set(UNICRON_COMPILE_OPTIONS ${UNICRON_COMPILE_OPTIONS} -DUNICORN_HAS_MIPS -DUNICORN_HAS_MIPSEL -DUNICORN_HAS_MIPS64 -DUNICORN_HAS_MIPS64EL) + set(UNICRON_LINK_LIBRARIES ${UNICRON_LINK_LIBRARIES} mips-softmmu mipsel-softmmu mips64-softmmu mips64el-softmmu) + set(UNICRON_SAMPLE_FILE ${UNICRON_SAMPLE_FILE} sample_mips) +endif() +if (UNICORN_HAS_SPARC) + set(UNICRON_COMPILE_OPTIONS ${UNICRON_COMPILE_OPTIONS} -DUNICORN_HAS_SPARC) + set(UNICRON_LINK_LIBRARIES ${UNICRON_LINK_LIBRARIES} sparc-softmmu sparc64-softmmu) + set(UNICRON_SAMPLE_FILE ${UNICRON_SAMPLE_FILE} sample_sparc) +endif() + + +if(MSVC) + target_compile_options(unicorn PRIVATE + ${UNICRON_COMPILE_OPTIONS} + -DUNICORN_SHARED + ) + target_link_libraries(unicorn + ${UNICRON_LINK_LIBRARIES} + ) +else() + target_compile_options(unicorn PRIVATE + ${UNICRON_COMPILE_OPTIONS} + ) + target_link_libraries(unicorn + ${UNICRON_LINK_LIBRARIES} + m + ) + set_target_properties(unicorn PROPERTIES + VERSION ${UNICORN_VERSION_MAJOR} + SOVERSION ${UNICORN_VERSION_MAJOR} + ) +endif() + +if(MSVC) + set(SAMPLES_LIB + unicorn + ) +else() + set(SAMPLES_LIB + unicorn + pthread + ) +endif() + +foreach(SAMPLE_FILE ${UNICRON_SAMPLE_FILE}) + add_executable(${SAMPLE_FILE} + ${CMAKE_CURRENT_SOURCE_DIR}/samples/${SAMPLE_FILE}.c + ) + target_link_libraries(${SAMPLE_FILE} + ${SAMPLES_LIB} + ) +endforeach(SAMPLE_FILE) + +if(NOT MSVC) + include("GNUInstallDirs") + file(GLOB UNICORN_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/unicorn/*.h) + install(TARGETS unicorn + RUNTIME DESTINATION bin + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ) + install(FILES ${UNICORN_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/unicorn) + file(WRITE ${CMAKE_BINARY_DIR}/unicorn.pc "Name: unicorn\n\ +Description: Unicorn emulator engine\n\ +Version: ${UNICORN_VERSION_MAJOR}.${UNICORN_VERSION_MINOR}.${UNICORN_VERSION_PATCH}\n\ +libdir=${CMAKE_INSTALL_FULL_LIBDIR}\n\ +includedir=${CMAKE_INSTALL_FULL_INCLUDEDIR}\n\ +Libs: -L\$\{libdir\} -lunicorn\n\ +Cflags: -I\$\{includedir\}\n" + ) + install(FILES ${CMAKE_BINARY_DIR}/unicorn.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) +endif() diff --git a/CREDITS.TXT b/CREDITS.TXT index 9442c2a9..10903447 100644 --- a/CREDITS.TXT +++ b/CREDITS.TXT @@ -69,3 +69,5 @@ David Zimmer: VB6 binding. zhangwm: ARM & ARM64 big endian. Mohamed Osama: FreePascal/Delphi binding. Philippe Antoine (Catena cyber): fuzzing +KaiJern Lau (xwings): programmer +Huitao Chen (chenhuitao): programmer diff --git a/cmake.sh b/cmake.sh new file mode 100755 index 00000000..7806a0e1 --- /dev/null +++ b/cmake.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +# Unicorn Emulator Engine (www.unicorn-engine.org) +# Usage: cmake.sh [x86] [arm] [aarch64] [m68k] [mips] [sparc] +# By chenhuitao 2019 + +FLAGS="-DCMAKE_BUILD_TYPE=Release" + +UNICORN_ARCH="${*}" + +if [ -z "${UNICORN_ARCH}" ]; then + cmake "${FLAGS}" .. +else + cmake "${FLAGS}" "-DUNICORN_ARCH=${UNICORN_ARCH}" .. +fi + +make -j8 diff --git a/docs/COMPILE-CMAKE.md b/docs/COMPILE-CMAKE.md new file mode 100644 index 00000000..e167716c --- /dev/null +++ b/docs/COMPILE-CMAKE.md @@ -0,0 +1,83 @@ +This documentation explains how to compile Unicorn with CMake on Windows or +*nix. + +---- + +Requirements: + Windows: MicroSoft Visual Studio(>=2013). + *nix: GNU gcc. Python CLI to generate dynamic source files. + +Get CMake for free from http://www.cmake.org. + + +[1] Tailor Unicorn to your need. + + Out of archtitectures supported by Unicorn, if you just need several selected archs, + set the 'UNICORN_ARCH' in CMake. e.g.: + + cmake -DUNICORN_ARCH="x86 mips" .. + + By default, all architectures(x86 arm aarch64 m68k mips sparc) are compiled in. + + Besides, Unicorn also allows some more customization via following macros. + + - UNICORN_STATIC_MSVCRT: change this to OFF to use dynamic MSVCRT lib, Only on Windows. + +[2] CMake allows you to generate different generators to build Unicorn. Below is + some examples on how to build Unicorn on Windows with CMake. + +- You can let CMake select a generator for you. Do: + + mkdir build + cd build + cmake .. + + This last command is also where you can pass additional CMake configuration flags + using `-D=`. Then to build use: + + cmake --build . --config Release + + +- To build Unicorn using Nmake of Windows SDK, do: + + mkdir build + cd build + ..\nmake.bat + + After this, find the samples test*.exe, unicorn.lib & unicorn.dll + in the same directory. + + + +- To build Unicorn using Visual Studio, choose the generator accordingly to the + version of Visual Studio on your machine. For example, with Visual Studio 2013, do: + + mkdir build + cd build + cmake -G "Visual Studio 12" .. + + After this, find unicorn.sln in the same directory. Open it with Visual Studio + and build the solution including libraries & all test as usual. + + + +[3] You can make sure the prior steps successfully worked by launching one of the + sample binary (sample_*.exe). + +[4] You can also enable just one specific architecture by passing the architecture name + to either the cmake.sh or nmake.bat scripts. e.g.: + + ../cmake.sh x86 + + Will just target the x86 architecture. The list of available architectures is: + X86 ARM AARCH64 M68K MIPS SPARC. + +[5] You can also create an installation image with cmake, by using the 'install' target. + Use: + + cmake --build . --config Release --target install + + This will normally install an image in a default location (NOT SUPPORT Windows), + so it's good to explicitly set this location when configuring CMake. Use: `-DCMAKE_INSTALL_PREFIX=image` + for instance, to put the installation in the 'image' subdirectory of the build directory. + Default value of 'CMAKE_INSTALL_PREFIX' on *nix is '/usr/local'. diff --git a/docs/COMPILE.md b/docs/COMPILE.md index 28c9636f..22fd66cd 100644 --- a/docs/COMPILE.md +++ b/docs/COMPILE.md @@ -3,6 +3,9 @@ see [COMPILE-NIX.md](COMPILE-NIX.md) To compile Unicorn on Windows, see [COMPILE-WINDOWS.md](COMPILE-WINDOWS.md) +To compile Unicorn with CMake on Windows or *nix, see +[COMPILE-CMAKE.md](COMPILE-CMAKE.md) + Then learn more on how to code your own tools with our samples. - For C sample code, see code in directory samples/sample*.c diff --git a/include/unicorn/platform.h b/include/unicorn/platform.h index fcd2c84a..5bbfd8af 100644 --- a/include/unicorn/platform.h +++ b/include/unicorn/platform.h @@ -205,7 +205,9 @@ typedef signed __int64 ssize_t; typedef _W64 signed int ssize_t; #endif +#ifndef va_copy #define va_copy(d,s) ((d) = (s)) +#endif #define strcasecmp _stricmp #if (_MSC_VER < MSC_VER_VS2015) #define snprintf _snprintf diff --git a/nmake.bat b/nmake.bat new file mode 100644 index 00000000..f87ae422 --- /dev/null +++ b/nmake.bat @@ -0,0 +1,40 @@ +:: Unicorn Emulator Engine +:: Build Unicorn libs on Windows with CMake & Nmake +:: Usage: nmake.bat [x86 arm aarch64 m68k mips sparc], default build all. +:: By Huitao Chen, 2019 + +@echo off + +set flags="-DCMAKE_BUILD_TYPE=Release" + +set allparams= + +:loop +set str=%1 +if "%str%"=="" ( + goto end +) +set allparams=%allparams% %str% +shift /0 +goto loop + +:end +if "%allparams%"=="" ( + goto eof +) +:: remove left, right blank +:intercept_left +if "%allparams:~0,1%"==" " set "allparams=%allparams:~1%" & goto intercept_left + +:intercept_right +if "%allparams:~-1%"==" " set "allparams=%allparams:~0,-1%" & goto intercept_right + +:eof + +if "%allparams%"=="" ( +cmake "%flags%" -G "NMake Makefiles" .. +) else ( +cmake "%flags%" "-DUNICORN_ARCH=%allparams%" -G "NMake Makefiles" .. +) + +nmake diff --git a/qemu/include/qemu/compiler.h b/qemu/include/qemu/compiler.h index 20909ea0..d0e322fc 100644 --- a/qemu/include/qemu/compiler.h +++ b/qemu/include/qemu/compiler.h @@ -24,8 +24,15 @@ #endif #endif +/* gcc __builtin___clear_cache() */ +static inline void __builtin___clear_cache(void *beg, void *e) +{ + unsigned char *start = beg; + unsigned char *end = e; + FlushInstructionCache(GetCurrentProcess(), start, end - start); +} -static double rint( double x ) +static inline double rint( double x ) { return floor(x < 0 ? x - 0.5 : x + 0.5); }