Merge branch 'dev'
This commit is contained in:
commit
241a391cec
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "unicorn-engine"
|
||||
version = "2.0.0"
|
||||
version = "2.0.1"
|
||||
authors = ["Ziqiao Kong", "Lukas Seidel"]
|
||||
documentation = "https://github.com/unicorn-engine/unicorn/wiki"
|
||||
edition = "2021"
|
||||
|
@ -9,14 +9,12 @@ module Common =
|
||||
let UC_API_MAJOR = 2
|
||||
|
||||
let UC_API_MINOR = 0
|
||||
|
||||
let UC_API_PATCH = 0
|
||||
let UC_API_PATCH = 1
|
||||
let UC_API_EXTRA = 255
|
||||
let UC_VERSION_MAJOR = 2
|
||||
|
||||
let UC_VERSION_MINOR = 0
|
||||
|
||||
let UC_VERSION_PATCH = 0
|
||||
let UC_VERSION_PATCH = 1
|
||||
let UC_VERSION_EXTRA = 255
|
||||
let UC_SECOND_SCALE = 1000000
|
||||
let UC_MILISECOND_SCALE = 1000
|
||||
|
@ -4,14 +4,12 @@ const (
|
||||
API_MAJOR = 2
|
||||
|
||||
API_MINOR = 0
|
||||
|
||||
API_PATCH = 0
|
||||
API_PATCH = 1
|
||||
API_EXTRA = 255
|
||||
VERSION_MAJOR = 2
|
||||
|
||||
VERSION_MINOR = 0
|
||||
|
||||
VERSION_PATCH = 0
|
||||
VERSION_PATCH = 1
|
||||
VERSION_EXTRA = 255
|
||||
SECOND_SCALE = 1000000
|
||||
MILISECOND_SCALE = 1000
|
||||
|
@ -6,14 +6,12 @@ public interface UnicornConst {
|
||||
public static final int UC_API_MAJOR = 2;
|
||||
|
||||
public static final int UC_API_MINOR = 0;
|
||||
|
||||
public static final int UC_API_PATCH = 0;
|
||||
public static final int UC_API_PATCH = 1;
|
||||
public static final int UC_API_EXTRA = 255;
|
||||
public static final int UC_VERSION_MAJOR = 2;
|
||||
|
||||
public static final int UC_VERSION_MINOR = 0;
|
||||
|
||||
public static final int UC_VERSION_PATCH = 0;
|
||||
public static final int UC_VERSION_PATCH = 1;
|
||||
public static final int UC_VERSION_EXTRA = 255;
|
||||
public static final int UC_SECOND_SCALE = 1000000;
|
||||
public static final int UC_MILISECOND_SCALE = 1000;
|
||||
|
@ -7,14 +7,12 @@ interface
|
||||
const UC_API_MAJOR = 2;
|
||||
|
||||
UC_API_MINOR = 0;
|
||||
|
||||
UC_API_PATCH = 0;
|
||||
UC_API_PATCH = 1;
|
||||
UC_API_EXTRA = 255;
|
||||
UC_VERSION_MAJOR = 2;
|
||||
|
||||
UC_VERSION_MINOR = 0;
|
||||
|
||||
UC_VERSION_PATCH = 0;
|
||||
UC_VERSION_PATCH = 1;
|
||||
UC_VERSION_EXTRA = 255;
|
||||
UC_SECOND_SCALE = 1000000;
|
||||
UC_MILISECOND_SCALE = 1000;
|
||||
|
@ -29,7 +29,7 @@ SRC_DIR = os.path.join(ROOT_DIR, 'src')
|
||||
UC_DIR = SRC_DIR if os.path.exists(SRC_DIR) else os.path.join(ROOT_DIR, '../..')
|
||||
BUILD_DIR = os.path.join(UC_DIR, 'build_python')
|
||||
|
||||
VERSION = "2.0.0"
|
||||
VERSION = "2.0.1"
|
||||
|
||||
if SYSTEM == 'darwin':
|
||||
LIBRARY_FILE = "libunicorn.2.dylib"
|
||||
|
@ -2,14 +2,12 @@
|
||||
UC_API_MAJOR = 2
|
||||
|
||||
UC_API_MINOR = 0
|
||||
|
||||
UC_API_PATCH = 0
|
||||
UC_API_PATCH = 1
|
||||
UC_API_EXTRA = 255
|
||||
UC_VERSION_MAJOR = 2
|
||||
|
||||
UC_VERSION_MINOR = 0
|
||||
|
||||
UC_VERSION_PATCH = 0
|
||||
UC_VERSION_PATCH = 1
|
||||
UC_VERSION_EXTRA = 255
|
||||
UC_SECOND_SCALE = 1000000
|
||||
UC_MILISECOND_SCALE = 1000
|
||||
|
@ -4,14 +4,12 @@ module UnicornEngine
|
||||
UC_API_MAJOR = 2
|
||||
|
||||
UC_API_MINOR = 0
|
||||
|
||||
UC_API_PATCH = 0
|
||||
UC_API_PATCH = 1
|
||||
UC_API_EXTRA = 255
|
||||
UC_VERSION_MAJOR = 2
|
||||
|
||||
UC_VERSION_MINOR = 0
|
||||
|
||||
UC_VERSION_PATCH = 0
|
||||
UC_VERSION_PATCH = 1
|
||||
UC_VERSION_EXTRA = 255
|
||||
UC_SECOND_SCALE = 1000000
|
||||
UC_MILISECOND_SCALE = 1000
|
||||
|
15
docs/FAQ.md
15
docs/FAQ.md
@ -9,10 +9,10 @@ Optimize your program with less instrumentation, e.g. by using `UC_HOOK_BLOCK` i
|
||||
|
||||
## Why do I get a wrong PC after emulation stops?
|
||||
|
||||
Updating PC is a very large overhead (10x slower in the worst case, see FAQ above) for emulation so the PC sync guarantee is explained below:
|
||||
Updating PC is a very large overhead (10x slower in the worst case, see FAQ above) for emulation so the PC sync guarantee is explained below in several cases:
|
||||
|
||||
- A `UC_HOOK_CODE` is installed. In this case, the PC is sync-ed _everywhere_ within the effective range of the hook. However, on some architectures, the PC might by sync-ed all the time if the hook is installed.
|
||||
- A `UC_HOOK_MEM_READ` or `UC_HOOK_MEM_WRITE` is installed. In this case, the PC is sync-ed exactly before any read/write events within the effective range of the hook.
|
||||
- A `UC_HOOK_CODE` hook is installed. In this case, the PC is sync-ed _everywhere_ within the effective range of the hook. However, on some architectures, the PC might by sync-ed all the time if the hook is installed in any range. Note using `count` in `uc_emu_start` implies installing a `UC_HOOK_CODE` hook.
|
||||
- A `UC_HOOK_MEM_READ` or `UC_HOOK_MEM_WRITE` hook is installed. In this case, the PC is sync-ed exactly before any read/write events within the effective range of the hook.
|
||||
- Emulation (`uc_emu_start`) terminates without any exception. In this case, the PC will point to the next instruction.
|
||||
- No hook mentioned above is installed and emulation terminates with exceptions. In this case, the PC is sync-ed at the basic block boundary, in other words, the first instruction of the basic block where the exception happens.
|
||||
|
||||
@ -44,12 +44,13 @@ Currently, only a small subset of the instructions can be instrumented.
|
||||
|
||||
On x86, all available instructions are: `in` `out` `syscall` `sysenter` `cpuid`.
|
||||
|
||||
## Emulating some instructions gives an error, what should I do?
|
||||
## Emulating some instructions gives an error like "Invalid Instruction", what should I do?
|
||||
|
||||
1. Some instructions are not enabled by default on some architectures. For example, you have to setup CSR on RISC-V or VFP on ARM before emulating floating-point instructions. Refer to the corresponding manual to check if you leave out possible switches in special registers.
|
||||
2. If you are on ARM, please check whether you are emulating a THUMB instruction. If so, please use `UC_MODE_THUMB` and make sure the starting address is odd.
|
||||
3. If either is not the case, it might be some newer instruction sets that qemu5 doesn’t support.
|
||||
4. Note some instruction sets are not implemented by QEMU.
|
||||
2. Different CPU models support different sets of instructions. This is especially observed on ARM CPUs. For example, for `THUMB2` big-endian instructions, consider setting CPU model to `cortex-r5` or `arm_max`. See [#1725](https://github.com/unicorn-engine/unicorn/issues/1725) and [#1724](https://github.com/unicorn-engine/unicorn/issues/1724).
|
||||
3. If you are on ARM, please check whether you are emulating a THUMB instruction. If so, please use `UC_MODE_THUMB` and make sure the starting address is odd.
|
||||
4. If it's not the cases above, it might be some newer instruction sets that qemu5 doesn’t support.
|
||||
5. Note some instruction sets are not implemented by the latest QEMU.
|
||||
|
||||
If you are still using Unicorn1, please upgrade to Unicorn2 for better support.
|
||||
|
||||
|
@ -72,7 +72,7 @@ typedef size_t uc_hook;
|
||||
// Unicorn API version
|
||||
#define UC_API_MAJOR 2
|
||||
#define UC_API_MINOR 0
|
||||
#define UC_API_PATCH 0
|
||||
#define UC_API_PATCH 1
|
||||
// Release candidate version, 255 means the official release.
|
||||
#define UC_API_EXTRA 255
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user