This file details the changelog of Unicorn Engine.

-------------------------------
[Version 2.1.1]: Sept 26th, 2024

This is a small release to fix a few urgent issues.

- Remove pkg_resources usage
- Fix wheels distribution for x86_64 macos
- Fix redundant wheel hacks
- Support musllinux distribution

-------------------------------
[Version 2.1.0]: Sept 22nd, 2024

It has been a while since the last release, and 2.1.0 brings several exciting features. Below is the changelog from the latest to the oldest (though not strictly).

Highlights

- Revive QEMU logs, now we have `-DUNICORN_LOGGING=yes` to enable all qemu logs. @BitMaskMixer 
- Faster (up to 40x) write performance by not always doing `store_helper` and cleaning page locks. @tunz @boborjan2
- Brand new python bindings, with strongly typed and many improvements. @elicn 
- Fix to a long-standing MinGW random segfault bug.
- We bring python2 compatibility back.
- We now fully support M1, both building and a pre-built wheel.
- We support snapshot memory now, with a very low overhead copy-on-write fashion. @PhilippTakacs 
- An option to bypass MMU is also added, check our FAQ. @PhilippTakacs 
- A brand new (and modern) java bindings. We are also working to publish it to maven. @nneonneo
- We have zig integrated. @kassane @atipls 
- Now Unicorn no longer allocates 2GB memory for every instance. The memory will be only committed once used and the upper limit can be adjusted with `uc_ctl`.
- New DotNet binding, with published to both Github and Nuget. @TSRBerry 
- The release will attach all binaries, thanks to @marameref 

Fixes & Improvements

- RISCV improvements, but we still have a long way to go. @apparentlymart @ks0777 
- cmake improvements @scribam @es3n1n 
- Various python bindings fix and improvements @bet4it @rhelmot 
- Docs. @gerph @BitMaskMixer 
- Rust bindings. @lockbox @mlgiraud @deadash
- TCG backend fixes. @redoste @StalkR @dglynos 
- PPC32 fixes. @dotCirill 
- Haiku fixes. @kallisti5 
- Improvements to avoid simulator detection. @mrexodia 

New Contributors

* @ks0777 made their first contribution in https://github.com/unicorn-engine/unicorn/pull/1736
* @LG3696 made their first contribution in https://github.com/unicorn-engine/unicorn/pull/1764
* @PhilippTakacs made their first contribution in https://github.com/unicorn-engine/unicorn/pull/1765
* @edsky made their first contribution in https://github.com/unicorn-engine/unicorn/pull/1754
* @tunz made their first contribution in https://github.com/unicorn-engine/unicorn/pull/1790
* @kassane made their first contribution in https://github.com/unicorn-engine/unicorn/pull/1809
* @Xeonacid made their first contribution in https://github.com/unicorn-engine/unicorn/pull/1807
* @nneonneo made their first contribution in https://github.com/unicorn-engine/unicorn/pull/1830
* @lockbox made their first contribution in https://github.com/unicorn-engine/unicorn/pull/1847
* @mlgiraud made their first contribution in https://github.com/unicorn-engine/unicorn/pull/1849
* @basavesh made their first contribution in https://github.com/unicorn-engine/unicorn/pull/1861
* @hamarituc made their first contribution in https://github.com/unicorn-engine/unicorn/pull/1886
* @StalkR made their first contribution in https://github.com/unicorn-engine/unicorn/pull/1907
* @dotCirill made their first contribution in https://github.com/unicorn-engine/unicorn/pull/1910
* @marameref made their first contribution in https://github.com/unicorn-engine/unicorn/pull/1897
* @redoste made their first contribution in https://github.com/unicorn-engine/unicorn/pull/1922
* @xclusivor made their first contribution in https://github.com/unicorn-engine/unicorn/pull/1929
* @elicn made their first contribution in https://github.com/unicorn-engine/unicorn/pull/1629
* @nganhkhoa made their first contribution in https://github.com/unicorn-engine/unicorn/pull/1942
* @es3n1n made their first contribution in https://github.com/unicorn-engine/unicorn/pull/1960
* @BitMaskMixer made their first contribution in https://github.com/unicorn-engine/unicorn/pull/1977
* @apparentlymart made their first contribution in https://github.com/unicorn-engine/unicorn/pull/1995
* @atipls made their first contribution in https://github.com/unicorn-engine/unicorn/pull/1985
* @omer54463 made their first contribution in https://github.com/unicorn-engine/unicorn/pull/2005

Full Changelog: https://github.com/unicorn-engine/unicorn/compare/2.0.1...2.1.0


Again, thanks for all contributors and sorry if I missed your name here (please tell me @wtdcode !). 2.1.1 is also coming because we expect some minor break changes to fix.

-------------------------------
[Version 2.0.1.post1]: Nov 22nd, 2022

This is a small release to complement the previous 2.0.1 release.

Fix:

- Fix the endianness detection in tests.
- Fix the version number in CMakeLists.txt.

-------------------------------
[Version 2.0.1]: Nov 1st, 2022

Unicorn2 makes the first step to [Debian packages](https://tracker.debian.org/pkg/unicorn-engine) and [vcpkg](https://github.com/microsoft/vcpkg/pull/26101)! Thanks @roehling and @LilyWangL !

Features:

- Support building & running on BE hosts. #1710 
- Fix and support `clang-cl` on Windows. #1687 
- Fix python `sdist` and add aarch64 Linux wheels. Note `pip` can build Unicorn2 on M1 now!
- C# binding is refined and upgraded to .Net 6. #1723 

Fix/Improvements:

- Various bindings improvements. #1723
- Improvements for tests. #1684 #1683 #1691 #1711 
- Fail explicitly when VEX.L is set. #1658 
- Fix endianness when writing PPC32 CR register. #1659 
- Fix a bug in `uc_ctl_set_cpu_model` check.
- Fix Tricore PC not updating. #1668 
- Fix the mapping not updated if users modify the mappings in the hooks.
- Handle pathological cases consistently. #1651 
- Fix memory leaks in PPC target. #1680 
- Fix memory leaks in Tricore target. #1681
- Fix MSVC handling in cmake. #1693  
- Fix PC sync-ing problems for `UC_HOOK_BLOCK` hooks.
- Fix PC sync-ed twice when users request a soft restart.
- Prevent overflow with pre-allocated RAM blocks. #1712 
- Add FPCR and FPSR registers #1722 
- Fix ARM CPU state not deep copied.
- Fix PC not sync-ed for memory operation on aarch64.
- Exit invalid store operations early to avoid the target registers being overwritten.
- Improve the support for ARM BE32.

Thanks:

@roehling @LilyWangL @mrexodia @zachriggle @Yu3H0 @rhelmot @relapids @sh4w1 @TSRBerry

-------------------------------
[Version 2.0.0]: July 7th, 2022

Features:

- TriCore Support (#1568)

Fixes/Improvements:

- Build both shared library and static archive as unicorn1 does.
- Misc bindings improvements. #1569 #1600 #1609  #1613 #1616
- Make sure setjmp-setjmp-wrapper-win32 participates in the build. #1604 
- Improve Rust bindings build logic.
- Fix wrong python binding for UC_CTL_TB_REMOVE_CACHE
- Flush translation blocks when the count hook is removed.
- Fix unicorn crash when nested `uc_emu_start` deletes a hook
- Fix CPU not fully resumed when writing PC.
- Don't quit TB if `uc_mem_protect` doesn't change the protection of current TB memory.
- Add type annotations for python bindings.
- Add CPUID hook for python bindings. #1618 
- Don't repeat memory hooks if there is already an unhandled error. #1618 
- Support reads and writes over all Arm SIMD registers #1621
- Fix wrong registers range in python bindings.
- Fix uc_mem_protect on mmio regions
- Fix a UAF caused by hook cache.
- Fix the value collision between UC_MODE_ARMBE8 and UC_MODE_ARM926

Thanks:

@AfoHT @mrexodia @bet4it @lowlyw @ekilmer @ondryaso @QDucasse @PalumboN @uberwoozle

----------------------------------
[Version 2.0.0 rc7]: April 17, 2022

This release is expected to be the real last RC release of Unicorn2. ;)

Features:

- Correctly generate static archives for the static build and have CI auto-tested.
- Rust bindings revised. #1584 
- Compatible with clang-cl compiler. #1581 
- Implement UC_HOOK_INSN for aarch64 MRS/MSR/SYS/SYSL

Fixes/Improvements:

- Several corner cases on our API. #1587 #1595 
- Fix the codegen buffer leak. 
- Rust bindins improvements. #1574 #1575 
- Add "holes" to allow unicorn lib as a drop-in replacement for older ones. #1572 
- s390x backports. #1570 
- Fix exits wrongly removed in nested uc_emu_start
- Fix a possible endless loop for only one translation block in a multithreaded environment.
- Fix wrong PC without `UC_HOOK_CODE` installed.
- Update vb6 bindings license. #1563 
- Fix buffer allocation failure on M1. #1559 
- Fix wrong EFLAGS on startup.
- Fix wrong internal states on nested uc_emu_start.
- Remove armeb-softmmu and aarcheb-softmmu which are usermode targets.
- Advance PPC32 PC. #1558 
- Support UC_PPC_REG_CR.
- Update CI to windows-2019

Thanks:

@shuffle2 @liyansong2018 @rose4096 @nviennot @n1tram1 @iii-i @dzzie @yrashk @bet4it 

----------------------------------
[Version 2.0.0 rc6]: Feburary 13, 2022

This release is expected to be the last RC release of Unicorn2.

Features:

- SystemZ (aka. s390x) support.  #1521   #1547 
- CPUID hook now may return a bool to indicate whether skipping the CPUID instruction.
- ARM/AARCH64 coprocessor registers read/write support. #889 

Fixes/Improvements:

- Rust improvements. More registers enums #1504 Easier to use #1543 #1545 
- M68k improvements. #1507 
- Golang improvements. Enable `uc_ctl_set_model` #1506 
- Unit tests improvements. #1512 
- Various ARM system mode fixes. #1500 #1520 #1525  #1531 
- Read/write arm FPSCR and FPSID. #1453 
- Fix the support for ARMv8
- Fix a large number of memory leaks and unicorn2 now goes with google/oss-fuzz!
- Add more X87 registers.  #1524 
- Add more PPC registers.
- Fix the exception not cleared in python bindings. #1537 
- Correctly support ARM big endian and drops `armeb-softmmu` and `aarch64eb-softmmu`
- Fix ARM CPSR.E not reflected during runtime.
- Resolve fuzzing speed problem on macOS.
- Modernize CmakeFileLists.txt. #1544 
- Fix an issue in nested `uc_emu_start`

Thanks:

@Kritzefitz @zznop @QDucasse @gerph @bet4it @mrexodia @iii-i @jbcayrou @scribam

----------------------------------
[Version 2.0.0 rc5]: November 25, 2021

This release fixes a few urgent bugs and improves performance.

Fixes/Improvements:

- Rust bindings improvements. #1480 #1483
- Allow R/W to cp15 registers. #1481 
- Fix `UC_HOOK_EDGE_GENERATED` not calling for indirect jumps.
- Python bindings build improvements. #1486
- Fix bindings on m1 macOS.
- Support nested `uc_emu_start` calls without context save/restore
- Fix wrong MMIO offset for 32bit targets.
- Fix wrong `uc_mem_unmap` logic for both ram and mmio memory.
- Inline `uc_trace_code` and PC sync to improve performance.
- Various fixes in tests.
- Allow writing to CPSR to switch bank registers.
- Implement MMIO in rust bindings. #1499 

Thanks:

- @domenukk 
- @bet4it 
- @mid-kid
- @Kritzefitz

----------------------------------
[Version 2.0.0 rc4]: November 09, 2021

This is a big release of Unicorn and introduces a few powerful new features and a bunch of fixes. 

New Features:

- New API: uc_ctl, by which you could control CPU models, TB caches or multiple exits etc.
- New Hook: UC_HOOK_EDGE_GENERATED, UC_HOOK_TCG_OPCODE
- RISCV CSR read/write.
- Support reading MIPS hi/lo regs. 7268c2a19bce2db72b90e3ea3b133482c3ff4e58
- OSS Fuzzing building support.
- MSVC 32bit and Android build support.
- Introduce clang-format.

Fixes/Improvements:

- Java bindings improvements. unicorn-engine/unicorn#1461
- API Documents updates. unicorn-engine/unicorn#1459
- Rust bindings improvements. unicorn-engine/unicorn#1462
- Add a go.mod for go bindings.
- CMakeLists.txt improvements as a subproject. #1373
- Fix rust bindings build script and add CI.
- Use binary search to find mappings. unicorn-engine/unicorn#1414
- RISCV:
  - Update pc when exiting execution. unicorn-engine/unicorn#1465
  - Add RISCV control status registers to enable floating. unicorn-engine/unicorn#1469 unicorn-engine/unicorn#1478
  - After `ecall`, pc not advanced. unicorn-engine/unicorn#1477
- Fix tb not invalidated when exiting.
- Fix bindings makefile.
- Fix uc_mem_protect not working. unicorn-engine/unicorn#1468

Thanks:

- @bet4it
- @kabeor
- @chfl4gs 
- @QDucasse
- @h33p
- @geohot
- @cla7aye15I4nd
- @jcalabres

----------------------------------
[Version 2.0.0 rc3]: October 06, 2021

This is an urgent pre-release regarding python bindings on older Linux systems.

- Support older Linux distribution, e.g. prior to Ubuntu 19.04
- Fix a memory leak in `uc_close`
- Support building on Android
- Support hooking CPUID instruction.

Enjoy.

----------------------------------
[Version 2.0.0 rc2]: October 05, 2021

This is an urgent pre-release regarding the packaging problem of python bindings.

- Set `zip_false` and `is_pure` to `False` to avoid issues on some Linux distributions.
- Link to `libm` to make sure our libraries work.
- Support to read ST registers in rust bindings.
- Fix #1450

Enjoy.

----------------------------------
[Version 2.0.0 rc1]: October 04, 2021

Unicorn2 first release candidate!

- Based on Qemu 5.0.1
- Remain backward compatible with Unicorn 1.x
- Update ISA of all existing architectures
- Support 2 new architectures in PowerPC & RISCV

----------------------------------
[Unicorn2-beta]: October 3rd, 2021

- Release Unicorn2 beta to public.
- New logo to celebrate this important milestone!

----------------------------------
[Version 1.0.1]: April 20th, 2017

- Properly handle selected-architecture build.
- Fix compilation issues on PPC & S390x.
- Fix a memory leak on uc_mem_protect().
- ARM:
    - Support big-endian mode.
    - Correct instruction size of Thumb/Thumb2 code.
    - Support read/write APSR register.
- ARM64:
    - Support read/write NEON registers.
    - Support read/write NZCV registers.
- Mips: Support read/write Mips64 registers.
- X86: Support read/write MSR.
- Haskell binding: update to the latest API.
- Python: allow not having PATH setup.

----------------------------------
[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.

----------------------------------
[Version 1.0-rc3]: January 25th, 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).
- ARM: support MCLASS cpu (Cortex-M3).
- Windows: export a static lib that can be used outside of Mingw

----------------------------------
[Version 1.0-rc1]: December 22nd, 2016

- Lots of bugfixes in all architectures.
- Better support for ARM Thumb.
- Fix many memory leaking issues.
- New bindings: Haskell, MSVC.
- Better support for Python3.
- New APIs: uc_query, uc_reg_write_batch, uc_reg_read_batch, uc_mem_map_ptr, uc_mem_regions, uc_context_alloc, uc_context_save & uc_context_restore.
- New memory hook type: UC_HOOK_MEM_READ_AFTER.
- Add new version macros UC_VERSION_{MAJOR, MINOR, EXTRA}

----------------------------------
[Version 0.9]: October 15th, 2015

- Initial public release.

