A fast usermode x86 and x86-64 emulator for Arm64 Linux
Go to file
Ryan Houdek ed12a8a242 Fixes x86 instruction decoding.
In the case of modrm + immediate then the immediate would end up
overwriting Src1 due to the the order of the decoding.
Changes Src1 and Src2 to an array and use a variable to index the array.
Causes a bit of code churn but fixes instruction decoding and allows
easier expansion in the future for instructions that have more sources
like AVX
2020-03-06 07:56:15 +02:00
docs Update IR documentation 2020-03-06 07:55:36 +02:00
Examples Refactor context start/pause/step interface 2020-03-06 07:56:01 +02:00
External Update vixl external to fix CNTVCT_EL0 2020-03-06 07:56:07 +02:00
include/FEXCore Fixes x86 instruction decoding. 2020-03-06 07:56:15 +02:00
Scripts Adds new IR::GetArgs function 2020-03-06 07:55:20 +02:00
Source Fixes x86 instruction decoding. 2020-03-06 07:56:15 +02:00
.gitignore Adds gitignore 2020-03-06 07:55:35 +02:00
.gitmodules Update git submodules to point to the correct vixl repo 2020-03-06 07:51:42 +02:00
CMakeLists.txt Updates project to allow it to be installed 2020-03-06 07:55:59 +02:00
LICENSE Initial commit 2020-03-06 07:48:39 +02:00
Readme.md Initial commit 2020-03-06 07:48:39 +02:00

FEXCore - Fast x86 Core emulation library

This is the core emulation library that is used for the FEX emulator project. This project aims to provide a fast and functional x86-64 emulation library that can meet and surpass other x86-64 emulation libraries.

Goals

  • Be as fast as possible, beating and exceeding current options for x86-64 emulation
    • 25% - 50% lower performance than native code would be desired target
    • Use an IR to efficiently translate x86-64 to our host architecture
    • Support a tiered recompiler to allow for fast runtime performance
    • Support offline compilation and offline tooling for inspection and performance analysis
    • Support threaded emulation. Including emulating x86-64's strong memory model on weak memory model architectures
  • Support a significant portion of the x86-64 instruction space.
    • Including MMX, SSE, SSE2, SSE3, SSSE3, and SSE4*
  • Support fallback routines for uncommonly used x86-64 instructions
    • Including x87 and 3DNow!
  • Only support userspace emulation.
    • All x86-64 instructions run as if they are under CPL-3(userland) security layer
  • Minimal Linux Syscall emulation for testing purposes
  • Portable library implementation in order to support easy integration in to applications

Target Host Architecture

The target host architecture for this library is AArch64. Specifically the ARMv8.1 version or newer. The CPU IR is designed with AArch64 in mind but there is a desire to run the recompiled code on other architectures as well. Multiple architecture support is desired for easier bringup and debugging, performance isn't as much of a priority there (ex. x86-64(guest) translated to x86-64(host))

Not currently goals but will be in the future

  • 32bit x86 support
    • This will be a desire in the future, but to lower the amount of work required, decided to push this off for now.
  • Integration in to WINE
  • Later generation of x86-64 instruction sets
    • Including AVX, F16C, XOP, FMA, AVX2, etc

Not desired

  • Kernel space emulation
  • CPL0-2 emulation
  • Real Mode, Protected Mode, Virtual-8086 Mode, System Management Mode
  • IRQs
  • SVM
  • "Cycle Accurate" emulation

Dependencies

  • SonicUtils
  • LLVM
  • clang-tidy if you want to ensure the code stays tidy
  • cmake
  • A C++17 compliant compiler (There are assumptions made about using Clang and LTO)