Compare commits

...
2267 Commits
Author SHA1 Message Date
ptitSeb 60c6858916 Bumped to v0.2.2 2023-03-10 17:10:24 +01:00
ptitSeb c5e085bc96 Added 2 more wrapped function to libgnutls (for #210) 2023-03-09 22:05:36 +01:00
ptitSeb 8dc669bc33 Added libresolv to libc for glibc2.34+ (might help #210) 2023-03-09 20:57:49 +01:00
ptitSeb 8aed75a338 Merge pull request #544 from ksco/simplify-arm64_lock
[DYNAREC] Simplify arm64 lock file
2023-03-09 18:27:14 +01:00
Yang Liu e486e2ce8d [DYNAREC] Simplify arm64 lock file 2023-03-10 01:10:01 +08:00
ptitSeb a1705da6da [DYNAREC] More small fixes to arm64 lock file 2023-03-09 17:07:13 +01:00
ptitSeb 0092a029c4 Merge pull request #543 from ksco/fix-arm64_lock_incif0
[ARM64] Fixed a typo in arm64_lock_incif0
2023-03-09 16:39:45 +01:00
Yang Liu 176ef90258 [ARM64] Fixed a typo in arm64_lock_incif0 2023-03-09 23:17:03 +08:00
ptitSeb f82a6b7b41 [DYNAREC] Fixed a nasty bug in loadCache/unloadCache of x87 regs 2023-03-08 11:48:53 +01:00
ptitSeb c79c42b62d [DYNAREC] Added BOX64_DYNAREC_FORWARD parameter, with a default value to 128 (works well on box64, with up to 30% more speed) 2023-03-07 22:03:58 +01:00
ptitSeb 91dd7adbfa Removed ONCE optim in gtkclass 2023-03-07 13:19:59 +01:00
ptitSeb de82f07277 Added some special case to the CPU Name grabbing 2023-03-06 19:17:02 +01:00
ptitSeb 0c8e0b6708 Fixed cpu name extraction for big.LITTLE configurations 2023-03-06 14:32:06 +01:00
ptitSeb c71a840e74 [DYNAREC] Put box64 dynarec and cpu info on the same line 2023-03-06 14:18:30 +01:00
ptitSeb 2b5c25ef17 Change branding of Cpu to refect Box64 and the cpu it's running on 2023-03-06 14:11:28 +01:00
ptitSeb da34156267 Merge pull request #536 from ksco/fix-rv64-warning
[RISCV] Get pc from ucontext_t for RV64
2023-03-06 14:10:31 +01:00
Yang Liu 113ef45c6c [RISCV] Get pc from ucontext_t for RV64
Removed a warning:

box64/src/libtools/signals.c:846:6: warning: #warning Unhandled architecture [-Wcpp]
  846 |     #warning Unhandled architecture
      |      ^~~~~~~
2023-03-06 20:06:04 +08:00
ptitSeb 67dd40dc08 Wrapped 1 more libc function for bash (for #770) 2023-03-06 08:56:39 +01:00
ptitSeb 1e0fee739e Forcing BAD_SIGNAL for RK3588 config 2023-03-05 23:03:52 +01:00
ptitSeb d59a98ffe6 Added back the load of libGL when using GL in SDL2 (fixed regression with Nuclear Blaze) 2023-03-05 22:25:19 +01:00
ptitSeb 5e9429afe8 [RCFLE] Better default for heroic launcher when no rcfile is found 2023-03-05 22:07:39 +01:00
ptitSeb 31fd0451d0 Made the Signal workaround more generic, so it can be used by Termux user 2023-03-05 21:01:40 +01:00
ptitSeb b56be08f95 Merge pull request #534 from ptitSeb/steam_chrome
Steamwebhelper compatibility
2023-03-05 20:47:50 +01:00
ptitSeb b1923cadb5 [DYNAREC] Some fixes to double SSE opcode (fixes Steam BigPicture) 2023-03-05 20:16:22 +01:00
ptitSeb 0a955c1020 Removed a warning when getting glXGetProcAddress with a glXGetProcAddress function 2023-03-05 20:14:30 +01:00
ptitSeb 791efc9e79 Added wrapped libGLX 2023-03-05 16:42:20 +01:00
ptitSeb f9bc94bfb8 Refactored OpenGL symbol fetching and managment 2023-03-05 15:09:11 +01:00
ptitSeb 72119ddfa4 Added automatic detection of libcef (will help zoon #510, #451, #302 and probably other too) 2023-03-05 11:48:48 +01:00
ptitSeb d4afca9b5a Added some more wrapped function for zoom (for #510, #451, #302...) 2023-03-05 11:33:17 +01:00
ptitSeb 219ac40a7d [DYNAREC] Fixed (again) and improved new jmptable memory manager 2023-03-05 09:59:26 +01:00
ptitSeb b9378fe4c1 Let steamwebhelper use native gtk 2023-03-04 13:11:14 +01:00
ptitSeb 3c05822011 [DYNAREC] Fixed a nasty bug with the finetunning of the jump table memory allocation 2023-03-04 11:51:28 +01:00
ptitSeb 02cad7b5fe Added wrapped libibus and a few other libgtk fixed 2023-03-04 10:31:34 +01:00
ptitSeb 1a85ec5fdb Better way to use CREATE_VALIST_FROM_VAARG macro 2023-03-03 10:53:07 +01:00
ptitSeb 3e19cfe58e Use CREATE_VALIST_FROM_VAARG if exist on XXprintf family 2023-03-02 22:27:42 +01:00
ptitSeb 3d3c7437be Better default rcfile for when no rcfile are present 2023-03-02 20:41:09 +01:00
ptitSeb c4b57774f0 [DYNAREC] Finetuned the jump table memory allocation 2023-03-02 19:38:23 +01:00
ptitSeb f7acded7a1 Merge branch 'main' into steam_chrome 2023-03-02 11:11:56 +01:00
ptitSeb cabcca2e31 Added a couple of wrapped function to libm (for #496) 2023-02-28 14:02:00 +01:00
ptitSeb cc3237a77d [RK3588] Made Workaround also working on non-dynarec build (just in case...) 2023-02-26 09:47:15 +01:00
ptitSeb b65e02420f Made the Signal workaround specific to RK3588 2023-02-26 09:38:01 +01:00
ptitSeb 5a7761c294 Try to improved the Workaround, to make it more generic 2023-02-25 16:11:00 +01:00
ptitSeb ad332494d0 [STEAM] Added a workaround for issue with steamwebhelper running on Armbian (for #528 and other tickets) 2023-02-25 15:21:27 +01:00
ptitSeb eb212cd27e [DYNAREC] Small imrvment in managing memory protection 2023-02-25 15:20:12 +01:00
ptitSeb b604dd0bcc fixed logs to malloc_hack_2 2023-02-24 19:29:41 +01:00
ptitSeb c0b879c998 Added more logs to malloc_hack_2 2023-02-24 19:26:41 +01:00
ptitSeb e473af1635 Merge branch 'main' into steam_chrome 2023-02-24 17:00:14 +01:00
ptitSeb 8d9c6b2d01 Merge pull request #526 from julliard/dynarec
[DYNAREC] Fix a couple of typos
2023-02-24 16:58:28 +01:00
Alexandre Julliard 7cdcb6c4ef [DYNAREC] Fetch a quad in PSHUFLW instruction.
Only the low 64 bits are shuffled, but the high 64 bits still need to
be copied.
2023-02-24 16:31:29 +01:00
Alexandre Julliard ca44d84e55 [DYNAREC] Fix the opcode bit in the generated TBX instruction.
Currently unused, spotted by reading the code.
2023-02-24 16:31:23 +01:00
ptitSeb e73a3c3376 Merge branch 'main' into steam_chrome 2023-02-23 15:33:04 +01:00
ptitSeb 1f9973e623 [D3DADAPTER9] Added support for CreateDeviceEx 2023-02-23 15:32:45 +01:00
ptitSeb 9077f3d675 Merge branch 'main' into steam_chrome 2023-02-21 21:12:41 +01:00
ptitSeb ce61d27d8d Use Ubuntu 20.04 for Tegra build
The 18.04 is deprecated by GitHub and will be removed soon.
2023-02-21 21:11:44 +01:00
ptitSeb 5c1dbc0104 Simply handling of pthread_mutex_t structure (for #522) 2023-02-21 21:06:52 +01:00
ptitSeb aa55f67ee3 Merge branch 'main' into steam_chrome 2023-02-21 18:54:47 +01:00
ptitSeb 9516694c35 Added a large batch of libssl/libcrypto wrapped functions (for StardewValley) 2023-02-21 18:54:31 +01:00
ptitSeb c6a9f239c4 Merge pull request #521 from alyssarosenzweig/xasync
wrap _XAsyncErrorHandler
2023-02-21 08:12:06 +01:00
Alyssa Rosenzweig a922acc4dd wrap _XAsyncErrorHandler
Hit this using libGLX.so from the FEX rootfs.

Signed-off-by: Alyssa Rosenzweig <[email protected]>
2023-02-20 20:44:33 -05:00
ptitSeb bfef8c9bbe Merge branch 'main' into steam_chrome 2023-02-20 21:30:22 +01:00
ptitSeb 3fe2843bb3 Added some more libFAudio wrapped functions 2023-02-20 21:18:58 +01:00
ptitSeb 42b8378988 Preliminary work to get steamwebhelper working 2023-02-20 20:34:59 +01:00
ptitSeb c6bd721d2e [DYNAREC] Optimized DB /7 opcode 2023-02-20 20:25:21 +01:00
ptitSeb 83eedef999 Added some more wrapped functions to gstreamer and gsttag 2023-02-20 20:25:21 +01:00
ptitSeb 1411e7f9f6 Hide a warning when running java stuffs 2023-02-20 20:25:21 +01:00
ptitSeb 5d42d9212f Improved convertion to/from 80bits double, and added BOX64_X87_NO80BITS to not handle them 2023-02-20 20:25:21 +01:00
ptitSeb 4a1e05524a Fixed a regression with factorio 2023-02-20 20:25:21 +01:00
ptitSeb fb5ac9c4cd Fixed a improved HotPage handling 2023-02-20 19:50:26 +01:00
ptitSeb ed4e33d888 [DYNAREC] Directly run program Segfault handler for Access Error with PROT_DYNAREC_R, after a quick unprotectDB first 2023-02-20 19:49:55 +01:00
ptitSeb c6dd73065d [DYNAREC] This small utility function can be static 2023-02-20 19:48:47 +01:00
ptitSeb 9ef48de1a8 [DYNAREC] Fixed LZCNT and TZCNT opcode, for good 2023-02-20 16:38:27 +01:00
ptitSeb 692ad43285 [DYNAREC] Optimized FillBlock64 to avoid 3 for loop on all block instructions and a temporary malloc/free 2023-02-19 23:55:18 +01:00
ptitSeb d06ff478d1 [DYNAREC] Introduced BOX64_DYNAREC_FASTPAGE to use an alternate way to handle HotPages (faster but crashy) 2023-02-19 23:54:00 +01:00
ptitSeb 83db04cdce Improved RK3588 profile 2023-02-19 22:20:57 +01:00
ptitSeb d0a724bb08 [DYNAREC] Optimized DB /7 opcode 2023-02-19 17:58:11 +01:00
ptitSeb 8e9ac1b9ac Added some more wrapped functions to gstreamer and gsttag 2023-02-19 15:12:46 +01:00
ptitSeb 272d4efd4b Hide a warning when running java stuffs 2023-02-19 15:04:36 +01:00
ptitSeb 4610f451e9 Improved convertion to/from 80bits double, and added BOX64_X87_NO80BITS to not handle them 2023-02-19 14:50:01 +01:00
ptitSeb 0810859c21 Fixed a regression with factorio 2023-02-19 11:41:31 +01:00
ptitSeb 93c447051c [DYNAREC] Fix a nasty typo in custommem 2023-02-19 10:43:46 +01:00
ptitSeb 60b3f042a8 Some fixes in custommem tracking, and less tracking of mem protection (reduce memory consuption) 2023-02-19 10:40:29 +01:00
ptitSeb c5632360d6 Merge branch 'main' into steam_chrome 2023-02-19 10:05:41 +01:00
ptitSeb a379b4aab8 [DYNAREC] Small optim on getDB 2023-02-19 10:04:27 +01:00
ptitSeb 3b8d6ef208 Simplified dynablock handling (reduced memory consuption) 2023-02-19 09:56:42 +01:00
ptitSeb 9705d5e38b Preliminary work to get steamwebhelper working 2023-02-18 15:06:40 +01:00
ptitSeb 2e59b56f16 Added 67 0F B9 opcode 2023-02-18 13:24:17 +01:00
ptitSeb d9f9e8e57a [RCFILE] Small fix to avoind applying same profile multiple time 2023-02-18 13:23:56 +01:00
ptitSeb 33a8befbcf Changed workflow manual build for RK3588 too 2023-02-18 09:12:12 +01:00
ptitSeb 4f66a419e3 Build RK3588 on Workflow 2023-02-18 09:10:55 +01:00
ptitSeb 65992746d3 Added RK3588 profile 2023-02-18 09:09:40 +01:00
ptitSeb cbd4c64084 Fix non-Dynarec builds 2023-02-18 08:56:38 +01:00
ptitSeb 081be61f88 Force show Backtrace when SIGABRT is trapped (still depending on SHOWSEGV/LOG level if it's shown or not) 2023-02-18 08:46:29 +01:00
ptitSeb b89ca87280 Imrpoved a bit backtrace again 2023-02-18 08:44:54 +01:00
ptitSeb ca84f10921 Rmoved debug leftover 2023-02-17 18:01:48 +01:00
ptitSeb 2200c4af6b Various improvment to backtrace, protection tracking, and SHOWBT. Also SIGABRT is tracked like SIGSEGV, SIGILL and SIGBUS 2023-02-17 17:56:33 +01:00
ptitSeb 838dfa453c [DYNAREC] Added F0 0F AB/B3 opcodes 2023-02-17 11:57:00 +01:00
ptitSeb 6f3d636226 [DYNAREC] Added BOX64_DYNAREC_WAIT env. var. (Default to 1) 2023-02-16 16:14:37 +01:00
ptitSeb f03792619a [DYNAREC] Some more small fixes 2023-02-16 16:12:15 +01:00
ptitSeb 21b3292fff Fixed an issue with Emulated lib refcount 2023-02-16 13:36:26 +01:00
ptitSeb 39ebeb2401 Fixed interpretor for FIST(P) opcodes 2023-02-16 13:06:39 +01:00
ptitSeb 8f4e8ed1e7 [DYNAREC] Various small fixes and improvment on Dynarec 2023-02-16 12:17:42 +01:00
ptitSeb 0e10ead81a Various small fixes on Interpretor 2023-02-16 12:17:14 +01:00
ptitSeb 476612d8f8 Small change to mallochook detector 2023-02-16 12:16:47 +01:00
ptitSeb bd769c9261 Merge pull request #518 from fredldotme/moregsettings
wrapped: Wrap two more gsettings functions
2023-02-16 10:25:47 +01:00
Alfred Neumayer 831f78a389 wrapped: Wrap two more gsettings functions
Allows Electron-based Discord & VSCodium to launch on Ubuntu Touch 20.04.
2023-02-16 09:52:38 +01:00
ptitSeb 920edce73e Some improvment to wrapped gtk3 and friends 2023-02-14 20:11:31 +01:00
ptitSeb 7dc7b002c5 Added 1 syscall 2023-02-14 20:10:54 +01:00
ptitSeb c74c9bd693 Refactored trace to file system, to be more resiliant 2023-02-14 20:10:32 +01:00
ptitSeb 1daf15c525 fprintf wrapped libasound dummy_error_handler to stderr instead of box trace file 2023-02-14 20:09:21 +01:00
ptitSeb 108949345f [DYNAREC] Don't forget to Cancel the block itself before bailling out of a failed FillBlock64 2023-02-14 14:58:27 +01:00
ptitSeb 69eb309031 [DYNAREC] Fixed an issue with custom memory alocator 2023-02-14 10:58:58 +01:00
ptitSeb e7f0c8cbe1 Fixed a small warning 2023-02-13 13:25:58 +01:00
ptitSeb 9c8b663d5b Various minor warning fixes 2023-02-13 11:24:13 +01:00
ptitSeb 8309b63fb1 Merge pull request #515 from ptitSeb/d3dadapter9_support
D3dadapter9 support (Galliumnine)
2023-02-12 23:06:57 +01:00
ptitSeb 6d6de880eb Also needed a RunFunctionWindows, following the Windows Calling Convention (and now d3datapter9 works) 2023-02-12 23:02:39 +01:00
rajdakin a65bf79ad9 [WRAPPERS] Forgot to remove typing multiple definition comments 2023-02-12 21:51:11 +01:00
rajdakin c192188b42 [WRAPPERS] Version update 2023-02-12 21:46:51 +01:00
rajdakin a3516ce655 [WRAPPERS] Fixed the Windows ABI 2023-02-12 21:46:19 +01:00
rajdakin 8481db4735 [WRAPPER] Forgot to filter out Windows function from isSimpleWrapper() 2023-02-12 20:30:34 +01:00
ptitSeb b6390c3dbd Change all d3dadapter9 to W type of wrappers 2023-02-12 20:25:57 +01:00
rajdakin 0f914cf747 [WRAPPER] Added the Windows calling convention support 2023-02-12 19:32:06 +01:00
ptitSeb 5fab7d2993 Added preliminary support for d3dadapter9, but need more work on calling convention 2023-02-12 19:09:14 +01:00
ptitSeb faee142876 Fix non-dynarec builds 2023-02-12 17:50:45 +01:00
ptitSeb 215c63233a Small improvment for emu thread tracking 2023-02-12 17:03:33 +01:00
ptitSeb e5afcd14a9 Fixed a nasty typo in free_neededlibs 2023-02-12 16:59:57 +01:00
ptitSeb 96a7d1e7ec [DYNAREC] Use custom mutex, improved Signal while FillBlocks64 and atomic handling 2023-02-12 16:38:12 +01:00
ptitSeb 2d2a65b616 Fixed a memory leak in env handling 2023-02-12 14:08:16 +01:00
ptitSeb b5d32fe271 Fixed a memory leak in rcfile 2023-02-12 14:07:55 +01:00
ptitSeb 8a5a69818e Added some more gtk3 wrapped functions 2023-02-12 11:35:50 +01:00
ptitSeb 56701220e9 [DYNAREC] Fixed a typo in setProtection 2023-02-11 22:58:39 +01:00
ptitSeb 6bf434a7ab Added some more function to wrapped libgcrypt.so 2023-02-11 20:06:21 +01:00
ptitSeb d1e767d30c [DYNAREC] Improved bridge handling 2023-02-11 09:45:39 +01:00
ptitSeb 4874df25a2 Small change to avoid printing GPG pubkey on console 2023-02-11 09:26:33 +01:00
Tristan Morgan f43868e4dc Fixed parameter order for BOX64_DYNAREC_HOTPAGE env parsing. (#511) 2023-02-09 09:16:03 +01:00
RainbowC0 bc8227d2bd Changes for Alpine (#508)
* Update CMakeLists.txt

Replaced bash with sh so that it can be compiled on Alpine

* Update elfloader.c

* Update threads.c

Replaced __clock_id with clock_id to adapted to Alpine.
2023-02-05 11:11:29 +01:00
ptitSeb 09e748d6c9 Added a couple of wrapped libX11 function (for #503) 2023-02-04 11:19:17 +01:00
ptitSeb 4038ad5ce5 Added fts64_XXX wrapped functions to libc (for #503) 2023-02-04 11:17:34 +01:00
ptitSeb 973864e045 Added partial support for register_printf_specifier and friend (for #503) 2023-02-04 11:11:47 +01:00
ptitSeb af694b57a2 Added sqrtl wrapped function (for #503) 2023-02-04 10:50:46 +01:00
ptitSeb 07be0c6ef4 Added some more wrapped functions to glib2 and gobject2 (for #503) 2023-02-04 10:39:56 +01:00
ptitSeb 78a336c092 Added ODROIDN2 Compile instruction (for #755) 2023-02-03 16:25:10 +01:00
RainbowC0 649c0f8055 Update x64emu.c (#507)
Added some adapations for Android as there is no __builtin_aarch64_get_fpcr and __builtin_aarch64_set_fpcr in Bionic.
2023-02-03 15:43:54 +01:00
ptitSeb 87b66b8db8 Don't wrap struct obstack, alignment should be the same (for #504) 2023-02-02 16:39:01 +01:00
ptitSeb a4ffa3de7a Added F0 FE /1 and /2 opcodes ([DYNAREC] too) (for #505) 2023-02-02 16:25:57 +01:00
ptitSeb dd111f55f6 Added 1 vulkan extension 2023-01-29 20:47:19 +01:00
ptitSeb 5db6264d8f [DYNAREC] Made FASTROUND the default (faster, less accurate) 2023-01-29 16:14:27 +01:00
ptitSeb 4ce63c8caf Added a couple of extension to libGL wrapper 2023-01-29 10:28:16 +01:00
ptitSeb 727f8b1d9b dlopen with RTLD_NOLOAD flags should inc refcount if lib is present 2023-01-29 10:18:32 +01:00
ptitSeb 35f2bcf296 Fixed another regression from last lib init/fini refactor (fixed SiliconZero crash at load) 2023-01-28 22:36:21 +01:00
ptitSeb 7ebfe84489 Fixed some isse with last lib init/fini refactor (fixed ut2004, maybe pokewilds too) 2023-01-28 22:00:22 +01:00
ptitSeb 4e645debaa [DYNAREC] Fixed a potential crash when running without Dynarec 2023-01-28 21:59:14 +01:00
ptitSeb 821ab99bf7 Try to improve precision of SSE Rounding to int conversion ([DYNAREC] too, introducing BOX64_DYNAREC_FASTROUND to ignore that) 2023-01-28 19:09:06 +01:00
ptitSeb 282e242f5e [DYNAREC] Improved Strong Memory Model emulation 2023-01-28 10:38:26 +01:00
ptitSeb 13deb8d8d7 [DYNAREC] Forced 64 FF /4 JMP ocode to fetch X_PEND 2023-01-28 10:34:52 +01:00
ptitSeb 389992c330 [DYNAREC] Fixed a regression with C1 /0 and C1 /1 opcodes 2023-01-28 10:34:05 +01:00
q4a 0753c52bed [BOX64RC] add EMULATED_LIBS for dontstarve_steam_x64 (#502)
Works with steam version of Don't Starve Together
2023-01-28 10:19:04 +01:00
ptitSeb 24ce9b0f8d Added 1 more syscall 2023-01-22 18:00:55 +01:00
Steven Vanden Branden 6e6f8412a5 use sighandler_t instead of __sighandler_t so it compiles for musl (#500) 2023-01-20 14:38:58 +01:00
ptitSeb 853cdcdd31 [DYNAREC] Try to fix 66 64 0F 2E/2F ocpode (for #488) 2023-01-19 11:35:04 +01:00
ptitSeb f24ec20623 Added a few wrapped gio2 symbols (for #490) 2023-01-19 11:27:54 +01:00
ptitSeb cdc7d695e9 Added curl_easy_opt 20094 and friend (for #497) 2023-01-19 11:23:22 +01:00
colin-i d1cf754c6e more swap for rpi3 (#499) 2023-01-16 17:19:19 +01:00
Neil Davis d1f63fe260 Add support for Rpi3 on 64-bit ARM (aarch64) (#494) 2023-01-09 16:02:14 +00:00
ptitSeb 53eee70c03 Fix, for good, non-dynarec build 2023-01-05 19:20:39 +01:00
ptitSeb 7b73ba551e Fix build on non-dynarec build 2023-01-05 19:09:14 +01:00
ptitSeb af1176274a Added more command to rcfiles, and a default one when system version is not found (and move some essential detection there) 2023-01-05 18:45:36 +01:00
ptitSeb 4c2ef9947a Fixed an issue with TLS Relocation (should fix the regression notified in #360) 2023-01-05 18:19:24 +01:00
ptitSeb db7c9e96ea [DYNAREC] Force reading of X_PEND flags for FF /4 JMP opcode 2023-01-03 14:03:48 +01:00
ptitSeb ee5398b3be Refactored (again) lib init/fini mecanism 2023-01-01 16:13:39 +01:00
ptitSeb 3d3ab0fedc Added a bunch of libexpat wrapped function (for Heroic Launcher / Legendary) 2022-12-31 14:31:07 +01:00
ptitSeb d21efb51ce [DYNAREC] make jmp 0 do a jmp_to_next to allow the block to be checked and rebuild if needed 2022-12-31 11:48:13 +01:00
ptitSeb bd4c742212 Added empty wrapped _dl_find_object function (for #487, probably other too, but not sure it's enough) 2022-12-31 10:21:50 +01:00
ptitSeb c821fd938c Disable SECCOMP and added a bunch of wrapped function (partially fixed Heroic launcher) 2022-12-30 15:51:57 +01:00
ptitSeb 977caba4ca [TRACE] Better trace on no-block jump warning 2022-12-30 15:51:14 +01:00
ptitSeb 8b167a70b8 Added 206-210 syscalls (for #485) 2022-12-30 10:06:10 +01:00
ptitSeb ecca96c03e Reworked how /proc/self/maps is tranformed 2022-12-29 13:39:51 +01:00
ptitSeb 49231a593a Removed defaultsymbol cache, it breaks some stuffs 2022-12-29 12:40:13 +01:00
ptitSeb 0338899804 Try to improve some TLS Relocation 2022-12-29 11:46:52 +01:00
ptitSeb 810c2250c4 Added 1 wrapped function to libx11 2022-12-29 11:12:03 +01:00
ptitSeb 5ed210f0f3 Added log10l wrapped function to libm (for #436) 2022-12-28 18:29:50 +01:00
ptitSeb 7508390747 Added 1 wrapped function to libxcb (and fixed 1 signature) (for #479) 2022-12-18 18:27:28 +01:00
ptitSeb 67620b7948 Added a small cache to GetDefaultVersion function 2022-12-17 11:41:38 +01:00
ptitSeb 6c0500d1b6 More SegmentChache reset 2022-12-17 11:41:11 +01:00
ptitSeb 7144efff4e Reset Segment cache when changing TLS address 2022-12-17 11:40:14 +01:00
ptitSeb 3ae31c34f6 Check if symbol comes from a Lib already init'd, and init it if not 2022-12-17 11:39:04 +01:00
ptitSeb bc5072ed54 Added 1 gnutls wrapped function 2022-12-17 11:36:11 +01:00
ptitSeb 2aa7c45ca2 More work on malloc override and tbbmalloc wrapping 2022-12-17 11:19:56 +01:00
ptitSeb 73467dc523 Added more wrapped function to libgnutls (helps Wine) 2022-12-14 11:44:01 +01:00
ptitSeb 4ff744ef89 Added 1 wrapped function to libgnutls (helps Wine) 2022-12-13 23:04:44 +01:00
ptitSeb b8722b3537 [DYNAREC] Small refactoring to make things more readable 2022-12-12 22:40:49 +01:00
ptitSeb caed2ae757 Use print_cycle_log here 2022-12-12 22:40:49 +01:00
Ryan Fortner 5ffdb8eeb4 update debian changelog for 0.2.0 release (#474) 2022-12-12 18:50:33 +01:00
ptitSeb 90445f7f1d [DYNAREC] Small fix on unwinding of the x64 address when a signal occurs just after a NOP opcode 2022-12-11 22:33:24 +01:00
ptitSeb 5a298c165e [TRACE] Small improvments to function call trace 2022-12-11 21:26:53 +01:00
ptitSeb 63ba377f6f [DYNAREC] Fixed F0 80 opcodes (helps #210, but is not enough) 2022-12-11 20:45:45 +01:00
ptitSeb a15cdb4c1d [RCFILE] Fixed BOX64_NODYNAREC handling 2022-12-11 19:53:25 +01:00
ptitSeb dff14a868f Some small fixes for pagesize != 4096 2022-12-08 19:59:08 +01:00
ptitSeb 4304301701 Fixed wrapping of lzma_stream_decoder (for #360) 2022-12-06 19:09:09 +01:00
ptitSeb 2dd31b0a44 Added wrapped libxcb-xkb.so (helps #468) 2022-12-06 18:30:45 +01:00
ptitSeb 23e01808a2 Added wrapped libxcb-xinerama.so (helps #468) 2022-12-06 18:14:45 +01:00
ptitSeb b8300add62 Added wrapped libxcb-sync.so (helps #468) 2022-12-06 18:05:42 +01:00
ptitSeb 97cb1e2080 Added wrapped libxcb-render.so (helps #468) 2022-12-06 17:56:17 +01:00
ptitSeb e9d6735e52 Added wrapped libxcb-render-util.so (helps #468) 2022-12-06 17:41:38 +01:00
ptitSeb 9d8381041d Added wrapped (empty) libxcb-util.so (helps #468) 2022-12-06 17:35:00 +01:00
ptitSeb 5cf4226c13 Added wrapped libxcb-icccm.so (helps #468) 2022-12-06 17:30:49 +01:00
ptitSeb 5bb3d8a24d Added some wrapped function to mostly xcb libs (for #468) 2022-12-06 17:12:47 +01:00
ptitSeb 1de683efa4 Added 1 more libX11 wrapped function (for #449) 2022-12-06 13:16:46 +01:00
ptitSeb 3e705be6c8 [DYNAREC] Fixed 66 0F 5B opcode (fixed 3dSen) 2022-12-04 20:12:48 +01:00
ptitSeb 6548ec1b43 Don't init main elf in PltReleader 2022-12-04 17:17:14 +01:00
ptitSeb e739a74705 Improved RunElfInitPltResolver function 2022-12-04 16:52:38 +01:00
ptitSeb c0d401fbfc Check if Symbol Elf is inited in PltResolver (helps #422 and #360) 2022-12-04 16:36:32 +01:00
ptitSeb 7b813d03b9 [TRACE] Print function name from on push rbp, instead of function name here 2022-12-04 16:25:02 +01:00
ptitSeb 93d06e8680 Cosmetic change 2022-12-04 16:24:15 +01:00
ptitSeb 7f22b33f5a [TRACE] Fixed BOX64_TRACE_INIT 2022-12-04 16:22:30 +01:00
ptitSeb ceaacba1c2 [RCFILE] Fixed handling of BOX64_TRACE_FILE 2022-12-04 12:14:51 +01:00
ptitSeb 6bee1dcecd [TRACE] Add stack top trace for endbr64 opcode 2022-12-04 12:14:26 +01:00
ptitSeb 3c28048038 [DYNAREC] Added F0 F6 opcode 2022-12-04 11:48:48 +01:00
ptitSeb fb02ae0e9a Added experimental (undocumented) BOX64_SSE_FLUSHTO0 env. var. (not sure it's really usefull) 2022-12-04 10:13:35 +01:00
ptitSeb ffb293fe0a Added wrapped libXpresent.so.1 2022-12-04 08:55:32 +01:00
ptitSeb f46522572e Better rounding for some SSE opcodes (Help NuclearBlaze main menu, but doesn't fix gameplay) 2022-12-03 18:03:13 +01:00
ptitSeb 2ecb87ddc3 Optimized __tls_get_addr wrapped function a bit 2022-12-03 18:01:57 +01:00
ptitSeb a34530ebb7 [RCFILE] Fixed String reading 2022-12-03 14:28:09 +01:00
ptitSeb 0973e7009e Wrapped GstAllocator and GstObject structures 2022-12-03 14:04:36 +01:00
ptitSeb d0d18441cf Use DynaCall instead of EmuCall for pthread_once callback (speedup some init code= 2022-12-03 13:21:52 +01:00
ptitSeb 3f1c37aa76 [DYNAREC] Reworked dynarec memory allocator, and a bit of protection tracking too (might help #455) 2022-12-03 11:24:01 +01:00
ptitSeb 8165342670 [DYNAREC] Protect memory even if MAP_FIXED_NOREPLACE flags was not respected 2022-12-03 10:09:02 +01:00
ptitSeb 686c68a90d Fixed handing of BOX86_ROLLING_LOG in rcfile 2022-12-02 20:07:07 +01:00
ptitSeb 86dbf089cc [DYNAREC] Small changes on pagesize and hotpage 2022-12-02 11:51:34 +01:00
ptitSeb 9f3ea84b57 [DYNAREC] Added BOX64_DYNAREC_BLEEDING_EDGE to control detection of MonoBleedingEdge (and disable that for 3dSen) 2022-12-01 17:50:29 +01:00
ptitSeb 3f007d2dbb [DYNAREC] More control over HotPage handling with BOX64_DYNARC_HOTPAGE 2022-12-01 17:15:46 +01:00
ptitSeb cde68af79a Added yet another function in wrapped libpng16 2022-12-01 08:07:06 +01:00
ptitSeb 574e70642b Added another function in wrapped libpng16 2022-11-30 18:43:16 +01:00
ptitSeb ae156d9326 Added 1 function in wrapped libpng16 2022-11-30 18:03:02 +01:00
ptitSeb c08268d0ae [DYNAREC] Added BOX64_DYNAREC_CALLRET option, in rcfile too (faster handling of CALL/RET opcode, not compatible with JIT/Dynarec) 2022-11-29 18:48:59 +01:00
ptitSeb 0e4d031054 Use dummy crashhandler lib by default 2022-11-29 09:48:30 +01:00
ptitSeb de15ee057a Fixed some tc_mallinfo signature 2022-11-28 21:36:05 +01:00
ptitSeb 1d873cc701 Fixed 2 logs when applay trace setting from RCFiles 2022-11-28 19:06:27 +01:00
ptitSeb bcde60b9e8 dlopen will not return value less than 3 (fixed deadcells) 2022-11-28 18:58:24 +01:00
ptitSeb d6d2b2e756 Changed how mmap with MAP_32BITS flag is handled (help deadcells, maybe some others) 2022-11-28 18:57:52 +01:00
ptitSeb 4276573f67 Change Elf load address for Box64 (helps deadcells) 2022-11-28 18:56:53 +01:00
ptitSeb fa3481ea8e [DYNAREC] Optimized cleanDBFromAddressRange, again 2022-11-28 18:55:57 +01:00
ptitSeb ac54eceea5 Fixed an issue when an entry is found 2 times in RCFiles 2022-11-28 18:36:00 +01:00
ptitSeb e1c29bf2af [DYNAREC] Fixed native call trace with BOX64_LOG=2 2022-11-28 18:28:49 +01:00
ptitSeb 0fe560ed7f [DYNAREC] Optimized HotPage handling, and made it lockless 2022-11-28 12:38:06 +01:00
ptitSeb 23269040a6 [DYNAREC] Removed a useless mutex lock 2022-11-28 12:37:37 +01:00
ptitSeb b03649748a Fixed Dynarec non-trace build 2022-11-27 19:04:28 +01:00
ptitSeb 06851f8b98 Added box64rc configuration file handling 2022-11-27 18:50:47 +01:00
ptitSeb 893fc7c940 Update release.yml 2022-11-27 10:19:24 +01:00
ptitSeb 3819aecf07 Fixed an issue with grabNCpu function, as getline might use realloc, don't use alloca to allocate initial line 2022-11-27 09:41:49 +01:00
ptitSeb a186b22d6e [DYNAREC] Refactored Strong Memory Model emulation 2022-11-26 20:05:29 +01:00
ptitSeb a43186d137 [DYNAREC] Fixed 66 64 0F 2E/2F opcodes 2022-11-26 12:37:08 +01:00
ptitSeb 554f4889bc [RISCV] Fix build 2022-11-22 13:30:11 +01:00
ptitSeb b584832e75 Improve (non-libc) syscall, and added a few new ones 2022-11-22 13:19:04 +01:00
ptitSeb 299c911330 Simplified alignment of stat64 structure 2022-11-22 13:18:23 +01:00
ptitSeb 6318b592a3 Improve stack management on signal handler 2022-11-22 13:17:06 +01:00
ptitSeb 2b7e7fe6f6 Added wrapped libcairoobject-2 and a bunch of other gtk related wrapped functions 2022-11-22 13:14:43 +01:00
ptitSeb bb8983b48a Start of a new Dev. cycle 2022-11-22 13:10:38 +01:00
ptitSeb 666861419d Bumped to v0.2.0 2022-11-17 14:21:42 +01:00
Jai A P 52d6c5ac88 Fix PKGBUILDS (#452) 2022-11-16 15:51:18 +01:00
ptitSeb 5b89a2375a [DYNAREC] Fixed RCR and RCL opcodes 2022-11-16 15:11:19 +01:00
ptitSeb c0d19de08d Added one more GLES extension to wrapped libGL 2022-11-15 16:43:34 +01:00
ptitSeb 27d85a737c Added a few more wrapped function to libcrypto 2022-11-15 16:31:26 +01:00
ptitSeb 277f542304 Better handling of rolling logs 2022-11-15 12:58:40 +01:00
ptitSeb 517a5b6844 [DYNAREC] Pre-allocate more instructions on FillBlock64 2022-11-15 12:58:15 +01:00
ptitSeb d4f98902a0 Added 1 wrapped function to libX11 2022-11-15 12:57:24 +01:00
ptitSeb eb289e8542 Added 1 extension to wrapped libGL 2022-11-15 12:57:20 +01:00
ptitSeb 06754daf87 Added a bunch of libGL and libGLES2 extensions 2022-11-15 00:27:43 +01:00
ptitSeb ee509f6350 Small fixes and improvement to memory protection handling 2022-11-14 21:06:33 +01:00
ptitSeb 6a7c6cba12 Added BOX64_CRASHHANDLER env. var. 2022-11-14 21:05:32 +01:00
ptitSeb 129f5e93fa Added some synonim for libpango-1 and libcairo 2022-11-14 14:57:33 +01:00
ptitSeb 629312b382 Set TLS size to be a 64K page on all cases 2022-11-14 14:57:00 +01:00
ptitSeb d31524691b Improved ROLLING_LOG and improved getcontext/setcontext handling of floating points 2022-11-13 19:31:28 +01:00
ptitSeb ff6ec86f1c Added 1 wrapped function for libmpg123 2022-11-13 17:58:24 +01:00
ptitSeb 0c55facdd9 Added wrapped (empty) libvdpau 2022-11-13 17:27:53 +01:00
ptitSeb d9e1f91735 Added SDL_ResetKeyboard wrapped function 2022-11-13 17:17:54 +01:00
ptitSeb 9f037fef60 [DYNAREC] Optimisations and fixes on a few x87 opcodes (fixes Piczle Cross Adventure on Steam) 2022-11-13 17:08:16 +01:00
ptitSeb 0bc7100ea8 Print the ROLLING_LOG on the Ask to run at NULL error 2022-11-13 17:07:06 +01:00
ptitSeb 8698a58a60 Cosmetic change on my_dl_iterate_phdr callback 2022-11-13 17:05:49 +01:00
ptitSeb a8151de2cb Optimized getDB, setProtection and freeProtection 2022-11-13 17:05:03 +01:00
ptitSeb 7a9005dae6 Added 1 vulkan extension 2022-11-13 10:27:10 +01:00
ptitSeb a77f8bf203 Added wrapped libgstgl-1.0 with a few functions 2022-11-13 09:51:12 +01:00
ptitSeb efc7877ffd Changed steam-pressure-vessel wrapping to include system libs first 2022-11-13 09:50:45 +01:00
ptitSeb 3cb7632dc8 Also use size when selecting symbol for R_X86_64_COPY and R_X86_64_GLOB_DAT relocations 2022-11-13 00:04:26 +01:00
ptitSeb cde8e54b51 Fixed wrapped function signature for vkCmdSetScissorWithCount, 2022-11-12 22:37:42 +01:00
ptitSeb 8ce1a2d605 Fix an issue with dynarec build when running without dynarec 2022-11-11 20:55:02 +01:00
ptitSeb d09379990b x86_64 build don't need CreateCPUInfoFile 2022-11-11 19:50:12 +01:00
ptitSeb 136318f98a Actualy fix x86_64 build 2022-11-11 19:48:37 +01:00
ptitSeb 1775844f45 Fix x86_64 build 2022-11-11 19:07:03 +01:00
ptitSeb 987a663094 Improved cpu cores detection and reporting 2022-11-11 18:08:19 +01:00
ptitSeb 107dbd5645 Fixed some fuse wrapped functions (better AppImage compatibility) 2022-11-11 15:40:15 +01:00
ptitSeb bebd8f3c1a Added fuse_main_real wrapped function 2022-11-10 12:16:02 +01:00
ptitSeb 3be1e33339 [DYNAREC] Fixed alternate address not always taken into account by Dynarec 2022-11-02 22:09:54 +01:00
ptitSeb 91348f22be Fixed a small memory leak with Dynarec 2022-11-02 22:09:20 +01:00
ptitSeb c9279061fa [ANDROID] Build fix 2022-11-01 20:34:36 +01:00
ptitSeb 5bfe397c63 Added libudev.so.1 dependancy for wrapped libudev.so.0 2022-11-01 20:34:24 +01:00
ptitSeb a202640da4 Update README_CN.md 2022-11-01 12:19:28 +01:00
ptitSeb 08fcdfa0fb Updated README.md with new sponsors
Thanks for keeping this project alive !
2022-11-01 12:18:55 +01:00
ptitSeb 51fb706781 Added llrintl wrapped function (for #419) 2022-11-01 10:49:39 +01:00
ptitSeb 92ed70f029 Added XftNameUnparse wrapped function (for #424) 2022-11-01 10:43:51 +01:00
ptitSeb 067b28be41 Added a few libflac wrapped function (for #425) 2022-11-01 10:42:13 +01:00
ptitSeb 81b7fc519c Addedsyscall 24 (for #429) 2022-11-01 10:39:05 +01:00
ptitSeb 24cc0c8422 Detect when program is linked with glibc 2.34+ to workaround the default libc libs to load 2022-11-01 10:37:44 +01:00
ptitSeb 8459ea0d31 Remove dynablocklist (#438)
* [DYNAREC] Removed dynablock sons handling
* [DYNAREC] Removed dynablocklist, and attached dynablocks to the jumptable
* [DYNAREC] Changed handling of HotPage (part of Protection now)
* [DYNAREC] Fixed some performance issues (especially with heavily threaded programs)
2022-10-31 12:05:04 +01:00
ptitSeb 494c245b59 [DYNAREC] Reprotect bridge when emu is running 2022-10-30 16:34:01 +01:00
ptitSeb d87f0ea728 Added some more wrapped function to libX11 (for #436) 2022-10-29 23:07:12 +02:00
ptitSeb dbdfc13a23 Fixed a signature in tbbmallocproxy wrapped lib 2022-10-29 22:40:57 +02:00
ptitSeb c19730f5e2 Re-disabled the abort when quitting, seems stable now 2022-10-29 22:36:31 +02:00
ptitSeb 446e735825 [DYNAREC] Small change to use alloca instead of customMalloc 2022-10-29 22:34:59 +02:00
ptitSeb 0e47d1269c Malloc override (#437)
* Add some malloc override mecanism, but missing c++ function overriding
* Add c++ new/delete redirection too
* Added support for libtbbmalloc_proxy
2022-10-29 22:32:47 +02:00
ptitSeb 7dc5359c2b Added support for MOVBE extension ([DYNAREC] too) 2022-10-29 17:24:06 +02:00
ptitSeb e394903ccf Better fix, again, for dlsym(RTLD_NEXT, ...) 2022-10-29 16:49:25 +02:00
ptitSeb 98bb78ae3a Optimized custom pthread_once 2022-10-29 16:49:13 +02:00
ptitSeb defe5ce594 Better fix for dlsym(RTLD_NEXT, ...) 2022-10-29 16:26:29 +02:00
ptitSeb 713e3fa89d Don't enable steamwebhelper yet 2022-10-29 15:26:14 +02:00
ptitSeb 73f813279a Fixed FT_Outline_Decompose wrapped function 2022-10-29 15:24:58 +02:00
ptitSeb 0063cad60d Added a few x11 wrapped function (for #436) 2022-10-29 12:43:37 +02:00
ptitSeb 3bb3f618b9 Fix for dlsym(RTLD_NEXT, ...) 2022-10-29 12:43:28 +02:00
ptitSeb 53195e3a25 Small imrpovment to custom phtread_once 2022-10-29 12:43:03 +02:00
ptitSeb 09103aa52e [DYNAREC] Fixed a potential issue with free range of dynablock 2022-10-29 10:16:52 +02:00
ptitSeb ee63a9f368 Imrpoved Bridges, again 2022-10-29 09:41:46 +02:00
ptitSeb 9a73c15b84 Added 66 0F 38 10 opcode ({DYNAREC] too) 2022-10-29 09:02:35 +02:00
ptitSeb b50dec9d92 Added a few more wrapped libfuse functions 2022-10-29 08:52:25 +02:00
ptitSeb 9f8feb622e [DYNAREC] More log when using BOX64_NODYNAREC 2022-10-28 20:48:46 +02:00
ptitSeb db156b41fb [DYNAREC] Fixed F3 0F 5B opcode 2022-10-28 20:48:16 +02:00
ptitSeb 374583bb48 [DYNAREC] Fixed an emitter 2022-10-28 20:47:52 +02:00
ptitSeb 5d3c218b1b [DYNAREC] Added 66 F0 0F B1 opcode 2022-10-28 15:11:18 +02:00
ptitSeb f34427e772 [DYNAREC] Added 66 87 opcode 2022-10-28 15:10:51 +02:00
ptitSeb a1666986c6 [DYNAREC] Added (F2/F3) AD ocpodes 2022-10-28 15:10:20 +02:00
ptitSeb b669177c83 Added 66 0F 7D opcode 2022-10-28 11:35:03 +02:00
ptitSeb 1678d2b97a Re-enabled the abort if exit is too long, seems to be still needed 2022-10-27 19:53:49 +02:00
ptitSeb 3564f41c48 Wrapping of GtkTextView and GtkContainer classes for Gtk3 2022-10-27 19:36:11 +02:00
ptitSeb 72314a33ab Added posix_spawn_file_actions_addclose wrapped function 2022-10-27 19:35:38 +02:00
ptitSeb 9289b29504 Try to get a cleaner exit 2022-10-27 19:02:25 +02:00
ptitSeb de115b87df Fixed some issue with bridge memory protection handling 2022-10-27 18:42:39 +02:00
ptitSeb cfeb0626cc Added BOX64_SHOWBT env. var. to have a backtrace on segfault 2022-10-27 18:42:07 +02:00
ptitSeb 3f2c4ed794 Fixed dlopen that should increment refcount even with RTLD_NOLOAD 2022-10-27 16:11:19 +02:00
ptitSeb 978256179b Improved handling of execve and posix_spawn, especialy with arv[0] is not the expected value 2022-10-27 14:04:41 +02:00
ptitSeb 742af765ba Some fixes to execv and posic_spawn wrapped functions 2022-10-26 20:49:41 +02:00
ptitSeb 035d0aebc1 Added libudev.so synonym of libudev.so.1 2022-10-26 20:19:00 +02:00
ptitSeb a5dbd58200 Added one more gtk3 wrapped function 2022-10-26 20:14:29 +02:00
ptitSeb 9073e1d47e [DYNAREC] Fixed 0F BA opcodes 2022-10-26 19:40:26 +02:00
ptitSeb ed1078dadf Try to improve the shell detection, again (for #433) 2022-10-26 17:16:53 +02:00
ptitSeb 83dbd728ef Added syscalls 7 and 112 2022-10-26 16:59:20 +02:00
ptitSeb 31a6149b0f Actually fixed (this time) syscall 78 2022-10-26 15:51:43 +02:00
ptitSeb 3d274fdfd9 Fixed an issue with syscall 78 2022-10-26 15:33:00 +02:00
ptitSeb 8f3ec680c7 Added syscall to BOX64_ROLLING_LOG too 2022-10-26 15:31:44 +02:00
ptitSeb 612e94be9d More flexibility for BOX64_ROLLING_LOG 2022-10-26 14:20:39 +02:00
ptitSeb 7a95c78ba0 Fixed non-dynarec build 2022-10-26 14:19:33 +02:00
ptitSeb 5a2a546090 Fix non-dynarec build 2022-10-26 14:10:12 +02:00
ptitSeb baf6fc8987 Added BOX64_ROLLING_LOG support to __stack_chk_fail 2022-10-26 13:58:20 +02:00
ptitSeb bf75d6496f Made a custom implementation of pthread_once 2022-10-26 13:48:28 +02:00
ptitSeb fb7f134c06 Fixed 64 F3 0F 5A ocpode (still for #432) 2022-10-25 18:39:32 +02:00
ptitSeb 067dcbc0f7 [DYNAREC] Added BIGBLOCK=3 level 2022-10-25 18:34:38 +02:00
ptitSeb 280bc969ce Added 64 F3 0F 5A opcode (for #432) 2022-10-25 17:12:38 +02:00
ptitSeb 010b8a79cb Added xkb_compose_state_reset wrapped function (for #431) 2022-10-25 14:25:19 +02:00
ptitSeb 4ec39ae323 Added xkb_compose_state_get_status wrapped function (for #431) 2022-10-25 11:01:00 +02:00
ptitSeb ec7c654451 Changed elf signature detection to accomodate for AppImage 2022-10-25 10:49:20 +02:00
ptitSeb 6022a61b3c Added xkb_compose_state_feed wrapped function (for #431) 2022-10-25 10:03:13 +02:00
ptitSeb 975b489007 Added a few more libxkbcommon wrapped functions (for #431) 2022-10-25 09:47:01 +02:00
ptitSeb f8f1859a05 [DYNAREC] Better (defered) flag handling in dynarec (gives between 5% and 10% speedup) 2022-10-24 20:19:09 +02:00
ptitSeb 92f2a44b28 Small fixes with unaligned pthread_cond_t 2022-10-24 18:24:50 +02:00
ptitSeb 7585a984b2 [DYNAREC] Rewrote unused acro, in case it used later 2022-10-24 18:23:35 +02:00
ptitSeb 789bf9c220 Added xkb_compose_table_new_from_locale wrapped function (for #431) 2022-10-24 17:01:46 +02:00
ptitSeb 2e9bc93e1f [DYNAREC] Use customMalloc for internal dynarec stuff (fixed starbound) 2022-10-24 14:30:51 +02:00
ptitSeb e2a993a425 custom Alloc now allocate memory rounded up to 8bytes align 2022-10-24 11:40:22 +02:00
ptitSeb d0b5c79b81 Use box_strdup instead of realpath for the string allocation to be safe 2022-10-24 11:39:33 +02:00
ptitSeb 95622ca964 Forgot a bunch of other box_ malloc/realloc/calloc/free use 2022-10-23 19:19:30 +02:00
ptitSeb 76b63de754 [DYNAREC] Forget this realloc->box_realloc 2022-10-23 18:05:13 +02:00
ptitSeb 58cdb1bda2 Refactored, again, elfloader symbol fetching (ported from box86) 2022-10-22 20:57:31 +02:00
ptitSeb a530f56511 [DYNAREC] Small change on how add_next/get_closest_next works 2022-10-22 17:28:35 +02:00
ptitSeb bf6e74ad8e [DYNAREC] Added BOX64_DYNAREC_SAFEFLAGS 2022-10-22 16:13:55 +02:00
ptitSeb c2253dafc0 This fixed factorio for me, but it's not clear why 2022-10-22 12:27:05 +02:00
ptitSeb 389d159c7a [DYNAREC] Added 66 0F 7C opcode 2022-10-22 11:11:39 +02:00
ptitSeb 21161ae38e [DYNAREC] Added DE opcodes 2022-10-22 10:23:24 +02:00
ptitSeb aa074d7121 Fixed an issue with last lib refactor (fixed EtG, and all SDL2 based stuff and more probably) 2022-10-21 18:47:45 +02:00
ptitSeb 99d04e93a2 [DYNAREC] Initialize dynmap, it's cleaner 2022-10-19 23:01:10 +02:00
ptitSeb d6b9df6ca2 Small refactor and simplification of library_t structure and box64context_t 2022-10-19 22:59:19 +02:00
ptitSeb 4fbeca0aa3 Forgot to return the value in wrapped __libc_start_main (for #427) 2022-10-19 21:51:11 +02:00
Alfred E. Neumayer f19b89b263 src: asm: Rename lr & fp registers to their x-equivalents (#426)
Older GCC versions (like on Ubuntu Touch) don't recognize the aliases.
Fixes building box64 with older toolchains.
2022-10-17 22:21:33 +02:00
ptitSeb 0a908d78ca Added XftFontOpenName vrapped function (for #424) 2022-10-11 22:09:56 +02:00
ptitSeb f2b8b06280 Fixed and improved Shell script detection 2022-10-10 23:30:51 +02:00
Eric Wiessner (KI7POL) 0cc04e5253 Create X64WINE.md (#423) 2022-10-10 08:15:31 +02:00
ptitSeb 5e9a9b9867 Added 64 66 0F 11 opcode (for #418) 2022-10-09 20:32:41 +02:00
ptitSeb 68826baf3b [DYNAREC] Small optim for 0F C6 opcode 2022-10-01 23:44:55 +02:00
ptitSeb cc26096c28 [DYNAREC] Fixed and optimized 0F BA opcodes 2022-10-01 23:31:49 +02:00
Jonathan Keller 1c110080a8 fix overzealous replace in wrappers pathnames (#415)
Wrapper filenames were generated by replacing ".c" with "_private.h".
Unfortunately this matched anywhere in the string, causing problems if
the path contained a directory containing the substring ".c". For
instance, if box64 is compiled in a '.cache' directory (as AUR helpers
like to do, see #144), the directory name was inadvertently mangled
into '_private.hache'.

Fix this by restricting the match to the end of the string.
2022-09-30 20:28:46 +02:00
ptitSeb 7b67bbe698 Added PCLMULQDQ ([DYNAREC] Too, using PMULL if present) extension (improve a lot AES-XTS score of Geekbench 5) 2022-09-30 19:13:47 +02:00
ptitSeb 7692371ccb More vulkan wrapped functions 2022-09-29 20:20:17 +02:00
ptitSeb 534eb4ce88 Fixed signal handling 2022-09-29 19:54:38 +02:00
ptitSeb c88b936233 [DYNAREC] Added 64 2B opcode 2022-09-29 15:31:22 +02:00
ptitSeb 32c229215a Improved signal handling and x87 flags (with tests backported from box86) 2022-09-29 11:24:42 +02:00
ptitSeb 9c5cc38c9a [CMAKE] Put name in tests 2022-09-29 10:46:02 +02:00
ptitSeb 12795ea491 Slight better trace for pop r15 2022-09-28 15:13:57 +02:00
ptitSeb c0b143043f Added lzma_auto_decoder wrapped function to liblzma (for #129) 2022-09-28 12:35:03 +02:00
ptitSeb 40b849da23 Improved handling of CF flags in dec/inc opcodes ([DYNAREC] too) (helps Xonotic official linux build) 2022-09-26 10:16:21 +02:00
ptitSeb 4f18bd6293 [DYNAREC] Improved BOX64_NODYNAREC effect, and Interpretor->Dynarec on conditional jump 2022-09-25 21:25:16 +02:00
ptitSeb 702e92d4f4 Added a vulkan extension 2022-09-25 12:08:56 +02:00
ptitSeb 40fa336829 Added a few xcb_randr wrapped functions (for #287) 2022-09-24 08:55:37 +02:00
ptitSeb fa93803b45 Added __pread_chk wrapped function to libc 2022-09-22 18:23:50 +02:00
ptitSeb 7201dbd477 Added wrapped XFreeFontSet function (for #411) 2022-09-21 19:25:10 +02:00
ptitSeb 40248c3e13 Added syscall 267 (for #99 and #100) 2022-09-20 12:28:37 +02:00
ptitSeb f2a0a1b62d Small fix to protection tracking on signal handling 2022-09-19 19:29:39 +02:00
ptitSeb dcb4bbb3e6 More fixes and improvment to bash handling (helps #360) 2022-09-18 19:00:53 +02:00
ptitSeb 21c56e7898 Improved usage of x86_64 bash with BOX64_BASH env var 2022-09-15 14:07:46 +02:00
ptitSeb 7c74e7be35 Added F0 86 ocpode ([DYNAREC] too) (for #406) 2022-09-15 10:43:25 +02:00
ptitSeb bf5ec1eb57 Fixed a USAGE.md issue (for #405) 2022-09-14 13:07:12 +02:00
ptitSeb 342241a24d Improved thread_self stack size detection 2022-09-13 16:17:37 +02:00
ptitSeb d047dcb983 Attempt at fixing wrapped __vfwprintf_chk (for #404) 2022-09-12 16:35:35 +02:00
ptitSeb 0fc310f1c4 Aded 1 wrapped function libxkbcommon 2022-09-12 15:13:56 +02:00
ptitSeb c6e14a562b Added vfwprintf and __vfwprintf_chk wrapped function (for #404) 2022-09-12 15:05:24 +02:00
ptitSeb a3f6a7ddbc Added one more function to libX11 2022-09-12 14:07:57 +02:00
ptitSeb c8c09d7e09 Try to improve syscall rt_sigaction handling 2022-09-12 13:56:51 +02:00
ptitSeb 411163c73f Added some wrapped function to libgio, libgdk3 and libxi 2022-09-12 13:55:45 +02:00
ptitSeb b25aa07e11 Smalls fixes to USAGE.md 2022-09-12 11:52:27 +02:00
ptitSeb bc72a506c1 Added many wrapped function to libva and friends 2022-09-11 16:01:41 +02:00
ptitSeb 8451c62b44 Added a few more wrapped libnss3 functions 2022-09-11 14:50:44 +02:00
ptitSeb 1f3729822a Some more wrapping on AtkUtils 2022-09-11 14:27:21 +02:00
ptitSeb a27283aa9b Added syscall 297 2022-09-11 14:27:02 +02:00
ptitSeb 1eb1bd6800 Added empty wrapped libva and friends 2022-09-10 22:09:14 +02:00
ptitSeb cda4af3403 Added some more GL/GLES extensions 2022-09-10 21:46:03 +02:00
ptitSeb 93ea5bacb7 Added localtime64 and localtime64_r in case they exists 2022-09-10 18:48:37 +02:00
ptitSeb 841c5c22e0 Fixed an issue with dlsym(RTLD_NEXT, ...) not always finding the symbols 2022-09-10 18:24:31 +02:00
ptitSeb 511446846f Added empty wrapped libfreebl3 2022-09-10 12:41:53 +02:00
ptitSeb a79bf97b48 Added a few more extensions to wrapped libGL 2022-09-10 12:36:42 +02:00
ptitSeb a78d5e2636 Added a few libnss3 wrapped functions 2022-09-10 12:32:24 +02:00
ptitSeb b6d2e3fb55 Added special case for pthread_kill because behaviour changed with glibc 2.34 2022-09-10 11:28:22 +02:00
ptitSeb 43850ac856 Added wprintw wrapped function to ncurses and ncurses6 lib (for #401) 2022-09-08 10:04:30 +02:00
ptitSeb 532b1697a6 When running x86_64 bash, using x86_64 bash to run script automaticaly (for #402) 2022-09-08 09:59:58 +02:00
ptitSeb a3f63a12f9 [DYNAREC] Improve memory protection tracking (help #361) 2022-09-04 15:21:32 +02:00
ptitSeb b2dfe64cea Limit all libc mmap to 47bits max 2022-09-04 15:20:29 +02:00
ptitSeb ff7dc072d1 Make StrongMem emulation level 2 stronger 2022-09-04 15:19:17 +02:00
ptitSeb b185afa29f Fixed x86/x86_64 binary detection (for #399) 2022-08-31 08:48:54 +02:00
ptitSeb 742742fd48 small improvment to x64/x86 signature detection 2022-08-30 10:25:09 +02:00
ptitSeb 5f6104a9d3 Added 1 libxi wrapped function 2022-08-28 18:12:21 +02:00
ptitSeb 787198b30e Added 1 wrapped function to gtk3 2022-08-28 17:58:29 +02:00
ptitSeb 3490c63259 Fixed gtk_get_major/minor/micro version wrapped function to gtk2 2022-08-28 17:29:32 +02:00
ptitSeb 8077d7bb0b Added gtk_get_major/minor/micro version wrapped function to gtk2 2022-08-28 17:27:33 +02:00
ptitSeb b2c8c227ec Added a few more FAudio wrapped functions 2022-08-28 14:26:47 +02:00
ptitSeb ca8ff5fda9 Added some CERT function to wrapped libnss3 (for #375) 2022-08-13 12:39:44 +02:00
ptitSeb a6f2d96557 Fixed a warning 2022-08-11 19:43:36 +02:00
wannacu 948205e6f9 Add SW64 base support (#382)
* Add SW64 base support

* Add a few syscalls
2022-08-11 11:14:13 +02:00
ptitSeb d90b6b7e51 Fixed issue with last RIP handling refactor 2022-08-10 23:50:09 +02:00
ptitSeb e3e1ee313b Some cleanup 2022-08-10 22:39:58 +02:00
ptitSeb dc5c049ed9 Added D9 D8..DF opcodes ([DYNAREC] too) (for #361) 2022-08-09 23:04:14 +02:00
ptitSeb 642260bdb6 Chenged Interpretor so RIP is updated on opcode success (better precision for Signal) 2022-08-06 16:10:17 +02:00
ptitSeb bafa85e772 Fixed a warning 2022-08-06 16:10:17 +02:00
ptitSeb 4f102a43fa Also use __libc_memalign instead of posix_memalign 2022-08-06 16:10:17 +02:00
ptitSeb 2ac265d529 All box internal memory alloc use __libc_ internal one (except on Android, using libc one gather from dlsym) 2022-08-06 16:10:17 +02:00
João Henrique e261270eb8 Backport SDL_DYNAPI_entry wrapper from box86. (#374)
* Backport SDL_DYNAPI_entry wrapper from box86.

* Correct SDL_DYNAPI_entry prototype.

Second argument is of pointer type, not integer.
2022-08-06 13:56:51 +02:00
ptitSeb d08bd0c619 Added a new extension to wrapped libGL 2022-07-31 09:13:10 +02:00
ptitSeb cc833341e4 Small improvment in signal handling 2022-07-30 18:51:51 +02:00
ptitSeb add0081b50 Added some wayland wrapped libs (partial) 2022-07-30 17:02:18 +02:00
ptitSeb 46fb9d6df1 Small changed to wrapped exit function 2022-07-30 16:44:05 +02:00
ptitSeb e324942a07 Fixed wrapped gtk_tree_store_new function 2022-07-30 16:18:28 +02:00
ptitSeb b853012cb6 Small improvment to BOX64_ROLLING_LOG=1 2022-07-30 16:08:41 +02:00
ptitSeb d64d7db5f5 Better trace for readlink 2022-07-30 15:50:51 +02:00
ptitSeb d19a076f1e Added a few more wrapped nns3 and nspr4 functions 2022-07-30 15:40:52 +02:00
ptitSeb 5ad314ba5a Added wrapping of GtkTextViewClass in gtk2 2022-07-30 15:22:17 +02:00
ptitSeb c7473dd7c9 Added wrapped g_signal_override_class_handler function 2022-07-30 15:05:05 +02:00
ptitSeb abb9ab1bb6 Fixed CERT_PKIXVerifyCert that can have a well hiden callback... 2022-07-30 14:56:46 +02:00
ptitSeb 8bc9baefd6 Added BOX64_ROLLING_LOG=1 for a 'Just in Time LOG=2' on signal 2022-07-30 14:18:53 +02:00
ptitSeb 0fe835e087 Improve obstack support (for #352) 2022-07-30 11:50:51 +02:00
ptitSeb e8ed41c763 Improve support of MyAlign for printf type (for #356) 2022-07-30 11:44:20 +02:00
ptitSeb d9cd0604cc Added an empty wrapped libsoftokn3 (for #365) 2022-07-30 10:42:43 +02:00
ptitSeb afb2cc4a99 Fixed syscall 332 (for #361) 2022-07-30 10:04:10 +02:00
ptitSeb a72751914d Added 2 SDL2 wrapped function (for #364) 2022-07-28 18:25:39 +02:00
ptitSeb 9e3c5b1bf2 Added syscall 60 (for #363) 2022-07-28 09:38:50 +02:00
ptitSeb bf77789076 Merge branch 'main' of https://github.com/ptitSeb/box64 into main 2022-07-27 21:43:09 +02:00
ptitSeb 1b0d063cff Added SDL_GameControllerFromPlayerIndex wrapped function to sdl2 2022-07-27 21:42:58 +02:00
ptitSeb 24f8f47f76 Forgot those from previous commit 2022-07-27 21:41:46 +02:00
ptitSeb 7745457f9b Quick hack to align pthread_cond_t if needed (for #362) 2022-07-27 15:33:02 +02:00
ptitSeb 660bbae9a8 Added a few GLES wrapped function (for #362) 2022-07-27 15:19:00 +02:00
ptitSeb c071e9b051 Improved wrapping of libatk 2022-07-27 14:48:43 +02:00
ptitSeb 1c1bab8d6b Added F2 0F 7D opcode 2022-07-25 16:53:48 +02:00
ptitSeb 8beb818100 Added a few more Atk wrapped functions 2022-07-24 20:48:05 +02:00
ptitSeb 1ff0a7c4e7 Added 66 0F D0 opcode 2022-07-24 20:41:37 +02:00
ptitSeb 49991a3341 Added a mostly empty wrapped libatomic 2022-07-24 20:36:24 +02:00
ptitSeb 88af5ea07c Added a few libdrm wrapped functions 2022-07-24 19:41:45 +02:00
ptitSeb 63fbd64eb8 Wrapped one more GL extension 2022-07-24 19:38:34 +02:00
ptitSeb 8337fd306a Added many gbm wrapped functions 2022-07-24 19:37:26 +02:00
ptitSeb 7df6dbeafb Added a few more libGL wrapped extensions 2022-07-24 19:24:59 +02:00
ptitSeb bf2d6b8999 More work on wrapping for gtk3 and friends 2022-07-24 19:09:21 +02:00
ptitSeb 5528cb9f16 Added syscall 128 2022-07-24 14:00:47 +02:00
ptitSeb d8bc6dcc1b Added 1 more symbol to wrapped libc 2022-07-24 14:00:33 +02:00
ptitSeb c0ebc4cbb0 Some work around chromium / libcef / electron / nw (still not ok) 2022-07-23 20:06:28 +02:00
ptitSeb e3b6d6e6b2 Disabling steamwebhelper again, it was eanbled by mystake 2022-07-23 18:23:04 +02:00
ptitSeb a50b10b869 Added GL_EXT_window_rectangles wrapped extension to libGL 2022-07-17 17:52:32 +02:00
ptitSeb 183704ab95 Added one more syscall 2022-07-17 16:10:17 +02:00
ptitSeb e654ed980a Better log for waitpid 2022-07-17 16:09:49 +02:00
ptitSeb a4eb35371f Better signal function handler log 2022-07-17 15:26:04 +02:00
ptitSeb 0931f95e65 Fixed a typo 2022-07-17 12:45:13 +02:00
ptitSeb 83997e1125 Added '+' in FILE_TRACE_NAME to append trace 2022-07-17 12:43:35 +02:00
ptitSeb 555a1184e4 Better trace for getenv and setenv 2022-07-17 12:41:38 +02:00
ptitSeb f6b31f65ac Fixed a few more warnings 2022-07-17 09:25:49 +02:00
ptitSeb fc67b208ad Fixed a few warnings 2022-07-17 09:19:58 +02:00
ptitSeb b6f83007eb Added a few GLES wrapped functions 2022-07-16 22:15:28 +02:00
ptitSeb 6e82268704 [DYNAREC] Improved handlinf of RIP value 2022-07-16 21:57:55 +02:00
ptitSeb 4142cc296b tls parameter of clone libc function needs special treatment (not done yet) 2022-07-16 21:47:26 +02:00
ptitSeb e98b1e6716 Added a few syscalls 2022-07-16 21:46:23 +02:00
ptitSeb fda8b96063 [DYNAREC] Fixed 0F 09 Opcode 2022-07-16 21:35:34 +02:00
ptitSeb bb8e11e08d Improved 0F 0B opcode (SIGILL at ip, not ip+2) 2022-07-16 21:34:33 +02:00
ptitSeb aee1fe1004 [DYNAREC] Improved pred_sz computation 2022-07-16 21:33:56 +02:00
ptitSeb fbcd77a1a7 [DYNAREC] Improved trace a bit 2022-07-16 21:33:05 +02:00
ptitSeb 90f58dbcbe Improve trace a bit 2022-07-16 21:32:38 +02:00
ptitSeb 729d19ab24 Better trace for recvmsg 2022-07-16 21:31:35 +02:00
ptitSeb ca9a1b6666 [DYNAREC] Fixed 0F 09/0B opcodes 2022-07-16 21:30:13 +02:00
ptitSeb 08aa003335 [DYNAREC] Fixed defered carry flags for ADC 64bits 2022-07-16 21:29:14 +02:00
ptitSeb b0a56e2790 Improved wrapping of MetaFrames in gtk2 2022-07-16 17:03:36 +02:00
ptitSeb 01f589885f Added a few missing SDL2_TTF wrapped functions (for Silicon Zero) 2022-07-16 15:22:05 +02:00
ptitSeb 038c940e8e Fix sigaction syscall 2022-07-15 14:14:56 +02:00
ptitSeb 20067c02bc Added wrapped gtk3 and gdk3 (from box86) 2022-07-15 14:10:18 +02:00
ptitSeb efa3fa3aed Added wrapped libxshlfence 2022-07-15 11:05:22 +02:00
ptitSeb e0908ced14 Added more function so x86_64 bash can work (a copy is in tests folder) 2022-07-15 09:56:00 +02:00
ptitSeb 3068ca8908 Added 2 more wrapped function to libm (help Surviving Mars) 2022-07-14 21:24:04 +02:00
ptitSeb 88406332d2 Added a bunch of vulkan functions wrappers 2022-07-14 18:32:15 +02:00
ptitSeb 6cb9561d96 Changed a bit how wrapped libc clone works 2022-07-14 16:26:38 +02:00
ptitSeb 3135ba57cd Use a bigger TLSData by default with forcing emulated gtk 2022-07-14 16:26:10 +02:00
ptitSeb 96420b959a Added a couple of wrapped freetype functions (for Hacknet) 2022-07-14 15:06:01 +02:00
ptitSeb 15bda0af27 A few more fontconfig and freetype wrapped functions 2022-07-14 12:41:58 +02:00
ptitSeb a076e9b0a8 Don't prefer emulated libs for 64bits process on pressure_vessel for now (like for 32bits process) 2022-07-14 09:39:03 +02:00
ptitSeb 0cb4fa67f1 Fixed BOX86_ENVx handling (for #347) 2022-07-14 08:52:45 +02:00
ptitSeb bf79be222c Added __fwprintf_chk wrapped function (for KSP) 2022-07-11 19:59:24 +02:00
ptitSeb 1bb27f2b80 Added a workaround for missing __gxx_personality_v0 function (for #349) 2022-07-11 19:55:27 +02:00
ptitSeb 96dae29f4d Added __wcsncat_chk wrapped function 2022-07-11 16:19:30 +02:00
ptitSeb 4e0df627df Added a few NV vulkan extensions (for #348) 2022-07-11 14:10:52 +02:00
ptitSeb 15411c7c9e Added BOX64_ENV to create env. var. at load time (for #347) 2022-07-11 13:51:05 +02:00
ptitSeb b4c389c374 Double the min size of TLS data to 8k (help Keep Talking and Nobody Explode, and probably other too) 2022-07-10 15:48:58 +02:00
ptitSeb 44aeead296 [DYNAREC] More color for DYNAREC_DUMP=2 2022-07-10 15:48:43 +02:00
ptitSeb 5e0d4800d9 More previous bytes on Unimplemented Opcode message 2022-07-10 10:56:52 +02:00
ptitSeb e1a8e8d82d Small change in one of dlsym_error log 2022-07-10 10:56:12 +02:00
ptitSeb 4ae714089d Added one more wrapped function to vulkan 2022-07-09 21:36:52 +02:00
ptitSeb 3894da6242 Added more gstreamer wrapped functions 2022-07-09 19:19:47 +02:00
ptitSeb 2f74e6ebf8 Added (empty) wrapped libgcrypt.so.20 2022-07-09 18:38:12 +02:00
ptitSeb c1aeb2244c Fixed potential issue with new loaded lib comparison 2022-07-09 17:48:51 +02:00
ptitSeb d231851734 Changed various log level for libdl file open error 2022-07-09 16:52:20 +02:00
ptitSeb c4a68bcd43 [DYNAREC] Fixed some x87 issues (fixing issues with ut2004) 2022-07-09 16:18:37 +02:00
ptitSeb 1add5dac3e Added a version of libstdc++.so.5 (as it's difficult to find that version now) 2022-07-09 14:43:15 +02:00
ptitSeb ec3786f862 Various improvement and some workaround to support musl binary (for #324) 2022-07-09 11:58:35 +02:00
ptitSeb 0e761801de Restored workaround for Linux GOG installer on SBCs 2022-07-07 21:29:47 +02:00
theofficialgman 39f70c0956 change order of matrix (to preview better under checkmark dropdown (#346) 2022-07-05 22:14:13 +02:00
theofficialgman 0674636243 add 18.04 for tegra-x1 github actions (#345)
remove from ubuntu-latest as well
2022-07-05 22:01:01 +02:00
ptitSeb ea89d85845 Added __wcscat_chk wrapped function (for #343) 2022-07-04 08:11:18 +02:00
ptitSeb 0f3884afde Fixed 64 F2 0F 10 and 64 66 0F 2E opcodes (for #298) 2022-07-04 08:07:53 +02:00
ptitSeb 7b3d4c6359 Fixed a warning 2022-07-04 08:06:35 +02:00
ptitSeb f9a8fa3854 Added a workaround if pthread_cond_clockwait is not supported (for #342) 2022-07-04 07:58:09 +02:00
ptitSeb 575c86551e Added a workaround if pthread_cond_clockwait is not supported (for #342) 2022-07-04 07:53:33 +02:00
ptitSeb 57bbac4923 [DYNAREC] Disable 64 66 0F 2E opcode, something is wrong and it SIGILL (for #298) 2022-07-03 22:52:08 +02:00
ptitSeb 7f8167e4e2 Added bit29 of EDX for CPUID 0x80000001 leaf (for Xonotic v0.8.5) 2022-07-03 16:14:34 +02:00
ptitSeb ebce5998de Added 66 F0 0F C1 opcode ([DYNAREC] too) (for FRAMED Collection on Steam) 2022-07-03 15:49:23 +02:00
ptitSeb 672a41a79c Added support for R_X86_64_IRELATIVE reloc, along with a test for it (for #303) 2022-07-03 14:14:17 +02:00
ptitSeb 48b881f491 Added wrapped pthread_cond_clockwait (for #303) 2022-07-03 13:55:21 +02:00
ptitSeb a6f0525a4c Added 64 66 0F 2E/2F ocodes ([DYNAREC] too) (for #298) 2022-07-03 13:35:17 +02:00
ptitSeb d9707926fa [DYNAREC] Added most 67 00-3C opcodes 2022-07-03 13:19:57 +02:00
ptitSeb e38c663dea Added 67 38-3D opcodes (for #323) 2022-07-03 10:58:41 +02:00
ptitSeb b1873b21b6 Added syscall 324 (for #327) 2022-07-03 10:50:04 +02:00
ptitSeb 4c4d3dc9e7 Fixed a warning 2022-07-03 10:49:40 +02:00
ptitSeb c7e6777cc1 Merge pull request #294 from stiltr/misc-fixes
Add wrapped functions needed for 'ls -l'.
2022-07-03 10:42:40 +02:00
ptitSeb 5336524129 [DYNAREC] Add a mecanism to remember fixed address accessed with LOCK, so MOV to/from them use a Memory Barrier automaticaly 2022-07-03 00:07:14 +02:00
ptitSeb de30d37ba9 Reworked TLS to limit resizing, as it tends to break Unity3D games 2022-07-03 00:06:19 +02:00
ptitSeb e2b6e32fe9 Show some value around RSP when a Signal is dumped 2022-07-03 00:05:32 +02:00
ptitSeb f2573a5c02 [DYNAREC] Fixed an issue with unwinding x86 address from signal 2022-07-02 11:40:23 +02:00
ptitSeb 96f8873f2c Added syscall 231 (for #333) 2022-07-01 10:33:06 +02:00
ptitSeb b3919fe819 Merge pull request #336 from wannacu/main
Align address when call mprotect
2022-07-01 09:23:46 +02:00
wannacu 9eeaaf0a03 Align address when call mprotect 2022-07-01 15:18:05 +08:00
ptitSeb 9328ba79d1 Fixed a regression preventing wine-preloader to work correctly 2022-06-30 18:38:29 +02:00
ptitSeb 0c7168648f Added syscall 270 (for #333) 2022-06-30 17:58:34 +02:00
ptitSeb 26f8a756cb Merge pull request #334 from martinmanyhats/pagesize64k
Enable 64k page size
2022-06-30 14:13:53 +02:00
ptitSeb 4174442558 Added syscall 27 (for #333) 2022-06-30 14:05:36 +02:00
Martin Reed 452a390325 Enable 64k page size eg Ampere A1. 2022-06-30 10:45:21 +00:00
ptitSeb 9fcb6e1f38 Added one libssl wrapped functions (for #331) 2022-06-29 13:34:23 +02:00
ptitSeb 826f9cf2f3 Added 2 libssl wrapped functions (for #331) 2022-06-29 08:15:12 +02:00
ptitSeb c18fbfa106 Fixed printf_log for __cx_pure_virtual function 2022-06-28 20:27:08 +02:00
ptitSeb cd695f735b Added one libssl wrapped functions with reverse callback (for #331) 2022-06-28 20:25:57 +02:00
ptitSeb 0e3cd11a55 Added one more libssl wrapped functions (for #331) 2022-06-28 19:47:31 +02:00
ptitSeb 1236c16c83 Added one libssl wrapped functions (for #331) 2022-06-28 19:42:08 +02:00
ptitSeb 66a47329db Added one libcrypto wrapped functions (for #331) 2022-06-28 19:27:37 +02:00
ptitSeb 322f18926e Added one libssl wrapped functions (for #331) 2022-06-28 19:17:47 +02:00
ptitSeb 5bbc241168 Added a few more libssl wrapped functions (for #331) 2022-06-28 19:08:17 +02:00
ptitSeb 83925633e0 Fixed some potential issue for eroneous execv call (fixes some infinite looping AppImage) 2022-06-26 18:21:04 +02:00
ptitSeb 42943eab95 Removed blockempty call in freeProtection, as the call is slow, at the expanse of more memory that stay allocated for traking purpose, except when whole block is free 2022-06-26 14:29:20 +02:00
ptitSeb 66bf32bafa Also changed the other wrapped __Xstat(64) function to accept a NULL buffer 2022-06-26 11:18:44 +02:00
ptitSeb aa42913ece Fixed wrapped __xtsat call with NULL buffer (helps Surviving Mars) 2022-06-26 11:07:52 +02:00
ptitSeb e4e8a46424 Improved a bit HotPage handling (might help Terraria and RimWorld, maybe other) 2022-06-26 10:50:10 +02:00
ptitSeb dfe894a39b Added one more FAudio wrapped function (for Terraria) 2022-06-26 10:49:39 +02:00
ptitSeb c80feac629 Added SDL_LoadFile wrapped function (helps Terraria) 2022-06-26 10:45:51 +02:00
ptitSeb 71c1ca3eb6 Added a couple of wrapped function to libssl and libcrypto (for #330) 2022-06-25 18:20:36 +02:00
ptitSeb ffc99aa52e [DYNAREC] Remove assert, the test is not relevent anymore 2022-06-25 16:58:32 +02:00
ptitSeb 4b10506691 [DYNAREC] Fixed an issue with fillPredecessor that would undersize the predecessor array (should help #328, maybe other) 2022-06-25 13:54:15 +02:00
ptitSeb 57f1f82d76 [DYNAREC] Added CPU Dump on Signal to help debugging (only if signal inside a DynaBlock for now) 2022-06-25 13:51:53 +02:00
ptitSeb 53f84817ba [DYNAREC] Fixed a typo when turning off Dynarec 2022-06-25 13:51:22 +02:00
ptitSeb 221527e0e1 [DYNAREC] Added BRK emitter, to help debugging 2022-06-25 13:50:44 +02:00
ptitSeb 501ab2bbe8 Rollback the signal/return address change limit 2022-06-21 10:05:06 +02:00
ptitSeb f78c5a2b18 [DYNAREC] Fixed some complex x87 opcode, like FSINCOS (fixed bad camera in Unigine Heaven linux version) 2022-06-19 22:10:01 +02:00
ptitSeb 962c3c25b6 Various small debugging improvments 2022-06-19 21:18:05 +02:00
ptitSeb ae6d6d753a Do not prefer emulated on 32bits pressure vessels for now (helps winegstreamer lib) 2022-06-19 21:17:41 +02:00
ptitSeb 3e764fdc45 Change process name (hidding box64, helps mesa find the correct hack for some binaries) 2022-06-19 20:50:15 +02:00
ptitSeb f52ee794db Merge pull request #326 from Jai-JAP/patch-1
Fix grammar
2022-06-19 17:52:07 +02:00
Jai A P 34ece330f3 Update main.c 2022-06-19 21:15:23 +05:30
ptitSeb 7adaf39f1a Better handling of LD_PRELOAD libraries 2022-06-19 15:28:13 +02:00
ptitSeb 6392550208 More work on libfuse (some AppImage now runs) 2022-06-11 19:11:27 +02:00
ptitSeb 98d705ed9b [DYNAREC] added 67 8B opcode 2022-06-11 16:44:41 +02:00
ptitSeb a356eb7abf Added 67 83 opcode ([DYNAREC] too) (for #323) 2022-06-11 16:42:05 +02:00
ptitSeb e950872ec9 [DYNAREC] Fixed (or least avoid SIGILL) for DD /1 opcode 2022-06-11 15:47:35 +02:00
ptitSeb ab1fdbfead Fixed a potential crash with previous commit 2022-06-11 14:48:56 +02:00
ptitSeb 7ac8d7de22 Added support to load different libs with same name from different folders (for #299) 2022-06-11 13:40:54 +02:00
ptitSeb f012e02b35 Added 67 C7 opcode ([DYNAREC] too) (for #323) 2022-06-11 13:22:05 +02:00
ptitSeb 1ffbb7bf6b Added __cxa_pure_virtual wrapped function (for #299) 2022-06-11 10:53:09 +02:00
ptitSeb 72927195fd Added wrapped __wprintf_chk and wprintf (for #311) 2022-06-11 10:29:46 +02:00
ptitSeb e29326d8d0 Merge pull request #321 from archanox/patch-1
Fix typos and arch type string
2022-06-08 11:24:08 +02:00
Pierce Andjelkovic b7bf1955b7 Fix typos and arch type string 2022-06-08 18:31:34 +10:00
ptitSeb 1057b88ba7 Fixed some issue with TLS data not beeing updated correctly after ElfInit (fixes Steam version of Ion Fury) 2022-06-06 17:02:41 +02:00
ptitSeb de21088bc4 Added one more GL extension 2022-06-06 17:01:58 +02:00
ptitSeb d8698cdc84 Fixed an issue with GetNoSelfSymbolStartEnd function that would find in self first 2022-06-05 16:54:16 +02:00
ptitSeb 1ae1906637 Added syscall 317 2022-06-05 16:29:09 +02:00
ptitSeb 5a0fc820d4 Added some GLES wrapped functions 2022-06-05 12:22:35 +02:00
ptitSeb a1f51ad7dc Added 1 more wrapped function to libfontconfig 2022-06-05 12:22:07 +02:00
ptitSeb fbb89dcf10 Added some failsafe on unwind 2022-06-05 12:21:40 +02:00
ptitSeb 736552a559 Added preliminary support for wrapped libEGL 2022-06-05 12:01:04 +02:00
ptitSeb 162abb0a32 Fixed a regression with last dynarec refactor (for #318) 2022-06-05 10:52:38 +02:00
ptitSeb a2cd8b72dc Run elf init if __libc_start_main init param is NULL (for #315) 2022-05-30 21:43:00 +02:00
ptitSeb 11aca3f0aa Better version of F2/F3 0F 1E opcode 2022-05-30 21:42:17 +02:00
ptitSeb c312ca45bd More work on FAudio (Salt And Sanctuary seems to work fine now) 2022-05-28 22:27:32 +02:00
ptitSeb f1dc84afef [DYNAREC] Fixed a rare case of crash when crrent block is invalid 2022-05-28 22:26:39 +02:00
ptitSeb 7cafe8311e [DYNAREC] Fixed regression on 66 C1 /7 opcode 2022-05-28 20:52:35 +02:00
ptitSeb 9513053f74 [DYNAREC] Various small fixes and improvments to a few opcodes 2022-05-26 18:41:14 +02:00
ptitSeb bfea73d5d8 [DYNAREC] Fix an issue with LOCK ADD Ew, Iw opcode 2022-05-26 18:02:11 +02:00
ptitSeb 2ae1713ac1 Added XGetTextProperty wrapped function 2022-05-26 14:13:09 +02:00
ptitSeb fb2047853c Fixed XRenderComposite wrapped function signature 2022-05-26 13:33:20 +02:00
ptitSeb 3dec81b9eb First attempt to get a static build (not working for now, don't use it) 2022-05-22 17:49:54 +02:00
ptitSeb b0fa2f5ec0 Added wrapped fstat64 (for #309) 2022-05-21 20:10:14 +02:00
ptitSeb 6c367f4a29 Fixed the workaround for gog installer on PI & RK3399 SBC beeing slow to start 2022-05-21 13:01:23 +02:00
ptitSeb c8d4d3b69e Fixed wrapped lib dependancies not loading 2022-05-10 13:55:31 +02:00
ptitSeb a0234eed48 Merge pull request #306 from ryanfortner/patch-1
docs: add instructions for Debian-based Linux
2022-05-10 07:45:55 +02:00
Ryan Fortner 8cc3b54bcd Fix link 2022-05-09 22:23:24 -04:00
Ryan Fortner d8630d5bdc Update COMPILE.md 2022-05-09 22:18:08 -04:00
Ryan Fortner 82118c854c docs: add instructions for Debian-based Linux 2022-05-09 22:16:12 -04:00
ptitSeb b1b558d244 Small change to avoid wlib_t declaration in wrappedlibs.h (from box86) 2022-05-09 20:11:03 +02:00
ptitSeb 6ef734960a Some refactor on wrapped lib handling, to limit calloc/free used and get more straight forward usage of native wrapped functions (ported from box86) 2022-05-09 18:06:52 +02:00
ptitSeb 244e3eafdf Small fixes to the symbol name to avoid overriding by libs 2022-05-09 18:05:51 +02:00
ptitSeb 59e367a88e Added and fixed opcodes 66 0F 38 38..3F ([DYNAREC] too) (for #299) 2022-05-03 09:57:47 +02:00
Trevor Stiles 681f0ef111 Merge branch 'main' into misc-fixes 2022-05-01 00:12:40 -07:00
ptitSeb 098317ed29 Updated README 2022-05-01 09:02:41 +02:00
ptitSeb 30cc36abca Removed some debug leftover 2022-05-01 08:38:26 +02:00
ptitSeb 58090c2c32 Fixed fstat, fstatat and lstat wrapper signature (for #295) 2022-05-01 07:58:19 +02:00
ptitSeb 008f5913e9 Added fake libunwind wrapping 2022-04-30 14:28:11 +02:00
ptitSeb 349736b0a5 Added a few wrapped functions to libc 2022-04-30 12:29:18 +02:00
Trevor Stiles 42e926e27c Add wrapped functions needed for 'ls -l'. 2022-04-28 00:26:29 -07:00
ptitSeb 80be548b64 Added wrapped stat (for #293) 2022-04-27 10:41:50 +02:00
ptitSeb bb22be4f4f Added some libfuse wrapping (AppImage is not working yet) 2022-04-26 18:35:28 +02:00
ptitSeb fab4c72285 [DYNAREC] Fixed some issue with XMM cache and Native calls (fixed Zoom title bitmap distortion) 2022-04-25 11:35:40 +02:00
ptitSeb 9bb42fc5bf Small fixes for a few sse opcodes 2022-04-25 11:20:09 +02:00
ptitSeb 5d93fc58b3 [DYNAREC] A small optim of FCOMI macro when OF, AF or SF are needed 2022-04-25 11:19:38 +02:00
ptitSeb ab633484cd Improved BOX64_LOAD_ADDR env. var. to help having reproducible runs 2022-04-24 17:29:22 +02:00
ptitSeb 5e69a69b8d Improved initial stack build 2022-04-24 15:14:11 +02:00
ptitSeb 50a9aef179 Fixed a potential issue with stack overwritten on sigaction call 2022-04-24 15:14:06 +02:00
ptitSeb 13bc7d17bf [DYNAREC] Ignore 26 Prefix (for #290) 2022-04-23 13:26:27 +02:00
ptitSeb d8c328ec09 [DYNAREC] Ignore 36 prefix for 66 prefixed opcodes (for #290) 2022-04-23 09:19:31 +02:00
ptitSeb 2a4c1d0aac Do not use alloca here, it's not temporary storage 2022-04-18 22:50:52 +02:00
ptitSeb 6c4b88123a Added some wrapped libs and functions 2022-04-18 15:40:53 +02:00
ptitSeb b78f3a8216 [DYNAREC] No need to save op1 and op2 for defered flag computation on logic operations 2022-04-18 13:55:54 +02:00
ptitSeb 8f93b18469 [DYNAREC] Simpler writing for this test 2022-04-18 13:50:29 +02:00
ptitSeb a66725adc4 [DYNAREC] Small optim on flags barrier handling 2022-04-18 13:43:09 +02:00
ptitSeb 8d9d5f3fc3 [DYNAREC] Added F0 21 opcode 2022-04-17 17:18:49 +02:00
ptitSeb 9699198bcc [DYNAREC] Added 66 0F 3A DF opcode 2022-04-17 12:03:06 +02:00
ptitSeb aa163b5010 [DYNAREC] Added 66 0F 51 opcode 2022-04-17 11:05:29 +02:00
ptitSeb aacc392049 [DYNAREC] Better handling of opcodes with 66 F0 prefixes 2022-04-17 10:55:03 +02:00
ptitSeb 74b99b52ee [DYNAREC] Added 0F AE /7 opcode 2022-04-17 10:36:52 +02:00
ptitSeb c7b573dcff [DYNAREC] Added 66 0F 3A 20 opcode 2022-04-17 10:13:51 +02:00
ptitSeb 5b03a1e218 [DYNAREC] Added 66 F0 FF and F0 08 opcodes 2022-04-17 10:13:22 +02:00
ptitSeb 77db70f9b5 [DYNAREC] Added F8/F9 opcodes 2022-04-17 10:12:35 +02:00
ptitSeb 0379d02d8c Start of a new dev. cycle 2022-04-17 09:33:44 +02:00
ptitSeb 30302a049c Bumped version to v0.1.8 2022-04-16 17:16:49 +02:00
ptitSeb bd432a3a15 [DYNAREC] Stop spamming about not enough Hotpage after a few message, also added some memory barrier on hotpage allocation, to stay safe on Arm 2022-04-16 16:25:33 +02:00
ptitSeb b155850ad1 Updated CHANGELOG 2022-04-16 12:26:14 +02:00
ptitSeb 84a7f79315 Added libdl as a dependancy for libXext (for #246) 2022-04-16 10:37:49 +02:00
ptitSeb 3c84242cf2 [DYNAREC] Fixed an issue with internal loop to 1st instruction that then use last_ip (fixes Geekbench 5) 2022-04-16 10:22:22 +02:00
ptitSeb 3faf66a36b Some more NAN bordercase handling ([DYNAREC] too, but made FASTNAN default) 2022-04-16 08:59:28 +02:00
ptitSeb d94b47d1b0 Merge pull request #281 from Jai-JAP/main
Fix pkgver in PKGBUILDS
2022-04-16 08:33:23 +02:00
Jai-JAP 6c07bc386b Fix pkgver 2022-04-16 11:42:03 +05:30
ptitSeb 34f7571269 [DYNAREC] Added option to force x87 to use double (ported from box86) 2022-04-13 22:55:16 +02:00
ptitSeb dc9144f8f4 Fixed Page16K selection for M1 and LoongArch build 2022-04-13 07:43:48 +02:00
ptitSeb 5538ffde53 Various small fixes and warning removal 2022-04-11 08:38:46 +02:00
ptitSeb 74cd8cd6fe Try to fix the flakyness of test11 2022-04-10 14:25:16 +02:00
ptitSeb 1c83a9f0b7 Merge pull request #277 from mhavu/main
Added wrapping for g_object_weak_ref()
2022-04-10 14:01:02 +02:00
mhavu 929741e9f8 Added wrapping for g_object_weak_ref() 2022-04-10 13:29:20 +03:00
ptitSeb 9a20052200 Merge pull request #276 from mhavu/main
Added wrapping for gtk_tree_selection_selected_foreach()
2022-04-10 12:09:29 +02:00
mhavu ee6c824ccf Added wrapping for gtk_tree_selection_selected_foreach() 2022-04-10 13:06:27 +03:00
ptitSeb cbe7e1a5e7 Merge pull request #275 from mhavu/main
Added wrapping for gtk_tree_view_column_set_cell_data_func()
2022-04-10 12:01:23 +02:00
mhavu 1b605c4a4e Fixed a typo 2022-04-10 12:52:04 +03:00
mhavu 9953760fe4 Add wrapping for gtk_tree_view_column_set_cell_data_func() 2022-04-10 12:46:05 +03:00
ptitSeb 968cb3cea4 Fixed PMAXSD opcode and added PMINUW 2022-04-10 10:55:15 +02:00
ptitSeb 889bbf3e3f [DYNAREC] Fixed some issue with RIP optimisations (Fixed Doom) 2022-04-10 10:20:35 +02:00
ptitSeb abb8d29cd4 [DYNAREC] Fixed a warning 2022-04-10 09:05:41 +02:00
ptitSeb aa4ec7b68c Merge pull request #274 from mhavu/main
Added new wrappings for libx11
2022-04-09 23:48:55 +02:00
mhavu 2e69f3f480 Added some new gtk wrappings 2022-04-10 00:08:47 +03:00
mhavu ebcc3b3a72 Merge branch 'main' of https://github.com/ptitSeb/box64 2022-04-09 23:13:54 +03:00
mhavu b4adb3f3c8 Added new wrappings for libx11 2022-04-09 22:44:50 +03:00
ptitSeb f779d4fadb [DYNAREC] Refactored dynarec, using box86 refactor 2022-04-09 18:48:12 +02:00
ptitSeb c6b08a936b Added XDefaultGCOfScreen wrapped function (for #272) 2022-04-09 17:49:26 +02:00
ptitSeb 93bb6ebb0f Added XRootWindowOfScreen wrapped function (for #272) 2022-04-09 17:26:03 +02:00
ptitSeb 780a450da2 Added XDefaultColormapOfScreen wrapped function (for #272) 2022-04-09 17:07:24 +02:00
ptitSeb 3f536e4dca Added XDefaultVisualOfScreen wrapped function (for #272) 2022-04-09 15:50:54 +02:00
ptitSeb a4772ff2fa Added 66 (2E) 70-7F opcodes ([DYNAREC] too) (for #271) 2022-04-06 12:24:23 +02:00
ptitSeb 23a6d1a752 Only retry a memory access is the protection has both PROT_READ and PROT_WRITE 2022-04-06 11:35:08 +02:00
ptitSeb 74b1f9ee29 Added some libX11 and libxi wrapped functons (for #215) 2022-04-06 11:26:57 +02:00
ptitSeb e89a203481 Change message to Warning instead of Error for missing Weak GLOB_DAT 2022-04-06 10:50:03 +02:00
ptitSeb 3f53b616fe Merge pull request #270 from Jai-JAP/patch-1
Update PKGBUILDS
2022-04-06 07:46:42 +02:00
Jai A P 46e3b7a547 Update README.md 2022-04-06 10:44:30 +05:30
Jai A P 395a4901a7 Update README.md 2022-04-06 10:43:48 +05:30
Jai A P 6aa5bb3d8c Update PKGBUILD-x86_64-DEBUG 2022-04-06 10:42:59 +05:30
Jai A P f8c7a5f736 Update PKGBUILD-x86_64 2022-04-06 10:42:32 +05:30
Jai A P 5ed7db41b3 Update PKGBUILD-tegra-DEBUG 2022-04-06 10:42:05 +05:30
Jai A P 53aff6de4b Update PKGBUILD-tegra 2022-04-06 10:41:40 +05:30
Jai A P 2593f6d267 Update PKGBUILD-rpi4-DEBUG 2022-04-06 10:41:13 +05:30
Jai A P 5dd4f20822 Update PKGBUILD-rpi4 2022-04-06 10:40:43 +05:30
Jai A P dc83fd8842 Update PKGBUILD-rk3399-DEBUG 2022-04-06 10:40:02 +05:30
Jai A P 8730cd85a2 Update PKGBUILD-rk3399 2022-04-06 10:39:28 +05:30
Jai A P aff3861067 Update PKGBUILD-lx2160a-DEBUG 2022-04-06 10:38:57 +05:30
Jai A P 4e93c2d327 Update PKGBUILD-lx2160a 2022-04-06 10:38:05 +05:30
Jai A P 709878793e Update PKGBUILD-lx2160a 2022-04-06 10:37:52 +05:30
Jai A P 7199742615 Update PKGBUILD-arm64-DEBUG 2022-04-06 10:37:18 +05:30
Jai A P 507ec5abfc Update PKGBUILD-arm64 2022-04-06 10:36:31 +05:30
ptitSeb d164e80f9a Merge pull request #268 from Radiicall/patch-1
Fix grammar and spelling mistakes in COMPILE.md
2022-04-05 14:05:55 +02:00
Radical 764b8a0faf Fix grammar and spelling mistakes in COMPILE.md 2022-04-05 14:00:33 +02:00
ptitSeb c18a969ad0 Fixed some bugs on my__XVa* x11 wrapping (might help #265) 2022-04-05 09:43:58 +02:00
ptitSeb 4882f8f70e Merge pull request #267 from mhavu/main
Added some libfontconfig and libX11 wrappings
2022-04-05 08:06:59 +02:00
mhavu f0b9949aaf Updated autogenerated files 2022-04-05 08:43:09 +03:00
mhavu 0276267d32 Harmonized signature of XID type parameters and added remaining XID wrappings 2022-04-05 08:40:11 +03:00
mhavu f2408e1f62 Added libfontconfig wrapped function FcFontSetCreate 2022-04-04 20:44:16 +03:00
ptitSeb 1f869f0e30 Merge pull request #264 from mhavu/main
Added remaining __strto*_internal libc wrapped functions
2022-04-04 19:39:59 +02:00
Marko Havu 83f97f9b70 Added remaining __strto*_internal libc wrapped functions 2022-04-04 19:47:11 +03:00
ptitSeb ead3217bf4 More work on test17, and handling -NAN on divsd 2022-04-01 20:41:51 +02:00
ptitSeb f2012fc636 Added more sse2 opcode to test17, and added nan handling to SQRTSD and MULSD ([DYNAREC] too) 2022-04-01 19:27:27 +02:00
ptitSeb 16f82ba6b3 Even more test17 coverage 2022-04-01 11:27:27 +02:00
ptitSeb 5cd8176478 More coverage for test17, and added NaN handling to 66 0F 7C opcode 2022-04-01 10:45:53 +02:00
ptitSeb ea0ee7c7aa Try to fix flakyness of test11 2022-03-31 11:06:18 +02:00
ptitSeb 18a1cc77d4 Update test10 (it was a bit flaky), update libstdc++ binary, and added fake __libc_single_threadedhandling 2022-03-31 11:01:15 +02:00
ptitSeb 370286ee25 More test17 coverage 2022-03-31 11:00:25 +02:00
ptitSeb 311e8ac3e3 More cases to test17, and added -NAN generation to divpd ([DYNAREC] too) 2022-03-31 10:42:08 +02:00
ptitSeb 716eb97af9 More test17 impovements, fixed NAN for mulpd ([DYNAREC] too, introducing BOX64_DYNAREC_FASTNAN env. var. to keep old faster behaviour selectable) 2022-03-31 10:28:18 +02:00
ptitSeb 3623cb9785 Improved test17 (sse), and fixed NAN bordercase for PSQRTPD opcode 2022-03-31 09:11:54 +02:00
ptitSeb 3f641c2b67 Improved test17 ([DYNAREC] Added 66 0F 38 16 opcode, fixed 66 0F 38 24/34 opcodes) 2022-03-30 12:17:52 +02:00
ptitSeb 94c3cec69f Added 66 0F 38 14/16 opcodes 2022-03-30 12:16:25 +02:00
ptitSeb a9a82e581a Improved and enhanced test17 (SSE testing) 2022-03-30 10:53:51 +02:00
ptitSeb 0a8bbe93a5 Added 66 0F 38 30..35 opcodes ([DYNAREC] too) (for #260) 2022-03-29 12:01:40 +02:00
ptitSeb 1beba3e27a Fixed some warnings 2022-03-29 12:01:10 +02:00
ptitSeb 07a65d4827 Added some obstack_XXX wrapped function (ported from box86) 2022-03-28 14:05:07 +02:00
ptitSeb 35e35ec5db Added clone wrapped function and libgbm wrapped lib 2022-03-27 12:33:42 +02:00
ptitSeb de2b3afa17 Added BOX64_PREFER_EMULATED handling and special case for pressure-vessel to use it 2022-03-27 12:33:02 +02:00
ptitSeb 46ab4b5b71 [DYNAREC] Fixed F0 0F B0 opcode 2022-03-26 16:46:31 +01:00
ptitSeb 1eaa7159a6 More work around steam and proton/SteamPlay (working, but need also latest box86) 2022-03-26 13:20:34 +01:00
ptitSeb 4015c26e68 [DYNAREC] Added F0 0F B0 opcode 2022-03-25 20:23:32 +01:00
ptitSeb b17d802476 Fixed RunFunction and DynaCall/EmuCall with stack arguments 2022-03-25 19:10:34 +01:00
ptitSeb 9ebdf64298 fixed typo in link command (for #256) 2022-03-24 08:07:34 +01:00
ptitSeb fa07a0f331 Added a better way to select 16K pages, and added M1 paragraph in COMPILE.md 2022-03-23 10:23:00 +01:00
ptitSeb 44a20349e3 Added M1/Asahi support 2022-03-20 15:26:07 +01:00
ptitSeb 7f7003c484 Some fixes to gstreamer-1.0 wrapping 2022-03-20 11:42:55 +01:00
ptitSeb d7ab5e25f0 Some more gtk wrapping work 2022-03-19 21:20:02 +01:00
ptitSeb 5a563f1cc6 More work on GTK wrapping (hterm seems to run fine now) 2022-03-19 15:11:04 +01:00
ptitSeb 7c42cf2d95 Less log in LOG_INFO level 2022-03-19 14:28:42 +01:00
ptitSeb 30e128e41d Small fixes to some wrapped X11 functions 2022-03-19 09:21:22 +01:00
ptitSeb 795c405e81 Fixed, again, the mmap block selection (shoudl help #587) 2022-03-18 11:44:19 +01:00
ptitSeb 515f4e8119 Improve findBlockNearHint function and friends, again (in sync with box86) 2022-03-17 12:29:15 +01:00
ptitSeb 4a29c32d0c Fixed new wrapped x11 functions (from 7943858290) 2022-03-14 14:03:27 +01:00
ptitSeb 696b88375d Fixed the new memmap tracking 2022-03-13 17:09:41 +01:00
ptitSeb 8a354d4439 Fixed some LOG=2 improved trace 2022-03-13 17:09:27 +01:00
ptitSeb ace2803928 Merge pull request #253 from wannacu/main
Add some function wrapper of libx11
2022-03-11 16:59:43 +01:00
wannacu 7943858290 Add some function wrapper of libx11 2022-03-11 18:18:34 +08:00
ptitSeb 8073bb279f Fixed for good non-dynarec builds 2022-03-09 12:33:21 +01:00
ptitSeb 293b07bbb6 Fixed non-dynarec builds 2022-03-09 12:23:01 +01:00
ptitSeb b57f998c58 Change method for the mmap free bloc search for a faster one 2022-03-09 11:17:20 +01:00
ptitSeb 7fc31d593d Change de verbose level of a custommem message 2022-03-08 18:49:44 +01:00
ptitSeb 010f3d9748 Fixed a warning 2022-03-08 17:37:09 +01:00
ptitSeb ff31d0b023 Better handling of environ and envp in execve 2022-03-08 17:37:09 +01:00
ptitSeb 652e8318e6 Added [stack] to the generated maps file 2022-03-08 17:37:09 +01:00
ptitSeb e05796674b Merge branch 'main' of https://github.com/ptitSeb/box64 into main 2022-03-08 16:40:35 +01:00
ptitSeb 0ce169e7f5 Added StarFive as hardware sponsors in READMEs 2022-03-08 16:40:27 +01:00
ptitSeb 726af707eb Removed a debug leftover 2022-03-07 15:08:35 +01:00
ptitSeb 0b37d4aac2 Rolback this change in signal, and better change the interpretor handling of IP instead 2022-03-07 14:44:38 +01:00
ptitSeb 749c871124 Small change is symbol gathering for wrapped libs 2022-03-07 14:18:04 +01:00
ptitSeb 622baec952 Fix some special case on mmap64 wrapping 2022-03-07 14:14:07 +01:00
ptitSeb a326c82158 Fixed dlinfo (helps wine) 2022-03-06 19:13:08 +01:00
ptitSeb 9c47b1fbf9 Added an option to always show SIGSEGV messages 2022-03-06 18:51:18 +01:00
ptitSeb b525b0bdd4 Fixed a rare case of segfault 2022-03-06 18:50:48 +01:00
ptitSeb 0a08b7da1a Removed a debugging leftover 2022-03-06 17:14:15 +01:00
ptitSeb a996f4c091 Added some vulkan extentions 2022-03-06 16:54:17 +01:00
ptitSeb e517e58776 Improved speed of mmap changes 2022-03-06 16:27:19 +01:00
ptitSeb d2cb088918 Change on mmap to help some stagging version of wine 2022-03-06 15:23:15 +01:00
ptitSeb 6ca94b9f3f Some small changes to clone syscall 2022-03-06 11:29:32 +01:00
ptitSeb d8ea2d637b Added 64 F3 0F 6F opcode ([DYNAREC] too) (for #241) 2022-03-05 21:25:30 +01:00
ptitSeb a6dd5c9930 Try to add -pthread in link (should help #249) 2022-03-05 17:59:21 +01:00
ptitSeb ec3341e5d6 Some work to have steam streaming working (for #247) 2022-03-05 17:54:08 +01:00
ptitSeb a63e840674 [DYNAREC] Added 64 0F B6 and 64 3B opcodes 2022-03-05 16:09:50 +01:00
ptitSeb 0e9b61b3d8 Added 64 63 opcode ([DYNAREC] Too) 2022-03-05 15:01:58 +01:00
ptitSeb 4c2008f6cb [DYNAREC] Fixed GetEBO macro 2022-03-05 15:01:16 +01:00
ptitSeb 430b7c665e [ARM64] Added printer for STRB Reg, [Reg, Reg] 2022-03-05 14:38:00 +01:00
ptitSeb 90fe73333c Include pthread.h when used (should help #249) 2022-03-05 09:00:43 +01:00
ptitSeb dd60e17835 Improve function name in trace a bit 2022-03-04 20:15:40 +01:00
ptitSeb aad680d61d Added wrapped SDL_GetPreferredLocales function (for #247) 2022-03-04 20:15:19 +01:00
ptitSeb 9d65062d35 Various changes and improvement centered around steam (but still not good enough) 2022-03-04 14:41:17 +01:00
ptitSeb 2bd78e25fd Removed a debug trace 2022-03-03 15:15:56 +01:00
ptitSeb b1bd9c6810 [DYNAREC] Fixed F3 0F E6 opcode (help Factorio) 2022-03-03 12:50:27 +01:00
ptitSeb 6f4ce37cce Added 64 0F 11 opcode ([DYNAREC] too) 2022-03-03 12:49:37 +01:00
ptitSeb 23bbab10b4 One more syscall 2022-03-01 23:42:02 +01:00
ptitSeb 8b1f55aff0 More work on readlinkat and clone syscall 2022-03-01 23:39:01 +01:00
ptitSeb b00764d658 Some work on glib, gobject and steam 2022-03-01 13:17:12 +01:00
ptitSeb 97e9e5d2d2 Added a few more slot to glib2 2022-03-01 11:19:50 +01:00
ptitSeb db63885945 Added some missing variables in USAGE.md 2022-03-01 11:19:21 +01:00
ptitSeb 796d95528b Added some more wrapped pulse functions 2022-03-01 11:11:59 +01:00
ptitSeb c3fd9d03ba [DYNAREC] still working on multiarch 2022-02-28 16:03:28 +08:00
ptitSeb 7a539e4ef7 [DYNAREC] And yet more multiarch changes 2022-02-27 17:13:11 +01:00
ptitSeb bfd89b404a Merge pull request #243 from Mzed3D/patch-1
Patch 1
2022-02-27 17:03:07 +01:00
Mzed3D e8337ddd3a Update CMakeLists.txt 2022-02-27 15:09:21 +01:00
Mzed3D 84e0b2a42d Update CMakeLists.txt
Added Odroid-N2 specific profile
2022-02-27 14:53:56 +01:00
ptitSeb 4ee2888711 Try to build RISC-V 2022-02-27 14:36:30 +01:00
ptitSeb 24b781a641 Merge pull request #199 from Alexmitter/main
Add initial RISCV support
2022-02-27 14:14:28 +01:00
ptitSeb 3ceff2ce2e [DYNAREC] And more multiarch changes 2022-02-27 13:58:11 +01:00
ptitSeb b2309cec52 [DYNAREC] Still more multiarch changes 2022-02-27 13:24:37 +01:00
ptitSeb e190bb4b52 [DYNAREC] Even more work on multiarch 2022-02-27 13:08:28 +01:00
ptitSeb 5d9b14dac7 [DYNAREC] More multiarch changes 2022-02-27 12:52:28 +01:00
ptitSeb 786ceec713 [DYNAREC] And even more multi-arch work 2022-02-27 19:57:29 +08:00
ptitSeb 3c660f7f16 [DYNAREC] And more multi-arch work 2022-02-27 19:18:23 +08:00
ptitSeb 2f1024f167 [DYNAREC] More multi-arch work 2022-02-27 19:06:21 +08:00
ptitSeb 6d41839341 [DYNAREC] More work on multi-arch 2022-02-27 18:58:43 +08:00
ptitSeb ba4bf228cb Small adjustment on loongarch support 2022-02-27 11:21:26 +01:00
ptitSeb ff909da96a [DYNAREC] Improve signals to better handle multiple archs 2022-02-27 18:26:51 +08:00
ptitSeb 0cdb134d45 [DYNAREC] Refactored dynarec to ease the future adding of new target architecture 2022-02-27 09:48:00 +01:00
ptitSeb ea6d95986e Added a few more wrapped function (for #241) 2022-02-26 18:15:45 +01:00
ptitSeb 20e8333032 Added __wcsncpy_chk to wrapped libc 2022-02-26 18:05:10 +01:00
ptitSeb fc3b931911 Use sched_getcpu instead of deprecated getcpu (for #239) 2022-02-20 23:31:46 +01:00
ptitSeb a67606db8f Fixed build for x86_64 2022-02-20 16:31:23 +01:00
ptitSeb ab1af8d709 Some small changes to how cpuid is done (especially on core counts) 2022-02-20 16:03:27 +01:00
ptitSeb ffaae3ef39 [TRACE] Small changes to function name print in trace 2022-02-20 16:02:58 +01:00
ptitSeb e3839f6a09 Make sure stack is correctly alligned on new thred (fixed SOR4 starting issues) 2022-02-19 15:01:18 +01:00
ptitSeb 9e07083c0f Merge pull request #236 from rajdakin/backtrace_fix
Fixed the backtrace wrapper
2022-02-14 13:17:11 +01:00
rajdakin 77925f264f Fixed the backtrace wrapper (uses eh_frame information only) 2022-02-14 13:13:12 +01:00
ptitSeb 78b51bc367 Merge pull request #235 from rajdakin/opcode_fix
Fixed the CVTPD2DQ dynarec opcode
2022-02-14 13:10:32 +01:00
rajdakin 55bc853659 Fixed the CVTPD2DQ dynarec opcode 2022-02-14 12:43:36 +01:00
ptitSeb 97857d55a0 [DYNAREC] Added 0F 3A 0F opcode 2022-02-13 12:16:42 +01:00
ptitSeb 4bfacf8a7e [DYNAREC] Added F2 0F D6 opcode 2022-02-13 12:08:50 +01:00
ptitSeb 23709c09c7 Added some code to detect if emulted program use old IMG_SavePNG_RW api instead of current one 2022-02-13 12:02:37 +01:00
ptitSeb 547b97d4cb Undo last commit 2022-02-11 19:14:12 +01:00
ptitSeb d7483cb3a4 Fixed wrapped function IMG_SavePNG_RW from SDL2-image 2022-02-11 18:58:43 +01:00
ptitSeb 7224281cd6 Added 0F 3A 0F opcode 2022-02-11 18:48:05 +01:00
ptitSeb e0dfef8461 Added 1 wrapped function to libsdl2 2022-02-11 18:43:20 +01:00
ptitSeb 27a07d23d7 [DYNAREC] Fixed an optimisation (intra-dynablock jump) that was broken for a long time (mora than 10% perf gain on '7z b') 2022-02-11 16:52:51 +01:00
ptitSeb 30050fd7ec Added wrapped lldiv (for Ion Fury) 2022-02-10 22:36:37 +01:00
ptitSeb a7da857646 Small update to README_CN 2022-02-10 08:00:38 +01:00
ptitSeb efd240742f Small update to README 2022-02-10 07:57:21 +01:00
ptitSeb d7ca4abf40 Added F0 0F C0 opcode (for #210) 2022-02-06 18:35:13 +01:00
ptitSeb 757b74e1d0 Added 2E opcode ([DYNAREC] too) 2022-02-06 18:24:52 +01:00
ptitSeb 552258ed3c Added SDL_GetAudioDeviceSpec wrapped function to SDL2 2022-02-05 09:31:12 +01:00
ptitSeb afc4cbc3b2 Merge pull request #226 from classilla/main
ensure uc_link is properly initialized in getcontext(), fixes ppc64le
2022-02-04 07:50:34 +01:00
Cameron Kaiser 0a04c9ff39 ensure uc_link is properly initialized in getcontext(), fixes ppc64le 2022-02-03 22:36:40 -08:00
ptitSeb a358167897 Merge pull request #223 from CalcProgrammer1/fix-debian
Correct package name in Debian changelog
2022-02-02 07:56:00 +01:00
Adam Honse 195f6a33bc Correct package name in Debian changelog 2022-02-02 00:26:59 +00:00
ptitSeb 5aab593a5a Added vswscanf wrapped function (for #216) 2022-01-25 22:42:55 +01:00
ptitSeb ca3247d21a Wrapped g_initable_new and g_initable_new_valist from libgio2 2022-01-23 22:22:40 +01:00
ptitSeb 511a7d2448 Fix(?) of the better wrapping for g_option_context_add_main_entries 2022-01-23 22:02:20 +01:00
ptitSeb b6c172865b Better wrapping for g_option_context_add_main_entries 2022-01-23 20:51:32 +01:00
ptitSeb 40de393aa5 Added preliminary wrapped libFAudio; libgstreamer (and friends) and libgmp 2022-01-22 18:59:28 +01:00
ptitSeb fefda0f6e7 Added 66 F0 FF opcodes 2022-01-22 18:51:46 +01:00
ptitSeb 4302a311a4 Fixed elfloader symbol version searching (in sync with box86) 2022-01-22 12:39:31 +01:00
ptitSeb ed2a792672 Merge branch 'main' of https://github.com/ptitSeb/box64 2022-01-22 12:16:54 +01:00
ptitSeb e60f8c9a3f Merge pull request #214 from ryanfortner/main
Add Debian packaging files
2022-01-18 22:12:59 +01:00
Ryan Fortner 909ae5ada9 Add Python dependency to control file 2022-01-18 15:51:30 -05:00
Ryan Fortner 4743f8fcc5 Update COMPILE.md 2022-01-18 15:11:52 -05:00
Ryan Fortner 04e8eb1a45 upload base debianization 2022-01-18 15:10:40 -05:00
ptitSeb 666553c4a0 Improved 47bits memory limit for wine 2022-01-17 15:21:23 +01:00
ptitSeb 07a6640ff9 Removed a duplicated macro 2022-01-17 15:20:47 +01:00
ptitSeb e005c60d78 Improved wine detection 2022-01-17 15:20:30 +01:00
ptitSeb 9bf7185c7c Fixed a typo in TBZ_MARK and TBNZ_MARK emitter (fixed infinite loop in Ex-Zodiac Demo) 2022-01-09 15:54:42 +01:00
ptitSeb 97b86e2257 Small cleanup on unloading lib messages 2022-01-09 15:53:36 +01:00
ptitSeb 10effff239 [DYNAREC] Small optim to F0 81/83 /0 /5 opcodes 2022-01-09 15:52:59 +01:00
ptitSeb a3f27f9a63 Added some missing wrapped functions to libudev-1.so 2022-01-08 21:03:00 +01:00
ptitSeb 1f9db9ef08 Another attempt to make the function to find versionned symbol more resiliant 2022-01-08 19:12:18 +01:00
ptitSeb 91e13d3557 [DYNAREC] Small change to unused PRECISE_CVT part 2022-01-07 11:09:45 +01:00
ptitSeb 667dc36962 Merge pull request #204 from Seas0/main
Sync configuration from box86
2022-01-07 10:17:15 +01:00
CorteX f5d06338c7 Merge branch 'ptitSeb:main' into main 2022-01-07 16:52:54 +08:00
Seas0 42ab23a833 Sync configuration from box86 2022-01-07 16:43:52 +08:00
ptitSeb e249a33d3e Fixed (F0) 0F C7 opcode, only /1 is CMPXCHG(8/16)B 2022-01-06 21:46:53 +01:00
ptitSeb 5f03d1b905 [DYNAREC] Added 8E opcode 2022-01-06 21:22:41 +01:00
ptitSeb c85a2ac9ee Added deprecated libpng12.so, because it's more and more difficult to have a native version of it 2022-01-06 18:22:33 +01:00
ptitSeb 0c069aaba1 [DYNAREC] Oops, fixed 66 0F D1/D2 opcodes 2022-01-06 18:13:16 +01:00
ptitSeb 1e010f38c9 [DYNAREC] Added 66 0F D1 opcode and improved 66 0F D2 opcode 2022-01-06 18:09:26 +01:00
ptitSeb 8260931ad7 [DYNAREC] Added 66 0F E3 opcode 2022-01-06 18:09:06 +01:00
ptitSeb 5e01769622 Made the missing symbol workaround more resiliant 2022-01-05 22:50:14 +01:00
ptitSeb 97a1da81af Added a warning if launching a binary with a preinit array 2022-01-05 21:04:13 +01:00
ptitSeb 55e888074d Added 1 curl function (for #195) 2022-01-05 21:02:39 +01:00
ptitSeb 255be6e786 Added some more glib2 wrapped functions (for #202 and second ticket of #195) 2022-01-05 21:01:48 +01:00
ptitSeb 42b18c57ce Added a Workaround when dlsym a native (versionned) symbol without default version fails 2022-01-05 11:21:33 +01:00
ptitSeb dd0f7c1d5c [DYNAREC] Added F0 66 09 opcode (for Metro Exodus) 2022-01-03 09:33:25 +01:00
ptitSeb 680a08fb5b Added many F0 66 opcodes (should help Metro Exodus) 2022-01-03 09:32:47 +01:00
ptitSeb 203c40d27c [ARM64] Added some doc about the different hwcap constants 2022-01-03 09:32:00 +01:00
ptitSeb 0f3fe62327 Added some workaround for program that calls 'uname -m' to get the architecture of the host, and change default banner and log to be silent if stdout is beeing redirected (help RimWorld mods like Harmony) 2022-01-01 10:01:45 +01:00
ptitSeb eea3857065 [DYNAREC] Added some more Memory Barrier when trying to emulate StrongMem model (should help RimWorld) 2022-01-01 10:01:45 +01:00
ptitSeb a8fc74a033 [DYNAREC] Added DMB printer 2022-01-01 10:01:45 +01:00
ptitSeb 895c8b7098 Merge pull request #201 from Seas0/main
Fix the typo of CMakeLists.txt
2021-12-31 17:54:15 +01:00
Seas0 f3b300e9e0 Fix the typo of CMakeLists.txt in Github Action configuration 2022-01-01 00:23:32 +08:00
ptitSeb ff82c956f1 Added a couple of libc wrapped functions 2021-12-31 17:14:22 +01:00
ptitSeb 6e1c0c1353 Cleaned up some special case detection from box86 that are 32bits only 2021-12-31 15:27:28 +01:00
ptitSeb ffe2cd0203 Added empty wrapped libpci.so.3 2021-12-31 14:59:50 +01:00
ptitSeb ea2b95389b [DYNAREC] Small change in dynablock handling 2021-12-31 14:59:05 +01:00
ptitSeb 2fa366c7a8 Added one more libcxb wrapped function 2021-12-31 14:10:18 +01:00
ptitSeb b75eec2fea Added some drm related wrapped libs (from box86) 2021-12-31 13:55:29 +01:00
Alexmitter b932ad8c65 Update COMPILE.md to add RISCV
again based on loongarch64
2021-12-30 22:43:06 +01:00
Alexmitter cc9f770d90 Add support for RISCV to myalign.h
based on https://github.com/riscv-non-isa/riscv-toolchain-conventions
correct preprocessor definition for RISCV is __riscv
2021-12-30 22:40:26 +01:00
Alexmitter 6a9d399648 Add RV64 support to CMakeLists.txt
based on loongarch64
2021-12-30 22:34:59 +01:00
ptitSeb fbb534917a [DYNAREC] Fixed some border case for IDIV opcode 2021-12-22 12:13:21 +01:00
ptitSeb 41d3fb7432 Made unsuported libc syscall non-fatal 2021-12-21 20:30:35 +01:00
ptitSeb 5d1298ebe3 Merge pull request #192 from ohayoyogi/feature/libssl
[WIP] solves libssl problem related to Minecraft Bedrock Dedicated Server
2021-12-13 07:52:58 +01:00
ohayoyogi 37b94ed266 Add some libssl wrappers 2021-12-13 03:00:01 +00:00
ptitSeb 40c58241ea Merge pull request #177 from mikptz/main
Add support for LX2160A based devices
2021-11-24 13:07:42 +01:00
Mikhail Petranov 194c346c18 Updated compile docs to include LX2160A support 2021-11-24 10:51:13 +00:00
Mikhail Petranov 11dae594a3 Added support for LX2160A CPU 2021-11-24 10:43:12 +00:00
ptitSeb 5918fe4b58 Merge pull request #176 from ryanfortner/improve-readme
Improve README
2021-11-23 00:41:43 +01:00
Ryan Fortner 2cad9392c4 Update readme.md 2021-11-22 18:39:03 -05:00
Ryan Fortner 3d36eb6345 Update readme.md 2021-11-22 18:38:43 -05:00
Ryan Fortner 9d7652d3ba Update readme.md 2021-11-22 18:33:18 -05:00
ptitSeb e905a72e03 Ooops, fixed build (still for #174) 2021-11-22 23:18:42 +01:00
ptitSeb 99e02f978d Added syscall 63 (for #174) 2021-11-22 23:10:43 +01:00
ptitSeb 89112197d4 [PPC64LE] Added option in CMakeList and paragraph in COMPILE.md (to be checked by ppc64le owners) 2021-11-22 21:53:58 +01:00
Ryan Fortner 96b27013f8 Update README.md 2021-11-22 14:17:24 -05:00
Ryan Fortner 262d5670fe Update README.md 2021-11-22 14:15:17 -05:00
Ryan Fortner b7f16075ca Update README.md 2021-11-22 13:14:05 -05:00
Ryan Fortner d093585750 Update README.md 2021-11-22 13:13:17 -05:00
Ryan Fortner 3b2797f1e1 Improve README 2021-11-22 13:12:12 -05:00
ptitSeb 284345d533 Added 64 8A opcode ([DYNAREC] too) (for #171) 2021-11-22 07:51:22 +01:00
ptitSeb 07767d42cc Fixed some issue with getopt (for #170) 2021-11-21 22:20:28 +01:00
ptitSeb 9d97ce087a Wrapped Vulkan libraries 2021-11-21 19:14:40 +01:00
ptitSeb 3fa758e895 Merge pull request #169 from Moldytzu/main
Fix some typos
2021-11-21 18:51:21 +01:00
ptitSeb 01fe333167 New dev. cycle 2021-11-21 18:49:40 +01:00
Alex 6390b1b9a8 fix typos again 2021-11-21 17:30:28 +02:00
Alex f68082edad fix typos 2021-11-21 17:28:30 +02:00
ptitSeb 1874c57eae Merge pull request #168 from Jai-JAP/patch-1
Fix typo in release.yml [box86 -> box64]
2021-11-20 09:24:57 +01:00
Jai A P 8130c110eb Fix typo box86 -> box64 2021-11-20 13:08:34 +05:30
ptitSeb e6e9fae178 Bumped to v0.1.6 2021-11-19 22:21:29 +01:00
ptitSeb 7042a1ae30 Try to use Github Actions 2021-11-19 21:52:10 +01:00
ptitSeb 7d277cc1ec Updated CHANGELOG 2021-11-19 21:43:49 +01:00
ptitSeb 1ac0465a03 Small change on unload of box64 2021-11-19 21:43:32 +01:00
ptitSeb 3533db97ff [DYNAREC] Reduce performance impact of StrongMem, and added old Strongmem method as BOX64_DYNAREC_STRONGMEM=2 2021-11-19 11:22:59 +01:00
ptitSeb 7888cae6c7 Merge pull request #166 from eerykitty/main
Minor changes to allow box64 to build and run on 64-bit PowerPC.
2021-11-19 07:48:02 +01:00
Joseph Allen b021beba6a Minor changes to allow box64 to build and run on ppc64le. 2021-11-18 17:48:52 -06:00
ptitSeb 684d67d12e Added wrapped __isoc99_scanf function (for #164) 2021-11-18 14:25:53 +01:00
ptitSeb 8d7683b851 Changed elfloader a bit to merge elf memory block if close enough (help load program on loongarch architecture) 2021-11-18 14:23:37 +01:00
ptitSeb e7290d78d5 [DYNAREC] Improved JIT handling, and added a HotPage detection to temporarily disable Dynarec when write occurs on the same page of some Dynablocks (help speedup some C#/Unity3D programs) 2021-11-18 14:21:16 +01:00
ptitSeb 4f0e98ade5 [DYNAREC] Added an option to simulate Strong Memory Model, and auto activate it when libmonobdgcw-2.0.so is detected (should help #110 and #158 at least) 2021-11-18 14:18:00 +01:00
ptitSeb 39dbfd9fd8 [DYNAREC] Removed special case for RimWorldLinux and generalized it for all program loading libmonodbwgc-2.0.so 2021-11-18 13:50:10 +01:00
ptitSeb 2d18558dc5 [TRACE] Fixed trace on function from a dlopen library not triggering preperly 2021-11-17 19:41:00 +01:00
ptitSeb 5fb9397521 [DYNAREC] Fixed a small issue with Segfault in Fillblock detection 2021-11-15 17:45:31 +01:00
ptitSeb f85e24dff8 [DYNAREC] Added some DMB to try help multi-tasked+JIT program (may help #110) 2021-11-14 21:43:02 +01:00
ptitSeb 2ea272fcd6 [DYNAREC] Added DMB emitter 2021-11-14 20:57:51 +01:00
ptitSeb d3e85b439b Added wrapped libxslt (from box86) (should help #161) 2021-11-14 15:19:25 +01:00
ptitSeb ea837908b6 Added wrapped libldap_r and liblber (helps wine) 2021-11-14 15:15:47 +01:00
ptitSeb a1573835dd Change ResolvePath behaviour in sync with box86 2021-11-14 10:44:55 +01:00
ptitSeb 34355d6b0c Added some data symbol to wrapped libxml2 (for #161 but it would probably be better to wrap libxslt directly) 2021-11-12 19:20:08 +01:00
ptitSeb 9557e4711f Added a few xcb symbols (for #161) 2021-11-12 12:19:50 +01:00
ptitSeb 6a1b9e050a [DYNAREC] Changed Dynarec a bit to try stabilise program using many threads and a JIT (help RimWorld Linux, but not enough to be 100% stable) 2021-11-11 20:47:10 +01:00
ptitSeb 6675b43dd0 [DYNAREC] Pass0 now alocate memory and do more stuff from pass1 2021-11-11 12:37:32 +01:00
ptitSeb 79d7e9f8eb Mark memprot as volatile to try help stability in heavily multithread programs 2021-11-11 12:37:01 +01:00
ptitSeb f5c9439f91 Improved CMPSS/CMPSD opcodes, improved test17 ([DYNAREC] too, and improved MINSS/MAXSS/MINSD/MAXSD too) 2021-11-07 15:06:55 +01:00
ptitSeb f73e4193f0 Chnaged memory protection tracking to reduce usage of lock, especially for [DYNAREC] reduced mutrex and chances of deadlock (help RimWorld) 2021-11-05 21:17:14 +01:00
ptitSeb 841003bc47 Added 1 wrapped function to freetype (for SOR4) 2021-11-02 22:21:36 +01:00
ptitSeb 27cf5c81b2 Better wrapping for libz inflate 2021-11-02 22:08:43 +01:00
ptitSeb 323783bf49 [DYNAREC] Fixed right shift emmiter with const = 1 (help wine 6.17, and probably many other stuffs) 2021-11-01 13:20:32 +01:00
ptitSeb fbd9604dc1 Added handling of ARCH_GET_FS to arch_prctl 2021-11-01 13:19:44 +01:00
ptitSeb 5494d417c0 [DEBUG] Don't overwrite trace if %pid is used 2021-11-01 11:28:17 +01:00
ptitSeb 472037cba2 [ARM64] Check if Atomics are supported (not used yet) 2021-11-01 11:27:36 +01:00
ptitSeb 1b19d8b909 Added Phytium paragraph to COMPILE.md 2021-10-30 12:12:13 +02:00
ptitSeb c2909c32ab Updated the CHANGELOG 2021-10-27 19:42:19 +02:00
ptitSeb a7c0c01bf4 [DYNAREC] Cancel a dynablock if a segfault occurs while building it 2021-10-27 19:42:01 +02:00
ptitSeb d80226ec61 Added signalfd wrapped function to libc 2021-10-26 20:10:29 +02:00
ptitSeb da81ba5be8 Fixed some program (like the one made in rust) that was getting the command line properly 2021-10-26 19:03:03 +02:00
ptitSeb f81874277c Added reboot wrapped function to libc 2021-10-26 18:30:38 +02:00
ptitSeb d93b97ee92 Added a bunch of aio_ and mq_ wrapped function to librt 2021-10-26 17:45:24 +02:00
ptitSeb 4812d20da5 Added mogery to major code contributor in chinese Readme too 2021-10-25 09:34:47 +02:00
ptitSeb 734e7cd47c Added @mogery to major code contributor 2021-10-25 09:34:12 +02:00
ptitSeb d052b35c40 Detect steamwebhelper and don't load it for now (until it's actually fixed) 2021-10-24 19:07:55 +02:00
ptitSeb 2bd3a3ccfa Optimized (and small fixes) to custom allocator ([DYNAREC] Speedup long launch time) 2021-10-24 19:06:23 +02:00
ptitSeb 1886c454ca Added 67 0F 67/7F ocpodes ([DYNAREC] too) (for The Last Federation) 2021-10-24 18:12:37 +02:00
ptitSeb 91ee1afe24 Added wrapped libncursesw.so.6 (for #148) 2021-10-23 19:02:49 +02:00
ptitSeb d867f578df Fixed SDL_Log wrapped function 2021-10-23 15:50:41 +02:00
ptitSeb b48ba048ed Added FcConfigAppFontAddDir wrapped function (for #150) 2021-10-22 20:54:37 +02:00
ptitSeb 35a21d8932 Merge pull request #147 from bbbruni/main
Add a debug mode compilation with disabled compiler optimizations
2021-10-21 22:14:19 +02:00
bbbruni 81ec174e2a Added PKGBUILD-x86_64-DEBUG 2021-10-21 22:47:08 +03:00
bbbruni 400ea800d9 Added PKGBUILD-tegra-DEBUG 2021-10-21 22:45:44 +03:00
bbbruni 0e1215268a Added PKGBUILD-rpi4-DEBUG 2021-10-21 22:44:24 +03:00
bbbruni a72d257443 Added PKGBUILD-rk3399-DEBUG 2021-10-21 22:42:28 +03:00
bbbruni 6a99a4b359 Changed DCMAKE_BUILD_TYPE to Debug 2021-10-21 22:40:57 +03:00
bbbruni b6764d1d6f Add debug version of PKGBUILD-arm64 2021-10-21 22:37:11 +03:00
bbbruni d5e105ce62 Disable compiler optimizations in debug mode 2021-10-21 22:31:50 +03:00
ptitSeb 45ee1e3c3c Added a new wrapped function to libc (for #143) 2021-10-21 19:31:33 +02:00
ptitSeb b1d0dde0b4 Proper fix for link issue on glibc 2.34+ (for #120) 2021-10-20 22:54:42 +02:00
ptitSeb cb06d28383 Added explicit link with libc (might help with #120) 2021-10-20 10:40:29 +02:00
ptitSeb 36bfcd21d4 Merge pull request #135 from mogery/getattr-align-wrap
Add alignment wrapper to pthread_getattr_np.
2021-10-18 10:12:48 +02:00
ptitSeb faa48276e5 Merge pull request #137 from Heasterian/patch-2
Fixing typo
2021-10-18 07:43:21 +02:00
ptitSeb 8e5d32430a Fixed build 2021-10-17 23:06:01 +02:00
Heasterian ac2d5b17dd Fixing typo 2021-10-17 23:59:46 +03:00
ptitSeb 0e2c63d9fb Merge pull request #136 from Heasterian/patch-1
Add Snapdragon 845 compilation
2021-10-17 22:21:33 +02:00
Heasterian 71b446774c Update COMPILE.md
Changes about compilation on Snapdragon 845 devices
2021-10-17 22:34:47 +03:00
Heasterian dac71e9f7b Update CMakeLists.txt
Adding configuration for Snapdragon 845 devices.
2021-10-17 22:31:45 +03:00
Gergő Móricz e1a2230e9c Add alignment wrapper to pthread_getattr_np.
This fixes stack corruption when using pthread_getattr_np on
hirsute (Ubuntu 21.04) and libc >=2.33

This should also fix #130.
2021-10-17 21:19:52 +02:00
ptitSeb 82bd4431e6 [TRAVIS] Try to use Graviton2 for Arm64 2021-10-14 08:58:27 +02:00
ptitSeb 7262288502 Merge pull request #132 from mogery/memory-map-fix
Map bricks below first 2GB of address space
2021-10-13 22:42:20 +02:00
mogery bcb0bdea77 Declare my_mmap and my_munmap to avoid warning
This adds a declaration of my_mmap and my_munmap to
src/tools/bridge.c in order to avoid a
-Wimplicit-function-declaration warning when compiling.

This should probably be moved to a header file in the
future.
2021-10-13 15:09:48 +02:00
mogery 4ca58d1f99 Fix incorrect brick cleanup
FreeBridge used free to clean up the pointer allocated by
my_mmap, which is incorrect and lead to a crash upon code
that exited gracefully.

The free was replaced with my_munmap.
2021-10-12 20:05:22 +02:00
mogery 0c27b82ff3 Map bricks below first 2GB of address space
This fixes an issue with mono where JIT compiled code would
near-call wrapped libraries, but fail because the difference
between PC and the call address did not fit into an imm32.

This was fixed by replacing posix_memalign with my_mmap and
providing the MAP_32BIT flag.

Fixes #131
2021-10-12 19:47:31 +02:00
ptitSeb 289deb3655 [DYNAREC] Added F2 0F E6 opcode 2021-10-05 23:07:32 +02:00
ptitSeb 8d69c17839 [DYNAREC] Added 67 89/C1/F7 opcodes 2021-10-05 23:06:58 +02:00
ptitSeb 348cb57240 Small fix for elfloader 2021-10-05 00:23:42 +02:00
ptitSeb 46f71f3947 Added some more crypto and ssl wrapped functions (bedrock server starts now) 2021-10-04 08:25:29 +02:00
ptitSeb 0ba4b04078 Added empty wrapped libnsl.so.1 2021-10-04 08:25:29 +02:00
ptitSeb 5a5f572162 Added Phytium profile 2021-10-02 09:46:33 +02:00
ptitSeb fb5bc122cc Added mallinfo wrapped function (for #121) 2021-09-29 08:10:06 +02:00
ptitSeb 4c328d0fca Fix g_source_new wrapped function and friends (helps Zoom) 2021-09-28 19:55:26 +02:00
ptitSeb dbce2758b2 Merge pull request #119 from Linux-Adaptation-Integrated-Toolkit/main
additional info for compilation document
2021-09-27 17:21:48 +02:00
zhaozhen 837f7edd55 additional info for compilation document 2021-09-27 22:21:49 +08:00
ptitSeb f054fb3a5f Merge pull request #118 from Jai-JAP/patch-1
Fix small typo in README.md
2021-09-26 19:12:26 +02:00
Jai A P 96831b144c Update README.md 2021-09-26 22:29:37 +05:30
ptitSeb d75116dab7 Merge pull request #117 from Linux-Adaptation-Integrated-Toolkit/main
add loongarch cmake fix and chinese document
2021-09-26 16:58:14 +02:00
zhaozhen 8da46ee305 add loongarch cmake fix and chinese document 2021-09-26 22:48:28 +08:00
ptitSeb 4cac721e74 Yeah, that too should help fix build for the untested loogarch64 support 2021-09-26 13:07:07 +02:00
ptitSeb 3fda41cbf6 Still more build fix for the untested loogarch64 support 2021-09-26 13:01:08 +02:00
ptitSeb 053d5e9b8d One more build fix for the untested loogarch64 support 2021-09-26 12:50:20 +02:00
ptitSeb 40cb14bf31 And yet another build fixe for the untested loogarch64 support 2021-09-26 12:35:45 +02:00
ptitSeb 27d18e4169 Another build fixe for the untested loogarch64 support 2021-09-26 12:24:47 +02:00
ptitSeb 5403002a36 Some build fixes for the untested loogarch64 support 2021-09-26 12:15:40 +02:00
ptitSeb 22f1a6c5ca CMake have an option for loongarch64 now 2021-09-26 12:09:16 +02:00
ptitSeb 783e9a4b74 More untested support for loongarch64 va_list 2021-09-26 12:06:01 +02:00
ptitSeb 202a067a61 Added some untested support for loongarch64 va_list 2021-09-26 11:46:04 +02:00
ptitSeb f2d1a8bc70 [DYNAREC] Somme fix for 66 83 opcodes 2021-09-26 11:29:45 +02:00
ptitSeb b6bc7922b3 Fixed some elf loading issues (like Torchlight2) 2021-09-23 19:54:52 +02:00
ptitSeb 7e4af27ba7 More work on gtk and nss3+friends 2021-09-21 20:50:52 +02:00
ptitSeb 06bbf93bf8 More work on gtk wrapping 2021-09-20 21:51:15 +02:00
ptitSeb e08bdd644b Added minimum wrapped libsecret-1 2021-09-19 21:29:06 +02:00
ptitSeb 1c5ddfafcd And 2 more wrapped gtk functions 2021-09-19 19:36:54 +02:00
ptitSeb 0f4db4c230 More gtk wrapped functions 2021-09-19 19:00:42 +02:00
ptitSeb 960ce86289 Fixed some nasty copypasta on EmuCall 2021-09-19 19:00:19 +02:00
ptitSeb b2bd3103d8 Fixed va_list conversion for aarch64 2021-09-19 18:59:34 +02:00
ptitSeb 745fd1b702 A bit more log on Interpretor mode 2021-09-19 18:59:01 +02:00
ptitSeb 6df1b65249 Added 1 more gtk function 2021-09-19 16:29:10 +02:00
ptitSeb 510f8d45e8 Added wrapped g_signal_connect_object 2021-09-19 16:24:43 +02:00
ptitSeb c5d328a5da Fixed a bug with some TLS relocation when symbol is in another elf (helps c++ softs, probably other too) 2021-09-19 16:06:24 +02:00
ptitSeb 1430c811cd Added 1 wrapped function to xcbxfixes (for #28) 2021-09-19 13:33:19 +02:00
ptitSeb ec2eadd893 More work on GTK wrapping. Still not ok, but better 2021-09-19 12:36:01 +02:00
ptitSeb 56c272c17a Added some more wrapped functions to xcb, gio2 and gobject2 (for #46) 2021-09-19 09:38:46 +02:00
ptitSeb 6f92db542b Updated wrapped libnns3, libnssutil3 and libsmime3 with more wrapped functions (from box86) 2021-09-18 21:46:00 +02:00
ptitSeb 8531750631 Added wrapped libsndfile (dwarf fortress have sound now, and seems completly playable) 2021-09-18 21:15:35 +02:00
ptitSeb 9414ece323 Added wrapped gtk2 (enough to launch Dwarf Fortress and some simple gtk2 samples) 2021-09-18 21:01:13 +02:00
ptitSeb c64cb5b92b Added 66 0F 38 39/3C opcodes ([DYNAREC] too) (for #81) 2021-09-18 08:49:55 +02:00
ptitSeb 2b1e12dafd Fixed 66 0F 3A 22 opcode for REX.W ([DYNAREC] too) (should help #81) 2021-09-16 20:54:40 +02:00
ptitSeb b4ca2be9e0 Added some libcrypto wrapped functions (for #99) 2021-09-14 21:30:41 +02:00
ptitSeb 203de52d71 Added syscall 120 (for #99) 2021-09-14 21:27:21 +02:00
ptitSeb c48333db44 Added syscall 118 (for #99) 2021-09-13 19:53:44 +02:00
ptitSeb e3552befe9 Try to use mmap first when loading elf file into memory 2021-09-12 18:37:03 +02:00
ptitSeb 6141421f92 [DYNAREC] some fixes to alternate handling and vsyscall support 2021-09-12 13:59:10 +02:00
ptitSeb 911ecc4489 Added minimal wrapped libnsp4, libnss3, libnssutil3 and linsmime3 2021-09-08 20:55:05 +02:00
ptitSeb 63ab450d87 Added 66 0F 7C ocpode (for #111) 2021-09-08 20:54:19 +02:00
ptitSeb bcc29168cd [TRAVIS] Refined the script a little bit 2021-09-08 20:53:50 +02:00
ptitSeb 4a9b0128d7 [TRAVIS] Move travis integration 2021-09-05 13:57:51 +02:00
ptitSeb 6cc56ac5f7 [TRAVIS] Specified focal as distrib to use 2021-09-05 13:42:36 +02:00
ptitSeb f53c967e18 [TRAVIS] Added python3 to travis script 2021-09-05 13:38:13 +02:00
ptitSeb b309933571 [TRAVIS] Small change 2021-09-05 13:29:17 +02:00
ptitSeb c7e8044f92 [TRAVIS] Try some travis build 2021-09-05 13:19:28 +02:00
ptitSeb 29720048e2 Started a new dev. cycle 2021-09-05 13:08:37 +02:00
ptitSeb 716ac9e041 Bumped to v0.1.4 2021-09-05 11:34:21 +02:00
ptitSeb fb835fbe66 Added major contributor list in README 2021-09-05 11:28:12 +02:00
ptitSeb 4aac3444bd Added (empty) wrapped libgssapi.so.3 (for #27) 2021-09-04 14:07:49 +02:00
ptitSeb 0a343b72f2 Added syscall 56 (for #109) 2021-09-04 13:50:22 +02:00
ptitSeb ab9178f638 Fixed 66 0F 3A 40 SSE4x opcode (for #108) 2021-09-04 13:43:16 +02:00
ptitSeb 1b8d952d88 Added 66 0F 3A 40 SSE4x opcode (for #108) 2021-09-04 13:06:16 +02:00
ptitSeb e8e966cd80 Added wrapped iopl that answer 'unsuported operation' for now 2021-09-04 12:19:43 +02:00
ptitSeb 8b80cc328f [DYNAREC] Fixed (agaim) BTR/BTS/BTC with imm8==0 2021-09-04 12:19:08 +02:00
ptitSeb 72986e8ba3 Don't limit mmap on 47bits if wine is not detected 2021-09-04 10:18:16 +02:00
ptitSeb 3df01a153d Added BOX64_NOPULSE info to the README 2021-09-04 09:35:33 +02:00
ptitSeb 5d5ef75337 Add some support vor VSyscall 2021-09-02 20:25:58 +02:00
ptitSeb c3ef6380a7 Added a few atk wrapped function (for #56) 2021-08-31 20:43:08 +02:00
ptitSeb c2782b269f Added 2 pango wrapped function (for #56) 2021-08-31 20:40:55 +02:00
ptitSeb 1cb55b2633 Added 66 0F 3A 22 SSE4.x opcode ([DYNAREC] too) (for #106) 2021-08-30 22:38:38 +02:00
ptitSeb 823c6a138a Added syscall 332 2021-08-30 22:07:51 +02:00
ptitSeb e10a78d671 [DYNAREC] Fixed BTS/BTR/BTC with imm8==0 (helps EWJ SE Win95, probably other too) 2021-08-29 15:12:10 +02:00
ptitSeb 04b9195cd2 Added 66 0F B7 opcode ([DYNAREC] too) 2021-08-29 13:30:04 +02:00
ptitSeb 3aa12a52eb Added AES-NI cpu extension support ([DYNAREC] too, using AES extension if available) 2021-08-28 16:46:59 +02:00
ptitSeb 5f31e0e093 [DYNAREC] Added detection of available CPU Extensions 2021-08-28 15:18:07 +02:00
ptitSeb 39f2b508f8 Added some more atk wrapped functions (for #101) 2021-08-23 23:29:30 +02:00
ptitSeb 5b5285940f Added a atk wrapped function (for #101) 2021-08-23 10:41:22 +02:00
ptitSeb c49da85606 Added 1 x11 wrapped function 2021-08-23 10:41:00 +02:00
ptitSeb 5cc3512a59 Added syscall 257 (for #98) 2021-08-22 21:15:11 +02:00
ptitSeb cbd1d3781b Added many Notes on README about current status of box64 2021-08-22 09:40:56 +02:00
ptitSeb 5bca9b52b3 Moved LICENSE file back to root (for #93) 2021-08-21 17:40:45 +02:00
ptitSeb fd21d6a8da Merge pull request #89 from nniro/main
Added syscall 82 (for #88)
2021-08-13 20:17:28 +02:00
Nicholas Niro c8ebce5732 Added syscall 82 (for #88) 2021-08-13 14:16:01 -04:00
ptitSeb fce5aa5a6b Added disabled wrapped libfuse (not working for now) 2021-08-10 18:37:12 +02:00
ptitSeb 2ac2996abd Added vfork wrapped function 2021-08-10 15:32:08 +02:00
ptitSeb 53fb83487a Added some comment on vDSO 2021-08-10 15:31:52 +02:00
ptitSeb 3597284e8d Some changes on getstacksize for thread 2021-08-10 15:31:11 +02:00
ptitSeb 4e8f387f79 Small changes in libc and libpthread wrapped lib 2021-08-10 12:06:43 +02:00
ptitSeb 305e6326a6 Small fix for Default and Ignore signal handling 2021-08-10 12:05:53 +02:00
ptitSeb e98c7eaa0f Small fix for log on syscall 2021-08-10 12:04:49 +02:00
ptitSeb 02462b2c12 [DYNAREC] Added 65 39 opcode 2021-08-10 12:04:11 +02:00
ptitSeb 4d9559f345 Added handling of longjmp inside signals handler (from box86) 2021-08-09 14:06:38 +02:00
ptitSeb ed63000e23 Fixed syntex in CMakeList.txt project 2021-08-06 10:40:17 +02:00
ptitSeb cc307df592 Try to add generic ARM profile when building with Dynarec (for #82) 2021-08-06 09:12:40 +02:00
ptitSeb 2d321bbd33 Added 4 more libXt wrapped functions 2021-08-03 09:50:10 +02:00
ptitSeb 5b5f7c133e Added setcontext wrapped function 2021-08-03 09:34:34 +02:00
ptitSeb 69484d7f3c Added _IO_init wrapped function 2021-08-03 09:06:20 +02:00
ptitSeb 43f5438d93 Merge pull request #79 from rajdakin/genfixes
Fixes
2021-08-01 20:04:03 +02:00
rajdakin 2b920d6936 Removed the Mapping import 2021-08-01 18:58:21 +02:00
rajdakin 01bf3e741e Forgot to update version number 2021-08-01 17:33:03 +02:00
rajdakin f014d4580a Added a useful script 2021-08-01 17:12:36 +02:00
rajdakin 1f02ab17e3 Fixed SDL2 build, allowing to include structures in function signatures 2021-08-01 17:06:40 +02:00
rajdakin e1d8f1d7e5 Fixed some wrapped functions, upgraded the rebuild_wrapper script [SDL2 DOESN'T WORK, FIX UNDERWAY] 2021-07-31 13:38:22 +02:00
rajdakin c8640caba3 Started adding GOWM macro 2021-07-31 13:36:45 +02:00
rajdakin f4ea86378e Fixed minor issues 2021-07-31 13:36:36 +02:00
ptitSeb 16011f4b34 Fix NOALIGN build 2021-07-31 11:58:03 +02:00
ptitSeb 5a3316b872 Fix for Clang lld in cmake 2021-07-30 15:00:18 +02:00
ptitSeb 9f50a19856 Try to handle Clang (for linker) 2021-07-30 14:42:01 +02:00
ptitSeb 6207b3fa38 Added 64 66 89 and changed 64 66 0F D6 opcodes ([DYNAREC] too) (for #77) 2021-07-30 09:04:21 +02:00
ptitSeb 35d2103189 Added syscall 315 (for #74) 2021-07-28 21:14:17 +02:00
ptitSeb 84626f065c [DYNAREC] Try toavoid segfault when exploring code for a native call building dynablock (for #73) 2021-07-28 16:18:06 +02:00
ptitSeb eaedda8ceb Added 1 libc wrapped function (for #73) 2021-07-28 15:19:32 +02:00
ptitSeb 4e9c25893c Fixed some typo in some new GL wrapped function (for #73) 2021-07-28 15:17:44 +02:00
ptitSeb eb5bebb344 Added a new large batch of wrapped GL extensions (for #73) 2021-07-28 14:06:48 +02:00
ptitSeb 296ee1baca Try to force 47bits on mmap64 all the time (not just when wine64 is detected) 2021-07-28 13:19:32 +02:00
ptitSeb 58b5c6ded9 Handled privilieged instruction (as handled by wine64) as privilegde and generate a SIGSEGV (should help #27 and some other Wine64 games/programs) 2021-07-28 11:13:59 +02:00
ptitSeb ecc07a235c Added wrapped dbus_message_get_args and a generic mothod to convert VAARG '...' to valist (helps wine64) 2021-07-27 15:43:56 +02:00
ptitSeb fc4f0e3bae Added wrapped libkrb5 and libgss_krb5 (for Wiee64) 2021-07-27 13:52:21 +02:00
ptitSeb e00d35f5bf Added 64 F7 opcode ([DYNAREC] too) (for #73) 2021-07-27 13:28:46 +02:00
ptitSeb 790022483b Fixed potential issues in some FF opcodes (for #72) 2021-07-27 10:32:00 +02:00
ptitSeb 100cdd329a Made librarian messages on lib dependancies issue on unload as LOG_DEBUG 2021-07-26 15:03:25 +02:00
ptitSeb 9c441df959 Merge pull request #69 from Jai-JAP/aur
Rename archlinux/ to pkgbuilds/
2021-07-22 14:40:58 +02:00
Jai-JAP a8ae44a881 Rename archlinux/ to pkgbuilds/ 2021-07-22 17:46:32 +05:30
ptitSeb 2f5fe43955 Merge pull request #68 from Jai-JAP/aur
Create pkgbuilds in archlinux/ folder
2021-07-22 14:05:53 +02:00
Jai A P 86820cf1b1 Update archlinux/* 2021-07-22 17:31:00 +05:30
Jai A P e511e1bf96 Update archlinux/* 2021-07-22 17:16:04 +05:30
Jai A P 5fb1c6c497 Create pkgbuilds in archlinux/ folder 2021-07-22 16:10:03 +05:30
ptitSeb 607bb28677 Fixed status of C2 x87 flags after sin, cos, sincos and tan function ([DYNAREC] too) (thank @icecream95 for the debugging on box86) 2021-07-21 13:34:06 +02:00
ptitSeb 36e5fb50ec Added F3 0F BD opcode ([DYNAREC] too) (for #27) 2021-07-19 13:31:11 +02:00
ptitSeb 74405a8b00 Added a couple of wrapped libc function (will help #65 among other) 2021-07-19 08:15:21 +02:00
ptitSeb 4b1ecc16ff Added a few more lzma wrapped functions 2021-07-18 17:06:54 +02:00
ptitSeb 139d5128a0 Made IRETQ to restore RSP and SS ([DYNAREC] too) (helps Wine64 exceptions handling) 2021-07-17 18:03:23 +02:00
ptitSeb 7b8bd8a285 Less log for generated signals 2021-07-17 18:02:34 +02:00
ptitSeb 445d232ee7 Added the macro, for later use (maybe) 2021-07-17 18:01:59 +02:00
ptitSeb 8ad472c118 don't try to restore pointer in my___libc_start_main if quit is true for current emu struct 2021-07-17 18:01:24 +02:00
ptitSeb fd6895782f [DYNAREC] Try to avoid segfault when discovering natuve function durring building of dynablock 2021-07-17 18:00:10 +02:00
ptitSeb abdd03cdfa [DYNAREC] Added 8F opcode and improved 8C one 2021-07-17 17:59:13 +02:00
ptitSeb ba3359353f Added 66 8C opcode (for #61) 2021-07-16 16:28:35 +02:00
ptitSeb ca473b06dc [DYNAREC] Fixed a potential deadlock (for #64, thx again) 2021-07-16 15:38:40 +02:00
ptitSeb 2ee0230793 Added syscall 12 (for #45) 2021-07-15 11:09:04 +02:00
ptitSeb 35119f8db2 Handling HLT / CLI / STI has privileged instruction (and so trigger a GPF) 2021-07-15 11:03:06 +02:00
ptitSeb c95af7c81b [DYNAREC] Don't limit the retry pattern on access error signal, as it often happens when creating new bridges (might help #57) 2021-07-15 09:25:01 +02:00
ptitSeb a9aa474884 Added 1 wrapped function to libX11 (for #56) 2021-07-14 15:16:17 +02:00
ptitSeb 259fe4a238 [DYNAREC] Fixed P flag computation for Test32 emiter (help #34) 2021-07-14 13:30:26 +02:00
ptitSeb f73bbfc0af Fixed regression introduced with 27d79eddec (for #54) 2021-07-14 11:05:21 +02:00
ptitSeb e7478f3390 Make library loaded with absolute path not wrapped (unless BOX64_PREFER_WRAPPED=1 is used) 2021-07-14 10:41:27 +02:00
ptitSeb 9be89e8ba2 Try to make the 32bits mmap more resiliant 2021-07-14 10:40:09 +02:00
ptitSeb 5287e42b02 Added some xml2 wrapped functions (for #44) 2021-07-13 19:12:13 +02:00
ptitSeb e0a7f775c9 Added some posix_* wrapped functions (for #44) 2021-07-13 19:01:05 +02:00
ptitSeb f1d238b78d Added wrapped libmpg123 (for #53) 2021-07-13 18:40:15 +02:00
ptitSeb 41ebdc7604 Added 1 more wrapped function and fixed signature of 2 other 2021-07-13 17:42:43 +02:00
ptitSeb e3fde0807f Added 1 wrapped libc function 2021-07-13 17:36:08 +02:00
ptitSeb 4007ff2610 More wrapped functions (for #44) 2021-07-13 16:47:27 +02:00
ptitSeb 27d79eddec Fixed and improved handling of segments and Call Far and signal (helps Wine64) 2021-07-13 15:45:36 +02:00
ptitSeb 0e5bc91a14 Added a couple of libc wrapped functions 2021-07-13 15:44:37 +02:00
ptitSeb c715141bf0 Added a few more libc wrapped functions (for #41) 2021-07-13 07:49:22 +02:00
ptitSeb 3d656b5008 Fixed ELF Signature detection 2021-07-12 22:17:50 +02:00
ptitSeb d84afba7c8 Added 2 more libc wrapped function (for #44) 2021-07-12 14:33:45 -05:00
ptitSeb 7559df965b Fix memory issue when launching box86 from box64 main 2021-07-12 14:28:15 -05:00
ptitSeb 10702c160a Added more libc wrapped function (for #44) 2021-07-12 14:08:56 -05:00
ptitSeb a66bb7453b Use box86 to launch x86 binary (if box86 is present in same folder as box64) 2021-07-12 13:43:00 -05:00
ptitSeb 5406a040fb Name Trace build as box64 (remove the trailing t) 2021-07-12 11:42:53 -05:00
ptitSeb 77421d2eed Added a bunch of wrapped libc function (for #41) 2021-07-12 10:52:21 -05:00
ptitSeb 78b9b0cec8 [DYNAREC] Fixed shrd/shld emiter when both regs are the same (for #33) 2021-07-12 10:35:04 -05:00
ptitSeb 16a3d46193 Added 1 wrapped libc function (for #44) 2021-07-12 09:47:46 -05:00
ptitSeb 2976bf5e6a Added some more libc wrapped functions 2021-07-12 14:27:12 +02:00
ptitSeb b370540447 Remove useless Error message on data_start not found 2021-07-12 13:46:13 +02:00
ptitSeb 6d7c0f75e7 Handling of flag RTLD_NOW in dlopen 2021-07-12 13:41:05 +02:00
ptitSeb 81a7eca5ef Merge pull request #49 from Jai-JAP/docs
Moved documentation to "docs/" folder
2021-07-12 07:37:59 +02:00
Jai-JAP 2711a7e522 Moved documentation to "docs/" folder. 2021-07-12 10:53:50 +05:30
Jai-JAP cc8f926d66 Moved documentation to "docs/" folder. 2021-07-12 10:52:59 +05:30
ptitSeb 486aa58b15 Added 66 0F 3A 0A opcode (for #33) 2021-07-11 21:58:59 +02:00
ptitSeb 8711693698 Added 66 0F 3A 20 opcode (for #33) 2021-07-11 20:46:17 +02:00
ptitSeb e6f615a1f8 Added 66 0F 38 14 opcode (for #33) 2021-07-11 20:06:36 +02:00
ptitSeb 813ed6f9a1 Fixed 66 0F 3A 0E opcode (for #33) 2021-07-11 18:21:38 +02:00
ptitSeb 85dba348a7 Added 66 0F 38 0E opcode (for #33) 2021-07-11 17:28:57 +02:00
ptitSeb a7422d11ed Splitted mmx and x87 register (from box86) 2021-07-11 17:22:27 +02:00
ptitSeb b39fbc0cfd [DYNAREC] Stop building block if protection of next byte is 0 without the Custom flags 2021-07-10 18:28:18 +02:00
ptitSeb f000951fc9 Fixed some issue with memory protection tracking 2021-07-10 17:42:20 +02:00
ptitSeb edeac868d0 (Re?)add 66 0F 38 17 opcode 2021-07-10 17:41:53 +02:00
ptitSeb a618dee15c Refined .deb build script with arch naming and postinst 2021-07-10 10:01:49 +02:00
ptitSeb 8b48773176 Added 67 E8 opcode ([DYNAREC] too) (for #45) 2021-07-10 08:13:45 +02:00
ptitSeb 9a17d9a35e Added memmem wrapped function (for #33) 2021-07-10 08:07:44 +02:00
ptitSeb a2ca22972c Added C2 opcode (for #44) 2021-07-09 23:57:16 +02:00
ptitSeb b05c449dd0 Added F3 0F B8 opcode (for #33) 2021-07-09 21:31:50 +02:00
ptitSeb bdb918c9c2 Added 66 90-97 opcodes ([DYNAREC] too) (for #44) 2021-07-09 21:23:08 +02:00
ptitSeb 7ae9dca562 [DYNAREC] Fixed emiter for shr32c, sar32c and shrd32c (for #44) 2021-07-09 21:06:36 +02:00
ptitSeb 005e3ddf7d Added 66 0F 3A 17 opcode (for #33) 2021-07-09 20:31:09 +02:00
ptitSeb c5fbc5efd3 Improved log when encountering SIGILL (to help diagnose #44) 2021-07-09 18:25:04 +02:00
ptitSeb 4b06a0126e Added dummy 36 prefix ([DYNAREC] too) (for #44) 2021-07-09 18:09:03 +02:00
ptitSeb f8ef852b46 Added 66 0F C8..CF opcodes ([DYNAREC] too) 2021-07-09 17:32:13 +02:00
ptitSeb 741b03761a Added 66 0F 3A 21 opcode (for #33) 2021-07-09 17:21:30 +02:00
ptitSeb 8ccde3ed4a Added 66 0F BA opcodes (for #44) 2021-07-09 17:08:50 +02:00
ptitSeb b6ce8efa20 Removed an out-of-place comment 2021-07-09 17:07:56 +02:00
ptitSeb 2bf49e8a11 [DYNAREC] Fixed 66 REX.W opcodes 2021-07-09 17:01:00 +02:00
ptitSeb 0cfb48f3c7 Added msgstl wrapped function (for #43) 2021-07-09 16:58:52 +02:00
ptitSeb fcd9eba0da Added one cups wrapped functions (for #42) 2021-07-09 15:32:03 +02:00
ptitSeb 6d7e729563 Added some atk wrapped functions (for #42) 2021-07-09 15:29:22 +02:00
ptitSeb 102744665c Added some cairo functions (for #42) 2021-07-09 15:26:49 +02:00
ptitSeb dd885a694e Added a couple more libc function (for #37) 2021-07-09 14:28:41 +02:00
ptitSeb ecf8ffbbdc First try at building .deb package using cmake CPack 2021-07-09 14:26:29 +02:00
ptitSeb c1e67c31bc Added F0 0F BA opcodes (for #21) 2021-07-09 11:48:57 +02:00
ptitSeb 6eccdc1baf Added handling of flag 0x4 for wrapped dlopen 2021-07-09 11:27:17 +02:00
ptitSeb 7aa7ef6baf Added wrapped euidaccess and eaccess functions to libc (for #21) 2021-07-09 09:02:20 +02:00
ptitSeb 66ed68ca48 Added a large batch of wrapped libGL functions, including full 4.5 set (for #21) 2021-07-09 00:16:52 +02:00
ptitSeb d20d007933 Added wrapped getrandom function to libc 2021-07-08 19:27:15 +02:00
ptitSeb a91d2d0841 Added a few more wrapped libGL functions (for #21) 2021-07-08 19:12:06 +02:00
ptitSeb 649b7772f1 Fixed BOX64_JITGDB=2 that wasn't working 2021-07-08 14:48:20 +02:00
ptitSeb fe6304b7cd [DYNAREC] Added 66 0F D2 opcodes (for geekbench5) 2021-07-08 12:43:44 +02:00
ptitSeb e9b6f3559b [DYNAREC] Added 66 0F EE opcodes (for geekbench5) 2021-07-08 12:14:04 +02:00
ptitSeb 53b2578b8e [DYNAREC] Added 64 FF opcodes (for geekbench5) 2021-07-08 12:00:48 +02:00
ptitSeb 9507601ee6 Added 64 0F B6 ocpode (for #28) 2021-07-08 10:07:54 +02:00
ptitSeb 52e4edd147 Added dummy version of __cxa_thread_atexit_impl (for #28) 2021-07-08 10:05:26 +02:00
ptitSeb acc3ed85cb Added wrapped curl_multi_wait (for #21) 2021-07-08 09:50:36 +02:00
ptitSeb dbbda60d9e Added option 20219 to crul wrapped lib (for #21) 2021-07-08 09:48:15 +02:00
ptitSeb 401071c40a [DYNAREC] Better handling of SHL/SHR/SAR Eb, 0 (for obfuscated code) 2021-07-07 23:10:40 +02:00
ptitSeb 928eb2a32b Added dummy 0F 09 opcode ([DYNAREC] too) (for #34) 2021-07-07 17:26:27 +02:00
ptitSeb 1c0b1721cd Added F4 opcode (for #34) 2021-07-07 17:06:33 +02:00
ptitSeb 15a7d0b9b5 Added a few more libc and libX11 wraped functions 2021-07-07 13:55:31 +02:00
ptitSeb 6670e924bf Added 66 0F B1 opcode 2021-07-07 13:54:49 +02:00
ptitSeb 5b5b974341 Added syscall 434 (for #21) 2021-07-07 08:42:18 +02:00
ptitSeb ad85b7c4c6 Added msgget wrapped function to libc (for #37) 2021-07-07 08:29:20 +02:00
ptitSeb a5490dc6f2 Merge pull request #36 from Azkali/main
Update comment for binfmt conf
2021-07-07 00:02:32 +02:00
ptitSeb 5c52fa6007 [DYNAREC] Fixed FISTP i64 (help #14) 2021-07-07 00:00:21 +02:00
ptitSeb f8ecf14763 [DYNAREC] Added Need optim message to FINIT 2021-07-07 00:00:01 +02:00
The Great Wizard Azkali d2f7e15fcd Update comment for binfmt conf 2021-07-06 22:51:28 +02:00
ptitSeb 66ac772585 Merge pull request #35 from Azkali/main
Fix missing CONFIG_64BIT kernel for older kernel
2021-07-06 22:43:33 +02:00
The Great Wizard Azkali dd365e0b14 Fix missing CONFIG_64BIT kernel for older kernel
On older kernel < 5.X sigcontext.h defines this flag `#ifdef CONFIG_64BIT` which prevents building on some platforms.
2021-07-06 22:35:21 +02:00
ptitSeb d612656978 Added syscall 6 and fixed syscall 5 (for #14) 2021-07-06 22:24:52 +02:00
ptitSeb 91787c4dbf Try to fix compilation on old libc 2021-07-06 18:31:55 +02:00
ptitSeb c534a9d78c Fixed some case of crash with emulated RW in SDL1 (helps #14) 2021-07-06 17:52:07 +02:00
ptitSeb 06053027a9 Added syscall 35 (for #14) 2021-07-06 17:37:11 +02:00
ptitSeb 9291d15215 Fixed some return values from many syscalls (should help #14) 2021-07-06 17:31:34 +02:00
ptitSeb d07036b8ec Added 0F D7 opcode ([DYNAREC] too) (for #32) 2021-07-06 16:37:02 +02:00
ptitSeb cb73eaf776 Work on CMPSS and CMPSD ([DYNAREC] too) 2021-07-06 14:23:57 +02:00
ptitSeb bb38d8d1ca [DYNAREC] Added 66 0F 50 opcode, and changed a bit 66 0F D7 (for CB15) 2021-07-06 09:44:07 +02:00
ptitSeb cc269337f2 [DYNAREC] Added F3 0F 53 opcode (for CB15) 2021-07-06 09:29:58 +02:00
ptitSeb a2aa5fc650 Added 66 0F 38 08/09/0A opcodes ([DYNAREC] too) (for #32 / Zoom) 2021-07-05 23:01:09 +02:00
ptitSeb 26d4f21fa7 [DYNAREC] Added 66 0F 5E opcode (for CB15) 2021-07-05 22:37:04 +02:00
ptitSeb 7f390a5499 [DYNAREC] Added F0 09 opcode (for CB15) 2021-07-05 22:28:19 +02:00
ptitSeb b9f38bcefd [DYNAREC] Added 66 0F C2 opcode (for CB15) 2021-07-05 22:18:23 +02:00
ptitSeb 81b1f61aec Added 66 0F 38 1C/1D/1E opcodes ([DYNAREC] too) (for #17 / Zoom) 2021-07-05 22:05:54 +02:00
ptitSeb ab83d86300 Added F0 80 opcode ([DYNAREC] too) 2021-07-05 21:58:11 +02:00
ptitSeb 450cad7a4d Fixed R_X86_64_TPOFF64 reloc on local elf (should help #31) 2021-07-05 21:00:38 +02:00
ptitSeb c1ee744205 [DYNAREC] Added 66 0F D7 opcode (for CB15) 2021-07-05 20:49:15 +02:00
ptitSeb f21afb3277 [DYNAREC] Added a faked 0F 01 opcode to avoid break of dynarec block 2021-07-05 20:48:51 +02:00
ptitSeb 7948a25945 Added FT_Property_Get wrapped function (for #17, #30) 2021-07-05 17:56:48 +02:00
ptitSeb 7711131d5c [DYNAREC] Added 8C opcode 2021-07-05 17:38:00 +02:00
ptitSeb c6119efb04 [DYNAREC] Added 0F 05 opcode (for Wine64 and probbly a few others) 2021-07-05 17:24:24 +02:00
ptitSeb d0dee6cb50 [DYNAREC] Added DC opcodes (for CB15) 2021-07-05 17:13:30 +02:00
ptitSeb e3bbfe3052 Added more xkbcommon wrapped functions (for #29) 2021-07-05 16:24:31 +02:00
ptitSeb 85a460afb7 Forgot this file from previous commit 2021-07-05 16:21:14 +02:00
ptitSeb 28a2dba9f7 Added F2 0F D0 opcode ([DYNAREC] too) 2021-07-05 16:17:17 +02:00
ptitSeb 4e7f86979d Added syscall 8 (for #14) 2021-07-05 15:15:28 +02:00
ptitSeb 303390bf00 Added more xkcbcommon wrapped functions (for #29) 2021-07-05 15:14:17 +02:00
ptitSeb 623e81a422 Added syscall 73 (for #14) 2021-07-05 15:00:37 +02:00
ptitSeb 13e574db3f Added syscalls 42 and 43 (for #14) 2021-07-05 14:16:53 +02:00
ptitSeb 7bd4aae433 Added syscall 45 2021-07-05 13:56:08 +02:00
ptitSeb 69382682c4 Added minimum wrapped libxcb-glx (for #17) 2021-07-05 13:54:05 +02:00
ptitSeb 7535b4ac61 Small update COMPILE.md 2021-07-05 13:40:50 +02:00
ptitSeb 3bab7d6c53 Fix non-dynarec build 2021-07-05 13:35:05 +02:00
ptitSeb a8a45aede3 Try to speedup a bit FindR64COPYRel 2021-07-05 11:55:10 +02:00
ptitSeb 28c6d72110 Added a few more wrapped function xkbcommon (for #17) 2021-07-05 11:36:13 +02:00
ptitSeb c3cd14f3c5 Removed mutex per bridge and use a global one (remove chance of freeze on fork) 2021-07-05 11:35:27 +02:00
ptitSeb 2010f8dcce Added 64 FF ocpodes (for #20) 2021-07-05 10:29:38 +02:00
ptitSeb abcb12f9ed Added 0F C3 opcode ([DYNAREC] too) (for #20) 2021-07-05 10:25:09 +02:00
ptitSeb 283a4dda20 Small optim on interpreted 0F 10/11 opcodes 2021-07-05 10:17:16 +02:00
ptitSeb 3355f39e9f Added syscalls 203 and 204 (for #27) 2021-07-05 08:50:10 +02:00
ptitSeb a4cd4c0745 Added a couple of libc wrapped symbol (for #21) 2021-07-05 08:47:20 +02:00
ptitSeb 3834546100 Added fallback for SDL_GetJoystickGUIDInfo wrapped function if not in native lib (for #18) 2021-07-05 08:43:09 +02:00
ptitSeb a3d7f9cd85 Added syscall 44 (for #14) 2021-07-05 08:15:22 +02:00
ptitSeb 10247fcf85 Merge pull request #19 from Jai-JAP/patch-1
Fix broken link and a typo in Readme.md
2021-07-04 23:27:35 +02:00
ptitSeb b1183e55fd Added a few more xcb wrapped functions (for #17) 2021-07-04 23:26:57 +02:00
ptitSeb b6c9377551 Always more libc wrapped functions (for #17) 2021-07-04 23:18:28 +02:00
ptitSeb c9a4b94efe Added 1 more freetype wrapped functions (for #17) 2021-07-04 23:11:15 +02:00
ptitSeb 04658cafcc Added more libc wrapped functions (for #17) 2021-07-04 23:08:30 +02:00
ptitSeb 27b3a3f33c Improved TLS handling (for #17, but probably help many other programs) 2021-07-04 22:58:06 +02:00
ptitSeb d60a0ef58d Added syscall 41 (for #14) 2021-07-04 15:43:38 +02:00
ptitSeb fff2effd5b Added pcre_free wrapped symbol (still for #17) 2021-07-04 14:44:04 +02:00
ptitSeb bb7e473e7b End a few more libc wrapped functions 2021-07-04 14:43:36 +02:00
Jai-JAP 908641a414 Update README.md 2021-07-04 16:42:56 +05:30
Jai-JAP 69bd28cc65 Update README.md
Fix broken link and a typo
2021-07-04 16:25:40 +05:30
ptitSeb 0126a0d575 Added a couple of wrapped functions to libdbus (for #17) 2021-07-04 11:11:30 +02:00
ptitSeb 6cee821138 Added syscall 319 (for #17) 2021-07-04 11:07:17 +02:00
ptitSeb bbed3403e8 Added wrapped libxkbcommon (for #17) 2021-07-04 11:04:53 +02:00
ptitSeb 9a0824af69 Added wrapped libxkbcommon-x11 (for #17) 2021-07-04 10:48:39 +02:00
ptitSeb 53375ca728 Redirected libc wrapped function mcount to _mcount as it may not exist 2021-07-04 10:39:27 +02:00
ptitSeb f0503b67eb Fixed a typo in libpcre (for #17) 2021-07-04 10:37:08 +02:00
ptitSeb 9c0daf0ed5 Added wrapped libxcb-test (for #17) 2021-07-04 10:34:02 +02:00
ptitSeb 796e6d3a87 Added wrapped libxcb-keysyms (for #17) 2021-07-04 10:30:17 +02:00
ptitSeb 6112505757 Added wrapped libxcb-image (for #17) 2021-07-04 10:27:48 +02:00
ptitSeb 9b547c7884 Added wrapped libxcb-randr (for #17) 2021-07-04 10:19:35 +02:00
ptitSeb 1687c48c1b Added wrapped libxcb-shm (for #17) 2021-07-04 10:15:42 +02:00
ptitSeb f5981c4dca Added wrapped libxcb-shape (for #17) 2021-07-04 10:09:17 +02:00
ptitSeb 6f183aa1cc Added wrapped libxcb-xfixes (for #17) 2021-07-04 10:05:05 +02:00
ptitSeb 56f6ad84bb Added wrapped libpcre.so.3 (for #17) 2021-07-04 09:58:02 +02:00
ptitSeb ed9a29b25f Added a few wrapped function to libc 2021-07-04 09:30:11 +02:00
ptitSeb 20ba6261b6 Added syscall 79 (for #14) 2021-07-04 09:16:33 +02:00
ptitSeb 905b27f216 Added some more SDL2 GameController wrapped functions (for #18) 2021-07-04 09:05:16 +02:00
ptitSeb c218631c56 Merge pull request #16 from Heasterian/main
New Tegra X1 compilation target
2021-07-04 08:52:54 +02:00
ptitSeb bd600a6135 Started a new dev. cycle 2021-07-04 08:52:16 +02:00
Heasterian 67c80f683e One more extension for Tegra T1 2021-07-03 23:26:17 +03:00
Heasterian 1fb65cbce2 Fix minor misspelling 2021-07-03 22:29:27 +03:00
Heasterian 7aa5705400 Addtional Tegra X1 target 2021-07-03 22:26:29 +03:00
Heasterian bd21214467 New TegraX1 target 2021-07-03 22:17:32 +03:00
ptitSeb de8b4da6b5 Create FUNDING.yml 2021-07-03 14:46:14 +02:00
ptitSeb 9243ea4ca1 Bumped to v0.1.2 2021-07-03 14:42:17 +02:00
ptitSeb 2e871fc68a Added another name for wine64 2021-07-03 11:10:24 +02:00
ptitSeb 30eb08f8af More README updates 2021-07-03 11:05:49 +02:00
ptitSeb 7f51495877 Improved README 2021-07-03 10:49:59 +02:00
ptitSeb 112bc0d83f More libc wrapped functions 2021-07-03 10:32:48 +02:00
ptitSeb 501a4a8956 Made elf LOADADDR default again 2021-07-03 10:32:34 +02:00
ptitSeb bb4c06f107 More the LOADADDR of the box64 elf a 32bits value 2021-07-03 09:46:48 +02:00
ptitSeb 65fae1077f One more wrapped libc function 2021-07-03 09:46:28 +02:00
ptitSeb e3a36591aa Added even more libc wrapped functions (needed by Wine) 2021-07-02 22:23:31 +02:00
ptitSeb a597f6701f Added a couple of libc wrapped functions 2021-07-02 17:33:23 +02:00
ptitSeb 3b19a7fe1d Added 64 D1/D3 opcodes ([DYNAREC] too) 2021-07-02 17:30:52 +02:00
ptitSeb ccf9775658 Added some more libc wrapped functions 2021-07-02 16:40:41 +02:00
ptitSeb 762a499648 Fixed a typo 2021-07-02 16:34:24 +02:00
ptitSeb aa56188e7e Set default to NOLOADADDR, as many system doesn't like it 2021-07-02 16:05:41 +02:00
ptitSeb 1d92e65fcc Updated docs 2021-07-02 15:47:45 +02:00
ptitSeb a6f132f6da Added 64 0F AF opcode ([DYNAREC] Too) 2021-07-02 15:41:10 +02:00
ptitSeb cb75b670b6 Fixed nextFree memory search function (fixing regression with RaceTheSun and probably a few other) 2021-07-02 15:03:43 +02:00
ptitSeb 7bb9dd18da [DYNAREC] Improved the fast native call path 2021-07-02 14:37:09 +02:00
ptitSeb 140254f311 [DYNAREC] Fixed DIV opcode, and added test17 about div/idiv 2021-07-02 10:17:28 +02:00
ptitSeb 56401f6675 Improved low memory pre-allocation and added 47bits pre-allocation for Wine64 2021-07-01 17:09:03 +02:00
ptitSeb 99ba7707f6 [DYNAREC] Added CF opcode and optimized native call 2021-06-28 13:19:56 +02:00
ptitSeb ea1ef4e602 [DYNAREC] Added 66 98 CBW opcode 2021-06-28 10:53:46 +02:00
ptitSeb 78b6113d8b Start of a new dev. cycle 2021-06-27 12:28:12 +02:00
ptitSeb 59ab48b99e Bumped to v0.1.0 2021-06-27 10:20:11 +02:00
ptitSeb a7a58b920f Added 8C opcode 2021-06-25 13:49:29 +02:00
ptitSeb 1c26df2a90 Added getauxval wrapped function 2021-06-25 11:15:42 +02:00
ptitSeb c60e4839eb More improvments to elfloader 2021-06-23 11:11:29 +02:00
ptitSeb b626fc5095 Fixed a signature of a funciton from libXi 2021-06-23 11:11:00 +02:00
ptitSeb bcd504eb05 Various change to try improve stability on JIT'd program (like mono for Terraria, with moderate success) 2021-06-21 10:49:42 +02:00
ptitSeb 7057b7f929 More logs on 'strange' SIGSEGV... 2021-06-21 10:48:54 +02:00
ptitSeb 6af070e25f [DYNAREC] Added 67 0F 2E/2F opcodes 2021-06-21 10:47:40 +02:00
ptitSeb af1a7bd6f4 Fixed 67 F2/F3 0F 2E/2F not handled for now 2021-06-21 10:46:55 +02:00
ptitSeb dfd3d0ec93 [DYNAREC] Try to free dynablocks when no longer used 2021-06-19 11:15:53 +02:00
ptitSeb 1791c0937a Improved mutex handling 2021-06-19 11:15:20 +02:00
ptitSeb c2dd6a0c6a Small fixes to the my_backtrace (it doesn't seems to be working anyway) 2021-06-18 18:34:49 +02:00
ptitSeb f300e76c9b [DYNAREC] Optimized some flags handling for a few of the complex emiter (+10% speed in 7z bench) 2021-06-18 13:17:37 +02:00
ptitSeb 8f6f880b6a [DYNAREC] Small optim on shl/shr 16bits, and marked all opcode that need optimization in dynarec dumps 2021-06-18 12:09:05 +02:00
ptitSeb 3dcef655c3 [DYNAREC] Optimized DIV/IDIV 32/64bits opcodes 2021-06-18 11:22:57 +02:00
ptitSeb 4c476de74b Optimized memory protection tracking 2021-06-17 17:31:47 +02:00
ptitSeb c9e277aee5 Added a few more libc wrapped functions 2021-06-16 17:26:01 +02:00
ptitSeb 689d6906ef Fixed a warning 2021-06-16 17:25:35 +02:00
ptitSeb 1712afdae9 Improved emulated library loader, to not stop at first binary found even if not at the correct architecture 2021-06-16 15:19:13 +02:00
ptitSeb 8428fafd3a Added some hack to try detect SDL_sound custom build for SDL2 and use emulated one first (fixing some sound in To The Moon) 2021-06-16 15:03:08 +02:00
ptitSeb 3074846477 Fixed SDL_HasIntersection signature (fixing To The Moon blank screen) 2021-06-16 15:02:21 +02:00
ptitSeb 6c1825ba65 Small fix for sdl2rwops emulated close 2021-06-16 15:01:49 +02:00
ptitSeb bef0a5f793 Better trace for lseek functions 2021-06-16 15:01:12 +02:00
ptitSeb 8e694eac57 Some more wrapped functions to libc, and both libudev 2021-06-15 17:15:01 +02:00
ptitSeb 8622f9fdc3 Improved dlsym a bit 2021-06-15 17:14:37 +02:00
ptitSeb 6e6a8f47af Added some speicifc workaround for libcef (staticaly linked with tcmalloc) 2021-06-15 17:14:09 +02:00
ptitSeb 7a57c70d81 Improved cpu capability flags, and silenced a warning in of_unconvert 2021-06-15 17:13:26 +02:00
ptitSeb b2a1af1029 Fixed a crash with some glibc wrapped /not-yet wrapped libs 2021-06-15 17:12:35 +02:00
ptitSeb c44961c063 Improved Log for emit_signal 2021-06-15 17:11:28 +02:00
ptitSeb aceb234c2e Improved steam detection and added steam-runtime-check-requirements workaround 2021-06-15 17:10:54 +02:00
ptitSeb dd6b60818c Added syscall 20 2021-06-15 17:10:18 +02:00
ptitSeb 1978b16581 Improved and fixed Trace for some functions 2021-06-15 17:10:02 +02:00
ptitSeb 0d079b8c0b [DYNAREC] Improved UD2 handling 2021-06-15 17:09:30 +02:00
ptitSeb 913029f4c5 Small work around pthread_once 2021-06-15 17:08:52 +02:00
ptitSeb c667c71a99 Added libtcmallocminimal workaround 2021-06-15 17:08:14 +02:00
ptitSeb 3cd8b9a44e [DYNAREC] Added 66 0F F7 opcode 2021-06-14 18:26:34 +02:00
ptitSeb 126119b1fb [DYNAREC] Added shrd32c emiter and 0F AC opcode 2021-06-14 17:31:01 +02:00
ptitSeb 701bf913e8 [DYNAREC] Added message Need Optim on SH(L/R)D Ed, Gd, CL opcode 2021-06-14 17:10:50 +02:00
ptitSeb 00b5944271 [DYNAREC] Added shld32c emiter and 0F A4 opcode 2021-06-14 17:07:19 +02:00
ptitSeb 196076f952 [DYNAREC] Added 0F 2B opcode 2021-06-14 16:06:11 +02:00
ptitSeb e350224157 Added wrapped execl function 2021-06-14 16:05:45 +02:00
ptitSeb 730e129a80 Change the way locked mutex are detected (taken from box86) 2021-06-14 14:53:20 +02:00
ptitSeb 883fc1681d Added 66 0F 3A 0B opcode ([DYNAREC] too) 2021-06-14 12:19:21 +02:00
ptitSeb 6b2b672c5e Don't launch gdb if Trace is redirected to a file (avoid empty trace when mono stuff crashes) 2021-06-14 12:18:41 +02:00
ptitSeb 1d31bf699f Added 66 0F 38 20..25 SSE4 opcodes ([DYNAREC] too) 2021-06-14 11:09:10 +02:00
ptitSeb c62728f44f [DYNAREC] Fix special case of PSHUFD on memory with Ib=0 (fixed the Blankscreen issue with Unity3D games) 2021-06-13 14:21:47 +02:00
ptitSeb 90efb1ff31 [DYNAREC] Small optim for PSHUFW opcode 2021-06-13 14:20:52 +02:00
ptitSeb 7625cc7ceb [DYNAREC] Small optim on PSUHFD opcode 2021-06-13 12:32:12 +02:00
ptitSeb a074115bf5 Fixed issue with LOCK REX.W XADD opcode 2021-06-13 12:31:20 +02:00
ptitSeb c3aa068179 [DYNAREC] Fixed a few opcodes: BTR/BTC/BTS 16bits, CVTTPD2DQ and PSHUF(L/H)W 2021-06-12 23:46:06 +02:00
ptitSeb e07be95646 [DYNAREC] Fixed CC flag for SAR 2021-06-12 22:31:56 +02:00
ptitSeb 0777a568d7 [DYNAREC] Fixed FIS(TT)(P) opcodes 2021-06-12 21:50:31 +02:00
ptitSeb f6ce622841 [DYNAREC] Improved flag handling 2021-06-12 20:41:34 +02:00
ptitSeb 508545aa87 Added suport for arch_prctl syscall, and GL segment handling ([DYNAREC] too) 2021-06-07 20:06:02 +02:00
ptitSeb 52d86177c5 Added wrapped execv family functions 2021-06-07 18:36:25 +02:00
ptitSeb 979d1cfba9 [DYNAREC] Fixed a warning 2021-06-07 18:35:54 +02:00
ptitSeb 31a01aceab Small adjustment to tls record 2021-06-07 18:07:02 +02:00
ptitSeb 3b39d1270d [DYNAREC] Added 66 F0 81/83 opcodes 2021-06-07 10:08:46 +02:00
ptitSeb d5b286c050 Added 66 F0 81 opcodes 2021-06-07 10:08:06 +02:00
ptitSeb 1f23848e25 [DYNAREC] Small optimisation on handling of relative addressing 2021-06-06 20:34:02 +02:00
ptitSeb db1c033c7c Cosmetic change 2021-06-06 20:33:29 +02:00
ptitSeb 489afcfb41 Added a test for ucomiss opcode 2021-06-06 20:32:55 +02:00
ptitSeb 5519ddad0b [DYNAREC] Fixed end handling in dynablock construction 2021-06-06 17:25:20 +02:00
ptitSeb e788589944 [DYNAREC] Small fix to a printer 2021-06-06 17:24:39 +02:00
ptitSeb 7a894540b9 [DYNAREC] Fixed potential issue with longjmp native function call 2021-06-06 13:26:58 +02:00
ptitSeb 30f0f3a5a1 Small fixes to interpretor 2021-06-06 11:27:49 +02:00
ptitSeb debc7284b3 Fixed regression on pthread_mutex_t 2021-06-06 09:55:14 +02:00
ptitSeb 60f5dfabd8 Added wrapeed times function to libc 2021-06-06 09:26:41 +02:00
ptitSeb dd2f209096 Improvment to a few libc wrapped functions 2021-06-06 08:31:46 +02:00
ptitSeb 3b181576c8 Added a wrapped pthread function, and improved mutex handling 2021-06-06 08:30:57 +02:00
ptitSeb 409334ea56 Some small improvments in signal handling 2021-06-06 08:29:32 +02:00
ptitSeb 71218a6f70 Added some more syscalls 2021-06-06 08:28:30 +02:00
ptitSeb a5be3727e9 Better handling of on-purpose SIGSEGV 2021-06-05 17:51:28 +02:00
ptitSeb 836b646e24 Better trace for ftok and getcwd functions 2021-06-05 17:49:51 +02:00
ptitSeb 15e4830dff Added a few more libc wrapped functions 2021-06-05 15:10:53 +02:00
ptitSeb ac1156d165 Added syscall 228 2021-06-05 15:10:39 +02:00
ptitSeb 370ec24987 Added setpgid wrapped function 2021-06-05 15:07:00 +02:00
ptitSeb 3bdcae10c8 Added a few more wrapped function and improved getopt handling 2021-06-05 15:03:37 +02:00
ptitSeb 681df1604d Fixed python wrapper builder 2021-06-05 14:27:31 +02:00
ptitSeb 05abd88ea5 [DYNAREC] Various small fixes to flags handling 2021-06-05 10:23:38 +02:00
ptitSeb 42670c0130 Fixed BT/BTC/BTR/BTS opcodes ([DYNAREC] too) 2021-06-05 10:23:38 +02:00
ptitSeb f4c15979db Merge pull request #13 from rajdakin/useGenerated
Fixed some wrapped functions, upgraded the python script
2021-06-04 23:22:51 +02:00
rajdakin 8d97f13677 Fixed some wrapped functions, upgraded the python script 2021-06-04 23:01:56 +02:00
ptitSeb 75c4c3d6b9 Fixed SDL_JoystickGetGUIDString function signature 2021-06-04 16:55:40 +02:00
ptitSeb a71e81c842 [DYNAREC] Fixed DD C0..C7 FFREE opcode 2021-06-04 16:55:30 +02:00
ptitSeb add55f3cec Added an option to use stderr for logs 2021-06-04 16:54:50 +02:00
ptitSeb c6f6a9ef72 Improved unloading of libs 2021-06-04 11:05:40 +02:00
ptitSeb 1c1e39ef64 [DYNAREC] Improved SMC handling 2021-06-04 10:56:16 +02:00
ptitSeb f5655d85a3 Rephrased a comment 2021-06-03 21:33:04 +02:00
ptitSeb c31262d339 Merge pull request #12 from rajdakin/pyfix
Fixed the Python script and added more typing
2021-06-03 21:24:35 +02:00
rajdakin 570798358c Fixed the Python script/added more typing 2021-06-03 21:15:29 +02:00
ptitSeb 05c9644ea6 Some fine-tunning on wrapped lubncurses and friends 2021-06-03 16:14:43 +02:00
ptitSeb 051bd2b10b Improved elfloader with COPY and GLOBAL reloc with version 2021-06-03 16:14:23 +02:00
ptitSeb b1b9d10656 Added a wrokaround for libtinfo global variables 2021-06-03 15:31:22 +02:00
ptitSeb 506f78eb32 Some work around libncurses and friends 2021-06-03 15:21:33 +02:00
ptitSeb 1336ddfad7 Fixed special case with FSCALE ocpode ([DYNAREC] too) 2021-06-03 15:21:33 +02:00
ptitSeb f3617f720b Fixed a warning 2021-06-03 15:21:33 +02:00
ptitSeb 844a1f43ed Merge pull request #11 from rajdakin/main
Enhancement of the Python script
2021-06-02 21:25:23 +02:00
rajdakin 8e42412490 Added types to the Python script, fixed some issues 2021-06-02 21:04:43 +02:00
rajdakin 2737180a20 Added some comments to the Python script, changed little things 2021-06-02 21:04:43 +02:00
ptitSeb 57e9e55705 Added one more syscall 2021-06-02 15:35:24 +02:00
ptitSeb 3f3f8b41e9 [DYNAREC] Fix x87opcode with rounding 2021-06-02 15:30:43 +02:00
ptitSeb d3ea390983 Added wrapped libncurses, libncurses6, libncursesw, libformw, libtinfo and libtinfo6 2021-06-02 14:52:10 +02:00
ptitSeb 2f1cc844fd Added 66 A1/A3 opcodes ([DYNAREC] too) 2021-06-02 14:51:06 +02:00
ptitSeb 543af50ff8 Added some more syscalls 2021-06-02 14:41:22 +02:00
ptitSeb f6444c8d45 Added fallback to no version in PltResolver for ver=0 symbol not found 2021-06-02 12:42:32 +02:00
ptitSeb df96dd0060 Added wrapped libxml2 (from box86) 2021-06-01 17:13:34 +02:00
ptitSeb 956e2aace3 Added F5 opcode ([DYNAREC] too) 2021-06-01 17:13:15 +02:00
ptitSeb 1951d525d1 Various small mprovments to interpretor 2021-06-01 16:42:34 +02:00
ptitSeb 3d4d678bdc Some small wrapped libGL improvements 2021-06-01 13:56:14 +02:00
ptitSeb b78d92d288 Added some more wrapped libGL functions (help apitrace) 2021-06-01 10:58:07 +02:00
ptitSeb e5dc4d7e78 Better trace for glXGetProcAddressARB 2021-06-01 10:37:58 +02:00
ptitSeb cd247ef6c1 Improved custom named libGL handling 2021-06-01 10:32:46 +02:00
ptitSeb 104cf8a58b Some adjustements to elfloader needed libs loading 2021-05-31 18:04:25 +02:00
ptitSeb 976f175aa9 Fixed munmap with 0 length 2021-05-31 17:06:12 +02:00
ptitSeb 81a06c47a1 Define CLFLUSH size in CPUID (helps Java programs) 2021-05-31 13:16:12 +02:00
ptitSeb 46b8c6bc83 Added alternate name for libSDL2_image, libSDL2_ttf and libexpat 2021-05-30 20:28:31 +02:00
ptitSeb 5f83a3f98a [DYNAREC] Added 66 0F E7 opcode 2021-05-30 20:18:44 +02:00
ptitSeb 2f6129bfd5 [DYNAREC] Added CC opcode 2021-05-30 18:56:00 +02:00
ptitSeb 26698b6449 Added some support for R_X86_64_TLSDESC relocation 2021-05-30 14:12:54 +02:00
ptitSeb 61839151c0 Fixed BOX64_DYNAREC_DUMP=2 env. var. 2021-05-30 14:00:22 +02:00
ptitSeb b38c9ea253 Added wcsncasecmp wrapped function 2021-05-30 11:57:50 +02:00
ptitSeb 25754a47e0 SDL2 GL GetProcAddress also print detail with BOX64_DLSYM_ERROR now 2021-05-30 11:51:43 +02:00
ptitSeb 278888c912 Improve handling of freetype FTC_Manager 2021-05-30 10:35:06 +02:00
ptitSeb 7faa4704e6 Handling F0 66 prefix same as 66 F0 2021-05-30 09:05:48 +02:00
ptitSeb ba48b6c793 Added a couple more wrapped function to libc 2021-05-29 18:29:43 +02:00
ptitSeb f8a969d43e Reworked elfloader, handle versionned symbols now 2021-05-29 18:05:37 +02:00
ptitSeb 55720342ad Splited Elf Dump from LOG handling 2021-05-28 11:55:57 +02:00
ptitSeb 085239ef4a Added 0F 0D /1 opcode ([DYNAREC] too) 2021-05-28 11:00:44 +02:00
ptitSeb df61d561f6 Added some more wrapped file oriented function to libc 2021-05-28 08:08:59 +02:00
ptitSeb 3cd8b5f48b Added wrapped wcstoul to libc 2021-05-24 11:41:50 +02:00
ptitSeb 2e21e46e86 Added more wrapped functions to libcrypto and floorl to libm 2021-05-24 09:54:31 +02:00
ptitSeb cb73a9a6bc Added a few more wrapped functions to libc and libcrypto 2021-05-23 21:59:33 +02:00
ptitSeb 5199df9b61 [DYNAREC] Added 64 F3 0F 11 opcode 2021-05-23 09:11:55 +02:00
ptitSeb 537ca9f724 Added 64 F3 0F 10 opcode ([DYNAREC] too) 2021-05-23 09:09:04 +02:00
ptitSeb fc5f5dab29 Added a few libc wrapped functions 2021-05-22 16:32:57 +02:00
ptitSeb 4be307820b Added 64 80 opcodes ([DYNAREC] too) 2021-05-21 10:05:36 +02:00
ptitSeb 15227bbc06 Added a couple of wrapped functions to libc 2021-05-19 14:37:01 +02:00
ptitSeb d0da2c24fb Added some more libc wrapped functions 2021-05-19 11:18:27 +02:00
ptitSeb 152a8a4666 Removed useless GetFS in F0 prefix interpretor 2021-05-19 10:10:36 +02:00
ptitSeb 86669beb7a [DYNAREC] Fixed a warning 2021-05-19 09:58:38 +02:00
ptitSeb ba2a70a484 Fixed a warning on non-trace dynarec build 2021-05-19 09:58:22 +02:00
ptitSeb 88ffcf6396 Fixed compile options for PI4 profile 2021-05-19 09:57:59 +02:00
ptitSeb 4d347f9ff0 Added a few wrapped function to libc and pthreads 2021-05-19 08:45:37 +02:00
ptitSeb 252258d138 Added %zd support in myalign varg hadnling 2021-05-19 08:45:13 +02:00
ptitSeb e35b25015b Added signal mask handling in setjmp/longjmp functions 2021-05-18 11:13:18 +02:00
ptitSeb 422844f842 Added wrapped pthread_getname_np function 2021-05-18 11:10:01 +02:00
ptitSeb 61725c8b49 Small fixes to my_backtrace function 2021-05-17 21:23:14 +02:00
ptitSeb 727178df57 [DYNAREC] Added 0F 50/52/53 opcodes 2021-05-17 20:42:36 +02:00
ptitSeb 66b3303f22 [DYNAREC] Added 66 0F D3/F3 opcodes 2021-05-17 20:42:01 +02:00
ptitSeb 47c3fad83b [DYNAREC] More emitters 2021-05-17 20:41:41 +02:00
ptitSeb 3928222395 Small fixed to 0F 50 opcode 2021-05-17 20:40:53 +02:00
ptitSeb 414d33a46c [DYNAREC] Fixed F2 0F 10/11 opcodes 2021-05-17 20:39:18 +02:00
ptitSeb 40a2c8393e [DYNAREC] Added F0 FF opcodes 2021-05-17 16:26:36 +02:00
ptitSeb 48fe298a36 Added wcsnlen wrapped function 2021-05-17 16:26:07 +02:00
ptitSeb 2865f0eab2 Added some wrapped function for libSDL2 and libGL 2021-05-17 12:59:49 +02:00
ptitSeb a5780632ca Added fwprintf wrapped function 2021-05-17 10:15:19 +02:00
ptitSeb bd5d29a825 Fixed epoll_wait alignment 2021-05-17 10:09:13 +02:00
ptitSeb 5255935a31 Added 2 more wrapped libc functions 2021-05-16 17:07:55 +02:00
ptitSeb a31ee062b6 Added 66 0F B6 opcode ([DYNAREC] too) 2021-05-16 16:57:39 +02:00
ptitSeb c56c991bf7 Added wrapped libexpat (for torchlight2) 2021-05-16 10:55:51 +02:00
ptitSeb 5ea4b796a5 [DYNAREC] Fix ROL/ROR 8bits opcodes 2021-05-16 10:55:27 +02:00
ptitSeb 8fe7378f86 Small hack on elfloader (for Torchlight2 and Unity3D and Dosbox) 2021-05-16 10:54:44 +02:00
ptitSeb 1224ffa7cd Fixed a 64bit issue with end pointer for emulated lib symbols 2021-04-26 11:01:14 +02:00
ptitSeb 56766df719 Aligned struct epoll 2021-04-26 10:14:29 +02:00
ptitSeb e505e5e466 Morte improved functions traces 2021-04-26 10:14:16 +02:00
ptitSeb 4cdc3c62b2 Added wrapeed libcrypt.so 2021-04-25 09:24:28 +02:00
ptitSeb 4402f08245 Fixed some issue when GL is used via SDL2 only 2021-04-25 09:24:09 +02:00
ptitSeb 954830032b Added a couple of syscall 2021-04-25 09:14:00 +02:00
ptitSeb 6f3fad8a16 Fixed dirent conversion (for good) 2021-04-24 15:42:24 +02:00
ptitSeb 2bb956bb06 Improved ofconvert function a bit 2021-04-24 15:42:05 +02:00
ptitSeb 7fa2a273d0 Fixed linux dirent64 to linux dirent conversion 2021-04-24 15:01:46 +02:00
ptitSeb 52e125e35a Added 66 F0 83 opcode 2021-04-24 14:37:37 +02:00
ptitSeb 57bea35004 Added more flags to ofconvert functions 2021-04-24 14:37:24 +02:00
ptitSeb 890842286b Added one more wrapped libfontconfig function 2021-04-24 14:36:50 +02:00
ptitSeb aec0ad9128 Added more syscalls 2021-04-24 14:36:21 +02:00
ptitSeb 4f5b5a995b Added more libc wrapped functions 2021-04-24 12:17:51 +02:00
ptitSeb bcd07ff6c7 Added some more syscalls 2021-04-24 12:02:21 +02:00
ptitSeb 68d7188f3e Added 0F 0B UD2 opcode 2021-04-24 12:01:58 +02:00
ptitSeb a924a74d82 Added wrapped libatspi (empty) 2021-04-24 11:24:15 +02:00
ptitSeb a20b830379 Better trace for getenv 2021-04-24 11:23:55 +02:00
ptitSeb 12fe96b114 Added wrapped libatk and libatk-bridge 2021-04-24 10:14:45 +02:00
ptitSeb 3432721379 Added 2 more wrapped funciton to libc 2021-04-23 14:01:25 +02:00
ptitSeb b39b7fd374 Fixed some crash with wrapped libSDL_sound 2021-04-22 12:42:54 +02:00
ptitSeb 406ddff9a1 Added 1 more funciton to libSDL2 2021-04-21 15:32:42 +02:00
ptitSeb d16d985a48 More libc wrapped functions 2021-04-21 14:58:49 +02:00
ptitSeb 0a2ea72d72 Added special case for unaligned LOCK INC QWord ptr[ED] 2021-04-21 14:53:01 +02:00
ptitSeb 3b4de7152c Added special case for unaligned LOCK DEC QWord ptr[ED] 2021-04-21 13:42:15 +02:00
ptitSeb 5520dae2e7 Another small change to custommem MaxFreeblock handling 2021-04-20 12:16:43 +02:00
ptitSeb 7a7f26c80e Added a couple of wrapped libc functions 2021-04-19 14:33:18 +02:00
ptitSeb 35f4944afb Improvments to ElfLoader Reloc handling and Reload of memory 2021-04-19 14:23:37 +02:00
ptitSeb 0a107d10eb [DYNAREC] Added F3 0F 1E opcode 2021-04-19 14:23:09 +02:00
ptitSeb 2c56ccfabe Fixed a small issue with Custom Mem handler and MexFreeBlock calculation 2021-04-19 14:22:39 +02:00
ptitSeb d1497e98db Added handling of 3E prefix ([DYNAREC] too) 2021-04-18 13:24:08 +02:00
ptitSeb 7925a8e1b3 Added libOpenGL.so.0 as a synonym for libGL.so.1 2021-04-18 13:17:28 +02:00
ptitSeb d529bf3c0c Added wrapped libpng16 2021-04-18 13:16:54 +02:00
ptitSeb 802c5a9d5b [DYNAREC] Added 0F 64/65/66/6B/72/75/76/D3/F5 opcodes 2021-04-18 12:21:01 +02:00
ptitSeb 3a22c36d04 Added some libc wrapped functions 2021-04-18 11:04:18 +02:00
ptitSeb 512ee40dbc Added a few more FreeType wrapped functions 2021-04-18 10:51:30 +02:00
ptitSeb d84e1f49ce Fixed GetNativeFnc 2021-04-18 09:03:20 +02:00
ptitSeb c4abaf8c8d Added wrapped libXft 2021-04-17 18:47:22 +02:00
ptitSeb 59fe5f3572 Fixed handling of * in scnaf/printf Stack argument handling 2021-04-17 18:47:09 +02:00
ptitSeb 18320e19bc Added 91..96 opcode and fixe REX.B 99 one ([DYNAREC] too) 2021-04-17 14:40:19 +02:00
ptitSeb 248cd2e749 Fixed nexttoward(f) wrapped functions, and improved long double handling 2021-04-17 10:50:33 +02:00
ptitSeb 3b550eeed3 [DYNAREC] Hack to handle FLD/FSTP tbytes sequence faster 2021-04-17 10:49:53 +02:00
ptitSeb 097c0ac0b7 Added wrapped libFLAC 2021-04-16 19:39:29 +02:00
ptitSeb 7a95dcd6b6 Added E0..E3 opcodes ([DYNAREC] too) 2021-04-16 15:46:03 +02:00
ptitSeb 47d0c04b30 Added more libc wrapped functions 2021-04-16 15:45:31 +02:00
ptitSeb 16be2bd305 [DYNAREC] Smal fix on the x86 size computation for sons of dynablocks 2021-04-16 15:44:54 +02:00
ptitSeb 7cf6ee06a1 [DYNAREC] Small printer fix for LDRSW 2021-04-16 15:43:55 +02:00
ptitSeb dd4c413e41 Use curl4 wrapper fro libcurl.so.3 2021-04-16 15:43:16 +02:00
ptitSeb 08d2ac41f6 Some improvement to custommem handling 2021-04-16 15:42:45 +02:00
ptitSeb fd939c6fce Also handle internal mutex in my_sighandler 2021-04-14 18:06:04 +02:00
ptitSeb 82755b5ef2 Added wrapped libSDL_net and libSDL_sound 2021-04-14 16:27:53 +02:00
ptitSeb 7b4cbee8e7 Improved elfloader 2021-04-14 16:27:26 +02:00
ptitSeb 5346f594d4 Fixed dynarec builds 2021-04-14 16:06:47 +02:00
ptitSeb 6f217d78da Merge pull request #10 from rajdakin/warnFixRefactor
Warnings and fixes
2021-04-14 14:54:30 +02:00
rajdakin cdf71c4cbc Oops-es 2021-04-14 14:25:02 +02:00
rajdakin e93a280d2c Third pass, bumped the minimal CMake version up to 3.4 2021-04-14 13:15:18 +02:00
rajdakin 51fa96c44b Second pass 2021-04-14 13:12:04 +02:00
rajdakin 48d6135106 First pass 2021-04-14 13:11:51 +02:00
ptitSeb 0d38b1cd91 Start of a new dev. cycle 2021-04-14 10:06:48 +02:00
ptitSeb f5c4deb42b Bumped to v0.0.8 2021-04-13 20:49:30 +02:00
ptitSeb 069193e8b7 Added a few SDL2 wrapped function from v2.0.10 2021-04-13 20:30:17 +02:00
ptitSeb a424e996b3 Added syscall 298 2021-04-13 20:29:59 +02:00
ptitSeb 3c81248335 Merge pull request #9 from ptitSeb/krishenriksen-patch-3
Update x64runf30f.c
2021-04-13 18:53:04 +02:00
Kris Henriksen 1e3f277a71 Update x64runf30f.c
For opcodes:
1688|0x40ee00: Unimplemented Opcode (90) F3 0F 1E FA 31 ED 49 89 D1 5E 48 89 E2 48 83
1688|0x40eeb0: Unimplemented Opcode (00) F3 0F 1E FA 80 3D A5 FA EE 00 00 75 13 55 48
1688|0x9ca7d8: Unimplemented Opcode (00) F3 0F 1E FA 48 83 EC 08 48 83 C4 08 C3 00 00
2021-04-13 23:06:08 +07:00
ptitSeb 3adeabb06d Added some libc wrapped functions 2021-04-13 17:43:10 +02:00
ptitSeb 4593111871 Added 67 0F 2E/2F opcodes 2021-04-13 17:36:56 +02:00
ptitSeb 7440be495e Better trace for poll 2021-04-13 17:25:43 +02:00
ptitSeb fded1a0718 Added some more wrapped functions in libc 2021-04-13 15:19:59 +02:00
ptitSeb ebbb2821d0 Added 64 3B opcode 2021-04-13 15:14:49 +02:00
ptitSeb 643b950eef Add option to ovoid building fixed address 2021-04-13 15:09:03 +02:00
ptitSeb 63a20f537a Merge pull request #7 from ptitSeb/krishenriksen-patch-1
Update CMakeLists.txt
2021-04-13 13:41:21 +02:00
Kris Henriksen ae94148bee Update CMakeLists.txt
Fix definitions for rk3326
2021-04-13 18:23:38 +07:00
ptitSeb 9301eb9ee0 Remove TokiTori2+ patch code, game is 32bits only 2021-04-13 11:47:30 +02:00
ptitSeb 19448e242c Added a few syscall around inotify 2021-04-13 10:47:47 +02:00
ptitSeb f26c2f0812 Added a few more libc wrapped function, and fixed glob64 wrapping 2021-04-12 21:03:50 +02:00
ptitSeb 6573476ea2 [DYNAREC] Fixed adc16 emitter 2021-04-12 21:03:30 +02:00
ptitSeb f73430a3f8 Added one pango function 2021-04-12 19:37:14 +02:00
ptitSeb 3bf90844b1 Added a few more libc wrapped functions 2021-04-12 19:12:50 +02:00
ptitSeb 6546ae8e67 Added utime wrapped functions 2021-04-12 19:01:07 +02:00
ptitSeb d01bdf9186 Added 9E/9F opcodes ([DYNAREC] too) 2021-04-12 18:49:54 +02:00
ptitSeb 88b6cc1907 Added a 1 more libc wrapped function 2021-04-12 18:49:34 +02:00
ptitSeb 8922b63769 Fixed some issues with pthread wrapping 2021-04-12 16:40:08 +02:00
ptitSeb 30d4713b28 [DYNAREC] Added 66 0F 5D/5F opcodes 2021-04-12 16:20:45 +02:00
ptitSeb 498a52439c [DYNAREC] Fixed F2 0F 5D/5F opcodes 2021-04-12 16:13:02 +02:00
ptitSeb 88798b78fc Improved pthread wrapping 2021-04-12 14:29:38 +02:00
ptitSeb 0ce7390ac1 Added 64 F3 0F 11/59 opcodes 2021-04-12 14:29:19 +02:00
ptitSeb 00f5eb5338 More alignment work on thread (some attr are bigger on arm64 than x86_64) 2021-04-12 10:13:35 +02:00
ptitSeb d9967d7ea5 Added A0/A2 opcodes ([DYNAREC] too) 2021-04-11 19:27:10 +02:00
ptitSeb d42031293d Fixed a warning in wrapped libsdl2 2021-04-11 18:41:34 +02:00
ptitSeb 76903904d0 Merge pull request #6 from rajdakin/generalImprovements
General improvements to box64 and fixed some SDL2 functions
2021-04-11 18:31:59 +02:00
rajdakin a42f232b1e Forgot to add SDL1 2021-04-11 18:24:13 +02:00
rajdakin 72a505a3e8 General improvements to box64 and fixed some SDL2 functions 2021-04-11 17:53:23 +02:00
ptitSeb ae221ed5bd [DYNAREC] Added 0F F2 opcode 2021-04-11 17:18:38 +02:00
ptitSeb 76115b30b8 [DYNAREC] Added 66 0F E1/F2 opcode 2021-04-11 17:05:15 +02:00
ptitSeb 7401d46bcd [DYNAREC] Added 0F 74 opcode 2021-04-11 16:50:59 +02:00
ptitSeb ee61d9c95a [DYNAREC] Added 66 0F DA opcode 2021-04-11 16:47:04 +02:00
ptitSeb 6db666c565 [DYNAREC] Added 0F 63 opcode 2021-04-11 16:44:57 +02:00
ptitSeb 050acaa8c6 [DYNAREC] Added 0F E3 opcode 2021-04-11 16:35:59 +02:00
ptitSeb e83232fcf6 Fixed 0F E3 opcode 2021-04-11 16:35:45 +02:00
ptitSeb ece7ea36d9 [DYNAREC] Added 66 0F E2 ocpode 2021-04-11 16:23:45 +02:00
ptitSeb 73d27a625f [DYNAREC] Added F3 0F 5B opcode 2021-04-11 15:53:08 +02:00
ptitSeb a8d4f17add [DYNAREC] Added F3 0F D6 opcode 2021-04-11 15:46:36 +02:00
ptitSeb af6fb49e48 Added F2 0F F0 ocpode ([DYNAREC] too) 2021-04-11 15:38:09 +02:00
ptitSeb c593988bc1 [DYNAREC] Added 0F DE/DF opcodes 2021-04-11 15:24:25 +02:00
ptitSeb 2d590bb1f5 Added 0F DE opcode 2021-04-11 15:24:08 +02:00
ptitSeb aef3677970 Added wrapped libSDL2_net 2021-04-11 15:08:33 +02:00
ptitSeb 7d11254a52 [DYNAREC] Improved (and fixed) Table64 handling 2021-04-11 11:14:18 +02:00
ptitSeb 3b9feeed12 Improvement in internal mutex handling on signal, and [DYNAREC] multitasking changes to the JmpTable 2021-04-11 11:05:36 +02:00
ptitSeb 6d3ca2df80 [DYNAREC] Fixed, again, arm64_lock_storeifref function 2021-04-11 10:46:18 +02:00
ptitSeb 5d69ed5f4a [DYNAREC] Fixed arm64_lock_storeifref function 2021-04-11 10:41:55 +02:00
ptitSeb 81d13a8e0b [DYNAREC] Removed obsolete comments 2021-04-11 10:22:41 +02:00
ptitSeb 544a2ac034 [DYNAREC] Added address on Jump to non-block address warning log 2021-04-11 10:22:01 +02:00
ptitSeb 9a2bf37ac1 Merge branch 'main' of https://github.com/ptitSeb/box64 into main 2021-04-10 16:38:16 +02:00
ptitSeb 550d252386 Merge pull request #5 from rajdakin/addFunc
Added some libc symbols
2021-04-10 16:33:14 +02:00
rajdakin 2b3bdd7e60 Added some libc symbols 2021-04-10 15:39:58 +02:00
ptitSeb 4f38801ba6 Merge branch 'main' of https://github.com/ptitSeb/box64 into main 2021-04-10 14:36:02 +02:00
ptitSeb 31b41f5b94 Merge pull request #4 from rajdakin/fixFF
Fixed 0xFF INC and DEC opcodes
2021-04-10 14:27:45 +02:00
rajdakin 03ce3c6592 Fixed FF INC and DEC opcodes 2021-04-10 14:26:41 +02:00
ptitSeb 2a4649f6ef Better trace for a few GL functions 2021-04-10 12:04:45 +02:00
ptitSeb 96c3615ea5 [DYNAREC] Fixed address used by this warning 2021-04-10 12:04:20 +02:00
ptitSeb adfcfafdc2 Grab thread emu when calling init Library instead of NULL 2021-04-10 09:06:56 +02:00
ptitSeb 0a37f1cc30 Merge pull request #3 from rajdakin/exitFix
box64 exit fix
2021-04-09 18:19:42 +02:00
rajdakin 70018a774b Fixed the libraries free ordering 2021-04-09 17:52:59 +02:00
rajdakin 009bb94f17 Changed missed unwanted "box86" 2021-04-09 17:52:25 +02:00
ptitSeb 0e0f1e2037 Added gethostbyname wrapped function 2021-04-09 17:31:48 +02:00
ptitSeb a0a0bc8270 Added F0 87 opcode ([DYNAREC] too) 2021-04-09 17:21:53 +02:00
ptitSeb 25c532610b Fixed a warning 2021-04-09 17:19:23 +02:00
ptitSeb fcfd90b86f Fix NOALIGN build 2021-04-09 13:39:13 +02:00
ptitSeb 738d22a68a Added one more wcs wrapped function 2021-04-09 11:37:16 +02:00
ptitSeb 8c63b76343 Added unligned case for lock inc dword ptr[xx] 2021-04-09 11:36:56 +02:00
ptitSeb ba7a04851f Added wcstof wrapped function 2021-04-09 11:10:33 +02:00
ptitSeb e3d15db6c5 pthread_attr_t don't have the same size on x86_64 (0x38) and arm64 (0x40)... 2021-04-09 11:08:26 +02:00
ptitSeb ca46df09d8 Small comment on syscall 2021-04-09 11:07:49 +02:00
ptitSeb f053e02868 More libc wrapped functions 2021-04-08 19:30:27 +02:00
ptitSeb 42cbe1b397 Added 64 F2 0F 11 and 64 39 opcodes 2021-04-08 19:28:39 +02:00
ptitSeb 42fe124a0e A few more wrapped libc functions 2021-04-08 19:22:30 +02:00
ptitSeb d809b59daa Added 67 66 0F 6F/7A opcodes 2021-04-08 19:11:42 +02:00
ptitSeb e14d4042d9 [DYNAREC] Fixed 66 81 opcodes 2021-04-08 18:15:56 +02:00
ptitSeb 371b346bf7 [DYNAREC] Fixed the BOX64_NODYNAREC function 2021-04-08 17:53:19 +02:00
ptitSeb b038dd5c9d Added a libvorbisfile wrapped function and fixed another one (structure as argument are in the stack, always) 2021-04-08 17:06:49 +02:00
ptitSeb 2681a6db0d Added a xcb wrapped function 2021-04-08 16:31:15 +02:00
ptitSeb 5ff1ea1435 Added fsync wrapped function 2021-04-08 16:28:10 +02:00
ptitSeb 759f165549 Fixed fcntl wrapper 2021-04-08 16:27:52 +02:00
ptitSeb cb27ac8d93 Fixed memory protection that wasn't updated correctly 2021-04-08 16:26:33 +02:00
ptitSeb 035c77ad91 Added wrapped libcairo, libpango, libpangoft2 and libpangocairo 2021-04-08 15:46:34 +02:00
ptitSeb b45c249ed9 Added a few more wrapped libc functions 2021-04-08 15:35:38 +02:00
ptitSeb b90991f039 Added F0 0F AB/B3 opcodes 2021-04-08 15:32:35 +02:00
ptitSeb 8d49ae5c68 Added some more libc wrapped functions 2021-04-08 15:09:53 +02:00
ptitSeb 49047cf972 Small change on trace flags output 2021-04-08 13:02:38 +02:00
ptitSeb aa5485ae27 Fixed a warning 2021-04-08 13:01:43 +02:00
ptitSeb fc0d9c5f92 Small change on trace output 2021-04-08 13:01:16 +02:00
ptitSeb 8309c5feeb Merge pull request #2 from rajdakin/addregsdiff
Added a new trace option
2021-04-07 17:16:38 +02:00
ptitSeb 4693cac13b [DYNAREC] Needed to same a bit more register before native funciton call (fix setjmp no saving all registers) 2021-04-07 17:09:47 +02:00
rajdakin 79f2b8448a [TRACE] Added a new trace option 2021-04-07 17:09:37 +02:00
ptitSeb 7e09961ee7 Added 2 _np wrapped function to pthreads 2021-04-07 15:34:15 +02:00
ptitSeb 21aded91f0 Added wrapped libcurl/libcurl-gnutls 2021-04-07 15:32:17 +02:00
ptitSeb 6b4bb5e7cb Small changes to a few libGL wrapped function signature 2021-04-07 14:50:25 +02:00
ptitSeb c1eef81fdb Added 0F DA ocode ([DYNAREC] too) 2021-04-07 14:49:56 +02:00
krishenriksen b1e6fa4f2b Added RK3326 definitions. 2021-04-07 17:39:23 +07:00
ptitSeb e672641878 Added wrapped ldiv function 2021-04-06 17:03:02 +02:00
ptitSeb fef0140098 Added wrapped libcrypto and libssl 2021-04-06 16:58:51 +02:00
ptitSeb 4084eade0c Fixed __realpath_chk wrapping 2021-04-06 13:47:55 +02:00
ptitSeb 748552d792 Unlock all mutex on child process when forking 2021-04-06 13:40:48 +02:00
ptitSeb ff50b0c391 Fixed SDL AudioSpec structure definition 2021-04-06 11:02:47 +02:00
ptitSeb 23e7d5c370 Added 67 80/8B opcodes 2021-04-05 19:04:16 +02:00
ptitSeb 676b7523b3 Added a couple of libc wrapped functions 2021-04-05 18:20:47 +02:00
ptitSeb 880616397f Cleanup trace_func if still present at exit 2021-04-05 17:40:56 +02:00
ptitSeb ace8536987 And another change change to __libc_start_main for non-Dynarec build 2021-04-05 17:31:50 +02:00
ptitSeb 3370ae4dcf Added some more GL wrapped functions 2021-04-05 17:26:10 +02:00
ptitSeb 8a6a1312f2 One more change to __libc_start_main to end emulation when done 2021-04-05 17:25:48 +02:00
ptitSeb a9d633ab2d Fixed _start preparation 2021-04-05 16:47:26 +02:00
ptitSeb 765a9d8325 Re-enabled the pre-calc of next block for new thread 2021-04-05 16:46:30 +02:00
ptitSeb 67c6a661e5 Better trace for glXGetProcAddress 2021-04-05 16:45:50 +02:00
ptitSeb b897d55873 Merge pull request #1 from rajdakin/wrapper_add
[WRAPPER] Added a new feature in the wrapper, forced all i32 to i64
2021-04-04 18:42:35 +02:00
rajdakin 7b099f9c64 [WRAPPER] Added a new feature in the wrapper, forced all i32 to i64 2021-04-04 18:36:18 +02:00
ptitSeb c172fbd883 [DYNAREC] Added 66 64 8B opcode 2021-04-04 14:55:58 +02:00
ptitSeb 5fb581a51f Added some more libc wrapped functions 2021-04-04 14:54:43 +02:00
ptitSeb f3a08a51ef Ooops, that typo was breaking some C#/Unity stuff 2021-04-04 14:54:22 +02:00
ptitSeb a7b9590f6f Disabled handling of CC opcode for now (ignoring it is better) 2021-04-04 14:53:37 +02:00
ptitSeb 998a114172 Added some more 67 opcodes (may need to find a better solution for this) 2021-04-04 11:28:21 +02:00
ptitSeb 29f65bb6be More work on mmap and the MAP_32BIT flag 2021-04-04 10:19:47 +02:00
ptitSeb cce9293413 One more libc wrapped function 2021-04-03 22:32:19 +02:00
ptitSeb b91a95ee49 [DYNAREC] A few more printer on litteral LDR 2021-04-03 22:32:00 +02:00
ptitSeb 0eb682a95b [DYNAREC] Some more fixes on some DB opcodes (until ARMv8.5 detection is implemented) 2021-04-03 22:31:37 +02:00
ptitSeb 424312c2d8 More work on stack alignements 2021-04-03 22:31:00 +02:00
ptitSeb 969ee91506 More work around stack alignement and frame pointer 2021-04-03 21:37:25 +02:00
ptitSeb f56ee97676 [DYNAREC] Fixed x87 virtual stack managment 2021-04-03 21:36:53 +02:00
ptitSeb f667ec631d Added some more libc wrapped functions 2021-04-03 19:15:19 +02:00
ptitSeb 7bcf1cc0ae [DYNAREC] Added DF opcodes 2021-04-03 18:50:14 +02:00
ptitSeb dba4ff3cff [DYNAREC] Added DD opcodes 2021-04-03 15:47:55 +02:00
ptitSeb 0ff030a44c [DYNAREC] Fixed many issues with x87 cache handling 2021-04-03 15:47:44 +02:00
ptitSeb 7babbcf62b [DYNAREC] removed a warning 2021-04-03 14:47:59 +02:00
ptitSeb fd303c6e94 [DYNAREC] Added D8 opcodes 2021-04-03 14:40:55 +02:00
ptitSeb a8495b00f2 [DYNAREC] Added DB opcodes 2021-04-03 14:32:04 +02:00
ptitSeb ae70f168a8 [DYNAREC] Added D9 opcodes 2021-04-03 11:43:17 +02:00
ptitSeb b239bec2c5 [DYNAREC] Better 0F 77 EMMS emulation 2021-04-03 10:37:00 +02:00
ptitSeb d0f05fed3b [DYNAREC] Added F3 0F 52 opcode 2021-04-03 10:30:02 +02:00
ptitSeb 717c0e1299 [DYNAREC] Added F3 0F E6 opcode 2021-04-03 10:00:52 +02:00
ptitSeb 8760064ddb [DYNAREC] Added 66 03/C6 opcodes 2021-04-03 09:44:26 +02:00
ptitSeb ab0059eeee Better trace for strcmp 2021-04-03 09:39:35 +02:00
ptitSeb 19a7d2139a Added wrapped pwrite function 2021-04-03 09:15:30 +02:00
ptitSeb 5319117636 Changed the way alignment of mutex is done 2021-04-03 08:59:19 +02:00
ptitSeb c5b32180d2 Small fix for dl_iterate_phdr 2021-04-03 08:58:54 +02:00
ptitSeb 62baaf99b1 Better trace for opendir and strlen 2021-04-03 08:58:31 +02:00
ptitSeb c03dd5951a Added 64 00..35/C6 opcodes 2021-04-02 19:39:50 +02:00
ptitSeb 555f4e132f Added a few more libc wrapped function and fixed munmap wrapping 2021-04-02 19:27:32 +02:00
ptitSeb c3209a2736 [DYNAREC] Fixed 0F 5D/5F/6E/6F opcodes 2021-04-02 18:28:22 +02:00
ptitSeb 0b29d724db [DYNAREC] Added 66 0F E0 opcode 2021-04-02 16:19:38 +02:00
ptitSeb 931a8063b4 [DYNAREC] Added 0F E8/E9 opcodes and fixed 0F E7 opcode 2021-04-02 16:16:31 +02:00
ptitSeb c74406c89e [DYNAREC] Added 66 AB opcodes 2021-04-02 15:54:10 +02:00
ptitSeb c44b8b1936 [DYNAREC] Added 0F D8/D9/DC/DD opcodes 2021-04-02 15:50:20 +02:00
ptitSeb b1671dd98d [DYNAREC] Added 0F DB opcode 2021-04-02 15:46:44 +02:00
ptitSeb 0baf0ff24a [DYNAREC] Added 0F 73 opcode 2021-04-02 15:43:40 +02:00
ptitSeb 2929d7256b [DYNAREC] Added 0F 38 00 opcode 2021-04-02 15:17:24 +02:00
ptitSeb 8d769dd3c2 [DYNAREC] Added 0F 38 0B opcode 2021-04-02 15:14:58 +02:00
ptitSeb e8d6f083a3 Added 66 0F 38 0B opcode ([DYNAREC] too) 2021-04-02 15:11:19 +02:00
ptitSeb 817c3d7058 Added 0F E0 opcode ([DYNAREC] too) 2021-04-02 14:41:19 +02:00
ptitSeb e2a7dd0f17 Added 0F E7 opcode ([DYNAREC] too) 2021-04-02 14:27:49 +02:00
ptitSeb f781537adb Added wrapped swscanf 2021-04-02 14:27:11 +02:00
ptitSeb c2c65f46cb [DYNAREC] Fixed SQXTUN2_8 emiter, and so 66 0F 67 opcode 2021-04-02 14:13:57 +02:00
ptitSeb 0f65adfaab Fixed trace on mremap 2021-04-02 14:13:02 +02:00
ptitSeb efafe96b08 Changed LOG Level of dl_iterate_phdr warning 2021-04-02 13:47:26 +02:00
ptitSeb 858957f6f7 [DYNAREC] Fixed CSETM printer 2021-04-02 13:46:45 +02:00
ptitSeb 128724d147 Implemented a workaround for mmap64 with MAP_32BIT flag 2021-04-02 13:38:23 +02:00
ptitSeb c6c6bfcf2c Minor change to elfloader 2021-04-02 13:36:03 +02:00
ptitSeb 4f451ff653 Better trace for mmap64 2021-04-02 13:35:40 +02:00
ptitSeb 7822f29140 Change Elfloader handling of R_X86_64_GLOB_DAT with R_X86_64_COPY by preapplying the Copy (it fixed Knytt Underground) 2021-04-02 11:04:34 +02:00
ptitSeb 98d434a0a9 Added wrapped rawmemchr function 2021-04-02 11:01:42 +02:00
ptitSeb 61c1f7157c Added wrapped libutil 2021-04-02 09:22:12 +02:00
ptitSeb 5ab4028257 Just to be sure the sign is extended to 64bits 2021-04-01 21:55:30 +02:00
ptitSeb 717769f1cc Better trace for mkdir 2021-04-01 21:54:53 +02:00
ptitSeb 7278bc9cde Added a few more libc wrapped functions 2021-04-01 21:54:31 +02:00
ptitSeb 7bc67cd168 Added libs64 as default LD_LIBRARY_PATH 2021-04-01 19:54:36 +02:00
ptitSeb bc23a90ef7 Try to add 0F AE /7 CLFLUSH opcode 2021-04-01 18:09:14 +02:00
ptitSeb 2070b53967 Added some more libc wrapped functions 2021-04-01 18:02:01 +02:00
ptitSeb 37a8ac3b32 Try to setup some kind of Stack Frame on new thread 2021-04-01 18:01:47 +02:00
ptitSeb 3b2e75055f Added wrapped glob64 and freeglob64 functions 2021-04-01 17:51:46 +02:00
ptitSeb 9f5e12992a Added F0 FF opcodes 2021-04-01 17:44:44 +02:00
ptitSeb eede8e1e8d Added wrapped fdatasync function 2021-04-01 17:17:29 +02:00
ptitSeb b40c4ebcd7 Added 67 89 opcode 2021-04-01 17:03:48 +02:00
ptitSeb 53e449a96f [DYNAREC] Added 0F 51 opcode 2021-04-01 17:02:56 +02:00
ptitSeb d35217d39d [DYNAREC] Small Fix for 67 8D opcode 2021-04-01 16:12:02 +02:00
ptitSeb 883463f2d5 [DYNAREC] Fixed F3 0F 70 opcode 2021-04-01 16:01:53 +02:00
ptitSeb 9abfdb3431 Small change to 67 C1 opcode 2021-04-01 15:37:08 +02:00
ptitSeb e942a8433b [DYNAREC] Added 66 0F E6 opcode 2021-04-01 15:36:51 +02:00
ptitSeb 0163746709 [DYNAREC] Small change to 8D opcode 2021-04-01 15:36:22 +02:00
ptitSeb dfbdd81d41 [DYNAREC] Fixed 67 8D opcde, and remove hack for 67 REX.W, it was wrong 2021-04-01 15:35:34 +02:00
ptitSeb b474a9061b [DYNAREC] Added 66 0F 5C opcode 2021-04-01 14:59:43 +02:00
ptitSeb eaeef7e9e9 Added wrapped fchmodat function 2021-04-01 14:59:21 +02:00
ptitSeb 30091b2af6 [DYNAREC] Added 66 0F 58/59 opcode 2021-04-01 14:39:38 +02:00
ptitSeb 73b51adfb3 Added 67 C1 opcode 2021-04-01 14:39:12 +02:00
ptitSeb 34a82f7bfc [DYNAREC] Handling 67 REX.W as just REX.W 2021-04-01 14:38:13 +02:00
ptitSeb 159bbcf4a4 [DYNAREC] Added 66 0F F5 opcode 2021-04-01 14:08:49 +02:00
ptitSeb 398a8b12c2 Added 0F 31 opcode ([DYNAREC] too) 2021-04-01 13:47:58 +02:00
ptitSeb d45558782f [DYNAREC] Added 66 0F C6 opcode 2021-04-01 13:47:46 +02:00
ptitSeb 1c3f4c078f Added 66 0F 3A 0F opcode ([DYNAREC] too) 2021-04-01 13:23:17 +02:00
ptitSeb 48588a2556 Cosmetic change 2021-04-01 11:42:31 +02:00
ptitSeb 4ae5391637 Wrapped malloc to call calloc instead (not sure it's really needed) 2021-04-01 11:42:09 +02:00
ptitSeb 28e11dec31 Better trace for XCreateWindow 2021-04-01 11:41:36 +02:00
ptitSeb b343ab69a5 Fixed 0F 7E opcode, plus a few other small changes 2021-04-01 09:15:35 +02:00
ptitSeb 697dc5fa3f [DYNAREC] Small optim of 0F 6E opcode 2021-04-01 09:12:51 +02:00
ptitSeb fa12161c47 [DYNAREC] Added 0F 68/69/6A opcodes 2021-03-31 22:01:47 +02:00
ptitSeb 9f0f1efafe [DYNAREC] Added 0F E5 opcode 2021-03-31 21:22:42 +02:00
ptitSeb aa4c56e466 [DYNAREC] Added 0F F8/F9/FA opcode 2021-03-31 21:18:01 +02:00
ptitSeb 09e1464bc8 [DYNAREC] Added F3 0F 70 opcodes and another fix for F2 0F 70 opcode 2021-03-31 21:14:42 +02:00
ptitSeb b689c745a0 [DYNAREC] Added 66 0F D5 and 0F D5 opcodes and fixed F2 0F 70 opcode 2021-03-31 21:08:22 +02:00
ptitSeb 28c2c56271 [DYNAREC] Added 0F FC/FD/FE opcode 2021-03-31 20:41:01 +02:00
ptitSeb 2d666965cf [DYNAREC] Added 0F 70 opcode 2021-03-31 20:19:11 +02:00
ptitSeb 444d5c7580 [DYNAREC] Added 0F C4/C5 opcode 2021-03-31 20:06:05 +02:00
ptitSeb 5d694fe2f2 [DYNAREC] Added 0F F6 opcode 2021-03-31 20:01:36 +02:00
ptitSeb ccd9692875 [DYNAREC] Added 0F EF opcode 2021-03-31 19:57:42 +02:00
ptitSeb 8c553cad5d [DYNAREC] Added 66 0F 63 opcode 2021-03-31 19:19:35 +02:00
ptitSeb a99a68b03a [DYNAREC] Added 66 0F E5 opcode 2021-03-31 19:12:52 +02:00
ptitSeb acb01382df [DYNAREC] Added 66 0F E8/E9/EA opcodes 2021-03-31 19:08:03 +02:00
ptitSeb 23d63686e6 [DYNAREC] Added 66 0F DC/DD/DE opcodes 2021-03-31 19:04:21 +02:00
ptitSeb c0083beec0 [DYNAREC] Added 66 0F D8/D9 opcodes 2021-03-31 18:50:29 +02:00
ptitSeb 1d680c2039 [DYNAREC] Added 67 8D opcode 2021-03-31 18:40:54 +02:00
ptitSeb bb273b55e2 [DYNAREC] Added 0F 77 opcode 2021-03-31 18:33:40 +02:00
ptitSeb d119ae5ed4 [DYNAREC] Add 66 0F E4 opcode 2021-03-31 18:30:17 +02:00
ptitSeb d78dbbe4c7 [DYNAREC] Added 0F 6E/6F opcodes 2021-03-31 17:30:43 +02:00
ptitSeb 663ac80fd0 [DYNAREC] Added 0F 67/71 opcodes 2021-03-31 17:22:23 +02:00
ptitSeb 2d34788607 [DYNAREC] Added 0F EB/EC/ED opcodes 2021-03-31 17:07:12 +02:00
ptitSeb cbf4e37bba [DYNAREC] Added 0F 38 04 opcode 2021-03-31 16:58:29 +02:00
ptitSeb 74b70253b2 [DYNAREC] Added 0F 60/61/62 opcodes 2021-03-31 16:55:08 +02:00
ptitSeb 0343ee119c [DYNAREC] Added 0F 6E/6F opcodes 2021-03-31 16:47:49 +02:00
ptitSeb f9c9868349 [DYNAREC] Added 66 0F EC/ED opcodes 2021-03-31 16:38:41 +02:00
ptitSeb 1395090241 [DYNAREC] Added 66 0F 38 04 opcode 2021-03-31 16:26:34 +02:00
ptitSeb dc938e8a60 [DYNAREC] Added 66 0F 38 00 and fixed 66 0F 67 opcodes 2021-03-31 13:23:56 +02:00
ptitSeb 7dd4f1ab72 [DYNAREC] Added 66 0F 67 opcode 2021-03-31 11:32:45 +02:00
ptitSeb d53c9c1e87 [DYNAREC] Added F2 0F 70 opcode 2021-03-31 11:17:21 +02:00
ptitSeb 424a08607c [DYNAREC] Added 66 0F F6 opcode 2021-03-31 11:05:02 +02:00
ptitSeb 0d2a060e66 [DYNAREC] Added F3 0F 2D opcode 2021-03-31 10:08:09 +02:00
ptitSeb 9748c55dd0 Added 0F 38 00/04/0B/1C/1D/1E opcodes 2021-03-31 10:02:56 +02:00
ptitSeb 130d96b31e [DYNAREC] Fixed 66 0F C4 opcode 2021-03-31 09:57:25 +02:00
ptitSeb e6e420d9a3 Added 66 0F 38 01/02/03/04/05 opcodes 2021-03-30 21:46:13 +02:00
ptitSeb bde4adcdef Added 0F 70/C4/C5/F6 opcodes 2021-03-30 21:40:31 +02:00
ptitSeb 3746ae9cf3 Added 66 0F 38 00 opcode 2021-03-30 21:32:48 +02:00
ptitSeb 0c4eed79da Added 0F 71/72/73 opcodes 2021-03-30 21:27:17 +02:00
ptitSeb 8bbd9abd27 Added wrapped fts_* function (FTS struct seems aligned on 64bits) 2021-03-30 21:15:06 +02:00
ptitSeb dfa15ad9fc Added a few more libc wrapped functions 2021-03-30 21:06:46 +02:00
ptitSeb 00ac1fdcd1 Changed wrapper generator to force 32bits i/u value to 64bits 2021-03-30 21:02:42 +02:00
ptitSeb af7bfc7de7 Added F2 0F 12 opcode ([DYNAREC] too) 2021-03-30 21:02:19 +02:00
ptitSeb e3759a5cd0 Added 'bin64' to the folder were to look for libs 2021-03-30 20:58:25 +02:00
ptitSeb c5f4820b4e Added A1/A3 opcodes ([DYNAREC] too) 2021-03-30 20:55:23 +02:00
ptitSeb a3d9da2fd4 Try to improve a bit signal handling 2021-03-30 19:36:27 +02:00
ptitSeb e592d2eb6d [DYNAREC] Fixed PLD emitter, fixing 0F 18 opcode for good this time 2021-03-30 18:51:17 +02:00
ptitSeb e57aaadb1d Fixed some wrapped function signature, and added a few more 2021-03-30 18:15:07 +02:00
ptitSeb 0d2492bfde Added wrapped swprintf 2021-03-30 17:55:29 +02:00
ptitSeb 1a3483e086 Fixed wrapped SDL_GetThreadID function signature 2021-03-30 17:55:10 +02:00
ptitSeb 171c213b32 Wraped some SDL2 printf functions 2021-03-30 15:26:46 +02:00
ptitSeb c4dcb316ca Added __strtol_internal wrapped function 2021-03-30 15:18:11 +02:00
ptitSeb 725f612eb5 [DYNAREC] disable dynarec when all fini function of loaded libs are done 2021-03-30 15:17:57 +02:00
ptitSeb 3539ed5bfe [DYNAREC] Fixed 66 0F C4/C5 opcodes, and small optim on 66 0F 70 2021-03-30 14:56:54 +02:00
ptitSeb a8bd94e34f [DYNAREC] Added a few more printers 2021-03-30 14:55:58 +02:00
ptitSeb 0d59028eb2 [DYNAREC] Optimized a bit 66 0F 70 opcode 2021-03-30 11:31:04 +02:00
ptitSeb 7ae39b38a0 Added wrapped __isoc99_vsscanf function 2021-03-29 20:35:57 +02:00
ptitSeb b69f9b9536 Added wrapped syslog and __syslog_chk 2021-03-29 20:28:50 +02:00
ptitSeb 6dbc4d44a8 Added wrapped libbz2 and liblzma 2021-03-29 20:19:37 +02:00
ptitSeb 397eff9712 [DYNAREC] Fixed 0F 18 opcodes 2021-03-29 19:20:31 +02:00
ptitSeb 51c23856f3 [DYNAREC] FillBlock is behind a mutex now, and use LR for easier debugging on jump_to_next 2021-03-29 18:42:36 +02:00
ptitSeb 6cb6605a63 Small change in start en end of emulated software 2021-03-29 18:41:38 +02:00
ptitSeb 6ad164d522 [DYNAREC] DynaMap is behind a strict mutex now 2021-03-29 18:39:00 +02:00
ptitSeb 19915ad238 Added syscall 57 2021-03-29 18:37:44 +02:00
ptitSeb 5e8fb55955 Goes with the new wrapped backtrace functions 2021-03-29 18:37:07 +02:00
ptitSeb d535bf35a8 Removed x64emu_t structure dedicated to signal handling, using main thread one now 2021-03-29 18:36:33 +02:00
ptitSeb 17d73a93f1 Some work around backtrace to try get symbol from stack frame (not sure it does work) 2021-03-29 18:35:39 +02:00
ptitSeb ac2f2516a2 [ARM64] Added a new arm64_lock_storeifref helper 2021-03-29 17:28:00 +02:00
ptitSeb 8994f9580c [DYNAREC] Small changes in F0 0F C7 opcode 2021-03-29 17:27:08 +02:00
ptitSeb 6013325637 Don't need to set FS here 2021-03-29 17:26:02 +02:00
ptitSeb ba19837104 Cosmetic change for F0 0F B1 opcode 2021-03-29 17:25:35 +02:00
ptitSeb 509a1bf56e Try to sistematicaly erase upper RAX on cmpxchg opcode 2021-03-29 17:24:32 +02:00
ptitSeb 5b07a475e1 [DYNAREC] Try to mitigate case of cmp/tst apparently 'for nothing' 2021-03-29 17:23:06 +02:00
ptitSeb bb97366338 Added wrapped wcstombs function 2021-03-29 11:24:19 +02:00
ptitSeb a527fdcc28 [DYNAREC] Added 0F C2 opcode 2021-03-29 11:23:36 +02:00
ptitSeb 5c3a4deed8 [DYNAREC] Added 0F 5D/5E/5F opcodes 2021-03-28 21:54:55 +02:00
ptitSeb 70b9bed510 [DYNAREC] Added 0F 18 opcodes 2021-03-28 21:43:01 +02:00
ptitSeb 37795375b6 [DYNAREC] Added F0 29 opcode 2021-03-28 21:25:18 +02:00
ptitSeb 903f9ddb41 [DYNAREC] Added F0 C7 opcode 2021-03-28 21:16:22 +02:00
ptitSeb 4b6ade050f Added wrapped asctime and friends 2021-03-28 19:21:34 +02:00
ptitSeb 02cfa0be7f Simply wrapped pthread_exit, don't force emu->quit to 1 2021-03-28 18:56:08 +02:00
ptitSeb da7a7a4d0e Removed a useless line in setjump wrapped function 2021-03-28 18:55:37 +02:00
ptitSeb 84a1b6976f [DYNAREC] Small optim on Native Call 2021-03-28 18:55:02 +02:00
ptitSeb 4d1641b321 [DYNAREC] Compute arm size of son block 2021-03-28 18:54:25 +02:00
ptitSeb ee561da549 Added more libc and pthreads wrapped functions 2021-03-28 15:54:51 +02:00
ptitSeb ba1493857f [DYNAREC] Improved Dynablock construction, stopping when overlaping block is detected 2021-03-28 15:08:55 +02:00
ptitSeb fb7a0318a0 [DYNAREC] Enhanced the special case of CMP follow by CALL handling (need to find a better solution) 2021-03-28 15:08:20 +02:00
ptitSeb 479ade9cb7 Fixed aio_suspend64 funciton signature 2021-03-28 14:32:41 +02:00
ptitSeb dfe62ceac8 Better Stack handling (backported from box86) 2021-03-28 14:31:11 +02:00
ptitSeb a36c9bfe73 A few more libc wrapped functions 2021-03-26 22:55:08 +01:00
ptitSeb a7119cae76 Added wrapped libudev0 and libudev1 2021-03-26 22:48:22 +01:00
ptitSeb c33368bfb4 Added 0F 18 opcode 2021-03-26 22:43:07 +01:00
ptitSeb 886999bc5b Added more libc wrapped functions 2021-03-26 22:40:12 +01:00
ptitSeb 1a750182d6 [DYNAREC] Added some more 66 0F opcodes, plus a few small bug fixes 2021-03-26 21:40:39 +01:00
ptitSeb 03a69053a6 Fixed a signature of an X11 wrapped function 2021-03-26 21:39:21 +01:00
ptitSeb 5788d4af1e Added more libc wrapped symbols 2021-03-26 20:13:12 +01:00
ptitSeb 517fe28806 Added a small batch of opcodes 2021-03-26 18:35:35 +01:00
ptitSeb b272bdb198 Added malloc_trim wrapped function 2021-03-26 17:57:44 +01:00
ptitSeb 910d22a532 Fixed Xutf8ResetIC signature 2021-03-26 17:55:04 +01:00
ptitSeb 2a85ea9c61 Added 64 66 0F D6 and 64 0F 29 opcodes 2021-03-26 17:48:51 +01:00
ptitSeb 3ee5c792d1 Fixed swprintf wrapping 2021-03-26 17:32:25 +01:00
ptitSeb 8e377ca074 Added DE opcodes 2021-03-26 17:05:57 +01:00
ptitSeb 451cfa521b Added DC opcodes 2021-03-26 15:43:38 +01:00
ptitSeb 6d02f7f897 Added a few more libc wrapped functions 2021-03-26 15:43:25 +01:00
ptitSeb 3e811f869e Added 66 0F 16/17 ocpode ([DYNAREC] too) 2021-03-26 15:42:54 +01:00
ptitSeb 1f17a57528 Set stack alignment to be 16bytes minimum 2021-03-26 15:27:52 +01:00
ptitSeb 8c2ea218a5 Added wrapped libdbus-1 2021-03-26 15:24:40 +01:00
ptitSeb 9f01b2ec0d Added wrapped libcups, plus some changes in wrapped libSDL2 and pthread 2021-03-26 14:42:50 +01:00
ptitSeb 86c5dfd664 Added (faked) crashhandler wrapped lib 2021-03-26 14:04:49 +01:00
ptitSeb c31aa8a78d Avoid to much much warning mesage when searching for a correct lib binary 2021-03-26 14:00:02 +01:00
ptitSeb 648d99c9e6 And one more wrapped libc function 2021-03-26 13:59:31 +01:00
ptitSeb cfe541e3ca Added alternative to __secure_getenv not always present in libc 2021-03-26 13:47:45 +01:00
ptitSeb b6faad0354 Added even more libc wrapped functions 2021-03-26 12:42:05 +01:00
ptitSeb 8aee3f4185 Added syscall 318 2021-03-26 12:41:20 +01:00
ptitSeb fe44725804 Added more libc and libfontconfig wrapped functions 2021-03-26 12:27:00 +01:00
ptitSeb 870e0872c0 Added F0 0F B0 opcode 2021-03-26 12:18:14 +01:00
ptitSeb 2874e30991 [DYNAREC] Fixed, again (for good) 66 0F 70 opcode 2021-03-26 12:13:37 +01:00
ptitSeb d92b46426c Added some more libc wrapped functions 2021-03-26 11:42:45 +01:00
ptitSeb 1c34edb857 Added syscall 13, 22, 157 and 217 2021-03-26 11:42:32 +01:00
ptitSeb aba3bcc81a Added 66 8D and 66 E8 opcode 2021-03-26 11:41:15 +01:00
ptitSeb 085529217e [DYNAREC] Fixed 66 0F 70 opcode 2021-03-26 11:40:25 +01:00
ptitSeb 50d8016e86 [DYNAREC] Added a small optim on 0F 57 opcode 2021-03-26 11:39:19 +01:00
ptitSeb 4a033b8e76 Added syscall 131 2021-03-26 10:01:55 +01:00
ptitSeb 4f5ad4b3ac Added wrapped __swprintf_chk function 2021-03-26 08:56:12 +01:00
ptitSeb 104d51df8c Added wrapped memalign and friends 2021-03-26 08:50:34 +01:00
ptitSeb 5c9ab0a27d Added 0F 6E opcode 2021-03-26 08:38:07 +01:00
ptitSeb 065d91cf9b Added 66 8B opcode (was already in dynarec) 2021-03-26 08:34:34 +01:00
ptitSeb acceb3155a Even more libc wrapped functions 2021-03-25 22:15:16 +01:00
ptitSeb 4130e0847c Minor fixes to MODRM decoder functions 2021-03-25 21:58:07 +01:00
ptitSeb 37a451a38e [DYNAREC] Fixed 8A opcode 2021-03-25 21:57:39 +01:00
ptitSeb dd26d06e1c Added wrapped libgnutls 2021-03-25 21:02:47 +01:00
ptitSeb 235784b46f Added wrapped libfontconfig and libfreetype, plus some elfloader/tls bugfix 2021-03-25 20:56:45 +01:00
ptitSeb 66af0f810c Fixed a bug on Interpretor with 64 prefixed opcodes 2021-03-25 20:55:44 +01:00
ptitSeb 72b60a2ab3 Fixed a potential issue with getAlignedMutex 2021-03-25 19:03:02 +01:00
ptitSeb 40e6f46013 Fixed to ElfLoader and TLS, Syscall, mmap & co functions signature and a few libc wrapped functions 2021-03-25 18:52:26 +01:00
ptitSeb a701ff87ec More libc wrapped symbols 2021-03-25 17:02:51 +01:00
ptitSeb 6e78bc1726 Added wrapped libICE and libSM plus a few more libc wrapped functions 2021-03-25 16:35:54 +01:00
ptitSeb 3b4181c616 [DYNAREC] Added 8A opcode 2021-03-25 16:24:09 +01:00
ptitSeb 2bd3fa6aa7 [DYNAREC] Added 66 0F 6D opcode 2021-03-25 16:12:03 +01:00
ptitSeb 4d0d971212 Small fix to avoid dereferencing a NULL x64emu_t structure 2021-03-25 16:11:32 +01:00
ptitSeb 1e451e3353 [DYNAREC] Added 0F 0B opcode 2021-03-25 15:50:02 +01:00
ptitSeb 207f829066 [DYNAREC] Added 86 opcode 2021-03-25 15:39:19 +01:00
ptitSeb f1fba8eb42 [DYNAREC] Fixed a nasty bug in GETGB macro 2021-03-25 15:39:04 +01:00
ptitSeb 146287331a [DYNAREC] Oops, fixed the mess with 66 REX 0F opcodes introduced earlier 2021-03-25 15:26:59 +01:00
ptitSeb 490dcac380 Small change in getAlignedMutex function (probably more work needed) 2021-03-25 15:20:05 +01:00
ptitSeb e8264eb0db A bit more libc wrapped function 2021-03-25 15:19:18 +01:00
ptitSeb 3c07dd58eb Added F3 0F BC opcode ([DYNAREC] too) 2021-03-25 15:06:48 +01:00
ptitSeb fcdd8fc383 Added some more libc wrapped functions 2021-03-25 14:41:11 +01:00
ptitSeb 0b56f5aebd Added wrapped libuuid 2021-03-25 14:14:31 +01:00
ptitSeb 178537116b Added a few more wrapped functions 2021-03-25 14:13:05 +01:00
ptitSeb 11cfae2a98 [DYNAREC] Added some mecanism to handle weird 66 REX mixing 2021-03-25 13:53:48 +01:00
ptitSeb 348bd64449 Added a bunch of X11 related wrapped libs 2021-03-25 13:26:02 +01:00
ptitSeb b36eca9792 [DYNAREC] Added F2 0F C2 opcode 2021-03-25 12:38:40 +01:00
ptitSeb 683b77c9bd Added some more libc wrapped function (and now SuperHexagon works fine) 2021-03-25 12:32:46 +01:00
ptitSeb 7809f23d4b Added wrapped libvorbis and libvorbisfile 2021-03-25 12:16:18 +01:00
ptitSeb 37a9549298 Added 2 more libc wrapped function 2021-03-25 11:55:01 +01:00
ptitSeb 8fa2368a63 Added wrapped libogg 2021-03-25 11:53:49 +01:00
ptitSeb 72ca99051b Improved shutdown sequence 2021-03-25 11:36:14 +01:00
ptitSeb 905e3ae583 Added a few more libc wrapped functions 2021-03-25 11:35:51 +01:00
ptitSeb 29be84ba47 Fixed longjmp wrapped function signature 2021-03-25 10:36:37 +01:00
ptitSeb 636c350461 Added wrapped mmap64 and friends 2021-03-25 10:34:10 +01:00
ptitSeb 89e305878b Fixed R_X86_64_64 handling is elfloader 2021-03-25 10:26:48 +01:00
ptitSeb 45873cc2b1 Added a bunch of libc wrapped functions 2021-03-25 09:44:36 +01:00
ptitSeb a32955ffec Fixed non-Dynarec build that would crash at start 2021-03-25 08:54:33 +01:00
ptitSeb 5b45f871df Start of a new dev. cycle 2021-03-25 08:53:54 +01:00
ptitSeb 17bc603077 Bumped to v0.0.6 2021-03-24 19:11:58 +01:00
ptitSeb 7af9158baa Added COMPILE and USAGE docs 2021-03-24 18:51:25 +01:00
ptitSeb 571a041c25 Updated Logo and Icon with newer version from @grayduck 2021-03-24 18:14:26 +01:00
ptitSeb 0a02340e35 [DYNAREC] Added 66 0F 12/13 opcodes 2021-03-24 16:58:26 +01:00
ptitSeb 12ee624358 [DYNAREC] Added 0F BA opcode 2021-03-24 16:49:27 +01:00
ptitSeb 571de7f07f [DYNAREC] Added F2 0F 2D opcodes, and use a simpler version of the conversions (but complex one is still available under a define in dynarec_arm64_helper.h) 2021-03-24 16:00:17 +01:00
ptitSeb b055c2be65 [DYNAREC] Refined 66 0F 5B with a switch for the rounding mode 2021-03-24 15:33:52 +01:00
ptitSeb 78750b96e5 [DYNAREC] Added 64 83 opcodes 2021-03-24 14:58:28 +01:00
ptitSeb ce51207e44 [DYNAREC] Added 64 89 opcodes 2021-03-24 14:52:27 +01:00
ptitSeb a3dcaf4284 [DYNAREC] Added F2 0F 5D/5F opcodes 2021-03-24 14:49:31 +01:00
ptitSeb 181274636e [DYNAREC] Added 66 0F DF opcode 2021-03-24 14:44:06 +01:00
ptitSeb c4198554ad [DYNAREC] Added 66 0F F8..FE opcodes 2021-03-24 14:42:20 +01:00
ptitSeb ed45a8d666 [DYNAREC] Added 66 0F DB opcode 2021-03-24 14:39:49 +01:00
ptitSeb 5a8b5c8af4 [DYNAREC] Added 64 C7 opcode 2021-03-24 14:37:51 +01:00
ptitSeb 1e3c599b4e [DYNAREC] Added 66 0F F4 opcode 2021-03-24 14:33:08 +01:00
ptitSeb 41ca58a403 [DYNAREC] Added 66 0F 64..66 opcodes 2021-03-24 14:03:27 +01:00
ptitSeb e09b18d3fb [DYNAREC] Added 66 0F EB opcode 2021-03-24 13:45:31 +01:00
ptitSeb 4b7958f447 [DYNAREC] Added 66 0F 7F opcode 2021-03-24 12:41:15 +01:00
ptitSeb b0b11572d7 [DYNAREC] Added 66 0F 6B 2021-03-24 12:38:18 +01:00
ptitSeb c1684db78a [DYNAREC] Added 66 0F 5B opcode 2021-03-24 12:19:06 +01:00
ptitSeb fdbdc615da [DYNAREC] Added 0F C8..CF opcodes 2021-03-24 12:07:29 +01:00
ptitSeb 5354a134fc [DYNAREC] Added 0F 12/13 opcodes 2021-03-24 11:56:07 +01:00
ptitSeb 800d3fd109 Back ported simplified pthread_once callback handling from box86 2021-03-24 11:47:53 +01:00
ptitSeb b7f8a1eb8b [DYNAREC] Fixed 0F 10 opcode 2021-03-24 11:47:31 +01:00
ptitSeb dbeea3b8a1 [DYNAREC] Added 0F 5C opcode 2021-03-23 22:49:02 +01:00
ptitSeb 888705c7dc [DYNAREC] Added 66 A9 opcode 2021-03-23 22:48:37 +01:00
ptitSeb d9e649c023 Added remove wrapped function to libc 2021-03-23 22:48:15 +01:00
ptitSeb 14da2a9a67 Added a few more libc wrapped functions 2021-03-23 22:42:08 +01:00
ptitSeb d7e712f48b Fixed mbsrtowcs function signature 2021-03-23 22:29:11 +01:00
ptitSeb 0f9b48d446 [DYNAREC] Fixed TRN_gen emitter 2021-03-23 22:21:33 +01:00
ptitSeb 6e90c47e74 [DYNAREC] Fixed 66 F2/F2 A5 opcode 2021-03-23 22:12:28 +01:00
ptitSeb 365d2b0eb2 Update Logo and Icon with a redish version, to more clearly separate with box86 2021-03-23 22:11:37 +01:00
ptitSeb 3642119665 [DYNAREC] Added F2 0F 7C opcode 2021-03-23 21:54:54 +01:00
ptitSeb 705cb79819 [DYNAREC] Added F3 0F 12/16 opcodes 2021-03-23 21:30:05 +01:00
ptitSeb d8e5c5372a Added a few more wrapped functions to libc 2021-03-23 21:17:57 +01:00
ptitSeb 714ccbc321 [DYNAREC] Fixed FMOD_register emitter 2021-03-23 21:06:37 +01:00
ptitSeb 0917fbe0c4 [DYNAREC] Added 66 (F2/F3) A5 opcode 2021-03-23 20:43:59 +01:00
ptitSeb 1517177668 [DYNAREC] Added 66 0F 71/72 opcodes 2021-03-23 20:27:14 +01:00
ptitSeb 2487fb4d98 [DYNAREC] Added 0F 58/59 opcodes, plus lots of small bugfix (IntoTheBreach sounds good now) 2021-03-23 20:12:11 +01:00
ptitSeb de0718811e [DYNAREC] Added 0F 5B opcode 2021-03-23 17:58:31 +01:00
ptitSeb 12b9b1a6e9 [DYNAREC] Added F0 00/01 opcodes 2021-03-23 17:48:00 +01:00
ptitSeb 1f819c4924 [DYNAREC] Added 66 0F 60/61/62 opcodes 2021-03-23 17:41:35 +01:00
ptitSeb 1d209596a3 [DYNAREC] Added 66 0F D4 opcode 2021-03-23 17:34:32 +01:00
ptitSeb b1d5e27564 [DYNAREC] Added (F2/F3) A4 opcode 2021-03-23 17:26:59 +01:00
ptitSeb 732f2f106b [DYNAREC] Added 0F 16/17 opcodes 2021-03-23 17:21:13 +01:00
ptitSeb db6319b90f [DYNAREC] Added 0F C6 opcode 2021-03-23 17:01:59 +01:00
ptitSeb 601eb63c9a [DYNAREC] Small optim on 66 0F 5A opcode 2021-03-23 16:45:59 +01:00
ptitSeb d237d5e807 [DYNAREC] Added 66 C1 opcodes 2021-03-23 16:44:01 +01:00
ptitSeb da47d34705 [DYNAREC] Added 0F AE opcode 2021-03-23 16:37:23 +01:00
ptitSeb ce5a5bf356 [DYNAREC] Added F2 0F 2C opcode 2021-03-23 16:23:26 +01:00
ptitSeb c754cb75b6 [DYNAREC] Added F2 0F 2A opcode 2021-03-23 16:13:32 +01:00
ptitSeb f084966fd3 [DYNAREC] Added 66 0F 6C opcode 2021-03-23 14:46:56 +01:00
ptitSeb 79dd8c29ae [DYNAREC] Added 66 C7 opcode 2021-03-23 14:42:50 +01:00
ptitSeb a260dff197 [DYNAREC] Added C9 opcode 2021-03-23 14:37:57 +01:00
ptitSeb f83179c665 [DYNAREC] Fixed 66 0F 73 opcodes 2021-03-23 14:33:30 +01:00
ptitSeb 31508f673c [DYNAREC] Added 66 0F 68/69/6A opcodes 2021-03-23 14:19:41 +01:00
ptitSeb a1f87da9f5 [DYNAREC] Added F3 0F 6F opcode 2021-03-23 14:10:04 +01:00
ptitSeb eb102f8a82 [DYNAREC] Added 66 0F 73 opcodes 2021-03-23 14:07:06 +01:00
ptitSeb e1a2439fbf [DYNAREC] Added 66 0F 70 opcode (tricky one) 2021-03-23 13:31:10 +01:00
ptitSeb 9fb2cb86ed [DYNAREC] Added 66 0F BE opcode 2021-03-23 12:25:54 +01:00
ptitSeb f6b646ef67 [DYNAREC] Added 66 85 opcode 2021-03-23 11:43:06 +01:00
ptitSeb 068025d919 [DYNAREC] Added FC/FD opcodes 2021-03-23 11:40:50 +01:00
ptitSeb f88f59926e [DYNAREC] Added F3 0F 5D opcode 2021-03-23 11:30:48 +01:00
ptitSeb c9d593fa17 [DYNAREC] Added F0 83 opcodes 2021-03-23 11:25:02 +01:00
ptitSeb ed452e81ae [DYNAREC] Improved CMPLESS accuracy 2021-03-23 11:03:55 +01:00
ptitSeb 604da55f08 [DYNAREC] Added F3 0F 5F opcode 2021-03-23 10:39:51 +01:00
ptitSeb 57a5d517c8 [DYNAREC] Added 66 B8..BF opcodes 2021-03-23 10:03:57 +01:00
ptitSeb 2b6fa580df [DYNAREC] Added F3 0F C2 opcode 2021-03-23 10:00:29 +01:00
ptitSeb 7f750e7ac1 [DYNAREC] Added (F2/F3) AA/AB opcodes 2021-03-23 09:43:36 +01:00
ptitSeb b9779c2184 [DYNAREC] Optimized F2/F3 A5 opcode 2021-03-23 09:35:21 +01:00
ptitSeb e52c207c75 [DYNAREC] Optimized F2/F3 AE/A6 opcodes 2021-03-23 09:29:50 +01:00
ptitSeb bfdcb023b3 Added Box64 Logo and Icon from @grayduck, and added some test to README 2021-03-23 07:45:35 +01:00
ptitSeb dce3292fc7 [DYNAREC] Added 0F BE/BF ocpodes, and fixed LDRSB emitter 2021-03-22 22:55:49 +01:00
ptitSeb 98a567e102 [DYNAREC] Fixed F2/F3 AE opcode and factorized F2/F3 A6/AE opcodes 2021-03-22 22:04:28 +01:00
ptitSeb d6123a87c5 [DYNAREC] More printers 2021-03-22 22:03:41 +01:00
ptitSeb f94ceccc8a [DYNAREC] Added (F2/F3) AE opcode 2021-03-22 21:16:42 +01:00
ptitSeb cc97914ed8 [DYNAREC] Added 66 0F 54/55/56/57 opcodes 2021-03-22 21:02:45 +01:00
ptitSeb 829be9e506 [DYNAREC] Added F0 0F C1 opcode 2021-03-22 21:00:03 +01:00
ptitSeb bea68ddbfa [DYNAREC] Added 66 0F 5A opcodes 2021-03-22 20:52:04 +01:00
ptitSeb fa039a1320 [DYNAREC] Added 66 0F 14/15 opcodes 2021-03-22 20:44:57 +01:00
ptitSeb cdaf19899e [DYNAREC] ARMv8 NEON doesn't require alignment 2021-03-22 20:09:39 +01:00
ptitSeb b5847d83cb [DYNAREC] Added 0F 5A opcode 2021-03-22 19:26:00 +01:00
ptitSeb 685cc7b0ba [DYNAREC] Added 0F 14/15 opcodes 2021-03-22 18:43:09 +01:00
ptitSeb b14be7f614 [DYNAREC] Added (F2/F3) A6 opcode 2021-03-22 18:27:03 +01:00
ptitSeb 35f8500acd [DYNAREC] Switched all other lock mecnism to LDAXR/STLXR 2021-03-22 17:54:43 +01:00
ptitSeb cb0cceb9ae [DYNAREC] Small option on REP MOVSD, and go back to LDAXR/STLXR for xchg (IntoTheBreach seems to prefer) 2021-03-22 17:51:04 +01:00
ptitSeb 1405d83a56 [DYNAREC] Various bugfixes 2021-03-22 17:35:38 +01:00
ptitSeb 0878acf04c [DYNAREC] Added (F2/F3) A5 opcode 2021-03-22 16:44:11 +01:00
ptitSeb 735d9c107d [DYNAREC] Added F2 0F 5A opcode 2021-03-22 16:14:59 +01:00
ptitSeb daf148c4d6 [DYNAREC] Added 0F 54 opcode 2021-03-22 16:03:15 +01:00
ptitSeb 922fa046bb [DYNAREC] Added 0F 55 opcode 2021-03-22 16:01:32 +01:00
ptitSeb b247fd04df [DYNAREC] Added 0F 56 opcode 2021-03-22 16:00:25 +01:00
ptitSeb 0b53a98648 [DYNAREC] Fixed and simplified F0 B1 opcdes, plus some other various small improvments (IntoTheBreach still unstable, the other 3 works fine) 2021-03-22 15:42:23 +01:00
ptitSeb f76fa67303 [DYNAREC] Fixed 66 3D opcode 2021-03-22 14:54:08 +01:00
ptitSeb e6d3812d6c [DYNAREC] Added C0 opcode 2021-03-22 14:21:51 +01:00
ptitSeb c02946a913 [DYNAREC] Added 66 83 opcode 2021-03-22 14:14:31 +01:00
ptitSeb 8ec2851439 [DYNAREC] Added 66 0F 6F opcode 2021-03-22 14:08:03 +01:00
ptitSeb f2c68385ab [DYNAREC] Fixed a bug in 0F 11 opcode 2021-03-22 14:07:47 +01:00
ptitSeb f428001f42 [DYNAREC] Added F3 0F 2C opcode 2021-03-22 14:00:04 +01:00
ptitSeb 83104b32b8 [DYNAREC] Added 98/99 opcodes 2021-03-22 13:55:00 +01:00
ptitSeb 1a12bd7269 [DYNAREC] Added A8/A9 opcodes 2021-03-22 13:28:24 +01:00
ptitSeb 04aa1af72e [DYNAREC] Added 64 8B opcodes, plus some fixes to FS access 2021-03-22 12:40:07 +01:00
ptitSeb 466a8cb107 [DYNAREC] Added 66 89/8B opcodes 2021-03-22 12:16:23 +01:00
ptitSeb 23c9d574d9 [DYNAREC] Added 64 31 opcode 2021-03-22 12:12:19 +01:00
ptitSeb 5cc73fdf40 [DYNAREC] Added F0 B1 opcode (and change LDAXR/STLXR to LDXR/STXR for eXclusive access) 2021-03-22 11:53:56 +01:00
ptitSeb 3cfd4c8ec2 [DYNAREC] Added 87 XCHG opcode 2021-03-22 09:45:59 +01:00
ptitSeb 9eb6d49616 [DYNAREC] Added B0..B7 opcodes, plus potential fix for 8D LEA on 32bits modes 2021-03-21 22:21:07 +01:00
ptitSeb 8bd81dffcf [DYNAREC] Complete 81/833 opcodes, plus various bugfixes 2021-03-21 22:08:58 +01:00
ptitSeb 79ca411d6a [DYNAREC] Added 0F 57 opcode 2021-03-21 20:48:14 +01:00
ptitSeb 9cdf1f9711 [DYNAREC] Added 66 0F D6 opcode 2021-03-21 20:37:54 +01:00
ptitSeb c8b6834a5e [DYNAREC] Added F3 0F 7E/7F opcodes 2021-03-21 20:37:25 +01:00
ptitSeb e15eb5a7f6 [DYNAREC] Optimized a bit Native call push/pop regs 2021-03-21 20:36:46 +01:00
ptitSeb 3d4acc3aef [DYNAREC] Foxed printer for STP/LDP 2021-03-21 20:35:49 +01:00
ptitSeb 1349601269 [DYNAREC] Added 88 opcode 2021-03-21 19:03:56 +01:00
ptitSeb 0751aed1f0 [DYNAREC] Small optim on MOVD type SSE opcodes 2021-03-21 18:56:50 +01:00
ptitSeb 4f2ed9ba62 [DYNAREC] Added 66 90 opcode 2021-03-21 18:48:16 +01:00
ptitSeb 707f41af39 [DYNAREC] Added F3 0F 10/11 opcodes 2021-03-21 18:17:43 +01:00
ptitSeb 3d400cf91b [DYNAREC] Fixed call_c helper with SSE args 2021-03-21 18:17:19 +01:00
ptitSeb a77093e154 [DYNAREC] Added 0F B6/B7 opcodes 2021-03-21 17:55:14 +01:00
ptitSeb 6676fe3b3b [DYNAREC] Added 0F 2E/2F opcodes 2021-03-21 17:41:08 +01:00
ptitSeb 1d85580fbc [DYNAREC] Added F3 0F 2A opcode 2021-03-21 17:29:59 +01:00
ptitSeb f01e987d31 [DYNAREC] Added C6 opcode 2021-03-21 16:12:03 +01:00
ptitSeb eb96a1c03a [DYNAREC] Added 63 opcode 2021-03-21 16:04:28 +01:00
ptitSeb e99387aa83 [DYNAREC] Added F3 0F 51/58/59/5C/5E opcodes 2021-03-21 15:57:07 +01:00
ptitSeb f8341bf934 [DYNAREC] Fixed Pop SSE Cache helper 2021-03-21 15:56:13 +01:00
ptitSeb 20ccf221a8 [DYNAREC] Added 84 TEST opcode 2021-03-21 15:36:09 +01:00
ptitSeb b98fe181e8 [DYNAREC] Added 0F 28/29 opcodes 2021-03-21 15:28:09 +01:00
ptitSeb 34eea95426 [DYNAREC] Fixed F2 0F opcodes (NEON reset high part of vector, SSE doesn't) 2021-03-21 15:27:45 +01:00
ptitSeb 5f470be79e [DYNAREC] Added 0F A2 CPUID opcode 2021-03-21 15:16:55 +01:00
ptitSeb 1c8683343b [DYNAREC] Added 66 0F 2E/2F opcodes 2021-03-21 15:09:35 +01:00
ptitSeb 56f37e8745 [DYNAREC] Added 66 0F EF opcode 2021-03-21 14:30:12 +01:00
ptitSeb 910a466fad [DYNAREC] Added F2 0F 51 opcode 2021-03-21 14:24:33 +01:00
ptitSeb d3a15b7ab6 [DYNAREC] Added F2 0F 5E opcode 2021-03-21 14:16:50 +01:00
ptitSeb cd8ee4c4b4 [DYNAREC] Added F2 0F 59 opcode 2021-03-21 14:11:57 +01:00
ptitSeb c253e4a48e [DYNAREC] Added F2 0F 5C opcode 2021-03-21 13:58:17 +01:00
ptitSeb 90bd5b0cb1 [DYNAREC] Added F2 0F 10/11 opcodes 2021-03-21 13:52:46 +01:00
ptitSeb fd729da8f1 [DYNAREC] Added F2 0F 58 opcode 2021-03-21 13:35:46 +01:00
ptitSeb 9bfc027b15 [DYNAREC] Added 66 0F 28/29 opcodes 2021-03-21 12:46:41 +01:00
ptitSeb cedd8e3670 [DYNAREC] Added 0F 10/11 opcodes 2021-03-21 12:02:18 +01:00
ptitSeb 3c31ecb115 [DYNAREC] Added 66 0F 6E/7E opcodes (firsts SSE one) 2021-03-21 11:03:08 +01:00
ptitSeb cc25976743 [DYNAREC] NEON infrastructure 2021-03-21 09:29:31 +01:00
ptitSeb 6fea5e5854 [DYNAREC] Optimized prolog/epilog/next with ldp/stp 2021-03-21 09:00:51 +01:00
ptitSeb bf6ac0d608 [DYNAREC] Added 67 E0..E3 opcodes 2021-03-21 08:47:04 +01:00
ptitSeb cb7c7ad913 [DYNAREC] Fixed 69 and 6B opcodes (and now IntoTheBreach runs again) 2021-03-20 23:33:28 +01:00
ptitSeb bd9cddf211 [DYNAREC] Fixed (again) test32 emitter 2021-03-20 23:07:47 +01:00
ptitSeb 3d33454564 [DYNAREC] Added 66 0F 40..4F CMOVcc opcodes 2021-03-20 22:51:52 +01:00
ptitSeb a70109be83 [DYNAREC] Added 6A PUSH opcode 2021-03-20 22:44:07 +01:00
ptitSeb 5ec0a88949 [DYNAREC] Added (66) 69/6B IMUL opcodes 2021-03-20 22:38:23 +01:00
ptitSeb 12de380799 [DYNAREC] Added (66) 0F AF IMUL opcode 2021-03-20 22:22:16 +01:00
ptitSeb 89a3c359a6 [DYNAREC] Added (66) 0F BC/BD opcodes 2021-03-20 21:54:51 +01:00
ptitSeb 848390d9eb [DYNAREC] Fixed and32 emitter and improved test32 emitter 2021-03-20 21:46:15 +01:00
ptitSeb 2f89043b35 [DYNAREC] Various bugfixes (and now the 4 tests games works again) 2021-03-20 21:11:49 +01:00
ptitSeb fcfd0d794b [DYNAREC] Added MOVN printer 2021-03-20 19:12:37 +01:00
ptitSeb dbd83a8b28 [DYNAREC] Fixed xor8 emitter, but ThimbleWeedPark is broken 2021-03-20 19:05:03 +01:00
ptitSeb 36d62235b3 [DYNAREC] Added 66 39/3B/3C CMP opcodes 2021-03-20 18:58:08 +01:00
ptitSeb 79c4c8bdd3 [DYNAREC] Added (66) 30..35 XOR opcodes 2021-03-20 18:47:50 +01:00
ptitSeb 6be2c376e2 [DYNAREC] Added (66) 28..2D SUB opcodes 2021-03-20 18:38:17 +01:00
ptitSeb db22d8b1c9 [DYNAREC] Added (66) 20..25 AND opcodes 2021-03-20 18:25:32 +01:00
ptitSeb e4fa7bc969 [DYNAREC] Added (66) 18..1D SBB opcodes 2021-03-20 18:13:18 +01:00
ptitSeb 98b0ac713d [DYNAREC] Added 66 11/13/15 ADC opcodes 2021-03-20 17:32:58 +01:00
ptitSeb 74eea34c6e [DYNAREC] Added 66 09/0B/0D OR opcodes 2021-03-20 17:25:50 +01:00
ptitSeb bbe817e3be [DYNAREC] Added 66 01..05 ADD opcodes 2021-03-20 17:19:21 +01:00
ptitSeb f53775ac39 [DYNAREC] Added 10..15 ADC opcodes 2021-03-20 17:04:51 +01:00
ptitSeb dfb1cd4876 Renamed arm64_lock_helper to arm64_lock 2021-03-20 16:49:02 +01:00
ptitSeb c2c34ccba3 [DYNAREC] Added 00/02/04 ADD and 08/0A/0C OR opcodes 2021-03-20 16:44:55 +01:00
ptitSeb c8d005af84 [DYNAREC] Added FE INC/DEC opcodes 2021-03-20 15:50:51 +01:00
ptitSeb 7c651088b5 [DYNAREC] Added 66 FF INC/DEC opcodes 2021-03-20 15:39:21 +01:00
ptitSeb 9a9d51440a [DYNAREC] Added F6 opcodes 2021-03-20 15:17:15 +01:00
ptitSeb 4b3e632d14 [DYNAREC] Added 66 F7 opcodes 2021-03-20 14:52:45 +01:00
ptitSeb b52b321969 [DYNAREC] Added F6 opcodes and fixed issue with native call that may destroy some registers 2021-03-20 12:45:22 +01:00
ptitSeb e5b36d2997 [DYNAREC] Added D0/D2 opcodes 2021-03-20 10:48:15 +01:00
ptitSeb cc2016bbc9 [DYNAREC] Added 66 D1/D3 opcodes 2021-03-20 10:34:00 +01:00
ptitSeb a68be9117b [DYNAREC] Added D3 opcodes, and fixed sl32/shl32c/shr32/shr32c emitter 2021-03-20 10:20:51 +01:00
ptitSeb f4fceb53bc [DYNAREC] Added ASR_REG printer 2021-03-20 09:51:03 +01:00
ptitSeb 495d566401 [DYNAREC] Small optim on MOV64xw / MOV64x / MOV32w macros 2021-03-20 09:50:44 +01:00
ptitSeb 7a056851d9 [DYNAREC] 0F A5 and 66 0F A4/A5 SHLD opcodes 2021-03-19 22:09:43 +01:00
ptitSeb 44eb9cf678 [DYNAREC] Added C7 MOV opcode 2021-03-19 21:47:48 +01:00
ptitSeb 597a56d0ff [DYNAREC] Added 0F AD and 66 0F AC/AD SHLD opcodes 2021-03-19 20:29:45 +01:00
ptitSeb 967132b04e [DYNAREC] Added 0F A3 and 66 0F A3 BT opcodes 2021-03-19 20:16:54 +01:00
ptitSeb 423795b49e [DYNAREC] Added 0F AB and 66 0F AB BTS opcodes 2021-03-19 20:13:52 +01:00
ptitSeb 27b7382be5 Added 0F B3 and 66 0F B3 BTR opcodes 2021-03-19 20:09:38 +01:00
ptitSeb 25d342f829 [DYNAREC] Added 66 0F BB opcode 2021-03-19 18:59:15 +01:00
ptitSeb f683404db9 [DYNAREC] Fixed 80/7 CMP opcode (and now, all 4 tests games works again) 2021-03-19 18:23:57 +01:00
ptitSeb d8c3c38d69 [DYNAREC] Added 38/3A/3C CMP opcodes, and fixed GETGB macro (still broken) 2021-03-19 17:37:22 +01:00
ptitSeb 0400bea3bd [DYNAREC] Added 0F 90..9F SETcc Eb opcode, and fixed GETEB macro (but WorldOfGoo still broken, didn't test the others 2021-03-19 17:15:28 +01:00
ptitSeb 10088c6566 [DYNAREC] Added 0F 80..8F Jcc Id opcodes (and factorised GOCOND macro) 2021-03-19 16:50:27 +01:00
ptitSeb a2abb4e8b1 [DYNAREC] Added 90 NOP 2021-03-19 16:19:40 +01:00
ptitSeb f1625c0d92 [DYNAREC] Added 68 PUSH Id and fixed 80/7 cmp (but ThimbleweedPark, IntoTheBreach and WorldOfGoo are still broken, vvvvv works) 2021-03-19 16:16:23 +01:00
ptitSeb 5c4b0baf8b [DYNAREC] 0F 40..4F CMOVcc opcodes 2021-03-19 10:13:00 +01:00
ptitSeb af1b5a9a51 [DYNAREC] Added 80 opcodes 2021-03-19 09:49:03 +01:00
ptitSeb f5a7e63936 [DYNAREC] Added 0F BB BTC opcode 2021-03-18 18:48:42 +01:00
ptitSeb 13da8f0d75 [DYNAREC] Fixed GETED delta computation (fixing IntoTheBreach and ThimbleweedPark) 2021-03-18 18:27:53 +01:00
ptitSeb adea4ceef2 [DYNAREC] Fixed PF flags computation 2021-03-18 17:35:39 +01:00
ptitSeb cc85f79322 [DYNAREC] Added more printer 2021-03-18 17:35:13 +01:00
ptitSeb c22782d2ab [DYNAREC] Added 9B/9C/9D FWAIT/PUSHF/POPF opcodes 2021-03-18 17:03:16 +01:00
ptitSeb 994a575d32 [DYNAREC] Added B8..BF opcodes 2021-03-18 16:55:50 +01:00
ptitSeb 39faa1538d [DYNAREC] Added 83/1 83/4 83/6 and 83/7 opcodes 2021-03-18 16:48:56 +01:00
ptitSeb 153343fa9e [DYNAREC] Added 39/3B/3D CMP opcodes 2021-03-18 16:41:16 +01:00
ptitSeb 0d3e9f21ee [DYNAREC] Added 66 0F 1F NOP 2021-03-18 16:17:20 +01:00
ptitSeb 8c01412156 [DYNAREC] Added D1 opcodes 2021-03-18 16:08:36 +01:00
ptitSeb bd46fd7d4f [DYNAREC] Fixed and32 emiter and some printer (vvvvvv works, but still not IntoTheBreach) 2021-03-18 16:03:08 +01:00
ptitSeb cb25e077f9 [DYNAREC] Added CC 'Native call' and 0F 1F NOP opcodes 2021-03-18 15:08:26 +01:00
ptitSeb 0551f13f0e Fixed Protection handling 2021-03-18 15:07:53 +01:00
ptitSeb 0965273711 Improvments to bridge handling to avoid deadlock 2021-03-18 15:07:27 +01:00
ptitSeb dd9e8ae8ff [DYNAREC] Added 09/0B/0D OR and 21/23/25 AND opcodes 2021-03-18 12:18:30 +01:00
ptitSeb f08bc7846a Added 31/33/35 XOR opcodes 2021-03-18 12:14:45 +01:00
ptitSeb bac90cfe57 Added C1 opcodes anda few bugfix (no changes in vvvvvv and IntoTheBreach issues) 2021-03-18 11:33:49 +01:00
ptitSeb 6547166c2d Added 8A opcode 2021-03-18 10:33:43 +01:00
ptitSeb 5a07587437 [DYNAREC] Added C2 RETN and C3 RET opcodes 2021-03-17 17:07:04 +01:00
ptitSeb 6a14d26c1d [DYNAREC] Added 01/03/05/83 /0 ADD opcodes, plus various bugfixes (but vvvvvv and IntoTheBreach are still broken, Thimberweed and WorldOfGoo seems ok) 2021-03-17 17:01:00 +01:00
ptitSeb 477617240a [DYNAREC] Added FF opcodes 2021-03-17 12:58:20 +01:00
ptitSeb e8d2b6d25d Excplicit handling of bit size for defered flags 2021-03-17 11:17:49 +01:00
ptitSeb d1a037b38b [DYNAREC] Small optim for MOV64x on negative values 2021-03-17 10:17:50 +01:00
ptitSeb a552e5a48f [DYNAREC] Various fixes, around GETED and other stuff (vvvvvv.x86_64 works again) 2021-03-17 10:11:11 +01:00
ptitSeb b553c3f3ac [DYNAREC] Added 70..7F opcodes (and fixed ORR/AND bitmask coding/decoding, that's some convoluted encoding here) 2021-03-16 20:32:37 +01:00
ptitSeb 551542f99a [DYNAREC] Added 85 opcode 2021-03-16 16:37:37 +01:00
ptitSeb 1e5bfcdbcd [DYNAREC] Added an optimisation with RIP handling 2021-03-16 16:08:48 +01:00
ptitSeb c1b6cb7302 [DYNAREC] Added 8B opcode 2021-03-16 15:45:02 +01:00
ptitSeb 70f5003784 [DYNAREC] Small optimisation on Native call 2021-03-16 14:54:33 +01:00
ptitSeb c2a0d7bc32 [DYNAREC] Added a few more opcodes, some arm64_printer opcodes, and made sure it works 2021-03-16 14:34:44 +01:00
ptitSeb 34c1fec8f7 [DYNAREC] Added 2D and 83 /5 opcodes 2021-03-15 17:35:52 +01:00
ptitSeb 14ec226747 Added 29 opcode 2021-03-15 17:14:51 +01:00
ptitSeb aebad0cf18 [DYNAREC] Added 89 and 8D opcodes 2021-03-15 15:56:58 +01:00
ptitSeb ecac60f4c9 [DYNAREC] Added REX 50..5F opcodes 2021-03-15 15:41:22 +01:00
ptitSeb 21f8b852f2 [DYNAREC] Beggining of emitter and dynarec infrastructure (untested yet) 2021-03-15 15:36:30 +01:00
ptitSeb 4919f161cc [DYNAREC] Added Basic blocks for dynarec 2021-03-14 17:58:04 +01:00
ptitSeb 3dda84e58b Fixed a few minor leaks 2021-03-13 16:43:15 +01:00
ptitSeb 0823bfaed2 Added custom memory handling 2021-03-13 16:40:44 +01:00
ptitSeb 3bcb72a083 Start of a new dev. cycle 2021-03-13 16:10:44 +01:00
ptitSeb 634f3c0f58 Bumped to v0.0.4 2021-03-13 14:11:17 +01:00
ptitSeb f3d3a8a8ed Added wrapped libalut and libalure 2021-03-13 14:10:42 +01:00
ptitSeb 721038513f Wrapped some more functions 2021-03-13 13:47:30 +01:00
ptitSeb 195efffa15 Added a few more SSE opcodes 2021-03-13 13:47:17 +01:00
ptitSeb ae4f43fdb9 Added many wrapped function, and fixed a few one too 2021-03-13 13:11:06 +01:00
ptitSeb 4ce40ad239 Added a few opcodes 2021-03-13 10:45:20 +01:00
ptitSeb ca345d7f55 Added SDL2_mixer, SDL2_image, SDL2_ttf2 and SMPEG2 wrapped libs, plus a few more libc wrapped functions 2021-03-13 10:06:12 +01:00
ptitSeb 066410a31d Fixed some 32bits versio of F7 opcodes 2021-03-13 10:05:25 +01:00
ptitSeb 30e8fa9620 Added a few libc wrapped functions 2021-03-13 09:29:49 +01:00
ptitSeb 64826243dd Added a bunch of SSE opcodes 2021-03-13 09:26:42 +01:00
ptitSeb 2357057bb5 Added wrapped qsort and qsort_r functions 2021-03-12 22:57:49 +01:00
ptitSeb c257075df0 Added wrapped libpulse and libpulsesimple 2021-03-12 22:47:55 +01:00
ptitSeb b1fa994d82 Added F0 00..35 opcodes 2021-03-12 22:47:37 +01:00
ptitSeb 56daf71a86 Added nanosleep wrapped function 2021-03-12 22:33:55 +01:00
ptitSeb 4ac26b61b3 Fixed pthread_attr_setstacksize to avoid setting too small stack on some platforms. Also added pthread_setschedparam 2021-03-12 22:30:13 +01:00
ptitSeb cd3a042776 Fixed issue with XMM 'GETGX' modrm and REX.b 2021-03-12 20:38:07 +01:00
ptitSeb 7fd7479b84 Fixed some warning with modrm on 67 32bits prefix 2021-03-12 18:58:50 +01:00
ptitSeb 9a8c07faf5 Added a bunch of SSE2 opcodes 2021-03-12 18:56:00 +01:00
ptitSeb 335777a681 Added a large number of CPU opcodes 2021-03-12 16:38:54 +01:00
ptitSeb 9479d7ae07 Added more x87 opcodes 2021-03-11 20:21:11 +01:00
ptitSeb 4827427ac0 Added alignment for 'long double' handling in '...' 2021-03-11 19:03:28 +01:00
ptitSeb 8e732046ba Added some SSE2 and x87 opcodes 2021-03-11 17:55:16 +01:00
ptitSeb f08b88cce5 Added 67 E0..E3 opcodes 2021-03-11 17:47:14 +01:00
ptitSeb 5a244911cc Added and fixed many opcodes 2021-03-10 20:44:00 +01:00
ptitSeb 02161dc4d7 Better functions name resolving when using TRACE, and fixed some printf stuff again 2021-03-10 18:02:21 +01:00
ptitSeb a62f686024 Added a bunch of various opcodes 2021-03-10 11:33:15 +01:00
ptitSeb 1b09e8a6b0 Added 66 REX F7 opcodes 2021-03-10 10:32:28 +01:00
ptitSeb 23917fa07e Added 66 D1/D3 opcodes 2021-03-10 10:22:36 +01:00
ptitSeb 0a7963588e Fixed the already wrapped non-valist __Xprintf_chk functions 2021-03-10 10:14:34 +01:00
ptitSeb 42d281bfe3 Wrapped system function 2021-03-10 09:33:46 +01:00
ptitSeb 5e28ebef06 Wrapped some more libc funcs 2021-03-10 09:28:52 +01:00
ptitSeb 3fa01e53b9 Wrapped sprintf 2021-03-10 09:25:19 +01:00
ptitSeb ecac1815db A handfull libc wrapped functions 2021-03-09 22:08:04 +01:00
ptitSeb 79f365753e Added fdopen and fdopendir 2021-03-09 21:58:00 +01:00
ptitSeb 64b7198144 Added uname, ungetc, ungetwc, unlink and __underflow wrapped functions 2021-03-09 21:55:07 +01:00
ptitSeb f3743b6599 Added statfs64 fstatfs64 and _IO_xxxx wrapped functions 2021-03-09 21:51:08 +01:00
ptitSeb 8a0af31a49 Added 66 39/3B/3D CMP opcodes 2021-03-09 21:25:52 +01:00
ptitSeb 044b88dbce Added 6A and 6B opcodes 2021-03-09 21:19:15 +01:00
ptitSeb acf06e6a94 Add freopen wrapped functions 2021-03-09 21:07:21 +01:00
ptitSeb c8922d2efd A __printf_chk wrapped functions 2021-03-09 21:03:21 +01:00
ptitSeb 3786e7569d A few sigXXX wrapped functions 2021-03-09 21:00:50 +01:00
ptitSeb 70ad747a9c Aligned struct stat64 for fxstat(64) also 2021-03-09 20:36:49 +01:00
ptitSeb ce322774d8 Added waitpid and dl_iterate_phdr wrapped functions 2021-03-09 20:29:03 +01:00
ptitSeb 7309be6339 Added 66 64 8B opcode 2021-03-09 19:51:47 +01:00
ptitSeb 5edc83c556 Added more byte to UnImp opcode message 2021-03-09 19:45:23 +01:00
ptitSeb 2c86fb8c73 Add handling of multiple 66 prefix 2021-03-09 19:37:37 +01:00
ptitSeb 25937c5b73 Alignement of struct stat / stat64 2021-03-09 19:35:00 +01:00
ptitSeb 43833df092 Try to reduce the amount of log volume 2021-03-09 18:43:05 +01:00
ptitSeb 93c19dc3f8 Added kill and killpg wrapped functions 2021-03-09 18:37:44 +01:00
ptitSeb a4e53b929b Added some more SSE opcodes 2021-03-09 18:32:32 +01:00
ptitSeb 18534d56e2 Added clock wrapped function 2021-03-09 18:26:22 +01:00
ptitSeb fd35361614 Added F3 0F C2 opcode 2021-03-09 18:23:30 +01:00
ptitSeb 85dfd5b978 More wrapped libc functions 2021-03-09 18:20:32 +01:00
ptitSeb b23fcc83c1 Added more various opcodes 2021-03-09 18:02:39 +01:00
ptitSeb d625cf68e5 Added strtol wrapped function 2021-03-09 17:52:07 +01:00
ptitSeb b7683b77a7 Added a bunch of various opcodes 2021-03-09 17:50:34 +01:00
ptitSeb 3b81d44491 Fixed an issue with SDL Thread Creation 2021-03-09 17:32:57 +01:00
ptitSeb 949bbb40eb A large batch of wrapped libc functions 2021-03-09 17:21:53 +01:00
ptitSeb 5ce5951f5d Added REX 0F BA opcodes 2021-03-09 16:30:04 +01:00
ptitSeb 09428c185e More libc wrapped functions 2021-03-09 16:22:25 +01:00
ptitSeb ad1bfc57b4 Fixed typo in an error message 2021-03-09 16:19:27 +01:00
ptitSeb b971a37ee3 Added sdl1mixer, sdl1image, sdl1ttd, sdl1smpeg and libz wrapped libs 2021-03-09 16:18:38 +01:00
ptitSeb 3ca6ac6145 Added more libc wrapped functions 2021-03-09 15:26:34 +01:00
ptitSeb c2f4ce9c5a Fixed XOpenIM wrapped function signature 2021-03-09 15:26:19 +01:00
ptitSeb 66fee75fc2 Added some more libc wrapped functions 2021-03-09 15:02:25 +01:00
ptitSeb 367e4ac3f7 pthread_mutex_t is larger on ARM64 than on x86_64, that's unfortunate, but all mutex based function need alignements 2021-03-09 14:53:24 +01:00
ptitSeb 094f961a0a Added 66 0F 7F opcode 2021-03-09 14:07:01 +01:00
ptitSeb be676d7fa6 Added a few libc wrapped functions 2021-03-09 14:03:04 +01:00
ptitSeb 32d92866e9 Added REX 0F 5A..5F opcodes 2021-03-09 14:00:36 +01:00
ptitSeb de8a3de7ae Added some more libc wrapped functions 2021-03-09 09:34:31 +01:00
ptitSeb cdd33ffec4 Added some phtreads wrapped functions 2021-03-09 09:26:07 +01:00
ptitSeb 340bdb0b6c Added REX 0F C8..CF BSWAP opcodes 2021-03-09 09:20:17 +01:00
ptitSeb 7f4762e632 Added a few more libc wrapped functions 2021-03-09 09:13:22 +01:00
ptitSeb 22b4b9c18d Remove isCpuTopology function call to the open wrapped functions that is not needed 2021-03-08 21:38:42 +01:00
ptitSeb d31a6c0ba6 Fixed F2/F3 A6/AE opcodes 2021-03-08 21:36:01 +01:00
ptitSeb 59779aea37 Added (F2/F3) A6 (REPNZ/REPZ) CMPSB 2021-03-08 21:30:04 +01:00
ptitSeb 50fa1046c7 Switched emu flags to 64bits 2021-03-08 21:26:37 +01:00
ptitSeb 0e958fed2e Added sigismember wrapped function 2021-03-08 21:25:04 +01:00
ptitSeb def0f3564c Added more wrapped functions to libc and libpthread 2021-03-08 21:23:44 +01:00
ptitSeb 7da2c56d0a Added a few more libc wrapped libs 2021-03-08 21:11:37 +01:00
ptitSeb 1321431812 Added (F2/F3) AE (REPNZ/REPZ) SCASB opcode 2021-03-08 21:07:56 +01:00
ptitSeb d93a243738 Added a few more libc wrapped functions 2021-03-08 20:48:08 +01:00
ptitSeb fa24bbd96a Added wrapped vfprintf and fprintf functions 2021-03-08 20:41:51 +01:00
ptitSeb 5eca802a5a [TRACE] Trace is not displaying relative offsets for now, preparing functions 2021-03-08 20:41:16 +01:00
ptitSeb 89d6f73aff Added special case for stdin/stdout/stderr in elfloader R_X86_64_COPY handling 2021-03-08 20:40:32 +01:00
ptitSeb 0bb2043f97 Fixed va_list conversion for aarch64 2021-03-08 18:45:29 +01:00
ptitSeb 62c22e55e7 Attempts at conversion of va_list 2021-03-08 18:34:07 +01:00
ptitSeb 23eef578f7 Added a few libc wrapped functions 2021-03-08 17:14:42 +01:00
ptitSeb ce8a482a62 Added 66 85 TEST opcode 2021-03-08 17:10:17 +01:00
ptitSeb 76f5319b05 Fixed a few wrapped functions 2021-03-08 17:07:45 +01:00
ptitSeb 448e5155a4 Fixed non-REX.W 8D LEA opcode 2021-03-08 17:07:14 +01:00
ptitSeb 3ee26b727c Added another batch of wrapped x11 related lib (still un-tested copy from box86) 2021-03-08 16:27:55 +01:00
ptitSeb 544a496f08 Added a bunch of X11 related lib (copy from box86, mostly un-verified) 2021-03-08 16:21:33 +01:00
ptitSeb 14f0497e64 Added 0F AE /2 and /3 opcodes 2021-03-08 16:04:47 +01:00
ptitSeb 9ab80d228b Added sysv_signal wrapped function 2021-03-08 16:01:20 +01:00
ptitSeb 3f4599e562 Added A8 TEST opcode 2021-03-08 15:59:31 +01:00
ptitSeb 973714b4cc Added 66 0F 54..5F opcodes 2021-03-08 15:57:17 +01:00
ptitSeb bb3458e26b Added memrchr and memcpy wrapped functions 2021-03-08 15:55:10 +01:00
ptitSeb 0692d4f3f2 Added 66 0F 2E/2F opcodes 2021-03-08 15:53:48 +01:00
ptitSeb 7a08d50f18 Added sigaction and ceil wrapped functions 2021-03-08 15:52:11 +01:00
ptitSeb 987e6e03f1 Added more opcodes, including D8 and DD x87 ones 2021-03-08 15:50:24 +01:00
ptitSeb 5004513596 More 0F and 66 0F opcodes 2021-03-08 15:40:17 +01:00
ptitSeb 749961af32 Added a gew more various opcodes 2021-03-08 15:23:09 +01:00
ptitSeb eda8b442e0 Added wrapped libasound 2021-03-08 15:02:33 +01:00
ptitSeb 9d0e59b31c Added wrapped libX11 2021-03-08 11:24:03 +01:00
ptitSeb 1771694ee1 Wrapped function SDL_LogXXXX needs va_list 2021-03-07 20:33:08 +01:00
ptitSeb 85d16af0d0 Wrapped SDL_LogXXXX function correctly 2021-03-07 20:31:13 +01:00
ptitSeb a80c739067 Disabled va_list wrapped function in SDL2, wrapping is not done yet 2021-03-07 20:27:31 +01:00
ptitSeb 73b2eb4a72 Added a few SSE opcodes 2021-03-07 20:23:59 +01:00
ptitSeb 4c7cbe4128 Added wrapped libSDL1.2, libSDL2.0, libGL, libGLU and libopenal 2021-03-07 20:19:58 +01:00
ptitSeb 343174fd47 Default log level to INFO for now 2021-03-07 17:36:07 +01:00
ptitSeb 3c20930550 Some cosmetic refinement to signal handling 2021-03-07 17:18:20 +01:00
ptitSeb 0e109a9e33 Start of a new dev.cycle 2021-03-07 17:16:31 +01:00
1148 changed files with 168867 additions and 8427 deletions

No files matched your search

+12
View File
@@ -0,0 +1,12 @@
# These are supported funding model platforms
github: ptitSeb
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: paypal.me/0ptitSeb
+95
View File
@@ -0,0 +1,95 @@
### Manual build Box64 with Github Action
name: Custom build Box64
on:
workflow_dispatch:
inputs:
platform:
description: 'Target platform name'
required: true
default: 'GENERIC_ARM'
type: choice
options:
- X64
- GENERIC_ARM
- PHYTIUM
- RK3326
- RK3399
- RK3588
- RPI4ARM64
- SD845
- TEGRAX1
build_type:
description: 'Build type'
required: true
default: 'RelWithDebInfo'
type: choice
options:
- RelWithDebInfo
- Release
- Debug
- MinSizeRel
dynarec:
description: 'Enable dynarec'
required: false
default: 'true'
type: boolean
trace:
description: 'Enable trace'
required: false
default: 'false'
type: boolean
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: "Checkout Box64 Repository"
uses: actions/checkout@v2
- name: "Environment preparation"
run: |
sudo apt-get update
if [[ ${{ github.event.inputs.platform }} != 'X64' && ${{ github.event.inputs.platform }} != 'GENERIC_ARM' ]]; then
echo "BOX64_PLATFORM_MARCRO=-D${{ github.event.inputs.platform }}=1" >> $GITHUB_ENV
echo "BOX64_COMPILER=aarch64-linux-gnu-gcc" >> $GITHUB_ENV
sudo apt-get -y install git gcc-aarch64-linux-gnu cmake make python3
else
if [[ ${{ github.event.inputs.platform }} == 'X64' ]]; then
echo "BOX64_PLATFORM_MARCRO=-DLD80BITS=1 -DNOALIGN=1" >> $GITHUB_ENV
echo "BOX64_COMPILER=gcc" >> $GITHUB_ENV
sudo apt-get -y install git cmake make python3
else
echo BOX64_PLATFORM_MARCRO="-DARM_DYNAREC=ON" >> $GITHUB_ENV
echo "BOX64_COMPILER=aarch64-linux-gnu-gcc" >> $GITHUB_ENV
sudo apt-get -y install git gcc-aarch64-linux-gnu cmake make python3
fi
fi
- name: "Display Build info"
run: |
echo "CMake Platform Macro: ${{ env.BOX64_PLATFORM_MARCRO }}"
echo "CMake C Compiler: ${{ env.BOX64_COMPILER }}"
echo "Build type: ${{ github.event.inputs.build_type }}"
echo "Dynarec Enabled: ${{ github.event.inputs.dynarec }}"
echo "Trace Enabled: ${{ github.event.inputs.trace }}"
- name: "Build Box64"
run: |
mkdir build
cd build
cmake .. -DCMAKE_C_COMPILER=${{ env.BOX64_COMPILER }} ${{ env.BOX64_PLATFORM_MARCRO }}\
-DCMAKE_BUILD_TYPE=${{ github.event.inputs.build_type }}\
-DARM_DYNAREC:BOOL=${{ github.event.inputs.dynarec }}\
-DHAVE_TRACE:BOOL=${{ github.event.inputs.trace }}\
-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON
make -j$(nproc) VERBOSE=1
- name: "Upload Artifact"
uses: actions/upload-artifact@v2
with:
name: box64-${{ github.event.inputs.platform }}-${{ github.event.inputs.build_type }}
path: build/box64
+104
View File
@@ -0,0 +1,104 @@
### Auto build Box64 and release its binary with Github Action
name: Build and Release Box64
on:
workflow_dispatch:
release:
push:
paths:
- "**/*.c"
- "**/*.h"
- "**/*.S"
- "**/*.py"
- "CMakeLists.txt"
- "**/*.yml"
pull_request:
types: [assigned, opened, synchronize, reopened]
paths:
- "**/*.c"
- "**/*.h"
- "**/*.S"
- "**/*.py"
- "CMakeLists.txt"
- "**/*.yml"
jobs:
build:
strategy:
fail-fast: false
matrix:
platform: [X64, OTHER_ARM, RISCV, RPI4ARM64, RK3326, RK3399, RK3588, PHYTIUM, SD845]
type: [Release, Trace]
os: [ubuntu-latest]
include:
- platform: TEGRAX1
type: Release
os: ubuntu-20.04
- platform: TEGRAX1
type: Trace
os: ubuntu-20.04
runs-on: ${{ matrix.os }}
steps:
- name: "Checkout Box64 Repository"
uses: actions/checkout@v3
- name: "Environment preparation"
run: |
sudo apt-get update
if [[ ${{ matrix.platform }} != 'X64' && ${{ matrix.platform }} != 'OTHER_ARM' && ${{ matrix.platform }} != 'RISCV' ]]; then
echo "BOX64_PLATFORM_MARCRO=-D${{ matrix.platform }}=1" >> $GITHUB_ENV
echo "BOX64_COMPILER=aarch64-linux-gnu-gcc" >> $GITHUB_ENV
sudo apt-get -y install git gcc-aarch64-linux-gnu cmake make python3
else
if [[ ${{ matrix.platform }} == 'X64' ]]; then
echo "BOX64_PLATFORM_MARCRO=-DLD80BITS=1 -DNOALIGN=1" >> $GITHUB_ENV
echo "BOX64_COMPILER=gcc" >> $GITHUB_ENV
sudo apt-get -y install git cmake make python3
elif [[ ${{ matrix.platform }} == 'RISCV' ]]; then
echo BOX64_PLATFORM_MARCRO="-DRV64=ON" >> $GITHUB_ENV
echo "BOX64_COMPILER=riscv64-linux-gnu-gcc" >> $GITHUB_ENV
sudo apt-get -y install git gcc-riscv64-linux-gnu cmake make python3
else
echo BOX64_PLATFORM_MARCRO="-DARM_DYNAREC=ON" >> $GITHUB_ENV
echo "BOX64_COMPILER=aarch64-linux-gnu-gcc" >> $GITHUB_ENV
sudo apt-get -y install git gcc-aarch64-linux-gnu cmake make python3
fi
fi
if [[ ${{ matrix.type }} == 'Release' ]]; then
echo BOX64_BUILD_TYPE=Release >> $GITHUB_ENV
echo BOX64_HAVE_TRACE=0 >> $GITHUB_ENV
else
echo BOX64_BUILD_TYPE=RelWithDebInfo >> $GITHUB_ENV
echo BOX64_HAVE_TRACE=1 >> $GITHUB_ENV
fi
- name: "Display Build info"
run: |
echo "CMake Platform Macro: ${{ env.BOX64_PLATFORM_MARCRO }}"
echo "CMake C Compiler: ${{ env.BOX64_COMPILER }}"
echo "Build type: ${{ env.BOX64_BUILD_TYPE }}"
echo "Trace Enabled: ${{ env.BOX64_HAVE_TRACE }}"
- name: "Build Box64"
run: |
mkdir build
cd build
cmake .. -DCMAKE_C_COMPILER=${{ env.BOX64_COMPILER }}\
${{ env.BOX64_PLATFORM_MARCRO }}\
-DCMAKE_BUILD_TYPE=${{ env.BOX64_BUILD_TYPE }}\
-DHAVE_TRACE=${{ env.BOX64_HAVE_TRACE }}\
-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON
make -j$(nproc) VERBOSE=1
- name: "Test Box64"
if: ${{ matrix.platform == 'X64' }}
run: |
cd build
ctest -j$(nproc)
- name: "Upload Artifact"
uses: actions/upload-artifact@v3
with:
name: box64-${{ matrix.platform }}-${{ matrix.type }}
path: build/box64
+6
View File
@@ -55,7 +55,13 @@ dkms.conf
build/
build*/
.vscode
.cache
.gdb_history
src/git_head.h
backup/
# LLVMprivateGenerator
/LLVMprivateGenerator/*
!/LLVMprivateGenerator/Makefile
!/LLVMprivateGenerator/main.cpp
!/LLVMprivateGenerator/registered_structs.cpp
Executable
+24
View File
@@ -0,0 +1,24 @@
language: c
arch:
- amd64
- arm64-graviton2
os: linux
dist: focal
compiler:
- gcc
addons:
apt:
packages:
- python3
#Build steps
before_script:
- mkdir build
- cd build
- if [ "$TRAVIS_CPU_ARCH" = "arm64" ]; then cmake .. -DRK3399=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo ; else cmake .. -DLD80BITS=1 -DNOALIGN=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo ; fi
script:
- make
- ctest --output-on-failure
-7
View File
@@ -1,7 +0,0 @@
Current version
======
* Using box86 as a base, implemented most planned box64 part except dyanrec
* Wrapped a few libs
* ELF loader a bit crude, but seems working
* Signal handling implemented
* MMX and x87 are sharing their registers
+594 -67
View File
@@ -1,12 +1,75 @@
cmake_minimum_required(VERSION 3.0)
cmake_minimum_required(VERSION 3.4)
cmake_policy(SET CMP0065 NEW)
SET(CMAKE_C_FLAGS_DEBUG "-O0 -g")
SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
option(RPI3ARM64 "Set to ON if targeting an RaspberryPI3 device with multiarch arm64 and armhf" ${RPI3ARM64})
option(RPI4ARM64 "Set to ON if targeting an RaspberryPI4 device with multiarch arm64 and armhf" ${RPI4ARM64})
option(RK3326 "Set to ON if targeting an Rockchip RK3326 based device" ${RK3326})
option(RK3399 "Set to ON if targeting an Rockchip RK3399 based device" ${RK3399})
option(RK3588 "Set to ON if targeting an Rockchip RK3588(S) based device" ${RK3588})
option(ODROIDN2 "Set to ON if targeting an Odroid-N2 device" ${ODROIDN2})
option(TEGRAX1 "Set to ON if targeting an Tegra X1 based device" ${TEGRAX1})
option(PHYTIUM "Set to ON if targeting an Phytium (D2000 or FT2000/4) based device" ${PHYTIUM})
option(SD845 "Set to ON if targeting a Snapragon 845 based device" ${SD845})
option(M1 "Set to ON if targeting a AppleM1 running on Asahi computer" ${M1})
option(LARCH64 "Set to ON if targeting an Loongarch64 based device" ${LARCH64})
option(RV64 "Set to ON if targeting an RISC-V RV64GC based device" ${RV64})
option(PPC64LE "Set to ON if targeting an PowerPC 64 LE based device" ${PPC64LE})
option(LX2160A "Set to ON if targeting an LX2160A based device" ${LX2160A})
option(USE_CCACHE "Set to ON to use ccache if present in the system" ${USE_CCACHE})
option(HAVE_TRACE "Set to ON to have Trace ability (needs ZydisInfo library)" ${HAVE_TRACE})
option(NOLOADADDR "Set to ON to avoid fixing the load address of Box64" OFF)
option(NOGIT "Set to ON if not building from a git clone repo (like when building from a zip download from github)" ${NOGIT})
option(BAD_SIGNAL "Set to ON to activate the workaround for incoherent si_info on SIGSEGV" ${BAD_SIGNAL})
option(SW64 "Set ON if targeting an SW64 based device" ${SW64})
if(LARCH64)
set(LD80BITS OFF CACHE BOOL "")
set(NOALIGN OFF CACHE BOOL "")
set(ARM_DYNAREC OFF CACHE BOOL "")
endif()
if(RV64)
set(LD80BITS OFF CACHE BOOL "")
set(NOALIGN OFF CACHE BOOL "")
set(ARM_DYNAREC OFF CACHE BOOL "")
set(PAGE16K OFF CACHE BOOL "")
endif()
if(PPC64LE)
set(LD80BITS OFF CACHE BOOL "")
set(NOALIGN OFF CACHE BOOL "")
set(ARM_DYNAREC OFF CACHE BOOL "")
set(PAGE16K OFF CACHE BOOL "")
endif()
if(RK3399 OR RK3588 OR ODROIDN2 OR RPI3ARM64 OR RPI4ARM64 OR RK3326 OR TEGRAX1 OR PHYTIUM OR SD845 OR LX2160A OR M1)
set(LD80BITS OFF CACHE BOOL "")
set(NOALIGN OFF CACHE BOOL "")
set(ARM_DYNAREC ON CACHE BOOL "")
endif()
if(RK3399 OR RK3588 OR ODROIDN2 OR RPI3ARM64 OR RPI4ARM64 OR RK3326 OR TEGRAX1 OR PHYTIUM OR SD845 OR LX2160A)
set(PAGE16K OFF CACHE BOOL "")
endif()
if(RK3588)
set(BAD_SIGNAL ON CACHE BOOL "")
endif()
if(M1 OR LARCH64)
set(PAGE16K ON CACHE BOOL "")
endif()
if(SW64)
set(LD80BITS OFF CACHE BOOL "")
set(NOALIGN OFF CACHE BOOL "")
set(PAGE8K ON CACHE BOOL "")
endif()
option(LD80BITS "Set to ON if host device have 80bits long double (i.e. i386)" ${LD80BITS})
option(NOALIGN "Set to ON if host device doesn't need re-align (i.e. i386)" ${NOALIGN})
option(ARM_DYNAREC "Set to ON to use ARM Dynamic Recompilation" ${ARM_DYNAREC})
option(PAGE8K "Set to ON if host device have PageSize of 8K (instead of 4K)" ${PAGE8K})
option(PAGE16K "Set to ON if host device have PageSize of 16K (instead of 4K)" ${PAGE16K})
option(PAGE64K "Set to ON if host device have PageSize of 64K (instead of 4K)" ${PAGE64K})
option(STATICBUILD "Set to ON to have a static build (Warning, not working)" ${STATICBUILD})
if(${CMAKE_VERSION} VERSION_LESS "3.12.2")
find_package(PythonInterp 3)
@@ -28,23 +91,90 @@ project(box64 C ASM)
enable_testing()
set(default_build_type "RelwithDebInfo")
set(default_build_type "RelWithDebInfo")
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
message(STATUS "Setting build type to '${default_build_type}' as none was specified.")
set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE STRING "Choose the type of build." FORCE)
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
endif()
if(RPI4ARM64)
if(RPI3ARM64)
add_definitions(-DRPI)
add_definitions(-DRPI3ARM64)
add_definitions(-pipe -march=armv8-a+crc -mtune=cortex-a53)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8-a+crc -mtune=cortex-a53")
elseif(RPI4ARM64)
add_definitions(-DRPI)
add_definitions(-DRPI4ARM64)
add_definitions(-pipe -march=armv8-a+crc -mtune=cortex-a72 -mfpu=neon-fp-armv8)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8-a+crc -mtune=cortex-a72 -mfpu=neon-fp-armv8")
endif()
if(RK3399)
add_definitions(-pipe -march=armv8-a+crc -mtune=cortex-a72)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8-a+crc -mtune=cortex-a72")
elseif(RK3326)
add_definitions(-DRK3326)
add_definitions(-pipe -march=armv8-a+crc+simd+crypto -mcpu=cortex-a35+crypto)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8-a+crc+simd+crypto -mcpu=cortex-a35+crypto")
elseif(RK3399)
add_definitions(-DRK3399)
add_definitions(-pipe -march=armv8-a+crc+simd+crypto -mcpu=cortex-a72+crypto)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8-a+crc+simd+crypto -mcpu=cortex-a72+crypto")
add_definitions(-pipe -march=armv8-a+crc+simd+crypto -mcpu=cortex-a72.cortex-a53+crypto)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8-a+crc+simd+crypto -mcpu=cortex-a72.cortex-a53+crypto")
elseif(RK3588)
add_definitions(-DRK3588)
add_definitions(-pipe -mcpu=cortex-a76.cortex-a55+crypto)
add_definitions(-DBAD_SIGNAL)
set(CMAKE_ASM_FLAGS "-pipe -mcpu=cortex-a76.cortex-a55+crypto")
elseif(ODROIDN2)
add_definitions(-DODROIDN2)
add_definitions(-march=armv8-a+crc+simd+crypto -mcpu=cortex-a73.cortex-a53+crypto)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8-a+crc+simd+crypto -mcpu=cortex-a73.cortex-a53+crypto")
elseif(TEGRAX1)
add_definitions(-DTEGRAX1)
add_definitions(-pipe -march=armv8-a+crc+simd+crypto -mcpu=cortex-a57+crypto)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8-a+crc+simd+crypto -mcpu=cortex-a57+crypto")
elseif(PHYTIUM)
add_definitions(-DPHYSIUM)
add_definitions(-pipe -march=armv8.1-a+crc+simd+crypto)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8.1-a+crc+simd+crypto+aes")
elseif(SD845)
add_definitions(-DSD845)
add_definitions(-pipe -march=armv8.2-a+simd+crypto -mtune=cortex-a75.cortex-a55)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8.2-a+simd+crypto -mtune=cortex-a75.cortex-a55")
elseif(M1)
add_definitions(-DM1)
add_definitions(-pipe -march=armv8.5-a+simd+crypto)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8.5-a+simd+crypto")
elseif(LARCH64)
add_definitions(-DLA464)
add_definitions(-pipe -march=loongarch64)
set(CMAKE_ASM_FLAGS "-pipe -march=loongarch64")
elseif(RV64)
add_definitions(-DRV64)
add_definitions(-pipe -march=rv64gc)
set(CMAKE_ASM_FLAGS "-pipe -march=rv64gc")
elseif(PPC64LE)
add_definitions(-DPPC64LE)
elseif(LX2160A)
add_definitions(-DLX2160A)
add_definitions(-pipe -march=armv8-a+crypto+crc -mcpu=cortex-a72+crypto)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8-a+crypto+crc -mcpu=cortex-a72+crypto")
elseif(SW64)
add_definitions(-DSW64)
elseif(ARM_DYNAREC)
set(CMAKE_ASM_FLAGS "-pipe -march=armv8-a+crc+simd+crypto")
endif()
if(BAD_SIGNAL)
add_definitions(-DBAD_SIGNAL)
endif()
if(PAGE8K)
add_definitions(-DPAGE8K)
endif()
if(PAGE16K)
add_definitions(-DPAGE16K)
endif()
if(PAGE64K)
add_definitions(-DPAGE64K)
endif()
if(NOGIT)
@@ -52,12 +182,13 @@ if(NOGIT)
endif()
if(HAVE_TRACE)
set(BOX64 box64t)
set(BOX64 box64)
else()
set(BOX64 box64)
endif()
set(BOX64_ELF_ADDRESS "0x50062800000") #random load address...
#set(BOX64_ELF_ADDRESS "0x500062800000") #random load address...
set(BOX64_ELF_ADDRESS "0x34800000") #low address
if(LD80BITS)
add_definitions(-DHAVE_LD80BITS)
@@ -71,6 +202,16 @@ if(HAVE_TRACE)
add_definitions(-DHAVE_TRACE)
endif()
if(ARM_DYNAREC)
add_definitions(-DDYNAREC)
add_definitions(-DARM64)
enable_language(ASM)
include_directories("${BOX64_ROOT}/src/dynarec/arm64")
set(DYNAREC ON)
else()
set(DYNAREC OFF)
endif()
set(BOX64_ROOT ${CMAKE_SOURCE_DIR})
add_definitions(-std=gnu11 -funwind-tables -fvisibility=hidden)
@@ -80,6 +221,8 @@ if(USE_CCACHE)
if(CCACHE_FOUND)
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
else()
message(SEND_ERROR "ccache not found!")
endif()
endif()
@@ -100,7 +243,10 @@ set(ELFLOADER_SRC
"${BOX64_ROOT}/src/box64context.c"
"${BOX64_ROOT}/src/build_info.c"
"${BOX64_ROOT}/src/custommem.c"
"${BOX64_ROOT}/src/mallochook.c"
"${BOX64_ROOT}/src/steam.c"
"${BOX64_ROOT}/src/dynarec/dynarec.c"
"${BOX64_ROOT}/src/elfs/elfdwarf_private.c"
"${BOX64_ROOT}/src/elfs/elfloader.c"
"${BOX64_ROOT}/src/elfs/elfparser.c"
"${BOX64_ROOT}/src/elfs/elfload_dump.c"
@@ -113,8 +259,21 @@ set(ELFLOADER_SRC
"${BOX64_ROOT}/src/emu/x64run64.c"
"${BOX64_ROOT}/src/emu/x64run66.c"
"${BOX64_ROOT}/src/emu/x64run660f.c"
"${BOX64_ROOT}/src/emu/x64run6664.c"
"${BOX64_ROOT}/src/emu/x64run66d9.c"
"${BOX64_ROOT}/src/emu/x64run66dd.c"
"${BOX64_ROOT}/src/emu/x64run66f0.c"
"${BOX64_ROOT}/src/emu/x64run67.c"
"${BOX64_ROOT}/src/emu/x64run670f.c"
"${BOX64_ROOT}/src/emu/x64run6766.c"
"${BOX64_ROOT}/src/emu/x64run67660f.c"
"${BOX64_ROOT}/src/emu/x64rund8.c"
"${BOX64_ROOT}/src/emu/x64rund9.c"
"${BOX64_ROOT}/src/emu/x64runda.c"
"${BOX64_ROOT}/src/emu/x64rundb.c"
"${BOX64_ROOT}/src/emu/x64rundc.c"
"${BOX64_ROOT}/src/emu/x64rundd.c"
"${BOX64_ROOT}/src/emu/x64runde.c"
"${BOX64_ROOT}/src/emu/x64rundf.c"
"${BOX64_ROOT}/src/emu/x64runf0.c"
"${BOX64_ROOT}/src/emu/x64runf20f.c"
@@ -125,43 +284,230 @@ set(ELFLOADER_SRC
"${BOX64_ROOT}/src/emu/x64trace.c"
"${BOX64_ROOT}/src/librarian/librarian.c"
"${BOX64_ROOT}/src/librarian/library.c"
"${BOX64_ROOT}/src/librarian/dictionnary.c"
"${BOX64_ROOT}/src/librarian/globalsymbols.c"
"${BOX64_ROOT}/src/librarian/symbols.c"
"${BOX64_ROOT}/src/libtools/auxval.c"
"${BOX64_ROOT}/src/libtools/obstack.c"
"${BOX64_ROOT}/src/libtools/myalign.c"
"${BOX64_ROOT}/src/libtools/sdl1rwops.c"
"${BOX64_ROOT}/src/libtools/sdl2rwops.c"
"${BOX64_ROOT}/src/libtools/signals.c"
"${BOX64_ROOT}/src/libtools/threads.c"
"${BOX64_ROOT}/src/tools/box64stack.c"
"${BOX64_ROOT}/src/tools/bridge.c"
"${BOX64_ROOT}/src/tools/callback.c"
"${BOX64_ROOT}/src/tools/my_cpuid.c"
"${BOX64_ROOT}/src/tools/gtkclass.c"
"${BOX64_ROOT}/src/tools/pathcoll.c"
"${BOX64_ROOT}/src/tools/fileutils.c"
"${BOX64_ROOT}/src/tools/rcfile.c"
"${BOX64_ROOT}/src/tools/wine_tools.c"
"${BOX64_ROOT}/src/wrapped/generated/wrapper.c"
)
set(WRAPPEDS
"${BOX64_ROOT}/src/wrapped/wrappedlibc.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibm.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibdl.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibpthread.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibrt.c"
"${BOX64_ROOT}/src/wrapped/wrappedalure.c"
"${BOX64_ROOT}/src/wrapped/wrappedalut.c"
"${BOX64_ROOT}/src/wrapped/wrappedatk.c"
"${BOX64_ROOT}/src/wrapped/wrappedatkbridge.c"
"${BOX64_ROOT}/src/wrapped/wrappedatomic.c"
"${BOX64_ROOT}/src/wrapped/wrappedatspi.c"
"${BOX64_ROOT}/src/wrapped/wrappedbz2.c"
"${BOX64_ROOT}/src/wrapped/wrappedcairo.c"
"${BOX64_ROOT}/src/wrapped/wrappedcairogobject.c"
"${BOX64_ROOT}/src/wrapped/wrappedcrashhandler.c"
"${BOX64_ROOT}/src/wrapped/wrappedcrypto.c"
"${BOX64_ROOT}/src/wrapped/wrappedcurl.c"
"${BOX64_ROOT}/src/wrapped/wrappeddbus.c"
"${BOX64_ROOT}/src/wrapped/wrappeddbusglib1.c"
"${BOX64_ROOT}/src/wrapped/wrappedexpat.c"
"${BOX64_ROOT}/src/wrapped/wrappedfaudio.c"
"${BOX64_ROOT}/src/wrapped/wrappedflac.c"
"${BOX64_ROOT}/src/wrapped/wrappedfontconfig.c"
"${BOX64_ROOT}/src/wrapped/wrappedfreebl3.c"
"${BOX64_ROOT}/src/wrapped/wrappedfreetype.c"
"${BOX64_ROOT}/src/wrapped/wrappedgbm.c"
"${BOX64_ROOT}/src/wrapped/wrappedgconf2.c"
"${BOX64_ROOT}/src/wrapped/wrappedgcrypt.c"
"${BOX64_ROOT}/src/wrapped/wrappedgdk3.c"
"${BOX64_ROOT}/src/wrapped/wrappedgdkpixbuf2.c"
"${BOX64_ROOT}/src/wrapped/wrappedgdkx112.c"
"${BOX64_ROOT}/src/wrapped/wrappedgio2.c"
"${BOX64_ROOT}/src/wrapped/wrappedglib2.c"
"${BOX64_ROOT}/src/wrapped/wrappedgmodule2.c"
"${BOX64_ROOT}/src/wrapped/wrappedgmp.c"
"${BOX64_ROOT}/src/wrapped/wrappedgnutls.c"
"${BOX64_ROOT}/src/wrapped/wrappedgobject2.c"
"${BOX64_ROOT}/src/wrapped/wrappedgssapi.c"
"${BOX64_ROOT}/src/wrapped/wrappedgssapikrb5.c"
"${BOX64_ROOT}/src/wrapped/wrappedgstapp.c"
"${BOX64_ROOT}/src/wrapped/wrappedgstaudio.c"
"${BOX64_ROOT}/src/wrapped/wrappedgstbase.c"
"${BOX64_ROOT}/src/wrapped/wrappedgstgl.c"
"${BOX64_ROOT}/src/wrapped/wrappedgstreamer.c"
"${BOX64_ROOT}/src/wrapped/wrappedgsttag.c"
"${BOX64_ROOT}/src/wrapped/wrappedgstvideo.c"
"${BOX64_ROOT}/src/wrapped/wrappedgthread2.c"
"${BOX64_ROOT}/src/wrapped/wrappedgtk3.c"
"${BOX64_ROOT}/src/wrapped/wrappedgtkx112.c"
"${BOX64_ROOT}/src/wrapped/wrappedkrb5.c"
"${BOX64_ROOT}/src/wrapped/wrappedldlinux.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibasound.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibc.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibcrypt.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibcups.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibdl.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibdrm.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibegl.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibform.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibformw.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibfuse.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibgl.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibglu.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibglx.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibibus.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibice.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibm.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibncurses.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibncurses6.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibncursesw.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibncursesw6.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibogg.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibpanel.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibpci.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibpcre.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibpthread.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibresolv.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibrt.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibsm.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibsndfile.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibssl.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibtinfo.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibtinfo6.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibusb1.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibuuid.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibva.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibvadrm.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibvawayland.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibvax11.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibvdpau.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibvorbis.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibx11.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibx11xcb.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxau.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxcb.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxcbdri2.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxcbdri3.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxcbglx.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxcbkeysyms.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxcbicccm.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxcbimage.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxcbpresent.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxcbrandr.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxcbrender.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxcbrenderutil.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxcbshape.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxcbshm.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxcbsync.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxcbutil.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxcbxinerama.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxcbxfixes.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxcbxkb.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxcbxtest.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxcomposite.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxcursor.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxdamage.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxdmcp.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxext.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxfixes.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxft.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxi.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxmu.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxpm.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxpresent.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxrandr.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxrender.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxss.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxt.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxtst.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibxxf86vm.c"
"${BOX64_ROOT}/src/wrapped/wrappedlibz.c"
"${BOX64_ROOT}/src/wrapped/wrappedlzma.c"
"${BOX64_ROOT}/src/wrapped/wrappedmpg123.c"
"${BOX64_ROOT}/src/wrapped/wrappednotify.c"
"${BOX64_ROOT}/src/wrapped/wrappednsl.c"
"${BOX64_ROOT}/src/wrapped/wrappednspr4.c"
"${BOX64_ROOT}/src/wrapped/wrappednss3.c"
"${BOX64_ROOT}/src/wrapped/wrappednssutil3.c"
"${BOX64_ROOT}/src/wrapped/wrappedopenal.c"
"${BOX64_ROOT}/src/wrapped/wrappedpango.c"
"${BOX64_ROOT}/src/wrapped/wrappedpangocairo.c"
"${BOX64_ROOT}/src/wrapped/wrappedpangoft2.c"
"${BOX64_ROOT}/src/wrapped/wrappedplc4.c"
"${BOX64_ROOT}/src/wrapped/wrappedplds4.c"
"${BOX64_ROOT}/src/wrapped/wrappedpng16.c"
"${BOX64_ROOT}/src/wrapped/wrappedpulse.c"
"${BOX64_ROOT}/src/wrapped/wrappedpulsesimple.c"
"${BOX64_ROOT}/src/wrapped/wrappedsdl1.c"
"${BOX64_ROOT}/src/wrapped/wrappedsdl1image.c"
"${BOX64_ROOT}/src/wrapped/wrappedsdl1mixer.c"
"${BOX64_ROOT}/src/wrapped/wrappedsdl1net.c"
"${BOX64_ROOT}/src/wrapped/wrappedsdl1sound.c"
"${BOX64_ROOT}/src/wrapped/wrappedsdl1ttf.c"
"${BOX64_ROOT}/src/wrapped/wrappedsecret1.c"
"${BOX64_ROOT}/src/wrapped/wrappedsoftokn3.c"
"${BOX64_ROOT}/src/wrapped/wrappedsmpeg.c"
"${BOX64_ROOT}/src/wrapped/wrappedsdl2.c"
"${BOX64_ROOT}/src/wrapped/wrappedsdl2image.c"
"${BOX64_ROOT}/src/wrapped/wrappedsdl2mixer.c"
"${BOX64_ROOT}/src/wrapped/wrappedsdl2net.c"
"${BOX64_ROOT}/src/wrapped/wrappedsdl2ttf.c"
"${BOX64_ROOT}/src/wrapped/wrappedselinux.c"
"${BOX64_ROOT}/src/wrapped/wrappedsmime3.c"
"${BOX64_ROOT}/src/wrapped/wrappedsmpeg2.c"
"${BOX64_ROOT}/src/wrapped/wrappedssl3.c"
"${BOX64_ROOT}/src/wrapped/wrappedtbbmalloc.c"
"${BOX64_ROOT}/src/wrapped/wrappedtbbmallocproxy.c"
"${BOX64_ROOT}/src/wrapped/wrappedtcmallocminimal.c"
"${BOX64_ROOT}/src/wrapped/wrappedudev0.c"
"${BOX64_ROOT}/src/wrapped/wrappedudev1.c"
"${BOX64_ROOT}/src/wrapped/wrappedunwind.c"
"${BOX64_ROOT}/src/wrapped/wrappedutil.c"
"${BOX64_ROOT}/src/wrapped/wrappedvorbisfile.c"
"${BOX64_ROOT}/src/wrapped/wrappedwaylandclient.c"
"${BOX64_ROOT}/src/wrapped/wrappedwaylandcursor.c"
"${BOX64_ROOT}/src/wrapped/wrappedwaylandegl.c"
"${BOX64_ROOT}/src/wrapped/wrappedxinerama.c"
"${BOX64_ROOT}/src/wrapped/wrappedxkbcommon.c"
"${BOX64_ROOT}/src/wrapped/wrappedxkbcommonx11.c"
"${BOX64_ROOT}/src/wrapped/wrappedxml2.c"
"${BOX64_ROOT}/src/wrapped/wrappedxslt.c"
"${BOX64_ROOT}/src/wrapped/wrappedldapr.c"
"${BOX64_ROOT}/src/wrapped/wrappedlber.c"
"${BOX64_ROOT}/src/wrapped/wrappedvulkan.c"
"${BOX64_ROOT}/src/wrapped/wrappedxshmfence.c"
"${BOX64_ROOT}/src/wrapped/wrappedd3dadapter9.c"
)
#set(WRAPPEDS_HEAD "${BOX64_ROOT}/src/wrapped/wrappedd3dadapter9_gen.h")
# If BOX64_ROOT contains a ".c", the build breaks...
string(REPLACE ".c" "_private.h" MODROOT ${BOX64_ROOT})
set(WRAPPEDS_HEAD "${BOX64_ROOT}/src/wrapped/wrappedd3dadapter9_genvate.h")
foreach(A ${WRAPPEDS})
string(REPLACE ".c" "_private.h" B ${A})
string(REPLACE ".c" "_private.h" C ${A})
string(REPLACE "${MODROOT}" "${BOX64_ROOT}" B ${C})
set(WRAPPEDS_HEAD ${WRAPPEDS_HEAD} ${B})
set_source_files_properties(${A} PROPERTIES OBJECT_DEPENDS ${B})
endforeach()
set(WRAPPER "${BOX64_ROOT}/src/wrapped/generated/wrapper.c" "${BOX64_ROOT}/src/wrapped/generated/wrapper.h")
add_custom_command(
OUTPUT "${BOX64_ROOT}/src/wrapped/generated/functions_list.txt"
COMMAND "${PYTHON_EXECUTABLE}" "${BOX64_ROOT}/rebuild_wrappers.py"
"${BOX64_ROOT}"
"PANDORA" "HAVE_LD80BITS" "NOALIGN" "HAVE_TRACE" "--"
COMMAND "${PYTHON_EXECUTABLE}" "${BOX64_ROOT}/rebuild_wrappers.py"
"${BOX64_ROOT}"
"PANDORA" "HAVE_LD80BITS" "NOALIGN" "HAVE_TRACE" "--"
${WRAPPEDS_HEAD}
MAIN_DEPENDENCY "${BOX64_ROOT}/rebuild_wrappers.py"
DEPENDS ${WRAPPEDS} ${WRAPPEDS_HEAD}
@@ -172,53 +518,160 @@ add_custom_command(
# OUTPUT "${BOX64_ROOT}/src/dynarec/last_run.txt"
# COMMAND "${PYTHON_EXECUTABLE}" "${BOX64_ROOT}/rebuild_printer.py" "${BOX64_ROOT}"
# MAIN_DEPENDENCY "${BOX64_ROOT}/rebuild_printer.py"
# DEPENDS "${BOX64_ROOT}/src/dynarec/arm_instructions.txt"
# BYPRODUCTS "${BOX64_ROOT}/src/dynarec/arm_printer.c"
# DEPENDS "${BOX64_ROOT}/src/dynarec/arm64_instructions.txt"
# BYPRODUCTS "${BOX64_ROOT}/src/dynarec/arm64_printer.c"
#)
add_custom_target(WRAPPERS DEPENDS "${BOX64_ROOT}/src/wrapped/generated/functions_list.txt")
#add_custom_target(PRINTER DEPENDS "${BOX64_ROOT}/src/dynarec/last_run.txt")
if(DYNAREC)
set(DYNAREC_SRC
"${BOX64_ROOT}/src/dynarec/dynablock.c"
"${BOX64_ROOT}/src/dynarec/dynarec_native.c"
)
endif()
if(ARM_DYNAREC)
set(DYNAREC_SRC
${DYNAREC_SRC}
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_functions.c"
"${BOX64_ROOT}/src/dynarec/arm64/arm64_printer.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_jmpnext.c"
"${BOX64_ROOT}/src/dynarec/arm64/arm64_prolog.S"
"${BOX64_ROOT}/src/dynarec/arm64/arm64_epilog.S"
"${BOX64_ROOT}/src/dynarec/arm64/arm64_next.S"
"${BOX64_ROOT}/src/dynarec/arm64/arm64_lock.S"
)
set(DYNAREC_PASS
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_helper.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_emit_tests.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_emit_math.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_emit_logic.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_emit_shift.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_00.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_0f.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_64.c"
#"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_65.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_66.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_67.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_d8.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_d9.c"
#"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_da.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_db.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_dc.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_dd.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_de.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_df.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_f0.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_660f.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_6664.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_66f0.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_f20f.c"
"${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_f30f.c"
)
endif()
if(DYNAREC)
set(DYNAREC_PASS
"${BOX64_ROOT}/src/wrapped/generated/wrapper.h"
${DYNAREC_PASS}
"${BOX64_ROOT}/src/dynarec/dynarec_native_pass.c"
)
add_library(dynarec_native OBJECT ${DYNAREC_SRC})
add_library(native_pass0 OBJECT ${DYNAREC_PASS})
set_target_properties(native_pass0 PROPERTIES COMPILE_FLAGS "-DSTEP=0")
add_library(native_pass1 OBJECT ${DYNAREC_PASS})
set_target_properties(native_pass1 PROPERTIES COMPILE_FLAGS "-DSTEP=1")
add_library(native_pass2 OBJECT ${DYNAREC_PASS})
set_target_properties(native_pass2 PROPERTIES COMPILE_FLAGS "-DSTEP=2")
add_library(native_pass3 OBJECT ${DYNAREC_PASS})
set_target_properties(native_pass3 PROPERTIES COMPILE_FLAGS "-DSTEP=3")
add_dependencies(native_pass0 WRAPPERS)
add_dependencies(native_pass1 WRAPPERS)
add_dependencies(native_pass2 WRAPPERS)
add_dependencies(native_pass3 WRAPPERS)
add_library(dynarec STATIC
$<TARGET_OBJECTS:dynarec_native>
$<TARGET_OBJECTS:native_pass0>
$<TARGET_OBJECTS:native_pass1>
$<TARGET_OBJECTS:native_pass2>
$<TARGET_OBJECTS:native_pass3>
)
endif()
# creates git_head.h
#if(ARM_DYNAREC)
# add_custom_command(
# OUTPUT "${BOX64_ROOT}/src/git_head.h"
# COMMAND bash -c "echo \\\#define GITREV \\\"$(git rev-parse --short HEAD)\\\">\"${BOX64_ROOT}/src/git_head.h\""
# DEPENDS dynarec ${ELFLOADER_SRC} ${WRAPPEDS}
# VERBATIM)
#else()
if(DYNAREC)
add_custom_command(
OUTPUT "${BOX64_ROOT}/src/git_head.h"
COMMAND bash -c "echo \\\#define GITREV \\\"$(git rev-parse --short HEAD)\\\">\"${BOX64_ROOT}/src/git_head.h\""
COMMAND sh -c "echo \\\#define GITREV \\\"$(git rev-parse --short HEAD)\\\">\"${BOX64_ROOT}/src/git_head.h\""
DEPENDS dynarec ${ELFLOADER_SRC} ${WRAPPEDS}
VERBATIM)
else()
add_custom_command(
OUTPUT "${BOX64_ROOT}/src/git_head.h"
COMMAND sh -c "echo \\\#define GITREV \\\"$(git rev-parse --short HEAD)\\\">\"${BOX64_ROOT}/src/git_head.h\""
DEPENDS ${ELFLOADER_SRC} ${WRAPPEDS}
VERBATIM)
#endif()
endif()
add_executable(${BOX64} ${ELFLOADER_SRC} ${WRAPPEDS} "${BOX64_ROOT}/src/git_head.h")
set_target_properties(${BOX64} PROPERTIES ENABLE_EXPORTS ON)
add_dependencies(${BOX64} WRAPPERS)
#add_dependencies(${BOX64} PRINTER)
target_link_libraries(${BOX64} m dl rt pthread)
if(ARM_DYNAREC)
#target_link_libraries(${BOX64} c m dl rt pthread resolv)
if(STATICBUILD)
set_target_properties(${BOX64} PROPERTIES LINK_FLAGS "-static -Wl,--no-as-needed -Wl,--whole-archive -Wl,--allow-multiple-definition -lm -ldl -lrt -lpthread -lresolv -lc -Wl,-defsym,_DYNAMIC=0 -pthread")
else()
set_target_properties(${BOX64} PROPERTIES LINK_FLAGS "-Wl,--no-as-needed -lc -lm -ldl -lrt -lpthread -lresolv -Wl,--as-needed -pthread")
endif()
if(DYNAREC)
target_link_libraries(${BOX64} dynarec)
endif()
if(${CMAKE_VERSION} VERSION_LESS "3.13")
set_target_properties(${BOX64} PROPERTIES LINK_FLAGS "-rdynamic -Wl,-Ttext-segment,${BOX64_ELF_ADDRESS}")
if(NOT NOLOADADDR)
if(CMAKE_C_COMPILER_ID STREQUAL "Clang")
set_target_properties(${BOX64} PROPERTIES LINK_FLAGS "-Wl,--image-base=${BOX64_ELF_ADDRESS}")
else()
set_target_properties(${BOX64} PROPERTIES LINK_FLAGS "-Wl,-Ttext-segment,${BOX64_ELF_ADDRESS}")
endif()
endif()
else()
target_link_options(${BOX64} PUBLIC -rdynamic)
target_link_options(${BOX64} PUBLIC -Wl,-Ttext-segment,${BOX64_ELF_ADDRESS})
# If symbols are missing, try this: target_link_options(${BOX64} PUBLIC -rdynamic)
if(NOT NOLOADADDR)
if(CMAKE_C_COMPILER_ID STREQUAL "Clang")
target_link_options(${BOX64} PUBLIC LINKER:--image-base=${BOX64_ELF_ADDRESS})
else()
target_link_options(${BOX64} PUBLIC LINKER:-Ttext-segment,${BOX64_ELF_ADDRESS})
endif()
endif()
endif()
string(COMPARE EQUAL "${CMAKE_HOST_SYSTEM_PROCESSOR}" "i686" _x86)
string(COMPARE EQUAL "${CMAKE_HOST_SYSTEM_PROCESSOR}" "x86_64" _x86_64)
string(COMPARE EQUAL "${CMAKE_HOST_SYSTEM_PROCESSOR}" "aarch64" _aarch64)
if(_x86_64 OR _aarch64)
add_definitions(-DCONFIG_64BIT)
endif()
if(NOT _x86 AND NOT _x86_64)
install(TARGETS ${BOX64}
RUNTIME DESTINATION bin)
configure_file(system/box64.conf.cmake system/box64.conf)
install(FILES ${CMAKE_BINARY_DIR}/system/box64.conf DESTINATION /etc/binfmt.d/)
install(FILES ${CMAKE_SOURCE_DIR}/x64lib/libstdc++.so.5 DESTINATION /usr/lib/x86_64-linux-gnu/)
install(FILES ${CMAKE_SOURCE_DIR}/x64lib/libstdc++.so.6 DESTINATION /usr/lib/x86_64-linux-gnu/)
install(FILES ${CMAKE_SOURCE_DIR}/x64lib/libgcc_s.so.1 DESTINATION /usr/lib/x86_64-linux-gnu/)
install(FILES ${CMAKE_SOURCE_DIR}/x64lib/libpng12.so.0 DESTINATION /usr/lib/x86_64-linux-gnu/)
install(FILES ${CMAKE_SOURCE_DIR}/system/box64.box64rc DESTINATION /etc/)
endif()
if(NOT TARGET uninstall)
@@ -231,81 +684,155 @@ if(NOT TARGET uninstall)
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
endif()
add_test(test01 ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test01 -D TEST_OUTPUT=tmpfile.txt
set(CPACK_GENERATOR "DEB")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "ptitSeb")
set(CPACK_PACKAGE_CONTACT "[email protected]")
set(CPACK_PACKAGE_DESCRIPTION "Box64 - Linux Userspace x86_64 Emulator with a twist")
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6")
set(CPACK_PACKAGE_HOMEPAGE_URL, "https://box86.org")
file(STRINGS "${BOX64_ROOT}/src/box64version.h" TEMP_STRING REGEX "BOX64_MAJOR\\s*")
string(REGEX REPLACE "BOX64_MAJOR" "" TEMP_STRING ${TEMP_STRING})
string(REGEX MATCH "[0-9]" BOX64_MAJOR ${TEMP_STRING})
file(STRINGS "${BOX64_ROOT}/src/box64version.h" TEMP_STRING REGEX "BOX64_MINOR\\s*")
string(REGEX REPLACE "BOX64_MINOR" "" TEMP_STRING ${TEMP_STRING})
string(REGEX MATCH "[0-9]" BOX64_MINOR ${TEMP_STRING})
file(STRINGS "${BOX64_ROOT}/src/box64version.h" TEMP_STRING REGEX "BOX64_REVISION\\s*")
string(REGEX REPLACE "BOX64_REVISION" "" TEMP_STRING ${TEMP_STRING})
string(REGEX MATCH "[0-9]" BOX64_REVISION ${TEMP_STRING})
set(CPACK_PACKAGE_VERSION_MAJOR ${BOX64_MAJOR})
set(CPACK_PACKAGE_VERSION_MINOR ${BOX64_MINOR})
set(CPACK_PACKAGE_VERSION_PATCH ${BOX64_REVISION})
set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CMAKE_CURRENT_SOURCE_DIR}/postinst")
if(_aarch64)
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "arm64")
elseif(_x86_64)
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "x86_64")
else()
#probably wrong...
execute_process(COMMAND "dpkg --print-architecture" OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE)
endif()
set(CPACK_DEBIAN_FILE_NAME "${BOX64}-${BOX64_MAJOR}.${BOX64_MINOR}.${BOX64_REVISION}_Linux-${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}.deb")
INCLUDE(CPack)
add_test(bootSyscall ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test01 -D TEST_OUTPUT=tmpfile01.txt
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref01.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
add_test(test02 ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test02 -D TEST_OUTPUT=tmpfile.txt
add_test(bootSyscallC ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test02 -D TEST_OUTPUT=tmpfile02.txt
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref02.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
add_test(test03 ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test03 -D TEST_OUTPUT=tmpfile.txt
add_test(printf ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test03 -D TEST_OUTPUT=tmpfile03.txt
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref03.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
add_test(test04 ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test04 -D TEST_ARGS2=yeah -D TEST_OUTPUT=tmpfile.txt
add_test(args ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test04 -D TEST_ARGS2=yeah -D TEST_OUTPUT=tmpfile04.txt
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref04.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
add_test(test05 ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test05 -D TEST_ARGS2=7 -D TEST_OUTPUT=tmpfile.txt
add_test(maths1 ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test05 -D TEST_ARGS2=7 -D TEST_OUTPUT=tmpfile05.txt
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref05.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
add_test(test06 ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test06 -D TEST_OUTPUT=tmpfile.txt
add_test(threadsStart ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test06 -D TEST_OUTPUT=tmpfile06.txt
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref06.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
add_test(test07 ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test07 -D TEST_OUTPUT=tmpfile.txt
add_test(trig ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test07 -D TEST_OUTPUT=tmpfile07.txt
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref07.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
add_test(test08 ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test08 -D TEST_OUTPUT=tmpfile.txt
add_test(pi ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test08 -D TEST_OUTPUT=tmpfile08.txt
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref08.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
add_test(test09 ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test09 -D TEST_OUTPUT=tmpfile.txt
add_test(fork ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test09 -D TEST_OUTPUT=tmpfile09.txt
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref09.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
add_test(test10 ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test10 -D TEST_OUTPUT=tmpfile.txt
add_test(cppThreads ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test10 -D TEST_OUTPUT=tmpfile10.txt
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref10.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
add_test(test11 ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test11 -D TEST_OUTPUT=tmpfile.txt
add_test(tlsData ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test11 -D TEST_OUTPUT=tmpfile11.txt
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref11.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
add_test(test12 ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test12 -D TEST_OUTPUT=tmpfile.txt
add_test(fpu ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test12 -D TEST_OUTPUT=tmpfile12.txt
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref12.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
add_test(test13 ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test13 -D TEST_OUTPUT=tmpfile.txt
add_test(contexts ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test13 -D TEST_OUTPUT=tmpfile13.txt
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref13.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
#add_test(test14 ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
# -D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test14 -D TEST_OUTPUT=tmpfile.txt
#add_test(conditionalThreads ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
# -D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test14 -D TEST_OUTPUT=tmpfile14.txt
# -D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref14.txt
# -P ${CMAKE_SOURCE_DIR}/runTest.cmake )
file(GLOB extension_tests "${CMAKE_SOURCE_DIR}/tests/extensions/*.c")
add_test(linkingIndirectNoversion ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test15 -D TEST_OUTPUT=tmpfile15.txt
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref15.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
add_test(sse_asm ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test16 -D TEST_OUTPUT=tmpfile16.txt
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref16.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
set_tests_properties(sse_asm PROPERTIES ENVIRONMENT "BOX64_DYNAREC_FASTROUND=0")
add_test(sse_intrinsics ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test17 -D TEST_OUTPUT=tmpfile17.txt
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref17.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
set_tests_properties(sse_intrinsics PROPERTIES ENVIRONMENT "BOX64_DYNAREC_FASTNAN=0;BOX64_DYNAREC_FASTROUND=0")
add_test(aes ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test18 -D TEST_OUTPUT=tmpfile18.txt
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref18.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
add_test(backtrace ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test19 -D TEST_OUTPUT=tmpfile19.txt
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref19.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
add_test(irelative_reloc ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test20 -D TEST_OUTPUT=tmpfile20.txt
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref20.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
add_test(longjumpInSignals ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test21 -D TEST_OUTPUT=tmpfile21.txt
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref21.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
add_test(x87 ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test22 -D TEST_OUTPUT=tmpfile22.txt
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref22.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake )
file(GLOB extension_tests "${CMAKE_SOURCE_DIR}/tests/extensions/*.c")
foreach(file ${extension_tests})
get_filename_component(testname "${file}" NAME_WE)
add_test(NAME "${testname}" COMMAND ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/extensions/${testname} -D TEST_OUTPUT=tmpfile.txt
-D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/extensions/${testname} -D TEST_OUTPUT=tmpfile-${testname}.txt
-D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/extensions/${testname}.txt
-P ${CMAKE_SOURCE_DIR}/runTest.cmake)
endforeach()
+12
View File
@@ -0,0 +1,12 @@
all: dumpSigs
dumpSigs: main.o registered_structs.o
g++ -g3 -std=gnu++17 -fno-rtti main.o registered_structs.o -o dumpSigs "-L$(LLVM_install_dir)/lib" -lclang-cpp -lclangTooling -Wl,-rpath "-Wl,$(LLVM_install_dir)/lib"
main.o: main.cpp
g++ -g3 -std=gnu++17 -fno-rtti -c main.cpp -Wfatal-errors "-I$(LLVM_install_dir)/include" -o main.o
registered_structs.o: registered_structs.cpp
g++ -g3 -std=gnu++17 -fno-rtti -c registered_structs.cpp -Wfatal-errors -o registered_structs.o
clean:
$(RM) dumpSigs main.o registered_structs.o
+458
View File
@@ -0,0 +1,458 @@
#include <algorithm>
#include <fstream>
#include <iostream>
#include <numeric>
#include <unordered_map>
#include <utility>
#include <vector>
#include <llvm/Support/raw_ostream.h>
#include <clang/AST/ASTConsumer.h>
#include <clang/AST/Decl.h>
#include <clang/AST/Mangle.h>
#include <clang/AST/PrettyPrinter.h>
#include <clang/AST/RecursiveASTVisitor.h>
#include <clang/Frontend/CompilerInstance.h>
#include <clang/Frontend/FrontendActions.h>
#include <clang/Tooling/CommonOptionsParser.h>
#include <clang/Tooling/Tooling.h>
clang::MangleContext *mangler = nullptr;
std::unordered_map<std::string, std::pair<std::string, bool>> funMap;
std::vector<std::string> funList;
bool isTypeTrivial(const clang::QualType &q, const clang::QualType *qorig);
clang::QualType getPointedType(const clang::QualType q) {
if (const clang::PointerType *p = q->getAs<clang::PointerType>())
return getPointedType(p->getPointeeType());
else if (const clang::ReferenceType *r = q->getAs<clang::ReferenceType>())
return getPointedType(r->getPointeeType());
else
return q;
}
std::string record2name(const clang::RecordDecl &q, const clang::QualType *qorig) {
std::string s = q.getNameAsString();
if (s == "") {
if (!qorig) return "????.!";
if (const clang::TypedefType *tt = (*qorig)->getAs<clang::TypedefType>()) {
// Typedef
if (clang::TypedefNameDecl *td = tt->getDecl()) {
return td->getNameAsString();
} else {
return "<typedef with no declaration>";
}
} else {
return std::string("<unknown type ") + (*qorig)->getTypeClassName() + ">";
}
} else {
return s;
}
}
char ptr2char(const std::string &str) __attribute__((const));
const char *ptr2str(const std::string &str) __attribute__((const));
char type2char(const clang::QualType &qual /* Canonical */, const clang::QualType *qorig) {
if (qual->isBuiltinType()) {
switch (static_cast<const clang::BuiltinType&>(*qual).getKind()) {
case clang::BuiltinType::Kind::Void:
return 'v';
case clang::BuiltinType::Kind::Bool:
return 'i';
case clang::BuiltinType::Kind::Char_U:
return 'C';
case clang::BuiltinType::Kind::Char_S:
return 'c';
case clang::BuiltinType::Kind::Char8:
return 'c';
case clang::BuiltinType::Kind::UChar:
return 'C';
case clang::BuiltinType::Kind::SChar:
return 'c';
case clang::BuiltinType::Kind::WChar_U:
return 'W';
case clang::BuiltinType::Kind::UShort:
return 'W';
case clang::BuiltinType::Kind::WChar_S:
return 'w';
case clang::BuiltinType::Kind::Char16:
return 'w';
case clang::BuiltinType::Kind::Short:
return 'w';
case clang::BuiltinType::Kind::UInt:
return 'u';
case clang::BuiltinType::Kind::Char32:
return 'i';
case clang::BuiltinType::Kind::Int:
return 'i';
case clang::BuiltinType::Kind::ULong:
return 'L';
case clang::BuiltinType::Kind::Long:
return 'l';
case clang::BuiltinType::Kind::ULongLong:
return 'U';
case clang::BuiltinType::Kind::LongLong:
return 'I';
case clang::BuiltinType::Kind::UInt128:
return 'H';
case clang::BuiltinType::Kind::Int128:
return 'H';
case clang::BuiltinType::Kind::Float:
return 'f';
case clang::BuiltinType::Kind::Double:
return 'd';
case clang::BuiltinType::Kind::LongDouble:
return 'D';
case clang::BuiltinType::Kind::NullPtr:
return 'p'; // nullptr_t
case clang::BuiltinType::Kind::Half:
case clang::BuiltinType::Kind::BFloat16:
case clang::BuiltinType::Kind::ShortAccum:
case clang::BuiltinType::Kind::Accum:
case clang::BuiltinType::Kind::LongAccum:
case clang::BuiltinType::Kind::UShortAccum:
case clang::BuiltinType::Kind::UAccum:
case clang::BuiltinType::Kind::ULongAccum:
case clang::BuiltinType::Kind::ShortFract:
case clang::BuiltinType::Kind::Fract:
case clang::BuiltinType::Kind::LongFract:
case clang::BuiltinType::Kind::UShortFract:
case clang::BuiltinType::Kind::UFract:
case clang::BuiltinType::Kind::ULongFract:
case clang::BuiltinType::Kind::SatShortAccum:
case clang::BuiltinType::Kind::SatAccum:
case clang::BuiltinType::Kind::SatLongAccum:
case clang::BuiltinType::Kind::SatUShortAccum:
case clang::BuiltinType::Kind::SatUAccum:
case clang::BuiltinType::Kind::SatULongAccum:
case clang::BuiltinType::Kind::SatShortFract:
case clang::BuiltinType::Kind::SatFract:
case clang::BuiltinType::Kind::SatLongFract:
case clang::BuiltinType::Kind::SatUShortFract:
case clang::BuiltinType::Kind::SatUFract:
case clang::BuiltinType::Kind::SatULongFract:
case clang::BuiltinType::Kind::Float16:
case clang::BuiltinType::Kind::Float128:
case clang::BuiltinType::Kind::Overload:
case clang::BuiltinType::Kind::BoundMember:
case clang::BuiltinType::Kind::PseudoObject:
case clang::BuiltinType::Kind::Dependent:
case clang::BuiltinType::Kind::UnknownAny:
case clang::BuiltinType::Kind::ARCUnbridgedCast:
case clang::BuiltinType::Kind::BuiltinFn:
case clang::BuiltinType::Kind::ObjCId:
case clang::BuiltinType::Kind::ObjCClass:
case clang::BuiltinType::Kind::ObjCSel:
#define IMAGE_TYPE(it, id, si, a, s) case clang::BuiltinType::Kind::id:
#include <clang/Basic/OpenCLImageTypes.def>
#undef IMAGE_TYPE
case clang::BuiltinType::Kind::OCLSampler:
case clang::BuiltinType::Kind::OCLEvent:
case clang::BuiltinType::Kind::OCLClkEvent:
case clang::BuiltinType::Kind::OCLQueue:
case clang::BuiltinType::Kind::OCLReserveID:
case clang::BuiltinType::Kind::IncompleteMatrixIdx:
case clang::BuiltinType::Kind::OMPArraySection:
case clang::BuiltinType::Kind::OMPArrayShaping:
case clang::BuiltinType::Kind::OMPIterator:
#define EXT_OPAQUE_TYPE(et, id, e) case clang::BuiltinType::Kind::id:
#include <clang/Basic/OpenCLExtensionTypes.def>
#define SVE_TYPE(n, id, si) case clang::BuiltinType::Kind::id:
#include <clang/Basic/AArch64SVEACLETypes.def>
#define PPC_VECTOR_TYPE(n, id, s) case clang::BuiltinType::Kind::id:
#include <clang/Basic/PPCTypes.def>
#undef EXT_OPAQUE_TYPE
#undef SVE_TYPE
#undef PPC_VECTOR_TYPE
return '!';
default:
return ':';
}
} else if (qual->isEnumeralType()) {
const clang::EnumDecl *ed = qual->getAs<clang::EnumType>()->getDecl();
if (!ed) {
return 'i';
} else {
return type2char(ed->getIntegerType().getCanonicalType(), qorig);
}
} else if (qual->isFunctionPointerType()) {
return '@';
} else if (qual->isAnyPointerType() || qual->isReferenceType()) {
const clang::QualType &pointed = getPointedType(qual);
if (isTypeTrivial(pointed, qorig)) {
return 'p';
} else if (const clang::RecordType *rct = pointed->getAs<clang::RecordType>()) {
clang::RecordDecl *rc = rct->getDecl();
if (!rc) {
return '!';
} else if (!rc->isCompleteDefinition()) {
return 'p';
} else {
std::string str;
if (qorig) {
const clang::QualType qpted = getPointedType(*qorig);
str = record2name(*rc, &qpted);
} else {
str = record2name(*rc, nullptr);
}
char ret = ptr2char(str);
if (ret) return ret;
else {
return '!';
}
}
} else {
return '!';
}
} else if (const clang::RecordType *rct = qual->getAs<clang::RecordType>()) {
clang::RecordDecl *rc = rct->getDecl();
if (!rc) {
return '?';
} else if (rc->getNameAsString() == "__builtin_va_list") {
// va_list
return 'A';
} else {
return '?';
}
} else {
return '?';
}
}
bool isTypeTrivial(const clang::QualType &q, const clang::QualType *qorig) {
const char c = type2char(q, qorig);
#define GO(chr) || (c == chr)
return (c == 'v')
GO('i') GO('u')
GO('I') GO('U')
GO('l') GO('L')
GO('f') GO('d')
GO('D') GO('K')
GO('0') GO('1')
GO('C') GO('c')
GO('W') GO('w')
GO('H')
GO('p');
#undef GO
}
bool isTypeValid(const clang::QualType &q, const clang::QualType *qorig) {
const char c = type2char(q, qorig);
if (c == 'A') return false;
if (c == 'V') return false;
return ((c >= '0') && (c <= '9')) || ((c >= 'A') && (c <= 'Z')) || ((c >= 'a') && (c <= 'z'));
}
const std::string type2string(const clang::QualType &qual, const clang::QualType *qorig) {
if (qual->isBuiltinType()) {
return std::string("(builtin) ") + static_cast<const clang::BuiltinType&>(*qual).getName(clang::PrintingPolicy{{}}).data();
} else if (qual->isFunctionPointerType()) {
return "Callback (function pointer)";
} else if (qual->isAnyPointerType() || qual->isReferenceType()) {
std::string prefix = qual->isAnyPointerType() ? "Pointer to " : "Reference to ";
const clang::QualType &pointed = getPointedType(qual);
if (isTypeTrivial(pointed, qorig)) {
return prefix + "trivial object " + type2string(pointed, qorig) + " (" + type2char(pointed, qorig) + ")";
} else if (const clang::RecordType *rct = pointed->getAs<clang::RecordType>()) {
clang::RecordDecl *rc = rct->getDecl();
if (!rc) {
return prefix + "unknown record";
} else if (!rc->isCompleteDefinition()) {
return prefix + "incomplete record " + rc->getNameAsString();
} else {
std::string str;
if (qorig) {
const clang::QualType qpted = getPointedType(*qorig);
str = record2name(*rc, &qpted);
} else {
str = record2name(*rc, nullptr);
}
const char *ret = ptr2str(str);
if (ret[0] != '\0') {
return prefix + ret;
} else {
if (mangler && mangler->shouldMangleDeclName(rc)) {
std::string mangled;
{
llvm::raw_string_ostream strstr{mangled};
mangler->mangleName(rc, strstr);
}
return prefix + "unknown record " + str + " (=== " + mangled + ")";
} else {
return prefix + "unknown record " + str;
}
}
}
} else {
return prefix + "non-trivial or typedef'ed object " + type2string(pointed, qorig) + " (" + type2char(pointed, qorig) + ")";
//return "Pointer (maybe to callback)";
}
} else if (qual->isEnumeralType()) {
const clang::EnumDecl *ed = qual->getAs<clang::EnumType>()->getDecl();
if (!ed) {
return "Enumeration with unknown underlying integer type (assuming int)";
} else {
return "Enumeration with underlying type " + type2string(ed->getIntegerType().getCanonicalType(), nullptr);
}
} else if (const clang::RecordType *rct = qual->getAs<clang::RecordType>()) {
clang::RecordDecl *rc = rct->getDecl();
if (!rc) {
return "Unknown record";
} else if (rc->getNameAsString() == "__builtin_va_list") {
return "va_list";
} else {
return "Unknown record " + std::string(rc->getName().data());
}
} else {
return std::string("??? ") + qual->getTypeClassName();
}
}
class Visitor : public clang::RecursiveASTVisitor<Visitor> {
public:
clang::ASTContext &context;
bool shouldVisitTemplateInstantiations() const /* override */ { return true; }
Visitor(clang::CompilerInstance &ci) : context(ci.getASTContext()) {
if (!mangler) {
mangler = clang::ItaniumMangleContext::create(context, ci.getDiagnostics());
}
}
~Visitor() {
if (mangler) {
delete mangler;
mangler = nullptr;
}
}
bool VisitDecl(clang::Decl *decl) /* override */ {
std::cerr << std::flush;
if (!decl) return true;
if ((decl->getKind() >= clang::Decl::Kind::firstFunction) && (decl->getKind() <= clang::Decl::Kind::lastFunction)) {
clang::DeclaratorDecl *ddecl = static_cast<clang::DeclaratorDecl*>(decl);
std::cout << "Function detected!\n";
std::string funName{ddecl->getName()};
auto niceprint = [](const std::string &infotype, const auto &dat){ std::cout << " " << infotype << ": " << dat << "\n"; };
niceprint("Function name", funName);
if (mangler && mangler->shouldMangleDeclName(ddecl)) {
std::string mangled;
{
llvm::raw_string_ostream strstr{mangled};
mangler->mangleName(ddecl, strstr);
}
niceprint("Function mangled name", mangled);
funName = std::move(mangled);
}
bool valid;
std::string funTypeStr{""};
if (ddecl->getFunctionType()->isFunctionNoProtoType()) {
const clang::FunctionNoProtoType *funType = static_cast<const clang::FunctionNoProtoType*>(ddecl->getFunctionType());
const auto &retType = funType->getReturnType();
niceprint("Function return type", type2string(retType, &retType));
niceprint("Canonical function return type",
type2string(retType.getCanonicalType(), &retType) +
" (" + type2char(retType.getCanonicalType(), &retType) + ")");
niceprint("Is sugared", funType->isSugared());
if (funType->isSugared()) {
clang::QualType qft{funType, 0};
niceprint("Desugared", type2string(funType->desugar(), &qft));
}
funTypeStr = type2char(retType.getCanonicalType(), &retType) + std::string("Fv");
valid = isTypeValid(retType.getCanonicalType(), &retType);
} else {
const clang::FunctionProtoType *funType = static_cast<const clang::FunctionProtoType*>(ddecl->getFunctionType());
const auto &retType = funType->getReturnType();
niceprint("Function return type", type2string(retType, &retType));
niceprint("Canonical function return type",
type2string(retType.getCanonicalType(), &retType)
+ " (" + type2char(retType.getCanonicalType(), &retType) + ")");
niceprint("Parameter count", funType->getNumParams());
for (const clang::QualType &type : funType->getParamTypes()) {
niceprint(" " + type2string(type, &type),
type2string(type.getCanonicalType(), &type) + " (" + type2char(type.getCanonicalType(), &type) + ")");
}
niceprint("Variadic function", funType->isVariadic() ? "yes" : "no");
funTypeStr =
type2char(retType.getCanonicalType(), &retType) +
((funType->getNumParams() == 0)
? std::string("Fv") : std::accumulate(funType->getParamTypes().begin(), funType->getParamTypes().end(), std::string("F"),
[](const std::string &acc, const clang::QualType &qual){ return acc + type2char(qual.getCanonicalType(), &qual); }));
if (funType->isVariadic()) funTypeStr += "V";
valid = !funType->isVariadic() &&
std::accumulate(funType->getParamTypes().begin(), funType->getParamTypes().end(), isTypeValid(retType.getCanonicalType(), &retType),
[](bool acc, const clang::QualType &qual){ return acc && isTypeValid(qual.getCanonicalType(), &qual); });
}
niceprint("Conclusion", "");
niceprint("Function final name", funName);
niceprint("Function type", funTypeStr);
niceprint("Valid function type", valid ? "yes" : "no");
std::cout << "\n";
funMap[funName] = std::make_pair(funTypeStr, valid);
funList.push_back(funName);
}
return true;
}
};
class Consumer : public clang::ASTConsumer {
public:
Visitor visitor;
Consumer(clang::CompilerInstance &ci) : visitor(ci) {
}
void HandleTranslationUnit(clang::ASTContext &context) override {
visitor.TraverseDecl(context.getTranslationUnitDecl());
}
};
class Action : public clang::ASTFrontendAction {
public:
virtual std::unique_ptr<clang::ASTConsumer> CreateASTConsumer(clang::CompilerInstance &ci, llvm::StringRef inFile) override {
return std::make_unique<Consumer>(ci);
}
};
int main(int argc, const char **argv) {
if (argc < 2) {
std::cerr << "Usage: " << argv[0] << " (filenames) -- [-I...]" << std::endl;
return 2;
}
/*int fakeargc = argc + 1;
const char **fakeargv = new const char*[fakeargc];
memcpy(fakeargv, argv, argc * sizeof(char*));
fakeargv[fakeargc - 1] = "--";*/
llvm::cl::OptionCategory opcat{""};
clang::tooling::CommonOptionsParser op{argc, argv, opcat};
std::vector<std::string> paths; for (int i = 1; i < argc; ++i) paths.push_back(argv[i]);
clang::tooling::ClangTool tool{op.getCompilations(), paths};
tool.run(clang::tooling::newFrontendActionFactory<Action>().get());
std::cout << "Done, outputing output.h" << std::endl;
std::sort(funList.begin(), funList.end());
std::fstream file{"output.h", std::ios_base::out};
for (const std::string &funName : funList) {
if (!funMap[funName].second) {
file << "//";
}
file << "GO(" << funName << ", " << funMap[funName].first << ")\n";
}
return 0;
}
+267
View File
@@ -0,0 +1,267 @@
#include <string>
#define ALL START() \
/* libc */ \
STRUCT("_IO_FILE", "a FILE") \
STRUCT("_G_fpos_t", "a file position") \
STRUCT("sockaddr", "a socket address") \
STRUCT("itimerspec", "an itimerspec") \
STRUCT("timespec", "a timespec") \
STRUCT("itimerval", "an itimerval") \
STRUCT("timeval", "a timeval") \
STRUCT("timex", "a timex") \
STRUCT("timezone", "a timezone") \
STRUCT("dirent", "a dirent") \
STRUCT("dirent64", "a dirent64") \
STRUCT("__dirstream", "a dir stream") \
STRUCT("tm", "a time structure (tm)") \
STRUCT("cmsghdr", "a cmsghdr") \
STRUCT("msghdr", "a msghdr") \
STRUCT("rpcent", "an rpcent") \
STRUCT("random_data", "a random_data structure") \
STRUCT("drand48_data", "a drand48_data structure") \
STRUCT("termios", "a termios") \
STRUCT("iovec", "an iovec") \
STRUCT("file_handle", "a file handle") \
STRUCT("lconv", "an lconv") \
STRUCT("__locale_struct", "a locale structure") \
STRUCT("aliasent", "an alias") \
STRUCT("fstab", "an fstab") \
STRUCT("group", "a group") \
STRUCT("hostent", "a hostent") \
STRUCT("protoent", "a protoent") \
STRUCT("passwd", "a password") \
STRUCT("spwd", "an spwd") \
STRUCT("ttyent", "a ttyent") \
STRUCT("utmp", "an utmp structure") \
STRUCT("utmpx", "an utmpx structure") \
STRUCT("ifaddrs", "an ifaddrs structure") \
STRUCT("statfs", "a statfs structure") \
STRUCT("statfs64", "a statfs64 structure") \
STRUCT("statvfs", "a statvfs structure") \
STRUCT("statvfs64", "a statvfs64 structure") \
STRUCT("timeb", "a timeb structure") \
STRUCT("_ftsent", "an _ftsent structure") \
STRUCT("sysinfo", "a sysinfo structure") \
STRUCT("rlimit", "an rlimit structure") \
STRUCT("rlimit64", "an rlimit64 structure") \
STRUCT("rusage", "an rusage structure") \
STRUCT("entry", "an entry structure") \
STRUCT("pollfd", "a pollfd structure") \
STRUCT("re_pattern_buffer", "a re_pattern_buffer structure") \
STRUCT("sembuf", "a sembuf structure") \
STRUCT("tms", "a tms structure") \
STRUCT("utsname", "an utsname structure") \
STRUCT("utimbuf", "an utimbuf structure") \
STRUCT2("__va_list_tag", "__va_list_tag (aka, a va_list)", 'A') \
/* ncurses */ \
STRUCT("_win_st", "a _win_st structure") \
STRUCT("MEVENT", "an MEVENT structure") \
TYPEDEF("cchar_t", "a cchar_t") \
/* zlib */ \
STRUCT("gz_header_s", "a gz_header_s structure") \
STRUCT("gzFile_s", "a gzFile_s structure") \
STRUCT("z_stream_s", "a z_stream_s structure") \
\
END()
#define START()
#define STRUCT(s, ret) if (str == s) { return 'p'; } else
#define STRUCT2(s, ret, c) if (str == s) { return c; } else
#define TYPEDEF(s, ret) if (str == s) { return 'p'; } else
#define END() { return 0; }
char ptr2char(const std::string &str) {
/*if ((str == "_IO_FILE")
|| (str == "_G_fpos_t")
|| (str == "sockaddr")
|| (str == "itimerspec")
|| (str == "timespec")
|| (str == "itimerval")
|| (str == "timeval")
|| (str == "timex")
|| (str == "timezone")
|| (str == "dirent")
|| (str == "dirent64")
|| (str == "__dirstream")
|| (str == "tm")
|| (str == "cmsghdr")
|| (str == "msghdr")
|| (str == "rpcent")
|| (str == "random_data")
|| (str == "drand48_data")
|| (str == "termios")
|| (str == "iovec")
|| (str == "file_handle")
|| (str == "lconv")
|| (str == "__locale_struct")
|| (str == "aliasent")
|| (str == "fstab")
|| (str == "group")
|| (str == "hostent")
|| (str == "protoent")
|| (str == "passwd")
|| (str == "spwd")
|| (str == "ttyent")
|| (str == "utmp")
|| (str == "utmpx")
|| (str == "ifaddrs")
|| (str == "statfs")
|| (str == "statfs64")
|| (str == "statvfs")
|| (str == "timeb")
|| (str == "_ftsent")
|| (str == "sysinfo")
|| (str == "rlimit")
|| (str == "rlimit64")
|| (str == "rusage")
|| (str == "entry")
|| (str == "pollfd")
|| (str == "re_pattern_buffer")
|| (str == "sembuf")
|| (str == "tms")
|| (str == "utsname")
|| (str == "utimbuf")
// ncurses
|| (str == "_win_st")
|| (str == "cchar_t")
) {
// FILE*, fpos_t*, ...
return 'p';
} else if (str == "__va_list_tag") {
return 'A';
} else {
return 0;
}*/
ALL
}
#undef END
#undef TYPEDEF
#undef STRUCT2
#undef STRUCT
#undef START
#define START()
#define STRUCT(s, ret) if (str == s) { return ret; } else
#define STRUCT2(s, ret, c) if (str == s) { return ret; } else
#define TYPEDEF(s, ret) if (str == s) { return ret; } else
#define END() return "";
const char *ptr2str(const std::string &str) {
/*if (str == "_IO_FILE") {
return "a FILE";
} else if (str == "_G_fpos_t") {
return "a file position";
} else if (str == "sockaddr") {
return "a socket address";
} else if (str == "itimerspec") {
return "an itimerspec";
} else if (str == "timespec") {
return "a timespec";
} else if (str == "itimerval") {
return "an itimerval";
} else if (str == "timeval") {
return "a timeval";
} else if (str == "timex") {
return "a timex";
} else if (str == "timezone") {
return "a timezone";
} else if (str == "dirent") {
return "a dirent";
} else if (str == "dirent64") {
return "a dirent64";
} else if (str == "__dirstream") {
return "a dir stream";
} else if (str == "tm") {
return "a time structure (tm)";
} else if (str == "cmsghdr") {
return "a cmsghdr";
} else if (str == "msghdr") {
return "a msghdr";
} else if (str == "rpcent") {
return "an rpcent";
} else if (str == "random_data") {
return "a random_data structure";
} else if (str == "drand48_data") {
return "a drand48_data structure";
} else if (str == "termios") {
return "a termios";
} else if (str == "iovec") {
return "an iovec";
} else if (str == "file_handle") {
return "a file handle";
} else if (str == "lconv") {
return "an lconv";
} else if (str == "__locale_struct") {
return "a locale structure";
} else if (str == "aliasent") {
return "an alias";
} else if (str == "fstab") {
return "an fstab";
} else if (str == "group") {
return "a group";
} else if (str == "hostent") {
return "a hostent";
} else if (str == "protoent") {
return "a protoent";
} else if (str == "passwd") {
return "a password";
} else if (str == "spwd") {
return "an spwd";
} else if (str == "ttyent") {
return "a ttyent";
} else if (str == "utmp") {
return "an utmp structure";
} else if (str == "utmpx") {
return "an utmpx structure";
} else if (str == "ifaddrs") {
return "an ifaddrs structure";
} else if (str == "statfs") {
return "a statfs structure";
} else if (str == "statfs64") {
return "a statfs64 structure";
} else if (str == "statvfs") {
return "a statvfs structure";
} else if (str == "statvfs64") {
return "a statvfs64 structure";
} else if (str == "timeb") {
return "a timeb structure";
} else if (str == "_ftsent") {
return "an _ftsent structure";
} else if (str == "sysinfo") {
return "a sysinfo structure";
} else if (str == "rlimit") {
return "an rlimit structure";
} else if (str == "rlimit64") {
return "an rlimit64 structure";
} else if (str == "rusage") {
return "an rusage structure";
} else if (str == "entry") {
return "an entry structure";
} else if (str == "pollfd") {
return "a pollfd structure";
} else if (str == "re_pattern_buffer") {
return "a re_pattern_buffer structure";
} else if (str == "sembuf") {
return "a sembuf structure";
} else if (str == "tms") {
return "a tms structure";
} else if (str == "utsname") {
return "an utsname structure";
} else if (str == "utimbuf") {
return "an utimbuf structure";
} else if (str == "__va_list_tag") {
return "__va_list_tag (aka, a va_list)";
// ncurses
} else if (str == "_win_st") {
return "a _win_st structure";
} else if (str == "cchar_t") {
return "a cchar_t";
} else return "";*/
ALL
}
#undef END
#undef TYPEDEF
#undef STRUCT2
#undef STRUCT
#undef START
-7
View File
@@ -1,7 +0,0 @@
# box64
Linux Userspace x86_64 Emulator with a twist
----
Box64 lets you run x86_64 Linux programs (such as games) on non-x86_64 Linux systems, like ARM (host system needs to be 64bit little-endian).
+98
View File
@@ -0,0 +1,98 @@
box64 (0.2.2) unstable; urgency=low
* Added a hacked version for overriden malloc/free functions, enabling libcef (and derivative) to work.
* Added rcfile handling: box64 now read "/etc/box64.box64rc" and "~/.box64rc" and apply per process parameters
* Added BOX64_DYNAREC_CALLRET to optimized CALL/RET opcode using semi-direct native CALL/RET (get more than 10% speedup)
* Added BOX64_DYNAREC_FORWARD to allow bigger Dynarec block to be build (can get more then 30% of Speedup!)
* Improved memory protection tracking and signal handling, again
* Simplified mutex handling (faster, cleaner)
* Reduce memory used by the memory tracking (memory almost divide by 4 is some critical use case)
* Added d3dadaptor9 wrapping
* More wrapped libs (especially on the gtk familly)
* Improved/fixed some Syscall handling
* Refactored Strong Memory Model emulation (faster and more accurate)
* Added some more opcode to ARM64 Dynarec, and fixed some other
* Some fixes to flags handling in the Dynarec on some special cases
* Refactor library loading/unloading, with refcount.
* Some special cases fixes for dlopen (fixes deadcells, maybe others too)
* Improved mmap mapping, espcially with MAP_32BITS flag
* More wrapped functions and syscalls
* Lots of improvment in the Rounding of float & double (Dynarec and Interpretor), and proper handling of denormals when converting to/from 80 bits long double
* Added specific suppport for RK3588 board (needed some hack in signal handling, probably due to the use of a non mainlined kernel)
* More support on the RV64 port
* More support to build under musl environment
-- Sebastien Chevalier <[email protected]> Thu, 10 Mar 2023 10:20:33 -0500
box64 (0.2.0) unstable; urgency=low
* Wrapped more vulkan function, dxvk 2.0 now works
* Added support for overriden malloc/free functions
* Refactor Dynarec memory management, reducing memory footprint (from 20% to 40% of Dynarec size)
* Improved elf loader
* Improved dlsym handling with RTLD_NEXT
* Added BOX64_DYNAREC_SAFEFLAGS to allow finetuning Dynarec generated code handling of flags accross function calls and returns.
* Added BOX64_BASH to setup x86_64 bash binary, so shell script can be run in x86_64 world
* Added BOX64_ROLLING_LOG to have details log only on crash
* Work on alignment for some of pthread structures
* More wrapped libraries in the gtk family
* Some fixes on the Dynarec x87 code (fixing a bunch of games like ut2004 or Piczle Puzzle)
* Improved TLS Size handling (Unity3D games now works)
* More PageSize Compile options
* Improved execv family of function to have better box64 integration
* Added support for wrapped libfuse so AppImage works
* Adjusted the binfmt integration so AppImage are automaticaly picked
* Improved FAudio, SDL2, GL (and more) wrapping
* More wrapped libs, like libEGL.so, to helps emulated Qt4/5 libs to load
* Improved Signal Handling and memory protection traking
* Some signature fixes to some wrapped functions (in libc)
* Added more syscalls
* Added a lot of new opcodes to the ARM64 Dynarec
* docs: add instructions for Debian-based Linux by @ryanfortner in #306
* Fix typos and arch type string by @archanox in #321
* Fix grammar by @Jai-JAP in #326
* Enable 64k page size by @martinmanyhats in #334
* Align address when call mprotect by @wannacu in #336
* Add wrapped functions needed for 'ls -l'. by @stiltr in #294
* add 18.04 tegra X1 github actions by @theofficialgman in #345
* change order of matrix (to preview better under checkmark dropdown by @theofficialgman in #346
* Backport SDL_DYNAPI_entry wrapper from box86. by @JohnnyonFlame in #374
* Add SW64 base support by @wannacu in #382
* fix overzealous replace in wrappers pathnames by @NobodyNada in #415
* Create X64WINE.md by @WheezyE in #423
* src: asm: Rename lr & fp registers to their x-equivalents by @fredldotme in #426
* Malloc override by @ptitSeb in #437
* Remove dynablocklist by @ptitSeb in #438
* Fix Pkgbuilds by @Jai-JAP in #452
-- Sebastien Chevalier <[email protected]> Thu, 17 Nov 2022 11:20:33 -0500
box64 (0.1.8) unstable; urgency=low
* Added an option to get generated -NAN on SSE2 operation
* Many small fixes and improvement to get SteamPlay (i.e. proton) working (along with box86)
* Added some workaround for program calling uname to mimic x86_64 system
* Added some granularity to mmap, and generic memory protection tracking improvment, to mimic x86 system (for wine stagging and proton)
* Better clone syscall and libc implementation
* Improved wrapping of GTK libs
* More wrapped libs (more gtk libs, like gstreamer-1.0 among other non-gtk libs too)
* More wrapped functions(with some tricky one, like dladdr1)
* Some fixes and improvment to some wrapped functions
* Refactor Dynarec:
* - better handling of SSE/x87 registers
* - optimisation to limit float/double conversion
* - better handling of "internal" jump inside a dynablock
* - make adding new architecture easier, by sharing as much infrastructure as possible
* Improved elfloader
* Improved some tests
* Improved a bit the "Hotpage" handling and messages
* Added more dynarec opcodes
* A few fixes in some Dynarec opcodes
* A bit more optimisation in some Dynarec opcodes
* Don't quit on unsupported syscall, return -1 / ENOSYS error
* Added some more Syscall
* Wrapped Vulkan library. Vulkan and dxvk now supported!
* Support building on PPC64LE (interpretor only)
* Added support for Risc-V (interpretor only)
-- Sebastien Chevalier <[email protected]> Tue, 18 Jan 2022 11:20:33 -0500
+1
View File
@@ -0,0 +1 @@
11
+14
View File
@@ -0,0 +1,14 @@
Source: box64
Section: utils
Priority: optional
Maintainer: Ryan Fortner <[email protected]>
Build-Depends: cmake, debhelper (>=11~), python3
Standards-Version: 4.1.4
Homepage: https://github.com/ptitSeb/box64
Package: box64
Architecture: any
Multi-Arch: foreign
Depends: ${misc:Depends}, ${shlibs:Depends}
Description: Linux Userspace x86_64 Emulator with a twist, targeted at ARM Linux devices
Box86 lets you run x86_64 Linux programs (such as games) on non-x86 Linux systems, like ARM (host system needs to be 64bit little-endian).
+26
View File
@@ -0,0 +1,26 @@
Format-Specification: http://dep.debian.net/deps/dep5/
Files: *
Copyright: © 2022 Sebastien Chevalier
License: MIT
License: MIT
Copyright (c) 2018-2021 Sebastien Chevalier ("ptitSeb")
.
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.
+1
View File
@@ -0,0 +1 @@
box64: no-manual-page
+12
View File
@@ -0,0 +1,12 @@
#!/usr/bin/make -f
%:
dh $@
override_dh_auto_configure:
dh_auto_configure -- \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DARM_DYNAREC=1
override_dh_shlibdeps:
dh_shlibdeps --exclude=libgcc_s.so.1 --exclude=libpng12.so.0 --exclude=libstdc++.so.6
+1
View File
@@ -0,0 +1 @@
3.0 (quilt)
+5
View File
@@ -0,0 +1,5 @@
Bug-Database: https://github.com/ptitSeb/box64/issues
Bug-Submit: https://github.com/ptitSeb/box64/issues/new
Repository: https://github.com/ptitSeb/box64.git
Repository-Browse: https://github.com/ptitSeb/box64
Security-Contact: [email protected]
+1
View File
@@ -0,0 +1 @@
version=3
+171
View File
@@ -0,0 +1,171 @@
v0.2.2
======
* Added a hacked version for overriden malloc/free functions, enabling libcef (and derivative) to work.
=> Steam Large mode and new BigPicture are working
=> Heroic Launcher is working
* Added rcfile handling: box64 now read `/etc/box64.box64rc` and `~/.box64rc` and apply per process parameters
=> Every program can be finetuned, for speed or just to make them work
* Added BOX64_DYNAREC_CALLRET to optimized CALL/RET opcode using semi-direct native CALL/RET (get more than 10% speedup)
* Added BOX64_DYNAREC_FORWARD to allow bigger Dynarec block to be build (can get more then 30% of Speedup!)
* Improved memory protection tracking and signal handling, again
* Box64 now return a custom name for the CPU instal of P4, build with Box64 and the cpu name it's running on
* Simplified mutex handling (faster, cleaner)
* Reduce memory used by the memory tracking (memory almost divide by 4 is some critical use case)
* Added d3dadapter9 wrapping
=> gallium nine is now supported on box64 too
* More wrapped libs (especially on the gtk familly)
* Improved/fixed some Syscall handling
* Refactored Strong Memory Model emulation (faster and more accurate)
* Added some more opcode to ARM64 Dynarec, and fixed some other
* Some fixes to flags handling in the Dynarec on some special cases
* Refactor library loading/unloading, with refcount.
* Some special cases fixes for dlopen (fixes deadcells, maybe others too)
* Improved mmap mapping, espcially with MAP_32BITS flag
* More wrapped functions and syscalls
* Lots of improvment in the Rounding of float & double (Dynarec and Interpretor), and proper handling of denormals when converting to/from 80 bits long double
* Added specific suppport for RK3588 board (needed some hack in signal handling, probably due to the use of a non mainlined kernel)
* More support on the RV64 port
* More support to build under musl environment
v0.2.0
======
* Wrapped more vulkan function, dxvk 2.0 now works
* Added support for overriden malloc/free functions
* Refactor Dynarec memory management, reducing memory footprint (from 20% to 40% of Dynarec size)
* Improved elf loader
* Improved dlsym handling with RTLD_NEXT
* Added BOX64_DYNAREC_SAFEFLAGS to allow finetuning Dynarec generated code handling of flags accross function calls and returns.
* Added BOX64_BASH to setup x86_64 bash binary, so shell script can be run in x86_64 world
* Added BOX64_ROLLING_LOG to have details log only on crash
* Work on alignment for some of pthread structures
* More wrapped libraries in the gtk family
* Some fixes on the Dynarec x87 code (fixing a bunch of games like ut2004 or Piczle Puzzle)
* Improved TLS Size handling (Unity3D games now works)
* More PageSize Compile options
* Improved `execv` family of function to have better box64 integration
* Added support for wrapped libfuse so AppImage works
* Adjusted the binfmt integration so AppImage are automaticaly picked
* Improved FAudio, SDL2, GL (and more) wrapping
* More wrapped libs, like libEGL.so, to helps emulated Qt4/5 libs to load
* Improved Signal Handling and memory protection traking
* Some signature fixes to some wrapped functions (in libc)
* Added more syscalls
* Added a lot of new opcodes to the ARM64 Dynarec
=> Lot's of new games stat working, to name a few: Surviving Mars, Piczle Cross Adventure (using Proton experimental), UT2004, Obduction, Machinarium, Silicon Zero, Hacknet, Absolute Drift, Art of Rally, Dota2
=> Some apps also runs now, like TeamSpeak 3 Client and Server or Discord
=> The bash integration is usefull for device with no binfmt integration or for script that check the machine it's running on
v0.1.8
======
* Added an option to get generated -NAN on SSE2 operation
* Many small fixes and improvement to get SteamPlay (i.e. proton) working (along with box86)
* Added some workaround for program calling uname to mimic x86_64 system
* Added some granularity to mmap, and generic memory protection tracking improvment, to mimic x86 system (for wine stagging and proton)
* Better clone syscall and libc implementation
* Improved wrapping of GTK libs
* More wrapped libs (more gtk libs, like gstreamer-1.0 among other non-gtk libs too)
* More wrapped functions(with some tricky one, like dladdr1)
* Some fixes and improvment to some wrapped functions
* Refactor Dynarec:
* better handling of SSE/x87 registers
* optimisation to limit float/double conversion
* better handling of "internal" jump inside a dynablock
* make adding new architecture easier, by sharing as much infrastructure as possible
* Improved elfloader
* Improved some tests
* Improved a bit the "Hotpage" handling and messages
* Added more dynarec opcodes
* A few fixes in some Dynarec opcodes
* A bit more optimisation in some Dynarec opcodes
* Don't quit on unsupported syscall, return -1 / ENOSYS error
* Added some more Syscall
* Wrapped Vulkan library. Vulkan and dxvk now supported!
* Support building on PPC64LE (interpretor only)
* Added support for Risc-V (interpretor only)
v0.1.6
======
* Introduce "HotPage", to temporarily disable Dynarec on a page were writing is also occuring (can help speed up C# code)
* Some work on Dynarec to limit the number of mutex use, and also allow smaller block to be built (for JIT'd programs)
* Introduce BOX64_DYNAREC_STRONGMEM for the (Arm) dynarec to emulate StrngMemory Model (needed by some games, like RimWorld)
* More functions wrapped
* Improve speed of the custom allocator used by dynarec and Hash (speedup loading)
* Added a workaround for streamwebhelper to not load it
* More opcodes added
* More wrapped libraries, including gtk2
* Added a fix for linking box64 on system using glibc 2.34+
* Some residual fixes on thread attribute handling
* Better handling of app that want 32bits jumps, like unity3d/mono (thanks mogery)
* More ARM hardware option in CMake (Phytium, NX...)
* Added loongarch64 support (interpretor only)
* Some fixes to elfloader
* Added a mecanism to cancel a Dynarec block construction if it triggers a segfault (instead of a crash)
v0.1.4
======
* Reworked README a bit
* Added some more wrapped libs
* Added some SSE4x opcodes
* Preliminary support for VSyscall (still missing VDSO)
* Added support for AES-NI cpu extension, also in Dynarec (and using ARM extension if present)
* Added some syscall
* Added some more wrapped functions
* Improvment to the handling of longjmp inside signal handlers
* Improved wrapper helpers (from rajdakin)
* Some fixes to opcodes (especially C2 flags for some x87 opcodes)
* Handling of some specific opcode as privileged instruction (instead of NOP)
* Fixed ELF signature detection
* Some fixes to a few env. var. handling
v0.1.2
======
* OpenSource!
* A few more opcode added to the Interpretor and the Dynarec
* Improved Native Function calling
* Added some function to limit allocated memory to 47bits space (for Wine)
* Improved and Fixed the functions to limit allocated memory to 32bits space
* Wine is starting now, but not everything and every version works
v0.1.0
======
* Improvement to ElfLoader
* More opcode added to the Dynarec
* More lib wrapping
* Some fixes to a few function signature
* Improvement to Signal handling, and internal mutex handling
* A few fixes to some dynarec opcodes
* A few fixes to some interpretor opcodes
v0.0.8
======
* Improvement to SSE/x87 handling
* More opcode added to the Dynarec
* More lib wrapping
v0.0.6
======
* Added Dynarec for ARM64
* Many general CPU opcode added to the Dynarec
* Many SSEx opcodes added to the Dynarec
* Added a few more symbols in libc
* A few changes to the "thread once" handling
* New Logo and Icon from @grayduck
v0.0.4
======
* Added a lot of opcodes
* Added SDL1 and SDL2 wrapping
* OpenGL/GLU wrapping done
* libasound / libpulse wrapping done
* libopenal / libalure / libalut wrapping done
* Many X11 libs wrapped
* Added "install" with binfmt integration
* A few games are actualy starting now (old WorldOfGoo, Into The Breach, VVVVVV and Thimbeweed Park)
v0.0.2
======
* Using box86 as a base, implemented most planned box64 part except dynarec
* Wrapped a few libs
* ELF loader a bit crude, but seems working
* Signal handling implemented
* MMX and x87 are sharing their registers
+285
View File
@@ -0,0 +1,285 @@
Compiling/Installing
----
#### Debian-based Linux
You can use [@ryanfortner](https://github.com/ryanfortner)'s apt repository to install precompiled box64 debs, updated every 24 hours.
```
sudo wget https://ryanfortner.github.io/box64-debs/box64.list -O /etc/apt/sources.list.d/box64.list
wget -O- https://ryanfortner.github.io/box64-debs/KEY.gpg | sudo gpg --dearmor -o /usr/share/keyrings/box64-debs-archive-keyring.gpg
sudo apt update && sudo apt install box64 -y
```
Alternatively, you can generate your own package using the [instructions below](https://github.com/ptitSeb/box64/blob/main/docs/COMPILE.md#debian-packaging).
#### for RK3399
Using a 64bit OS:
```
git clone https://github.com/ptitSeb/box64
cd box64
mkdir build; cd build; cmake .. -DRK3399=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
make -j4
sudo make install
```
If it's the first install, you also need:
```
sudo systemctl restart systemd-binfmt
```
#### for RK3588 / RK3588S
Using a 64bit OS:
```
git clone https://github.com/ptitSeb/box64
cd box64
mkdir build; cd build; cmake .. -DRK3588=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
make -j4
sudo make install
```
If it's the first install, you also need:
```
sudo systemctl restart systemd-binfmt
```
#### for Raspberry Pi 3
Warning, you need a 64bit OS:
If building on the Pi, you will also need a large swap (3 GB+)
[optionally reduce GPU memory to a minimum (e.g. 16 MB) using `raspi-config`
(and reboot) before starting the build]:
You can use e.g. '`make -j4`' to speed up the build, but on a Pi 3 with 1GB memory you will likely
run out of memory at some point and need to run the build again.
Still, this can be faster if your build is attended.
```
git clone https://github.com/ptitSeb/box64
cd box64
mkdir build; cd build; cmake .. -DRPI3ARM64=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
make
# or e.g. make -j4
sudo make install
```
If it's the first install, you also need:
```
sudo systemctl restart systemd-binfmt
```
#### for Raspberry Pi 4
Warning, you need a 64bit OS:
```
git clone https://github.com/ptitSeb/box64
cd box64
mkdir build; cd build; cmake .. -DRPI4ARM64=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
make -j4
sudo make install
```
If it's the first install, you also need:
```
sudo systemctl restart systemd-binfmt
```
#### for TEGRA X1
Using a 64bit OS:
```
git clone https://github.com/ptitSeb/box64
cd box64
mkdir build; cd build; cmake .. -DTEGRAX1=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
make -j4
sudo make install
```
If it's the first install, you also need:
```
sudo systemctl restart systemd-binfmt
```
#### for ODROID N2/N2+
Using a 64bit OS:
```
git clone https://github.com/ptitSeb/box64
cd box64
mkdir build; cd build; cmake .. -DODROIDN2=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
make -j4
sudo make install
```
If it's the first install, you also need:
```
sudo systemctl restart systemd-binfmt
```
#### for Snapdragon 845
Using a 64bit OS:
```
git clone https://github.com/ptitSeb/box64
cd box64
mkdir build; cd build; cmake .. -DSD845=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
make -j4
sudo make install
```
If it's the first install, you also need:
```
sudo systemctl restart systemd-binfmt
```
----
#### for Phytium
Using a 64bit OS:
```
git clone https://github.com/ptitSeb/box64
cd box64
mkdir build; cd build; cmake .. -DPHYTIUM=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
make -j4
sudo make install
```
If it's the first install, you also need:
```
sudo systemctl restart systemd-binfmt
```
#### for M1
Only test on Asahi for now, using the default "16K page" kernel
```
git clone https://github.com/ptitSeb/box64
cd box64
mkdir build; cd build; cmake .. -DM1=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
make -j4
sudo make install
```
If it's the first install, you also need:
```
sudo systemctl restart systemd-binfmt
```
#### for Other ARM64 Linux platforms
`mkdir build; cd build; cmake .. -DARM_DYNAREC=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo; make -j$(nproc)`
You can also add `-DBAD_SIGNAL=ON` to the cmake command if you are on Linux Kernel mixed with Android, like on RK3588 or maybe Termux
#### for LoongArch
Using a 64bit OS:
```
git clone https://github.com/ptitSeb/box64
cd box64
mkdir build; cd build; cmake .. -DLARCH64=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
make -j4
sudo make install
```
If it's the first install, you also need:
```
sudo systemctl restart systemd-binfmt
```
#### for RISC-V
Using a 64bit OS:
```
git clone https://github.com/ptitSeb/box64
cd box64
mkdir build; cd build; cmake .. -DRV64=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
make -j`nproc`
sudo make install
```
If it's the first install, you also need:
```
sudo systemctl restart systemd-binfmt
```
#### for PowerPC 64 LE
Using a 64bit OS:
```
git clone https://github.com/ptitSeb/box64
cd box64
mkdir build; cd build; cmake .. -DPPC64LE=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
make -j4
sudo make install
```
If it's the first install, you also need:
```
sudo systemctl restart systemd-binfmt
```
#### for LX2160A
Using a 64bit OS:
```
git clone https://github.com/ptitSeb/box64
cd box64
mkdir build; cd build; cmake .. -DLX2160A=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
make -j$(nproc)
sudo make install
```
If it's the first install, you also need:
```
sudo systemctl restart systemd-binfmt
```
#### for x86_64 Linux
`mkdir build; cd build; cmake .. -DLD80BITS=1 -DNOALIGN=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo; make -j$(nproc)`
If you encounter some linking errors, try using `NOLOADADDR=ON` (`cmake -DNOLOADADDR=ON; make -j$(nproc)`).
### use ccmake
Alternatively, you can **use the curses-bases ccmake (or any other gui frontend for cmake)** to select wich platform to use interactively.
### Customize your build
#### Use ccache if you have it
Add `-DUSE_CCACHE=1` if you have ccache (it's better if you plan to touch the sources)
#### To have some debug info
The `-DCMAKE_BUILD_TYPE=RelWithDebInfo` argument makes a build that is both optimized for speed, and has debug information embedded. That way, if you have a crash or try to analyse performance, you'll have some symbols.
#### To have a Trace Enabled build
To have a trace enabled build (***the interpreter will be slightly slower***), add `-DHAVE_TRACE=1`. But you will need to have the [Zydis library](https://github.com/zyantific/zydis) in your `LD_LIBRARY_PATH` or in the system library folders at runtime.
#### To have ARM Dynarec
Dynarec is only available on ARM (for the meantime), Activate it by using `-DARM_DYNAREC=1`.
###### *Note: VFPv3 and NEON are required for Dynarec.*
#### Not building from a git clone
If you are not building from a git clone (for example, downloading a release source code zip from github), you need to use `-DNOGIT=1` from cmake to be able to build (box64 uses git SHA1 to show last commit in version number).
----
Testing
----
A few tests are included with box64.
They can be launched using the `ctest` command.
The tests are very basic and only tests some functionality for now.
----
Debian Packaging
----
Box64 can also be packaged into a .deb file with `DEB_BUILD_OPTIONS=nostrip dpkg-buildpackage -us -uc -nc`.
+122
View File
@@ -0,0 +1,122 @@
![Official logo](img/Box64Logo.png "Official Logo")
Linux Userspace x86_64 Emulator with a twist
[View changelog](https://github.com/ptitSeb/box64/blob/main/docs/CHANGELOG.md) | [中文](https://github.com/ptitSeb/box64/blob/main/docs/README_CN.md) | [Report an error](https://github.com/ptitSeb/box64/issues/new)
![build](https://app.travis-ci.com/ptitSeb/box64.svg?branch=main) ![stars](https://img.shields.io/github/stars/ptitSeb/box64) ![forks](https://img.shields.io/github/forks/ptitSeb/box64) ![contributors](https://img.shields.io/github/contributors/ptitSeb/box64) ![prs](https://img.shields.io/github/issues-pr/ptitSeb/box64) ![issues](https://img.shields.io/github/issues/ptitSeb/box64)
----
Box64 lets you run x86_64 Linux programs (such as games) on non-x86_64 Linux systems, like ARM (host system needs to be 64-bit little-endian).
You can find many Box64 videos on the [MicroLinux](https://www.youtube.com/channel/UCwFQAEj1lp3out4n7BeBatQ), [Pi Labs](https://www.youtube.com/channel/UCgfQjdc5RceRlTGfuthBs7g) or [The Byteman](https://www.youtube.com/channel/UCEr8lpIJ3B5Ctc5BvcOHSnA) YouTube channels.
Since Box64 uses the native versions of some "system" libraries, like libc, libm, SDL, and OpenGL, it's easy to integrate and use with most applications, and performance can be surprisingly high in many cases. Take a look at thoses bench analysis for an example [here](https://box86.org/index.php/2021/06/game-performances/).
Box64 integrates with DynaRec (dynamic recompiler) for the ARM64 platform, providing a speed boost between 5 to 10 times faster than using only the interpreter. Some high level information on how DynaRec works can be found [here](https://box86.org/2021/07/inner-workings-a-high%e2%80%91level-view-of-box86-and-a-low%e2%80%91level-view-of-the-dynarec/).
Some x64 internal opcodes use parts of "Realmode X86 Emulator Library", see [x64primop.c](../src/emu/x64primop.c) for copyright details
<img src="img/Box64Icon.png" width="96" height="96">
Logo and Icon made by @grayduck, thanks!
----
Usage
----
There are a few environment variables to control the behaviour of Box64.
See [here](USAGE.md) for all the environment variables and what they do.
Note: Box64's Dynarec uses a mechanism with Memory Protection and a SegFault signal handler to handle JIT code. In simpler terms, if you want to use GDB to debug a running program that use JIT'd code (like mono/Unity3D), you will still have many "normal" segfaults triggering. It is suggested to use something like `handle SIGSEGV nostop` in GDB to not stop at each segfault, and maybe put a breakpoint inside `my_memprotectionhandler` in `signals.c` if you want to trap SegFaults.
----
Compiling/Installation
----
> Compilation instructions can be found [here](COMPILE.md).
----
Version history/Change log
----
The change log is available [here](CHANGELOG.md).
----
Notes about 32-bit platforms
----
Because Box64 works by directly translating function calls from x86_64 to host system, the host system (the one Box64 is running on) needs to have 64-bit libraries. Box64 doesn't include any 64-bit <-> 32-bit translation.
So understand that box64 will only runs 64-bit linux binaries. For 32-bit binaries, you need box86 (with all the multiarch or proot trickery it imply on 64-bit OS).
Note that many installer (mojo setup based) will fall back to "x86" when detecting ARM64 OS, and so will try to use box86 for the setup, even if an x86_64 version exist. You can hack your way around with a fake "uname" that return "x86_64" when the argument is "-m"
----
Notes about Box64 configuration
----
Box64 now have configurations files. There are 2 files loaded. `/etc/box4.box64rc` and `~/.box64rc`. Both files have the same syntax, and is basicaly an ini files. Section in square brakets define the process name, and the rest is the env. var. to set. Looke at [Usage](USAGE.md) for detail on what parameters can be put. Box64 comes with a default file that should be installed for better stability. The file in in `system/box64.box64rc` and should be installed to `/etc/box64.box64rc` If, for some reasons, you don't want to install that file here, at least copy it to `~/.box64rc` or some game may not function correctly.
Note that the priority is: `~/.bashrc` > `/etc/box64.box64rc` > command line
So, your settings in `~/.bashrc` may override the setting from your command line...
----
Notes about Unity game emulation
----
Running Unity games should just works, but you should also note that many Unity3D games require OpenGL 3+ which can be tricky to provide on ARM SBC (single-board computers). Also many newer Unity3D (like KSP) games use the BC7 compressed textures, wich is not supported on many ARM integrated GPU.
Hint: on Pi4, use `MESA_GL_VERSION_OVERRIDE=3.2` and with Panfrost use `PAN_MESA_DEBUG=gl3` to use higher profile if the game starts then quits before showing anything.
----
Notes about GTK programs
----
GTK libraries are now wrapped on box64, both gtk2 and gtk3.
----
Notes about Steam
----
Note that Steam is a hybrid 32-bit / 64-bit. You NEED box86 to run Steam, as the client app is a 32-bit binary. It also uses a 64-bit local server binaries, but like most stuff using libcef/chromium, it's not working correctly on box64 for now.
So, no Steam for now on box64.
----
Notes about Wine
----
Wine64 is supported on box64. Proton should also work. Be aware that 64-bit Wine also includes 32-bit components, to be able to run 32-bit Windows programs. The 32-bit apps will need box86 and will not run without it. On a system where both box64 and box86 are present and working, a wine 64-bit setup can run both 32-bit and 64-bit Windows programs (just use `wine` and `wine64` respectively).
Note that the new 32bits PE in 64bits process that the Wine time in currently implementing in Wine 7.+ is not yet supported. I tested Wine 7.5 64bits and it worked, but more recent version will probably just not work yet.
----
Notes about Vulkan
----
Box64 wraps Vulkan libraries, but note that it as only been tested with a RX550 card, so some extensions may be missing depending on your graphics card.
----
Final word
----
I want to thank everyone who has contributed to box64 development.
There are many ways to contribute: code contribution, financial, hardware and advertisement!
So, in no particular order, I want to thank:
* For their major code contribution: rajdakin, mogery
* For their major financial contribution: FlyingFathead, stormchaser3000, dennis1248, sll00, [libre-computer-project](https://libre.computer/)
* For hardware contribution and LoongArch migration: [xiaoji](https://www.linuxgame.cn/), Deepin Beijing Develop Team
* For their hardware contribution: [Radxa](https://rockpi.org/), [Pine64](https://www.pine64.org/), [StarFive](https://rvspace.org/)
* For their continous advertisement of box64 project: salva ([microLinux](https://www.youtube.com/channel/UCwFQAEj1lp3out4n7BeBatQ)), [PILab](https://www.youtube.com/channel/UCgfQjdc5RceRlTGfuthBs7g)/[TwisterOS](https://twisteros.com/) team, [The Byteman](https://www.youtube.com/channel/UCEr8lpIJ3B5Ctc5BvcOHSnA), [NicoD](https://www.youtube.com/channel/UCpv7NFr0-9AB5xoklh3Snhg), ekianjo ([Boilingsteam](https://boilingsteam.com/))
And I also thank the many other people who participated even once in this project.
(If you use Box64 in your project, please don't forget to mention it!)
+119
View File
@@ -0,0 +1,119 @@
# box64
![Official logo](img/Box64Logo.png "Official Logo")
Linux上用户空间的x86_64应用模拟器
----
![box64 build status](https://app.travis-ci.com/ptitSeb/box64.svg?branch=main)
[English](README.md)
在ARM或其他非X86_64架构的Linux操作系统上,使用Box64可以运行x86_64 Linux程序(例如游戏),请注意,主机系统需要**64位小端**。
您可以在Youtube的[MicroLinux](https://www.youtube.com/channel/UCwFQAEj1lp3out4n7BeBatQ)、[Pi Labs](https://www.youtube.com/channel/UCgfQjdc5RceRlTGfuthBs7g)或[The Byteman](https://www.youtube.com/channel/UCEr8lpIJ3B5Ctc5BvcOHSnA)频道找到更多Box64视频。
Box64使用了一些“系统”库的原生版本,例如libc、libm、SDL和OpenGL,所以它很容易与大多数应用程序集成和使用,并且在很多情况下性能会出奇的高。点击[此处](https://box86.org/index.php/2021/06/game-performances/)查看示例的基准测试分析。
Box64为ARM64平台集成了DynaRec(动态重编译器),比仅使用解释器提升5到10倍性能。关于Dynarec如何工作的更多信息,可以在[这里](https://box86.org/2021/07/inner-workings-a-high%e2%80%91level-view-of-box86-and-a-low%e2%80%91level-view-of-the-dynarec/)找到。
注:DynaRec需要针对不同平台编写一部分汇编代码,目前仅支持ARM64。
一些x64内部操作码使用“Realmode X86 Emulator Library”的部分内容,请参阅[x64primop.c](../src/emu/x64primop.c)了解版权详情
<img src="img/Box64Icon.png" width="96" height="96">
Logo和图标由grayduck制作,感谢!
----
使用方法
----
若干环境变量可以设置Box64的行为。
点击[这里](USAGE.md)了解所有的环境变量和它们的作用。
请注意:Box64的Dynarec提供了一种机制来处理JIT代码,包含内存保护和段错误信号处理程序。简单地说,如果您想用GDB来调试一个使用JIT代码的运行程序(比如mono/Unity3D),您仍然会触发很多“正常”的段错误。建议在GDB中使用类似于`handle SIGSEGV nostop`的东西,不要在每个段错误时都停止,如果您想捕获段错误,可以在`signals.c`中的`my_memprotectionhandler`中放置一个断点。
----
编译/安装
----
> 编译说明可以在[这里](COMPILE.md)查看。
----
版本历史
----
版本日志在[这里](CHANGELOG.md)。
----
32位平台的注意事项
----
Box64的工作原理是直接将函数调用从x86_64转换到主机系统,主机系统(Box64运行的系统)需要有64位的库。Box64并不包括任何64位<->32位的转换。
所以请理解,Box64只能运行64位的Linux二进制文件。对于32位的二进制文件,需要Box86(在64位的操作系统上需要所有的multiarch库或一些proot技巧)。
请注意,许多(基于mojo的)安装程序,即使存在x86_64版本,但在检测到架构为ARM64时会退回到"x86",这时会尝试使用(如果有)box86进行安装。这时你可以使用一个假的"uname",当它的参数为"-m"时返回"x86_64"。
----
关于Unity游戏模拟的注意事项
----
当前Unity游戏模拟是一件碰运气的事情。Unity使用Mono(它的信号表示,并不总能100%成功模拟)。
您还应该注意,一些Unity3D游戏需要OpenGL 3+,目前在ARM SBC(单板计算机)上提供OpenGL 3+是很棘手的。
所以,并不是所有的Unity游戏都能工作,而且可能需要很高的OpenGL配置,但现在很多游戏都能工作。
提示:如果游戏开始后在显示任何东西之前退出,在Pi4上使用`MESA_GL_VERSION_OVERRIDE=3.2`,在Panfrost上使用`PAN_MESA_DEBUG=gl3`来使用更高的配置文件。
----
关于GTK程序的注意事项
----
GTK 庫現在包裝在 box64 上,但只有 gtk2,而不是 gtk3(與 box86 相反)。
----
关于Steam的注意事项
----
Steam并不是32位/64位混合的,而是32位的,因此您需要Box86才能运行Steam。Steam也使用64位的本地服务器程序,但像大多数使用libcef/chromium的程序一样,在box64上暂时无法正常工作。
所以:目前在box64上无法运行Steam。
----
关于Wine的注意事项
----
box64支持64位Wine,但请注意,64位的Wine还包含32位的组件,以便能够运行32位的Windws程序。32位程序需要Box86,没有它就不能运行。在Box64和Box86共存的系统上,设置64位Wine可以同时运行32位和64位windows程序(只需分别使用 `wine` 和 `wine64`)。
----
关于Vulkan注意事项
----
Box64 包裝 Vulkan 庫。但請注意,它僅使用 RX550 卡進行了測試,根據您的圖形卡,可能會缺少某些擴展。
----
结语
----
我要感谢所有为 box64 开发做出贡献的人。
贡献方式有很多种:代码贡献、财务帮助、捐赠捐赠和广告合作!
以下感谢不分先后:
* 代码贡献:rajdakin, mogery
* 财务帮助:FlyingFathead, stormchaser3000, dennis1248, sll00, [libre-computer-project](https://libre.computer/)
* 硬件捐赠:[Radxa](https://rockpi.org/), [Pine64](https://www.pine64.org/), [StarFive](https://rvspace.org/)
* 硬件捐赠和LoongArch迁移:[xiaoji](https://www.linuxgame.cn)
* 为本项目持续的宣传:salva ([microLinux](https://www.youtube.com/channel/UCwFQAEj1lp3out4n7BeBatQ)), [PILab](https://www.youtube.com/channel/UCgfQjdc5RceRlTGfuthBs7g)/[TwisterOS](https://twisteros.com/) team, [The Byteman](https://www.youtube.com/channel/UCEr8lpIJ3B5Ctc5BvcOHSnA), [NicoD](https://www.youtube.com/channel/UCpv7NFr0-9AB5xoklh3Snhg), ekianjo ([Boilingsteam](https://boilingsteam.com/))
我还要感谢很多人,即使他们只参与了一次本项目。
(如果你的项目中使用了Box64,请不要忘记提及!)
Executable
+308
View File
@@ -0,0 +1,308 @@
Usage
----
There are many environment variables to control Box64 behaviour.
Env. var with * can also be put inside box64rc files
#### BOX64_LOG *
Controls the Verbosity level of the logs
* 0: NONE : No message (except some fatal error). (Default.)
* 1: INFO : Show some minimum log (Example: librairies not found)
* 2: DEBUG : Details a lot of stuff (Example: relocations or functions called).
* 3: DUMP : All DEBUG plus DUMP of all ELF Info.
#### BOX64_ROLLING_LOG *
Show last few wrapped function call when a Signal is caught
* 0: No last function call printed (Default.)
* 1: Last 16 wrapped functions calls printed when a signal is printed. Incompatible with BOX64_LOG>1 (may need BOX64_SHOWSEGV=1 also)
* N: Last N wrapped functions calls printed when a signal is printed. Incompatible with BOX64_LOG>1 (may need BOX64_SHOWSEGV=1 also)
#### BOX64_NOBANNER
Disables Box64 printing its version and build
* 0 : Enable printing its banner. (Default.)
* 1 : Disable printing its banner.
#### BOX64_LD_LIBRARY_PATH *
Path to look for x86_64 libraries. Default is current folder and `lib` in current folder.
Also, `/usr/lib/x86_64-linux-gnu` and `/lib/x86_64-linux-gnu` are added if they exist.
#### BOX64_PATH *
Path to look for x86_64 executable. Default is current folder and `bin` in current folder.
#### BOX64_DLSYM_ERROR *
Enables/Disables the logging of `dlsym` errors.
* 0 : Don't log `dlsym` errors. (Default.)
* 1 : Log dlsym errors.
#### BOX64_TRACE_FILE *
Send all log and trace to a file instead of `stdout`
Also, if name contains `%pid` then this is replaced by the actual PID of box64 instance
End the filename with `+` to have thetrace appended instead of overwriten
Use `stderr` to use this instead of default `stdout`
#### BOX64_TRACE *
Only on build with trace enabled. Trace allow the logging of all instruction executed, along with register dump
* 0 : No trace. (Default.)
* 1 : Trace enabled. Trace start after the initialisation of all depending libraries is done.
* symbolname : Trace only `symbolname` (trace is disable if the symbol is not found).
* 0xXXXXXXX-0xYYYYYYY : Trace only between the 2 addresses.
#### BOX64_TRACE_INIT *
Use BOX64_TRACE_INIT instead of BOX_TRACE to start trace before the initialisation of libraries and the running program
* 0 : No trace. (Default.)
* 1 : Trace enabled. The trace start with the initialisation of all depending libraries is done.
#### BOX64_TRACE_START *
Only on builds with trace enabled.
* NNNNNNN : Start trace only after NNNNNNNN opcode execute (number is an `uint64_t`).
#### BOX64_TRACE_XMM *
Only on builds with trace enabled.
* 0 : The XMM (i.e. SSE/SSE2) register will not be logged with the general and x86 registers. (Default.)
* 1 : Dump the XMM registers.
#### BOX64_TRACE_EMM *
Only on builds with trace enabled.
* 0 : The EMM (i.e. MMX) register will not be logged with the general and x86 registers. (Default.)
* 1 : Dump the EMM registers.
#### BOX64_TRACE_COLOR *
Only on builds with trace enabled.
* 0 : The general registers will always be the default white color. (Default.)
* 1 : The general registers will change color in the dumps when they changed value.
#### BOX64_LOAD_ADDR *
Try to load at 0xXXXXXX main binary (if binary is a PIE)
* 0xXXXXXXXX : The load address . (Only active on PIE programs.)
#### BOX64_NOSIGSEGV *
Disable handling of SigSEGV. (Very useful for debugging.)
* 0 : Let the x86 program set sighandler for SEGV (Default.)
* 1 : Disable the handling of SigSEGV.
#### BOX64_NOSIGILL *
Disable handling of SigILL (to ease debugging mainly).
* 0 : Let x86 program set sighandler for Illegal Instruction
* 1 : Disables the handling of SigILL
#### BOX64_SHOWSEGV *
Show Segfault signal even if a signal handler is present
* 0 : Don"t force show the SIGSEGV analysis (Default.)
* 1 : Show SIGSEGV detail, even if a signal handler is present
#### BOX64_SHOWBT *
Show some Backtrace (Nativ e and Emulated) whgen a signal (SEGV, ILL or BUS) is caught
* 0 : Don"t show backtraces (Default.)
* 1 : Show Backtrace detail (for native, box64 is rename as the x86_64 binary run)
#### BOX64_X11THREADS *
Call XInitThreads when loading X11. (This is mostly for old Loki games with the Loki_Compat library.)
* 0 : Don't force call XInitThreads. (Default.)
* 1 : Call XInitThreads as soon as libX11 is loaded.
#### BOX64_X11GLX *
Force libX11's GLX extension to be present.
* 0 : Do not force libX11's GLX extension to be present.
* 1 : GLX will always be present when using XQueryExtension. (Default.)
#### BOX64_DYNAREC_DUMP *
Enables/disables Box64's Dynarec's dump.
* 0 : Disable Dynarec's blocks dump. (Default.)
* 1 : Enable Dynarec's blocks dump.
* 2 : Enable Dynarec's blocks dump with some colors.
#### BOX64_DYNAREC_LOG *
Set the level of DynaRec's logs.
* 0 : NONE : No Logs for DynaRec. (Default.)
* 1 :INFO : Minimum Dynarec Logs (only unimplemented OpCode).
* 2 : DEBUG : Debug Logs for Dynarec (with details on block created / executed).
* 3 : VERBOSE : All of the above plus more.
#### BOX64_DYNAREC *
Enables/Disables Box64's Dynarec.
* 0 : Disables Dynarec.
* 1 : Enable Dynarec. (Default.)
#### BOX64_DYNAREC_TRACE *
Enables/Disables trace for generated code.
* 0 : Disable trace for generated code. (Default.)
* 1 : Enable trace for generated code (like regular Trace, this will slow down the program a lot and generate huge logs).
#### BOX64_NODYNAREC *
Forbid dynablock creation in the interval specified (helpfull for debugging behaviour difference between Dynarec and Interpretor)
* 0xXXXXXXXX-0xYYYYYYYY : define the interval where dynablock cannot start (inclusive-exclusive)
#### BOX64_DYNAREC_BIGBLOCK *
Enables/Disables Box64's Dynarec building BigBlock.
* 0 : Don't try to build block as big as possible (can help program using lots of thread and a JIT, like C#/Unity) (Default when libmonobdwgc-2.0.so is loaded)
* 1 : Build Dynarec block as big as possible (Default.)
* 2 : Build Dynarec block bigger (don't stop when block overlaps, but only for blocks in elf memory)
* 3 : Build Dynarec block bigger (don't stop when block overlaps, for all type of memory)
#### BOX64_DYNAREC_FORWARD *
Define Box64's Dynarec max allowed forward value when building Block.
* 0 : No forward value. When current block end, don't try to go further even if there are previous forward jumps
* XXX : Allow up to XXXX bytes of gap when building a Block after the block end to next forward jump (Default: 128)
#### BOX64_DYNAREC_STRONGMEM *
Enable/Disable simulation of Strong Memory model
* 0 : Don't try anything special (Default.)
* 1 : Enable some Memory Barrier when reading from memory (on some MOV opcode) to simulate Strong Memory Model while trying to limit performance impact (Default when libmonobdwgc-2.0.so is loaded)
* 2 : Enable some Memory Barrier when reading from memory (on some MOV opcode) to simulate Strong Memory Model
#### BOX64_DYNAREC_X87DOUBLE *
Force the use of Double for x87 emulation
* 0 : Try to use float when possible for x87 emulation (default, faster)
* 1 : Only use Double for x87 emulation (slower, may be needed for some specific games, like Crysis)
#### BOX64_DYNAREC_FASTNAN *
Enable/Disable generation of -NAN
* 0 : Generate -NAN like on x86
* 1 : Don't do anything special with NAN, to go as fast as possible (default, faster)
#### BOX64_DYNAREC_FASTROUND *
Enable/Disable generation of precise x86 rounding
* 0 : Generate float/double -> int rounding like on x86
* 1 : Don't do anything special with edge case Rounding, to go as fast as possible (no INF/NAN/Overflow -> MIN_INT conversion) (default, faster)
#### BOX64_DYNAREC_SAFEFLAGS *
Handling of flags on CALL/RET opcodes
* 0 : Treat CALL/RET as if it never needs any flags (faster but not advised)
* 1 : most of RET will need flags, most of CALLS will not (Default)
* 2 : All CALL/RET will need flags (slower, but might be needed. Automatically enabled for Vara.exe)
#### BOX64_DYNAREC_CALLRET *
Optimisation of CALL/RET opcodes (not compatible with jit/dynarec/smc)
* 0 : Don't optimize CALL/RET, use Jump Table for boths (Default)
* 1 : Try to optimized CALL/RET, skipping the use of the JumpTable when possible (will crash if blacks are invalidate, so probably incompatible with JIT/Dynarec)
#### BOX64_DYNAREC_HOTPAGE *
Handling of HotPage (Page beeing both executed and writen)
* 0 : Don't track hotpage
* 1-255 : Track HotPage, and disable execution of a page beeing writen for N attempts (default is 4)
#### BOX64_DYNAREC_FASTPAGE *
Will use a faster handling of HotPage (Page beeing both executed and writen)
* 0 : use regular hotpage (Default)
* 1 : Use faster hotpage, taking the risk of running obsolete JIT code (might be faster, but more prone to crash)
#### BOX64_DYNAREC_BLEEDING_EDGE *
Detect MonoBleedingEdge and apply conservative settings
* 0 : Don't detect MonoBleedingEdge
* 1 : Detect MonoBleedingEdge, and apply BIGBLOCK=0 STRONGMEM=1 if detected (Default)
#### BOX64_DYNAREC_WAIT *
Behavior with FillBlock is not availble (FillBlock build Dynarec blocks and is not multithreaded)
* 0 : Dynarec will not wait for FillBlock to ready and use Interpreter instead (might speedup a bit massive multithread or JIT programs)
* 1 : Dynarec will wait for FillBlock to be ready (Default)
#### BOX64_SSE_FLUSHTO0 *
Handling of SSE Flush to 0 flags
* 0 : Just track the flag (Default)
* 1 : Direct apply of SSE Flush to 0 flag
#### BOX64_X87_NO80BITS *
Handling of x87 80bits long double
* 0 : Try to handle 80bits long double as precise as possible (Default)
* 1 : Handle them as double
#### BOX64_LIBCEF *
Detect libcef and apply malloc_hack settings
* 0 : Don't detect libcef
* 1 : Detect libcef, and apply MALLOC_HACK=2 if detected (Default)
#### BOX64_LIBGL *
* libXXXX set the name for libGL (defaults to libGL.so.1).
* /PATH/TO/libGLXXX : Sets the name and path for libGL
You can also use SDL_VIDEO_GL_DRIVER
#### BOX64_LD_PRELOAD
* XXXX[:YYYYY] force loading XXXX (and YYYY...) libraries with the binary
PreLoaded libs can be emulated or native, and are treated the same way as if they were comming from the binary
#### BOX64_EMULATED_LIBS *
* XXXX[:YYYYY] force lib XXXX (and YYYY...) to be emulated (and not wrapped)
Some games uses an old version of some libraries, with an ABI incompatible with native version.
Note that LittleInferno for example is auto detected, and libvorbis.so.0 is automatical added to emulated libs, and same for Don't Starve (and Together / Server variant) that use an old SDL2 too
#### BOX64_ALLOWMISSINGLIBS *
Allow Box64 to continue even if a library is missing.
* 0 : Box64 will stop if a library cannot be loaded. (Default.)
* 1 : Continue even if a needed library cannot be loaded. Unadvised, this will, in most cases, crash later on.
#### BOX64_PREFER_WRAPPED *
Box64 will use wrapped libs even if the lib is specified with absolute path
* 0 : Try to use emulated libs when they are defined with absolute path (Default.)
* 1 : Use Wrapped native libs even if path is absolute
#### BOX64_PREFER_EMULATED *
Box64 will prefer emulated libs first (execpt for glibc, alsa, pulse, GL, vulkan and X11
* 0 : Native libs are prefered (Default.)
* 1 : Emulated libs are prefered (Default for program running inside pressure-vessel)
#### BOX64_CRASHHANDLER *
Box64 will use a dummy crashhandler.so library
* 0 : Use Emulated crashhandler.so library if needed
* 1 : Use an internal dummy (completly empty) crashhandler.so library (defaut)
#### BOX64_MALLOC_HACK *
How Box64 will handle hooking of malloc operators
* 0 : Don't allow malloc operator to be redirected, rewriting code to use regular function (Default)
* 1 : Allow malloc operator to be redirected (not advised)
* 2 : Like 0, but track special mmap / free (some redirected functions were inlined and cannot be redirected)
#### BOX64_NOPULSE *
Disables the load of pulseaudio libraries.
* 0 : Load pulseaudio libraries if found. (Default.)
* 1 : Disables the load of pulse audio libraries (libpulse and libpulse-simple), both the native library and the x86 library
#### BOX64_NOGTK *
Disables the loading of wrapped GTK libraries.
* 0 : Load wrapped GTK libraries if found. (Default.)
* 1 : Disables loading wrapped GTK libraries.
#### BOX64_NOVULKAN *
Disables the load of vulkan libraries.
* 0 : Load vulkan libraries if found.
* 1 : Disables the load of vulkan libraries, both the native and the i386 version (can be useful on Pi4, where the vulkan driver is not quite there yet.)
#### BOX64_BASH *
Define x86_64 bash to launch script
* yyyy
Will use yyyy as x86_64 bash to launch script. yyyy needs to be a full path to a valid x86_64 version of bash
#### BOX64_ENV
* XXX=yyyy
will add XXX=yyyy env. var.
#### BOX64_ENV1
* XXX=yyyy
will add XXX=yyyy env. var. and continue with BOX86_ENV2 ... until var doesn't exist
#### BOX64_JITGDB *
* 0 : Just print the Segfault message on segfault (default)
* 1 : Launch `gdb` when a segfault, bus error or illegal instruction signal is trapped, attached to the offending process and go in an endless loop, waiting.
When in gdb, you need to find the correct thread yourself (the one with `my_box64signalhandler` in is stack)
then probably need to `finish` 1 or 2 functions (inside `usleep(..)`) and then you'll be in `my_box64signalhandler`,
just before the printf of the Segfault message. Then simply
`set waiting=0` to exit the infinite loop.
* 2 : Launch `gdbserver` when a segfault, bus error or illegal instruction signal is trapped, attached to the offending process, and go in an endless loop, waiting.
Use `gdb /PATH/TO/box64` and then `target remote 127.0.0.1:1234` to connect to the gdbserver (or use actual IP if not on the machine). After that, the procedure is the same as with ` BOX64_JITGDB=1`.
This mode can be usefullwhen programs redirect all console output to a file (like Unity3D Games)
#### BOX64_NORCFILES
If the env var exist, no rc files (like /etc/box64.box64rc and ~/.box64rc) will be loaded
----
Those variables are only valid inside a rcfile:
----
#### BOX64_NOSANDBOX
* 0 : Nothing special
* 1 : Added "--no-sandbox" to command line arguments (usefull for chrome based programs)
#### BOX64_EXIT
* 0 : Nothing special
* 1 : Just exit, don't try to run the program
+177
View File
@@ -0,0 +1,177 @@
# Installing Wine64
Running Wine64/Wine with Box64/Box86 allows x64/x86 Windows programs to run on 64-bit ARM Linux devices.
- Box64 needs `wine-amd64` to be installed **manually** on ARM64 (aarch64) devices. This will run 64-bit Windows programs (aka x86_64).
- Box86 needs `wine-i386` to be installed **manually** on ARM32 (armhf) devices (or on ARM64 with multiarch or chroot). This will run 32-bit Windows programs (aka x86).
- _Note that `wine:arm64` and `wine:armhf` will not work with Box64/Box86. Your device's package manager might try to install those if you ask it to install wine._
See installation steps below (in the [Examples](#examples) section).
## Overview
The general procedure for installing Wine64 & Wine for Box64 & Box86 is to...
- Download all the install files for the version of Wine you wish to install
- Unzip or dpkg the install files into one folder
- Move that folder to the directory that you wish Wine to run from (often `~/wine/` by default)
- Go to `/usr/local/bin` and make symlinks or scripts that will point to your main wine binaries.
- Boot wine to create a new wineprefix.
- Download winetricks (which is just a complicated bash script), make it executable, then copy it to `/usr/local/bin`.
## Examples
### Installing Wine64 & Wine for Box64 & Box86 on Raspberry Pi OS from WineHQ .deb files
_Links from the [WineHQ repo](https://dl.winehq.org/wine-builds/debian/dists/)_
This install method allows you to install different versions of Wine64/Wine. You may install any version/branch of Wine that you wish.
```
# NOTE: Can only run on aarch64 (since box64 can only run on aarch64)
# box64 runs wine-amd64, box86 runs wine-i386.
### User-defined Wine version variables ################
# - Replace the variables below with your system's info.
# - Note that we need the amd64 version for Box64 even though we're installing it on our ARM processor.
# - Note that we need the i386 version for Box86 even though we're installing it on our ARM processor.
# - Wine download links from WineHQ: https://dl.winehq.org/wine-builds/
local branch="devel" #example: devel, staging, or stable (wine-staging 4.5+ requires libfaudio0:i386)
local version="7.1" #example: "7.1"
local id="debian" #example: debian, ubuntu
local dist="bullseye" #example (for debian): bullseye, buster, jessie, wheezy, ${VERSION_CODENAME}, etc
local tag="-1" #example: -1 (some wine .deb files have -1 tag on the end and some don't)
########################################################
# Clean up any old wine instances
wineserver -k # stop any old wine installations from running
rm -rf ~/.cache/wine # remove any old wine-mono/wine-gecko install files
rm -rf ~/.local/share/applications/wine # remove any old program shortcuts
# Backup any old wine installs
rm -rf ~/wine-old 2>/dev/null; mv ~/wine ~/wine-old 2>/dev/null
rm -rf ~/.wine-old 2>/dev/null; mv ~/.wine ~/.wine-old 2>/dev/null
sudo mv /usr/local/bin/wine /usr/local/bin/wine-old 2>/dev/null
sudo mv /usr/local/bin/wine64 /usr/local/bin/wine-old 2>/dev/null
sudo mv /usr/local/bin/wineboot /usr/local/bin/wineboot-old 2>/dev/null
sudo mv /usr/local/bin/winecfg /usr/local/bin/winecfg-old 2>/dev/null
sudo mv /usr/local/bin/wineserver /usr/local/bin/wineserver-old 2>/dev/null
# Wine download links from WineHQ: https://dl.winehq.org/wine-builds/
LNKA="https://dl.winehq.org/wine-builds/${id}/dists/${dist}/main/binary-amd64/" #amd64-wine links
DEB_A1="wine-${branch}-amd64_${version}~${dist}${tag}_amd64.deb" #wine64 main bin
DEB_A2="wine-${branch}_${version}~${dist}${tag}_amd64.deb" #wine64 support files (required for wine64 / can work alongside wine_i386 main bin)
#DEB_A3="winehq-${branch}_${version}~${dist}${tag}_amd64.deb" #shortcuts & docs
LNKB="https://dl.winehq.org/wine-builds/${id}/dists/${dist}/main/binary-i386/" #i386-wine links
DEB_B1="wine-${branch}-i386_${version}~${dist}${tag}_i386.deb" #wine_i386 main bin
DEB_B2="wine-${branch}_${version}~${dist}${tag}_i386.deb" #wine_i386 support files (required for wine_i386 if no wine64 / CONFLICTS WITH wine64 support files)
#DEB_B3="winehq-${branch}_${version}~${dist}${tag}_i386.deb" #shortcuts & docs
# Install amd64-wine (64-bit) alongside i386-wine (32-bit)
echo -e "Downloading wine . . ."
wget -q ${LNKA}${DEB_A1}
wget -q ${LNKA}${DEB_A2}
wget -q ${LNKB}${DEB_B1}
echo -e "Extracting wine . . ."
dpkg-deb -x ${DEB_A1} wine-installer
dpkg-deb -x ${DEB_A2} wine-installer
dpkg-deb -x ${DEB_B1} wine-installer
echo -e "Installing wine . . ."
mv wine-installer/opt/wine* ~/wine
# Download wine dependencies
# - these packages are needed for running box86/wine-i386 on a 64-bit RPiOS via multiarch
sudo dpkg --add-architecture armhf && sudo apt-get update # enable multi-arch
sudo apt-get install -y libasound2:armhf libc6:armhf libglib2.0-0:armhf libgphoto2-6:armhf libgphoto2-port12:armhf \
libgstreamer-plugins-base1.0-0:armhf libgstreamer1.0-0:armhf libldap-2.4-2:armhf libopenal1:armhf libpcap0.8:armhf \
libpulse0:armhf libsane1:armhf libudev1:armhf libusb-1.0-0:armhf libvkd3d1:armhf libx11-6:armhf libxext6:armhf \
libasound2-plugins:armhf ocl-icd-libopencl1:armhf libncurses6:armhf libncurses5:armhf libcap2-bin:armhf libcups2:armhf \
libdbus-1-3:armhf libfontconfig1:armhf libfreetype6:armhf libglu1-mesa:armhf libglu1:armhf libgnutls30:armhf \
libgssapi-krb5-2:armhf libkrb5-3:armhf libodbc1:armhf libosmesa6:armhf libsdl2-2.0-0:armhf libv4l-0:armhf \
libxcomposite1:armhf libxcursor1:armhf libxfixes3:armhf libxi6:armhf libxinerama1:armhf libxrandr2:armhf \
libxrender1:armhf libxxf86vm1 libc6:armhf libcap2-bin:armhf # to run wine-i386 through box86:armhf on aarch64
# This list found by downloading...
# wget https://dl.winehq.org/wine-builds/debian/dists/bullseye/main/binary-i386/wine-devel-i386_7.1~bullseye-1_i386.deb
# wget https://dl.winehq.org/wine-builds/debian/dists/bullseye/main/binary-i386/winehq-devel_7.1~bullseye-1_i386.deb
# wget https://dl.winehq.org/wine-builds/debian/dists/bullseye/main/binary-i386/wine-devel_7.1~bullseye-1_i386.deb
# then `dpkg-deb -I package.deb`. Read output, add `:armhf` to packages in dep list, then try installing them on Pi aarch64.
# - these packages are needed for running box64/wine-amd64 on RPiOS (box64 only runs on 64-bit OS's)
sudo apt-get install -y libasound2:arm64 libc6:arm64 libglib2.0-0:arm64 libgphoto2-6:arm64 libgphoto2-port12:arm64 \
libgstreamer-plugins-base1.0-0:arm64 libgstreamer1.0-0:arm64 libldap-2.4-2:arm64 libopenal1:arm64 libpcap0.8:arm64 \
libpulse0:arm64 libsane1:arm64 libudev1:arm64 libunwind8:arm64 libusb-1.0-0:arm64 libvkd3d1:arm64 libx11-6:arm64 libxext6:arm64 \
ocl-icd-libopencl1:arm64 libasound2-plugins:arm64 libncurses6:arm64 libncurses5:arm64 libcups2:arm64 \
libdbus-1-3:arm64 libfontconfig1:arm64 libfreetype6:arm64 libglu1-mesa:arm64 libgnutls30:arm64 \
libgssapi-krb5-2:arm64 libjpeg62-turbo:arm64 libkrb5-3:arm64 libodbc1:arm64 libosmesa6:arm64 libsdl2-2.0-0:arm64 libv4l-0:arm64 \
libxcomposite1:arm64 libxcursor1:arm64 libxfixes3:arm64 libxi6:arm64 libxinerama1:arm64 libxrandr2:arm64 \
libxrender1:arm64 libxxf86vm1:arm64 libc6:arm64 libcap2-bin:arm64
# This list found by downloading...
# wget https://dl.winehq.org/wine-builds/debian/dists/bullseye/main/binary-amd64/wine-devel_7.1~bullseye-1_amd64.deb
# wget https://dl.winehq.org/wine-builds/debian/dists/bullseye/main/binary-amd64/wine-devel-amd64_7.1~bullseye-1_amd64.deb
# then `dpkg-deb -I package.deb`. Read output, add `:arm64` to packages in dep list, then try installing them on Pi aarch64.
# These packages are needed for running wine-staging on RPiOS (Credits: chills340)
sudo apt install libstb0 -y
cd ~/Downloads
wget -r -l1 -np -nd -A "libfaudio0_*~bpo10+1_i386.deb" http://ftp.us.debian.org/debian/pool/main/f/faudio/ # Download libfaudio i386 no matter its version number
dpkg-deb -xv libfaudio0_*~bpo10+1_i386.deb libfaudio
sudo cp -TRv libfaudio/usr/ /usr/
rm libfaudio0_*~bpo10+1_i386.deb # clean up
rm -rf libfaudio # clean up
# Install symlinks
sudo ln -s ~/wine/bin/wine /usr/local/bin/wine
sudo ln -s ~/wine/bin/wine64 /usr/local/bin/wine64
sudo ln -s ~/wine/bin/wineboot /usr/local/bin/wineboot
sudo ln -s ~/wine/bin/winecfg /usr/local/bin/winecfg
sudo ln -s ~/wine/bin/wineserver /usr/local/bin/wineserver
sudo chmod +x /usr/local/bin/wine /usr/local/bin/wine64 /usr/local/bin/wineboot /usr/local/bin/winecfg /usr/local/bin/wineserver
```
## Installing winetricks
Winetricks is a bash script which makes it easier to install & configure any desired Windows core system software packages which may be dependencies for certain Windows programs. You can either install it with `apt`, or manually using the steps below.
```
sudo apt-get install cabextract -y # winetricks needs this installed
sudo mv /usr/local/bin/winetricks /usr/local/bin/winetricks-old # Backup old winetricks
cd ~/Downloads && wget https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks # Download
sudo chmod +x winetricks && sudo mv winetricks /usr/local/bin/ # Install
```
Whenever we run winetricks, we must tell Box86 to supress its info banner, otherwise winetricks will crash. Box86's info banner can be suppressed using the `BOX86_NOBANNER=1` environment variable before invoking winetricks (example: `BOX86_NOBANNER=1 winetricks`).
If `apt` installed a desktop menu shortcut for winetricks (or if you make your own desktop shortcut for winetricks) then you may need to edit that shortcut to include Box86's BOX86_NOBANNER=1 env var. With your favorite text editor, edit `/usr/share/applications/winetricks.desktop` and change `Exec=winetricks --gui` to `Exec=env BOX86_NOBANNER=1 winetricks --gui`.
## Example commands
Creating a 64-bit wineprefix:
`wine64 wineboot` or `wine wineboot` (wineprefix is created in `~/.wine/`)
`WINEPREFIX="$HOME/prefix64" wine wineboot` (wineprefix is created in `~/prefix64/`) _Note: You will need to invoke `WINEPREFIX="$HOME/prefix64"` before every command to use this wineprefix._
Creating a 32-bit wineprefix:
`WINEARCH=win32 wine wineboot` (wineprefix is created in `~/.wine/`)
Fore-quitting wine:
`wineserver -k`
Running Wine Configuration:
`winecfg`
Using winetricks:
`winetricks -q corefonts vcrun2010 dotnet20sp1`
_This command will silently install three packages in series: Windows core fonts, VC++ 2010 Runtimes, and .NET 2.0 SP1. `-q` is the "install silent/quiet" command._
Invoking Box86's logging features (with `BOX86_LOG=1` or similar) will cause winetricks to crash.
For a list of all the different Windows packages & libraries that winetricks can help you install, run `winetricks list-all`
## Other notes
### Wineprefixes (and Wine initialization)
When you first run or boot Wine (`wine wineboot`), Wine will create a new user environment within which to install Windows software. This user environment is called a "wineprefix" (or "wine bottle") and is located (by default) in `~/.wine` (note that Linux folders with a `.` in front of them are "hidden" folders). Think of a wineprefix as Wine's virtual 'harddrive' where it installs software and saves settings. Wineprefixes are portable and deletable. For more Wine documentation, see [WineHQ](https://www.winehq.org/documentation).
If you at any point corrupt something inside your default wineprefix, you can start "fresh" by deleting your `~/.wine` directory (with the `rm -rf ~/.wine` command) and boot wine again to create a new default wineprefix.
### Transplanting wineprefixes
If software isn't installing in Wine with Box86, but is installing for you in Wine on a regular x86 Linux computer, you can copy a wineprefix from your x86 Linux computer to the device you're running Box86 on. This is most easily done by tarring the `~/.wine` folder on your x86 Linux computer (`tar -cvf winebottle.tar ~/.wine`), transferring the tar file to your device, then un-tarring the tar file (`tar -xf winebottle.tar`) on your device running Box86 & Wine. Tarring the wineprefix preserves any symlinks that are inside it.
### Swapping out different versions of Wine
Some versions of Wine work better with certain software. It is best to install a version of Wine that is known to work with the software you would like to run. There are three main development branches of Wine you can pick from, referred to as wine-stable, wine-devel, and wine-staging. _Note that the wine-staging branch requires extra installation steps on Raspberry Pi._
Your entire Wine installation can reside within a single folder on your Linux computer. TwisterOS assumes that your Wine installation is located inside the `~/wine/` directory. The actual directory where you put your `wine` folder doesn't matter as long as you have symlinks within the `/usr/local/bin/` directory which point to the `wine` folder so that Linux can find Wine when you type `wine` into the terminal).
You can change which version of Wine you are running simply by renaming your old `wine` and `.wine` folders to something else, then putting a new `wine` folder (containing your new version of Wine) in its place. Running `wine wineboot` again will migrate a wineprefix from an older version of Wine to be usable by the newer version of Wine you just installed. You can check which version of Wine you're running with the `wine --version` command.
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

+38
View File
@@ -0,0 +1,38 @@
# Maintainer: Jai-JAP <[email protected]>
# Author: Sebastien Chevalier <[email protected]>
pkgname=box64-arm64-git
pkgver=r1495.e6e9fae
pkgrel=1
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
arch=('aarch64')
url="https://github.com/ptitSeb/box64"
license=('MIT')
optdepends=('gl4es: OpenGL 2 for GLES 2 devices')
makedepends=('git' 'cmake' 'make')
provides=("${pkgname%-git}" "${pkgname%-arm64-git}-git" "${pkgname%-arm64-git}")
conflicts=("${pkgname%-git}" "${pkgname%-arm64-git}-git" "${pkgname%-arm64-git}")
source=('git+https://github.com/ptitSeb/box64')
md5sums=('SKIP')
pkgver() {
cd "$srcdir/${pkgname%-arm64-git}"
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
}
prepare() {
cd "${srcdir}/${pkgname%-arm64-git}"
if [[ ! -d ./build ]]; then
mkdir build && cd build
cmake .. -DARM_DYNAREC=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/usr
fi
}
build() {
cd "$srcdir/${pkgname%-arm64-git}/build"
make -j$(nproc)
}
package() {
cd "$srcdir/${pkgname%-arm64-git}/build"
make DESTDIR="${pkgdir}/" install
}
+38
View File
@@ -0,0 +1,38 @@
# Maintainer: Jai-JAP <[email protected]>
# Author: Sebastien Chevalier <[email protected]>
pkgname=box64-arm64-git
pkgver=r1495.e6e9fae
pkgrel=1
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
arch=('aarch64')
url="https://github.com/ptitSeb/box64"
license=('MIT')
optdepends=('gl4es: OpenGL 2 for GLES 2 devices')
makedepends=('git' 'cmake' 'make')
provides=("${pkgname%-git}" "${pkgname%-arm64-git}-git" "${pkgname%-arm64-git}")
conflicts=("${pkgname%-git}" "${pkgname%-arm64-git}-git" "${pkgname%-arm64-git}")
source=('git+https://github.com/ptitSeb/box64')
md5sums=('SKIP')
pkgver() {
cd "$srcdir/${pkgname%-arm64-git}"
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
}
prepare() {
cd "${srcdir}/${pkgname%-arm64-git}"
if [[ ! -d ./build ]]; then
mkdir build && cd build
cmake .. -DARM_DYNAREC=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr
fi
}
build() {
cd "$srcdir/${pkgname%-arm64-git}/build"
make -j$(nproc)
}
package() {
cd "$srcdir/${pkgname%-arm64-git}/build"
make DESTDIR="${pkgdir}/" install
}
+38
View File
@@ -0,0 +1,38 @@
# Maintainer: Jai-JAP <[email protected]>
# Author: Sebastien Chevalier <[email protected]>
pkgname=box64-lx2160a-git
pkgver=r1495.e6e9fae
pkgrel=1
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
arch=('aarch64')
url="https://github.com/ptitSeb/box64"
license=('MIT')
optdepends=('gl4es: OpenGL 2 for GLES 2 devices')
makedepends=('git' 'cmake' 'make')
provides=("${pkgname%-git}" "${pkgname%-lx2160a-git}-git" "${pkgname%-lx2160a-git}")
conflicts=("${pkgname%-git}" "${pkgname%-lx2160a-git}-git" "${pkgname%-lx2160a-git}")
source=('git+https://github.com/ptitSeb/box64')
md5sums=('SKIP')
pkgver() {
cd "$srcdir/${pkgname%-lx2160a-git}"
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
}
prepare() {
cd "${srcdir}/${pkgname%-lx2160a-git}"
if [[ ! -d ./build ]]; then
mkdir build && cd build
cmake .. -DLX2160A=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/usr
fi
}
build() {
cd "$srcdir/${pkgname%-lx2160a-git}/build"
make -j$(nproc)
}
package() {
cd "$srcdir/${pkgname%-lx2160a-git}/build"
make DESTDIR="${pkgdir}/" install
}
+38
View File
@@ -0,0 +1,38 @@
# Maintainer: Jai-JAP <[email protected]>
# Author: Sebastien Chevalier <[email protected]>
pkgname=box64-lx2160a-git
pkgver=r1495.e6e9fae
pkgrel=1
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
arch=('aarch64')
url="https://github.com/ptitSeb/box64"
license=('MIT')
optdepends=('gl4es: OpenGL 2 for GLES 2 devices')
makedepends=('git' 'cmake' 'make')
provides=("${pkgname%-git}" "${pkgname%-lx2160a-git}-git" "${pkgname%-lx2160a-git}")
conflicts=("${pkgname%-git}" "${pkgname%-lx2160a-git}-git" "${pkgname%-lx2160a-git}")
source=('git+https://github.com/ptitSeb/box64')
md5sums=('SKIP')
pkgver() {
cd "$srcdir/${pkgname%-lx2160a-git}"
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
}
prepare() {
cd "${srcdir}/${pkgname%-lx2160a-git}"
if [[ ! -d ./build ]]; then
mkdir build && cd build
cmake .. -DLX2160A=1 -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr
fi
}
build() {
cd "$srcdir/${pkgname%-lx2160a-git}/build"
make -j$(nproc)
}
package() {
cd "$srcdir/${pkgname%-lx2160a-git}/build"
make DESTDIR="${pkgdir}/" install
}
+38
View File
@@ -0,0 +1,38 @@
# Maintainer: Jai-JAP <[email protected]>
# Author: Sebastien Chevalier <[email protected]>
pkgname=box86-rk3399-git
pkgver=r1495.e6e9fae
pkgrel=1
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
arch=('aarch64')
url="https://github.com/ptitSeb/box64"
license=('MIT')
optdepends=('gl4es: OpenGL 2 for GLES 2 devices')
makedepends=('git' 'cmake' 'make')
provides=("${pkgname%-git}" "${pkgname%-rk3399-git}-git" "${pkgname%-rk3399-git}")
conflicts=("${pkgname%-git}" "${pkgname%-rk3399-git}-git" "${pkgname%-rk3399-git}")
source=('git+https://github.com/ptitSeb/box64')
md5sums=('SKIP')
pkgver() {
cd "$srcdir/${pkgname%-rk3399-git}"
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
}
prepare() {
cd "${srcdir}/${pkgname%-rk3399-git}"
if [[ ! -d ./build ]]; then
mkdir build && cd build
cmake .. -DRK3399=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/usr
fi
}
build() {
cd "$srcdir/${pkgname%-rk3399-git}/build"
make -j$(nproc)
}
package() {
cd "$srcdir/${pkgname%-rk3399-git}/build"
make DESTDIR="${pkgdir}/" install
}
+38
View File
@@ -0,0 +1,38 @@
# Maintainer: Jai-JAP <[email protected]>
# Author: Sebastien Chevalier <[email protected]>
pkgname=box86-rk3399-git
pkgver=r1495.e6e9fae
pkgrel=1
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
arch=('aarch64')
url="https://github.com/ptitSeb/box64"
license=('MIT')
optdepends=('gl4es: OpenGL 2 for GLES 2 devices')
makedepends=('git' 'cmake' 'make')
provides=("${pkgname%-git}" "${pkgname%-rk3399-git}-git" "${pkgname%-rk3399-git}")
conflicts=("${pkgname%-git}" "${pkgname%-rk3399-git}-git" "${pkgname%-rk3399-git}")
source=('git+https://github.com/ptitSeb/box64')
md5sums=('SKIP')
pkgver() {
cd "$srcdir/${pkgname%-rk3399-git}"
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
}
prepare() {
cd "${srcdir}/${pkgname%-rk3399-git}"
if [[ ! -d ./build ]]; then
mkdir build && cd build
cmake .. -DRK3399=1 -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr
fi
}
build() {
cd "$srcdir/${pkgname%-rk3399-git}/build"
make -j$(nproc)
}
package() {
cd "$srcdir/${pkgname%-rk3399-git}/build"
make DESTDIR="${pkgdir}/" install
}
+38
View File
@@ -0,0 +1,38 @@
# Maintainer: Jai-JAP <[email protected]>
# Author: Sebastien Chevalier <[email protected]>
pkgname=box64-rpi-git
pkgver=r1495.e6e9fae
pkgrel=1
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
arch=('aarch64')
url="https://github.com/ptitSeb/box64"
license=('MIT')
optdepends=('gl4es: OpenGL 2 for GLES 2 devices')
makedepends=('git' 'cmake' 'make')
provides=("${pkgname%-git}" "${pkgname%-rpi-git}-git" "${pkgname%-rpi-git}")
conflicts=("${pkgname%-git}" "${pkgname%-rpi-git}-git" "${pkgname%-rpi-git}")
source=('git+https://github.com/ptitSeb/box64')
md5sums=('SKIP')
pkgver() {
cd "$srcdir/${pkgname%-rpi-git}"
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
}
prepare() {
cd "${srcdir}/${pkgname%-rpi-git}"
if [[ ! -d ./build ]]; then
mkdir build && cd build
cmake .. -DRPI4ARM64=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/usr
fi
}
build() {
cd "$srcdir/${pkgname%-rpi-git}/build"
make -j$(nproc)
}
package() {
cd "$srcdir/${pkgname%-rpi-git}/build"
make DESTDIR="${pkgdir}/" install
}
+38
View File
@@ -0,0 +1,38 @@
# Maintainer: Jai-JAP <[email protected]>
# Author: Sebastien Chevalier <[email protected]>
pkgname=box64-rpi-git
pkgver=r1495.e6e9fae
pkgrel=1
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
arch=('aarch64')
url="https://github.com/ptitSeb/box64"
license=('MIT')
optdepends=('gl4es: OpenGL 2 for GLES 2 devices')
makedepends=('git' 'cmake' 'make')
provides=("${pkgname%-git}" "${pkgname%-rpi-git}-git" "${pkgname%-rpi-git}")
conflicts=("${pkgname%-git}" "${pkgname%-rpi-git}-git" "${pkgname%-rpi-git}")
source=('git+https://github.com/ptitSeb/box64')
md5sums=('SKIP')
pkgver() {
cd "$srcdir/${pkgname%-rpi-git}"
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
}
prepare() {
cd "${srcdir}/${pkgname%-rpi-git}"
if [[ ! -d ./build ]]; then
mkdir build && cd build
cmake .. -DRPI4ARM64=1 -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr
fi
}
build() {
cd "$srcdir/${pkgname%-rpi-git}/build"
make -j$(nproc)
}
package() {
cd "$srcdir/${pkgname%-rpi-git}/build"
make DESTDIR="${pkgdir}/" install
}
+38
View File
@@ -0,0 +1,38 @@
# Maintainer: Jai-JAP <[email protected]>
# Author: Sebastien Chevalier <[email protected]>
pkgname=box64-tegra-git
pkgver=r1495.e6e9fae
pkgrel=1
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
arch=('aarch64')
url="https://github.com/ptitSeb/box64"
license=('MIT')
optdepends=('gl4es: OpenGL 2 for GLES 2 devices')
makedepends=('git' 'cmake' 'make')
provides=("${pkgname%-git}" "${pkgname%-tegra-git}-git" "${pkgname%-tegra-git}")
conflicts=("${pkgname%-git}" "${pkgname%-tegra-git}-git" "${pkgname%-tegra-git}")
source=('git+https://github.com/ptitSeb/box64')
md5sums=('SKIP')
pkgver() {
cd "$srcdir/${pkgname%-tegra-git}"
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
}
prepare() {
cd "${srcdir}/${pkgname%-tegra-git}"
if [[ ! -d ./build ]]; then
mkdir build && cd build
cmake .. -DTEGRAX1=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/usr
fi
}
build() {
cd "$srcdir/${pkgname%-tegra-git}/build"
make -j$(nproc)
}
package() {
cd "$srcdir/${pkgname%-tegra-git}/build"
make DESTDIR="${pkgdir}/" install
}
+38
View File
@@ -0,0 +1,38 @@
# Maintainer: Jai-JAP <[email protected]>
# Author: Sebastien Chevalier <[email protected]>
pkgname=box64-tegra-git
pkgver=r1495.e6e9fae
pkgrel=1
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
arch=('aarch64')
url="https://github.com/ptitSeb/box64"
license=('MIT')
optdepends=('gl4es: OpenGL 2 for GLES 2 devices')
makedepends=('git' 'cmake' 'make')
provides=("${pkgname%-git}" "${pkgname%-tegra-git}-git" "${pkgname%-tegra-git}")
conflicts=("${pkgname%-git}" "${pkgname%-tegra-git}-git" "${pkgname%-tegra-git}")
source=('git+https://github.com/ptitSeb/box64')
md5sums=('SKIP')
pkgver() {
cd "$srcdir/${pkgname%-tegra-git}"
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
}
prepare() {
cd "${srcdir}/${pkgname%-tegra-git}"
if [[ ! -d ./build ]]; then
mkdir build && cd build
cmake .. -DTEGRAX1=1 -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr
fi
}
build() {
cd "$srcdir/${pkgname%-tegra-git}/build"
make -j$(nproc)
}
package() {
cd "$srcdir/${pkgname%-tegra-git}/build"
make DESTDIR="${pkgdir}/" install
}
+37
View File
@@ -0,0 +1,37 @@
# Maintainer: Jai-JAP <[email protected]>
# Author: Sebastien Chevalier <[email protected]>
pkgname=box64-x64-git
pkgver=r1495.e6e9fae
pkgrel=1
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
arch=('aarch64')
url="https://github.com/ptitSeb/box64"
license=('MIT')
makedepends=('git' 'cmake' 'make')
provides=("${pkgname%-git}" "${pkgname%-x64-git}-git" "${pkgname%-x64-git}")
conflicts=("${pkgname%-git}" "${pkgname%-x64-git}-git" "${pkgname%-x64-git}")
source=('git+https://github.com/ptitSeb/box64')
md5sums=('SKIP')
pkgver() {
cd "$srcdir/${pkgname%-x64-git}"
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
}
prepare() {
cd "${srcdir}/${pkgname%-x64-git}"
if [[ ! -d ./build ]]; then
mkdir build && cd build
cmake .. -DLD80BITS=1 -DNOALIGN=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/usr
fi
}
build() {
cd "$srcdir/${pkgname%-x64-git}/build"
make -j$(nproc)
}
package() {
cd "$srcdir/${pkgname%-x64-git}/build"
make DESTDIR="${pkgdir}/" install
}
+37
View File
@@ -0,0 +1,37 @@
# Maintainer: Jai-JAP <[email protected]>
# Author: Sebastien Chevalier <[email protected]>
pkgname=box64-x64-git
pkgver=r1495.e6e9fae
pkgrel=1
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
arch=('aarch64')
url="https://github.com/ptitSeb/box64"
license=('MIT')
makedepends=('git' 'cmake' 'make')
provides=("${pkgname%-git}" "${pkgname%-x64-git}-git" "${pkgname%-x64-git}")
conflicts=("${pkgname%-git}" "${pkgname%-x64-git}-git" "${pkgname%-x64-git}")
source=('git+https://github.com/ptitSeb/box64')
md5sums=('SKIP')
pkgver() {
cd "$srcdir/${pkgname%-x64-git}"
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
}
prepare() {
cd "${srcdir}/${pkgname%-x64-git}"
if [[ ! -d ./build ]]; then
mkdir build && cd build
cmake .. -DLD80BITS=1 -DNOALIGN=1 -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr
fi
}
build() {
cd "$srcdir/${pkgname%-x64-git}/build"
make -j$(nproc)
}
package() {
cd "$srcdir/${pkgname%-x64-git}/build"
make DESTDIR="${pkgdir}/" install
}
+24
View File
@@ -0,0 +1,24 @@
# The directory containing all PKGBUILDs for BOX64
## FAQ
### 1. How to use it?
Just download the `PKGBUILD-<your-platform>` (no need to download the whole repository), go to directory where you downloaded and type:
```sh
mv ./PKGBUILD-<your-platform> ./PKGBUILD
cd ..
makepkg -si
```
This will copy the PKGBUILD for your platform (where you type your platform name instead of `<your-platform>`), build it and install the PKGBUILD on 64-bit Archlinux ARM.
In the future, I might try to do an unified PKGBUILD for all platforms that will recognize your platform automatically.
### 2. What platforms are currently supported.
All specified in [COMPILE.md](../docs/COMPILE.md).
### 3. Any advantages with this solution?
This might give you some advantages like:
- automatic updates (with some AUR frontends like [`pamac-aur`](https://aur.archlinux.org/packages/pamac-aur/) or [`yay`](https://aur.archlinux.org/packages/yay));
- easily uninstall with `pacman -R` when no needed (no need other scripts nor Makefile to do this);
- your `box64` installation is recognized as a package (where it wasn't when installing with `make install`).
### Note: You can use [makedeb](https://github.com/makedeb/makedeb) (or) [pkgbuild2spec](https://github.com/prozum/pkgbuild2spec) to compile box64 to .deb or .rpm installer files.
Executable
+2
View File
@@ -0,0 +1,2 @@
#!/bin/sh
systemctl restart systemd-binfmt
+1315 -488
View File
File diff suppressed because it is too large. Load diff
+11
View File
@@ -32,6 +32,9 @@ execute_process(
# if the return value is !=0 bail out
if( TEST_RESULT )
get_filename_component(TESTNAME "${TEST_ARGS}" NAME)
file(RENAME "${TEST_OUTPUT}" "${CMAKE_BINARY_DIR}/${TESTNAME}.out")
file(WRITE "${CMAKE_BINARY_DIR}/${TESTNAME}.err" ${TEST_ERROR})
message( FATAL_ERROR "Failed: Test program ${TEST_PROGRAM} exited != 0.\n${TEST_ERROR}" )
endif( TEST_RESULT )
@@ -43,8 +46,16 @@ execute_process(
# again, if return value is !=0 scream and shout
if( TEST_RESULT )
get_filename_component(TESTNAME "${TEST_ARGS}" NAME)
file(RENAME "${TEST_OUTPUT}" "${CMAKE_BINARY_DIR}/${TESTNAME}.out")
file(WRITE "${CMAKE_BINARY_DIR}/${TESTNAME}.err" ${TEST_ERROR})
message( FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} did not match ${TEST_REFERENCE}")
endif( TEST_RESULT )
# remove the temporary files if they exist
if( EXISTS ${TEST_OUTPUT} )
file(REMOVE "${TEST_OUTPUT}")
endif()
# everything went fine...
message( "Passed: The output of ${TEST_PROGRAM} matches ${TEST_REFERENCE}" )
+174 -72
View File
@@ -5,6 +5,7 @@
#include <dlfcn.h>
#include <signal.h>
#include <sys/mman.h>
#include <pthread.h>
#include "box64context.h"
#include "debug.h"
@@ -18,6 +19,8 @@
#include "wrapper.h"
#include "x64emu.h"
#include "signals.h"
#include "rcfile.h"
#include "gltools.h"
EXPORTDYN
void initAllHelpers(box64context_t* context)
@@ -27,6 +30,7 @@ void initAllHelpers(box64context_t* context)
return;
my_context = context;
init_pthread_helper();
init_bridge_helper();
init_signal_helper(context);
inited = 1;
}
@@ -37,9 +41,10 @@ void finiAllHelpers(box64context_t* context)
static int finied = 0;
if(finied)
return;
DeleteParams();
fini_pthread_helper(context);
fini_signal_helper();
cleanAlternate();
fini_bridge_helper();
fini_custommem_helper(context);
finied = 1;
}
@@ -61,12 +66,117 @@ void free_tlsdatasize(void* p)
if(!p)
return;
tlsdatasize_t *data = (tlsdatasize_t*)p;
free(data->tlsdata);
free(p);
box_free(data->ptr);
box_free(p);
}
void x64Syscall(x64emu_t *emu);
int unlockMutex()
{
int ret = unlockCustommemMutex();
int i;
#ifdef DYNAREC
uint32_t tid = (uint32_t)GetTID();
#define GO(A, B) \
i = (native_lock_storeifref2_d(&A, 0, tid)==tid); \
if(i) { \
ret|=(1<<B); \
}
#else
#define GO(A, B) \
i = checkUnlockMutex(&A); \
if(i) { \
ret|=(1<<B); \
}
#endif
GO(my_context->mutex_trace, 7)
#ifdef DYNAREC
GO(my_context->mutex_dyndump, 8)
#else
GO(my_context->mutex_lock, 8)
#endif
GO(my_context->mutex_tls, 9)
GO(my_context->mutex_thread, 10)
GO(my_context->mutex_bridge, 11)
#undef GO
return ret;
}
void relockMutex(int locks)
{
relockCustommemMutex(locks);
#define GO(A, B) \
if(locks&(1<<B)) \
mutex_trylock(&A); \
GO(my_context->mutex_trace, 7)
#ifdef DYNAREC
GO(my_context->mutex_dyndump, 8)
#else
GO(my_context->mutex_lock, 8)
#endif
GO(my_context->mutex_tls, 9)
GO(my_context->mutex_thread, 10)
GO(my_context->mutex_bridge, 11)
#undef GO
}
static void init_mutexes(box64context_t* context)
{
#ifndef DYNAREC
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);
pthread_mutex_init(&context->mutex_lock, &attr);
pthread_mutex_init(&context->mutex_trace, &attr);
pthread_mutex_init(&context->mutex_tls, &attr);
pthread_mutex_init(&context->mutex_thread, &attr);
pthread_mutex_init(&context->mutex_bridge, &attr);
pthread_mutexattr_destroy(&attr);
#else
native_lock_store(&context->mutex_trace, 0);
native_lock_store(&context->mutex_tls, 0);
native_lock_store(&context->mutex_thread, 0);
native_lock_store(&context->mutex_bridge, 0);
native_lock_store(&context->mutex_dyndump, 0);
#endif
}
static void atfork_child_box64context(void)
{
// (re)init mutex if it was lock before the fork
init_mutexes(my_context);
}
void freeCycleLog(box64context_t* ctx)
{
if(cycle_log) {
for(int i=0; i<cycle_log; ++i) {
box_free(ctx->log_call[i]);
box_free(ctx->log_ret[i]);
}
box_free(ctx->log_call);
box_free(ctx->log_ret);
ctx->log_call = NULL;
ctx->log_ret = NULL;
}
}
void initCycleLog(box64context_t* context)
{
if(cycle_log) {
context->log_call = (char**)box_calloc(cycle_log, sizeof(char*));
context->log_ret = (char**)box_calloc(cycle_log, sizeof(char*));
for(int i=0; i<cycle_log; ++i) {
context->log_call[i] = (char*)box_calloc(256, 1);
context->log_ret[i] = (char*)box_calloc(128, 1);
}
}
}
EXPORTDYN
box64context_t *NewBox64Context(int argc)
{
@@ -77,7 +187,9 @@ box64context_t *NewBox64Context(int argc)
}
#endif
// init and put default values
box64context_t *context = my_context = (box64context_t*)calloc(1, sizeof(box64context_t));
box64context_t *context = my_context = (box64context_t*)box_calloc(1, sizeof(box64context_t));
initCycleLog(context);
context->deferedInit = 1;
context->sel_serial = 1;
@@ -86,37 +198,43 @@ box64context_t *NewBox64Context(int argc)
context->maplib = NewLibrarian(context, 1);
context->local_maplib = NewLibrarian(context, 1);
context->versym = NewDictionnary();
context->system = NewBridge();
context->globaldefver = NewDefaultVersion();
context->weakdefver = NewDefaultVersion();
// create vsyscall
context->vsyscall = AddBridge(context->system, vFv, x64Syscall, 0);
context->vsyscall = AddBridge(context->system, vFEv, x64Syscall, 0, NULL);
// create the vsyscalls
context->vsyscalls[0] = AddVSyscall(context->system, 96);
context->vsyscalls[1] = AddVSyscall(context->system, 201);
context->vsyscalls[2] = AddVSyscall(context->system, 309);
// create the alternate to map at address
addAlternate((void*)0xffffffffff600000, (void*)context->vsyscalls[0]);
addAlternate((void*)0xffffffffff600400, (void*)context->vsyscalls[1]);
addAlternate((void*)0xffffffffff600800, (void*)context->vsyscalls[2]);
// get handle to box64 itself
context->box64lib = dlopen(NULL, RTLD_NOW|RTLD_GLOBAL);
context->dlprivate = NewDLPrivate();
context->argc = argc;
context->argv = (char**)calloc(context->argc+1, sizeof(char*));
context->argv = (char**)box_calloc(context->argc+1, sizeof(char*));
init_mutexes(context);
pthread_atfork(NULL, NULL, atfork_child_box64context);
pthread_mutex_init(&context->mutex_once, NULL);
pthread_mutex_init(&context->mutex_once2, NULL);
pthread_mutex_init(&context->mutex_trace, NULL);
#ifndef DYNAREC
pthread_mutex_init(&context->mutex_lock, NULL);
#else
pthread_mutex_init(&context->mutex_dyndump, NULL);
#endif
pthread_mutex_init(&context->mutex_tls, NULL);
pthread_mutex_init(&context->mutex_thread, NULL);
pthread_key_create(&context->tlskey, free_tlsdatasize);
for (int i=0; i<8; ++i) context->canary[i] = 1 + getrand(255);
context->canary[getrand(4)] = 0;
printf_log(LOG_DEBUG, "Setting up canary (for Stack protector) at FS:0x14, value:%08X\n", *(uint32_t*)context->canary);
printf_log(LOG_DEBUG, "Setting up canary (for Stack protector) at FS:0x28, value:%08X\n", *(uint32_t*)context->canary);
initAllHelpers(context);
return context;
}
void freeALProcWrapper(box64context_t* context);
EXPORTDYN
void FreeBox64Context(box64context_t** context)
{
@@ -128,15 +246,18 @@ void FreeBox64Context(box64context_t** context)
box64context_t* ctx = *context; // local copy to do the cleanning
if(ctx->local_maplib)
FreeLibrarian(&ctx->local_maplib, NULL);
if(ctx->maplib)
FreeLibrarian(&ctx->maplib, NULL);
FreeDictionnary(&ctx->versym);
FreeDefaultVersion(&ctx->globaldefver);
FreeDefaultVersion(&ctx->weakdefver);
for(int i=0; i<ctx->elfsize; ++i) {
FreeElfHeader(&ctx->elfs[i]);
}
free(ctx->elfs);
if(ctx->maplib)
FreeLibrarian(&ctx->maplib);
if(ctx->local_maplib)
FreeLibrarian(&ctx->local_maplib);
box_free(ctx->elfs);
FreeCollection(&ctx->box64_path);
FreeCollection(&ctx->box64_ld_lib);
@@ -148,16 +269,16 @@ void FreeBox64Context(box64context_t** context)
DeleteX64Trace(ctx);
if(ctx->deferedInitList)
free(ctx->deferedInitList);
box_free(ctx->deferedInitList);
free(ctx->argv);
/*box_free(ctx->argv);*/
for (int i=0; i<ctx->envc; ++i)
free(ctx->envv[i]);
free(ctx->envv);
/*for (int i=0; i<ctx->envc; ++i)
box_free(ctx->envv[i]);
box_free(ctx->envv);*/
if(ctx->atfork_sz) {
free(ctx->atforks);
box_free(ctx->atforks);
ctx->atforks = NULL;
ctx->atfork_sz = ctx->atfork_cap = 0;
}
@@ -173,15 +294,17 @@ void FreeBox64Context(box64context_t** context)
FreeDLPrivate(&ctx->dlprivate);
free(ctx->stack);
free(ctx->fullpath);
free(ctx->box64path);
box_free(ctx->fullpath);
box_free(ctx->box64path);
box_free(ctx->bashpath);
FreeBridge(&ctx->system);
// freeGLProcWrapper(ctx);
// freeALProcWrapper(ctx);
freeGLProcWrapper(ctx);
freeALProcWrapper(ctx);
if(ctx->stack_clone)
box_free(ctx->stack_clone);
void* ptr;
@@ -192,27 +315,27 @@ void FreeBox64Context(box64context_t** context)
pthread_key_delete(ctx->tlskey);
if(ctx->tlsdata)
free(ctx->tlsdata);
box_free(ctx->tlsdata);
pthread_mutex_destroy(&ctx->mutex_once);
pthread_mutex_destroy(&ctx->mutex_once2);
pthread_mutex_destroy(&ctx->mutex_trace);
#ifndef DYNAREC
pthread_mutex_destroy(&ctx->mutex_lock);
#else
pthread_mutex_destroy(&ctx->mutex_dyndump);
#endif
pthread_mutex_destroy(&ctx->mutex_tls);
pthread_mutex_destroy(&ctx->mutex_thread);
free_neededlib(&ctx->neededlibs);
free_neededlib(ctx->neededlibs);
ctx->neededlibs = NULL;
if(ctx->emu_sig)
FreeX64Emu(&ctx->emu_sig);
finiAllHelpers(ctx);
free(ctx);
#ifndef DYNAREC
pthread_mutex_destroy(&ctx->mutex_trace);
pthread_mutex_destroy(&ctx->mutex_lock);
pthread_mutex_destroy(&ctx->mutex_tls);
pthread_mutex_destroy(&ctx->mutex_thread);
pthread_mutex_destroy(&ctx->mutex_bridge);
#endif
freeCycleLog(ctx);
box_free(ctx);
}
int AddElfHeader(box64context_t* ctx, elfheader_t* head) {
@@ -220,7 +343,7 @@ int AddElfHeader(box64context_t* ctx, elfheader_t* head) {
if(idx==ctx->elfcap) {
// resize...
ctx->elfcap += 16;
ctx->elfs = (elfheader_t**)realloc(ctx->elfs, sizeof(elfheader_t*) * ctx->elfcap);
ctx->elfs = (elfheader_t**)box_realloc(ctx->elfs, sizeof(elfheader_t*) * ctx->elfcap);
}
ctx->elfs[idx] = head;
ctx->elfsize++;
@@ -231,7 +354,7 @@ int AddElfHeader(box64context_t* ctx, elfheader_t* head) {
int AddTLSPartition(box64context_t* context, int tlssize) {
int oldsize = context->tlssize;
context->tlssize += tlssize;
context->tlsdata = realloc(context->tlsdata, context->tlssize);
context->tlsdata = box_realloc(context->tlsdata, context->tlssize);
memmove(context->tlsdata+tlssize, context->tlsdata, oldsize); // move to the top, using memmove as regions will probably overlap
memset(context->tlsdata, 0, tlssize); // fill new space with 0 (not mandatory)
// clean GS segment for current emu
@@ -244,24 +367,3 @@ int AddTLSPartition(box64context_t* context, int tlssize) {
return -context->tlssize; // negative offset
}
void add_neededlib(needed_libs_t* needed, library_t* lib)
{
if(!needed)
return;
if(needed->size == needed->cap) {
needed->cap += 8;
needed->libs = (library_t**)realloc(needed->libs, needed->cap*sizeof(library_t*));
}
needed->libs[needed->size++] = lib;
}
void free_neededlib(needed_libs_t* needed)
{
if(!needed)
return;
needed->cap = 0;
needed->size = 0;
if(needed->libs)
free(needed->libs);
needed->libs = NULL;
}
+2 -2
View File
@@ -2,7 +2,7 @@
#define __BOX64_VERSION_H_
#define BOX64_MAJOR 0
#define BOX64_MINOR 0
#define BOX64_MINOR 2
#define BOX64_REVISION 2
#endif //__BOX64_VERSION_H_
#endif //__BOX64_VERSION_H_
+1381 -690
View File
File diff suppressed because it is too large. Load diff
+1804
View File
File diff suppressed because it is too large. Load diff
+56
View File
@@ -0,0 +1,56 @@
//arm epilog for dynarec
//Save stuff, prepare stack and register
//called with pointer to emu as 1st parameter
//and address to jump to as 2nd parameter
.text
.align 4
.global arm64_epilog
arm64_epilog:
//update register -> emu
stp x10, x11, [x0, (8 * 0)]
stp x12, x13, [x0, (8 * 2)]
stp x14, x15, [x0, (8 * 4)]
stp x16, x17, [x0, (8 * 6)]
stp x18, x19, [x0, (8 * 8)]
stp x20, x21, [x0, (8 * 10)]
stp x22, x23, [x0, (8 * 12)]
stp x24, x25, [x0, (8 * 14)]
stp x26, x27, [x0, (8 * 16)] // put back reg value in emu, including EIP (so x27 must be EIP now)
//restore all used register
add sp, x28, 0
//vpop {d8-d15}
ldp x19, x20, [sp, (8 * 0)]
ldp x21, x22, [sp, (8 * 2)]
ldp x23, x24, [sp, (8 * 4)]
ldp x25, x26, [sp, (8 * 6)]
ldp x27, x28, [sp, (8 * 8)]
ldp d8, d9, [sp, (8 *10)]
ldp d10, d11, [sp, (8 *12)]
ldp d12, d13, [sp, (8 *14)]
ldp d14, d15, [sp, (8 *16)]
add sp, sp, (8 * 18)
ldp x30, x29, [sp], 16 // saved lr
//end, return...
ret
.global arm64_epilog_fast
arm64_epilog_fast:
//restore all used register
add sp, x28, 0
//vpop {d8-d15}
ldp x19, x20, [sp, (8 * 0)]
ldp x21, x22, [sp, (8 * 2)]
ldp x23, x24, [sp, (8 * 4)]
ldp x25, x26, [sp, (8 * 6)]
ldp x27, x28, [sp, (8 * 8)]
ldp d8, d9, [sp, (8 *10)]
ldp d10, d11, [sp, (8 *12)]
ldp d12, d13, [sp, (8 *14)]
ldp d14, d15, [sp, (8 *16)]
add sp, sp, (8 * 18)
ldp x30, x29, [sp], 16 // saved lr
//end, return...
ret
+234
View File
@@ -0,0 +1,234 @@
//arm lock helper
//there is 2 part: read and write
// write return 0 on success, 1 on fail (value has been changed)
.text
.align 4
.global arm64_lock_read_b
.global arm64_lock_write_b
.global arm64_lock_read_h
.global arm64_lock_write_h
.global arm64_lock_read_d
.global arm64_lock_write_d
.global arm64_lock_read_dd
.global arm64_lock_write_dd
.global arm64_lock_read_dq
.global arm64_lock_write_dq
.global arm64_lock_xchg
.global arm64_lock_xchg_d
.global arm64_lock_storeifnull
.global arm64_lock_storeifnull_d
.global arm64_lock_storeifref
.global arm64_lock_storeifref_d
.global arm64_lock_storeifref2_d
.global arm64_lock_decifnot0b
.global arm64_lock_storeb
.global arm64_lock_incif0
.global arm64_lock_decifnot0
.global arm64_lock_store
arm64_lock_read_b:
dmb ish
// address is x0, return is x0
ldaxrb w0, [x0]
ret
arm64_lock_write_b:
// address is x0, value is x1, return is x0
mov x2, x0
stlxrb w0, w1, [x2]
dmb ish
ret
arm64_lock_read_h:
dmb ish
// address is x0, return is x0
ldaxrh w0, [x0]
ret
arm64_lock_write_h:
// address is x0, value is x1, return is x0
mov x2, x0
stlxrh w0, w1, [x2]
dmb ish
ret
arm64_lock_read_d:
dmb ish
// address is x0, return is x0
ldaxr w0, [x0]
ret
arm64_lock_write_d:
// address is x0, value is w1, return is x0
mov x2, x0
stlxr w0, w1, [x2]
dmb ish
ret
arm64_lock_read_dd:
dmb ish
// address is x0, return is x0
ldaxr x0, [x0]
ret
arm64_lock_write_dd:
// address is x0, value is x1, return is x0
mov x2, x0
stlxr w0, x1, [x2]
dmb ish
ret
arm64_lock_read_dq:
dmb ish
// address is r2, return is r0, r1
ldaxp x4, x3, [x2]
str x4, [x0]
str x3, [x1]
ret
arm64_lock_write_dq:
// address is r2, value is r0, r1, return is r0
// r0 needs to be aligned
stlxp w3, x0, x1, [x2]
mov w0, w3
dmb ish
ret
arm64_lock_xchg:
dmb ish
arm64_lock_xchg_0:
// address is x0, value is x1, return old value in x0
ldaxr x2, [x0]
stlxr w3, x1, [x0]
cbnz w3, arm64_lock_xchg_0
mov x0, x2
ret
arm64_lock_xchg_d:
dmb ish
arm64_lock_xchg_d_0:
// address is x0, value is x1, return old value in x0
ldaxr w2, [x0]
stlxr w3, w1, [x0]
cbnz w3, arm64_lock_xchg_d_0
mov w0, w2
ret
arm64_lock_storeifnull:
dmb ish
1:
// address is x0, value is x1, x1 store to x0 only if [x0] is 0. return old [x0] value
ldaxr x2, [x0]
cbnz x2, 2f
stlxr w3, x1, [x0]
cbnz w3, 1b
2:
mov x0, x2
ret
arm64_lock_storeifnull_d:
dmb ish
1:
// address is x0, value is w1, w1 store to x0 only if [x0] is 0. return old [x0] value
ldaxr w2, [x0]
cbnz w2, 2f
stlxr w3, w1, [x0]
cbnz w3, 1b
2:
dmb ish
mov w0, w2
ret
arm64_lock_storeifref:
dmb ish
1:
// address is x0, value is x1, x1 store to x0 only if [x0] is x2. return new [x0] value (so x1 or old value)
ldaxr x3, [x0]
cmp x2, x3
bne 2f
stlxr w4, x1, [x0]
cbnz w4, 1b
mov x0, x1
ret
2:
mov x0, x3
ret
arm64_lock_storeifref_d:
dmb ish
1:
// address is x0, value is w1, w1 store to x0 only if [x0] is w2. return new [x0] value (so x1 or old value)
ldaxr w3, [x0]
cmp w2, w3
bne 2f
stlxr w4, w1, [x0]
cbnz w4, 1b
mov w0, w1
ret
2:
mov w0, w3
ret
arm64_lock_storeifref2_d:
dmb ish
1:
// address is x0, value is w1, w1 store to x0 only if [x0] is w2. return old [x0] value
ldaxr w3, [x0]
cmp w2, w3
bne 2f
stlxr w4, w1, [x0]
cbnz w4, 1b
2:
mov w0, w3
ret
arm64_lock_decifnot0b:
dmb ish
1:
ldaxrb w1, [x0]
cmp w1, #0
beq 2f
sub w1, w1, #1
stlxrb w2, w1, [x0]
cbnz w2, 1b
2:
ret
arm64_lock_storeb:
strb w1, [x0]
dmb ish
ret
arm64_lock_decifnot0:
dmb ish
1:
ldaxr w1, [x0]
cmp w1, #0
beq 2f
sub w3, w1, #1
stlxr w2, w3, [x0]
cbnz w2, 1b
2:
mov w0, w1
ret
arm64_lock_incif0:
dmb ish
1:
ldaxr w1, [x0]
cmp w1, #0
bne 2f
add w3, w1, #1
stlxr w2, w3, [x0]
cbnz w2, 1b
2:
mov w0, w1
ret
arm64_lock_store:
str w1, [x0]
dmb ish
ret
+66
View File
@@ -0,0 +1,66 @@
#ifndef __ARM64_LOCK__H__
#define __ARM64_LOCK__H__
#include <stdint.h>
// LDAXRB of ADDR
extern uint8_t arm64_lock_read_b(void* addr);
// STLXRB of ADDR, return 0 if ok, 1 if not
extern int arm64_lock_write_b(void* addr, uint8_t val);
// LDAXRH of ADDR
extern uint16_t arm64_lock_read_h(void* addr);
// STLXRH of ADDR, return 0 if ok, 1 if not
extern int arm64_lock_write_h(void* addr, uint16_t val);
// LDAXR of ADDR
extern uint32_t arm64_lock_read_d(void* addr);
// STLXR of ADDR, return 0 if ok, 1 if not
extern int arm64_lock_write_d(void* addr, uint32_t val);
// LDAXR of ADDR
extern uint64_t arm64_lock_read_dd(void* addr);
// STLXR of ADDR, return 0 if ok, 1 if not
extern int arm64_lock_write_dd(void* addr, uint64_t val);
// LDAXRD of ADDR
extern void arm64_lock_read_dq(uint64_t * a, uint64_t* b, void* addr);
// STLXRD of ADDR, return 0 if ok, 1 if not
extern int arm64_lock_write_dq(uint64_t a, uint64_t b, void* addr);
// Atomicaly exchange value at [p] with val, return old p
extern uintptr_t arm64_lock_xchg(void* p, uintptr_t val);
// Atomicaly exchange value at [p] with val, return old p
extern uint32_t arm64_lock_xchg_d(void* p, uint32_t val);
// Atomicaly store value to [p] only if [p] is NULL. Return old [p] value
extern uint32_t arm64_lock_storeifnull_d(void*p, uint32_t val);
// Atomicaly store value to [p] only if [p] is NULL. Return old [p] value
extern void* arm64_lock_storeifnull(void*p, void* val);
// Atomicaly store value to [p] only if [p] is ref. Return new [p] value (so val or old)
extern void* arm64_lock_storeifref(void*p, void* val, void* ref);
// Atomicaly store value to [p] only if [p] is ref. Return new [p] value (so val or old)
extern uint32_t arm64_lock_storeifref_d(void*p, uint32_t val, uint32_t ref);
// Atomicaly store value to [p] only if [p] is ref. Return new [p] value (so val or old)
extern uint32_t arm64_lock_storeifref2_d(void*p, uint32_t val, uint32_t ref);
// decrement atomicaly the byte at [p] (but only if p not 0)
extern void arm64_lock_decifnot0b(void*p);
// atomic store (with memory barrier)
extern void arm64_lock_storeb(void*p, uint8_t b);
// increment atomicaly the int at [p] only if it was 0. Return the old value of [p]
extern int arm64_lock_incif0(void*p);
// decrement atomicaly the int at [p] (but only if p not 0)
extern int arm64_lock_decifnot0(void*p);
// atomic store (with memory barrier)
extern void arm64_lock_store(void*p, uint32_t v);
#endif //__ARM64_LOCK__H__
+41
View File
@@ -0,0 +1,41 @@
//arm update linker table for dynarec
//called with pointer to emu as 1st parameter
//and address of table to as 2nd parameter
//ip is at r12
.text
.align 4
.extern LinkNext
.global arm64_next
.8byte 0 // NULL pointer before arm64_next, for getDB
arm64_next:
// emu is r0
// IP address is r1
sub sp, sp, (8 * 12)
stp x0, x1, [sp, (8 * 0)]
stp x10, x11, [sp, (8 * 2)]
stp x12, x13, [sp, (8 * 4)]
stp x14, x15, [sp, (8 * 6)]
stp x16, x17, [sp, (8 * 8)]
stp x18, x27, [sp, (8 * 10)] // also save x27(rip) to allow change in LinkNext
mov x2, x30 // "from" is in lr, so put in x2
add x3, sp, 8*11 // x3 is address to change rip
// call the function
bl LinkNext
// preserve return value
mov x3, x0
// pop regs
ldp x0, x1, [sp, (8 * 0)]
ldp x10, x11, [sp, (8 * 2)]
ldp x12, x13, [sp, (8 * 4)]
ldp x14, x15, [sp, (8 * 6)]
ldp x16, x17, [sp, (8 * 8)]
ldp x18, x27, [sp, (8 * 10)]
add sp, sp, (8 * 12)
// return offset is jump address
br x3
+1373
View File
File diff suppressed because it is too large. Load diff
+6
View File
@@ -0,0 +1,6 @@
#ifndef _ARM_PRINTER_H_
#define _ARM_PRINTER_H_
const char* arm64_print(uint32_t opcode, uint64_t addr);
#endif //_ARM_PRINTER_H_
+42
View File
@@ -0,0 +1,42 @@
//arm prologue for dynarec
//Save stuff, prepare stack and register
//called with pointer to emu as 1st parameter
//and address to jump to as 2nd parameter
.text
.align 4
.extern arm64_next
.global arm64_prolog
arm64_prolog:
//save all 18 used register
stp x30, x29, [sp, -16]! // save lr
sub sp, sp, (8 * 18)
stp x19, x20, [sp, (8 * 0)]
stp x21, x22, [sp, (8 * 2)]
stp x23, x24, [sp, (8 * 4)]
stp x25, x26, [sp, (8 * 6)]
stp x27, X28, [sp, (8 * 8)]
stp d8, d9, [sp, (8 *10)]
stp d10, d11, [sp, (8 *12)]
stp d12, d13, [sp, (8 *14)]
stp d14, d15, [sp, (8 *16)]
//vpush {d8-d15} // save NEON regs?
//setup emu -> register
ldp x10, x11, [x0, (8 * 0)]
ldp x12, x13, [x0, (8 * 2)]
ldp x14, x15, [x0, (8 * 4)]
ldp x16, x17, [x0, (8 * 6)]
ldp x18, x19, [x0, (8 * 8)]
ldp x20, x21, [x0, (8 * 10)]
ldp x22, x23, [x0, (8 * 12)]
ldp x24, x25, [x0, (8 * 14)]
ldp x26, x27, [x0, (8 * 16)]
// Push a jump next on the stack
adr x28, arm64_next
stp x28, xzr, [sp, -16]!
// Save old xSP in x28
add x28, sp, 16
//jump to function
br x1
+2559
View File
File diff suppressed because it is too large. Load diff
+1956
View File
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+925
View File
@@ -0,0 +1,925 @@
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <pthread.h>
#include <errno.h>
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
#include "emu/x64run_private.h"
#include "x64trace.h"
#include "dynarec_native.h"
#include "arm64_printer.h"
#include "dynarec_arm64_private.h"
#include "dynarec_arm64_helper.h"
#include "dynarec_arm64_functions.h"
uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog)
{
uint8_t opcode = F8;
uint8_t nextop, u8;
int16_t i16;
uint16_t u16;
uint64_t u64;
int32_t i32;
int64_t j64;
uint8_t gd, ed;
uint8_t wback, wb1;
int64_t fixedaddress;
int lock;
MAYUSE(u8);
MAYUSE(u16);
MAYUSE(u64);
MAYUSE(j64);
MAYUSE(lock);
while((opcode==0x2E) || (opcode==0x36) || (opcode==0x66)) // ignoring CS:, SS: or multiple 0x66
opcode = F8;
while((opcode==0xF2) || (opcode==0xF3)) {
rep = opcode-0xF1;
opcode = F8;
}
// REX prefix before the 66 are ignored
rex.rex = 0;
while(opcode>=0x40 && opcode<=0x4f) {
rex.rex = opcode;
opcode = F8;
}
if(rex.w && opcode!=0x0f) // rex.w cancels "66", but not for 66 0f type of prefix
return dynarec64_00(dyn, addr-1, ip, ninst, rex, rep, ok, need_epilog); // addr-1, to "put back" opcode
switch(opcode) {
case 0x01:
INST_NAME("ADD Ew, Gw");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGW(x2);
GETEW(x1, 0);
emit_add16(dyn, ninst, x1, x2, x4, x5);
EWBACK;
break;
case 0x03:
INST_NAME("ADD Gw, Ew");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGW(x1);
GETEW(x2, 0);
emit_add16(dyn, ninst, x1, x2, x3, x4);
GWBACK;
break;
case 0x05:
INST_NAME("ADD AX, Iw");
SETFLAGS(X_ALL, SF_SET_PENDING);
i32 = F16;
UXTHw(x1, xRAX);
MOV32w(x2, i32);
emit_add16(dyn, ninst, x1, x2, x3, x4);
BFIx(xRAX, x1, 0, 16);
break;
case 0x09:
INST_NAME("OR Ew, Gw");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGW(x2);
GETEW(x1, 0);
emit_or16(dyn, ninst, x1, x2, x4, x2);
EWBACK;
break;
case 0x0B:
INST_NAME("OR Gw, Ew");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGW(x1);
GETEW(x2, 0);
emit_or16(dyn, ninst, x1, x2, x4, x3);
GWBACK;
break;
case 0x0D:
INST_NAME("OR AX, Iw");
SETFLAGS(X_ALL, SF_SET_PENDING);
i32 = F16;
UXTHw(x1, xRAX);
MOV32w(x2, i32);
emit_or16(dyn, ninst, x1, x2, x3, x4);
BFIx(xRAX, x1, 0, 16);
break;
case 0x0F:
addr = dynarec64_660F(dyn, addr, ip, ninst, rex, rep, ok, need_epilog);
break;
case 0x11:
INST_NAME("ADC Ew, Gw");
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGW(x2);
GETEW(x1, 0);
emit_adc16(dyn, ninst, x1, x2, x4, x5);
EWBACK;
break;
case 0x13:
INST_NAME("ADC Gw, Ew");
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGW(x1);
GETEW(x2, 0);
emit_adc16(dyn, ninst, x1, x2, x4, x3);
GWBACK;
break;
case 0x15:
INST_NAME("ADC AX, Iw");
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
i32 = F16;
UXTHw(x1, xRAX);
MOV32w(x2, i32);
emit_adc16(dyn, ninst, x1, x2, x3, x4);
BFIx(xRAX, x1, 0, 16);
break;
case 0x19:
INST_NAME("SBB Ew, Gw");
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGW(x2);
GETEW(x1, 0);
emit_sbb16(dyn, ninst, x1, x2, x4, x5);
EWBACK;
break;
case 0x1B:
INST_NAME("SBB Gw, Ew");
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGW(x1);
GETEW(x2, 0);
emit_sbb16(dyn, ninst, x1, x2, x4, x3);
GWBACK;
break;
case 0x1D:
INST_NAME("SBB AX, Iw");
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
i16 = F16S;
UXTHw(x1, xRAX);
MOVZw(x2, i16);
emit_sbb16(dyn, ninst, x1, x2, x3, x4);
BFIx(xRAX, x1, 0, 16);
break;
case 0x21:
INST_NAME("AND Ew, Gw");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGW(x2);
GETEW(x1, 0);
emit_and16(dyn, ninst, x1, x2, x4, x5);
EWBACK;
break;
case 0x23:
INST_NAME("AND Gw, Ew");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGW(x1);
GETEW(x2, 0);
emit_and16(dyn, ninst, x1, x2, x3, x4);
GWBACK;
break;
case 0x25:
INST_NAME("AND AX, Iw");
SETFLAGS(X_ALL, SF_SET_PENDING);
i32 = F16;
UXTHw(x1, xRAX);
MOV32w(x2, i32);
emit_and16(dyn, ninst, x1, x2, x3, x4);
BFIx(xRAX, x1, 0, 16);
break;
case 0x29:
INST_NAME("SUB Ew, Gw");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGW(x2);
GETEW(x1, 0);
emit_sub16(dyn, ninst, x1, x2, x4, x5);
EWBACK;
break;
case 0x2B:
INST_NAME("SUB Gw, Ew");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGW(x1);
GETEW(x2, 0);
emit_sub16(dyn, ninst, x1, x2, x3, x4);
GWBACK;
break;
case 0x2D:
INST_NAME("SUB AX, Iw");
SETFLAGS(X_ALL, SF_SET_PENDING);
i32 = F16;
UXTHw(x1, xRAX);
MOV32w(x2, i32);
emit_sub16(dyn, ninst, x1, x2, x3, x4);
BFIx(xRAX, x1, 0, 16);
break;
case 0x31:
INST_NAME("XOR Ew, Gw");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGW(x2);
GETEW(x1, 0);
emit_xor16(dyn, ninst, x1, x2, x4, x5);
EWBACK;
break;
case 0x33:
INST_NAME("XOR Gw, Ew");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGW(x1);
GETEW(x2, 0);
emit_xor16(dyn, ninst, x1, x2, x3, x4);
GWBACK;
break;
case 0x35:
INST_NAME("XOR AX, Iw");
SETFLAGS(X_ALL, SF_SET_PENDING);
i32 = F16;
UXTHw(x1, xRAX);
MOV32w(x2, i32);
emit_xor16(dyn, ninst, x1, x2, x3, x4);
BFIx(xRAX, x1, 0, 16);
break;
case 0x39:
INST_NAME("CMP Ew, Gw");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGW(x2);
GETEW(x1, 0);
emit_cmp16(dyn, ninst, x1, x2, x3, x4, x5);
break;
case 0x3B:
INST_NAME("CMP Gw, Ew");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGW(x1);
GETEW(x2, 0);
emit_cmp16(dyn, ninst, x1, x2, x3, x4, x5);
break;
case 0x3D:
INST_NAME("CMP AX, Iw");
SETFLAGS(X_ALL, SF_SET_PENDING);
i32 = F16;
UXTHw(x1, xRAX);
if(i32) {
MOV32w(x2, i32);
emit_cmp16(dyn, ninst, x1, x2, x3, x4, x5);
} else {
emit_cmp16_0(dyn, ninst, x1, x3, x4);
}
break;
case 0x64:
addr = dynarec64_6664(dyn, addr, ip, ninst, rex, _FS, ok, need_epilog);
break;
case 0x65:
addr = dynarec64_6664(dyn, addr, ip, ninst, rex, _GS, ok, need_epilog);
break;
case 0x66:
addr = dynarec64_66(dyn, addr, ip, ninst, rex, rep, ok, need_epilog);
break;
case 0x69:
case 0x6B:
if(opcode==0x69) {
INST_NAME("IMUL Gw,Ew,Iw");
} else {
INST_NAME("IMUL Gw,Ew,Ib");
}
SETFLAGS(X_ALL, SF_PENDING);
nextop = F8;
UFLAG_DF(x1, d_imul16);
GETSEW(x1, (opcode==0x69)?2:1);
if(opcode==0x69) i32 = F16S; else i32 = F8S;
MOV32w(x2, i32);
MULw(x2, x2, x1);
UFLAG_RES(x2);
gd=x2;
GWBACK;
break;
case 0x70:
case 0x71:
case 0x72:
case 0x73:
case 0x74:
case 0x75:
case 0x76:
case 0x77:
case 0x78:
case 0x79:
case 0x7a:
case 0x7b:
case 0x7c:
case 0x7d:
case 0x7e:
case 0x7f:
// just use regular conditional jump
return dynarec64_00(dyn, addr-1, ip, ninst, rex, rep, ok, need_epilog);
case 0x81:
case 0x83:
nextop = F8;
switch((nextop>>3)&7) {
case 0: //ADD
if(opcode==0x81) {INST_NAME("ADD Ew, Iw");} else {INST_NAME("ADD Ew, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
GETEW(x1, (opcode==0x81)?2:1);
if(opcode==0x81) i16 = F16S; else i16 = F8S;
MOVZw(x5, i16);
emit_add16(dyn, ninst, ed, x5, x2, x4);
EWBACK;
break;
case 1: //OR
if(opcode==0x81) {INST_NAME("OR Ew, Iw");} else {INST_NAME("OR Ew, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
GETEW(x1, (opcode==0x81)?2:1);
if(opcode==0x81) i16 = F16S; else i16 = F8S;
MOVZw(x5, i16);
emit_or16(dyn, ninst, x1, x5, x2, x4);
EWBACK;
break;
case 2: //ADC
if(opcode==0x81) {INST_NAME("ADC Ew, Iw");} else {INST_NAME("ADC Ew, Ib");}
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
GETEW(x1, (opcode==0x81)?2:1);
if(opcode==0x81) i16 = F16S; else i16 = F8S;
MOVZw(x5, i16);
emit_adc16(dyn, ninst, x1, x5, x2, x4);
EWBACK;
break;
case 3: //SBB
if(opcode==0x81) {INST_NAME("SBB Ew, Iw");} else {INST_NAME("SBB Ew, Ib");}
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
GETEW(x1, (opcode==0x81)?2:1);
if(opcode==0x81) i16 = F16S; else i16 = F8S;
MOVZw(x5, i16);
emit_sbb16(dyn, ninst, x1, x5, x2, x4);
EWBACK;
break;
case 4: //AND
if(opcode==0x81) {INST_NAME("AND Ew, Iw");} else {INST_NAME("AND Ew, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
GETEW(x1, (opcode==0x81)?2:1);
if(opcode==0x81) i16 = F16S; else i16 = F8S;
MOVZw(x5, i16);
emit_and16(dyn, ninst, x1, x5, x2, x4);
EWBACK;
break;
case 5: //SUB
if(opcode==0x81) {INST_NAME("SUB Ew, Iw");} else {INST_NAME("SUB Ew, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
GETEW(x1, (opcode==0x81)?2:1);
if(opcode==0x81) i16 = F16S; else i16 = F8S;
MOVZw(x5, i16);
emit_sub16(dyn, ninst, x1, x5, x2, x4);
EWBACK;
break;
case 6: //XOR
if(opcode==0x81) {INST_NAME("XOR Ew, Iw");} else {INST_NAME("XOR Ew, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
GETEW(x1, (opcode==0x81)?2:1);
if(opcode==0x81) i16 = F16S; else i16 = F8S;
MOVZw(x5, i16);
emit_xor16(dyn, ninst, x1, x5, x2, x4);
EWBACK;
break;
case 7: //CMP
if(opcode==0x81) {INST_NAME("CMP Ew, Iw");} else {INST_NAME("CMP Ew, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
GETEW(x1, (opcode==0x81)?2:1);
if(opcode==0x81) i16 = F16S; else i16 = F8S;
if(i16) {
MOVZw(x2, i16);
emit_cmp16(dyn, ninst, x1, x2, x3, x4, x5);
} else
emit_cmp16_0(dyn, ninst, x1, x3, x4);
break;
}
break;
case 0x85:
INST_NAME("TEST Ew, Gw");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETEW(x1, 0);
GETGW(x2);
emit_test16(dyn, ninst, x1, x2, x3, x4, x5);
break;
case 0x87:
INST_NAME("(LOCK)XCHG Ew, Gw");
nextop = F8;
if(MODREG) {
GETGD;
GETED(0);
MOVxw_REG(x1, gd);
BFIx(gd, ed, 0, 16);
BFIx(ed, x1, 0, 16);
} else {
GETGD;
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0, 0, rex, LOCK_LOCK, 0, 0);
SMDMB();
TSTx_mask(ed, 1, 0, 0); // mask=1
B_MARK(cNE);
MARKLOCK;
LDAXRH(x1, ed);
STLXRH(x3, gd, ed);
CBNZx_MARKLOCK(x3);
B_MARK2_nocond;
MARK;
LDRH_U12(x1, ed, 0);
STRH_U12(gd, ed, 0);
MARK2;
SMDMB();
BFIx(gd, x1, 0, 16);
}
break;
case 0x89:
INST_NAME("MOV Ew, Gw");
nextop = F8;
GETGD; // don't need GETGW here
if(MODREG) {
ed = xRAX+(nextop&7)+(rex.b<<3);
if(ed!=gd) {
BFIx(ed, gd, 0, 16);
}
} else {
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<1, 1, rex, &lock, 0, 0);
STRH_U12(gd, ed, fixedaddress);
SMWRITELOCK(lock);
}
break;
case 0x8B:
INST_NAME("MOV Gw, Ew");
nextop = F8;
GETGD; // don't need GETGW neither
if(MODREG) {
ed = xRAX+(nextop&7)+(rex.b<<3);
if(ed!=gd) {
BFIx(gd, ed, 0, 16);
}
} else {
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<1, 1, rex, &lock, 0, 0);
SMREADLOCK(lock);
LDRH_U12(x1, ed, fixedaddress);
BFIx(gd, x1, 0, 16);
}
break;
case 0x90:
case 0x91:
case 0x92:
case 0x93:
case 0x94:
case 0x95:
case 0x96:
case 0x97:
gd = xRAX+(opcode&0x07)+(rex.b<<3);
if(gd==xRAX) {
INST_NAME("NOP");
} else {
INST_NAME("XCHG AX, Reg");
MOVw_REG(x2, xRAX);
BFIx(xRAX, gd, 0, 16);
BFIx(gd, x2, 0, 16);
}
break;
case 0x98:
INST_NAME("CBW");
SXTBw(x1, xRAX);
BFIw(xRAX, x1, 0, 16);
break;
case 0xA1:
INST_NAME("MOV EAX,Od");
u64 = F64;
MOV64x(x1, u64);
LDRH_U12(x2, x1, 0);
BFIx(xRAX, x2, 0, 16);
break;
case 0xA3:
INST_NAME("MOV Od,EAX");
u64 = F64;
MOV64x(x1, u64);
STRH_U12(xRAX, x1, 0);
SMWRITE();
break;
case 0xA5:
if(rep) {
INST_NAME("REP MOVSW");
CBZx_NEXT(xRCX);
TBNZ_MARK2(xFlags, F_DF);
MARK; // Part with DF==0
LDRH_S9_postindex(x1, xRSI, 2);
STRH_S9_postindex(x1, xRDI, 2);
SUBx_U12(xRCX, xRCX, 1);
CBNZx_MARK(xRCX);
B_NEXT_nocond;
MARK2; // Part with DF==1
LDRH_S9_postindex(x1, xRSI, -2);
STRH_S9_postindex(x1, xRDI, -2);
SUBx_U12(xRCX, xRCX, 1);
CBNZx_MARK2(xRCX);
// done
} else {
INST_NAME("MOVSW");
GETDIR(x3, 2);
LDRH_U12(x1, xRSI, 0);
STRH_U12(x1, xRDI, 0);
ADDx_REG(xRSI, xRSI, x3);
ADDx_REG(xRDI, xRDI, x3);
}
break;
case 0xA9:
INST_NAME("TEST AX,Iw");
SETFLAGS(X_ALL, SF_SET_PENDING);
u16 = F16;
MOV32w(x2, u16);
UBFXx(x1, xRAX, 0, 16);
emit_test16(dyn, ninst, x1, x2, x3, x4, x5);
break;
case 0xAB:
if(rep) {
INST_NAME("REP STOSW");
CBZx_NEXT(xRCX);
TBNZ_MARK2(xFlags, F_DF);
MARK; // Part with DF==0
STRH_S9_postindex(xRAX, xRDI, 2);
SUBx_U12(xRCX, xRCX, 1);
CBNZx_MARK(xRCX);
B_NEXT_nocond;
MARK2; // Part with DF==1
STRH_S9_postindex(xRAX, xRDI, -2);
SUBx_U12(xRCX, xRCX, 1);
CBNZx_MARK2(xRCX);
// done
} else {
INST_NAME("STOSW");
GETDIR(x3, 2);
STRH_U12(xRAX, xRDI, 0);
ADDx_REG(xRDI, xRDI, x3);
}
break;
case 0xB8:
case 0xB9:
case 0xBA:
case 0xBB:
case 0xBC:
case 0xBD:
case 0xBE:
case 0xBF:
INST_NAME("MOV Reg16, Iw");
u16 = F16;
MOV32w(x1, u16);
gd = xRAX+(opcode&7)+(rex.b<<3);
BFIx(gd, x1, 0, 16);
break;
case 0xC1:
nextop = F8;
switch((nextop>>3)&7) {
case 0:
INST_NAME("ROL Ew, Ib");
MESSAGE(LOG_DUMP, "Need Optimization\n");
SETFLAGS(X_OF|X_CF, SF_SET);
GETEW(x1, 1);
u8 = F8;
MOV32w(x2, u8);
CALL_(rol16, x1, x3);
EWBACK;
break;
case 1:
INST_NAME("ROR Ew, Ib");
MESSAGE(LOG_DUMP, "Need Optimization\n");
SETFLAGS(X_OF|X_CF, SF_SET);
GETEW(x1, 1);
u8 = F8;
MOV32w(x2, u8);
CALL_(ror16, x1, x3);
EWBACK;
break;
case 2:
INST_NAME("RCL Ew, Ib");
MESSAGE(LOG_DUMP, "Need Optimization\n");
READFLAGS(X_CF);
SETFLAGS(X_OF|X_CF, SF_SET);
GETEW(x1, 1);
u8 = F8;
MOV32w(x2, u8);
CALL_(rcl16, x1, x3);
EWBACK;
break;
case 3:
INST_NAME("RCR Ew, Ib");
MESSAGE(LOG_DUMP, "Need Optimization\n");
READFLAGS(X_CF);
SETFLAGS(X_OF|X_CF, SF_SET);
GETEW(x1, 1);
u8 = F8;
MOV32w(x2, u8);
CALL_(rcr16, x1, x3);
EWBACK;
break;
case 4:
case 6:
INST_NAME("SHL Ew, Ib");
UFLAG_IF {MESSAGE(LOG_DUMP, "Need Optimization for flags\n");}
SETFLAGS(X_ALL, SF_PENDING);
GETEW(x1, 1);
u8 = F8;
UFLAG_IF {MOV32w(x2, (u8&0x1f));}
UFLAG_OP12(ed, x2)
LSLw_IMM(ed, ed, u8&0x1f);
EWBACK;
UFLAG_RES(ed);
UFLAG_DF(x3, d_shl16);
break;
case 5:
INST_NAME("SHR Ed, Ib");
UFLAG_IF {MESSAGE(LOG_DUMP, "Need Optimization for flags\n");}
SETFLAGS(X_ALL, SF_PENDING);
GETEW(x1, 1);
u8 = F8;
UFLAG_IF {MOV32w(x2, (u8&0x1f));}
UFLAG_OP12(ed, x2)
LSRw_IMM(ed, ed, u8&0x1f);
EWBACK;
UFLAG_RES(ed);
UFLAG_DF(x3, d_shr16);
break;
case 7:
INST_NAME("SAR Ed, Ib");
SETFLAGS(X_ALL, SF_PENDING);
UFLAG_IF {MESSAGE(LOG_DUMP, "Need Optimization for flags\n");}
GETSEW(x1, 1);
u8 = F8;
UFLAG_IF {MOV32w(x2, (u8&0x1f));}
UFLAG_OP12(ed, x2)
ASRw(ed, ed, (u8&0x1f));
EWBACK;
UFLAG_RES(ed);
UFLAG_DF(x3, d_sar16);
break;
}
break;
case 0xC7:
INST_NAME("MOV Ew, Iw");
nextop = F8;
if(MODREG) {
ed = xRAX+(nextop&7)+(rex.b<<3);
u16 = F16;
MOV32w(x1, u16);
BFIx(ed, x1, 0, 16);
} else {
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<1, 1, rex, &lock, 0, 2);
u16 = F16;
MOV32w(x1, u16);
STRH_U12(x1, ed, fixedaddress);
SMWRITELOCK(lock);
}
break;
case 0xD1:
case 0xD3:
nextop = F8;
switch((nextop>>3)&7) {
case 0:
if(opcode==0xD1) {
INST_NAME("ROL Ew, 1");
MOV32w(x2, 1);
} else {
INST_NAME("ROL Ew, CL");
ANDw_mask(x2, xRCX, 0, 0b00100);
}
MESSAGE(LOG_DUMP, "Need Optimization\n");
SETFLAGS(X_OF|X_CF, SF_SET);
GETEW(x1, 0);
CALL_(rol16, x1, x3);
EWBACK;
break;
case 1:
if(opcode==0xD1) {
INST_NAME("ROR Ew, 1");
MOV32w(x2, 1);
} else {
INST_NAME("ROR Ew, CL");
ANDw_mask(x2, xRCX, 0, 0b00100);
}
MESSAGE(LOG_DUMP, "Need Optimization\n");
SETFLAGS(X_OF|X_CF, SF_SET);
GETEW(x1, 0);
CALL_(ror16, x1, x3);
EWBACK;
break;
case 2:
if(opcode==0xD1) {INST_NAME("RCL Ew, 1"); } else { INST_NAME("RCL Ew, CL");}
MESSAGE(LOG_DUMP, "Need Optimization\n");
READFLAGS(X_CF);
SETFLAGS(X_OF|X_CF, SF_SET);
if(opcode==0xD1) {MOV32w(x2, 1);} else {ANDw_mask(x2, xRCX, 0, 0b00100);}
GETEW(x1, 0);
CALL_(rcl16, x1, x3);
EWBACK;
break;
case 3:
if(opcode==0xD1) {INST_NAME("RCR Ew, 1");} else {INST_NAME("RCR Ew, CL");}
MESSAGE(LOG_DUMP, "Need Optimization\n");
READFLAGS(X_CF);
SETFLAGS(X_OF|X_CF, SF_SET);
if(opcode==0xD1) {MOV32w(x2, 1);} else {ANDw_mask(x2, xRCX, 0, 0b00100);}
GETEW(x1, 0);
CALL_(rcr16, x1, x3);
EWBACK;
break;
case 4:
case 6:
if(opcode==0xD1) {
INST_NAME("SHL Ew, 1");
MOV32w(x4, 1);
} else {
INST_NAME("SHL Ew, CL");
ANDw_mask(x4, xRCX, 0, 0b00100);
}
UFLAG_IF {MESSAGE(LOG_DUMP, "Need Optimization for flags\n");}
SETFLAGS(X_ALL, SF_PENDING);
GETEW(x1, 0);
UFLAG_OP12(ed, x4)
LSLw_REG(ed, ed, x4);
EWBACK;
UFLAG_RES(ed);
UFLAG_DF(x3, d_shl16);
break;
case 5:
if(opcode==0xD1) {
INST_NAME("SHR Ew, 1");
MOV32w(x4, 1);
} else {
INST_NAME("SHR Ew, CL");
ANDw_mask(x4, xRCX, 0, 0b00100);
}
UFLAG_IF {MESSAGE(LOG_DUMP, "Need Optimization for flags\n");}
SETFLAGS(X_ALL, SF_PENDING);
GETEW(x1, 0);
UFLAG_OP12(ed, x4)
LSRw_REG(ed, ed, x4);
EWBACK;
UFLAG_RES(ed);
UFLAG_DF(x3, d_shr16);
break;
case 7:
if(opcode==0xD1) {
INST_NAME("SAR Ew, 1");
MOV32w(x4, 1);
} else {
INST_NAME("SAR Ew, CL");
ANDw_mask(x4, xRCX, 0, 0b00100);
}
UFLAG_IF {MESSAGE(LOG_DUMP, "Need Optimization for flags\n");}
SETFLAGS(X_ALL, SF_PENDING);
GETSEW(x1, 0);
UFLAG_OP12(ed, x4)
ASRw_REG(ed, ed, x4);
EWBACK;
UFLAG_RES(ed);
UFLAG_DF(x3, d_sar16);
break;
}
break;
case 0xF0:
return dynarec64_66F0(dyn, addr, ip, ninst, rex, rep, ok, need_epilog);
case 0xF7:
nextop = F8;
switch((nextop>>3)&7) {
case 0:
case 1:
INST_NAME("TEST Ew, Iw");
SETFLAGS(X_ALL, SF_SET_PENDING);
GETEW(x1, 2);
u16 = F16;
MOV32w(x2, u16);
emit_test16(dyn, ninst, x1, x2, x3, x4, x5);
break;
case 2:
INST_NAME("NOT Ew");
GETEW(x1, 0);
MVNw_REG(ed, ed);
EWBACK;
break;
case 3:
INST_NAME("NEG Ew");
SETFLAGS(X_ALL, SF_SET_PENDING);
GETEW(x1, 0);
emit_neg16(dyn, ninst, ed, x2, x4);
EWBACK;
break;
case 4:
INST_NAME("MUL AX, Ew");
SETFLAGS(X_ALL, SF_PENDING);
UFLAG_DF(x1, d_mul16);
GETEW(x1, 0);
UXTHw(x2, xRAX);
MULw(x1, x2, x1);
UFLAG_RES(x1);
BFIx(xRAX, x1, 0, 16);
BFXILx(xRDX, x1, 16, 16);
break;
case 5:
INST_NAME("IMUL AX, Ew");
SETFLAGS(X_ALL, SF_PENDING);
UFLAG_DF(x1, d_imul16);
GETSEW(x1, 0);
SXTHw(x2, xRAX);
MULw(x1, x2, x1);
UFLAG_RES(x1);
BFIx(xRAX, x1, 0, 16);
BFXILx(xRDX, x1, 16, 16);
break;
case 6:
INST_NAME("DIV Ew");
SETFLAGS(X_ALL, SF_SET);
GETEW(x1, 0);
UXTHw(x2, xRAX);
BFIw(x2, xRDX, 16, 16);
UDIVw(x3, x2, ed);
MSUBw(x4, x3, ed, x2); // x4 = x2 mod ed (i.e. x2 - x3*ed)
BFIx(xRAX, x3, 0, 16);
BFIx(xRDX, x4, 0, 16);
break;
case 7:
INST_NAME("IDIV Ew");
SETFLAGS(X_ALL, SF_SET);
GETSEW(x1, 0);
UXTHw(x2, xRAX);
BFIw(x2, xRDX, 16, 16);
SDIVw(x3, x2, ed);
MSUBw(x4, x3, ed, x2); // x4 = x2 mod ed (i.e. x2 - x3*ed)
BFIx(xRAX, x3, 0, 16);
BFIx(xRDX, x4, 0, 16);
break;
}
break;
case 0xFF:
nextop = F8;
switch((nextop>>3)&7) {
case 0:
INST_NAME("INC Ew");
SETFLAGS(X_ALL&~X_CF, SF_SUBSET_PENDING);
GETEW(x1, 0);
emit_inc16(dyn, ninst, x1, x2, x4);
EWBACK;
break;
case 1:
INST_NAME("DEC Ew");
SETFLAGS(X_ALL&~X_CF, SF_SUBSET_PENDING);
GETEW(x1, 0);
emit_dec16(dyn, ninst, x1, x2, x4);
EWBACK;
break;
default:
DEFAULT;
}
break;
default:
DEFAULT;
}
return addr;
}
File diff suppressed because it is too large. Load diff
+153
View File
@@ -0,0 +1,153 @@
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <pthread.h>
#include <errno.h>
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
#include "emu/x64run_private.h"
#include "x64trace.h"
#include "dynarec_native.h"
#include "arm64_printer.h"
#include "dynarec_arm64_private.h"
#include "dynarec_arm64_helper.h"
#include "dynarec_arm64_functions.h"
#define GETG gd = ((nextop&0x38)>>3)+(rex.r<<3)
uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int seg, int* ok, int* need_epilog)
{
(void)ip; (void)need_epilog;
uint8_t opcode = F8;
uint8_t nextop;
uint8_t gd, ed;
int64_t j64;
int v0, v1;
int64_t fixedaddress;
MAYUSE(j64);
// REX prefix before the 66 are ignored
rex.rex = 0;
while(opcode>=0x40 && opcode<=0x4f) {
rex.rex = opcode;
opcode = F8;
}
/*if(rex.w && opcode!=0x0f) { // rex.w cancels "66", but not for 66 0f type of prefix
MESSAGE(LOG_DUMP, "Here!\n");
return dynarec64_64(dyn, addr-2, ip, ninst, rex, rep, ok, need_epilog);
}*/
switch(opcode) {
case 0x0F:
opcode = F8;
switch(opcode) {
case 0x2E:
// no special check...
case 0x2F:
if(opcode==0x2F) {INST_NAME("COMISD Gx, Ex");} else {INST_NAME("UCOMISD Gx, Ex");}
SETFLAGS(X_ALL, SF_SET);
nextop = F8;
GETG;
v0 = sse_get_reg(dyn, ninst, x1, gd, 0);
if(MODREG) {
v1 = sse_get_reg(dyn, ninst, x1, (nextop&7) + (rex.b<<3), 0);
} else {
grab_segdata(dyn, addr, ninst, x4, seg);
SMREAD();
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0, 0, rex, NULL, 0, 0);
v1 = fpu_get_scratch(dyn); \
VLDR64_REG(v1, ed, x4);
}
FCMPD(v0, v1);
FCOMI(x1, x2);
break;
case 0xD6:
INST_NAME("MOVQ Ex, Gx");
nextop = F8;
GETG;
v0 = sse_get_reg(dyn, ninst, x1, gd, 0);
if(MODREG) {
v1 = sse_get_reg_empty(dyn, ninst, x1, (nextop&7) + (rex.b<<3));
FMOVD(v1, v0);
} else {
grab_segdata(dyn, addr, ninst, x4, seg);
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0, 0, rex, NULL, 0, 0);
VSTR64_REG(v0, ed, x4);
SMWRITE();
}
break;
default:
DEFAULT;
}
break;
case 0x89:
INST_NAME("MOV FS:Ew, Gw");
nextop = F8;
GETGD; // don't need GETGW here
if(MODREG) {
ed = xRAX+(nextop&7)+(rex.b<<3);
if(rex.w) {
MOVx_REG(ed, gd);
} else {
if(ed!=gd) {
BFIx(ed, gd, 0, 16);
}
}
} else {
grab_segdata(dyn, addr, ninst, x4, seg);
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0, 0, rex, NULL, 0, 0);
if(rex.w) {
STRx_REG(gd, ed, x4);
} else {
STRH_REG(gd, ed, x4);
}
SMWRITE();
}
break;
case 0x8B:
INST_NAME("MOV Gd, FS:Ed");
nextop=F8;
GETGD;
if(MODREG) { // reg <= reg
ed = xRAX+(nextop&7)+(rex.b<<3);
if(rex.w) {
MOVx_REG(gd, ed);
} else {
if(ed!=gd) {
BFIx(gd, ed, 0, 16);
}
}
} else { // mem <= reg
grab_segdata(dyn, addr, ninst, x4, seg);
SMREAD();
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0, 0, rex, NULL, 0, 0);
if(rex.w) {
LDRx_REG(gd, ed, x4);
} else {
LDRH_REG(x1, ed, x4);
BFIx(gd, x1, 0, 16);
}
}
break;
default:
DEFAULT;
}
return addr;
}
+409
View File
@@ -0,0 +1,409 @@
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <pthread.h>
#include <errno.h>
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
#include "emu/x64run_private.h"
#include "x64trace.h"
#include "dynarec_native.h"
#include "arm64_printer.h"
#include "dynarec_arm64_private.h"
#include "dynarec_arm64_helper.h"
#include "dynarec_arm64_functions.h"
uintptr_t dynarec64_66F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog)
{
(void)ip; (void)rep; (void)need_epilog;
uint8_t opcode = F8;
uint8_t nextop;
uint8_t gd, ed, u8;
uint8_t wback, wb1, wb2, gb1, gb2;
int32_t i32;
int64_t i64, j64;
int64_t fixedaddress;
MAYUSE(gb1);
MAYUSE(gb2);
MAYUSE(wb1);
MAYUSE(wb2);
MAYUSE(j64);
while((opcode==0xF2) || (opcode==0xF3)) {
rep = opcode-0xF1;
opcode = F8;
}
// REX prefix before the F0/66 are ignored
rex.rex = 0;
while(opcode>=0x40 && opcode<=0x4f) {
rex.rex = opcode;
opcode = F8;
}
switch(opcode) {
case 0x09:
INST_NAME("LOCK OR Ew, Gw");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGW(x5);
SMDMB();
if(MODREG) {
ed = xRAX+(nextop&7)+(rex.b<<3);
UXTHw(x6, ed);
emit_or16(dyn, ninst, x6, x5, x3, x4);
BFIx(ed, x6, 0, 16);
} else {
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, LOCK_LOCK, 0, 0);
MARKLOCK;
LDAXRH(x1, wback);
emit_or16(dyn, ninst, x1, x5, x3, x4);
STLXRH(x3, x1, wback);
CBNZx_MARKLOCK(x3);
}
SMDMB();
break;
case 0x0F:
opcode = F8;
switch(opcode) {
case 0xB1:
INST_NAME("LOCK CMPXCHG Ew, Gw");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGD;
SMDMB();
UXTHw(x6, xRAX);
if(MODREG) {
ed = xRAX+(nextop&7)+(rex.b<<3);
wback = 0;
UXTHw(x1, ed);
CMPSxw_REG(x6, x1);
B_MARK(cNE);
BFIx(ed, gd, 0, 16);
} else {
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, LOCK_LOCK, 0, 0);
TSTx_mask(wback, 1, 0, 0); // mask=1
B_MARK3(cNE);
// Aligned version
MARKLOCK;
LDAXRH(x1, wback);
CMPSw_REG(x6, x1);
B_MARK(cNE);
// EAX == Ed
STLXRH(x4, gd, wback);
CBNZx_MARKLOCK(x4);
// done
B_MARK_nocond;
// Unaligned version
MARK3;
LDRH_U12(x1, wback, 0);
LDAXRB(x3, wback); // dummy read, to arm the write...
CMPSw_REG(x6, x1);
B_MARK(cNE);
// EAX == Ed
STLXRB(x4, gd, wback);
CBNZx_MARK3(x4);
STRH_U12(gd, wback, 0);
}
MARK;
// Common part (and fallback for EAX != Ed)
UFLAG_IF {emit_cmp16(dyn, ninst, x6, x1, x3, x4, x5);}
BFIx(xRAX, x1, 0, 16);
SMDMB();
break;
case 0xC1:
INST_NAME("LOCK XADD Gw, Ew");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
gd = xRAX+((nextop&0x38)>>3)+(rex.r<<3);
UXTHx(x5, gd);
SMDMB();
if(MODREG) {
ed = xRAX+(nextop&7)+(rex.b<<3);
BFIx(gd, ed, 0, 16);
emit_add16(dyn, ninst, x5, gd, x3, x4);
BFIx(ed, x5, 0, 16);
} else {
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, LOCK_LOCK, 0, 0);
MARKLOCK;
LDAXRH(x1, wback);
ADDxw_REG(x4, x1, x5);
STLXRH(x3, x4, wback);
CBNZx_MARKLOCK(x3);
IFX(X_ALL|X_PEND) {
MOVxw_REG(x2, x1);
emit_add16(dyn, ninst, x2, x5, x3, x4);
}
BFIx(gd, x1, 0, 16);
}
SMDMB();
break;
default:
DEFAULT;
}
break;
case 0x81:
case 0x83:
nextop = F8;
SMDMB();
switch((nextop>>3)&7) {
case 0: //ADD
if(opcode==0x81) {
INST_NAME("LOCK ADD Ew, Iw");
} else {
INST_NAME("LOCK ADD Ew, Ib");
}
SETFLAGS(X_ALL, SF_SET_PENDING);
if(MODREG) {
if(opcode==0x81) i32 = F16S; else i32 = F8S;
ed = xRAX+(nextop&7)+(rex.b<<3);
MOV32w(x5, i32);
UXTHw(x6, ed);
emit_add16(dyn, ninst, x6, x5, x3, x4);
BFIx(ed, x6, 0, 16);
} else {
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, LOCK_LOCK, 0, (opcode==0x81)?2:1);
if(opcode==0x81) i32 = F16S; else i32 = F8S;
MOV32w(x5, i32);
TSTx_mask(wback, 1, 0, 0); // mask=1
B_MARK(cNE);
MARKLOCK;
LDAXRH(x1, wback);
emit_add16(dyn, ninst, x1, x5, x3, x4);
STLXRH(x3, x1, wback);
CBNZx_MARKLOCK(x3);
B_NEXT_nocond;
MARK; // unaligned! also, not enough
LDRH_U12(x1, wback, 0);
LDAXRB(x4, wback);
BFIw(x1, x4, 0, 8); // re-inject
emit_add16(dyn, ninst, x1, x5, x3, x4);
STLXRB(x3, x1, wback);
CBNZx_MARK(x3);
STRH_U12(x1, wback, 0); // put the whole value
}
break;
case 1: //OR
if(opcode==0x81) {INST_NAME("LOCK OR Ew, Iw");} else {INST_NAME("LOCK OR Ew, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
if(MODREG) {
if(opcode==0x81) i32 = F16S; else i32 = F8S;
ed = xRAX+(nextop&7)+(rex.b<<3);
MOV32w(x5, i32);
UXTHw(x6, ed);
emit_or16(dyn, ninst, x6, x5, x3, x4);
BFIx(ed, x6, 0, 16);
} else {
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, LOCK_LOCK, 0, (opcode==0x81)?2:1);
if(opcode==0x81) i32 = F16S; else i32 = F8S;
MOV32w(x5, i32);
MARKLOCK;
LDAXRH(x1, wback);
emit_or16(dyn, ninst, x1, x5, x3, x4);
STLXRH(x3, x1, wback);
CBNZx_MARKLOCK(x3);
}
break;
case 2: //ADC
if(opcode==0x81) {INST_NAME("LOCK ADC Ew, Iw");} else {INST_NAME("LOCK ADC Ew, Ib");}
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
if(MODREG) {
if(opcode==0x81) i32 = F16S; else i32 = F8S;
ed = xRAX+(nextop&7)+(rex.b<<3);
MOV32w(x5, i32);
UXTHw(x6, ed);
emit_adc16(dyn, ninst, x6, x5, x3, x4);
BFIx(ed, x6, 0, 16);
} else {
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, LOCK_LOCK, 0, (opcode==0x81)?2:1);
if(opcode==0x81) i32 = F16S; else i32 = F8S;
MOV32w(x5, i32);
MARKLOCK;
LDAXRH(x1, wback);
emit_adc16(dyn, ninst, x1, x5, x3, x4);
STLXRH(x3, x1, wback);
CBNZx_MARKLOCK(x3);
}
break;
case 3: //SBB
if(opcode==0x81) {INST_NAME("LOCK SBB Ew, Iw");} else {INST_NAME("LOCK SBB Ew, Ib");}
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
if(MODREG) {
if(opcode==0x81) i32 = F16S; else i32 = F8S;
ed = xRAX+(nextop&7)+(rex.b<<3);
MOV32w(x5, i32);
UXTHw(x6, ed);
emit_sbb16(dyn, ninst, x6, x5, x3, x4);
BFIx(ed, x6, 0, 16);
} else {
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, LOCK_LOCK, 0, (opcode==0x81)?2:1);
if(opcode==0x81) i32 = F16S; else i32 = F8S;
MOV32w(x5, i32);
MARKLOCK;
LDAXRH(x1, wback);
emit_sbb16(dyn, ninst, x1, x5, x3, x4);
STLXRH(x3, x1, wback);
CBNZx_MARKLOCK(x3);
}
break;
case 4: //AND
if(opcode==0x81) {INST_NAME("LOCK AND Ew, Iw");} else {INST_NAME("LOCK AND Ew, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
if(MODREG) {
if(opcode==0x81) i32 = F16S; else i32 = F8S;
ed = xRAX+(nextop&7)+(rex.b<<3);
MOV32w(x5, i32);
UXTHw(x6, ed);
emit_and16(dyn, ninst, x6, x5, x3, x4);
BFIx(ed, x6, 0, 16);
} else {
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, LOCK_LOCK, 0, (opcode==0x81)?2:1);
if(opcode==0x81) i32 = F16S; else i32 = F8S;
MOV32w(x5, i32);
MARKLOCK;
LDAXRH(x1, wback);
emit_and16(dyn, ninst, x1, x5, x3, x4);
STLXRH(x3, x1, wback);
CBNZx_MARKLOCK(x3);
}
break;
case 5: //SUB
if(opcode==0x81) {INST_NAME("LOCK SUB Ew, Iw");} else {INST_NAME("LOCK SUB Ew, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
if(MODREG) {
if(opcode==0x81) i32 = F16S; else i32 = F8S;
ed = xRAX+(nextop&7)+(rex.b<<3);
MOV32w(x5, i32);
UXTHw(x6, ed);
emit_sub16(dyn, ninst, x6, x5, x3, x4);
BFIx(ed, x6, 0, 16);
} else {
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, LOCK_LOCK, 0, (opcode==0x81)?2:1);
if(opcode==0x81) i32 = F16S; else i32 = F8S;
MOV32w(x5, i32);
TSTx_mask(wback, 1, 0, 0); // mask=1
B_MARK(cNE);
MARKLOCK;
LDAXRH(x1, wback);
emit_sub16(dyn, ninst, x1, x5, x3, x4);
STLXRH(x3, x1, wback);
CBNZx_MARKLOCK(x3);
B_NEXT_nocond;
MARK; // unaligned! also, not enough
LDRH_U12(x1, wback, 0);
LDAXRB(x4, wback);
BFIw(x1, x4, 0, 8); // re-inject
emit_sub16(dyn, ninst, x1, x5, x3, x4);
STLXRB(x3, x1, wback);
CBNZx_MARK(x3);
STRH_U12(x1, wback, 0); // put the whole value
}
break;
case 6: //XOR
if(opcode==0x81) {INST_NAME("LOCK XOR Ew, Iw");} else {INST_NAME("LOCK XOR Ew, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
if(MODREG) {
if(opcode==0x81) i32 = F16S; else i32 = F8S;
ed = xRAX+(nextop&7)+(rex.b<<3);
MOV32w(x5, i32);
UXTHw(x6, ed);
emit_xor16(dyn, ninst, x6, x5, x3, x4);
BFIx(ed, x6, 0, 16);
} else {
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, LOCK_LOCK, 0, (opcode==0x81)?2:1);
if(opcode==0x81) i32 = F16S; else i32 = F8S;
MOV32w(x5, i32);
MARKLOCK;
LDAXRH(x1, wback);
emit_xor16(dyn, ninst, x1, x5, x3, x4);
STLXRH(x3, x1, wback);
CBNZx_MARKLOCK(x3);
}
break;
case 7: //CMP
if(opcode==0x81) {INST_NAME("(LOCK) CMP Ew, Iw");} else {INST_NAME("(LOCK) CMP Ew, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
GETEW(x6, (opcode==0x81)?2:1);
(void)wb1;
// No need to LOCK, this is readonly
if(opcode==0x81) i32 = F16S; else i32 = F8S;
if(i32) {
MOV32w(x5, i32);
emit_cmp16(dyn, ninst, x6, x5, x3, x4, x6);
} else {
emit_cmp16_0(dyn, ninst, ed, x3, x4);
}
break;
}
SMDMB();
break;
case 0xFF:
nextop = F8;
switch((nextop>>3)&7)
{
case 0: // INC Ew
INST_NAME("LOCK INC Ew");
SETFLAGS(X_ALL&~X_CF, SF_SUBSET_PENDING);
SMDMB();
if(MODREG) {
ed = xRAX+(nextop&7)+(rex.b<<3);
UXTHw(x6, ed);
emit_inc16(dyn, ninst, x6, x5, x3);
BFIx(ed, x6, 0, 16);
} else {
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, LOCK_LOCK, 0, 0);
MARKLOCK;
LDAXRH(x1, wback);
emit_inc16(dyn, ninst, x1, x3, x4);
STLXRH(x3, x1, wback);
CBNZx_MARKLOCK(x3);
}
SMDMB();
break;
case 1: //DEC Ew
INST_NAME("LOCK DEC Ew");
SETFLAGS(X_ALL&~X_CF, SF_SUBSET_PENDING);
SMDMB();
if(MODREG) {
ed = xRAX+(nextop&7)+(rex.b<<3);
UXTHw(x6, ed);
emit_dec16(dyn, ninst, x6, x5, x3);
BFIx(ed, x6, 0, 16);
} else {
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, LOCK_LOCK, 0, 0);
MARKLOCK;
LDAXRH(x1, wback);
emit_dec16(dyn, ninst, x1, x3, x4);
STLXRH(x3, x1, wback);
CBNZx_MARKLOCK(x3);
}
SMDMB();
break;
default:
DEFAULT;
}
break;
default:
DEFAULT;
}
return addr;
}
+985
View File
@@ -0,0 +1,985 @@
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <pthread.h>
#include <errno.h>
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
#include "emu/x64run_private.h"
#include "x64trace.h"
#include "dynarec_native.h"
#include "arm64_printer.h"
#include "dynarec_arm64_private.h"
#include "dynarec_arm64_helper.h"
#include "dynarec_arm64_functions.h"
#define GETGX(a, w) \
gd = ((nextop&0x38)>>3)+(rex.r<<3); \
a = sse_get_reg(dyn, ninst, x1, gd, w)
#define GETGM(a) \
gd = ((nextop&0x38)>>3); \
a = mmx_get_reg(dyn, ninst, x1, x2, x3, gd)
#define GETGm gd = ((nextop&0x38)>>3)
uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog)
{
(void)ip; (void)need_epilog;
uint8_t opcode = F8;
uint8_t nextop;
uint8_t gd, ed, wback, wb, wb1, wb2, gb1, gb2;
int64_t fixedaddress;
int8_t i8;
uint8_t u8;
int32_t i32;
int64_t j64, i64;
int cacheupd = 0;
int lock;
int v0, v1, s0;
MAYUSE(i32);
MAYUSE(j64);
MAYUSE(v0);
MAYUSE(v1);
MAYUSE(s0);
MAYUSE(lock);
MAYUSE(cacheupd);
// REX prefix before the 67 are ignored
rex.rex = 0;
while(opcode>=0x40 && opcode<=0x4f) {
rex.rex = opcode;
opcode = F8;
}
rep = 0;
while((opcode==0xF2) || (opcode==0xF3)) {
rep = opcode-0xF1;
opcode = F8;
}
switch(opcode) {
case 0x00:
INST_NAME("ADD Eb, Gb");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETEB32(x1, 0);
GETGB(x2);
emit_add8(dyn, ninst, x1, x2, x4, x5);
EBBACK;
break;
case 0x01:
INST_NAME("ADD Ed, Gd");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGD;
GETED32(0);
emit_add32(dyn, ninst, rex, ed, gd, x3, x4);
WBACK;
break;
case 0x02:
INST_NAME("ADD Gb, Eb");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETEB32(x2, 0);
GETGB(x1);
emit_add8(dyn, ninst, x1, x2, x3, x4);
GBBACK;
break;
case 0x03:
INST_NAME("ADD Gd, Ed");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGD;
GETED32(0);
emit_add32(dyn, ninst, rex, gd, ed, x3, x4);
break;
case 0x04:
INST_NAME("ADD AL, Ib");
SETFLAGS(X_ALL, SF_SET_PENDING);
u8 = F8;
UXTBw(x1, xRAX);
emit_add8c(dyn, ninst, x1, u8, x3, x4);
BFIx(xRAX, x1, 0, 8);
break;
case 0x05:
INST_NAME("ADD EAX, Id");
SETFLAGS(X_ALL, SF_SET_PENDING);
i64 = F32S;
emit_add32c(dyn, ninst, rex, xRAX, i64, x3, x4, x5);
break;
case 0x08:
INST_NAME("OR Eb, Gb");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETEB32(x1, 0);
GETGB(x2);
emit_or8(dyn, ninst, x1, x2, x4, x2);
EBBACK;
break;
case 0x09:
INST_NAME("OR Ed, Gd");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGD;
GETED32(0);
emit_or32(dyn, ninst, rex, ed, gd, x3, x4);
WBACK;
break;
case 0x0A:
INST_NAME("OR Gb, Eb");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETEB32(x2, 0);
GETGB(x1);
emit_or8(dyn, ninst, x1, x2, x3, x4);
GBBACK;
break;
case 0x0B:
INST_NAME("OR Gd, Ed");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGD;
GETED32(0);
emit_or32(dyn, ninst, rex, gd, ed, x3, x4);
break;
case 0x0C:
INST_NAME("OR AL, Ib");
SETFLAGS(X_ALL, SF_SET_PENDING);
u8 = F8;
UXTBw(x1, xRAX);
emit_or8c(dyn, ninst, x1, u8, x3, x4);
BFIx(xRAX, x1, 0, 8);
break;
case 0x0D:
INST_NAME("OR EAX, Id");
SETFLAGS(X_ALL, SF_SET_PENDING);
i64 = F32S;
emit_or32c(dyn, ninst, rex, xRAX, i64, x3, x4);
break;
case 0x0F:
opcode=F8;
switch(opcode) {
case 0x2E:
// no special check...
case 0x2F:
switch(rep) {
case 0:
if(opcode==0x2F) {INST_NAME("COMISS Gx, Ex");} else {INST_NAME("UCOMISS Gx, Ex");}
SETFLAGS(X_ALL, SF_SET);
nextop = F8;
GETGX(v0, 0);
if(MODREG) {
s0 = sse_get_reg(dyn, ninst, x1, (nextop&7) + (rex.b<<3), 0);
} else {
s0 = fpu_get_scratch(dyn);
SMREAD();
addr = geted32(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<2, 3, rex, NULL, 0, 0);
VLDR32_U12(s0, ed, fixedaddress);
}
FCMPS(v0, s0);
FCOMI(x1, x2);
break;
default:
DEFAULT;
}
break;
case 0x6F:
switch(rep) {
case 0:
INST_NAME("MOVQ Gm, Em");
nextop = F8;
GETGm;
if(MODREG) {
v1 = mmx_get_reg(dyn, ninst, x1, x2, x3, nextop&7); // no rex.b on MMX
v0 = mmx_get_reg_empty(dyn, ninst, x1, x2, x3, gd);
VMOV(v0, v1);
} else {
v0 = mmx_get_reg_empty(dyn, ninst, x1, x2, x3, gd);
SMREAD();
addr = geted32(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<3, 7, rex, NULL, 0, 0);
VLDR64_U12(v0, ed, fixedaddress);
}
break;
default:
DEFAULT;
}
break;
case 0x7F:
switch(rep) {
case 0:
INST_NAME("MOVQ Em, Gm");
nextop = F8;
GETGM(v0);
if(MODREG) {
v1 = mmx_get_reg_empty(dyn, ninst, x1, x2, x3, nextop&7);
VMOV(v1, v0);
} else {
addr = geted32(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<3, 7, rex, NULL, 0, 0);
VSTR64_U12(v0, ed, fixedaddress);
SMWRITE();
}
break;
default:
DEFAULT;
}
break;
default:
DEFAULT;
}
break;
case 0x10:
INST_NAME("ADC Eb, Gb");
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETEB32(x1, 0);
GETGB(x2);
emit_adc8(dyn, ninst, x1, x2, x4, x5);
EBBACK;
break;
case 0x11:
INST_NAME("ADC Ed, Gd");
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGD;
GETED32(0);
emit_adc32(dyn, ninst, rex, ed, gd, x3, x4);
WBACK;
break;
case 0x12:
INST_NAME("ADC Gb, Eb");
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETEB32(x2, 0);
GETGB(x1);
emit_adc8(dyn, ninst, x1, x2, x4, x3);
GBBACK;
break;
case 0x13:
INST_NAME("ADC Gd, Ed");
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGD;
GETED32(0);
emit_adc32(dyn, ninst, rex, gd, ed, x3, x4);
break;
case 0x14:
INST_NAME("ADC AL, Ib");
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
u8 = F8;
UXTBw(x1, xRAX);
emit_adc8c(dyn, ninst, x1, u8, x3, x4, x5);
BFIx(xRAX, x1, 0, 8);
break;
case 0x15:
INST_NAME("ADC EAX, Id");
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
i64 = F32S;
MOV64xw(x1, i64);
emit_adc32(dyn, ninst, rex, xRAX, x1, x3, x4);
break;
case 0x18:
INST_NAME("SBB Eb, Gb");
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETEB32(x1, 0);
GETGB(x2);
emit_sbb8(dyn, ninst, x1, x2, x4, x5);
EBBACK;
break;
case 0x19:
INST_NAME("SBB Ed, Gd");
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGD;
GETED32(0);
emit_sbb32(dyn, ninst, rex, ed, gd, x3, x4);
WBACK;
break;
case 0x1A:
INST_NAME("SBB Gb, Eb");
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETEB32(x2, 0);
GETGB(x1);
emit_sbb8(dyn, ninst, x1, x2, x3, x4);
GBBACK;
break;
case 0x1B:
INST_NAME("SBB Gd, Ed");
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGD;
GETED32(0);
emit_sbb32(dyn, ninst, rex, gd, ed, x3, x4);
break;
case 0x1C:
INST_NAME("SBB AL, Ib");
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
u8 = F8;
UXTBw(x1, xRAX);
emit_sbb8c(dyn, ninst, x1, u8, x3, x4, x5);
BFIx(xRAX, x1, 0, 8);
break;
case 0x1D:
INST_NAME("SBB EAX, Id");
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
i64 = F32S;
MOV64xw(x2, i64);
emit_sbb32(dyn, ninst, rex, xRAX, x2, x3, x4);
break;
case 0x20:
INST_NAME("AND Eb, Gb");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETEB32(x1, 0);
GETGB(x2);
emit_and8(dyn, ninst, x1, x2, x4, x5);
EBBACK;
break;
case 0x21:
INST_NAME("AND Ed, Gd");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGD;
GETED32(0);
emit_and32(dyn, ninst, rex, ed, gd, x3, x4);
WBACK;
break;
case 0x22:
INST_NAME("AND Gb, Eb");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETEB32(x2, 0);
GETGB(x1);
emit_and8(dyn, ninst, x1, x2, x3, x4);
GBBACK;
break;
case 0x23:
INST_NAME("AND Gd, Ed");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGD;
GETED32(0);
emit_and32(dyn, ninst, rex, gd, ed, x3, x4);
break;
case 0x24:
INST_NAME("AND AL, Ib");
SETFLAGS(X_ALL, SF_SET_PENDING);
u8 = F8;
UXTBw(x1, xRAX);
emit_and8c(dyn, ninst, x1, u8, x3, x4);
BFIx(xRAX, x1, 0, 8);
break;
case 0x25:
INST_NAME("AND EAX, Id");
SETFLAGS(X_ALL, SF_SET_PENDING);
i64 = F32S;
emit_and32c(dyn, ninst, rex, xRAX, i64, x3, x4);
break;
case 0x28:
INST_NAME("SUB Eb, Gb");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETEB32(x1, 0);
GETGB(x2);
emit_sub8(dyn, ninst, x1, x2, x4, x5);
EBBACK;
break;
case 0x29:
INST_NAME("SUB Ed, Gd");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGD;
GETED32(0);
emit_sub32(dyn, ninst, rex, ed, gd, x3, x4);
WBACK;
break;
case 0x2A:
INST_NAME("SUB Gb, Eb");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETEB32(x2, 0);
GETGB(x1);
emit_sub8(dyn, ninst, x1, x2, x3, x4);
GBBACK;
break;
case 0x2B:
INST_NAME("SUB Gd, Ed");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGD;
GETED32(0);
emit_sub32(dyn, ninst, rex, gd, ed, x3, x4);
break;
case 0x2C:
INST_NAME("SUB AL, Ib");
SETFLAGS(X_ALL, SF_SET_PENDING);
u8 = F8;
UXTBw(x1, xRAX);
emit_sub8c(dyn, ninst, x1, u8, x3, x4, x5);
BFIx(xRAX, x1, 0, 8);
break;
case 0x2D:
INST_NAME("SUB EAX, Id");
SETFLAGS(X_ALL, SF_SET_PENDING);
i64 = F32S;
emit_sub32c(dyn, ninst, rex, xRAX, i64, x3, x4, x5);
break;
case 0x30:
INST_NAME("XOR Eb, Gb");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETEB32(x1, 0);
GETGB(x2);
emit_xor8(dyn, ninst, x1, x2, x4, x5);
EBBACK;
break;
case 0x31:
INST_NAME("XOR Ed, Gd");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGD;
GETED32(0);
emit_xor32(dyn, ninst, rex, ed, gd, x3, x4);
WBACK;
break;
case 0x32:
INST_NAME("XOR Gb, Eb");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETEB32(x2, 0);
GETGB(x1);
emit_xor8(dyn, ninst, x1, x2, x3, x4);
GBBACK;
break;
case 0x33:
INST_NAME("XOR Gd, Ed");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGD;
GETED32(0);
emit_xor32(dyn, ninst, rex, gd, ed, x3, x4);
break;
case 0x34:
INST_NAME("XOR AL, Ib");
SETFLAGS(X_ALL, SF_SET_PENDING);
u8 = F8;
UXTBw(x1, xRAX);
emit_xor8c(dyn, ninst, x1, u8, x3, x4);
BFIx(xRAX, x1, 0, 8);
break;
case 0x35:
INST_NAME("XOR EAX, Id");
SETFLAGS(X_ALL, SF_SET_PENDING);
i64 = F32S;
emit_xor32c(dyn, ninst, rex, xRAX, i64, x3, x4);
break;
case 0x38:
INST_NAME("CMP Eb, Gb");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETEB32(x1, 0);
GETGB(x2);
emit_cmp8(dyn, ninst, x1, x2, x3, x4, x5);
break;
case 0x39:
INST_NAME("CMP Ed, Gd");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGD;
GETED32(0);
emit_cmp32(dyn, ninst, rex, ed, gd, x3, x4, x5);
break;
case 0x3A:
INST_NAME("CMP Gb, Eb");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETEB32(x2, 0);
GETGB(x1);
emit_cmp8(dyn, ninst, x1, x2, x3, x4, x5);
break;
case 0x3B:
INST_NAME("CMP Gd, Ed");
SETFLAGS(X_ALL, SF_SET_PENDING);
nextop = F8;
GETGD;
GETED32(0);
emit_cmp32(dyn, ninst, rex, gd, ed, x3, x4, x5);
break;
case 0x3C:
INST_NAME("CMP AL, Ib");
SETFLAGS(X_ALL, SF_SET_PENDING);
u8 = F8;
UXTBw(x1, xRAX);
if(u8) {
MOV32w(x2, u8);
emit_cmp8(dyn, ninst, x1, x2, x3, x4, x5);
} else {
emit_cmp8_0(dyn, ninst, x1, x3, x4);
}
break;
case 0x3D:
INST_NAME("CMP EAX, Id");
SETFLAGS(X_ALL, SF_SET_PENDING);
i64 = F32S;
if(i64) {
MOV64xw(x2, i64);
emit_cmp32(dyn, ninst, rex, xRAX, x2, x3, x4, x5);
} else
emit_cmp32_0(dyn, ninst, rex, xRAX, x3, x4);
break;
case 0x81:
case 0x83:
nextop = F8;
switch((nextop>>3)&7) {
case 0: //ADD
if(opcode==0x81) {INST_NAME("ADD Ed, Id");} else {INST_NAME("ADD Ed, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
GETED32((opcode==0x81)?4:1);
if(opcode==0x81) i64 = F32S; else i64 = F8S;
emit_add32c(dyn, ninst, rex, ed, i64, x3, x4, x5);
WBACK;
break;
case 1: //OR
if(opcode==0x81) {INST_NAME("OR Ed, Id");} else {INST_NAME("OR Ed, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
GETED32((opcode==0x81)?4:1);
if(opcode==0x81) i64 = F32S; else i64 = F8S;
emit_or32c(dyn, ninst, rex, ed, i64, x3, x4);
WBACK;
break;
case 2: //ADC
if(opcode==0x81) {INST_NAME("ADC Ed, Id");} else {INST_NAME("ADC Ed, Ib");}
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
GETED32((opcode==0x81)?4:1);
if(opcode==0x81) i64 = F32S; else i64 = F8S;
MOV64xw(x5, i64);
emit_adc32(dyn, ninst, rex, ed, x5, x3, x4);
WBACK;
break;
case 3: //SBB
if(opcode==0x81) {INST_NAME("SBB Ed, Id");} else {INST_NAME("SBB Ed, Ib");}
READFLAGS(X_CF);
SETFLAGS(X_ALL, SF_SET_PENDING);
GETED32((opcode==0x81)?4:1);
if(opcode==0x81) i64 = F32S; else i64 = F8S;
MOV64xw(x5, i64);
emit_sbb32(dyn, ninst, rex, ed, x5, x3, x4);
WBACK;
break;
case 4: //AND
if(opcode==0x81) {INST_NAME("AND Ed, Id");} else {INST_NAME("AND Ed, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
GETED32((opcode==0x81)?4:1);
if(opcode==0x81) i64 = F32S; else i64 = F8S;
emit_and32c(dyn, ninst, rex, ed, i64, x3, x4);
WBACK;
break;
case 5: //SUB
if(opcode==0x81) {INST_NAME("SUB Ed, Id");} else {INST_NAME("SUB Ed, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
GETED32((opcode==0x81)?4:1);
if(opcode==0x81) i64 = F32S; else i64 = F8S;
emit_sub32c(dyn, ninst, rex, ed, i64, x3, x4, x5);
WBACK;
break;
case 6: //XOR
if(opcode==0x81) {INST_NAME("XOR Ed, Id");} else {INST_NAME("XOR Ed, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
GETED32((opcode==0x81)?4:1);
if(opcode==0x81) i64 = F32S; else i64 = F8S;
emit_xor32c(dyn, ninst, rex, ed, i64, x3, x4);
WBACK;
break;
case 7: //CMP
if(opcode==0x81) {INST_NAME("CMP Ed, Id");} else {INST_NAME("CMP Ed, Ib");}
SETFLAGS(X_ALL, SF_SET_PENDING);
GETED32((opcode==0x81)?4:1);
if(opcode==0x81) i64 = F32S; else i64 = F8S;
if(i64) {
MOV64xw(x2, i64);
emit_cmp32(dyn, ninst, rex, ed, x2, x3, x4, x5);
} else
emit_cmp32_0(dyn, ninst, rex, ed, x3, x4);
break;
}
break;
case 0x89:
INST_NAME("MOV Ed, Gd");
nextop=F8;
GETGD;
if(MODREG) { // reg <= reg
MOVxw_REG(xRAX+(nextop&7)+(rex.b<<3), gd);
} else { // mem <= reg
addr = geted32(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<(2+rex.w), (1<<(2+rex.w))-1, rex, &lock, 0, 0);
STRxw_U12(gd, ed, fixedaddress);
SMWRITELOCK(lock);
}
break;
case 0x8B:
INST_NAME("MOV Gd, Ed");
nextop=F8;
GETGD;
if(MODREG) {
MOVxw_REG(gd, xRAX+(nextop&7)+(rex.b<<3));
} else {
addr = geted32(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<(2+rex.w), (1<<(2+rex.w))-1, rex, &lock, 0, 0);
SMREADLOCK(lock);
LDRxw_U12(gd, ed, fixedaddress);
}
break;
case 0x8D:
INST_NAME("LEA Gd, Ed");
nextop=F8;
GETGD;
if(MODREG) { // reg <= reg? that's an invalid operation
DEFAULT;
} else { // mem <= reg
// should a geted32 be created, to use 32bits regs instead of 64bits?
addr = geted32(dyn, addr, ninst, nextop, &ed, gd, &fixedaddress, 0, 0, rex, NULL, 0, 0);
if(ed!=gd) {
MOVw_REG(gd, ed);
}
}
break;
case 0xC1:
nextop = F8;
switch((nextop>>3)&7) {
case 0:
INST_NAME("ROL Ed, Ib");
SETFLAGS(X_OF|X_CF, SF_SUBSET_PENDING);
GETED32(1);
u8 = (F8)&(rex.w?0x3f:0x1f);
emit_rol32c(dyn, ninst, rex, ed, u8, x3, x4);
if(u8) { WBACK; }
break;
case 1:
INST_NAME("ROR Ed, Ib");
SETFLAGS(X_OF|X_CF, SF_SUBSET_PENDING);
GETED32(1);
u8 = (F8)&(rex.w?0x3f:0x1f);
emit_ror32c(dyn, ninst, rex, ed, u8, x3, x4);
if(u8) { WBACK; }
break;
case 2:
INST_NAME("RCL Ed, Ib");
MESSAGE(LOG_DUMP, "Need Optimization\n");
READFLAGS(X_CF);
SETFLAGS(X_OF|X_CF, SF_SET);
GETED32W(x4, x1, 1);
u8 = F8;
MOV32w(x2, u8);
CALL_(rex.w?((void*)rcl64):((void*)rcl32), ed, x4);
WBACK;
break;
case 3:
INST_NAME("RCR Ed, Ib");
MESSAGE(LOG_DUMP, "Need Optimization\n");
READFLAGS(X_CF);
SETFLAGS(X_OF|X_CF, SF_SET);
GETED32W(x4, x1, 1);
u8 = F8;
MOV32w(x2, u8);
CALL_(rex.w?((void*)rcr64):((void*)rcr32), ed, x4);
WBACK;
break;
case 4:
case 6:
INST_NAME("SHL Ed, Ib");
SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined
GETED32(1);
u8 = (F8)&(rex.w?0x3f:0x1f);
emit_shl32c(dyn, ninst, rex, ed, u8, x3, x4);
WBACK;
break;
case 5:
INST_NAME("SHR Ed, Ib");
SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined
GETED32(1);
u8 = (F8)&(rex.w?0x3f:0x1f);
emit_shr32c(dyn, ninst, rex, ed, u8, x3, x4);
if(u8) {
WBACK;
}
break;
case 7:
INST_NAME("SAR Ed, Ib");
SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined
GETED32(1);
u8 = (F8)&(rex.w?0x3f:0x1f);
emit_sar32c(dyn, ninst, rex, ed, u8, x3, x4);
if(u8) {
WBACK;
}
break;
}
break;
case 0xC7:
INST_NAME("MOV Ed, Id");
nextop=F8;
if(MODREG) { // reg <= i32
i64 = F32S;
ed = xRAX+(nextop&7)+(rex.b<<3);
MOV64xw(ed, i64);
} else { // mem <= i32
addr = geted32(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<(2+rex.w), (1<<(2+rex.w))-1, rex, &lock, 0, 4);
i64 = F32S;
MOV64xw(x3, i64);
STRxw_U12(x3, ed, fixedaddress);
SMWRITELOCK(lock);
}
break;
#define GO(NO, YES) \
BARRIER(BARRIER_MAYBE); \
JUMP(addr+i8, 1); \
if(dyn->insts[ninst].x64.jmp_insts==-1 || \
CHECK_CACHE()) { \
/* out of the block */ \
i32 = dyn->insts[ninst].epilog-(dyn->native_size); \
Bcond(NO, i32); \
if(dyn->insts[ninst].x64.jmp_insts==-1) { \
if(!(dyn->insts[ninst].x64.barrier&BARRIER_FLOAT)) \
fpu_purgecache(dyn, ninst, 1, x1, x2, x3); \
jump_to_next(dyn, addr+i8, 0, ninst); \
} else { \
CacheTransform(dyn, ninst, cacheupd, x1, x2, x3); \
i32 = dyn->insts[dyn->insts[ninst].x64.jmp_insts].address-(dyn->native_size);\
B(i32); \
} \
} else { \
/* inside the block */ \
i32 = dyn->insts[dyn->insts[ninst].x64.jmp_insts].address-(dyn->native_size); \
Bcond(YES, i32); \
}
case 0xE0:
INST_NAME("LOOPNZ (32bits)");
READFLAGS(X_ZF);
i8 = F8S;
MOVw_REG(x1, xRCX);
SUBSw_U12(x1, x1, 1);
BFIx(xRCX, x1, 0, 32);
B_NEXT(cEQ); // ECX is 0, no LOOP
TSTw_mask(xFlags, 0b011010, 0); //mask=0x40
GO(cNE, cEQ);
break;
case 0xE1:
INST_NAME("LOOPZ (32bits)");
READFLAGS(X_ZF);
i8 = F8S;
MOVw_REG(x1, xRCX);
SUBSw_U12(x1, x1, 1);
BFIx(xRCX, x1, 0, 32);
B_NEXT(cEQ); // ECX is 0, no LOOP
TSTw_mask(xFlags, 0b011010, 0); //mask=0x40
GO(cEQ, cNE);
break;
case 0xE2:
INST_NAME("LOOP (32bits)");
i8 = F8S;
MOVw_REG(x1, xRCX);
SUBSw_U12(x1, x1, 1);
BFIx(xRCX, x1, 0, 32);
GO(cEQ, cNE);
break;
case 0xE3:
INST_NAME("JECXZ");
i8 = F8S;
MOVw_REG(x1, xRCX);
TSTw_REG(x1, x1);
GO(cNE, cEQ);
break;
#undef GO
case 0xE8:
return dynarec64_00(dyn, addr-1, ip, ninst, rex, rep, ok, need_epilog); // addr-1, to "put back" opcode)
case 0xF7:
nextop = F8;
switch((nextop>>3)&7) {
case 0:
case 1:
INST_NAME("TEST Ed, Id");
SETFLAGS(X_ALL, SF_SET_PENDING);
GETED32H(x1, 4);
i64 = F32S;
MOV64xw(x2, i64);
emit_test32(dyn, ninst, rex, ed, x2, x3, x4);
break;
case 2:
INST_NAME("NOT Ed");
GETED32(0);
MVNxw_REG(ed, ed);
WBACK;
break;
case 3:
INST_NAME("NEG Ed");
SETFLAGS(X_ALL, SF_SET_PENDING);
GETED32(0);
emit_neg32(dyn, ninst, rex, ed, x3, x4);
WBACK;
break;
case 4:
INST_NAME("MUL EAX, Ed");
SETFLAGS(X_ALL, SF_PENDING);
UFLAG_DF(x2, rex.w?d_mul64:d_mul32);
GETED32(0);
if(rex.w) {
if(ed==xRDX) gd=x3; else gd=xRDX;
UMULH(gd, xRAX, ed);
MULx(xRAX, xRAX, ed);
if(gd!=xRDX) {MOVx_REG(xRDX, gd);}
} else {
UMULL(xRDX, xRAX, ed); //64 <- 32x32
MOVw_REG(xRAX, xRDX);
LSRx(xRDX, xRDX, 32);
}
UFLAG_RES(xRAX);
UFLAG_OP1(xRDX);
break;
case 5:
INST_NAME("IMUL EAX, Ed");
SETFLAGS(X_ALL, SF_PENDING);
UFLAG_DF(x2, rex.w?d_imul64:d_imul32);
GETED32(0);
if(rex.w) {
if(ed==xRDX) gd=x3; else gd=xRDX;
SMULH(gd, xRAX, ed);
MULx(xRAX, xRAX, ed);
if(gd!=xRDX) {MOVx_REG(xRDX, gd);}
} else {
SMULL(xRDX, xRAX, ed); //64 <- 32x32
MOVw_REG(xRAX, xRDX);
LSRx(xRDX, xRDX, 32);
}
UFLAG_RES(xRAX);
UFLAG_OP1(xRDX);
break;
case 6:
INST_NAME("DIV Ed");
SETFLAGS(X_ALL, SF_SET);
if(!rex.w) {
SET_DFNONE(x2);
GETED32(0);
MOVw_REG(x3, xRAX);
ORRx_REG_LSL(x3, x3, xRDX, 32);
if(MODREG) {
MOVw_REG(x4, ed);
ed = x4;
}
UDIVx(x2, x3, ed);
MSUBx(x4, x2, ed, xRAX);
MOVw_REG(xRAX, x2);
MOVw_REG(xRDX, x4);
} else {
if(ninst && dyn->insts
&& dyn->insts[ninst-1].x64.addr
&& *(uint8_t*)(dyn->insts[ninst-1].x64.addr)==0x31
&& *(uint8_t*)(dyn->insts[ninst-1].x64.addr+1)==0xD2) {
SET_DFNONE(x2);
GETED32(0);
UDIVx(x2, xRAX, ed);
MSUBx(xRDX, x2, ed, xRAX);
MOVx_REG(xRAX, x2);
} else {
GETED32H(x1, 0); // get edd changed addr, so cannot be called 2 times for same op...
CBZxw_MARK(xRDX);
if(ed!=x1) {MOVx_REG(x1, ed);}
CALL(div64, -1);
B_NEXT_nocond;
MARK;
UDIVx(x2, xRAX, ed);
MSUBx(xRDX, x2, ed, xRAX);
MOVx_REG(xRAX, x2);
SET_DFNONE(x2);
}
}
break;
case 7:
INST_NAME("IDIV Ed");
SETFLAGS(X_ALL, SF_SET);
if(!rex.w) {
SET_DFNONE(x2)
GETSED32w(0);
MOVw_REG(x3, xRAX);
ORRx_REG_LSL(x3, x3, xRDX, 32);
SDIVx(x2, x3, wb);
MSUBx(x4, x2, wb, x3);
MOVw_REG(xRAX, x2);
MOVw_REG(xRDX, x4);
} else {
if(ninst && dyn->insts
&& dyn->insts[ninst-1].x64.addr
&& *(uint8_t*)(dyn->insts[ninst-1].x64.addr)==0x48
&& *(uint8_t*)(dyn->insts[ninst-1].x64.addr+1)==0x99) {
SET_DFNONE(x2)
GETED32(0);
SDIVx(x2, xRAX, ed);
MSUBx(xRDX, x2, ed, xRAX);
MOVx_REG(xRAX, x2);
} else {
GETED32H(x1, 0); // get edd changed addr, so cannot be called 2 times for same op...
CBZxw_MARK(xRDX);
MVNx_REG(x2, xRDX);
CBZxw_MARK(x2);
if(ed!=x1) {MOVx_REG(x1, ed);}
CALL((void*)idiv64, -1);
B_NEXT_nocond;
MARK;
SDIVx(x2, xRAX, ed);
MSUBx(xRDX, x2, ed, xRAX);
MOVx_REG(xRAX, x2);
SET_DFNONE(x2)
}
}
break;
}
break;
default:
DEFAULT;
}
return addr;
}
+296
View File
@@ -0,0 +1,296 @@
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <pthread.h>
#include <errno.h>
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
#include "emu/x64run_private.h"
#include "x64trace.h"
#include "emu/x87emu_private.h"
#include "dynarec_native.h"
#include "arm64_printer.h"
#include "dynarec_arm64_private.h"
#include "dynarec_arm64_helper.h"
#include "dynarec_arm64_functions.h"
uintptr_t dynarec64_D8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog)
{
(void)ip; (void)rep; (void)need_epilog;
uint8_t nextop = F8;
uint8_t ed;
int64_t fixedaddress;
int v1, v2;
int s0;
MAYUSE(s0);
MAYUSE(v2);
MAYUSE(v1);
switch(nextop) {
case 0xC0:
case 0xC1:
case 0xC2:
case 0xC3:
case 0xC4:
case 0xC5:
case 0xC6:
case 0xC7:
INST_NAME("FADD ST0, STx");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v2 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0)) {
FADDS(v1, v1, v2);
} else {
FADDD(v1, v1, v2);
}
break;
case 0xC8:
case 0xC9:
case 0xCA:
case 0xCB:
case 0xCC:
case 0xCD:
case 0xCE:
case 0xCF:
INST_NAME("FMUL ST0, STx");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v2 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0)) {
FMULS(v1, v1, v2);
} else {
FMULD(v1, v1, v2);
}
break;
case 0xD0:
case 0xD1:
case 0xD2:
case 0xD3:
case 0xD4:
case 0xD5:
case 0xD6:
case 0xD7:
INST_NAME("FCOM ST0, STx");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v2 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0)) {
FCMPS(v1, v2);
} else {
FCMPD(v1, v2);
}
FCOM(x1, x2, x3);
break;
case 0xD8:
case 0xD9:
case 0xDA:
case 0xDB:
case 0xDC:
case 0xDD:
case 0xDE:
case 0xDF:
INST_NAME("FCOMP ST0, STx");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v2 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0)) {
FCMPS(v1, v2);
} else {
FCMPD(v1, v2);
}
FCOM(x1, x2, x3);
x87_do_pop(dyn, ninst, x3);
break;
case 0xE0:
case 0xE1:
case 0xE2:
case 0xE3:
case 0xE4:
case 0xE5:
case 0xE6:
case 0xE7:
INST_NAME("FSUB ST0, STx");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v2 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0)) {
FSUBS(v1, v1, v2);
} else {
FSUBD(v1, v1, v2);
}
break;
case 0xE8:
case 0xE9:
case 0xEA:
case 0xEB:
case 0xEC:
case 0xED:
case 0xEE:
case 0xEF:
INST_NAME("FSUBR ST0, STx");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v2 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0)) {
FSUBS(v1, v2, v1);
} else {
FSUBD(v1, v2, v1);
}
break;
case 0xF0:
case 0xF1:
case 0xF2:
case 0xF3:
case 0xF4:
case 0xF5:
case 0xF6:
case 0xF7:
INST_NAME("FDIV ST0, STx");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v2 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0)) {
FDIVS(v1, v1, v2);
} else {
FDIVD(v1, v1, v2);
}
break;
case 0xF8:
case 0xF9:
case 0xFA:
case 0xFB:
case 0xFC:
case 0xFD:
case 0xFE:
case 0xFF:
INST_NAME("FDIVR ST0, STx");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v2 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0)) {
FDIVS(v1, v2, v1);
} else {
FDIVD(v1, v2, v1);
}
break;
default:
switch((nextop>>3)&7) {
case 0:
INST_NAME("FADD ST0, float[ED]");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_ST0);
s0 = fpu_get_scratch(dyn);
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<2, 3, rex, NULL, 0, 0);
VLDR32_U12(s0, ed, fixedaddress);
if(ST_IS_F(0)) {
FADDS(v1, v1, s0);
} else {
FCVT_D_S(s0, s0);
FADDD(v1, v1, s0);
}
break;
case 1:
INST_NAME("FMUL ST0, float[ED]");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_ST0);
s0 = fpu_get_scratch(dyn);
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<2, 3, rex, NULL, 0, 0);
VLDR32_U12(s0, ed, fixedaddress);
if(ST_IS_F(0)) {
FMULS(v1, v1, s0);
} else {
FCVT_D_S(s0, s0);
FMULD(v1, v1, s0);
}
break;
case 2:
INST_NAME("FCOM ST0, float[ED]");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_ST0);
s0 = fpu_get_scratch(dyn);
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<2, 3, rex, NULL, 0, 0);
VLDR32_U12(s0, ed, fixedaddress);
if(ST_IS_F(0)) {
FCMPS(v1, s0);
} else {
FCVT_D_S(s0, s0);
FCMPD(v1, s0);
}
FCOM(x1, x2, x3);
break;
case 3:
INST_NAME("FCOMP ST0, float[ED]");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_ST0);
s0 = fpu_get_scratch(dyn);
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<2, 3, rex, NULL, 0, 0);
VLDR32_U12(s0, ed, fixedaddress);
if(ST_IS_F(0)) {
FCMPS(v1, s0);
} else {
FCVT_D_S(s0, s0);
FCMPD(v1, s0);
}
FCOM(x1, x2, x3);
x87_do_pop(dyn, ninst, x3);
break;
case 4:
INST_NAME("FSUB ST0, float[ED]");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_ST0);
s0 = fpu_get_scratch(dyn);
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<2, 3, rex, NULL, 0, 0);
VLDR32_U12(s0, ed, fixedaddress);
if(ST_IS_F(0)) {
FSUBS(v1, v1, s0);
} else {
FCVT_D_S(s0, s0);
FSUBD(v1, v1, s0);
}
break;
case 5:
INST_NAME("FSUBR ST0, float[ED]");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_ST0);
s0 = fpu_get_scratch(dyn);
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<2, 3, rex, NULL, 0, 0);
VLDR32_U12(s0, ed, fixedaddress);
if(ST_IS_F(0)) {
FSUBS(v1, s0, v1);
} else {
FCVT_D_S(s0, s0);
FSUBD(v1, s0, v1);
}
break;
case 6:
INST_NAME("FDIV ST0, float[ED]");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_ST0);
s0 = fpu_get_scratch(dyn);
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<2, 3, rex, NULL, 0, 0);
VLDR32_U12(s0, ed, fixedaddress);
if(ST_IS_F(0)) {
FDIVS(v1, v1, s0);
} else {
FCVT_D_S(s0, s0);
FDIVD(v1, v1, s0);
}
break;
case 7:
INST_NAME("FDIVR ST0, float[ED]");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_ST0);
s0 = fpu_get_scratch(dyn);
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<2, 3, rex, NULL, 0, 0);
VLDR32_U12(s0, ed, fixedaddress);
if(ST_IS_F(0)) {
FDIVS(v1, s0, v1);
} else {
FCVT_D_S(s0, s0);
FDIVD(v1, s0, v1);
}
break;
default:
DEFAULT;
}
}
return addr;
}
+399
View File
@@ -0,0 +1,399 @@
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <pthread.h>
#include <errno.h>
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
#include "emu/x64run_private.h"
#include "x64trace.h"
#include "emu/x87emu_private.h"
#include "dynarec_native.h"
#include "arm64_printer.h"
#include "dynarec_arm64_private.h"
#include "dynarec_arm64_helper.h"
#include "dynarec_arm64_functions.h"
uintptr_t dynarec64_D9(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog)
{
(void)ip; (void)rep; (void)need_epilog;
uint8_t nextop = F8;
uint8_t ed;
uint8_t wback, wb1;
uint8_t u8;
int64_t fixedaddress;
int v1, v2;
int s0;
int i1, i2, i3;
MAYUSE(s0);
MAYUSE(v2);
MAYUSE(v1);
switch(nextop) {
case 0xC0:
case 0xC1:
case 0xC2:
case 0xC3:
case 0xC4:
case 0xC5:
case 0xC6:
case 0xC7:
INST_NAME("FLD STx");
v2 = x87_do_push(dyn, ninst, x1, X87_ST(nextop&7));
v1 = x87_get_st(dyn, ninst, x1, x2, (nextop&7)+1, X87_COMBINE(0, (nextop&7)+1));
if(ST_IS_F(0)) {
FMOVS(v2, v1);
} else {
FMOVD(v2, v1);
}
break;
case 0xC8:
INST_NAME("FXCH ST0");
break;
case 0xC9:
case 0xCA:
case 0xCB:
case 0xCC:
case 0xCD:
case 0xCE:
case 0xCF:
INST_NAME("FXCH STx");
// swap the cache value, not the double value itself :p
x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_ST(nextop&7));
x87_get_st(dyn, ninst, x1, x2, 0, X87_ST0);
x87_swapreg(dyn, ninst, x1, x2, 0, nextop&7);
// should set C1 to 0
break;
case 0xD0:
INST_NAME("FNOP");
break;
case 0xD8:
INST_NAME("FSTPNCE ST0, ST0");
x87_do_pop(dyn, ninst, x3);
break;
case 0xD9:
case 0xDA:
case 0xDB:
case 0xDC:
case 0xDD:
case 0xDE:
case 0xDF:
INST_NAME("FSTPNCE ST0, STx");
// copy the cache value for st0 to stx
x87_get_st_empty(dyn, ninst, x1, x2, nextop&7, X87_ST(nextop&7));
x87_get_st(dyn, ninst, x1, x2, 0, X87_ST0);
x87_swapreg(dyn, ninst, x1, x2, 0, nextop&7);
x87_do_pop(dyn, ninst, x3);
break;
case 0xE0:
INST_NAME("FCHS");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_ST0);
if(ST_IS_F(0)) {
FNEGS(v1, v1);
} else {
FNEGD(v1, v1);
}
break;
case 0xE1:
INST_NAME("FABS");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_ST0);
if(ST_IS_F(0)) {
FABSS(v1, v1);
} else {
FABSD(v1, v1);
}
break;
case 0xE4:
INST_NAME("FTST");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_ST0);
if(ST_IS_F(0)) {
FCMPS_0(v1);
} else {
FCMPD_0(v1);
}
FCOM(x1, x2, x3); // same flags...
break;
case 0xE5:
INST_NAME("FXAM");
MESSAGE(LOG_DUMP, "Need Optimization\n");
x87_refresh(dyn, ninst, x1, x2, 0);
CALL(fpu_fxam, -1); // should be possible inline, but is it worth it?
break;
case 0xE8:
INST_NAME("FLD1");
v1 = x87_do_push(dyn, ninst, x1, NEON_CACHE_ST_F);
if(ST_IS_F(0)) {
FMOVS_8(v1, 0b01110000);
} else {
FMOVD_8(v1, 0b01110000);
}
break;
case 0xE9:
INST_NAME("FLDL2T");
v1 = x87_do_push(dyn, ninst, x1, NEON_CACHE_ST_D);
FTABLE64(v1, L2T);
break;
case 0xEA:
INST_NAME("FLDL2E");
v1 = x87_do_push(dyn, ninst, x1, NEON_CACHE_ST_D);
FTABLE64(v1, L2E);
break;
case 0xEB:
INST_NAME("FLDPI");
v1 = x87_do_push(dyn, ninst, x1, NEON_CACHE_ST_D);
FTABLE64(v1, PI);
break;
case 0xEC:
INST_NAME("FLDLG2");
v1 = x87_do_push(dyn, ninst, x1, NEON_CACHE_ST_D);
FTABLE64(v1, LG2);
break;
case 0xED:
INST_NAME("FLDLN2");
v1 = x87_do_push(dyn, ninst, x1, NEON_CACHE_ST_D);
FTABLE64(v1, LN2);
break;
case 0xEE:
INST_NAME("FLDZ");
v1 = x87_do_push(dyn, ninst, x1, NEON_CACHE_ST_F);
VEOR(v1, v1, v1);
break;
case 0xF0:
INST_NAME("F2XM1");
MESSAGE(LOG_DUMP, "Need Optimization\n");
x87_forget(dyn, ninst, x1, x2, 0);
CALL(arm_f2xm1, -1);
break;
case 0xF1:
INST_NAME("FYL2X");
MESSAGE(LOG_DUMP, "Need Optimization\n");
x87_forget(dyn, ninst, x1, x2, 0);
x87_forget(dyn, ninst, x1, x2, 1);
CALL(arm_fyl2x, -1);
x87_do_pop(dyn, ninst, x3);
break;
case 0xF2:
INST_NAME("FPTAN");
MESSAGE(LOG_DUMP, "Need Optimization\n");
x87_forget(dyn, ninst, x1, x2, 0);
CALL(arm_ftan, -1);
v1 = x87_do_push(dyn, ninst, x1, NEON_CACHE_ST_F);
if(ST_IS_F(0)) {
FMOVS_8(v1, 0b01110000);
} else {
FMOVD_8(v1, 0b01110000);
}
break;
case 0xF3:
INST_NAME("FPATAN");
MESSAGE(LOG_DUMP, "Need Optimization\n");
x87_forget(dyn, ninst, x1, x2, 0);
x87_forget(dyn, ninst, x1, x2, 1);
CALL(arm_fpatan, -1);
x87_do_pop(dyn, ninst, x3);
break;
case 0xF4:
INST_NAME("FXTRACT");
MESSAGE(LOG_DUMP, "Need Optimization\n");
x87_do_push_empty(dyn, ninst, 0);
x87_forget(dyn, ninst, x1, x2, 1);
CALL(arm_fxtract, -1);
break;
case 0xF5:
INST_NAME("FPREM1");
MESSAGE(LOG_DUMP, "Need Optimization\n");
x87_forget(dyn, ninst, x1, x2, 0);
x87_forget(dyn, ninst, x1, x2, 1);
CALL(arm_fprem1, -1);
break;
case 0xF6:
INST_NAME("FDECSTP");
fpu_purgecache(dyn, ninst, 0, x1, x2, x3);
LDRw_U12(x2, xEmu, offsetof(x64emu_t, top));
SUBw_U12(x2, x2, 1);
ANDw_mask(x2, x2, 0, 2); //mask=7
STRw_U12(x2, xEmu, offsetof(x64emu_t, top));
break;
case 0xF7:
INST_NAME("FINCSTP");
fpu_purgecache(dyn, ninst, 0, x1, x2, x3);
LDRw_U12(x2, xEmu, offsetof(x64emu_t, top));
ADDw_U12(x2, x2, 1);
ANDw_mask(x2, x2, 0, 2); //mask=7
STRw_U12(x2, xEmu, offsetof(x64emu_t, top));
break;
case 0xF8:
INST_NAME("FPREM");
MESSAGE(LOG_DUMP, "Need Optimization\n");
x87_forget(dyn, ninst, x1, x2, 0);
x87_forget(dyn, ninst, x1, x2, 1);
CALL(arm_fprem, -1);
break;
case 0xF9:
INST_NAME("FYL2XP1");
MESSAGE(LOG_DUMP, "Need Optimization\n");
x87_forget(dyn, ninst, x1, x2, 0);
x87_forget(dyn, ninst, x1, x2, 1);
CALL(arm_fyl2xp1, -1);
x87_do_pop(dyn, ninst, x3);
break;
case 0xFA:
INST_NAME("FSQRT");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_ST0);
if(ST_IS_F(0)) {
FSQRTS(v1, v1);
} else {
FSQRTD(v1, v1);
}
break;
case 0xFB:
INST_NAME("FSINCOS");
MESSAGE(LOG_DUMP, "Need Optimization\n");
x87_do_push_empty(dyn, ninst, 0);
x87_forget(dyn, ninst, x1, x2, 1);
CALL(arm_fsincos, -1);
break;
case 0xFC:
INST_NAME("FRNDINT");
#if 0
MESSAGE(LOG_DUMP, "Need Optimization\n");
// use C helper for now, nothing staightforward is available
x87_forget(dyn, ninst, x1, x2, 0);
CALL(arm_frndint, -1);
#else
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_ST0);
u8 = x87_setround(dyn, ninst, x1, x2, x3);
if(ST_IS_F(0)) {
FRINTIS(v1, v1);
} else {
FRINTID(v1, v1);
}
x87_restoreround(dyn, ninst, u8);
#endif
break;
case 0xFD:
INST_NAME("FSCALE");
MESSAGE(LOG_DUMP, "Need Optimization\n");
x87_forget(dyn, ninst, x1, x2, 0);
x87_forget(dyn, ninst, x1, x2, 1);
CALL(arm_fscale, -1);
break;
case 0xFE:
INST_NAME("FSIN");
MESSAGE(LOG_DUMP, "Need Optimization\n");
x87_forget(dyn, ninst, x1, x2, 0);
CALL(arm_fsin, -1);
break;
case 0xFF:
INST_NAME("FCOS");
MESSAGE(LOG_DUMP, "Need Optimization\n");
x87_forget(dyn, ninst, x1, x2, 0);
CALL(arm_fcos, -1);
break;
case 0xD1:
case 0xD4:
case 0xD5:
case 0xD6:
case 0xD7:
case 0xE2:
case 0xE3:
case 0xE6:
case 0xE7:
case 0xEF:
DEFAULT;
break;
default:
switch((nextop>>3)&7) {
case 0:
INST_NAME("FLD ST0, float[ED]");
v1 = x87_do_push(dyn, ninst, x1, box64_dynarec_x87double?NEON_CACHE_ST_D:NEON_CACHE_ST_F);
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<2, 3, rex, NULL, 0, 0);
VLDR32_U12(v1, ed, fixedaddress);
if(!ST_IS_F(0)) {
FCVT_D_S(v1, v1);
}
break;
case 2:
INST_NAME("FST float[ED], ST0");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_F);
if(ST_IS_F(0))
s0 = v1;
else {
s0 = fpu_get_scratch(dyn);
FCVT_S_D(s0, v1);
}
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<2, 3, rex, NULL, 0, 0);
VSTR32_U12(s0, ed, fixedaddress);
break;
case 3:
INST_NAME("FSTP float[ED], ST0");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_F);
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<2, 3, rex, NULL, 0, 0);
if(!ST_IS_F(0)) {
FCVT_S_D(v1, v1);
}
VSTR32_U12(v1, ed, fixedaddress);
x87_do_pop(dyn, ninst, x3);
break;
case 4:
INST_NAME("FLDENV Ed");
MESSAGE(LOG_DUMP, "Need Optimization\n");
fpu_purgecache(dyn, ninst, 0, x1, x2, x3); // maybe only x87, not SSE?
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0, 0, rex, NULL, 0, 0);
if(ed!=x1) {
MOVx_REG(x1, ed);
}
MOV32w(x2, 0);
CALL(fpu_loadenv, -1);
break;
case 5:
INST_NAME("FLDCW Ew");
GETEW(x1, 0);
STRH_U12(x1, xEmu, offsetof(x64emu_t, cw)); // hopefully cw is not too far for an imm8
break;
case 6:
INST_NAME("FNSTENV Ed");
MESSAGE(LOG_DUMP, "Need Optimization\n");
fpu_purgecache(dyn, ninst, 0, x1, x2, x3); // maybe only x87, not SSE?
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0, 0, rex, NULL, 0, 0);
if(ed!=x1) {
MOVx_REG(x1, ed);
}
MOV32w(x2, 0);
CALL(fpu_savenv, -1);
break;
case 7:
INST_NAME("FNSTCW Ew");
addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xfff<<1, 1, rex, NULL, 0, 0);
ed = x1;
wb1 = 1;
LDRH_U12(x1, xEmu, offsetof(x64emu_t, cw));
EWBACK;
break;
default:
DEFAULT;
}
}
return addr;
}
+383
View File
@@ -0,0 +1,383 @@
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <pthread.h>
#include <errno.h>
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
#include "emu/x64run_private.h"
#include "x64trace.h"
#include "emu/x87emu_private.h"
#include "dynarec_native.h"
#include "arm64_printer.h"
#include "dynarec_arm64_private.h"
#include "dynarec_arm64_helper.h"
#include "dynarec_arm64_functions.h"
uintptr_t dynarec64_DB(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog)
{
(void)ip; (void)rep; (void)need_epilog;
uint8_t nextop = F8;
uint8_t ed;
uint8_t wback;
uint8_t u8;
int64_t fixedaddress;
int v1, v2;
int s0;
int64_t j64;
MAYUSE(s0);
MAYUSE(v2);
MAYUSE(v1);
MAYUSE(j64);
switch(nextop) {
case 0xC0:
case 0xC1:
case 0xC2:
case 0xC3:
case 0xC4:
case 0xC5:
case 0xC6:
case 0xC7:
INST_NAME("FCMOVNB ST0, STx");
READFLAGS(X_CF);
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v2 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
TSTw_mask(xFlags, 0, 0); //mask=1<<F_CF
if(ST_IS_F(0)) {
FCSELS(v1, v2, v1, cEQ);
} else {
FCSELD(v1, v2, v1, cEQ); // F_CF==0
}
break;
case 0xC8:
case 0xC9:
case 0xCA:
case 0xCB:
case 0xCC:
case 0xCD:
case 0xCE:
case 0xCF:
INST_NAME("FCMOVNE ST0, STx");
READFLAGS(X_ZF);
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v2 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
TSTw_mask(xFlags, 0b011010, 0); //mask=1<<F_ZF
if(ST_IS_F(0)) {
FCSELS(v1, v2, v1, cEQ);
} else {
FCSELD(v1, v2, v1, cEQ); // F_ZF==0
}
break;
case 0xD0:
case 0xD1:
case 0xD2:
case 0xD3:
case 0xD4:
case 0xD5:
case 0xD6:
case 0xD7:
INST_NAME("FCMOVNBE ST0, STx");
READFLAGS(X_CF|X_ZF);
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v2 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
MOV32w(x1, (1<<F_CF)|(1<<F_ZF));
TSTw_REG(xFlags, x1);
if(ST_IS_F(0)) {
FCSELS(v1, v2, v1, cEQ);
} else {
FCSELD(v1, v2, v1, cEQ); // F_CF==0 & F_ZF==0
}
break;
case 0xD8:
case 0xD9:
case 0xDA:
case 0xDB:
case 0xDC:
case 0xDD:
case 0xDE:
case 0xDF:
INST_NAME("FCMOVNU ST0, STx");
READFLAGS(X_PF);
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v2 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
TSTw_mask(xFlags, 0b011110, 0); //mask=1<<F_PF
if(ST_IS_F(0)) {
FCSELS(v1, v2, v1, cEQ);
} else {
FCSELD(v1, v2, v1, cEQ); // F_PF==0
}
break;
case 0xE1:
INST_NAME("FDISI8087_NOP"); // so.. NOP?
break;
case 0xE2:
INST_NAME("FNCLEX");
LDRH_U12(x2, xEmu, offsetof(x64emu_t, sw));
MOV32w(x1, 0);
BFIw(x2, x1, 0, 8); // IE .. PE, SF, ES
BFIw(x2, x1, 15, 1); // B
STRH_U12(x2, xEmu, offsetof(x64emu_t, sw));
break;
case 0xE3:
INST_NAME("FNINIT");
MESSAGE(LOG_DUMP, "Need Optimization\n");
x87_purgecache(dyn, ninst, 0, x1, x2, x3);
CALL(reset_fpu, -1);
break;
case 0xE8:
case 0xE9:
case 0xEA:
case 0xEB:
case 0xEC:
case 0xED:
case 0xEE:
case 0xEF:
INST_NAME("FUCOMI ST0, STx");
SETFLAGS(X_ALL, SF_SET);
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v2 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0)) {
FCMPS(v1, v2);
} else {
FCMPD(v1, v2);
}
FCOMI(x1, x2);
break;
case 0xF0:
case 0xF1:
case 0xF2:
case 0xF3:
case 0xF4:
case 0xF5:
case 0xF6:
case 0xF7:
INST_NAME("FCOMI ST0, STx");
SETFLAGS(X_ALL, SF_SET);
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v2 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0)) {
FCMPS(v1, v2);
} else {
FCMPD(v1, v2);
}
FCOMI(x1, x2);
break;
case 0xE0:
case 0xE4:
case 0xE5:
case 0xE6:
case 0xE7:
DEFAULT;
break;
default:
switch((nextop>>3)&7) {
case 0:
INST_NAME("FILD ST0, Ed");
v1 = x87_do_push(dyn, ninst, x1, NEON_CACHE_ST_D);
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<2, 3, rex, NULL, 0, 0);
VLDR32_U12(v1, ed, fixedaddress);
SXTL_32(v1, v1); // i32 -> i64
SCVTFDD(v1, v1); // i64 -> double
break;
case 1:
INST_NAME("FISTTP Ed, ST0");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0xfff<<2, 3, rex, NULL, 0, 0);
s0 = fpu_get_scratch(dyn);
#if 0
ed = x1;
FRINT32ZD(s0, v1);
FCVTZSwD(ed, s0);
WBACK;
#else
MRS_fpsr(x5);
BFCw(x5, FPSR_IOC, 1); // reset IOC bit
MSR_fpsr(x5);
FRINTZD(s0, v1);
VFCVTZSd(s0, s0);
SQXTN_S_D(s0, s0);
VSTR32_U12(s0, wback, fixedaddress);
MRS_fpsr(x5); // get back FPSR to check the IOC bit
TBZ_MARK3(x5, FPSR_IOC);
MOV32w(x5, 0x80000000);
STRw_U12(x5, wback, fixedaddress);
MARK3;
#endif
x87_do_pop(dyn, ninst, x3);
break;
case 2:
INST_NAME("FIST Ed, ST0");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
u8 = x87_setround(dyn, ninst, x1, x2, x4); // x1 have the modified RPSCR reg
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0xfff<<2, 3, rex, NULL, 0, 0);
s0 = fpu_get_scratch(dyn);
#if 0
ed = x1;
FRINT32XD(s0, v1);
FCVTZSwD(ed, s0);
WBACK;
#else
MRS_fpsr(x5);
BFCw(x5, FPSR_IOC, 1); // reset IOC bit
MSR_fpsr(x5);
FRINTXD(s0, v1);
VFCVTZSd(s0, s0);
SQXTN_S_D(s0, s0);
VSTR32_U12(s0, wback, fixedaddress);
MRS_fpsr(x5); // get back FPSR to check the IOC bit
TBZ_MARK3(x5, FPSR_IOC);
MOV32w(x5, 0x80000000);
STRw_U12(x5, wback, fixedaddress);
MARK3;
#endif
x87_restoreround(dyn, ninst, u8);
break;
case 3:
INST_NAME("FISTP Ed, ST0");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
u8 = x87_setround(dyn, ninst, x1, x2, x4); // x1 have the modified RPSCR reg
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0xfff<<2, 3, rex, NULL, 0, 0);
s0 = fpu_get_scratch(dyn);
#if 0
ed = x1;
FRINT32XD(s0, v1);
FCVTZSwD(ed, s0);
WBACK;
#else
MRS_fpsr(x5);
BFCw(x5, FPSR_IOC, 1); // reset IOC bit
MSR_fpsr(x5);
FRINTXD(s0, v1);
VFCVTZSd(s0, s0);
SQXTN_S_D(s0, s0);
VSTR32_U12(s0, wback, fixedaddress);
MRS_fpsr(x5); // get back FPSR to check the IOC bit
TBZ_MARK3(x5, FPSR_IOC);
MOV32w(x5, 0x80000000);
STRw_U12(x5, wback, fixedaddress);
MARK3;
#endif
x87_restoreround(dyn, ninst, u8);
x87_do_pop(dyn, ninst, x3);
break;
case 5:
INST_NAME("FLD tbyte");
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0, 0, rex, NULL, 0, 0);
if((PK(0)==0xDB && ((PK(1)>>3)&7)==7) || (PK(0)>=0x40 && PK(0)<=0x4f && PK(1)==0xDB && ((PK(2)>>3)&7)==7)) {
// the FLD is immediatly followed by an FSTP
LDRx_U12(x5, ed, 0);
LDRH_U12(x6, ed, 8);
// no persistant scratch register, so unrool both instruction here...
MESSAGE(LOG_DUMP, "\tHack: FSTP tbyte\n");
nextop = F8; // 0xDB or rex
if(nextop>=0x40 && nextop<=0x4f) {
rex.rex = nextop;
nextop = F8; //0xDB
} else
rex.rex = 0;
nextop = F8; //modrm
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0, 0, rex, NULL, 0, 0);
STRx_U12(x5, ed, 0);
STRH_U12(x6, ed, 8);
} else {
if(box64_x87_no80bits) {
v1 = x87_do_push(dyn, ninst, x1, NEON_CACHE_ST_D);
addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<3, 7, rex, NULL, 0, 0);
VLDR64_U12(v1, ed, fixedaddress);
} else {
if(ed!=x1) {
MOVx_REG(x1, ed);
}
x87_do_push_empty(dyn, ninst, x3);
CALL(arm_fld, -1);
}
}
break;
case 7:
INST_NAME("FSTP tbyte");
if(box64_x87_no80bits) {
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0xfff<<3, 7, rex, NULL, 0, 0);
VSTR64_U12(v1, wback, fixedaddress);
} else {
#if 0
x87_forget(dyn, ninst, x1, x3, 0);
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0, 0, rex, NULL, 0, 0);
if(ed!=x1) {
MOVx_REG(x1, ed);
}
CALL(arm_fstp, -1);
#else
// Painfully long, straight conversion from the C code, shoud be optimized
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0, 0, rex, NULL, 0, 0);
FMOVxD(x1, v1);
// do special value first
TSTx_mask(x1, 1, 0b00000, 0b111110); //0x7fffffffffffffffL
B_MARK(cNE);
// Zero
LSRx(x3, x1, 63-15); //x3 = sign+exp
MOVZw(x5, 0); // x5 = mantisse
B_MARK3_nocond;
MARK;
// get sign, in main ouput x5 for sign+exp
ANDx_mask(x5, x1, 1, 1, 0); //0x8000000000000000
LSRx(x5, x5, 63-15); // x5 = sign
// get exp
LSRx(x3, x1, 52); // x3 = exp11
ANDw_mask(x3, x3, 0, 0b1010); //0x7ff
MOV32w(x4, 0x7ff);
CMPSw_REG(x3, x4);
B_MARK2(cNE);
// NaN and Infinite
ORRw_mask(x3, x5, 0, 0b1110); //x3 = sign | 0x7fff
TSTx_mask(x1, 1, 0, 0b110011); //0x000fffffffffffffL
ORRx_mask(x5, xZR, 1, 1, 0); //0x8000000000000000
ORRx_mask(x4, xZR, 1, 0b10, 0b01); //0xc000000000000000
CSELx(x5, x5, x4, cEQ); // x5 = mantisse
B_MARK3_nocond;
MARK2;
// regular / denormals
ANDx_mask(x1, x1, 1, 0, 0b110011); //0x000fffffffffffffL
LSLx_IMM(x1, x1, 11); //x1 = mantisse missing "1"
MOVZw(x4, 16383-1023); //BIAS80 - BIAS64
CBZw(x3, 4+3*4); // exp11 == 0?
// normals
ADDw_REG(x3, x3, x4); // x3 = exp16
ORRw_REG(x3, x3, x5); // x3 = sign | exp
ORRx_mask(x5, x1, 1, 1, 0); //0x8000000000000000 x5 = mantisse
B_MARK3_nocond;
// denormals
CLZx(x6, x1);
ADDw_U12(x6, x6, 1); // "one"
SUBw_REG(x3, x4, x6); // x3 = exp16
ORRw_REG(x3, x3, x5); // x3 = sign | exp16
LSLx_REG(x5, x1, x6); // x5 = mantisse
MARK3;
STRx_U12(x5, wback, 0);
STRH_U12(x3, wback, 8);
#endif
}
x87_do_pop(dyn, ninst, x3);
break;
default:
DEFAULT;
}
}
return addr;
}
+251
View File
@@ -0,0 +1,251 @@
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <pthread.h>
#include <errno.h>
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
#include "emu/x64run_private.h"
#include "x64trace.h"
#include "emu/x87emu_private.h"
#include "dynarec_native.h"
#include "arm64_printer.h"
#include "dynarec_arm64_private.h"
#include "dynarec_arm64_helper.h"
#include "dynarec_arm64_functions.h"
uintptr_t dynarec64_DC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog)
{
(void)ip; (void)rep; (void)need_epilog;
uint8_t nextop = F8;
uint8_t wback;
int64_t fixedaddress;
int v1, v2;
MAYUSE(v2);
MAYUSE(v1);
switch(nextop) {
case 0xC0:
case 0xC1:
case 0xC2:
case 0xC3:
case 0xC4:
case 0xC5:
case 0xC6:
case 0xC7:
INST_NAME("FADD STx, ST0");
v2 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v1 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0)) {
FADDS(v1, v1, v2);
} else {
FADDD(v1, v1, v2);
}
break;
case 0xC8:
case 0xC9:
case 0xCA:
case 0xCB:
case 0xCC:
case 0xCD:
case 0xCE:
case 0xCF:
INST_NAME("FMUL STx, ST0");
v2 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v1 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0)) {
FMULS(v1, v1, v2);
} else {
FMULD(v1, v1, v2);
}
break;
case 0xD0:
case 0xD1:
case 0xD2:
case 0xD3:
case 0xD4:
case 0xD5:
case 0xD6:
case 0xD7:
INST_NAME("FCOM ST0, STx"); //yep
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v2 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0)) {
FCMPS(v1, v2);
} else {
FCMPD(v1, v2);
}
FCOM(x1, x2, x3);
break;
case 0xD8:
case 0xD9:
case 0xDA:
case 0xDB:
case 0xDC:
case 0xDD:
case 0xDE:
case 0xDF:
INST_NAME("FCOMP ST0, STx");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v2 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0)) {
FCMPS(v1, v2);
} else {
FCMPD(v1, v2);
}
FCOM(x1, x2, x3);
x87_do_pop(dyn, ninst, x3);
break;
case 0xE0:
case 0xE1:
case 0xE2:
case 0xE3:
case 0xE4:
case 0xE5:
case 0xE6:
case 0xE7:
INST_NAME("FSUBR STx, ST0");
v2 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v1 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0)) {
FSUBS(v1, v2, v1);
} else {
FSUBD(v1, v2, v1);
}
break;
case 0xE8:
case 0xE9:
case 0xEA:
case 0xEB:
case 0xEC:
case 0xED:
case 0xEE:
case 0xEF:
INST_NAME("FSUB STx, ST0");
v2 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v1 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0)) {
FSUBS(v1, v1, v2);
} else {
FSUBD(v1, v1, v2);
}
break;
case 0xF0:
case 0xF1:
case 0xF2:
case 0xF3:
case 0xF4:
case 0xF5:
case 0xF6:
case 0xF7:
INST_NAME("FDIVR STx, ST0");
v2 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v1 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0)) {
FDIVS(v1, v2, v1);
} else {
FDIVD(v1, v2, v1);
}
break;
case 0xF8:
case 0xF9:
case 0xFA:
case 0xFB:
case 0xFC:
case 0xFD:
case 0xFE:
case 0xFF:
INST_NAME("FDIV STx, ST0");
v2 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v1 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0)) {
FDIVS(v1, v1, v2);
} else {
FDIVD(v1, v1, v2);
}
break;
default:
switch((nextop>>3)&7) {
case 0:
INST_NAME("FADD ST0, double[ED]");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
v2 = fpu_get_scratch(dyn);
addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xfff<<3, 7, rex, NULL, 0, 0);
VLDR64_U12(v2, wback, fixedaddress);
FADDD(v1, v1, v2);
break;
case 1:
INST_NAME("FMUL ST0, double[ED]");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
v2 = fpu_get_scratch(dyn);
addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xfff<<3, 7, rex, NULL, 0, 0);
VLDR64_U12(v2, wback, fixedaddress);
FMULD(v1, v1, v2);
break;
case 2:
INST_NAME("FCOM ST0, double[ED]");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
v2 = fpu_get_scratch(dyn);
addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xfff<<3, 7, rex, NULL, 0, 0);
VLDR64_U12(v2, wback, fixedaddress);
FCMPD(v1, v2);
FCOM(x1, x2, x3);
break;
case 3:
INST_NAME("FCOMP ST0, double[ED]");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
v2 = fpu_get_scratch(dyn);
addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xfff<<3, 7, rex, NULL, 0, 0);
VLDR64_U12(v2, wback, fixedaddress);
FCMPD(v1, v2);
FCOM(x1, x2, x3);
x87_do_pop(dyn, ninst, x3);
break;
case 4:
INST_NAME("FSUB ST0, double[ED]");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
v2 = fpu_get_scratch(dyn);
addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xfff<<3, 7, rex, NULL, 0, 0);
VLDR64_U12(v2, wback, fixedaddress);
FSUBD(v1, v1, v2);
break;
case 5:
INST_NAME("FSUBR ST0, double[ED]");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
v2 = fpu_get_scratch(dyn);
addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xfff<<3, 7, rex, NULL, 0, 0);
VLDR64_U12(v2, wback, fixedaddress);
FSUBD(v1, v2, v1);
break;
case 6:
INST_NAME("FDIV ST0, double[ED]");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
v2 = fpu_get_scratch(dyn);
addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xfff<<3, 7, rex, NULL, 0, 0);
VLDR64_U12(v2, wback, fixedaddress);
FDIVD(v1, v1, v2);
break;
case 7:
INST_NAME("FDIVR ST0, double[ED]");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
v2 = fpu_get_scratch(dyn);
addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xfff<<3, 7, rex, NULL, 0, 0);
VLDR64_U12(v2, wback, fixedaddress);
FDIVD(v1, v2, v1);
break;
}
}
return addr;
}
+244
View File
@@ -0,0 +1,244 @@
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <pthread.h>
#include <errno.h>
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
#include "emu/x64run_private.h"
#include "x64trace.h"
#include "emu/x87emu_private.h"
#include "dynarec_native.h"
#include "arm64_printer.h"
#include "dynarec_arm64_private.h"
#include "dynarec_arm64_helper.h"
#include "dynarec_arm64_functions.h"
uintptr_t dynarec64_DD(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog)
{
(void)ip; (void)rep; (void)need_epilog;
uint8_t nextop = F8;
uint8_t ed;
int64_t fixedaddress;
int v1, v2;
int s0;
int64_t j64;
MAYUSE(s0);
MAYUSE(v2);
MAYUSE(v1);
MAYUSE(j64);
switch(nextop) {
case 0xC0:
case 0xC1:
case 0xC2:
case 0xC3:
case 0xC4:
case 0xC5:
case 0xC6:
case 0xC7:
INST_NAME("FFREE STx");
MESSAGE(LOG_DUMP, "Need Optimization\n");
x87_purgecache(dyn, ninst, 0, x1, x2, x3);
MOV32w(x1, nextop&7);
CALL(fpu_do_free, -1);
break;
case 0xD0:
case 0xD1:
case 0xD2:
case 0xD3:
case 0xD4:
case 0xD5:
case 0xD6:
case 0xD7:
INST_NAME("FST ST0, STx");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v2 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0)) {
FMOVS(v2, v1);
} else {
FMOVD(v2, v1);
}
break;
case 0xD8:
INST_NAME("FSTP ST0, ST0");
x87_do_pop(dyn, ninst, x3);
break;
case 0xD9:
case 0xDA:
case 0xDB:
case 0xDC:
case 0xDD:
case 0xDE:
case 0xDF:
INST_NAME("FSTP ST0, STx");
// copy the cache value for st0 to stx
x87_get_st_empty(dyn, ninst, x1, x2, nextop&7, X87_ST(nextop&7));
x87_get_st(dyn, ninst, x1, x2, 0, X87_ST0);
x87_swapreg(dyn, ninst, x1, x2, 0, nextop&7);
x87_do_pop(dyn, ninst, x3);
break;
case 0xE0:
case 0xE1:
case 0xE2:
case 0xE3:
case 0xE4:
case 0xE5:
case 0xE6:
case 0xE7:
INST_NAME("FUCOM ST0, STx");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v2 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0)) {
FCMPS(v1, v2);
} else {
FCMPD(v1, v2);
}
FCOM(x1, x2, x3);
break;
case 0xE8:
case 0xE9:
case 0xEA:
case 0xEB:
case 0xEC:
case 0xED:
case 0xEE:
case 0xEF:
INST_NAME("FUCOMP ST0, STx");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v2 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0)) {
FCMPS(v1, v2);
} else {
FCMPD(v1, v2);
}
FCOM(x1, x2, x3);
x87_do_pop(dyn, ninst, x3);
break;
case 0xC8:
case 0xC9:
case 0xCA:
case 0xCB:
case 0xCC:
case 0xCD:
case 0xCE:
case 0xCF:
case 0xF0:
case 0xF1:
case 0xF2:
case 0xF3:
case 0xF4:
case 0xF5:
case 0xF6:
case 0xF7:
case 0xF8:
case 0xF9:
case 0xFA:
case 0xFB:
case 0xFC:
case 0xFD:
case 0xFE:
case 0xFF:
DEFAULT;
break;
default:
switch((nextop>>3)&7) {
case 0:
INST_NAME("FLD double");
v1 = x87_do_push(dyn, ninst, x3, NEON_CACHE_ST_D);
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<3, 7, rex, NULL, 0, 0);
VLDR64_U12(v1, ed, fixedaddress);
break;
case 1:
INST_NAME("FISTTP i64, ST0");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<3, 7, rex, NULL, 0, 0);
s0 = fpu_get_scratch(dyn);
#if 0
// those are ARM 8.5 opcode!
FRINT64ZD(s0, v1);
FCVTZSxD(x2, s0);
STRx_U12(x2, ed, fixedaddress);
#else
MRS_fpsr(x5);
BFCw(x5, FPSR_IOC, 1); // reset IOC bit
MSR_fpsr(x5);
FRINTRRD(s0, v1, 3);
FCVTZSxD(x2, s0);
STRx_U12(x2, ed, fixedaddress);
MRS_fpsr(x5); // get back FPSR to check the IOC bit
TBZ_MARK3(x5, FPSR_IOC);
ORRx_mask(x5, xZR, 1, 1, 0); //0x8000000000000000
STRw_U12(x5, ed, fixedaddress);
MARK3;
#endif
x87_do_pop(dyn, ninst, x3);
break;
case 2:
INST_NAME("FST double");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<3, 7, rex, NULL, 0, 0);
VSTR64_U12(v1, ed, fixedaddress);
break;
case 3:
INST_NAME("FSTP double");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<3, 7, rex, NULL, 0, 0);
VSTR64_U12(v1, ed, fixedaddress);
x87_do_pop(dyn, ninst, x3);
break;
case 4:
INST_NAME("FRSTOR m108byte");
MESSAGE(LOG_DUMP, "Need Optimization\n");
fpu_purgecache(dyn, ninst, 0, x1, x2, x3);
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0, 0, rex, NULL, 0, 0);
if(ed!=x1) {MOVx_REG(x1, ed);}
CALL(arm_frstor, -1);
break;
case 6:
INST_NAME("FSAVE m108byte");
MESSAGE(LOG_DUMP, "Need Optimization\n");
fpu_purgecache(dyn, ninst, 0, x1, x2, x3);
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0, 0, rex, NULL, 0, 0);
if(ed!=x1) {MOVx_REG(x1, ed);}
CALL(arm_fsave, -1);
break;
case 7:
INST_NAME("FNSTSW m2byte");
fpu_purgecache(dyn, ninst, 0, x1, x2, x3);
addr = geted(dyn, addr, ninst, nextop, &ed, x4, &fixedaddress, 0xfff<<1, 1, rex, NULL, 0, 0);
LDRw_U12(x2, xEmu, offsetof(x64emu_t, top));
LDRH_U12(x3, xEmu, offsetof(x64emu_t, sw));
if(dyn->n.x87stack) {
// update top
if(dyn->n.x87stack>0) {
SUBw_U12(x2, x2, dyn->n.x87stack);
} else {
ADDw_U12(x2, x2, -dyn->n.x87stack);
}
ANDw_mask(x2, x2, 0, 2);
}
BFIw(x3, x2, 11, 3); // inject TOP at bit 11 (3 bits)
STRH_U12(x3, ed, fixedaddress); // store whole sw flags
break;
default:
DEFAULT;
}
}
return addr;
}
+284
View File
@@ -0,0 +1,284 @@
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <pthread.h>
#include <errno.h>
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
#include "emu/x64run_private.h"
#include "x64trace.h"
#include "emu/x87emu_private.h"
#include "dynarec_native.h"
#include "arm64_printer.h"
#include "dynarec_arm64_private.h"
#include "dynarec_arm64_helper.h"
#include "dynarec_arm64_functions.h"
uintptr_t dynarec64_DE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog)
{
(void)ip; (void)rep; (void)need_epilog;
uint8_t nextop = F8;
uint8_t wback;
int64_t fixedaddress;
int v1, v2;
MAYUSE(v2);
MAYUSE(v1);
switch(nextop) {
case 0xC0:
case 0xC1:
case 0xC2:
case 0xC3:
case 0xC4:
case 0xC5:
case 0xC6:
case 0xC7:
INST_NAME("FADDP STx, ST0");
v2 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v1 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0)) {
FADDS(v1, v1, v2);
} else {
FADDD(v1, v1, v2);
}
x87_do_pop(dyn, ninst, x3);
break;
case 0xC8:
case 0xC9:
case 0xCA:
case 0xCB:
case 0xCC:
case 0xCD:
case 0xCE:
case 0xCF:
INST_NAME("FMULP STx, ST0");
v2 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v1 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0)) {
FMULS(v1, v1, v2);
} else {
FMULD(v1, v1, v2);
}
x87_do_pop(dyn, ninst, x3);
break;
case 0xD0:
case 0xD1:
case 0xD2:
case 0xD3:
case 0xD4:
case 0xD5:
case 0xD6:
case 0xD7:
INST_NAME("FCOMP ST0, STx"); //yep
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v2 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0)) {
FCMPS(v1, v2);
} else {
FCMPD(v1, v2);
}
FCOM(x1, x2, x3);
x87_do_pop(dyn, ninst, x3);
break;
case 0xD9:
INST_NAME("FCOMPP ST0, STx");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v2 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0)) {
FCMPS(v1, v2);
} else {
FCMPD(v1, v2);
}
FCOM(x1, x2, x3);
x87_do_pop(dyn, ninst, x3);
x87_do_pop(dyn, ninst, x3);
break;
case 0xE0:
case 0xE1:
case 0xE2:
case 0xE3:
case 0xE4:
case 0xE5:
case 0xE6:
case 0xE7:
INST_NAME("FSUBRP STx, ST0");
v2 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v1 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0)) {
FSUBS(v1, v2, v1);
} else {
FSUBD(v1, v2, v1);
}
x87_do_pop(dyn, ninst, x3);
break;
case 0xE8:
case 0xE9:
case 0xEA:
case 0xEB:
case 0xEC:
case 0xED:
case 0xEE:
case 0xEF:
INST_NAME("FSUBP STx, ST0");
v2 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v1 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0)) {
FSUBS(v1, v1, v2);
} else {
FSUBD(v1, v1, v2);
}
x87_do_pop(dyn, ninst, x3);
break;
case 0xF0:
case 0xF1:
case 0xF2:
case 0xF3:
case 0xF4:
case 0xF5:
case 0xF6:
case 0xF7:
INST_NAME("FDIVRP STx, ST0");
v2 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v1 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0)) {
FDIVS(v1, v2, v1);
} else {
FDIVD(v1, v2, v1);
}
x87_do_pop(dyn, ninst, x3);
break;
case 0xF8:
case 0xF9:
case 0xFA:
case 0xFB:
case 0xFC:
case 0xFD:
case 0xFE:
case 0xFF:
INST_NAME("FDIVP STx, ST0");
v2 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v1 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0)) {
FDIVS(v1, v1, v2);
} else {
FDIVD(v1, v1, v2);
}
x87_do_pop(dyn, ninst, x3);
break;
case 0xD8:
case 0xDA:
case 0xDB:
case 0xDC:
case 0xDD:
case 0xDE:
case 0xDF:
return 0;
default:
switch((nextop>>3)&7) {
case 0:
INST_NAME("FIADD ST0, word[ED]");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
v2 = fpu_get_scratch(dyn);
addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xfff<<1, 1, rex, NULL, 0, 0);
VLDR16_U12(v2, wback, fixedaddress);
SXTL_16(v2, v2);
SXTL_32(v2, v2);
SCVTFDD(v2, v2);
FADDD(v1, v1, v2);
break;
case 1:
INST_NAME("FIMUL ST0, word[ED]");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
v2 = fpu_get_scratch(dyn);
addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xfff<<1, 1, rex, NULL, 0, 0);
VLDR16_U12(v2, wback, fixedaddress);
SXTL_16(v2, v2);
SXTL_32(v2, v2);
SCVTFDD(v2, v2);
FMULD(v1, v1, v2);
break;
case 2:
INST_NAME("FICOM ST0, word[ED]");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
v2 = fpu_get_scratch(dyn);
addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xfff<<1, 1, rex, NULL, 0, 0);
VLDR16_U12(v2, wback, fixedaddress);
SXTL_16(v2, v2);
SXTL_32(v2, v2);
SCVTFDD(v2, v2);
FCMPD(v1, v2);
FCOM(x1, x2, x3);
break;
case 3:
INST_NAME("FICOMP ST0, word[ED]");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
v2 = fpu_get_scratch(dyn);
addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xfff<<1, 1, rex, NULL, 0, 0);
VLDR16_U12(v2, wback, fixedaddress);
SXTL_16(v2, v2);
SXTL_32(v2, v2);
SCVTFDD(v2, v2);
FCMPD(v1, v2);
FCOM(x1, x2, x3);
x87_do_pop(dyn, ninst, x3);
break;
case 4:
INST_NAME("FISUB ST0, word[ED]");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
v2 = fpu_get_scratch(dyn);
addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xfff<<1, 1, rex, NULL, 0, 0);
VLDR16_U12(v2, wback, fixedaddress);
SXTL_16(v2, v2);
SXTL_32(v2, v2);
SCVTFDD(v2, v2);
FSUBD(v1, v1, v2);
break;
case 5:
INST_NAME("FISUBR ST0, word[ED]");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
v2 = fpu_get_scratch(dyn);
addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xfff<<1, 1, rex, NULL, 0, 0);
VLDR16_U12(v2, wback, fixedaddress);
SXTL_16(v2, v2);
SXTL_32(v2, v2);
SCVTFDD(v2, v2);
FSUBD(v1, v2, v1);
break;
case 6:
INST_NAME("FIDIV ST0, word[ED]");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
v2 = fpu_get_scratch(dyn);
addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xfff<<1, 1, rex, NULL, 0, 0);
VLDR16_U12(v2, wback, fixedaddress);
SXTL_16(v2, v2);
SXTL_32(v2, v2);
SCVTFDD(v2, v2);
FDIVD(v1, v1, v2);
break;
case 7:
INST_NAME("FIDIVR ST0, word[ED]");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
v2 = fpu_get_scratch(dyn);
addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xfff<<1, 1, rex, NULL, 0, 0);
VLDR16_U12(v2, wback, fixedaddress);
SXTL_16(v2, v2);
SXTL_32(v2, v2);
SCVTFDD(v2, v2);
FDIVD(v1, v2, v1);
break;
}
}
return addr;
}
+323
View File
@@ -0,0 +1,323 @@
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <pthread.h>
#include <errno.h>
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
#include "emu/x64run_private.h"
#include "x64trace.h"
#include "emu/x87emu_private.h"
#include "dynarec_native.h"
#include "arm64_printer.h"
#include "dynarec_arm64_private.h"
#include "dynarec_arm64_helper.h"
#include "dynarec_arm64_functions.h"
uintptr_t dynarec64_DF(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog)
{
(void)ip; (void)rep; (void)need_epilog;
uint8_t nextop = F8;
uint8_t ed, wback, u8;
int v1, v2;
int s0;
int64_t j64;
int64_t fixedaddress;
MAYUSE(s0);
MAYUSE(v2);
MAYUSE(v1);
MAYUSE(j64);
switch(nextop) {
case 0xC0:
case 0xC1:
case 0xC2:
case 0xC3:
case 0xC4:
case 0xC5:
case 0xC6:
case 0xC7:
INST_NAME("FFREEP STx");
// not handling Tag...
x87_do_pop(dyn, ninst, x3);
break;
case 0xE0:
INST_NAME("FNSTSW AX");
LDRw_U12(x2, xEmu, offsetof(x64emu_t, top));
LDRH_U12(x1, xEmu, offsetof(x64emu_t, sw));
BFIw(x1, x2, 11, 3); // inject top
BFIw(xRAX, x1, 0, 16);
break;
case 0xE8:
case 0xE9:
case 0xEA:
case 0xEB:
case 0xEC:
case 0xED:
case 0xEE:
case 0xEF:
INST_NAME("FUCOMIP ST0, STx");
SETFLAGS(X_ALL, SF_SET);
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v2 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0))
{
FCMPS(v1, v2);
} else {
FCMPD(v1, v2);
}
FCOMI(x1, x2);
x87_do_pop(dyn, ninst, x3);
break;
case 0xF0:
case 0xF1:
case 0xF2:
case 0xF3:
case 0xF4:
case 0xF5:
case 0xF6:
case 0xF7:
INST_NAME("FCOMIP ST0, STx");
SETFLAGS(X_ALL, SF_SET);
v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7));
v2 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7));
if(ST_IS_F(0))
{
FCMPS(v1, v2);
} else {
FCMPD(v1, v2);
}
FCOMI(x1, x2);
x87_do_pop(dyn, ninst, x3);
break;
case 0xC8:
case 0xC9:
case 0xCA:
case 0xCB:
case 0xCC:
case 0xCD:
case 0xCE:
case 0xCF:
case 0xD0:
case 0xD1:
case 0xD2:
case 0xD3:
case 0xD4:
case 0xD5:
case 0xD6:
case 0xD7:
case 0xD8:
case 0xD9:
case 0xDA:
case 0xDB:
case 0xDC:
case 0xDD:
case 0xDE:
case 0xDF:
case 0xE1:
case 0xE2:
case 0xE3:
case 0xE4:
case 0xE5:
case 0xE6:
case 0xE7:
case 0xF8:
case 0xF9:
case 0xFA:
case 0xFB:
case 0xFC:
case 0xFD:
case 0xFE:
case 0xFF:
DEFAULT;
break;
default:
switch((nextop>>3)&7) {
case 0:
INST_NAME("FILD ST0, Ew");
v1 = x87_do_push(dyn, ninst, x1, NEON_CACHE_ST_F);
addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xfff<<1, 1, rex, NULL, 0, 0);
LDRSHw_U12(x1, wback, fixedaddress);
if(ST_IS_F(0)) {
SCVTFSw(v1, x1);
} else {
SCVTFDw(v1, x1);
}
break;
case 1:
INST_NAME("FISTTP Ew, ST0");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_F);
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0xfff<<1, 1, rex, NULL, 0, 0);
ed = x1;
s0 = fpu_get_scratch(dyn);
#if 0
// this version needs ARM v8.5, //TODO: add detection of this extension to use it
FRINT32ZD(s0, v1);
// no saturation instruction on Arm, so using NEON
VFCVTZSd(s0, s0);
SQXTN_S_D(s0, s0);
SQXTN_H_S(s0, s0);
VSTR16_U12(s0, wback, fixedaddress);
#else
MRS_fpsr(x5);
BFCw(x5, FPSR_IOC, 1); // reset IOC bit
MSR_fpsr(x5);
if(ST_IS_F(0)) {
VFCVTZSs(s0, v1);
} else {
VFCVTZSd(s0, v1);
SQXTN_S_D(s0, s0);
}
SQXTN_H_S(s0, s0);
VSTR16_U12(s0, wback, fixedaddress);
MRS_fpsr(x5); // get back FPSR to check the IOC bit
TBZ_MARK3(x5, FPSR_IOC);
MOV32w(x5, 0x8000);
STRH_U12(x5, wback, fixedaddress);
MARK3;
#endif
x87_do_pop(dyn, ninst, x3);
break;
case 2:
INST_NAME("FIST Ew, ST0");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_F);
u8 = x87_setround(dyn, ninst, x1, x2, x4);
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0xfff<<1, 1, rex, NULL, 0, 0);
ed = x1;
s0 = fpu_get_scratch(dyn);
#if 0
FRINT32XD(s0, v1);
// no saturation instruction on Arm, so using NEON
VFCVTZSd(s0, s0);
SQXTN_S_D(s0, s0);
SQXTN_H_S(s0, s0);
VSTR16_U12(s0, wback, fixedaddress);
#else
MRS_fpsr(x5);
BFCw(x5, FPSR_IOC, 1); // reset IOC bit
MSR_fpsr(x5);
if(ST_IS_F(0)) {
FRINTXS(s0, v1);
VFCVTZSs(s0, s0);
} else {
FRINTXD(s0, v1);
VFCVTZSd(s0, s0);
SQXTN_S_D(s0, s0);
}
SQXTN_H_S(s0, s0);
VSTR16_U12(s0, wback, fixedaddress);
MRS_fpsr(x5); // get back FPSR to check the IOC bit
TBZ_MARK3(x5, FPSR_IOC);
MOV32w(x5, 0x8000);
STRH_U12(x5, wback, fixedaddress);
MARK3;
#endif
x87_restoreround(dyn, ninst, u8);
break;
case 3:
INST_NAME("FISTP Ew, ST0");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_F);
u8 = x87_setround(dyn, ninst, x1, x2, x4);
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0xfff<<1, 1, rex, NULL, 0, 0);
ed = x1;
s0 = fpu_get_scratch(dyn);
#if 0
FRINT32XD(s0, v1);
// no saturation instruction on Arm, so using NEON
VFCVTZSd(s0, s0);
SQXTN_S_D(s0, s0);
SQXTN_H_S(s0, s0);
VSTR16_U12(s0, wback, fixedaddress);
#else
MRS_fpsr(x5);
BFCw(x5, FPSR_IOC, 1); // reset IOC bit
MSR_fpsr(x5);
if(ST_IS_F(0)) {
FRINTXS(s0, v1);
VFCVTZSs(s0, s0);
} else {
FRINTXD(s0, v1);
VFCVTZSd(s0, s0);
SQXTN_S_D(s0, s0);
}
SQXTN_H_S(s0, s0);
VSTR16_U12(s0, wback, fixedaddress);
MRS_fpsr(x5); // get back FPSR to check the IOC bit
TBZ_MARK3(x5, FPSR_IOC);
MOV32w(x5, 0x8000);
STRH_U12(x5, wback, fixedaddress);
MARK3;
#endif
x87_do_pop(dyn, ninst, x3);
x87_restoreround(dyn, ninst, u8);
break;
case 4:
INST_NAME("FBLD ST0, tbytes");
x87_do_push_empty(dyn, ninst, x1);
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0, 0, rex, NULL, 0, 0);
if(ed!=x1) {MOVx_REG(x1, ed);}
CALL(fpu_fbld, -1);
break;
case 5:
INST_NAME("FILD ST0, i64");
v1 = x87_do_push(dyn, ninst, x1, NEON_CACHE_ST_D);
addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0xfff<<3, 7, rex, NULL, 0, 0);
LDRx_U12(x1, wback, fixedaddress);
SCVTFDx(v1, x1);
break;
case 6:
INST_NAME("FBSTP tbytes, ST0");
x87_forget(dyn, ninst, x1, x2, 0);
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0, 0, rex, NULL, 0, 0);
if(ed!=x1) {MOVx_REG(x1, ed);}
CALL(fpu_fbst, -1);
x87_do_pop(dyn, ninst, x3);
break;
case 7:
INST_NAME("FISTP i64, ST0");
v1 = x87_get_st(dyn, ninst, x1, x2, 0, NEON_CACHE_ST_D);
u8 = x87_setround(dyn, ninst, x1, x2, x4);
addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, 0xfff<<3, 7, rex, NULL, 0, 0);
ed = x1;
s0 = fpu_get_scratch(dyn);
#if 0
FRINT64XD(s0, v1);
VFCVTZSd(s0, s0);
VSTR64_U12(s0, wback, fixedaddress);
#else
MRS_fpsr(x5);
BFCw(x5, FPSR_IOC, 1); // reset IOC bit
MSR_fpsr(x5);
FRINTXD(s0, v1);
VFCVTZSd(s0, s0);
VSTR64_U12(s0, wback, fixedaddress);
MRS_fpsr(x5); // get back FPSR to check the IOC bit
TBZ_MARK3(x5, FPSR_IOC);
ORRx_mask(x5, xZR, 1, 1, 0); //0x8000000000000000
STRx_U12(x5, wback, fixedaddress);
MARK3;
#endif
x87_restoreround(dyn, ninst, u8);
x87_do_pop(dyn, ninst, x3);
break;
default:
DEFAULT;
}
}
return addr;
}
+643
View File
@@ -0,0 +1,643 @@
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <pthread.h>
#include <errno.h>
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
#include "emu/x64run_private.h"
#include "x64trace.h"
#include "dynarec_native.h"
#include "../tools/bridge_private.h"
#include "arm64_printer.h"
#include "dynarec_arm64_private.h"
#include "dynarec_arm64_functions.h"
#include "dynarec_arm64_helper.h"
// emit OR32 instruction, from s1, s2, store result in s1 using s3 and s4 as scratch
void emit_or32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4)
{
MAYUSE(s2);
IFX(X_PEND) {
SET_DF(s4, rex.w?d_or64:d_or32);
} else IFX(X_ALL) {
SET_DFNONE(s4);
}
ORRxw_REG(s1, s1, s2);
IFX(X_PEND) {
STRxw_U12(s1, xEmu, offsetof(x64emu_t, res));
}
IFX(X_CF | X_AF | X_OF) {
MOV32w(s3, (1<<F_CF)|(1<<F_AF)|(1<<F_OF));
BICw(xFlags, xFlags, s3);
}
IFX(X_ZF) {
TSTxw_REG(s1, s1);
CSETw(s3, cEQ);
BFIw(xFlags, s3, F_ZF, 1);
}
IFX(X_SF) {
LSRxw(s3, s1, (rex.w)?63:31);
BFIw(xFlags, s3, F_SF, 1);
}
IFX(X_PF) {
emit_pf(dyn, ninst, s1, s3, s4);
}
}
// emit OR32 instruction, from s1 , constant c, store result in s1 using s3 and s4 as scratch
void emit_or32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int64_t c, int s3, int s4)
{
IFX(X_PEND) {
SET_DF(s4, rex.w?d_or64:d_or32);
} else IFX(X_ALL) {
SET_DFNONE(s4);
}
MOV64xw(s3, c);
ORRxw_REG(s1, s1, s3);
IFX(X_PEND) {
STRxw_U12(s1, xEmu, offsetof(x64emu_t, res));
}
IFX(X_CF | X_AF | X_OF) {
MOV32w(s3, (1<<F_CF)|(1<<F_AF)|(1<<F_OF));
BICw(xFlags, xFlags, s3);
}
IFX(X_ZF) {
TSTxw_REG(s1, s1);
CSETw(s3, cEQ);
BFIw(xFlags, s3, F_ZF, 1);
}
IFX(X_SF) {
LSRxw(s3, s1, (rex.w)?63:31);
BFIw(xFlags, s3, F_SF, 1);
}
IFX(X_PF) {
emit_pf(dyn, ninst, s1, s3, s4);
}
}
// emit XOR32 instruction, from s1, s2, store result in s1 using s3 and s4 as scratch
void emit_xor32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4)
{
MAYUSE(s2);
IFX(X_PEND) {
SET_DF(s4, rex.w?d_xor64:d_xor32);
} else IFX(X_ALL) {
SET_DFNONE(s4);
}
EORxw_REG(s1, s1, s2);
IFX(X_PEND) {
STRxw_U12(s1, xEmu, offsetof(x64emu_t, res));
}
IFX(X_CF | X_AF | X_OF) {
MOV32w(s3, (1<<F_CF)|(1<<F_AF)|(1<<F_OF));
BICw(xFlags, xFlags, s3);
}
IFX(X_ZF) {
TSTxw_REG(s1, s1);
CSETw(s3, cEQ);
BFIw(xFlags, s3, F_ZF, 1);
}
IFX(X_SF) {
LSRxw(s3, s1, (rex.w)?63:31);
BFIw(xFlags, s3, F_SF, 1);
}
IFX(X_PF) {
emit_pf(dyn, ninst, s1, s3, s4);
}
}
// emit XOR32 instruction, from s1 , constant c, store result in s1 using s3 and s4 as scratch
void emit_xor32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int64_t c, int s3, int s4)
{
IFX(X_PEND) {
SET_DF(s4, rex.w?d_xor64:d_xor32);
} else IFX(X_ALL) {
SET_DFNONE(s4);
}
MOV64xw(s3, c);
EORxw_REG(s1, s1, s3);
IFX(X_PEND) {
STRxw_U12(s1, xEmu, offsetof(x64emu_t, res));
}
IFX(X_CF | X_AF | X_OF) {
MOV32w(s3, (1<<F_CF)|(1<<F_AF)|(1<<F_OF));
BICw(xFlags, xFlags, s3);
}
IFX(X_ZF) {
TSTxw_REG(s1, s1);
CSETw(s3, cEQ);
BFIw(xFlags, s3, F_ZF, 1);
}
IFX(X_SF) {
LSRxw(s3, s1, (rex.w)?63:31);
BFIw(xFlags, s3, F_SF, 1);
}
IFX(X_PF) {
emit_pf(dyn, ninst, s1, s3, s4);
}
}
// emit AND32 instruction, from s1, s2, store result in s1 using s3 and s4 as scratch
void emit_and32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4)
{
MAYUSE(s2);
IFX(X_PEND) {
SET_DF(s4, rex.w?d_and64:d_and32);
} else IFX(X_ALL) {
SET_DFNONE(s4);
}
IFX(X_ZF) {
ANDSxw_REG(s1, s1, s2);
} else {
ANDxw_REG(s1, s1, s2);
}
IFX(X_PEND) {
STRxw_U12(s1, xEmu, offsetof(x64emu_t, res));
}
IFX(X_CF | X_AF | X_OF) {
MOV32w(s3, (1<<F_CF)|(1<<F_AF)|(1<<F_OF));
BICw(xFlags, xFlags, s3);
}
IFX(X_ZF) {
CSETw(s3, cEQ);
BFIw(xFlags, s3, F_ZF, 1);
}
IFX(X_SF) {
LSRxw(s3, s1, (rex.w)?63:31);
BFIw(xFlags, s3, F_SF, 1);
}
IFX(X_PF) {
emit_pf(dyn, ninst, s1, s3, s4);
}
}
// emit AND32 instruction, from s1 , constant c, store result in s1 using s3 and s4 as scratch
void emit_and32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int64_t c, int s3, int s4)
{
IFX(X_PEND) {
SET_DF(s4, rex.w?d_and64:d_and32);
} else IFX(X_ALL) {
SET_DFNONE(s4);
}
MOV64xw(s3, c);
IFX(X_ALL) {
ANDSxw_REG(s1, s1, s3);
} else {
ANDxw_REG(s1, s1, s3);
}
IFX(X_PEND) {
STRxw_U12(s1, xEmu, offsetof(x64emu_t, res));
}
IFX(X_CF | X_AF | X_OF) {
MOV32w(s3, (1<<F_CF)|(1<<F_AF)|(1<<F_OF));
BICw(xFlags, xFlags, s3);
}
IFX(X_ZF) {
CSETw(s3, cEQ);
BFIw(xFlags, s3, F_ZF, 1);
}
IFX(X_SF) {
LSRxw(s3, s1, (rex.w)?63:31);
BFIw(xFlags, s3, F_SF, 1);
}
IFX(X_PF) {
emit_pf(dyn, ninst, s1, s3, s4);
}
}
// emit OR8 instruction, from s1, s2, store result in s1 using s3 and s4 as scratch, s4 can be same as s2 (and so s2 destroyed)
void emit_or8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
{
MAYUSE(s2);
IFX(X_PEND) {
SET_DF(s3, d_or8);
} else IFX(X_ALL) {
SET_DFNONE(s3);
}
ORRw_REG(s1, s1, s2);
IFX(X_PEND) {
STRB_U12(s1, xEmu, offsetof(x64emu_t, res));
}
IFX(X_CF | X_AF | X_OF) {
MOV32w(s3, (1<<F_CF)|(1<<F_AF)|(1<<F_OF));
BICw(xFlags, xFlags, s3);
}
IFX(X_ZF) {
TSTw_REG(s1, s1);
CSETw(s3, cEQ);
BFIw(xFlags, s3, F_ZF, 1);
}
IFX(X_SF) {
LSRw(s3, s1, 7);
BFIw(xFlags, s3, F_SF, 1);
}
IFX(X_PF) {
emit_pf(dyn, ninst, s1, s3, s4);
}
}
// emit OR8 instruction, from s1 , constant c, store result in s1 using s3 and s4 as scratch
void emit_or8c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s4)
{
MOV32w(s3, c&0xff);
IFX(X_PEND) {
SET_DF(s4, d_or8);
} else IFX(X_ALL) {
SET_DFNONE(s4);
}
ORRw_REG(s1, s1, s3);
IFX(X_PEND) {
STRB_U12(s1, xEmu, offsetof(x64emu_t, res));
}
IFX(X_CF | X_AF | X_OF) {
MOV32w(s3, (1<<F_CF)|(1<<F_AF)|(1<<F_OF));
BICw(xFlags, xFlags, s3);
}
IFX(X_ZF) {
TSTw_REG(s1, s1);
CSETw(s3, cEQ);
BFIw(xFlags, s3, F_ZF, 1);
}
IFX(X_SF) {
LSRw(s3, s1, 7);
BFIw(xFlags, s3, F_SF, 1);
}
IFX(X_PF) {
emit_pf(dyn, ninst, s1, s3, s4);
}
}
// emit XOR8 instruction, from s1, s2, store result in s1 using s3 and s4 as scratch, s4 can be same as s2 (and so s2 destroyed)
void emit_xor8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
{
MAYUSE(s2);
IFX(X_PEND) {
SET_DF(s3, d_xor8);
} else IFX(X_ALL) {
SET_DFNONE(s3);
}
EORx_REG(s1, s1, s2);
IFX(X_PEND) {
STRB_U12(s1, xEmu, offsetof(x64emu_t, res));
}
IFX(X_CF | X_AF | X_OF) {
MOV32w(s3, (1<<F_CF)|(1<<F_AF)|(1<<F_OF));
BICw(xFlags, xFlags, s3);
}
IFX(X_ZF) {
TSTw_REG(s1, s1);
CSETw(s3, cEQ);
BFIw(xFlags, s3, F_ZF, 1);
}
IFX(X_SF) {
LSRw(s3, s1, 7);
BFIw(xFlags, s3, F_SF, 1);
}
IFX(X_PF) {
emit_pf(dyn, ninst, s1, s3, s4);
}
}
// emit XOR8 instruction, from s1 , constant c, store result in s1 using s3 and s4 as scratch
void emit_xor8c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s4)
{
MOV32w(s3, c&0xff);
IFX(X_PEND) {
SET_DF(s4, d_xor8);
} else IFX(X_ALL) {
SET_DFNONE(s4);
}
EORw_REG(s1, s1, s3);
IFX(X_PEND) {
STRB_U12(s1, xEmu, offsetof(x64emu_t, res));
}
IFX(X_CF | X_AF | X_OF) {
MOV32w(s3, (1<<F_CF)|(1<<F_AF)|(1<<F_OF));
BICw(xFlags, xFlags, s3);
}
IFX(X_ZF) {
TSTw_REG(s1, s1);
CSETw(s3, cEQ);
BFIw(xFlags, s3, F_ZF, 1);
}
IFX(X_SF) {
LSRw(s3, s1, 7);
BFIw(xFlags, s3, F_SF, 1);
}
IFX(X_PF) {
emit_pf(dyn, ninst, s1, s3, s4);
}
}
// emit AND8 instruction, from s1, s2, store result in s1 using s3 and s4 as scratch, s4 can be same as s2 (and so s2 destroyed)
void emit_and8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
{
MAYUSE(s2);
IFX(X_PEND) {
SET_DF(s3, d_and8);
} else IFX(X_ALL) {
SET_DFNONE(s3);
}
IFX(X_ZF) {
ANDSw_REG(s1, s1, s2);
} else {
ANDw_REG(s1, s1, s2);
}
IFX(X_PEND) {
STRB_U12(s1, xEmu, offsetof(x64emu_t, res));
}
IFX(X_CF | X_AF | X_OF) {
MOV32w(s3, (1<<F_CF)|(1<<F_AF)|(1<<F_OF));
BICw_REG(xFlags, xFlags, s3);
}
IFX(X_ZF) {
CSETw(s3, cEQ);
BFIw(xFlags, s3, F_ZF, 1);
}
IFX(X_SF) {
LSRw(s3, s1, 7);
BFIw(xFlags, s3, F_SF, 1);
}
IFX(X_PF) {
emit_pf(dyn, ninst, s1, s3, s4);
}
}
// emit AND8 instruction, from s1 , constant c, store result in s1 using s3 and s4 as scratch
void emit_and8c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s4)
{
MOV32w(s3, c&0xff);
IFX(X_PEND) {
SET_DF(s4, d_and8);
} else IFX(X_ALL) {
SET_DFNONE(s4);
}
IFX(X_ZF) {
ANDSw_REG(s1, s1, s3);
} else {
ANDw_REG(s1, s1, s3);
}
IFX(X_PEND) {
STRB_U12(s1, xEmu, offsetof(x64emu_t, res));
}
IFX(X_CF | X_AF | X_OF) {
MOV32w(s3, (1<<F_CF)|(1<<F_AF)|(1<<F_OF));
BICw(xFlags, xFlags, s3);
}
IFX(X_ZF) {
CSETw(s3, cEQ);
BFIw(xFlags, s3, F_ZF, 1);
}
IFX(X_SF) {
LSRw(s3, s1, 7);
BFIw(xFlags, s3, F_SF, 1);
}
IFX(X_PF) {
emit_pf(dyn, ninst, s1, s3, s4);
}
}
// emit OR16 instruction, from s1, s2, store result in s1 using s3 and s4 as scratch, s4 can be same as s2 (and so s2 destroyed)
void emit_or16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
{
MAYUSE(s2);
IFX(X_PEND) {
SET_DF(s3, d_or16);
} else IFX(X_ALL) {
SET_DFNONE(s3);
}
ORRw_REG(s1, s1, s2);
IFX(X_PEND) {
STRH_U12(s1, xEmu, offsetof(x64emu_t, res));
}
IFX(X_CF | X_AF | X_OF) {
MOV32w(s3, (1<<F_CF)|(1<<F_AF)|(1<<F_OF));
BICw(xFlags, xFlags, s3);
}
IFX(X_ZF) {
ANDSw_mask(s1, s1, 0, 15); //mask=0xffff
CSETw(s3, cEQ);
BFIw(xFlags, s3, F_ZF, 1);
}
IFX(X_SF) {
LSRw(s3, s1, 15);
BFIw(xFlags, s3, F_SF, 1);
}
IFX(X_PF) {
emit_pf(dyn, ninst, s1, s3, s4);
}
}
// emit OR16 instruction, from s1 , constant c, store result in s1 using s3 and s4 as scratch
//void emit_or16c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s4)
//{
// IFX(X_PEND) {
// MOVW(s3, c);
// STR_IMM9(s1, xEmu, offsetof(x64emu_t, op1));
// STR_IMM9(s3, xEmu, offsetof(x64emu_t, op2));
// SET_DF(s4, d_or16);
// } else IFX(X_ALL) {
// SET_DFNONE(s4);
// }
// if(c>=0 && c<256) {
// IFX(X_ALL) {
// ORRS_IMM8(s1, s1, c, 0);
// } else {
// ORR_IMM8(s1, s1, c, 0);
// }
// } else {
// IFX(X_PEND) {} else {MOVW(s3, c);}
// IFX(X_ALL) {
// ORRS_REG_LSL_IMM5(s1, s1, s3, 0);
// } else {
// ORR_REG_LSL_IMM5(s1, s1, s3, 0);
// }
// }
// IFX(X_PEND) {
// STR_IMM9(s1, xEmu, offsetof(x64emu_t, res));
// }
// IFX(X_CF | X_AF | X_ZF) {
// BIC_IMM8(xFlags, xFlags, (1<<F_CF)|(1<<F_AF)|(1<<F_ZF), 0);
// }
// IFX(X_OF) {
// BIC_IMM8(xFlags, xFlags, 0b10, 0x0b);
// }
// IFX(X_ZF) {
// ORR_IMM8_COND(cEQ, xFlags, xFlags, 1<<F_ZF, 0);
// }
// IFX(X_SF) {
// MOV_REG_LSR_IMM5(s3, s1, 15);
// BFI(xFlags, s3, F_SF, 1);
// }
// IFX(X_PF) {
// emit_pf(dyn, ninst, s1, s3, s4);
// }
//}
// emit XOR16 instruction, from s1, s2, store result in s1 using s3 and s4 as scratch, s4 can be same as s2 (and so s2 destroyed)
void emit_xor16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
{
MAYUSE(s2);
IFX(X_PEND) {
SET_DF(s3, d_xor16);
} else IFX(X_ALL) {
SET_DFNONE(s3);
}
EORw_REG(s1, s1, s2);
IFX(X_PEND) {
STRH_U12(s1, xEmu, offsetof(x64emu_t, res));
}
IFX(X_CF | X_AF | X_OF) {
MOV32w(s3, (1<<F_CF)|(1<<F_AF)|(1<<F_OF));
BICw(xFlags, xFlags, s3);
}
IFX(X_ZF) {
ANDSw_mask(s1, s1, 0, 15); //mask=0xffff
CSETw(s3, cEQ);
BFIw(xFlags, s3, F_ZF, 1);
}
IFX(X_SF) {
LSRw(s3, s1, 15);
BFIw(xFlags, s3, F_SF, 1);
}
IFX(X_PF) {
emit_pf(dyn, ninst, s1, s3, s4);
}
}
// emit XOR16 instruction, from s1 , constant c, store result in s1 using s3 and s4 as scratch
//void emit_xor16c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s4)
//{
// IFX(X_PEND) {
// MOVW(s3, c);
// STR_IMM9(s1, xEmu, offsetof(x64emu_t, op1));
// STR_IMM9(s3, xEmu, offsetof(x64emu_t, op2));
// SET_DF(s4, d_xor16);
// } else IFX(X_ALL) {
// SET_DFNONE(s4);
// }
// if(c>=0 && c<256) {
// IFX(X_ALL) {
// XORS_IMM8(s1, s1, c);
// } else {
// XOR_IMM8(s1, s1, c);
// }
// } else {
// IFX(X_PEND) {} else {MOVW(s3, c);}
// IFX(X_ALL) {
// XORS_REG_LSL_IMM5(s1, s1, s3, 0);
// } else {
// XOR_REG_LSL_IMM5(s1, s1, s3, 0);
// }
// }
// IFX(X_PEND) {
// STR_IMM9(s1, xEmu, offsetof(x64emu_t, res));
// }
// IFX(X_CF | X_AF | X_ZF) {
// BIC_IMM8(xFlags, xFlags, (1<<F_CF)|(1<<F_AF)|(1<<F_ZF), 0);
// }
// IFX(X_OF) {
// BIC_IMM8(xFlags, xFlags, 0b10, 0x0b);
// }
// IFX(X_ZF) {
// ORR_IMM8_COND(cEQ, xFlags, xFlags, 1<<F_ZF, 0);
// }
// IFX(X_SF) {
// MOV_REG_LSR_IMM5(s3, s1, 15);
// BFI(xFlags, s3, F_SF, 1);
// }
// IFX(X_PF) {
// emit_pf(dyn, ninst, s1, s3, s4);
// }
//}
// emit AND16 instruction, from s1, s2, store result in s1 using s3 and s4 as scratch, s4 can be same as s2 (and so s2 destroyed)
void emit_and16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
{
MAYUSE(s2);
IFX(X_PEND) {
SET_DF(s3, d_and16);
} else IFX(X_ALL) {
SET_DFNONE(s3);
}
IFX(X_ALL) {
ANDSw_REG(s1, s1, s2);
} else {
ANDw_REG(s1, s1, s2);
}
IFX(X_PEND) {
STRH_U12(s1, xEmu, offsetof(x64emu_t, res));
}
IFX(X_CF | X_AF | X_OF) {
MOV32w(s3, (1<<F_CF)|(1<<F_AF)|(1<<F_OF));
BICw_REG(xFlags, xFlags, s3);
}
IFX(X_ZF) {
CSETw(s3, cEQ);
BFIw(xFlags, s3, F_ZF, 1);
}
IFX(X_SF) {
LSRw(s3, s1, 15);
BFIw(xFlags, s3, F_SF, 1);
}
IFX(X_PF) {
emit_pf(dyn, ninst, s1, s3, s4);
}
}
// emit AND16 instruction, from s1 , constant c, store result in s1 using s3 and s4 as scratch
//void emit_and16c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s4)
//{
// IFX(X_PEND) {
// MOVW(s3, c);
// STR_IMM9(s1, xEmu, offsetof(x64emu_t, op1));
// STR_IMM9(s3, xEmu, offsetof(x64emu_t, op2));
// SET_DF(s4, d_and16);
// } else IFX(X_ALL) {
// SET_DFNONE(s4);
// }
// if(c>=0 && c<256) {
// IFX(X_ALL) {
// ANDS_IMM8(s1, s1, c);
// } else {
// AND_IMM8(s1, s1, c);
// }
// } else {
// IFX(X_PEND) {} else {MOVW(s3, c);}
// IFX(X_ALL) {
// ANDS_REG_LSL_IMM5(s1, s1, s3, 0);
// } else {
// AND_REG_LSL_IMM5(s1, s1, s3, 0);
// }
// }
// IFX(X_PEND) {
// STR_IMM9(s1, xEmu, offsetof(x64emu_t, res));
// }
// IFX(X_CF | X_AF | X_ZF) {
// BIC_IMM8(xFlags, xFlags, (1<<F_CF)|(1<<F_AF)|(1<<F_ZF), 0);
// }
// IFX(X_OF) {
// BIC_IMM8(xFlags, xFlags, 0b10, 0x0b);
// }
// IFX(X_ZF) {
// ORR_IMM8_COND(cEQ, xFlags, xFlags, 1<<F_ZF, 0);
// }
// IFX(X_SF) {
// MOV_REG_LSR_IMM5(s3, s1, 15);
// BFI(xFlags, s3, F_SF, 1);
// }
// IFX(X_PF) {
// emit_pf(dyn, ninst, s1, s3, s4);
// }
//}
File diff suppressed because it is too large. Load diff
+436
View File
@@ -0,0 +1,436 @@
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <pthread.h>
#include <errno.h>
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
#include "emu/x64run_private.h"
#include "x64trace.h"
#include "dynarec_native.h"
#include "../tools/bridge_private.h"
#include "arm64_printer.h"
#include "dynarec_arm64_private.h"
#include "dynarec_arm64_functions.h"
#include "dynarec_arm64_helper.h"
// emit SHL32 instruction, from s1 , shift s2, store result in s1 using s3 and s4 as scratch. s3 can be same as s2
void emit_shl32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4)
{
MAYUSE(s2);
int64_t j64;
MAYUSE(j64);
IFX(X_PEND) {
STRxw_U12(s1, xEmu, offsetof(x64emu_t, op1));
STRxw_U12(s2, xEmu, offsetof(x64emu_t, op2));
SET_DF(s4, rex.w?d_shl64:d_shl32);
} else IFX(X_ALL) {
SET_DFNONE(s4);
}
IFX(X_OF) {
CMPSxw_U12(s2, 0);
Bcond(cNE, +8+((dyn->insts[ninst].x64.gen_flags&X_PEND)?4:0));
BFCw(xFlags, F_OF, 1);
IFX(X_PEND) {
STRxw_U12(s1, xEmu, offsetof(x64emu_t, res));
}
B_NEXT(cEQ);
}
IFX(X_CF | X_OF) {
MOV32w(s4, rex.w?64:32);
SUBxw_REG(s4, s4, s2);
LSRxw_REG(s4, s1, s4);
BFIw(xFlags, s4, F_CF, 1);
}
LSLxw_REG(s1, s1, s2);
IFX(X_PEND) {
STRxw_U12(s1, xEmu, offsetof(x64emu_t, res));
}
IFX(X_ZF) {
TSTxw_REG(s1, s1);
CSETw(s4, cEQ);
BFIw(xFlags, s4, F_ZF, 1);
}
IFX(X_SF) {
LSRxw(s4, s1, (rex.w)?63:31);
BFIx(xFlags, s4, F_SF, 1);
}
IFX(X_OF) {
CMPSxw_U12(s2, 1); // if s2==1
IFX(X_SF) {} else {LSRxw(s4, s1, (rex.w)?63:31);}
EORxw_REG(s4, s4, xFlags); // CF is set if OF is asked
CSELw(s4, s4, wZR, cEQ);
BFIw(xFlags, s4, F_OF, 1);
}
IFX(X_PF) {
emit_pf(dyn, ninst, s1, s3, s4);
}
}
// emit SHL32 instruction, from s1 , constant c, store result in s1 using s3 and s4 as scratch
void emit_shl32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, uint32_t c, int s3, int s4)
{
IFX(X_PEND) {
MOV32w(s3, c);
STRxw_U12(s1, xEmu, offsetof(x64emu_t, op1));
STRxw_U12(s3, xEmu, offsetof(x64emu_t, op2));
SET_DF(s4, rex.w?d_shl64:d_shl32);
} else IFX(X_ALL) {
SET_DFNONE(s4);
}
if(c==0) {
IFX(X_OF) {
BFCw(xFlags, F_OF, 1);
}
IFX(X_PEND) {
STRxw_U12(s1, xEmu, offsetof(x64emu_t, res));
}
return;
}
IFX(X_CF|X_OF) {
LSRxw(s3, s1, (rex.w?64:32)-c);
BFIxw(xFlags, s3, F_CF, 1);
}
LSLxw(s1, s1, c);
IFX(X_PEND) {
STRxw_U12(s1, xEmu, offsetof(x64emu_t, res));
}
IFX(X_ZF) {
TSTxw_REG(s1, s1);
CSETw(s4, cEQ);
BFIw(xFlags, s4, F_ZF, 1);
}
IFX(X_SF) {
LSRxw(s4, s1, (rex.w)?63:31);
BFIx(xFlags, s4, F_SF, 1);
}
IFX(X_OF) {
if(c==1) {
IFX(X_SF) {} else {LSRxw(s4, s1, (rex.w)?63:31);}
EORxw_REG(s4, s4, xFlags); // CF is set if OF is asked
BFIw(xFlags, s4, F_OF, 1);
} else {
BFCw(xFlags, F_OF, 1);
}
}
IFX(X_PF) {
emit_pf(dyn, ninst, s1, s3, s4);
}
}
// emit SHR32 instruction, from s1 , s2, store result in s1 using s3 and s4 as scratch, s2 can be same as s3
void emit_shr32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4)
{
MAYUSE(s2);
int64_t j64;
MAYUSE(j64);
IFX(X_PEND) {
STRxw_U12(s1, xEmu, offsetof(x64emu_t, op1));
STRxw_U12(s2, xEmu, offsetof(x64emu_t, op2));
SET_DF(s4, rex.w?d_shr64:d_shr32);
} else IFX(X_ALL) {
SET_DFNONE(s4);
}
IFX(X_ALL) {
CMPSxw_U12(s2, 0); //if(!c)
IFX(X_PEND) {
Bcond(cNE, +12);
STRxw_U12(s1, xEmu, offsetof(x64emu_t, res));
}
B_NEXT(cEQ);
}
IFX(X_CF) {
SUBxw_U12(s3, s2, 1);
LSRxw_REG(s3, s1, s3);
BFIw(xFlags, s3, 0, 1);
}
LSRxw_REG(s1, s1, s2);
IFX(X_PEND) {
STRxw_U12(s1, xEmu, offsetof(x64emu_t, res));
}
IFX(X_ZF) {
TSTxw_REG(s1, s1);
CSETw(s4, cEQ);
BFIw(xFlags, s4, F_ZF, 1);
}
IFX(X_SF) {
LSRxw(s4, s1, (rex.w)?63:31);
BFIx(xFlags, s4, F_SF, 1);
}
IFX(X_OF) {
CMPSxw_U12(s2, 1); // if s2==1
Bcond(cNE, 4+3*4);
LSRxw(s4, s1, rex.w?62:30);
EORw_REG_LSR(s4, s4, s4, 1);
BFIw(xFlags, s4, F_OF, 1);
}
IFX(X_PF) {
emit_pf(dyn, ninst, s1, s3, s4);
}
}
// emit SHR32 instruction, from s1 , constant c, store result in s1 using s3 and s4 as scratch
void emit_shr32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, uint32_t c, int s3, int s4)
{
IFX(X_PEND) {
MOV32w(s3, c);
STRxw_U12(s1, xEmu, offsetof(x64emu_t, op1));
STRxw_U12(s3, xEmu, offsetof(x64emu_t, op2));
SET_DF(s4, rex.w?d_shr64:d_shr32);
} else IFX(X_ALL) {
SET_DFNONE(s4);
}
if(!c) {
IFX(X_PEND) {
STRxw_U12(s1, xEmu, offsetof(x64emu_t, res));
}
return;
}
IFX(X_CF) {
LSRxw(s3, s1, c-1);
BFIw(xFlags, s3, 0, 1);
}
LSRxw(s1, s1, c);
IFX(X_PEND) {
STRxw_U12(s1, xEmu, offsetof(x64emu_t, res));
}
IFX(X_ZF) {
TSTxw_REG(s1, s1);
CSETw(s4, cEQ);
BFIw(xFlags, s4, F_ZF, 1);
}
IFX(X_SF) {
LSRxw(s4, s1, (rex.w)?63:31);
BFIx(xFlags, s4, F_SF, 1);
}
IFX(X_OF) {
if(c==1) {
LSRxw(s4, s1, rex.w?62:30);
EORw_REG_LSR(s4, s4, s4, 1);
BFIw(xFlags, s4, F_OF, 1);
}
}
IFX(X_PF) {
emit_pf(dyn, ninst, s1, s3, s4);
}
}
// emit SAR32 instruction, from s1 , constant c, store result in s1 using s3 and s4 as scratch
void emit_sar32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, uint32_t c, int s3, int s4)
{
IFX(X_PEND) {
MOV32w(s3, c);
STRxw_U12(s1, xEmu, offsetof(x64emu_t, op1));
STRxw_U12(s3, xEmu, offsetof(x64emu_t, op2));
SET_DF(s4, rex.w?d_sar64:d_sar32);
} else IFX(X_ALL) {
SET_DFNONE(s4);
}
if(!c) {
IFX(X_PEND) {
STRxw_U12(s1, xEmu, offsetof(x64emu_t, res));
}
return;
}
IFX(X_CF) {
ASRxw(s3, s1, c-1);
BFIw(xFlags, s3, 0, 1);
}
ASRxw(s1, s1, c);
IFX(X_PEND) {
STRxw_U12(s1, xEmu, offsetof(x64emu_t, res));
}
IFX(X_ZF) {
TSTw_REG(s1, s1);
CSETw(s4, cEQ);
BFIw(xFlags, s4, F_ZF, 1);
}
IFX(X_SF) {
LSRxw(s4, s1, (rex.w)?63:31);
BFIx(xFlags, s4, F_SF, 1);
}
IFX(X_PF) {
emit_pf(dyn, ninst, s1, s3, s4);
}
}
// emit ROL32 instruction, from s1 , constant c, store result in s1 using s3 and s4 as scratch
void emit_rol32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, uint32_t c, int s3, int s4)
{
MAYUSE(rex); MAYUSE(s1); MAYUSE(s3); MAYUSE(s4);
IFX(X_PEND) {
MOV32w(s3, c);
STRxw_U12(s3, xEmu, offsetof(x64emu_t, op2));
SET_DF(s4, rex.w?d_rol64:d_rol32);
} else IFX(X_ALL) {
SET_DFNONE(s4);
}
if(!c) {
IFX(X_PEND) {
STRxw_U12(s1, xEmu, offsetof(x64emu_t, res));
}
return;
}
RORxw(s1, s1, (rex.w?64:32)-c);
IFX(X_PEND) {
STRxw_U12(s1, xEmu, offsetof(x64emu_t, res));
}
IFX(X_CF) {
BFIw(xFlags, s1, F_CF, 1);
}
IFX(X_OF) {
if(c==1) {
ADDxw_REG_LSR(s3, s1, s1, rex.w?63:31);
BFIw(xFlags, s3, F_OF, 1);
}
}
}
// emit ROR32 instruction, from s1 , constant c, store result in s1 using s3 and s4 as scratch
void emit_ror32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, uint32_t c, int s3, int s4)
{
MAYUSE(s1); MAYUSE(s3); MAYUSE(s4);
IFX(X_PEND) {
MOV32w(s3, c);
STRxw_U12(s3, xEmu, offsetof(x64emu_t, op2));
SET_DF(s4, rex.w?d_ror64:d_ror32);
} else IFX(X_ALL) {
SET_DFNONE(s4);
}
if(!c) {
IFX(X_PEND) {
STRxw_U12(s1, xEmu, offsetof(x64emu_t, res));
}
return;
}
RORxw(s1, s1, c);
IFX(X_PEND) {
STRxw_U12(s1, xEmu, offsetof(x64emu_t, res));
}
IFX(X_CF) {
LSRxw(s3, s1, rex.w?63:31);
BFIw(xFlags, s3, F_CF, 1);
}
IFX(X_OF) {
if(c==1) {
LSRxw(s3, s1, rex.w?62:30);
EORxw_REG_LSR(s3, s3, s3, 1);
BFIw(xFlags, s4, F_OF, 1);
}
}
}
// emit SHRD32 instruction, from s1, fill s2 , constant c, store result in s1 using s3 and s4 as scratch
void emit_shrd32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, uint32_t c, int s3, int s4)
{
c&=(rex.w?0x3f:0x1f);
IFX(X_PEND) {
MOV32w(s3, c);
STRxw_U12(s1, xEmu, offsetof(x64emu_t, op1));
STRxw_U12(s3, xEmu, offsetof(x64emu_t, op2));
// same flags computation as with shl64/shl32
SET_DF(s4, rex.w?d_shl64:d_shl32);
} else IFX(X_ALL) {
SET_DFNONE(s4);
}
if(!c) {
IFX(X_PEND) {
STRxw_U12(s1, xEmu, offsetof(x64emu_t, res));
}
return;
}
IFX(X_CF) {
LSRxw(s3, s1, c-1);
BFIw(xFlags, s3, 0, 1);
}
LSRxw(s3, s1, c);
ORRxw_REG_LSL(s1, s3, s2, (rex.w?64:32)-c);
IFX(X_PEND) {
STRxw_U12(s1, xEmu, offsetof(x64emu_t, res));
}
IFX(X_ZF) {
TSTxw_REG(s1, s1);
CSETw(s4, cEQ);
BFIw(xFlags, s4, F_ZF, 1);
}
IFX(X_SF) {
LSRxw(s4, s1, (rex.w)?63:31);
BFIx(xFlags, s4, F_SF, 1);
}
IFX(X_OF) {
if(c==1) {
LSRxw(s4, s1, rex.w?62:30);
EORw_REG_LSR(s4, s4, s4, 1);
BFIw(xFlags, s4, F_OF, 1);
}
}
IFX(X_PF) {
emit_pf(dyn, ninst, s1, s3, s4);
}
}
void emit_shld32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, uint32_t c, int s3, int s4)
{
c&=(rex.w?0x3f:0x1f);
IFX(X_PEND) {
MOV32w(s3, c);
STRxw_U12(s1, xEmu, offsetof(x64emu_t, op1));
STRxw_U12(s3, xEmu, offsetof(x64emu_t, op2));
// same flags computation as with shl64/shl32
SET_DF(s4, rex.w?d_shl64:d_shl32);
} else IFX(X_ALL) {
SET_DFNONE(s4);
}
if(c==0) {
IFX(X_OF) {
BFCw(xFlags, F_OF, 1);
}
IFX(X_PEND) {
STRxw_U12(s1, xEmu, offsetof(x64emu_t, res));
}
return;
}
IFX(X_CF|X_OF) {
LSRxw(s3, s1, (rex.w?64:32)-c);
BFIxw(xFlags, s3, F_CF, 1);
}
LSLxw(s3, s1, c);
ORRxw_REG_LSR(s1, s3, s2, (rex.w?64:32)-c);
IFX(X_PEND) {
STRxw_U12(s1, xEmu, offsetof(x64emu_t, res));
}
IFX(X_ZF) {
TSTxw_REG(s1, s1);
CSETw(s4, cEQ);
BFIw(xFlags, s4, F_ZF, 1);
}
IFX(X_SF) {
LSRxw(s4, s1, (rex.w)?63:31);
BFIx(xFlags, s4, F_SF, 1);
}
IFX(X_OF) {
if(c==1) {
UBFXxw(s3, s1, rex.w?63:31, 1);
EORxw_REG(s3, s3, xFlags); // CF is set if OF is asked
BFIw(xFlags, s3, F_OF, 1);
} else {
BFCw(xFlags, F_OF, 1);
}
}
IFX(X_PF) {
emit_pf(dyn, ninst, s1, s3, s4);
}
}
+368
View File
@@ -0,0 +1,368 @@
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <pthread.h>
#include <errno.h>
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
#include "emu/x64run_private.h"
#include "x64trace.h"
#include "dynarec_native.h"
#include "../tools/bridge_private.h"
#include "arm64_printer.h"
#include "dynarec_arm64_private.h"
#include "dynarec_arm64_functions.h"
#include "dynarec_arm64_helper.h"
// emit CMP32 instruction, from cmp s1, s2, using s3 and s4 as scratch
void emit_cmp32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4, int s5)
{
MAYUSE(s1); MAYUSE(s2);
IFX_PENDOR0 {
STRxw_U12(s1, xEmu, offsetof(x64emu_t, op1));
STRxw_U12(s2, xEmu, offsetof(x64emu_t, op2));
SET_DF(s4, rex.w?d_cmp64:d_cmp32);
} else {
SET_DFNONE(s4);
}
IFX(X_AF) {
ORNxw_REG(s3, s2, s1); // s3 = ~op1 | op2
BICxw(s4, s2, s1); // s4 = ~op1 & op2
}
SUBSxw_REG(s5, s1, s2); // res = s1 - s2
IFX_PENDOR0 {
STRxw_U12(s5, xEmu, offsetof(x64emu_t, res));
}
IFX(X_AF) {
ANDxw_REG(s3, s3, s5); // s3 = (~op1 | op2) & res
ORRxw_REG(s3, s3, s4); // s3 = (~op1 & op2) | ((~op1 | op2) & res)
LSRxw(s4, s3, 3);
BFIx(xFlags, s4, F_AF, 1); // AF: bc & 0x08
}
IFX(X_ZF) {
CSETw(s4, cEQ);
BFIw(xFlags, s4, F_ZF, 1);
}
IFX(X_CF) {
// inverted carry
CSETw(s4, cCC);
BFIw(xFlags, s4, F_CF, 1);
}
IFX(X_OF) {
CSETw(s4, cVS);
BFIw(xFlags, s4, F_OF, 1);
}
IFX(X_SF) {
LSRxw(s3, s5, (rex.w)?63:31);
BFIw(xFlags, s3, F_SF, 1);
}
IFX(X_PF) {
emit_pf(dyn, ninst, s5, s3, s4);
}
}
// emit CMP32 instruction, from cmp s1 , 0, using s3 and s4 as scratch
void emit_cmp32_0(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s3, int s4)
{
IFX_PENDOR0 {
MOV64xw(s4, 0);
STRxw_U12(s1, xEmu, offsetof(x64emu_t, op1));
STRxw_U12(s4, xEmu, offsetof(x64emu_t, op2));
STRxw_U12(s1, xEmu, offsetof(x64emu_t, res));
SET_DF(s4, rex.w?d_cmp64:d_cmp32);
} else {
SET_DFNONE(s4);
}
SUBSxw_U12(s3, s1, 0); // res = s1 - 0
// and now the tricky ones (and mostly unused), PF and AF
// bc = (res & (~d | s)) | (~d & s) => is 0 here...
IFX(X_OF|X_AF|X_CF) {
MOV32w(s4, (1<<F_OF)|(1<<F_AF)|(1<<F_CF));
BICw(xFlags, xFlags, s4);
}
IFX(X_ZF) {
CSETw(s4, cEQ);
BFIw(xFlags, s4, F_ZF, 1);
}
IFX(X_SF) {
LSRxw(s3, s1, (rex.w)?63:31);
BFIw(xFlags, s3, F_SF, 1);
}
IFX(X_PF) {
emit_pf(dyn, ninst, s1, s3, s4);
}
}
// emit CMP16 instruction, from cmp s1, s2, using s3 and s4 as scratch
void emit_cmp16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5)
{
MAYUSE(s1); MAYUSE(s2);
IFX_PENDOR0 {
STRH_U12(s1, xEmu, offsetof(x64emu_t, op1));
STRH_U12(s2, xEmu, offsetof(x64emu_t, op2));
SET_DF(s3, d_cmp16);
} else {
SET_DFNONE(s3);
}
IFX(X_ZF) {
SUBSw_REG(s5, s1, s2); // res = s1 - s2
} else {
SUBw_REG(s5, s1, s2); // res = s1 - s2
}
IFX_PENDOR0 {
STRH_U12(s5, xEmu, offsetof(x64emu_t, res));
}
IFX(X_ZF) {
CSETw(s3, cEQ);
BFIw(xFlags, s3, F_ZF, 1);
}
IFX(X_SF) {
LSRw(s4, s5, 15);
BFIw(xFlags, s4, F_SF, 1);
}
// bc = (res & (~d | s)) | (~d & s)
IFX(X_CF|X_AF|X_OF) {
MVNw_REG(s4, s1); // s4 = ~d
ORRw_REG(s4, s4, s2); // s4 = ~d | s
ANDw_REG(s4, s4, s5); // s4 = res & (~d | s)
BICw_REG(s3, s2, s1); // s3 = s & ~d
ORRw_REG(s3, s4, s3); // s3 = (res & (~d | s)) | (s & ~d)
IFX(X_CF) {
LSRw(s4, s3, 15);
BFIw(xFlags, s4, F_CF, 1); // CF : bc & 0x8000
}
IFX(X_AF) {
LSRw(s4, s3, 3);
BFIw(xFlags, s4, F_AF, 1); // AF: bc & 0x08
}
IFX(X_OF) {
LSRw(s4, s3, 14);
EORw_REG_LSR(s4, s4, s4, 1);
BFIw(xFlags, s4, F_OF, 1); // OF: ((bc >> 14) ^ ((bc>>14)>>1)) & 1
}
}
IFX(X_PF) {
emit_pf(dyn, ninst, s5, s3, s4);
}
}
// emit CMP16 instruction, from cmp s1 , #0, using s3 and s4 as scratch
void emit_cmp16_0(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4)
{
IFX_PENDOR0 {
MOV32w(s3, 0);
STRH_U12(s1, xEmu, offsetof(x64emu_t, op1));
STRH_U12(s3, xEmu, offsetof(x64emu_t, op2));
STRH_U12(s1, xEmu, offsetof(x64emu_t, res));
SET_DF(s3, d_cmp16);
} else {
SET_DFNONE(s3);
}
// bc = (res & (~d | s)) | (~d & s) = 0
IFX(X_CF | X_AF | X_OF) {
MOV32w(s3, (1<<F_CF)|(1<<F_AF)|(1<<F_OF));
BICw(xFlags, xFlags, s3);
}
IFX(X_ZF) {
ANDSw_mask(s1, s1, 0, 15); //mask=0xffff
CSETw(s3, cEQ);
BFIw(xFlags, s3, F_ZF, 1);
}
IFX(X_SF) {
LSRw(s4, s1, 15);
BFIw(xFlags, s4, F_SF, 1);
}
IFX(X_PF) {
emit_pf(dyn, ninst, s1, s3, s4);
}
}
// emit CMP8 instruction, from cmp s1, s2, using s3 and s4 as scratch
void emit_cmp8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5)
{
MAYUSE(s1); MAYUSE(s2);
IFX_PENDOR0 {
STRB_U12(s1, xEmu, offsetof(x64emu_t, op1));
STRB_U12(s2, xEmu, offsetof(x64emu_t, op2));
SET_DF(s4, d_cmp8);
} else {
SET_DFNONE(s4);
}
IFX(X_ZF) {
SUBSw_REG(s5, s1, s2); // res = s1 - s2
} else {
SUBw_REG(s5, s1, s2); // res = s1 - s2
}
IFX_PENDOR0 {
STRB_U12(s5, xEmu, offsetof(x64emu_t, res));
}
IFX(X_ZF) {
CSETw(s3, cEQ);
BFIw(xFlags, s3, F_ZF, 1);
}
IFX(X_SF) {
LSRw(s3, s5, 7);
BFIw(xFlags, s3, F_SF, 1);
}
// bc = (res & (~d | s)) | (~d & s)
IFX(X_CF|X_AF|X_OF) {
ORNw_REG(s4, s2, s1); // s4 = ~d | s
ANDw_REG(s4, s4, s5); // s4 = res & (~d | s)
BICw_REG(s3, s2, s1); // s3 = s & ~d
ORRw_REG(s3, s4, s3); // s3 = (res & (~d | s)) | (s & ~d)
IFX(X_CF) {
LSRw(s4, s3, 7);
BFIw(xFlags, s4, F_CF, 1); // CF : bc & 0x80
}
IFX(X_AF) {
LSRw(s4, s3, 3);
BFIw(xFlags, s4, F_AF, 1); // AF: bc & 0x08
}
IFX(X_OF) {
LSRw(s4, s3, 6);
EORw_REG_LSR(s4, s4, s4, 1);
BFIw(xFlags, s4, F_OF, 1); // OF: ((bc >> 6) ^ ((bc>>6)>>1)) & 1
}
}
IFX(X_PF) {
emit_pf(dyn, ninst, s5, s3, s4);
}
}
// emit CMP8 instruction, from cmp s1 , 0, using s3 and s4 as scratch
void emit_cmp8_0(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4)
{
IFX_PENDOR0 {
STRB_U12(s1, xEmu, offsetof(x64emu_t, op1));
MOV32w(s4, 0);
STRB_U12(s4, xEmu, offsetof(x64emu_t, op2));
STRB_U12(s1, xEmu, offsetof(x64emu_t, res));
SET_DF(s3, d_cmp8);
} else {
SET_DFNONE(s4);
}
// bc = (res & (~d | s)) | (~d & s) = 0
IFX(X_CF | X_AF | X_OF) {
MOV32w(s3, (1<<F_CF)|(1<<F_AF)|(1<<F_OF));
BICw(xFlags, xFlags, s3);
}
IFX(X_ZF) {
ANDSw_mask(s1, s1, 0, 0b000111); //mask=000000ff
CSETw(s3, cEQ);
BFIw(xFlags, s3, F_ZF, 1);
}
IFX(X_SF) {
LSRw(s3, s1, 7);
BFIw(xFlags, s3, F_SF, 1);
}
IFX(X_PF) {
emit_pf(dyn, ninst, s1, s3, s4);
}
}
// emit TEST32 instruction, from test s1, s2, using s3 and s4 as scratch
void emit_test32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4)
{
MAYUSE(s1); MAYUSE(s2); MAYUSE(s3); MAYUSE(s4);
IFX_PENDOR0 {
SET_DF(s3, rex.w?d_tst64:d_tst32);
} else {
SET_DFNONE(s4);
}
IFX(X_CF | X_AF | X_OF) {
MOV32w(s3, (1<<F_CF)|(1<<F_AF)|(1<<F_OF));
BICw(xFlags, xFlags, s3);
}
ANDSxw_REG(s3, s1, s2); // res = s1 & s2
IFX_PENDOR0 {
STRxw_U12(s3, xEmu, offsetof(x64emu_t, res));
}
IFX(X_ZF) {
CSETw(s4, cEQ);
BFIw(xFlags, s4, F_ZF, 1);
}
IFX(X_SF) {
LSRxw(s4, s3, rex.w?63:31);
BFIw(xFlags, s4, F_SF, 1);
}
// PF: (((emu->x64emu_parity_tab[(res) / 32] >> ((res) % 32)) & 1) == 0)
IFX(X_PF) {
ANDw_mask(s3, s3, 0b011011, 0b000010); // 0xE0
LSRw(s3, s3, 5);
MOV64x(s4, (uintptr_t)GetParityTab());
LDRw_REG_LSL2(s4, s4, s3);
ANDw_mask(s3, s1, 0, 0b000100); // 0x1f
LSRw_REG(s4, s4, s3);
MVNx_REG(s4, s4);
BFIw(xFlags, s4, F_PF, 1);
}
}
// emit TEST16 instruction, from test s1, s2, using s3 and s4 as scratch
void emit_test16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5)
{
MAYUSE(s1); MAYUSE(s2);
IFX_PENDOR0 {
SET_DF(s3, d_tst16);
} else {
SET_DFNONE(s4);
}
IFX(X_CF | X_AF | X_OF) {
MOV32w(s3, (1<<F_CF)|(1<<F_AF)|(1<<F_OF));
BICw(xFlags, xFlags, s3);
}
ANDSw_REG(s5, s1, s2); // res = s1 & s2
IFX_PENDOR0 {
STRH_U12(s5, xEmu, offsetof(x64emu_t, res));
}
IFX(X_ZF) {
CSETw(s4, cEQ);
BFIw(xFlags, s4, F_ZF, 1);
}
IFX(X_SF) {
LSRw(s4, s5, 15);
BFIw(xFlags, s4, F_SF, 1);
}
// PF: (((emu->x64emu_parity_tab[(res) / 32] >> ((res) % 32)) & 1) == 0)
IFX(X_PF) {
emit_pf(dyn, ninst, s5, s3, s4);
}
}
// emit TEST8 instruction, from test s1, s2, using s3 and s4 as scratch
void emit_test8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5)
{
MAYUSE(s1); MAYUSE(s2);
IFX_PENDOR0 {
SET_DF(s3, d_tst8);
} else {
SET_DFNONE(s4);
}
IFX(X_CF | X_AF | X_OF) {
MOV32w(s3, (1<<F_CF)|(1<<F_AF)|(1<<F_OF));
BICw(xFlags, xFlags, s3);
}
ANDSw_REG(s5, s1, s2); // res = s1 & s2
IFX_PENDOR0 {
STRB_U12(s5, xEmu, offsetof(x64emu_t, res));
}
IFX(X_ZF) {
CSETw(s4, cEQ);
BFIw(xFlags, s4, F_ZF, 1);
}
IFX(X_SF) {
LSRw(s4, s5, 7);
BFIw(xFlags, s4, F_SF, 1);
}
// PF: (((emu->x64emu_parity_tab[(res) / 32] >> ((res) % 32)) & 1) == 0)
IFX(X_PF) {
emit_pf(dyn, ninst, s5, s3, s4);
}
}
File diff suppressed because it is too large. Load diff
+417
View File
@@ -0,0 +1,417 @@
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <pthread.h>
#include <errno.h>
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
#include "emu/x64run_private.h"
#include "x64trace.h"
#include "dynarec_native.h"
#include "arm64_printer.h"
#include "dynarec_arm64_private.h"
#include "dynarec_arm64_functions.h"
#include "dynarec_arm64_helper.h"
uintptr_t dynarec64_F20F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog)
{
(void)ip; (void)need_epilog;
uint8_t opcode = F8;
uint8_t nextop;
uint8_t gd, ed;
uint8_t wback;
uint8_t u8;
uint64_t u64, j64;
int v0, v1;
int q0;
int d0, d1;
int64_t fixedaddress;
MAYUSE(d0);
MAYUSE(d1);
MAYUSE(q0);
MAYUSE(v0);
MAYUSE(v1);
switch(opcode) {
case 0x10:
INST_NAME("MOVSD Gx, Ex");
nextop = F8;
GETG;
if(MODREG) {
ed = (nextop&7)+ (rex.b<<3);
v0 = sse_get_reg(dyn, ninst, x1, gd, 1);
d0 = sse_get_reg(dyn, ninst, x1, ed, 0);
VMOVeD(v0, 0, d0, 0);
} else {
SMREAD();
v0 = sse_get_reg_empty(dyn, ninst, x1, gd);
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<3, 7, rex, NULL, 0, 0);
VLDR64_U12(v0, ed, fixedaddress); // upper part reseted
}
break;
case 0x11:
INST_NAME("MOVSD Ex, Gx");
nextop = F8;
GETG;
v0 = sse_get_reg(dyn, ninst, x1, gd, 0);
if(MODREG) {
ed = (nextop&7)+ (rex.b<<3);
d0 = sse_get_reg(dyn, ninst, x1, ed, 1);
VMOVeD(d0, 0, v0, 0);
} else {
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<3, 7, rex, NULL, 0, 0);
VSTR64_U12(v0, ed, fixedaddress);
SMWRITE2();
}
break;
case 0x12:
INST_NAME("MOVDDUP Gx, Ex");
nextop = F8;
GETG;
if(MODREG) {
d0 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0);
v0 = sse_get_reg_empty(dyn, ninst, x1, gd);
VMOVeD(v0, 0, d0, 0);
} else {
SMREAD();
v0 = sse_get_reg_empty(dyn, ninst, x1, gd);
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<3, 7, rex, NULL, 0, 0);
VLDR64_U12(v0, ed, fixedaddress);
}
VMOVeD(v0, 1, v0, 0);
break;
case 0x2A:
INST_NAME("CVTSI2SD Gx, Ed");
nextop = F8;
GETGX(v0, 1);
GETED(0);
d1 = fpu_get_scratch(dyn);
if(rex.w) {
SCVTFDx(d1, ed);
} else {
SCVTFDw(d1, ed);
}
VMOVeD(v0, 0, d1, 0);
break;
case 0x2C:
INST_NAME("CVTTSD2SI Gd, Ex");
nextop = F8;
GETGD;
GETEXSD(q0, 0, 0);
if(!box64_dynarec_fastround) {
MRS_fpsr(x5);
BFCw(x5, FPSR_IOC, 1); // reset IOC bit
MSR_fpsr(x5);
}
FCVTZSxwD(gd, q0);
if(!box64_dynarec_fastround) {
MRS_fpsr(x5); // get back FPSR to check the IOC bit
TBZ_NEXT(x5, FPSR_IOC);
if(rex.w) {
ORRx_mask(gd, xZR, 1, 1, 0); //0x8000000000000000
} else {
MOV32w(gd, 0x80000000);
}
}
break;
case 0x2D:
INST_NAME("CVTSD2SI Gd, Ex");
nextop = F8;
GETGD;
GETEXSD(q0, 0, 0);
if(!box64_dynarec_fastround) {
MRS_fpsr(x5);
BFCw(x5, FPSR_IOC, 1); // reset IOC bit
MSR_fpsr(x5);
}
u8 = sse_setround(dyn, ninst, x1, x2, x3);
d1 = fpu_get_scratch(dyn);
FRINTID(d1, q0);
x87_restoreround(dyn, ninst, u8);
FCVTZSxwD(gd, d1);
if(!box64_dynarec_fastround) {
MRS_fpsr(x5); // get back FPSR to check the IOC bit
TBZ_NEXT(x5, FPSR_IOC);
if(rex.w) {
ORRx_mask(gd, xZR, 1, 1, 0); //0x8000000000000000
} else {
MOV32w(gd, 0x80000000);
}
}
break;
case 0x51:
INST_NAME("SQRTSD Gx, Ex");
nextop = F8;
GETGX(v0, 1);
d1 = fpu_get_scratch(dyn);
GETEXSD(d0, 0, 0);
if(!box64_dynarec_fastnan) {
v1 = fpu_get_scratch(dyn);
FCMLTD_0(v1, d0);
SHL_64(v1, v1, 63);
FSQRTD(d1, d0);
VORR(d1, d1, v1);
} else {
FSQRTD(d1, d0);
}
VMOVeD(v0, 0, d1, 0);
break;
case 0x58:
INST_NAME("ADDSD Gx, Ex");
nextop = F8;
GETGX(d1, 1);
v1 = fpu_get_scratch(dyn);
GETEXSD(d0, 0, 0);
if(!box64_dynarec_fastnan) {
v0 = fpu_get_scratch(dyn);
q0 = fpu_get_scratch(dyn);
// check if any input value was NAN
FMAXD(v0, d0, d1); // propagate NAN
FCMEQD(v0, v0, v0); // 0 if NAN, 1 if not NAN
FADDD(v1, d1, d0); // the high part of the vector is erased...
FCMEQD(q0, v1, v1); // 0 => out is NAN
VBIC(q0, v0, q0); // forget it in any input was a NAN already
SHL_64(q0, q0, 63); // only keep the sign bit
VORR(v1, v1, q0); // NAN -> -NAN
} else {
FADDD(v1, d1, d0); // the high part of the vector is erased...
}
VMOVeD(d1, 0, v1, 0);
break;
case 0x59:
INST_NAME("MULSD Gx, Ex");
nextop = F8;
GETGX(d1, 1);
v1 = fpu_get_scratch(dyn);
GETEXSD(d0, 0, 0);
if(!box64_dynarec_fastnan) {
v0 = fpu_get_scratch(dyn);
q0 = fpu_get_scratch(dyn);
// check if any input value was NAN
FMAXD(v0, d0, d1); // propagate NAN
FCMEQD(v0, v0, v0); // 0 if NAN, 1 if not NAN
FMULD(v1, d1, d0);
FCMEQD(q0, v1, v1); // 0 => out is NAN
VBIC(q0, v0, q0); // forget it in any input was a NAN already
SHL_64(q0, q0, 63); // only keep the sign bit
VORR(v1, v1, q0); // NAN -> -NAN
} else {
FMULD(v1, d1, d0);
}
VMOVeD(d1, 0, v1, 0);
break;
case 0x5A:
INST_NAME("CVTSD2SS Gx, Ex");
nextop = F8;
GETGX(v0, 1);
GETEXSD(d0, 0, 0);
d1 = fpu_get_scratch(dyn);
FCVT_S_D(d1, d0);
VMOVeS(v0, 0, d1, 0);
break;
case 0x5C:
INST_NAME("SUBSD Gx, Ex");
nextop = F8;
GETGX(d1, 1);
v1 = fpu_get_scratch(dyn);
GETEXSD(d0, 0, 0);
if(!box64_dynarec_fastnan) {
v0 = fpu_get_scratch(dyn);
q0 = fpu_get_scratch(dyn);
// check if any input value was NAN
FMAXD(v0, d0, d1); // propagate NAN
FCMEQD(v0, v0, v0); // 0 if NAN, 1 if not NAN
FSUBD(v1, d1, d0);
FCMEQD(q0, v1, v1); // 0 => out is NAN
VBIC(q0, v0, q0); // forget it in any input was a NAN already
SHL_64(q0, q0, 63); // only keep the sign bit
VORR(v1, v1, q0); // NAN -> -NAN
} else {
FSUBD(v1, d1, d0);
}
VMOVeD(d1, 0, v1, 0);
break;
case 0x5D:
INST_NAME("MINSD Gx, Ex");
nextop = F8;
GETGX(v0, 1);
GETEXSD(v1, 0, 0);
// MINSD: if any input is NaN, or Ex[0]<Gx[0], copy Ex[0] -> Gx[0]
#if 0
d0 = fpu_get_scratch(dyn);
FMINNMD(d0, v0, v1); // NaN handling may be slightly different, is that a problem?
VMOVeD(v0, 0, d0, 0); // to not erase uper part
#else
FCMPD(v0, v1);
B_NEXT(cLS); //Less than or equal
VMOVeD(v0, 0, v1, 0); // to not erase uper part
#endif
break;
case 0x5E:
INST_NAME("DIVSD Gx, Ex");
nextop = F8;
GETGX(v0, 1);
d1 = fpu_get_scratch(dyn);
GETEXSD(v1, 0, 0);
if(!box64_dynarec_fastnan) {
d0 = fpu_get_scratch(dyn);
q0 = fpu_get_scratch(dyn);
// check if any input value was NAN
FMAXD(d0, v0, v1); // propagate NAN
FCMEQD(d0, d0, d0); // 0 if NAN, 1 if not NAN
FDIVD(d1, v0, v1);
FCMEQD(q0, d1, d1); // 0 => out is NAN
VBIC(q0, d0, q0); // forget it in any input was a NAN already
SHL_64(q0, q0, 63); // only keep the sign bit
VORR(d1, d1, q0); // NAN -> -NAN
} else {
FDIVD(d1, v0, v1);
}
VMOVeD(v0, 0, d1, 0);
break;
case 0x5F:
INST_NAME("MAXSD Gx, Ex");
nextop = F8;
GETGX(v0, 1);
GETEXSD(v1, 0, 0);
// MAXSD: if any input is NaN, or Ex[0]>Gx[0], copy Ex[0] -> Gx[0]
#if 0
d0 = fpu_get_scratch(dyn);
FMAXNMD(d0, v0, v1); // NaN handling may be slightly different, is that a problem?
VMOVeD(v0, 0, d0, 0); // to not erase uper part
#else
FCMPD(v0, v1);
B_NEXT(cGE); //Greater than or equal
VMOVeD(v0, 0, v1, 0); // to not erase uper part
#endif
break;
case 0x70:
INST_NAME("PSHUFLW Gx, Ex, Ib");
nextop = F8;
GETEX(v1, 0, 1);
GETGX(v0, 1);
u8 = F8;
// only low part need to be suffled. VTBL only handle 8bits value, so the 16bits suffles need to be changed in 8bits
u64 = 0;
for (int i=0; i<4; ++i) {
u64 |= ((uint64_t)((u8>>(i*2))&3)*2+0)<<(i*16+0);
u64 |= ((uint64_t)((u8>>(i*2))&3)*2+1)<<(i*16+8);
}
MOV64x(x2, u64);
d0 = fpu_get_scratch(dyn);
VMOVQDfrom(d0, 0, x2);
VTBL1_8(d0, v1, d0);
VMOVeD(v0, 0, d0, 0);
if(v0!=v1) {
VMOVeD(v0, 1, v1, 1);
}
break;
case 0x7C:
INST_NAME("HADDPS Gx, Ex");
nextop = F8;
GETGX(v0, 1);
if(MODREG) {
v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0);
} else {
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<4, 15, rex, NULL, 0, 0);
v1 = fpu_get_scratch(dyn);
VLDR128_U12(v1, ed, fixedaddress);
}
VFADDPQS(v0, v0, v1);
break;
case 0xC2:
INST_NAME("CMPSD Gx, Ex, Ib");
nextop = F8;
GETGX(v0, 1);
GETEXSD(v1, 0, 1);
u8 = F8;
FCMPD(v0, v1);
switch(u8&7) {
case 0: CSETMx(x2, cEQ); break; // Equal
case 1: CSETMx(x2, cCC); break; // Less than
case 2: CSETMx(x2, cLS); break; // Less or equal
case 3: CSETMx(x2, cVS); break; // NaN
case 4: CSETMx(x2, cNE); break; // Not Equal or unordered
case 5: CSETMx(x2, cCS); break; // Greater or equal or unordered
case 6: CSETMx(x2, cHI); break; // Greater or unordered, test inverted, N!=V so unordered or less than (inverted)
case 7: CSETMx(x2, cVC); break; // not NaN
}
VMOVQDfrom(v0, 0, x2);
break;
case 0xD0:
INST_NAME("ADDSUBPS Gx, Ex");
nextop = F8;
GETGX(v0, 1);
GETEXSD(v1, 0, 0);
q0 = fpu_get_scratch(dyn);
static float addsubps[4] = {-1.f, 1.f, -1.f, 1.f};
MAYUSE(addsubps);
TABLE64(x2, (uintptr_t)&addsubps);
VLDR128_U12(q0, x2, 0);
VFMLAQS(v0, v1, q0);
break;
case 0xD6:
INST_NAME("MOVDQ2Q Gm, Ex");
nextop = F8;
GETGM(v0);
GETEXSD(v1, 0, 0);
VMOV(v0, v1);
break;
case 0xE6:
INST_NAME("CVTPD2DQ Gx, Ex");
nextop = F8;
GETEXSD(v1, 0, 0);
GETGX_empty(v0);
u8 = sse_setround(dyn, ninst, x1, x2, x3);
VFRINTIDQ(v0, v1);
x87_restoreround(dyn, ninst, u8);
VFCVTNSQD(v0, v0); // convert double -> int64
SQXTN_32(v0, v0); // convert int64 -> int32 with saturation in lower part, RaZ high part
break;
case 0xF0:
INST_NAME("LDDQU Gx,Ex");
nextop = F8;
GETG;
if(MODREG) {
v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0);
v0 = sse_get_reg_empty(dyn, ninst, x1, gd);
VMOVQ(v0, v1);
} else {
v0 = sse_get_reg_empty(dyn, ninst, x1, gd);
SMREAD();
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<4, 7, rex, NULL, 0, 0);
VLDR128_U12(v0, ed, fixedaddress);
}
break;
default:
DEFAULT;
}
return addr;
}
+443
View File
@@ -0,0 +1,443 @@
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <pthread.h>
#include <errno.h>
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
#include "emu/x64run_private.h"
#include "x64trace.h"
#include "dynarec_native.h"
#include "arm64_printer.h"
#include "dynarec_arm64_private.h"
#include "dynarec_arm64_functions.h"
#include "dynarec_arm64_helper.h"
uintptr_t dynarec64_F30F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog)
{
(void)ip; (void)need_epilog;
uint8_t opcode = F8;
uint8_t nextop, u8;
uint8_t gd, ed;
uint8_t wback;
uint64_t u64;
int v0, v1;
int q0, q1;
int d0, d1;
int64_t fixedaddress;
int64_t j64;
MAYUSE(d0);
MAYUSE(d1);
MAYUSE(q0);
MAYUSE(q1);
MAYUSE(v0);
MAYUSE(v1);
MAYUSE(j64);
switch(opcode) {
case 0x10:
INST_NAME("MOVSS Gx, Ex");
nextop = F8;
GETG;
if(MODREG) {
v0 = sse_get_reg(dyn, ninst, x1, gd, 1);
q0 = sse_get_reg(dyn, ninst, x1, (nextop&7) + (rex.b<<3), 0);
VMOVeS(v0, 0, q0, 0);
} else {
v0 = sse_get_reg_empty(dyn, ninst, x1, gd);
SMREAD();
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<2, 3, rex, NULL, 0, 0);
VLDR32_U12(v0, ed, fixedaddress);
}
break;
case 0x11:
INST_NAME("MOVSS Ex, Gx");
nextop = F8;
GETG;
v0 = sse_get_reg(dyn, ninst, x1, gd, 0);
if(MODREG) {
q0 = sse_get_reg(dyn, ninst, x1, (nextop&7) + (rex.b<<3), 1);
VMOVeS(q0, 0, v0, 0);
} else {
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<2, 3, rex, NULL, 0, 0);
VSTR32_U12(v0, ed, fixedaddress);
SMWRITE2();
}
break;
case 0x12:
INST_NAME("MOVSLDUP Gx, Ex");
nextop = F8;
if(MODREG) {
q1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0);
} else {
SMREAD();
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<4, 15, rex, NULL, 0, 0);
q1 = fpu_get_scratch(dyn);
VLDR128_U12(q1, ed, fixedaddress);
}
GETGX_empty(q0);
VTRNQ1_32(q0, q1, q1);
break;
case 0x16:
INST_NAME("MOVSHDUP Gx, Ex");
nextop = F8;
if(MODREG) {
q1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0);
} else {
SMREAD();
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<4, 15, rex, NULL, 0, 0);
q1 = fpu_get_scratch(dyn);
VLDR128_U12(q1, ed, fixedaddress);
}
GETGX_empty(q0);
VTRNQ2_32(q0, q1, q1);
break;
case 0x1E:
INST_NAME("NOP / ENDBR32 / ENDBR64");
nextop = F8;
FAKEED;
break;
case 0x2A:
INST_NAME("CVTSI2SS Gx, Ed");
nextop = F8;
GETGX(v0, 1);
GETED(0);
d1 = fpu_get_scratch(dyn);
if(rex.w) {
SCVTFSx(d1, ed);
} else {
SCVTFSw(d1, ed);
}
VMOVeS(v0, 0, d1, 0);
break;
case 0x2C:
INST_NAME("CVTTSS2SI Gd, Ex");
nextop = F8;
GETGD;
GETEXSS(d0, 0, 0);
if(!box64_dynarec_fastround) {
MRS_fpsr(x5);
BFCw(x5, FPSR_IOC, 1); // reset IOC bit
MSR_fpsr(x5);
}
FCVTZSxwS(gd, d0);
if(!box64_dynarec_fastround) {
MRS_fpsr(x5); // get back FPSR to check the IOC bit
TBZ_NEXT(x5, FPSR_IOC);
if(rex.w) {
ORRx_mask(gd, xZR, 1, 1, 0); //0x8000000000000000
} else {
MOV32w(gd, 0x80000000);
}
}
break;
case 0x2D:
INST_NAME("CVTSS2SI Gd, Ex");
nextop = F8;
GETGD;
GETEXSS(q0, 0, 0);
if(!box64_dynarec_fastround) {
MRS_fpsr(x5);
BFCw(x5, FPSR_IOC, 1); // reset IOC bit
MSR_fpsr(x5);
}
u8 = sse_setround(dyn, ninst, x1, x2, x3);
d1 = fpu_get_scratch(dyn);
FRINTIS(d1, q0);
x87_restoreround(dyn, ninst, u8);
FCVTZSxwS(gd, d1);
if(!box64_dynarec_fastround) {
MRS_fpsr(x5); // get back FPSR to check the IOC bit
TBZ_NEXT(x5, FPSR_IOC);
if(rex.w) {
ORRx_mask(gd, xZR, 1, 1, 0); //0x8000000000000000
} else {
MOV32w(gd, 0x80000000);
}
}
break;
case 0x51:
INST_NAME("SQRTSS Gx, Ex");
nextop = F8;
GETGX(v0, 1);
d1 = fpu_get_scratch(dyn);
GETEXSS(d0, 0, 0);
FSQRTS(d1, d0);
VMOVeS(v0, 0, d1, 0);
break;
case 0x52:
INST_NAME("RSQRTSS Gx, Ex");
nextop = F8;
GETGX(v0, 1);
GETEXSS(v1, 0, 0);
d0 = fpu_get_scratch(dyn);
d1 = fpu_get_scratch(dyn);
// so here: F32: Imm8 = abcd efgh that gives => aBbbbbbc defgh000 00000000 00000000
// and want 1.0f = 0x3f800000
// so 00111111 10000000 00000000 00000000
// a = 0, b = 1, c = 1, d = 1, efgh=0
// 0b01110000
FMOVS_8(d0, 0b01110000);
FSQRTS(d1, v1);
FDIVS(d0, d0, d1);
VMOVeS(v0, 0, d0, 0);
break;
case 0x53:
INST_NAME("RCPSS Gx, Ex");
nextop = F8;
GETGX(v0, 1);
GETEXSS(v1, 0, 0);
d0 = fpu_get_scratch(dyn);
FMOVS_8(d0, 0b01110000); //1.0f
FDIVS(d0, d0, v1);
VMOVeS(v0, 0, d0, 0);
break;
case 0x58:
INST_NAME("ADDSS Gx, Ex");
nextop = F8;
GETGX(v0, 1);
d1 = fpu_get_scratch(dyn);
GETEXSS(d0, 0, 0);
FADDS(d1, v0, d0); // the high part of the vector is erased...
VMOVeS(v0, 0, d1, 0);
break;
case 0x59:
INST_NAME("MULSS Gx, Ex");
nextop = F8;
GETGX(v0, 1);
d1 = fpu_get_scratch(dyn);
GETEXSS(d0, 0, 0);
FMULS(d1, v0, d0);
VMOVeS(v0, 0, d1, 0);
break;
case 0x5A:
INST_NAME("CVTSS2SD Gx, Ex");
nextop = F8;
GETGX(v0, 1);
GETEXSS(v1, 0, 0);
d0 = fpu_get_scratch(dyn);
FCVT_D_S(d0, v1);
VMOVeD(v0, 0, d0, 0);
break;
case 0x5B:
INST_NAME("CVTTPS2DQ Gx, Ex");
nextop = F8;
GETEX(d0, 0, 0) ;
GETGX_empty(v0);
VFCVTZSQS(v0, d0);
break;
case 0x5C:
INST_NAME("SUBSS Gx, Ex");
nextop = F8;
GETGX(v0, 1);
d1 = fpu_get_scratch(dyn);
GETEXSS(d0, 0, 0);
FSUBS(d1, v0, d0);
VMOVeS(v0, 0, d1, 0);
break;
case 0x5D:
INST_NAME("MINSS Gx, Ex");
nextop = F8;
GETGX(v0, 1);
GETEXSS(v1, 0, 0);
// MINSS: if any input is NaN, or Ex[0]<Gx[0], copy Ex[0] -> Gx[0]
#if 0
d0 = fpu_get_scratch(dyn);
FMINNMS(d0, v0, v1); // NaN handling may be slightly different, is that a problem?
VMOVeS(v0, 0, d0, 0); // to not erase uper part
#else
FCMPS(v0, v1);
B_NEXT(cLS); //Less than or equal
VMOVeS(v0, 0, v1, 0); // to not erase uper part
#endif
break;
case 0x5E:
INST_NAME("DIVSS Gx, Ex");
nextop = F8;
GETGX(v0, 1);
d1 = fpu_get_scratch(dyn);
GETEXSS(d0, 0, 0);
FDIVS(d1, v0, d0);
VMOVeS(v0, 0, d1, 0);
break;
case 0x5F:
INST_NAME("MAXSS Gx, Ex");
nextop = F8;
GETGX(v0, 1);
GETEXSS(v1, 0, 0);
// MAXSS: if any input is NaN, or Ex[0]>Gx[0], copy Ex[0] -> Gx[0]
#if 0
d0 = fpu_get_scratch(dyn);
FMAXNMS(d0, v0, v1); // NaN handling may be slightly different, is that a problem?
VMOVeS(v0, 0, d0, 0); // to not erase uper part
#else
FCMPS(v0, v1);
B_NEXT(cGE); //Greater than or equal
VMOVeS(v0, 0, v1, 0); // to not erase uper part
#endif
break;
case 0x6F:
INST_NAME("MOVDQU Gx,Ex");// no alignment constraint on NEON here, so same as MOVDQA
nextop = F8;
if(MODREG) {
v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0);
GETGX_empty(v0);
VMOVQ(v0, v1);
} else {
GETGX_empty(v0);
SMREAD();
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<4, 15, rex, NULL, 0, 0);
VLDR128_U12(v0, ed, fixedaddress);
}
break;
case 0x70:
INST_NAME("PSHUFHW Gx, Ex, Ib");
nextop = F8;
GETEX(v1, 0, 1) ;
GETGX(v0, 1);
u8 = F8;
// only high part need to be suffled. VTBL only handle 8bits value, so the 16bits suffles need to be changed in 8bits
u64 = 0;
for (int i=0; i<4; ++i) {
u64 |= ((uint64_t)((u8>>(i*2))&3)*2+8)<<(i*16+0);
u64 |= ((uint64_t)((u8>>(i*2))&3)*2+9)<<(i*16+8);
}
MOV64x(x2, u64);
d0 = fpu_get_scratch(dyn);
VMOVQDfrom(d0, 0, x2);
VTBL1_8(d0, v1, d0);
VMOVeD(v0, 1, d0, 0);
if(v0!=v1) {
VMOVeD(v0, 0, v1, 0);
}
break;
case 0x7E:
INST_NAME("MOVQ Gx, Ex");
nextop = F8;
if(MODREG) {
v1 = sse_get_reg(dyn, ninst, x1, (nextop&7) + (rex.b<<3), 0);
GETGX_empty(v0);
FMOVD(v0, v1);
} else {
GETGX_empty(v0);
SMREAD();
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<3, 7, rex, NULL, 0, 0);
VLDR64_U12(v0, ed, fixedaddress);
}
break;
case 0x7F:
INST_NAME("MOVDQU Ex,Gx");
nextop = F8;
GETGX(v0, 0);
if(MODREG) {
v1 = sse_get_reg_empty(dyn, ninst, x1, (nextop&7) + (rex.b<<3));
VMOVQ(v1, v0);
} else {
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<4, 15, rex, NULL, 0, 0);
VSTR128_U12(v0, ed, fixedaddress);
SMWRITE2();
}
break;
case 0xBC:
INST_NAME("TZCNT Gd, Ed");
SETFLAGS(X_CF|X_ZF, SF_SUBSET);
SET_DFNONE(x1);
nextop = F8;
GETED(0);
GETGD;
TSTxw_REG(ed, ed);
CSETw(x3, cEQ);
BFIw(xFlags, x3, F_CF, 1); // CF = is source 0?
RBITxw(x3, ed); // reverse
CLZxw(gd, x3); // x2 gets leading 0 == TZCNT
TSTxw_REG(gd, gd);
CSETw(x3, cEQ);
BFIw(xFlags, x3, F_ZF, 1); // ZF = is dest 0?
break;
case 0xBD:
INST_NAME("LZCNT Gd, Ed");
SETFLAGS(X_CF|X_ZF, SF_SUBSET);
SET_DFNONE(x1);
nextop = F8;
GETED(0);
GETGD;
TSTxw_REG(ed, ed);
CSETw(x3, cEQ);
BFIw(xFlags, x3, F_CF, 1); // CF = is source 0?
CLZxw(gd, ed); // x2 gets leading 0 == LZCNT
TSTxw_REG(gd, gd);
CSETw(x3, cEQ);
BFIw(xFlags, x3, F_ZF, 1); // ZF = is dest 0?
break;
case 0xC2:
INST_NAME("CMPSS Gx, Ex, Ib");
nextop = F8;
GETGX(v0, 1);
GETEXSS(v1, 0, 1);
u8 = F8;
FCMPS(v0, v1);
switch(u8&7) {
case 0: CSETMw(x2, cEQ); break; // Equal
case 1: CSETMw(x2, cCC); break; // Less than
case 2: CSETMw(x2, cLS); break; // Less or equal
case 3: CSETMw(x2, cVS); break; // NaN
case 4: CSETMw(x2, cNE); break; // Not Equal or unordered
case 5: CSETMw(x2, cCS); break; // Greater or equal or unordered
case 6: CSETMw(x2, cHI); break; // Greater or unordered, test inverted, N!=V so unordered or less than (inverted)
case 7: CSETMw(x2, cVC); break; // not NaN
}
VMOVQSfrom(v0, 0, x2);
break;
case 0xD6:
INST_NAME("MOVQ2DQ Gx, Em");
nextop = F8;
GETGX_empty(v0);
if(MODREG) {
v1 = mmx_get_reg(dyn, ninst, x1, x2, x3, (nextop&7));
VEORQ(v0, v0, v0); // usefull?
VMOV(v0, v1);
} else {
SMREAD();
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<3, 7, rex, NULL, 0, 0);
VLDR64_U12(v0, ed, fixedaddress);
}
break;
case 0xE6:
INST_NAME("CVTDQ2PD Gx, Ex");
nextop = F8;
GETEXSD(v1, 0, 0);
GETGX_empty(v0);
d0 = fpu_get_scratch(dyn);
SXTL_32(v0, v1);
SCVTQFD(v0, v0); // there is only I64 -> Double vector conversion, not from i32
break;
default:
DEFAULT;
}
return addr;
}
+946
View File
@@ -0,0 +1,946 @@
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <errno.h>
#include <string.h>
#include <math.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "emu/x64emu_private.h"
#include "tools/bridge_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
#include "emu/x64run_private.h"
#include "emu/x87emu_private.h"
#include "x64trace.h"
#include "signals.h"
#include "dynarec_native.h"
#include "dynarec_arm64_private.h"
#include "dynarec_arm64_functions.h"
#include "custommem.h"
#include "bridge.h"
void arm_fstp(x64emu_t* emu, void* p)
{
if(ST0.q!=STld(0).uref)
D2LD(&ST0.d, p);
else
memcpy(p, &STld(0).ld, 10);
}
void arm_print_armreg(x64emu_t* emu, uintptr_t reg, uintptr_t n)
{
(void)emu;
dynarec_log(LOG_DEBUG, "R%lu=0x%lx (%lu)\n", n, reg, reg);
}
void arm_f2xm1(x64emu_t* emu)
{
ST0.d = exp2(ST0.d) - 1.0;
}
void arm_fyl2x(x64emu_t* emu)
{
ST(1).d = log2(ST0.d)*ST(1).d;
}
void arm_ftan(x64emu_t* emu)
{
ST0.d = tan(ST0.d);
emu->sw.f.F87_C2 = 0;
}
void arm_fpatan(x64emu_t* emu)
{
ST1.d = atan2(ST1.d, ST0.d);
}
void arm_fxtract(x64emu_t* emu)
{
int32_t tmp32s = (ST1.q&0x7ff0000000000000LL)>>52;
tmp32s -= 1023;
ST1.d /= exp2(tmp32s);
ST0.d = tmp32s;
}
void arm_fprem(x64emu_t* emu)
{
int32_t tmp32s = ST0.d / ST1.d;
ST0.d -= ST1.d * tmp32s;
emu->sw.f.F87_C2 = 0;
emu->sw.f.F87_C0 = (tmp32s&1);
emu->sw.f.F87_C3 = ((tmp32s>>1)&1);
emu->sw.f.F87_C1 = ((tmp32s>>2)&1);
}
void arm_fyl2xp1(x64emu_t* emu)
{
ST(1).d = log2(ST0.d + 1.0)*ST(1).d;
}
void arm_fsincos(x64emu_t* emu)
{
sincos(ST1.d, &ST1.d, &ST0.d);
emu->sw.f.F87_C2 = 0;
}
void arm_frndint(x64emu_t* emu)
{
ST0.d = fpu_round(emu, ST0.d);
}
void arm_fscale(x64emu_t* emu)
{
if(ST0.d!=0.0)
ST0.d *= exp2(trunc(ST1.d));
}
void arm_fsin(x64emu_t* emu)
{
ST0.d = sin(ST0.d);
emu->sw.f.F87_C2 = 0;
}
void arm_fcos(x64emu_t* emu)
{
ST0.d = cos(ST0.d);
emu->sw.f.F87_C2 = 0;
}
void arm_fbld(x64emu_t* emu, uint8_t* ed)
{
fpu_fbld(emu, ed);
}
void arm_fild64(x64emu_t* emu, int64_t* ed)
{
int64_t tmp;
memcpy(&tmp, ed, sizeof(tmp));
ST0.d = tmp;
STll(0).sq = tmp;
STll(0).sref = ST0.sq;
}
void arm_fbstp(x64emu_t* emu, uint8_t* ed)
{
fpu_fbst(emu, ed);
}
void arm_fistp64(x64emu_t* emu, int64_t* ed)
{
// used of memcpy to avoid aligments issues
if(STll(0).sref==ST(0).sq) {
memcpy(ed, &STll(0).sq, sizeof(int64_t));
} else {
int64_t tmp;
if(isgreater(ST0.d, (double)(int64_t)0x7fffffffffffffffLL) || isless(ST0.d, (double)(int64_t)0x8000000000000000LL) || !isfinite(ST0.d))
tmp = 0x8000000000000000LL;
else
tmp = fpu_round(emu, ST0.d);
memcpy(ed, &tmp, sizeof(tmp));
}
}
void arm_fistt64(x64emu_t* emu, int64_t* ed)
{
// used of memcpy to avoid aligments issues
int64_t tmp = ST0.d;
memcpy(ed, &tmp, sizeof(tmp));
}
void arm_fld(x64emu_t* emu, uint8_t* ed)
{
memcpy(&STld(0).ld, ed, 10);
LD2D(&STld(0), &ST(0).d);
STld(0).uref = ST0.q;
}
void arm_ud(x64emu_t* emu)
{
emit_signal(emu, SIGILL, (void*)R_RIP, 0);
}
void arm_priv(x64emu_t* emu)
{
emit_signal(emu, SIGSEGV, (void*)R_RIP, 0);
}
void arm_fsave(x64emu_t* emu, uint8_t* ed)
{
fpu_savenv(emu, (char*)ed, 0);
uint8_t* p = ed;
p += 28;
for (int i=0; i<8; ++i) {
LD2D(p, &ST(i).d);
p+=10;
}
}
void arm_frstor(x64emu_t* emu, uint8_t* ed)
{
fpu_loadenv(emu, (char*)ed, 0);
uint8_t* p = ed;
p += 28;
for (int i=0; i<8; ++i) {
D2LD(&ST(i).d, p);
p+=10;
}
}
void arm_fprem1(x64emu_t* emu)
{
// simplified version
int32_t tmp32s = round(ST0.d / ST1.d);
ST0.d -= ST1.d*tmp32s;
emu->sw.f.F87_C2 = 0;
emu->sw.f.F87_C0 = (tmp32s&1);
emu->sw.f.F87_C3 = ((tmp32s>>1)&1);
emu->sw.f.F87_C1 = ((tmp32s>>2)&1);
}
static uint8_t ff_mult(uint8_t a, uint8_t b)
{
int retval = 0;
for(int i = 0; i < 8; i++) {
if((b & 1) == 1)
retval ^= a;
if((a & 0x80)) {
a <<= 1;
a ^= 0x1b;
} else {
a <<= 1;
}
b >>= 1;
}
return retval;
}
void arm_aesimc(x64emu_t* emu, int xmm)
{
sse_regs_t eax1 = emu->xmm[xmm];
for(int j=0; j<4; ++j) {
emu->xmm[xmm].ub[0+j*4] = ff_mult(0x0E, eax1.ub[0+j*4]) ^ ff_mult(0x0B, eax1.ub[1+j*4]) ^ ff_mult(0x0D, eax1.ub[2+j*4]) ^ ff_mult(0x09, eax1.ub[3+j*4]);
emu->xmm[xmm].ub[1+j*4] = ff_mult(0x09, eax1.ub[0+j*4]) ^ ff_mult(0x0E, eax1.ub[1+j*4]) ^ ff_mult(0x0B, eax1.ub[2+j*4]) ^ ff_mult(0x0D, eax1.ub[3+j*4]);
emu->xmm[xmm].ub[2+j*4] = ff_mult(0x0D, eax1.ub[0+j*4]) ^ ff_mult(0x09, eax1.ub[1+j*4]) ^ ff_mult(0x0E, eax1.ub[2+j*4]) ^ ff_mult(0x0B, eax1.ub[3+j*4]);
emu->xmm[xmm].ub[3+j*4] = ff_mult(0x0B, eax1.ub[0+j*4]) ^ ff_mult(0x0D, eax1.ub[1+j*4]) ^ ff_mult(0x09, eax1.ub[2+j*4]) ^ ff_mult(0x0E, eax1.ub[3+j*4]);
}
}
void arm_aesmc(x64emu_t* emu, int xmm)
{
sse_regs_t eax1 = emu->xmm[xmm];
for(int j=0; j<4; ++j) {
emu->xmm[xmm].ub[0+j*4] = ff_mult(0x02, eax1.ub[0+j*4]) ^ ff_mult(0x03, eax1.ub[1+j*4]) ^ eax1.ub[2+j*4] ^ eax1.ub[3+j*4] ;
emu->xmm[xmm].ub[1+j*4] = eax1.ub[0+j*4] ^ ff_mult(0x02, eax1.ub[1+j*4]) ^ ff_mult(0x03, eax1.ub[2+j*4]) ^ eax1.ub[3+j*4] ;
emu->xmm[xmm].ub[2+j*4] = eax1.ub[0+j*4] ^ eax1.ub[1+j*4] ^ ff_mult(0x02, eax1.ub[2+j*4]) ^ ff_mult(0x03, eax1.ub[3+j*4]);
emu->xmm[xmm].ub[3+j*4] = ff_mult(0x03, eax1.ub[0+j*4]) ^ eax1.ub[1+j*4] ^ eax1.ub[2+j*4] ^ ff_mult(0x02, eax1.ub[3+j*4]);
}
}
void arm_aesdlast(x64emu_t* emu, int xmm)
{
// A0 B1 C2 D3 E4 F5 G6 H7 I8 J9 Ka Lb Mc Nd Oe Pf
// A N K H E B O L I F C P M J G D
const uint8_t invshiftrows[] = {0,13,10, 7, 4, 1,14,11, 8, 5, 2,15,12, 9, 6, 3};
const uint8_t invsubbytes[256] = {
0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,
0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,
0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,
0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,
0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,
0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,
0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,
0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,
0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,
0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d,
};
sse_regs_t eax1;
for(int i=0; i<16; ++i)
eax1.ub[i] = emu->xmm[xmm].ub[invshiftrows[i]];
//STATE ← InvSubBytes( STATE );
for(int i=0; i<16; ++i)
emu->xmm[xmm].ub[i] = invsubbytes[eax1.ub[i]];
}
static const uint8_t shiftrows[] = {0, 5,10,15, 4, 9,14, 3, 8,13, 2, 7,12, 1, 6,11};
static const uint8_t subbytes[256] = {
0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16,
};
void arm_aeselast(x64emu_t* emu, int xmm)
{
// A0 B1 C2 D3 E4 F5 G6 H7 I8 J9 Ka Lb Mc Nd Oe Pf
// A F K P E J O D I N C H M B G L
sse_regs_t eax1;
for(int i=0; i<16; ++i)
eax1.ub[i] = emu->xmm[xmm].ub[shiftrows[i]];
//STATE ← SubBytes( STATE );
for(int i=0; i<16; ++i)
emu->xmm[xmm].ub[i] = subbytes[eax1.ub[i]];
}
void arm_aesd(x64emu_t* emu, int xmm)
{
arm_aesdlast(emu, xmm);
arm_aesimc(emu, xmm);
}
void arm_aese(x64emu_t* emu, int xmm)
{
arm_aeselast(emu, xmm);
arm_aesmc(emu, xmm);
}
void arm_aeskeygenassist(x64emu_t* emu, int gx, int ex, void* p, uint32_t u8)
{
sse_regs_t *EX = p?((sse_regs_t*)p):&emu->xmm[ex];
sse_regs_t *GX = &emu->xmm[gx];
for (int i = 4; i < 8; ++i)
GX->ub[i] = subbytes[EX->ub[i]];
for (int i = 12; i < 16; ++i)
GX->ub[i] = subbytes[EX->ub[i]];
GX->ud[0] = GX->ud[1];
uint8_t tmp8u = GX->ub[4];
GX->ud[1] = GX->ud[1] >> 8;
GX->ub[7] = tmp8u;
GX->ud[1] ^= u8;
GX->ud[2] = GX->ud[3];
tmp8u = GX->ub[12];
GX->ud[3] = GX->ud[3] >> 8;
GX->ub[15] = tmp8u;
GX->ud[3] ^= u8;
}
void arm_pclmul(x64emu_t* emu, int gx, int ex, void* p, uint32_t u8)
{
sse_regs_t *EX = p?((sse_regs_t*)p):&emu->xmm[ex];
sse_regs_t *GX = &emu->xmm[gx];
int g = (u8&1)?1:0;
int e = (u8&0b10000)?1:0;
__int128 result = 0;
__int128 op2 = EX->q[e];
for (int i=0; i<64; ++i)
if(GX->q[g]&(1LL<<i))
result ^= (op2<<i);
GX->q[0] = result&0xffffffffffffffffLL;
GX->q[1] = (result>>64)&0xffffffffffffffffLL;
}
void arm_clflush(x64emu_t* emu, void* p)
{
cleanDBFromAddressRange((uintptr_t)p, 8, 0);
}
#define XMM0 0
#define XMM8 16
#define X870 8
#define EMM0 8
#define SCRATCH0 24
// Get a FPU scratch reg
int fpu_get_scratch(dynarec_arm_t* dyn)
{
return SCRATCH0 + dyn->n.fpu_scratch++; // return an Sx
}
// Reset scratch regs counter
void fpu_reset_scratch(dynarec_arm_t* dyn)
{
dyn->n.fpu_scratch = 0;
}
// Get a x87 double reg
int fpu_get_reg_x87(dynarec_arm_t* dyn, int t, int n)
{
int i=X870;
while (dyn->n.fpuused[i]) ++i;
dyn->n.fpuused[i] = 1;
dyn->n.neoncache[i].n = n;
dyn->n.neoncache[i].t = t;
dyn->n.news |= (1<<i);
return i; // return a Dx
}
// Free a FPU double reg
void fpu_free_reg(dynarec_arm_t* dyn, int reg)
{
// TODO: check upper limit?
dyn->n.fpuused[reg] = 0;
if(dyn->n.neoncache[reg].t!=NEON_CACHE_ST_F && dyn->n.neoncache[reg].t!=NEON_CACHE_ST_D)
dyn->n.neoncache[reg].v = 0;
}
// Get an MMX double reg
int fpu_get_reg_emm(dynarec_arm_t* dyn, int emm)
{
dyn->n.fpuused[EMM0 + emm] = 1;
dyn->n.neoncache[EMM0 + emm].t = NEON_CACHE_MM;
dyn->n.neoncache[EMM0 + emm].n = emm;
dyn->n.news |= (1<<(EMM0 + emm));
return EMM0 + emm;
}
// Get an XMM quad reg
int fpu_get_reg_xmm(dynarec_arm_t* dyn, int t, int xmm)
{
int i;
if(xmm>7) {
i = XMM8 + xmm - 8;
} else {
i = XMM0 + xmm;
}
dyn->n.fpuused[i] = 1;
dyn->n.neoncache[i].t = t;
dyn->n.neoncache[i].n = xmm;
dyn->n.news |= (1<<i);
return i;
}
// Reset fpu regs counter
void fpu_reset_reg(dynarec_arm_t* dyn)
{
dyn->n.fpu_reg = 0;
for (int i=0; i<24; ++i) {
dyn->n.fpuused[i]=0;
dyn->n.neoncache[i].v = 0;
}
}
int neoncache_get_st(dynarec_arm_t* dyn, int ninst, int a)
{
if (dyn->insts[ninst].n.swapped) {
if(dyn->insts[ninst].n.combined1 == a)
a = dyn->insts[ninst].n.combined2;
else if(dyn->insts[ninst].n.combined2 == a)
a = dyn->insts[ninst].n.combined1;
}
for(int i=0; i<24; ++i)
if((dyn->insts[ninst].n.neoncache[i].t==NEON_CACHE_ST_F
|| dyn->insts[ninst].n.neoncache[i].t==NEON_CACHE_ST_D)
&& dyn->insts[ninst].n.neoncache[i].n==a)
return dyn->insts[ninst].n.neoncache[i].t;
// not in the cache yet, so will be fetched...
return NEON_CACHE_ST_D;
}
int neoncache_get_current_st(dynarec_arm_t* dyn, int ninst, int a)
{
(void)ninst;
if(!dyn->insts)
return NEON_CACHE_ST_D;
for(int i=0; i<24; ++i)
if((dyn->n.neoncache[i].t==NEON_CACHE_ST_F
|| dyn->n.neoncache[i].t==NEON_CACHE_ST_D)
&& dyn->n.neoncache[i].n==a)
return dyn->n.neoncache[i].t;
// not in the cache yet, so will be fetched...
return NEON_CACHE_ST_D;
}
int neoncache_get_st_f(dynarec_arm_t* dyn, int ninst, int a)
{
/*if(a+dyn->insts[ninst].n.stack_next-st<0)
// The STx has been pushed at the end of instructon, so stop going back
return -1;*/
for(int i=0; i<24; ++i)
if(dyn->insts[ninst].n.neoncache[i].t==NEON_CACHE_ST_F
&& dyn->insts[ninst].n.neoncache[i].n==a)
return i;
return -1;
}
int neoncache_get_st_f_noback(dynarec_arm_t* dyn, int ninst, int a)
{
for(int i=0; i<24; ++i)
if(dyn->insts[ninst].n.neoncache[i].t==NEON_CACHE_ST_F
&& dyn->insts[ninst].n.neoncache[i].n==a)
return i;
return -1;
}
int neoncache_get_current_st_f(dynarec_arm_t* dyn, int a)
{
for(int i=0; i<24; ++i)
if(dyn->n.neoncache[i].t==NEON_CACHE_ST_F
&& dyn->n.neoncache[i].n==a)
return i;
return -1;
}
static void neoncache_promote_double_forward(dynarec_arm_t* dyn, int ninst, int maxinst, int a);
static void neoncache_promote_double_internal(dynarec_arm_t* dyn, int ninst, int maxinst, int a);
static void neoncache_promote_double_combined(dynarec_arm_t* dyn, int ninst, int maxinst, int a)
{
if(a == dyn->insts[ninst].n.combined1 || a == dyn->insts[ninst].n.combined2) {
if(a == dyn->insts[ninst].n.combined1) {
a = dyn->insts[ninst].n.combined2;
} else
a = dyn->insts[ninst].n.combined1;
int i = neoncache_get_st_f_noback(dyn, ninst, a);
//if(box64_dynarec_dump) dynarec_log(LOG_NONE, "neoncache_promote_double_combined, ninst=%d combined%c %d i=%d (stack:%d/%d)\n", ninst, (a == dyn->insts[ninst].n.combined2)?'2':'1', a ,i, dyn->insts[ninst].n.stack_push, -dyn->insts[ninst].n.stack_pop);
if(i>=0) {
dyn->insts[ninst].n.neoncache[i].t = NEON_CACHE_ST_D;
if(!dyn->insts[ninst].n.barrier)
neoncache_promote_double_internal(dyn, ninst-1, maxinst, a-dyn->insts[ninst].n.stack_push);
// go forward is combined is not pop'd
if(a-dyn->insts[ninst].n.stack_pop>=0)
if(!dyn->insts[ninst+1].n.barrier)
neoncache_promote_double_forward(dyn, ninst+1, maxinst, a-dyn->insts[ninst].n.stack_pop);
}
}
}
static void neoncache_promote_double_internal(dynarec_arm_t* dyn, int ninst, int maxinst, int a)
{
if(dyn->insts[ninst+1].n.barrier)
return;
while(ninst>=0) {
a+=dyn->insts[ninst].n.stack_pop; // adjust Stack depth: add pop'd ST (going backward)
int i = neoncache_get_st_f(dyn, ninst, a);
//if(box64_dynarec_dump) dynarec_log(LOG_NONE, "neoncache_promote_double_internal, ninst=%d, a=%d st=%d:%d, i=%d\n", ninst, a, dyn->insts[ninst].n.stack, dyn->insts[ninst].n.stack_next, i);
if(i<0) return;
dyn->insts[ninst].n.neoncache[i].t = NEON_CACHE_ST_D;
// check combined propagation too
if(dyn->insts[ninst].n.combined1 || dyn->insts[ninst].n.combined2) {
if(dyn->insts[ninst].n.swapped) {
//if(box64_dynarec_dump) dynarec_log(LOG_NONE, "neoncache_promote_double_internal, ninst=%d swapped %d/%d vs %d with st %d\n", ninst, dyn->insts[ninst].n.combined1 ,dyn->insts[ninst].n.combined2, a, dyn->insts[ninst].n.stack);
if (a==dyn->insts[ninst].n.combined1)
a = dyn->insts[ninst].n.combined2;
else if (a==dyn->insts[ninst].n.combined2)
a = dyn->insts[ninst].n.combined1;
} else {
//if(box64_dynarec_dump) dynarec_log(LOG_NONE, "neoncache_promote_double_internal, ninst=%d combined %d/%d vs %d with st %d\n", ninst, dyn->insts[ninst].n.combined1 ,dyn->insts[ninst].n.combined2, a, dyn->insts[ninst].n.stack);
neoncache_promote_double_combined(dyn, ninst, maxinst, a);
}
}
a-=dyn->insts[ninst].n.stack_push; // // adjust Stack depth: remove push'd ST (going backward)
--ninst;
if(ninst<0 || a<0 || dyn->insts[ninst].n.barrier)
return;
}
}
static void neoncache_promote_double_forward(dynarec_arm_t* dyn, int ninst, int maxinst, int a)
{
while((ninst!=-1) && (ninst<maxinst) && (a>=0)) {
a+=dyn->insts[ninst].n.stack_push; // // adjust Stack depth: add push'd ST (going forward)
if((dyn->insts[ninst].n.combined1 || dyn->insts[ninst].n.combined2) && dyn->insts[ninst].n.swapped) {
//if(box64_dynarec_dump) dynarec_log(LOG_NONE, "neoncache_promote_double_forward, ninst=%d swapped %d/%d vs %d with st %d\n", ninst, dyn->insts[ninst].n.combined1 ,dyn->insts[ninst].n.combined2, a, dyn->insts[ninst].n.stack);
if (a==dyn->insts[ninst].n.combined1)
a = dyn->insts[ninst].n.combined2;
else if (a==dyn->insts[ninst].n.combined2)
a = dyn->insts[ninst].n.combined1;
}
int i = neoncache_get_st_f_noback(dyn, ninst, a);
//if(box64_dynarec_dump) dynarec_log(LOG_NONE, "neoncache_promote_double_forward, ninst=%d, a=%d st=%d:%d(%d/%d), i=%d\n", ninst, a, dyn->insts[ninst].n.stack, dyn->insts[ninst].n.stack_next, dyn->insts[ninst].n.stack_push, -dyn->insts[ninst].n.stack_pop, i);
if(i<0) return;
dyn->insts[ninst].n.neoncache[i].t = NEON_CACHE_ST_D;
// check combined propagation too
if((dyn->insts[ninst].n.combined1 || dyn->insts[ninst].n.combined2) && !dyn->insts[ninst].n.swapped) {
//if(box64_dynarec_dump) dynarec_log(LOG_NONE, "neoncache_promote_double_forward, ninst=%d combined %d/%d vs %d with st %d\n", ninst, dyn->insts[ninst].n.combined1 ,dyn->insts[ninst].n.combined2, a, dyn->insts[ninst].n.stack);
neoncache_promote_double_combined(dyn, ninst, maxinst, a);
}
a-=dyn->insts[ninst].n.stack_pop; // adjust Stack depth: remove pop'd ST (going forward)
if(dyn->insts[ninst].x64.has_next && !dyn->insts[ninst].n.barrier)
++ninst;
else
ninst=-1;
}
if(ninst==maxinst)
neoncache_promote_double(dyn, ninst, a);
}
void neoncache_promote_double(dynarec_arm_t* dyn, int ninst, int a)
{
int i = neoncache_get_current_st_f(dyn, a);
//if(box64_dynarec_dump) dynarec_log(LOG_NONE, "neoncache_promote_double, ninst=%d a=%d st=%d i=%d\n", ninst, a, dyn->n.stack, i);
if(i<0) return;
dyn->n.neoncache[i].t = NEON_CACHE_ST_D;
dyn->insts[ninst].n.neoncache[i].t = NEON_CACHE_ST_D;
// check combined propagation too
if(dyn->n.combined1 || dyn->n.combined2) {
if(dyn->n.swapped) {
//if(box64_dynarec_dump) dynarec_log(LOG_NONE, "neoncache_promote_double, ninst=%d swapped! %d/%d vs %d\n", ninst, dyn->n.combined1 ,dyn->n.combined2, a);
if(dyn->n.combined1 == a)
a = dyn->n.combined2;
else if(dyn->n.combined2 == a)
a = dyn->n.combined1;
} else {
//if(box64_dynarec_dump) dynarec_log(LOG_NONE, "neoncache_promote_double, ninst=%d combined! %d/%d vs %d\n", ninst, dyn->n.combined1 ,dyn->n.combined2, a);
if(dyn->n.combined1 == a)
neoncache_promote_double(dyn, ninst, dyn->n.combined2);
else if(dyn->n.combined2 == a)
neoncache_promote_double(dyn, ninst, dyn->n.combined1);
}
}
a-=dyn->insts[ninst].n.stack_push; // // adjust Stack depth: remove push'd ST (going backward)
if(!ninst || a<0) return;
neoncache_promote_double_internal(dyn, ninst-1, ninst, a);
}
int neoncache_combine_st(dynarec_arm_t* dyn, int ninst, int a, int b)
{
dyn->n.combined1=a;
dyn->n.combined2=b;
if( neoncache_get_current_st(dyn, ninst, a)==NEON_CACHE_ST_F
&& neoncache_get_current_st(dyn, ninst, b)==NEON_CACHE_ST_F )
return NEON_CACHE_ST_F;
return NEON_CACHE_ST_D;
}
int isPred(dynarec_arm_t* dyn, int ninst, int pred) {
for(int i=0; i<dyn->insts[ninst].pred_sz; ++i)
if(dyn->insts[ninst].pred[i]==pred)
return pred;
return -1;
}
int getNominalPred(dynarec_arm_t* dyn, int ninst) {
if((ninst<=0) || !dyn->insts[ninst].pred_sz)
return -1;
if(isPred(dyn, ninst, ninst-1)!=-1)
return ninst-1;
return dyn->insts[ninst].pred[0];
}
int isCacheEmpty(dynarec_arm_t* dyn, int ninst) {
if(dyn->insts[ninst].n.stack_next) {
return 0;
}
for(int i=0; i<24; ++i)
if(dyn->insts[ninst].n.neoncache[i].v) { // there is something at ninst for i
if(!(
(dyn->insts[ninst].n.neoncache[i].t==NEON_CACHE_ST_F || dyn->insts[ninst].n.neoncache[i].t==NEON_CACHE_ST_D)
&& dyn->insts[ninst].n.neoncache[i].n<dyn->insts[ninst].n.stack_pop))
return 0;
}
return 1;
}
static int fpuCacheNeedsTransform(dynarec_arm_t* dyn, int ninst) {
int i2 = dyn->insts[ninst].x64.jmp_insts;
if(i2<0)
return 1;
if((dyn->insts[i2].x64.barrier&BARRIER_FLOAT))
// if the barrier as already been apply, no transform needed
return ((dyn->insts[ninst].x64.barrier&BARRIER_FLOAT))?0:(isCacheEmpty(dyn, ninst)?0:1);
int ret = 0;
if(!i2) { // just purge
if(dyn->insts[ninst].n.stack_next) {
return 1;
}
for(int i=0; i<24 && !ret; ++i)
if(dyn->insts[ninst].n.neoncache[i].v) { // there is something at ninst for i
if(!(
(dyn->insts[ninst].n.neoncache[i].t==NEON_CACHE_ST_F || dyn->insts[ninst].n.neoncache[i].t==NEON_CACHE_ST_D)
&& dyn->insts[ninst].n.neoncache[i].n<dyn->insts[ninst].n.stack_pop))
ret = 1;
}
return ret;
}
// Check if ninst can be compatible to i2
if(dyn->insts[ninst].n.stack_next != dyn->insts[i2].n.stack-dyn->insts[i2].n.stack_push) {
return 1;
}
neoncache_t cache_i2 = dyn->insts[i2].n;
neoncacheUnwind(&cache_i2);
for(int i=0; i<24; ++i) {
if(dyn->insts[ninst].n.neoncache[i].v) { // there is something at ninst for i
if(!cache_i2.neoncache[i].v) { // but there is nothing at i2 for i
ret = 1;
} else if(dyn->insts[ninst].n.neoncache[i].v!=cache_i2.neoncache[i].v) { // there is something different
if(dyn->insts[ninst].n.neoncache[i].n!=cache_i2.neoncache[i].n) { // not the same x64 reg
ret = 1;
}
else if(dyn->insts[ninst].n.neoncache[i].t == NEON_CACHE_XMMR && cache_i2.neoncache[i].t == NEON_CACHE_XMMW)
{/* nothing */ }
else
ret = 1;
}
} else if(cache_i2.neoncache[i].v)
ret = 1;
}
return ret;
}
static int flagsCacheNeedsTransform(dynarec_arm_t* dyn, int ninst) {
int jmp = dyn->insts[ninst].x64.jmp_insts;
if(jmp<0)
return 0;
if(dyn->insts[ninst].f_exit.dfnone) // flags are fully known, nothing we can do more
return 0;
/* if((dyn->f.pending!=SF_SET)
&& (dyn->f.pending!=SF_SET_PENDING)) {
if(dyn->f.pending!=SF_PENDING) {*/
switch (dyn->insts[jmp].f_entry.pending) {
case SF_UNKNOWN: return 0;
case SF_SET:
if(dyn->insts[ninst].f_exit.pending!=SF_SET && dyn->insts[ninst].f_exit.pending!=SF_SET_PENDING)
return 1;
else
return 0;
case SF_SET_PENDING:
if(dyn->insts[ninst].f_exit.pending!=SF_SET
&& dyn->insts[ninst].f_exit.pending!=SF_SET_PENDING
&& dyn->insts[ninst].f_exit.pending!=SF_PENDING)
return 1;
else
return 0;
case SF_PENDING:
if(dyn->insts[ninst].f_exit.pending!=SF_SET
&& dyn->insts[ninst].f_exit.pending!=SF_SET_PENDING
&& dyn->insts[ninst].f_exit.pending!=SF_PENDING)
return 1;
else
return (dyn->insts[jmp].f_entry.dfnone == dyn->insts[ninst].f_exit.dfnone)?0:1;
}
if(dyn->insts[jmp].f_entry.dfnone && !dyn->insts[ninst].f_exit.dfnone)
return 1;
return 0;
}
int CacheNeedsTransform(dynarec_arm_t* dyn, int ninst) {
int ret = 0;
if (fpuCacheNeedsTransform(dyn, ninst)) ret|=1;
if (flagsCacheNeedsTransform(dyn, ninst)) ret|=2;
return ret;
}
void neoncacheUnwind(neoncache_t* cache)
{
if(cache->swapped) {
// unswap
int a = -1;
int b = -1;
for(int j=0; j<24 && ((a==-1) || (b==-1)); ++j)
if((cache->neoncache[j].t == NEON_CACHE_ST_D || cache->neoncache[j].t == NEON_CACHE_ST_F)) {
if(cache->neoncache[j].n == cache->combined1)
a = j;
else if(cache->neoncache[j].n == cache->combined2)
b = j;
}
if(a!=-1 && b!=-1) {
int tmp = cache->neoncache[a].n;
cache->neoncache[a].n = cache->neoncache[b].n;
cache->neoncache[b].n = tmp;
}
cache->swapped = 0;
cache->combined1 = cache->combined2 = 0;
}
if(cache->news) {
// reove the newly created neoncache
for(int i=0; i<24; ++i)
if(cache->news&(1<<i))
cache->neoncache[i].v = 0;
cache->news = 0;
}
if(cache->stack_push) {
// unpush
for(int j=0; j<24; ++j) {
if((cache->neoncache[j].t == NEON_CACHE_ST_D || cache->neoncache[j].t == NEON_CACHE_ST_F)) {
if(cache->neoncache[j].n<cache->stack_push)
cache->neoncache[j].v = 0;
else
cache->neoncache[j].n-=cache->stack_push;
}
}
cache->x87stack-=cache->stack_push;
cache->stack-=cache->stack_push;
cache->stack_push = 0;
}
cache->x87stack+=cache->stack_pop;
cache->stack_next = cache->stack;
cache->stack_pop = 0;
cache->barrier = 0;
// And now, rebuild the x87cache info with neoncache
cache->mmxcount = 0;
cache->fpu_scratch = 0;
cache->fpu_extra_qscratch = 0;
cache->fpu_reg = 0;
for(int i=0; i<8; ++i) {
cache->x87cache[i] = -1;
cache->mmxcache[i] = -1;
cache->x87reg[i] = 0;
cache->ssecache[i*2].v = -1;
cache->ssecache[i*2+1].v = -1;
}
int x87reg = 0;
for(int i=0; i<24; ++i) {
if(cache->neoncache[i].v) {
cache->fpuused[i] = 1;
switch (cache->neoncache[i].t) {
case NEON_CACHE_MM:
cache->mmxcache[cache->neoncache[i].n] = i;
++cache->mmxcount;
++cache->fpu_reg;
break;
case NEON_CACHE_XMMR:
case NEON_CACHE_XMMW:
cache->ssecache[cache->neoncache[i].n].reg = i;
cache->ssecache[cache->neoncache[i].n].write = (cache->neoncache[i].t==NEON_CACHE_XMMW)?1:0;
++cache->fpu_reg;
break;
case NEON_CACHE_ST_F:
case NEON_CACHE_ST_D:
cache->x87cache[x87reg] = cache->neoncache[i].n;
cache->x87reg[x87reg] = i;
++x87reg;
++cache->fpu_reg;
break;
case NEON_CACHE_SCR:
cache->fpuused[i] = 0;
cache->neoncache[i].v = 0;
break;
}
} else {
cache->fpuused[i] = 0;
}
}
}
#define F8 *(uint8_t*)(addr++)
#define F32 *(uint32_t*)(addr+=4, addr-4)
#define F32S64 (uint64_t)(int64_t)*(int32_t*)(addr+=4, addr-4)
// Get if ED will have the correct parity. Not emiting anything. Parity is 2 for DWORD or 3 for QWORD
int getedparity(dynarec_arm_t* dyn, int ninst, uintptr_t addr, uint8_t nextop, int parity, int delta)
{
(void)dyn; (void)ninst;
uint32_t tested = (1<<parity)-1;
if((nextop&0xC0)==0xC0)
return 0; // direct register, no parity...
if(!(nextop&0xC0)) {
if((nextop&7)==4) {
uint8_t sib = F8;
int sib_reg = (sib>>3)&7;
if((sib&0x7)==5) {
uint64_t tmp = F32S64;
if (sib_reg!=4) {
// if XXXXXX+reg<<N then check parity of XXXXX and N should be enough
return ((tmp&tested)==0 && (sib>>6)>=parity)?1:0;
} else {
// just a constant...
return (tmp&tested)?0:1;
}
} else {
if(sib_reg==4 && parity<3)
return 0; // simple [reg]
// don't try [reg1 + reg2<<N], unless reg1 is ESP
return ((sib&0x7)==4 && (sib>>6)>=parity)?1:0;
}
} else if((nextop&7)==5) {
uint64_t tmp = F32S64;
tmp+=addr+delta;
return (tmp&tested)?0:1;
} else {
return 0;
}
} else {
return 0; //Form [reg1 + reg2<<N + XXXXXX]
}
}
// Do the GETED, but don't emit anything...
uintptr_t fakeed(dynarec_arm_t* dyn, uintptr_t addr, int ninst, uint8_t nextop)
{
(void)dyn; (void)addr; (void)ninst;
if((nextop&0xC0)==0xC0)
return addr;
if(!(nextop&0xC0)) {
if((nextop&7)==4) {
uint8_t sib = F8;
if((sib&0x7)==5) {
addr+=4;
}
} else if((nextop&7)==5) {
addr+=4;
}
} else {
if((nextop&7)==4) {
++addr;
}
if(nextop&0x80) {
addr+=4;
} else {
++addr;
}
}
return addr;
}
#undef F8
#undef F32
int isNativeCall(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t* calladdress, int* retn)
{
(void)dyn;
#define PK(a) *(uint8_t*)(addr+a)
#define PK32(a) *(int32_t*)(addr+a)
if(!addr || !getProtection(addr))
return 0;
if(PK(0)==0xff && PK(1)==0x25) { // "absolute" jump, maybe the GOT (well, RIP relative in fact)
uintptr_t a1 = addr + 6 + (PK32(2)); // need to add a check to see if the address is from the GOT !
addr = (uintptr_t)getAlternate(*(void**)a1);
}
if(!addr || !getProtection(addr))
return 0;
onebridge_t *b = (onebridge_t*)(addr);
if(b->CC==0xCC && b->S=='S' && b->C=='C' && b->w!=(wrapper_t)0 && b->f!=(uintptr_t)PltResolver) {
// found !
if(retn) *retn = (b->C3==0xC2)?b->N:0;
if(calladdress) *calladdress = addr+1;
return 1;
}
return 0;
#undef PK32
#undef PK
}
const char* getCacheName(int t, int n)
{
static char buff[20];
switch(t) {
case NEON_CACHE_ST_D: sprintf(buff, "ST%d", n); break;
case NEON_CACHE_ST_F: sprintf(buff, "st%d", n); break;
case NEON_CACHE_MM: sprintf(buff, "MM%d", n); break;
case NEON_CACHE_XMMW: sprintf(buff, "XMM%d", n); break;
case NEON_CACHE_XMMR: sprintf(buff, "xmm%d", n); break;
case NEON_CACHE_SCR: sprintf(buff, "Scratch"); break;
case NEON_CACHE_NONE: buff[0]='\0'; break;
}
return buff;
}
// is inst clean for a son branch?
int isInstClean(dynarec_arm_t* dyn, int ninst)
{
// check flags cache
if(dyn->insts[ninst].f_entry.dfnone || dyn->insts[ninst].f_entry.pending)
return 0;
if(dyn->insts[ninst].x64.state_flags)
return 0;
// check neoncache
neoncache_t* n = &dyn->insts[ninst].n;
if(n->news || n->stack || n->stack_next)
return 0;
for(int i=0; i<24; ++i)
if(n->neoncache[i].v)
return 0;
return 1;
}
+97
View File
@@ -0,0 +1,97 @@
#ifndef __DYNAREC_ARM_FUNCTIONS_H__
#define __DYNAREC_ARM_FUNCTIONS_H__
typedef struct x64emu_s x64emu_t;
void arm_fstp(x64emu_t* emu, void* p);
void arm_print_armreg(x64emu_t* emu, uintptr_t reg, uintptr_t n);
void arm_f2xm1(x64emu_t* emu);
void arm_fyl2x(x64emu_t* emu);
void arm_ftan(x64emu_t* emu);
void arm_fpatan(x64emu_t* emu);
void arm_fxtract(x64emu_t* emu);
void arm_fprem(x64emu_t* emu);
void arm_fyl2xp1(x64emu_t* emu);
void arm_fsincos(x64emu_t* emu);
void arm_frndint(x64emu_t* emu);
void arm_fscale(x64emu_t* emu);
void arm_fsin(x64emu_t* emu);
void arm_fcos(x64emu_t* emu);
void arm_fbld(x64emu_t* emu, uint8_t* ed);
void arm_fild64(x64emu_t* emu, int64_t* ed);
void arm_fbstp(x64emu_t* emu, uint8_t* ed);
void arm_fistp64(x64emu_t* emu, int64_t* ed);
void arm_fistt64(x64emu_t* emu, int64_t* ed);
void arm_fld(x64emu_t* emu, uint8_t* ed);
void arm_fsave(x64emu_t* emu, uint8_t* ed);
void arm_frstor(x64emu_t* emu, uint8_t* ed);
void arm_fprem1(x64emu_t* emu);
void arm_aesd(x64emu_t* emu, int xmm);
void arm_aese(x64emu_t* emu, int xmm);
void arm_aesdlast(x64emu_t* emu, int xmm);
void arm_aeselast(x64emu_t* emu, int xmm);
void arm_aesimc(x64emu_t* emu, int xmm);
void arm_aeskeygenassist(x64emu_t* emu, int gx, int ex, void* p, uint32_t u8);
void arm_pclmul(x64emu_t* emu, int gx, int ex, void* p, uint32_t u8);
void arm_clflush(x64emu_t* emu, void* p);
void arm_ud(x64emu_t* emu);
void arm_priv(x64emu_t* emu);
// Get an FPU scratch reg
int fpu_get_scratch(dynarec_arm_t* dyn);
// Reset scratch regs counter
void fpu_reset_scratch(dynarec_arm_t* dyn);
// Get an x87 double reg
int fpu_get_reg_x87(dynarec_arm_t* dyn, int t, int n);
// Get an MMX double reg
int fpu_get_reg_emm(dynarec_arm_t* dyn, int emm);
// Get an XMM quad reg
int fpu_get_reg_xmm(dynarec_arm_t* dyn, int t, int xmm);
// Free a FPU/MMX/XMM reg
void fpu_free_reg(dynarec_arm_t* dyn, int reg);
// Reset fpu regs counter
void fpu_reset_reg(dynarec_arm_t* dyn);
// ---- Neon cache functions
// Get type for STx
int neoncache_get_st(dynarec_arm_t* dyn, int ninst, int a);
// Get if STx is FLOAT or DOUBLE
int neoncache_get_st_f(dynarec_arm_t* dyn, int ninst, int a);
// Get actual type for STx
int neoncache_get_current_st(dynarec_arm_t* dyn, int ninst, int a);
// Get actual STx is FLOAT or DOUBLE
int neoncache_get_current_st_f(dynarec_arm_t* dyn, int a);
// Back-propagate a change float->double
void neoncache_promote_double(dynarec_arm_t* dyn, int ninst, int a);
// Combine and propagate if needed (pass 1 only)
int neoncache_combine_st(dynarec_arm_t* dyn, int ninst, int a, int b); // with stack current dyn->n_stack*
// FPU Cache transformation (for loops)
int CacheNeedsTransform(dynarec_arm_t* dyn, int i1);
// Undo the changes of a neoncache to get the status before the instruction
void neoncacheUnwind(neoncache_t* cache);
// is inst clean for a son branch?
int isInstClean(dynarec_arm_t* dyn, int ninst);
// predecessor access
int isPred(dynarec_arm_t* dyn, int ninst, int pred);
int getNominalPred(dynarec_arm_t* dyn, int ninst);
// Get if ED will have the correct parity. Not emiting anything. Parity is 2 for DWORD or 3 for QWORD
int getedparity(dynarec_arm_t* dyn, int ninst, uintptr_t addr, uint8_t nextop, int parity, int delta);
// Do the GETED, but don't emit anything...
uintptr_t fakeed(dynarec_arm_t* dyn, uintptr_t addr, int ninst, uint8_t nextop);
// Is what pointed at addr a native call? And if yes, to what function?
int isNativeCall(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t* calladdress, int* retn);
const char* getCacheName(int t, int n);
#endif //__DYNAREC_ARM_FUNCTIONS_H__
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+11
View File
@@ -0,0 +1,11 @@
#include <stdint.h>
#include "arm64_emitter.h"
#define EMIT(A) *block = (A); ++block
void CreateJmpNext(void* addr, void* next)
{
uint32_t* block = (uint32_t*)addr;
LDRx_literal(x2, (intptr_t)next - (intptr_t)addr);
BR(x2);
}
+53
View File
@@ -0,0 +1,53 @@
#define INIT uintptr_t sav_addr=addr
#define FINI \
dyn->isize = addr-sav_addr; \
dyn->insts[ninst].x64.addr = addr; \
if(ninst) dyn->insts[ninst-1].x64.size = dyn->insts[ninst].x64.addr - dyn->insts[ninst-1].x64.addr
#define MESSAGE(A, ...)
#define MAYSETFLAGS() dyn->insts[ninst].x64.may_set = 1
#define READFLAGS(A) \
dyn->insts[ninst].x64.use_flags = A; dyn->f.dfnone = 1;\
dyn->f.pending=SF_SET
#define SETFLAGS(A,B) \
dyn->insts[ninst].x64.set_flags = A; \
dyn->insts[ninst].x64.state_flags = B; \
dyn->f.pending=(B)&SF_SET_PENDING; \
dyn->f.dfnone=((B)&SF_SET)?1:0;
#define EMIT(A)
#define JUMP(A, C) add_next(dyn, (uintptr_t)A); dyn->insts[ninst].x64.jmp = A; dyn->insts[ninst].x64.jmp_cond = C
#define BARRIER(A) if(A!=BARRIER_MAYBE) {fpu_purgecache(dyn, ninst, 0, x1, x2, x3); dyn->insts[ninst].x64.barrier = A;} else dyn->insts[ninst].barrier_maybe = 1
#define BARRIER_NEXT(A) dyn->insts[ninst+1].x64.barrier = A
#define NEW_INST \
++dyn->size; \
if(dyn->size+3>=dyn->cap) { \
dyn->insts = (instruction_native_t*)customRealloc(dyn->insts, sizeof(instruction_native_t)*dyn->cap*2);\
memset(&dyn->insts[dyn->cap], 0, sizeof(instruction_native_t)*dyn->cap); \
dyn->cap *= 2; \
} \
dyn->insts[ninst].x64.addr = ip; \
dyn->n.combined1 = dyn->n.combined2 = 0;\
dyn->n.swapped = 0; dyn->n.barrier = 0; \
dyn->insts[ninst].f_entry = dyn->f; \
if(ninst) {dyn->insts[ninst-1].x64.size = dyn->insts[ninst].x64.addr - dyn->insts[ninst-1].x64.addr;}
#define INST_EPILOG \
dyn->insts[ninst].f_exit = dyn->f; \
dyn->insts[ninst].n = dyn->n; \
dyn->insts[ninst].x64.has_next = (ok>0)?1:0;
#define INST_NAME(name)
#define DEFAULT \
--dyn->size; \
*ok = -1; \
if(box64_dynarec_log>=LOG_INFO) {\
dynarec_log(LOG_NONE, "%p: Dynarec stopped because of Opcode %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X", \
(void*)ip, PKip(0), \
PKip(1), PKip(2), PKip(3), \
PKip(4), PKip(5), PKip(6), \
PKip(7), PKip(8), PKip(9), \
PKip(10),PKip(11),PKip(12), \
PKip(13),PKip(14)); \
printFunctionAddr(ip, " => "); \
dynarec_log(LOG_NONE, "\n"); \
}
+14
View File
@@ -0,0 +1,14 @@
#define INIT
#define FINI
#define MESSAGE(A, ...)
#define EMIT(A)
#define NEW_INST \
dyn->insts[ninst].f_entry = dyn->f; \
dyn->n.combined1 = dyn->n.combined2 = 0;\
dyn->n.swapped = 0; dyn->n.barrier = 0
#define INST_EPILOG \
dyn->insts[ninst].n = dyn->n; \
dyn->insts[ninst].f_exit = dyn->f
#define INST_NAME(name)
+20
View File
@@ -0,0 +1,20 @@
#define INIT dyn->native_size = 0
#define FINI \
if(ninst) { \
dyn->insts[ninst].address = (dyn->insts[ninst-1].address+dyn->insts[ninst-1].size); \
dyn->insts_size += 1+((dyn->insts[ninst].x64.size>dyn->insts[ninst].size)?dyn->insts[ninst].x64.size:dyn->insts[ninst].size)/15; \
}
#define MESSAGE(A, ...)
#define EMIT(A) dyn->insts[ninst].size+=4; dyn->native_size+=4
#define NEW_INST \
if(ninst) { \
dyn->insts[ninst].address = (dyn->insts[ninst-1].address+dyn->insts[ninst-1].size); \
if(isInstClean(dyn, ninst) && dyn->last_ip!=ip) \
dyn->last_ip = 0; \
dyn->insts_size += 1+((dyn->insts[ninst-1].x64.size>dyn->insts[ninst-1].size)?dyn->insts[ninst-1].x64.size:dyn->insts[ninst-1].size)/15; \
}
#define INST_EPILOG dyn->insts[ninst].epilog = dyn->native_size;
#define INST_NAME(name)
#define TABLE64(A, V) {Table64(dyn, (V)); EMIT(0);}
#define FTABLE64(A, V) {mmx87_regs_t v = {.d = V}; Table64(dyn, v.q); EMIT(0);}
+70
View File
@@ -0,0 +1,70 @@
#define INIT
#define FINI \
if(ninst) \
addInst(dyn->instsize, &dyn->insts_size, dyn->insts[ninst].x64.size, dyn->insts[ninst].size/4); \
addInst(dyn->instsize, &dyn->insts_size, 0, 0);
#define EMIT(A) \
if(box64_dynarec_dump) {dynarec_log(LOG_NONE, "\t%08x\t%s\n", (uint32_t)(A), arm64_print(A, (uintptr_t)dyn->block));} \
*(uint32_t*)(dyn->block) = (uint32_t)(A); \
dyn->block += 4; dyn->native_size += 4; \
dyn->insts[ninst].size2 += 4
#define MESSAGE(A, ...) if(box64_dynarec_dump) dynarec_log(LOG_NONE, __VA_ARGS__)
#define NEW_INST \
if(ninst && isInstClean(dyn, ninst)) { \
if(dyn->last_ip!=ip) dyn->last_ip = 0; \
} \
if(ninst) \
addInst(dyn->instsize, &dyn->insts_size, dyn->insts[ninst-1].x64.size, dyn->insts[ninst-1].size/4);
#define INST_EPILOG
#define INST_NAME(name) \
if(box64_dynarec_dump) {\
printf_x64_instruction(my_context->dec, &dyn->insts[ninst].x64, name); \
dynarec_log(LOG_NONE, "%s%p: %d emited opcodes, inst=%d, barrier=%d state=%d/%d(%d), %s=%X/%X, use=%X, need=%X/%X, sm=%d/%d", \
(box64_dynarec_dump>1)?"\e[32m":"", \
(void*)(dyn->native_start+dyn->insts[ninst].address), \
dyn->insts[ninst].size/4, \
ninst, \
dyn->insts[ninst].x64.barrier, \
dyn->insts[ninst].x64.state_flags, \
dyn->f.pending, \
dyn->f.dfnone, \
dyn->insts[ninst].x64.may_set?"may":"set", \
dyn->insts[ninst].x64.set_flags, \
dyn->insts[ninst].x64.gen_flags, \
dyn->insts[ninst].x64.use_flags, \
dyn->insts[ninst].x64.need_before, \
dyn->insts[ninst].x64.need_after, \
dyn->smread, dyn->smwrite); \
if(dyn->insts[ninst].pred_sz) { \
dynarec_log(LOG_NONE, ", pred="); \
for(int ii=0; ii<dyn->insts[ninst].pred_sz; ++ii)\
dynarec_log(LOG_NONE, "%s%d", ii?"/":"", dyn->insts[ninst].pred[ii]);\
} \
if(dyn->insts[ninst].x64.jmp && dyn->insts[ninst].x64.jmp_insts>=0)\
dynarec_log(LOG_NONE, ", jmp=%d", dyn->insts[ninst].x64.jmp_insts);\
if(dyn->insts[ninst].x64.jmp && dyn->insts[ninst].x64.jmp_insts==-1)\
dynarec_log(LOG_NONE, ", jmp=out"); \
if(dyn->last_ip) \
dynarec_log(LOG_NONE, ", last_ip=%p", (void*)dyn->last_ip);\
for(int ii=0; ii<24; ++ii) { \
switch(dyn->insts[ninst].n.neoncache[ii].t) { \
case NEON_CACHE_ST_D: dynarec_log(LOG_NONE, " D%d:%s", ii, getCacheName(dyn->insts[ninst].n.neoncache[ii].t, dyn->insts[ninst].n.neoncache[ii].n)); break; \
case NEON_CACHE_ST_F: dynarec_log(LOG_NONE, " S%d:%s", ii, getCacheName(dyn->insts[ninst].n.neoncache[ii].t, dyn->insts[ninst].n.neoncache[ii].n)); break; \
case NEON_CACHE_MM: dynarec_log(LOG_NONE, " D%d:%s", ii, getCacheName(dyn->insts[ninst].n.neoncache[ii].t, dyn->insts[ninst].n.neoncache[ii].n)); break; \
case NEON_CACHE_XMMW: dynarec_log(LOG_NONE, " Q%d:%s", ii, getCacheName(dyn->insts[ninst].n.neoncache[ii].t, dyn->insts[ninst].n.neoncache[ii].n)); break; \
case NEON_CACHE_XMMR: dynarec_log(LOG_NONE, " Q%d:%s", ii, getCacheName(dyn->insts[ninst].n.neoncache[ii].t, dyn->insts[ninst].n.neoncache[ii].n)); break; \
case NEON_CACHE_SCR: dynarec_log(LOG_NONE, " D%d:%s", ii, getCacheName(dyn->insts[ninst].n.neoncache[ii].t, dyn->insts[ninst].n.neoncache[ii].n)); break; \
case NEON_CACHE_NONE: \
default: break; \
} \
} \
if(dyn->n.stack || dyn->insts[ninst].n.stack_next || dyn->insts[ninst].n.x87stack) \
dynarec_log(LOG_NONE, " X87:%d/%d(+%d/-%d)%d", dyn->n.stack, dyn->insts[ninst].n.stack_next, dyn->insts[ninst].n.stack_push, dyn->insts[ninst].n.stack_pop, dyn->insts[ninst].n.x87stack); \
if(dyn->insts[ninst].n.combined1 || dyn->insts[ninst].n.combined2) \
dynarec_log(LOG_NONE, " %s:%d/%d", dyn->insts[ninst].n.swapped?"SWP":"CMB", dyn->insts[ninst].n.combined1, dyn->insts[ninst].n.combined2); \
dynarec_log(LOG_NONE, "%s\n", (box64_dynarec_dump>1)?"\e[m":""); \
}
#define TABLE64(A, V) {int val64offset = Table64(dyn, (V)); MESSAGE(LOG_DUMP, " Table64: 0x%lx\n", (V)); LDRx_literal(A, val64offset);}
#define FTABLE64(A, V) {mmx87_regs_t v = {.d = V}; int val64offset = Table64(dyn, v.q); MESSAGE(LOG_DUMP, " FTable64: %g\n", v.d); VLDR64_literal(A, val64offset);}
+132
View File
@@ -0,0 +1,132 @@
#ifndef __DYNAREC_ARM_PRIVATE_H_
#define __DYNAREC_ARM_PRIVATE_H_
#include "../dynarec_private.h"
typedef struct x64emu_s x64emu_t;
typedef struct dynablock_s dynablock_t;
typedef struct instsize_s instsize_t;
#define BARRIER_MAYBE 8
#define NEON_CACHE_NONE 0
#define NEON_CACHE_ST_D 1
#define NEON_CACHE_ST_F 2
#define NEON_CACHE_MM 3
#define NEON_CACHE_XMMW 4
#define NEON_CACHE_XMMR 5
#define NEON_CACHE_SCR 6
typedef union neon_cache_s {
int8_t v;
struct {
uint8_t t:4; // reg type
uint8_t n:4; // reg number
};
} neon_cache_t;
typedef union sse_cache_s {
int8_t v;
struct {
uint8_t reg:7;
uint8_t write:1;
};
} sse_cache_t;
typedef struct neoncache_s {
// Neon cache
neon_cache_t neoncache[24];
int8_t stack;
int8_t stack_next;
int8_t stack_pop;
int8_t stack_push;
uint8_t combined1;
uint8_t combined2;
uint8_t swapped; // the combined reg were swapped
uint8_t barrier; // is there a barrier at instruction epilog?
uint32_t news; // bitmask, wich neoncache are new for this opcode
// fpu cache
int8_t x87cache[8]; // cache status for the 8 x87 register behind the fpu stack
int8_t x87reg[8]; // reg used for x87cache entry
int8_t mmxcache[8]; // cache status for the 8 MMX registers
sse_cache_t ssecache[16]; // cache status for the 16 SSE(2) registers
int8_t fpuused[24]; // all 0..24 double reg from fpu, used by x87, sse and mmx
int8_t x87stack; // cache stack counter
int8_t mmxcount; // number of mmx register used (not both mmx and x87 at the same time)
int8_t fpu_scratch; // scratch counter
int8_t fpu_extra_qscratch; // some opcode need an extra quad scratch register
int8_t fpu_reg; // x87/sse/mmx reg counter
} neoncache_t;
typedef struct flagcache_s {
int pending; // is there a pending flags here, or to check?
int dfnone; // if defered flags is already set to df_none
} flagcache_t;
typedef struct instruction_arm64_s {
instruction_x64_t x64;
uintptr_t address; // (start) address of the arm emited instruction
uintptr_t epilog; // epilog of current instruction (can be start of next, or barrier stuff)
int size; // size of the arm emited instruction
int size2; // size of the arm emited instrucion after pass2
int pred_sz; // size of predecessor list
int *pred; // predecessor array
uintptr_t mark, mark2, mark3;
uintptr_t markf;
uintptr_t markseg;
uintptr_t marklock;
int pass2choice;// value for choices that are fixed on pass2 for pass3
uintptr_t natcall;
int retn;
int barrier_maybe;
flagcache_t f_exit; // flags status at end of intruction
neoncache_t n; // neoncache at end of intruction (but before poping)
flagcache_t f_entry; // flags status before the instruction begin
} instruction_arm64_t;
typedef struct dynarec_arm_s {
instruction_arm64_t*insts;
int32_t size;
int32_t cap;
uintptr_t start; // start of the block
uint32_t isize; // size in byte of x64 instructions included
void* block; // memory pointer where next instruction is emited
uintptr_t native_start; // start of the arm code
size_t native_size; // size of emitted arm code
uintptr_t last_ip; // last set IP in RIP (or NULL if unclean state) TODO: move to a cache something
uint64_t* table64; // table of 64bits value
int table64size;// size of table (will be appended at end of executable code)
int table64cap;
uintptr_t tablestart;
flagcache_t f;
neoncache_t n; // cache for the 8..31 double reg from fpu, plus x87 stack delta
uintptr_t* next; // variable array of "next" jump address
int next_sz;
int next_cap;
int* predecessor;// single array of all predecessor
dynablock_t* dynablock;
instsize_t* instsize;
size_t insts_size; // size of the instruction size array (calculated)
uint8_t smread; // for strongmem model emulation
uint8_t smwrite; // for strongmem model emulation
uintptr_t forward; // address of the last end of code while testing forward
uintptr_t forward_to; // address of the next jump to (to check if everything is ok)
int32_t forward_size; // size at the forward point
int forward_ninst; // ninst at the forward point
} dynarec_arm_t;
void add_next(dynarec_arm_t *dyn, uintptr_t addr);
uintptr_t get_closest_next(dynarec_arm_t *dyn, uintptr_t addr);
int is_nops(dynarec_arm_t *dyn, uintptr_t addr, int n);
int is_instructions(dynarec_arm_t *dyn, uintptr_t addr, int n);
int Table64(dynarec_arm_t *dyn, uint64_t val); // add a value to etable64 (if needed) and gives back the imm19 to use in LDR_literal
void CreateJmpNext(void* addr, void* next);
#define GO_TRACE() \
GETIP_(ip); \
MOVx_REG(x1, xRIP); \
STORE_XEMU_CALL(xRIP); \
MOV32w(x2, 1); \
CALL(PrintTrace, -1); \
LOAD_XEMU_CALL(xRIP)
#endif //__DYNAREC_ARM_PRIVATE_H_
+271
View File
@@ -0,0 +1,271 @@
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <errno.h>
#include <setjmp.h>
#include <sys/mman.h>
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "emu/x64emu_private.h"
#include "tools/bridge_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
#include "emu/x64run_private.h"
#include "x64trace.h"
#include "dynablock.h"
#include "dynablock_private.h"
#include "dynarec_private.h"
#include "elfloader.h"
#include "bridge.h"
#include "dynarec_native.h"
#include "native_lock.h"
#include "custommem.h"
#include "khash.h"
uint32_t X31_hash_code(void* addr, int len)
{
if(!len) return 0;
uint8_t* p = (uint8_t*)addr;
int32_t h = *p;
for (--len, ++p; len; --len, ++p) h = (h << 5) - h + (int32_t)*p;
return (uint32_t)h;
}
void FreeDynablock(dynablock_t* db, int need_lock)
{
if(db) {
if(db->gone)
return; // already in the process of deletion!
dynarec_log(LOG_DEBUG, "FreeDynablock(%p), db->block=%p x64=%p:%p already gone=%d\n", db, db->block, db->x64_addr, db->x64_addr+db->x64_size-1, db->gone);
if(need_lock)
mutex_lock(&my_context->mutex_dyndump);
// remove jumptable
setJumpTableDefault64(db->x64_addr);
dynarec_log(LOG_DEBUG, " -- FreeDyrecMap(%p, %d)\n", db->actual_block, db->size);
db->done = 0;
db->gone = 1;
FreeDynarecMap((uintptr_t)db->actual_block);
customFree(db);
if(need_lock)
mutex_unlock(&my_context->mutex_dyndump);
}
}
void MarkDynablock(dynablock_t* db)
{
if(db) {
if(db->need_test)
return; // already done
dynarec_log(LOG_DEBUG, "MarkDynablock %p %p-%p\n", db, db->x64_addr, db->x64_addr+db->x64_size-1);
db->need_test = 1;
setJumpTableIfRef64(db->x64_addr, db->jmpnext, db->block);
}
}
static int IntervalIntersects(uintptr_t start1, uintptr_t end1, uintptr_t start2, uintptr_t end2)
{
if(start1 > end2 || start2 > end1)
return 0;
return 1;
}
static int MarkedDynablock(dynablock_t* db)
{
if(db) {
if(db->need_test)
return 1; // already done
}
return 0;
}
void MarkRangeDynablock(dynablock_t* db, uintptr_t addr, uintptr_t size)
{
// Mark will try to find *any* blocks that intersect the range to mark
if(!db)
return;
dynarec_log(LOG_DEBUG, "MarkRangeDynablock %p-%p .. startdb=%p, sizedb=%p\n", (void*)addr, (void*)addr+size-1, (void*)db->x64_addr, (void*)db->x64_size);
if(!MarkedDynablock(db))
if(IntervalIntersects((uintptr_t)db->x64_addr, (uintptr_t)db->x64_addr+db->x64_size-1, addr, addr+size+1))
MarkDynablock(db);
}
int FreeRangeDynablock(dynablock_t* db, uintptr_t addr, uintptr_t size)
{
if(!db)
return 1;
int need_lock = my_context?1:0;
if(IntervalIntersects((uintptr_t)db->x64_addr, (uintptr_t)db->x64_addr+db->x64_size-1, addr, addr+size+1)) {
FreeDynablock(db, need_lock);
return 0;
}
return 1;
}
dynablock_t *AddNewDynablock(uintptr_t addr)
{
dynablock_t* block;
#if 0
// check if memory as the correct flags
int prot = getProtection(addr);
if(!(prot&(PROT_EXEC|PROT_DYNAREC|PROT_DYNAREC_R))) {
dynarec_log(LOG_VERBOSE, "Block asked on a memory with no execution flags 0x%02X\n", prot);
return NULL;
}
#endif
// create and add new block
dynarec_log(LOG_VERBOSE, "Ask for DynaRec Block creation @%p\n", (void*)addr);
block = (dynablock_t*)customCalloc(1, sizeof(dynablock_t));
return block;
}
//TODO: move this to dynrec_arm.c and track allocated structure to avoid memory leak
static __thread struct __jmp_buf_tag dynarec_jmpbuf;
void cancelFillBlock()
{
longjmp(&dynarec_jmpbuf, 1);
}
/*
return NULL if block is not found / cannot be created.
Don't create if create==0
*/
static dynablock_t* internalDBGetBlock(x64emu_t* emu, uintptr_t addr, uintptr_t filladdr, int create, int need_lock)
{
if(hasAlternate((void*)addr))
return NULL;
dynablock_t* block = getDB(addr);
if(block || !create)
return block;
if(need_lock) {
if(box64_dynarec_wait) {
mutex_lock(&my_context->mutex_dyndump);
} else {
if(mutex_trylock(&my_context->mutex_dyndump)) // FillBlock not available for now
return NULL;
}
}
block = getDB(addr); // just in case
if(block) {
if(need_lock)
mutex_unlock(&my_context->mutex_dyndump);
return block;
}
block = AddNewDynablock(addr);
// fill the block
block->x64_addr = (void*)addr;
if(sigsetjmp(&dynarec_jmpbuf, 1)) {
printf_log(LOG_INFO, "FillBlock at %p triggered a segfault, cancelling\n", (void*)addr);
if(need_lock)
mutex_unlock(&my_context->mutex_dyndump);
return NULL;
}
void* ret = FillBlock64(block, filladdr);
if(!ret) {
dynarec_log(LOG_DEBUG, "Fillblock of block %p for %p returned an error\n", block, (void*)addr);
customFree(block);
block = NULL;
}
// check size
if(block && (block->x64_size || (!block->x64_size && !block->done))) {
int blocksz = block->x64_size;
if(blocksz>my_context->max_db_size)
my_context->max_db_size = blocksz;
// fill-in jumptable
if(!addJumpTableIfDefault64(block->x64_addr, block->block)) {
FreeDynablock(block, 0);
block = getDB(addr);
} else {
if(block->x64_size)
block->done = 1; // don't validate the block if the size is null, but keep the block
}
}
if(need_lock)
mutex_unlock(&my_context->mutex_dyndump);
dynarec_log(LOG_DEBUG, "%04d| --- DynaRec Block created @%p:%p (%p, 0x%x bytes)\n", GetTID(), (void*)addr, (void*)(addr+((block)?block->x64_size:1)-1), (block)?block->block:0, (block)?block->size:0);
return block;
}
dynablock_t* DBGetBlock(x64emu_t* emu, uintptr_t addr, int create)
{
dynablock_t *db = internalDBGetBlock(emu, addr, addr, create, 1);
if(db && db->done && db->block && db->need_test) {
if(AreaInHotPage((uintptr_t)db->x64_addr, (uintptr_t)db->x64_addr + db->x64_size - 1)) {
if(box64_dynarec_fastpage) {
uint32_t hash = X31_hash_code(db->x64_addr, db->x64_size);
if(hash==db->hash) // seems ok, run it without reprotecting it
return db;
db->done = 0; // invalidating the block, it's already not good
dynarec_log(LOG_DEBUG, "Invalidating block %p from %p:%p (hash:%X/%X) for %p\n", db, db->x64_addr, db->x64_addr+db->x64_size-1, hash, db->hash, (void*)addr);
// Free db, it's now invalid!
FreeDynablock(db, 1);
return NULL; // not building a new one, it's still a hotpage
} else {
dynarec_log(LOG_INFO, "Not running block %p from %p:%p with for %p because it's in a hotpage\n", db, db->x64_addr, db->x64_addr+db->x64_size-1, (void*)addr);
return NULL;
}
}
uint32_t hash = X31_hash_code(db->x64_addr, db->x64_size);
if(mutex_trylock(&my_context->mutex_dyndump)) {
dynarec_log(LOG_DEBUG, "mutex_dyndump not available when trying to validate block %p from %p:%p (hash:%X) for %p\n", db, db->x64_addr, db->x64_addr+db->x64_size-1, db->hash, (void*)addr);
return NULL;
}
if(hash!=db->hash) {
db->done = 0; // invalidating the block
dynarec_log(LOG_DEBUG, "Invalidating block %p from %p:%p (hash:%X/%X) for %p\n", db, db->x64_addr, db->x64_addr+db->x64_size-1, hash, db->hash, (void*)addr);
// Free db, it's now invalid!
FreeDynablock(db, 0);
// start again... (will create a new block)
db = internalDBGetBlock(emu, addr, addr, create, 0);
} else {
db->need_test = 0;
dynarec_log(LOG_DEBUG, "Validating block %p from %p:%p (hash:%X) for %p\n", db, db->x64_addr, db->x64_addr+db->x64_size-1, db->hash, (void*)addr);
protectDB((uintptr_t)db->x64_addr, db->x64_size);
// fill back jumptable
setJumpTableIfRef64(db->x64_addr, db->block, db->jmpnext);
}
mutex_unlock(&my_context->mutex_dyndump);
}
return db;
}
dynablock_t* DBAlternateBlock(x64emu_t* emu, uintptr_t addr, uintptr_t filladdr)
{
dynarec_log(LOG_DEBUG, "Creating AlternateBlock at %p for %p\n", (void*)addr, (void*)filladdr);
int create = 1;
dynablock_t *db = internalDBGetBlock(emu, addr, filladdr, create, 1);
if(db && db->done && db->block && db->need_test) {
if(mutex_trylock(&my_context->mutex_dyndump))
return NULL;
uint32_t hash = X31_hash_code(db->x64_addr, db->x64_size);
if(hash!=db->hash) {
db->done = 0; // invalidating the block
dynarec_log(LOG_DEBUG, "Invalidating alt block %p from %p:%p (hash:%X/%X) for %p\n", db, db->x64_addr, db->x64_addr+db->x64_size, hash, db->hash, (void*)addr);
// Free db, it's now invalid!
FreeDynablock(db, 0);
// start again... (will create a new block)
db = internalDBGetBlock(emu, addr, filladdr, create, 0);
} else {
db->need_test = 0;
protectDB((uintptr_t)db->x64_addr, db->x64_size);
// fill back jumptable
addJumpTableIfDefault64(db->x64_addr, db->block);
}
mutex_unlock(&my_context->mutex_dyndump);
}
return db;
}
+25
View File
@@ -0,0 +1,25 @@
#ifndef __DYNABLOCK_PRIVATE_H_
#define __DYNABLOCK_PRIVATE_H_
typedef struct instsize_s {
unsigned char x64:4;
unsigned char nat:4;
} instsize_t;
typedef struct dynablock_s {
void* block; // block-sizeof(void*) == self
void* actual_block; // the actual start of the block (so block-sizeof(void*))
int size;
void* x64_addr;
uintptr_t x64_size;
uint32_t hash;
uint8_t need_test;
uint8_t done;
uint8_t gone;
uint8_t dummy;
int isize;
instsize_t* instsize;
void* jmpnext; // a branch jmpnext code when block is marked
} dynablock_t;
#endif //__DYNABLOCK_PRIVATE_H_
+56 -48
View File
@@ -19,51 +19,65 @@
#ifdef DYNAREC
#include "dynablock.h"
#include "dynablock_private.h"
#include "bridge.h"
#include "dynarec_next.h"
#endif
#ifdef DYNAREC
#ifdef ARM
void arm_prolog(x64emu_t* emu, void* addr) EXPORTDYN;
void arm_epilog() EXPORTDYN;
void arm_epilog_fast() EXPORTDYN;
#endif
#endif
#ifdef DYNAREC
#ifdef HAVE_TRACE
uintptr_t getX64Address(dynablock_t* db, uintptr_t arm_addr);
#include "elfloader.h"
#endif
void* LinkNext(x64emu_t* emu, uintptr_t addr, void* x2)
#ifdef DYNAREC
uintptr_t getX64Address(dynablock_t* db, uintptr_t arm_addr);
void* LinkNext(x64emu_t* emu, uintptr_t addr, void* x2, uintptr_t* x3)
{
#ifdef HAVE_TRACE
if(!addr) {
x2-=8; // actual PC is 2 instructions ahead
dynablock_t* db = FindDynablockFromNativeAddress(x2);
printf_log(LOG_NONE, "Warning, jumping to NULL address from %p (db=%p, x86addr=%p)\n", x2, db, db?(void*)getX86Address(db, (uintptr_t)x2):NULL);
dynablock_t* db = FindDynablockFromNativeAddress(x2-4);
printf_log(LOG_NONE, "Warning, jumping to NULL address from %p (db=%p, x64addr=%p/%s)\n", x2-4, db, db?(void*)getX64Address(db, (uintptr_t)x2-4):NULL, db?getAddrFunctionName(getX64Address(db, (uintptr_t)x2-4)):"(nil)");
}
#endif
dynablock_t* current = NULL;
void * jblock;
dynablock_t* block = DBGetBlock(emu, addr, 1, &current);
dynablock_t* block = DBGetBlock(emu, addr, 1);
if(!block) {
// no block, let link table as is...
//tableupdate(arm_epilog, addr, table);
return arm_epilog;
if(hasAlternate((void*)addr)) {
printf_log(LOG_DEBUG, "Jmp address has alternate: %p", (void*)addr);
if(box64_log<LOG_DEBUG) dynarec_log(LOG_INFO, "Jmp address has alternate: %p", (void*)addr);
addr = (uintptr_t)getAlternate((void*)addr); // set new address
R_RIP = addr; // but also new RIP!
*x3 = addr; // and the RIP in x27 register
printf_log(LOG_DEBUG, " -> %p\n", (void*)addr);
block = DBGetBlock(emu, addr, 1);
}
if(!block) {
#ifdef HAVE_TRACE
dynablock_t* db = FindDynablockFromNativeAddress(x2-4);
elfheader_t* h = FindElfAddress(my_context, (uintptr_t)x2-4);
dynarec_log(LOG_INFO, "Warning, jumping to a no-block address %p from %p (db=%p, x64addr=%p(elf=%s))\n", (void*)addr, x2-4, db, db?(void*)getX64Address(db, (uintptr_t)x2-4):NULL, h?ElfName(h):"(none)");
#endif
//tableupdate(native_epilog, addr, table);
return native_epilog;
}
}
if(!block->done) {
// not finished yet... leave linker
//tableupdate(arm_linker, addr, table);
return arm_epilog;
return native_epilog;
}
if(!(jblock=block->block)) {
// null block, but done: go to epilog, no linker here
return arm_epilog;
return native_epilog;
}
//dynablock_t *father = block->father?block->father:block;
return jblock;
}
#endif
#ifdef __GNUC__
// Disable "clobbered" warnings
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wclobbered"
#endif
void DynaCall(x64emu_t* emu, uintptr_t addr)
{
// prepare setjump for signal handling
@@ -75,14 +89,14 @@ void DynaCall(x64emu_t* emu, uintptr_t addr)
ejb->emu = emu;
ejb->jmpbuf_ok = 1;
jmpbuf_reset = 1;
if(setjmp((struct __jmp_buf_tag*)ejb->jmpbuf)) {
if(sigsetjmp((struct __jmp_buf_tag*)ejb->jmpbuf, 1)) {
printf_log(LOG_DEBUG, "Setjmp DynaCall, fs=0x%x\n", ejb->emu->segs[_FS]);
addr = R_RIP; // not sure if it should still be inside DynaCall!
}
}
}
#ifdef DYNAREC
if(!box86_dynarec)
if(!box64_dynarec)
#endif
EmuCall(emu, addr);
#ifdef DYNAREC
@@ -96,35 +110,30 @@ void DynaCall(x64emu_t* emu, uintptr_t addr)
PushExit(emu);
R_RIP = addr;
emu->df = d_none;
dynablock_t* block = NULL;
dynablock_t* current = NULL;
while(!emu->quit) {
block = DBGetBlock(emu, R_RIP, 1, &current);
current = block;
dynablock_t* block = DBGetBlock(emu, R_RIP, 1);
if(!block || !block->block || !block->done) {
// no block, of block doesn't have DynaRec content (yet, temp is not null)
// Use interpreter (should use single instruction step...)
dynarec_log(LOG_DEBUG, "%04d|Calling Interpretor @%p, emu=%p\n", GetTID(), (void*)R_RIP, emu);
Run(emu, 1);
} else {
dynarec_log(LOG_DEBUG, "%04d|Calling DynaRec Block @%p (%p) of %d x86 instructions (father=%p) emu=%p\n", GetTID(), (void*)R_RIP, block->block, block->isize ,block->father, emu);
dynarec_log(LOG_DEBUG, "%04d|Calling DynaRec Block @%p (%p) of %d x64 instructions emu=%p\n", GetTID(), (void*)R_RIP, block->block, block->isize ,emu);
CHECK_FLAGS(emu);
// block is here, let's run it!
#ifdef ARM
arm_prolog(emu, block->block);
#endif
native_prolog(emu, block->block);
}
if(emu->fork) {
int forktype = emu->fork;
emu->quit = 0;
emu->fork = 0;
emu = x86emu_fork(emu, forktype);
emu = x64emu_fork(emu, forktype);
if(emu->type == EMUTYPE_MAIN) {
ejb = GetJmpBuf();
ejb->emu = emu;
ejb->jmpbuf_ok = 1;
jmpbuf_reset = 1;
if(setjmp((struct __jmp_buf_tag*)ejb->jmpbuf)) {
if(sigsetjmp((struct __jmp_buf_tag*)ejb->jmpbuf, 1)) {
printf_log(LOG_DEBUG, "Setjmp inner DynaCall, fs=0x%x\n", ejb->emu->segs[_FS]);
addr = R_RIP;
}
@@ -134,7 +143,8 @@ void DynaCall(x64emu_t* emu, uintptr_t addr)
emu->quit = 0; // reset Quit flags...
emu->df = d_none;
if(emu->quitonlongjmp && emu->longjmp) {
emu->longjmp = 0; // don't change anything because of the longjmp
if(emu->quitonlongjmp==1)
emu->longjmp = 0; // don't change anything because of the longjmp
} else {
R_RBX = old_rbx;
R_RDI = old_rdi;
@@ -165,44 +175,39 @@ int DynaRun(x64emu_t* emu)
#ifdef DYNAREC
jmpbuf_reset = 1;
#endif
if(setjmp((struct __jmp_buf_tag*)ejb->jmpbuf))
if(sigsetjmp((struct __jmp_buf_tag*)ejb->jmpbuf, 1))
printf_log(LOG_DEBUG, "Setjmp DynaRun, fs=0x%x\n", ejb->emu->segs[_FS]);
}
}
#ifdef DYNAREC
if(!box86_dynarec)
if(!box64_dynarec)
#endif
return Run(emu, 0);
#ifdef DYNAREC
else {
dynablock_t* block = NULL;
dynablock_t* current = NULL;
while(!emu->quit) {
block = DBGetBlock(emu, R_RIP, 1, &current);
current = block;
dynablock_t* block = DBGetBlock(emu, R_RIP, 1);
if(!block || !block->block || !block->done) {
// no block, of block doesn't have DynaRec content (yet, temp is not null)
// Use interpreter (should use single instruction step...)
dynarec_log(LOG_DEBUG, "%04d|Running Interpretor @%p, emu=%p\n", GetTID(), (void*)R_RIP, emu);
Run(emu, 1);
} else {
dynarec_log(LOG_DEBUG, "%04d|Running DynaRec Block @%p (%p) of %d x86 insts (father=%p) emu=%p\n", GetTID(), (void*)R_RIP, block->block, block->isize, block->father, emu);
dynarec_log(LOG_DEBUG, "%04d|Running DynaRec Block @%p (%p) of %d x64 insts emu=%p\n", GetTID(), (void*)R_RIP, block->block, block->isize, emu);
// block is here, let's run it!
#ifdef ARM
arm_prolog(emu, block->block);
#endif
native_prolog(emu, block->block);
}
if(emu->fork) {
int forktype = emu->fork;
emu->quit = 0;
emu->fork = 0;
emu = x86emu_fork(emu, forktype);
emu = x64emu_fork(emu, forktype);
if(emu->type == EMUTYPE_MAIN) {
ejb = GetJmpBuf();
ejb->emu = emu;
ejb->jmpbuf_ok = 1;
jmpbuf_reset = 1;
if(setjmp((struct __jmp_buf_tag*)ejb->jmpbuf))
if(sigsetjmp((struct __jmp_buf_tag*)ejb->jmpbuf, 1))
printf_log(LOG_DEBUG, "Setjmp inner DynaRun, fs=0x%x\n", ejb->emu->segs[_FS]);
}
}
@@ -213,4 +218,7 @@ int DynaRun(x64emu_t* emu)
ejb->jmpbuf_ok = 0;
return 0;
#endif
}
}
#ifdef __GNUC__
#pragma GCC diagnostic pop
#endif
+25
View File
@@ -0,0 +1,25 @@
#ifndef __DYNAREC_ARCH__H_
#define __DYNAREC_ARCH__H_
#ifdef ARM64
#include "arm64/arm64_printer.h"
#include "arm64/dynarec_arm64_private.h"
#include "arm64/dynarec_arm64_functions.h"
#define instruction_native_t instruction_arm64_t
#define dynarec_native_t dynarec_arm_t
#elif defined(LA464)
#include "la464/la464_printer.h"
#include "la464/dynarec_la464_private.h"
#include "la464/dynarec_la464_functions.h"
#define instruction_native_t instruction_la464_t
#define dynarec_native_t dynarec_la464_t
#else
#error Unsupported platform
#endif
#endif //__DYNAREC_ARCH__H_
+12
View File
@@ -0,0 +1,12 @@
#ifndef __DYNAREC_HELPER__H_
#define __DYNAREC_HELPER__H_
#ifdef ARM64
#include "arm64/dynarec_arm64_helper.h"
#elif defined(LA464)
#include "la464/dynarec_la464_helper.h"
#else
#error Unsupported architecture
#endif
#endif //__DYNAREC_HELPER__H_
+608
View File
@@ -0,0 +1,608 @@
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <errno.h>
#include <string.h>
#include <assert.h>
#include "debug.h"
#include "box64context.h"
#include "custommem.h"
#include "dynarec.h"
#include "emu/x64emu_private.h"
#include "tools/bridge_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "callback.h"
#include "emu/x64run_private.h"
#include "x64trace.h"
#include "dynablock.h"
#include "dynablock_private.h"
#include "elfloader.h"
#include "dynarec_native.h"
#include "dynarec_arch.h"
#include "dynarec_next.h"
void printf_x64_instruction(zydis_dec_t* dec, instruction_x64_t* inst, const char* name) {
uint8_t *ip = (uint8_t*)inst->addr;
if(ip[0]==0xcc && ip[1]=='S' && ip[2]=='C') {
uintptr_t a = *(uintptr_t*)(ip+3);
if(a==0) {
dynarec_log(LOG_NONE, "%s%p: Exit x64emu%s\n", (box64_dynarec_dump>1)?"\e[01;33m":"", (void*)ip, (box64_dynarec_dump>1)?"\e[m":"");
} else {
dynarec_log(LOG_NONE, "%s%p: Native call to %p%s\n", (box64_dynarec_dump>1)?"\e[01;33m":"", (void*)ip, (void*)a, (box64_dynarec_dump>1)?"\e[m":"");
}
} else {
if(dec) {
dynarec_log(LOG_NONE, "%s%p: %s", (box64_dynarec_dump>1)?"\e[01;33m":"", ip, DecodeX64Trace(dec, inst->addr));
} else {
dynarec_log(LOG_NONE, "%s%p: ", (box64_dynarec_dump>1)?"\e[01;33m":"", ip);
for(int i=0; i<inst->size; ++i) {
dynarec_log(LOG_NONE, "%02X ", ip[i]);
}
dynarec_log(LOG_NONE, " %s", name);
}
// print Call function name if possible
if(ip[0]==0xE8 || ip[0]==0xE9) { // Call / Jmp
uintptr_t nextaddr = (uintptr_t)ip + 5 + *((int32_t*)(ip+1));
printFunctionAddr(nextaddr, "=> ");
} else if(ip[0]==0xFF) {
if(ip[1]==0x25) {
uintptr_t nextaddr = (uintptr_t)ip + 6 + *((int32_t*)(ip+2));
printFunctionAddr(nextaddr, "=> ");
}
}
// end of line and colors
dynarec_log(LOG_NONE, "%s\n", (box64_dynarec_dump>1)?"\e[m":"");
}
}
void add_next(dynarec_native_t *dyn, uintptr_t addr) {
if(!box64_dynarec_bigblock)
return;
// exist?
for(int i=0; i<dyn->next_sz; ++i)
if(dyn->next[i]==addr)
return;
// put in a free slot
for(int i=0; i<dyn->next_sz; ++i)
if(!dyn->next[i]) {
dyn->next[i] = addr;
return;
}
// add slots
if(dyn->next_sz == dyn->next_cap) {
dyn->next_cap += 64;
dyn->next = (uintptr_t*)customRealloc(dyn->next, dyn->next_cap*sizeof(uintptr_t));
}
dyn->next[dyn->next_sz++] = addr;
}
uintptr_t get_closest_next(dynarec_native_t *dyn, uintptr_t addr) {
// get closest, but no addresses befores
uintptr_t best = 0;
int i = 0;
while((i<dyn->next_sz) && (best!=addr)) {
if(dyn->next[i]<addr) { // remove the address, it's before current address
dyn->next[i] = 0;
} else {
if((dyn->next[i]<best) || !best)
best = dyn->next[i];
}
++i;
}
return best;
}
#define PK(A) (*((uint8_t*)(addr+(A))))
int is_nops(dynarec_native_t *dyn, uintptr_t addr, int n)
{
if(!n)
return 1;
if(PK(0)==0x90)
return is_nops(dyn, addr+1, n-1);
if(n>1 && PK(0)==0x66) // if opcode start with 0x66, and there is more after, than is *can* be a NOP
return is_nops(dyn, addr+1, n-1);
if(n>2 && PK(0)==0x0f && PK(1)==0x1f && PK(2)==0x00)
return is_nops(dyn, addr+3, n-3);
if(n>2 && PK(0)==0x8d && PK(1)==0x76 && PK(2)==0x00) // lea esi, [esi]
return is_nops(dyn, addr+3, n-3);
if(n>3 && PK(0)==0x0f && PK(1)==0x1f && PK(2)==0x40 && PK(3)==0x00)
return is_nops(dyn, addr+4, n-4);
if(n>3 && PK(0)==0x8d && PK(1)==0x74 && PK(2)==0x26 && PK(3)==0x00)
return is_nops(dyn, addr+4, n-4);
if(n>4 && PK(0)==0x0f && PK(1)==0x1f && PK(2)==0x44 && PK(3)==0x00 && PK(4)==0x00)
return is_nops(dyn, addr+5, n-5);
if(n>5 && PK(0)==0x8d && PK(1)==0xb6 && PK(2)==0x00 && PK(3)==0x00 && PK(4)==0x00 && PK(5)==0x00)
return is_nops(dyn, addr+6, n-6);
if(n>6 && PK(0)==0x0f && PK(1)==0x1f && PK(2)==0x80 && PK(3)==0x00 && PK(4)==0x00 && PK(5)==0x00 && PK(6)==0x00)
return is_nops(dyn, addr+7, n-7);
if(n>6 && PK(0)==0x8d && PK(1)==0xb4 && PK(2)==0x26 && PK(3)==0x00 && PK(4)==0x00 && PK(5)==0x00 && PK(6)==0x00) // lea esi, [esi+0]
return is_nops(dyn, addr+7, n-7);
if(n>7 && PK(0)==0x0f && PK(1)==0x1f && PK(2)==0x84 && PK(3)==0x00 && PK(4)==0x00 && PK(5)==0x00 && PK(6)==0x00 && PK(7)==0x00)
return is_nops(dyn, addr+8, n-8);
return 0;
}
// return size of next instuciton, -1 is unknown
// not all instrction are setup
int next_instruction(dynarec_native_t *dyn, uintptr_t addr)
{
uint8_t opcode = PK(0);
uint8_t nextop;
switch (opcode) {
case 0x66:
opcode = PK(1);
switch(opcode) {
case 0x90:
return 2;
}
break;
case 0x81:
nextop = PK(1);
return fakeed(dyn, addr+2, 0, nextop)-addr + 4;
case 0x83:
nextop = PK(1);
return fakeed(dyn, addr+2, 0, nextop)-addr + 1;
case 0x84:
case 0x85:
case 0x88:
case 0x89:
case 0x8A:
case 0x8B:
case 0x8C:
case 0x8D:
case 0x8E:
case 0x8F:
nextop = PK(1);
return fakeed(dyn, addr+2, 0, nextop)-addr;
case 0x50:
case 0x51:
case 0x52:
case 0x53:
case 0x54:
case 0x55:
case 0x56:
case 0x57:
case 0x58:
case 0x59:
case 0x5A:
case 0x5B:
case 0x5C:
case 0x5D:
case 0x5E:
case 0x5F:
case 0x90:
case 0x91:
case 0x92:
case 0x93:
case 0x94:
case 0x95:
case 0x96:
case 0x97:
case 0x98:
case 0x99:
case 0x9B:
case 0x9C:
case 0x9D:
case 0x9E:
case 0x9F:
return 1;
case 0xA0:
case 0xA1:
case 0xA2:
case 0xA3:
return 5;
case 0xB0:
case 0xB1:
case 0xB2:
case 0xB3:
case 0xB4:
case 0xB5:
case 0xB6:
case 0xB7:
return 2;
case 0xB8:
case 0xB9:
case 0xBA:
case 0xBB:
case 0xBC:
case 0xBD:
case 0xBE:
case 0xBF:
return 5;
case 0xFF:
nextop = PK(1);
switch((nextop>>3)&7) {
case 0: // INC Ed
case 1: //DEC Ed
case 2: // CALL Ed
case 4: // JMP Ed
case 6: // Push Ed
return fakeed(dyn, addr+2, 0, nextop)-addr;
}
break;
default:
break;
}
return -1;
}
#undef PK
int is_instructions(dynarec_native_t *dyn, uintptr_t addr, int n)
{
int i = 0;
while(i<n) {
int j=next_instruction(dyn, addr+i);
if(j<=0) return 0;
i+=j;
}
return (i==n)?1:0;
}
void addInst(instsize_t* insts, size_t* size, int x64_size, int native_size)
{
// x64 instruction is <16 bytes
int toadd;
if(x64_size>native_size)
toadd = 1 + x64_size/15;
else
toadd = 1 + native_size/15;
while(toadd) {
if(x64_size>15)
insts[*size].x64 = 15;
else
insts[*size].x64 = x64_size;
x64_size -= insts[*size].x64;
if(native_size>15)
insts[*size].nat = 15;
else
insts[*size].nat = native_size;
native_size -= insts[*size].nat;
++(*size);
--toadd;
}
}
// add a value to table64 (if needed) and gives back the imm19 to use in LDR_literal
int Table64(dynarec_native_t *dyn, uint64_t val)
{
// find the value if already present
int idx = -1;
for(int i=0; i<dyn->table64size && (idx==-1); ++i)
if(dyn->table64[i] == val)
idx = i;
// not found, add it
if(idx==-1) {
if(dyn->table64size == dyn->table64cap) {
dyn->table64cap+=16;
dyn->table64 = (uint64_t*)customRealloc(dyn->table64, dyn->table64cap * sizeof(uint64_t));
}
idx = dyn->table64size++;
dyn->table64[idx] = val;
}
// calculate offset
int delta = dyn->tablestart + idx*sizeof(uint64_t) - (uintptr_t)dyn->block;
return delta;
}
static void fillPredecessors(dynarec_native_t* dyn)
{
int pred_sz = 1; // to be safe
// compute total size of predecessor to alocate the array
// first compute the jumps
for(int i=0; i<dyn->size; ++i) {
if(dyn->insts[i].x64.jmp && (dyn->insts[i].x64.jmp_insts!=-1)) {
pred_sz++;
dyn->insts[dyn->insts[i].x64.jmp_insts].pred_sz++;
}
}
// second the "has_next"
for(int i=0; i<dyn->size-1; ++i) {
if(dyn->insts[i].x64.has_next) {
pred_sz++;
dyn->insts[i+1].pred_sz++;
}
}
dyn->predecessor = (int*)customMalloc(pred_sz*sizeof(int));
// fill pred pointer
int* p = dyn->predecessor;
for(int i=0; i<dyn->size; ++i) {
dyn->insts[i].pred = p;
p += dyn->insts[i].pred_sz;
dyn->insts[i].pred_sz=0; // reset size, it's reused to actually fill pred[]
}
// fill pred
for(int i=0; i<dyn->size; ++i) {
if((i!=dyn->size-1) && dyn->insts[i].x64.has_next)
dyn->insts[i+1].pred[dyn->insts[i+1].pred_sz++] = i;
if(dyn->insts[i].x64.jmp && (dyn->insts[i].x64.jmp_insts!=-1)) {
int j = dyn->insts[i].x64.jmp_insts;
dyn->insts[j].pred[dyn->insts[j].pred_sz++] = i;
}
}
}
// updateNeed goes backward, from last intruction to top
static int updateNeed(dynarec_arm_t* dyn, int ninst, uint8_t need) {
while (ninst>=0) {
// need pending but instruction is only a subset: remove pend and use an X_ALL instead
need |= dyn->insts[ninst].x64.need_after;
if((need&X_PEND) && (dyn->insts[ninst].x64.state_flags==SF_SUBSET)) {
need &=~X_PEND;
need |= X_ALL;
}
if((need&X_PEND) && (dyn->insts[ninst].x64.state_flags==SF_SET)) {
need &=~X_PEND;
need |= dyn->insts[ninst].x64.set_flags; // SF_SET will compute all flags, it's not SUBSET!
}
if((need&X_PEND) && dyn->insts[ninst].x64.state_flags==SF_SUBSET_PENDING) {
need |= X_ALL&~(dyn->insts[ninst].x64.set_flags);
}
dyn->insts[ninst].x64.gen_flags = need&dyn->insts[ninst].x64.set_flags;
if((need&X_PEND) && (dyn->insts[ninst].x64.state_flags&SF_PENDING))
dyn->insts[ninst].x64.gen_flags |= X_PEND;
dyn->insts[ninst].x64.need_after = need;
need = dyn->insts[ninst].x64.need_after&~dyn->insts[ninst].x64.gen_flags;
if(dyn->insts[ninst].x64.may_set)
need |= dyn->insts[ninst].x64.gen_flags; // forward the flags
// Consume X_PEND if relevant
if((need&X_PEND) && (dyn->insts[ninst].x64.set_flags&SF_PENDING))
need &=~X_PEND;
need |= dyn->insts[ninst].x64.use_flags;
if(dyn->insts[ninst].x64.need_before == need)
return ninst - 1;
dyn->insts[ninst].x64.need_before = need;
if(dyn->insts[ninst].x64.barrier&BARRIER_FLAGS) {
need = need?X_PEND:0;
}
int ok = 0;
for(int i=0; i<dyn->insts[ninst].pred_sz; ++i) {
if(dyn->insts[ninst].pred[i] == ninst-1)
ok = 1;
else
updateNeed(dyn, dyn->insts[ninst].pred[i], need);
}
if(!ok)
return ninst - 1;
--ninst;
}
return ninst;
}
void* current_helper = NULL;
void CancelBlock64(int need_lock)
{
if(need_lock)
mutex_lock(&my_context->mutex_dyndump);
dynarec_native_t* helper = (dynarec_native_t*)current_helper;
current_helper = NULL;
if(!helper) {
if(need_lock)
mutex_unlock(&my_context->mutex_dyndump);
return;
}
customFree(helper->next);
customFree(helper->insts);
customFree(helper->predecessor);
customFree(helper->table64);
if(helper->dynablock && helper->dynablock->actual_block)
FreeDynarecMap((uintptr_t)helper->dynablock->actual_block);
else if(helper->dynablock && helper->block)
FreeDynarecMap((uintptr_t)helper->block-sizeof(void*));
if(need_lock)
mutex_unlock(&my_context->mutex_dyndump);
}
uintptr_t native_pass0(dynarec_native_t* dyn, uintptr_t addr);
uintptr_t native_pass1(dynarec_native_t* dyn, uintptr_t addr);
uintptr_t native_pass2(dynarec_native_t* dyn, uintptr_t addr);
uintptr_t native_pass3(dynarec_native_t* dyn, uintptr_t addr);
void* CreateEmptyBlock(dynablock_t* block, uintptr_t addr) {
block->isize = 0;
block->done = 0;
size_t sz = 4*sizeof(void*);
void* actual_p = (void*)AllocDynarecMap(sz);
void* p = actual_p + sizeof(void*);
if(actual_p==NULL) {
dynarec_log(LOG_INFO, "AllocDynarecMap(%p, %zu) failed, cancelling block\n", block, sz);
CancelBlock64(0);
return NULL;
}
block->size = sz;
block->actual_block = actual_p;
block->block = p;
block->jmpnext = p;
*(dynablock_t**)actual_p = block;
*(void**)(p+2*sizeof(void*)) = native_epilog;
CreateJmpNext(block->jmpnext, p+2*sizeof(void*));
block->need_test = 0;
// all done...
__clear_cache(actual_p, actual_p+sz); // need to clear the cache before execution...
return block;
}
void* FillBlock64(dynablock_t* block, uintptr_t addr) {
/*
A Block must have this layout:
0x0000..0x0007 : dynablock_t* : self
0x0008..8+4*n : actual Native instructions, (n is the total number)
A .. A+8*n : Table64: n 64bits values
B .. B+7 : dynablock_t* : self (as part of JmpNext, that simulate another block)
B+8 .. B+15 : 2 Native code for jmpnext (or jmp epilog in case of empty block)
B+16 .. B+23 : jmpnext (or jmp_epilog) address
B+24 .. B+31 : empty (in case an architecture needs more than 2 opcodes)
B+32 .. B+32+sz : instsize (compressed array with each instruction lenght on x64 and native side)
*/
if(IsInHotPage(addr)) {
dynarec_log(LOG_DEBUG, "Cancelling dynarec FillBlock on hotpage for %p\n", (void*)addr);
return NULL;
}
if(addr>=box64_nodynarec_start && addr<box64_nodynarec_end) {
dynarec_log(LOG_INFO, "Create empty block in no-dynarec zone\n");
return CreateEmptyBlock(block, addr);
}
if(current_helper) {
dynarec_log(LOG_DEBUG, "Cancelling dynarec FillBlock at %p as anothor one is going on\n", (void*)addr);
return NULL;
}
// protect the 1st page
protectDB(addr, 1);
// init the helper
dynarec_native_t helper = {0};
current_helper = &helper;
helper.dynablock = block;
helper.start = addr;
uintptr_t start = addr;
helper.cap = 128;
helper.insts = (instruction_native_t*)customCalloc(helper.cap, sizeof(instruction_native_t));
// pass 0, addresses, x64 jump addresses, overall size of the block
uintptr_t end = native_pass0(&helper, addr);
// no need for next anymore
customFree(helper.next);
helper.next_sz = helper.next_cap = 0;
helper.next = NULL;
// basic checks
if(!helper.size) {
dynarec_log(LOG_INFO, "Warning, null-sized dynarec block (%p)\n", (void*)addr);
CancelBlock64(0);
return CreateEmptyBlock(block, addr);;
}
if(!isprotectedDB(addr, 1)) {
dynarec_log(LOG_INFO, "Warning, write on current page on pass0, aborting dynablock creation (%p)\n", (void*)addr);
AddHotPage(addr);
CancelBlock64(0);
return NULL;
}
// protect the block of it goes over the 1st page
if((addr&~box64_pagesize)!=(end&~box64_pagesize)) // need to protect some other pages too
protectDB(addr, end-addr); //end is 1byte after actual end
// compute hash signature
uint32_t hash = X31_hash_code((void*)addr, end-addr);
// calculate barriers
for(int i=0; i<helper.size; ++i)
if(helper.insts[i].x64.jmp) {
uintptr_t j = helper.insts[i].x64.jmp;
if(j<start || j>=end || j==helper.insts[i].x64.addr) {
helper.insts[i].x64.jmp_insts = -1;
helper.insts[i].x64.need_after |= X_PEND;
} else {
// find jump address instruction
int k=-1;
for(int i2=0; i2<helper.size && k==-1; ++i2) {
if(helper.insts[i2].x64.addr==j)
k=i2;
}
if(k!=-1 && !helper.insts[i].barrier_maybe)
helper.insts[k].x64.barrier |= BARRIER_FULL;
helper.insts[i].x64.jmp_insts = k;
}
}
// fill predecessors with the jump address
fillPredecessors(&helper);
int pos = helper.size;
while (pos>=0)
pos = updateNeed(&helper, pos, 0);
// pass 1, float optimisations, first pass for flags
native_pass1(&helper, addr);
// pass 2, instruction size
native_pass2(&helper, addr);
// keep size of instructions for signal handling
size_t insts_rsize = (helper.insts_size+2)*sizeof(instsize_t);
insts_rsize = (insts_rsize+7)&~7; // round the size...
// ok, now allocate mapped memory, with executable flag on
size_t sz = sizeof(void*) + helper.native_size + helper.table64size*sizeof(uint64_t) + 4*sizeof(void*) + insts_rsize;
// dynablock_t* block (arm insts) table64 jmpnext code instsize
void* actual_p = (void*)AllocDynarecMap(sz);
void* p = actual_p + sizeof(void*);
void* next = p + helper.native_size + helper.table64size*sizeof(uint64_t);
void* instsize = next + 4*sizeof(void*);
if(actual_p==NULL) {
dynarec_log(LOG_INFO, "AllocDynarecMap(%p, %zu) failed, cancelling block\n", block, sz);
CancelBlock64(0);
return NULL;
}
helper.block = p;
helper.native_start = (uintptr_t)p;
helper.tablestart = helper.native_start + helper.native_size;
helper.insts_size = 0; // reset
helper.instsize = (instsize_t*)instsize;
*(dynablock_t**)actual_p = block;
// pass 3, emit (log emit native opcode)
if(box64_dynarec_dump) {
dynarec_log(LOG_NONE, "%s%04d|Emitting %zu bytes for %u x64 bytes", (box64_dynarec_dump>1)?"\e[01;36m":"", GetTID(), helper.native_size, helper.isize);
printFunctionAddr(helper.start, " => ");
dynarec_log(LOG_NONE, "%s\n", (box64_dynarec_dump>1)?"\e[m":"");
}
int oldtable64size = helper.table64size;
size_t oldnativesize = helper.native_size;
helper.native_size = 0;
helper.table64size = 0; // reset table64 (but not the cap)
native_pass3(&helper, addr);
if((oldnativesize!=helper.native_size) || (oldtable64size<helper.table64size)) {
printf_log(LOG_NONE, "BOX64: Warning, size difference in block between pass2 (%zu) & pass3 (%zu)!\n", sz, helper.native_size+helper.table64size*8);
uint8_t *dump = (uint8_t*)helper.start;
printf_log(LOG_NONE, "Dump of %d x64 opcodes:\n", helper.size);
for(int i=0; i<helper.size; ++i) {
printf_log(LOG_NONE, "%p:", dump);
for(; dump<(uint8_t*)helper.insts[i+1].x64.addr; ++dump)
printf_log(LOG_NONE, " %02X", *dump);
printf_log(LOG_NONE, "\t%d -> %d\n", helper.insts[i].size2, helper.insts[i].size);
}
printf_log(LOG_NONE, "Table64 \t%d -> %d\n", oldtable64size*8, helper.table64size*8);
printf_log(LOG_NONE, " ------------\n");
//TODO: Cancel block and return empty one
}
// add table64 if needed
if(helper.table64size) {
memcpy((void*)helper.tablestart, helper.table64, helper.table64size*8);
}
// keep size of instructions for signal handling
block->instsize = instsize;
// ok, free the helper now
customFree(helper.insts);
helper.insts = NULL;
customFree(helper.table64);
helper.table64 = NULL;
helper.instsize = NULL;
customFree(helper.predecessor);
helper.predecessor = NULL;
block->size = sz;
block->isize = helper.size;
block->actual_block = actual_p;
block->block = p;
block->jmpnext = next+sizeof(void*);
*(dynablock_t**)next = block;
*(void**)(next+2*sizeof(void*)) = native_next;
CreateJmpNext(block->jmpnext, next+2*sizeof(void*));
block->need_test = 0;
//block->x64_addr = (void*)start;
block->x64_size = end-start;
// all done...
__clear_cache(actual_p, actual_p+sz); // need to clear the cache before execution...
block->hash = X31_hash_code(block->x64_addr, block->x64_size);
// Check if something changed, to abbort if it as
if((block->hash != hash)) {
dynarec_log(LOG_DEBUG, "Warning, a block changed while beeing processed hash(%p:%ld)=%x/%x\n", block->x64_addr, block->x64_size, block->hash, hash);
AddHotPage(addr);
CancelBlock64(0);
return NULL;
}
if(!isprotectedDB(addr, end-addr)) {
dynarec_log(LOG_DEBUG, "Warning, block unprotected while beeing processed %p:%ld, cancelling\n", block->x64_addr, block->x64_size);
AddHotPage(addr);
block->need_test = 1;
//protectDB(addr, end-addr);
}
current_helper = NULL;
//block->done = 1;
return (void*)block;
}
+287
View File
@@ -0,0 +1,287 @@
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <pthread.h>
#include <errno.h>
#include <string.h>
#include "debug.h"
#include "box64context.h"
#include "dynarec.h"
#include "emu/x64emu_private.h"
#include "emu/x64run_private.h"
#include "x64run.h"
#include "x64emu.h"
#include "box64stack.h"
#include "emu/x64run_private.h"
#include "x64trace.h"
#include "dynablock.h"
#include "dynarec_native.h"
#include "custommem.h"
#include "elfloader.h"
#include "dynarec_arch.h"
#include "dynarec_helper.h"
#ifndef STEP
#error No STEP defined
#endif
uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr)
{
int ok = 1;
int ninst = 0;
int j64;
uintptr_t ip = addr;
uintptr_t init_addr = addr;
rex_t rex;
int rep; // 0 none, 1=F2 prefix, 2=F3 prefix
int need_epilog = 1;
// Clean up (because there are multiple passes)
dyn->f.pending = 0;
dyn->f.dfnone = 0;
dyn->forward = 0;
dyn->forward_to = 0;
dyn->forward_size = 0;
dyn->forward_ninst = 0;
fpu_reset(dyn);
int reset_n = -1;
dyn->last_ip = (dyn->insts && dyn->insts[0].pred_sz)?0:ip; // RIP is always set at start of block unless there is a predecessor!
int stopblock = 2+(FindElfAddress(my_context, addr)?0:1); // if block is in elf_memory, it can be extended with bligblocks==2, else it needs 3
// ok, go now
INIT;
while(ok) {
ip = addr;
if (reset_n!=-1) {
dyn->last_ip = 0;
if(reset_n==-2) {
MESSAGE(LOG_DEBUG, "Reset Caches to zero\n");
dyn->f.dfnone = 0;
dyn->f.pending = 0;
fpu_reset(dyn);
} else {
MESSAGE(LOG_DEBUG, "Reset Caches with %d\n",reset_n);
#if STEP > 1
// for STEP 2 & 3, just need to refrest with current, and undo the changes (push & swap)
dyn->n = dyn->insts[ninst].n;
neoncacheUnwind(&dyn->n);
#ifdef HAVE_TRACE
if(box64_dynarec_dump)
if(memcmp(&dyn->n, &dyn->insts[reset_n].n, sizeof(neon_cache_t))) {
MESSAGE(LOG_DEBUG, "Warning, difference in neoncache: reset=");
for(int i=0; i<24; ++i)
if(dyn->insts[reset_n].n.neoncache[i].v)
MESSAGE(LOG_DEBUG, " %02d:%s", i, getCacheName(dyn->insts[reset_n].n.neoncache[i].t, dyn->insts[reset_n].n.neoncache[i].n));
if(dyn->insts[reset_n].n.combined1 || dyn->insts[reset_n].n.combined2)
MESSAGE(LOG_DEBUG, " %s:%02d/%02d", dyn->insts[reset_n].n.swapped?"SWP":"CMB", dyn->insts[reset_n].n.combined1, dyn->insts[reset_n].n.combined2);
if(dyn->insts[reset_n].n.stack_push || dyn->insts[reset_n].n.stack_pop)
MESSAGE(LOG_DEBUG, " (%d:%d)", dyn->insts[reset_n].n.stack_push, -dyn->insts[reset_n].n.stack_pop);
MESSAGE(LOG_DEBUG, " ==> ");
for(int i=0; i<24; ++i)
if(dyn->insts[ninst].n.neoncache[i].v)
MESSAGE(LOG_DEBUG, " %02d:%s", i, getCacheName(dyn->insts[ninst].n.neoncache[i].t, dyn->insts[ninst].n.neoncache[i].n));
if(dyn->insts[ninst].n.combined1 || dyn->insts[ninst].n.combined2)
MESSAGE(LOG_DEBUG, " %s:%02d/%02d", dyn->insts[ninst].n.swapped?"SWP":"CMB", dyn->insts[ninst].n.combined1, dyn->insts[ninst].n.combined2);
if(dyn->insts[ninst].n.stack_push || dyn->insts[ninst].n.stack_pop)
MESSAGE(LOG_DEBUG, " (%d:%d)", dyn->insts[ninst].n.stack_push, -dyn->insts[ninst].n.stack_pop);
MESSAGE(LOG_DEBUG, " -> ");
for(int i=0; i<24; ++i)
if(dyn->n.neoncache[i].v)
MESSAGE(LOG_DEBUG, " %02d:%s", i, getCacheName(dyn->n.neoncache[i].t, dyn->n.neoncache[i].n));
if(dyn->n.combined1 || dyn->n.combined2)
MESSAGE(LOG_DEBUG, " %s:%02d/%02d", dyn->n.swapped?"SWP":"CMB", dyn->n.combined1, dyn->n.combined2);
if(dyn->n.stack_push || dyn->n.stack_pop)
MESSAGE(LOG_DEBUG, " (%d:%d)", dyn->n.stack_push, -dyn->n.stack_pop);
MESSAGE(LOG_DEBUG, "\n");
}
#endif //HAVE_TRACE
#else
dyn->n = dyn->insts[reset_n].n;
#endif
dyn->f = dyn->insts[reset_n].f_exit;
if(dyn->insts[ninst].x64.barrier&BARRIER_FLOAT) {
MESSAGE(LOG_DEBUG, "Apply Barrier Float\n");
fpu_reset(dyn);
}
if(dyn->insts[ninst].x64.barrier&BARRIER_FLAGS) {
MESSAGE(LOG_DEBUG, "Apply Barrier Flags\n");
dyn->f.dfnone = 0;
dyn->f.pending = 0;
}
}
reset_n = -1;
} else if(ninst && (dyn->insts[ninst].pred_sz!=1 || dyn->insts[ninst].pred[0]!=ninst-1))
dyn->last_ip = 0; // reset IP if some jump are comming here
// propagate ST stack state, especial stack pop that are defered
if(dyn->n.stack_pop) {
for(int j=0; j<24; ++j)
if((dyn->n.neoncache[j].t == NEON_CACHE_ST_D || dyn->n.neoncache[j].t == NEON_CACHE_ST_F)) {
if(dyn->n.neoncache[j].n<dyn->n.stack_pop)
dyn->n.neoncache[j].v = 0;
else
dyn->n.neoncache[j].n-=dyn->n.stack_pop;
}
dyn->n.stack_pop = 0;
}
dyn->n.stack = dyn->n.stack_next;
dyn->n.news = 0;
dyn->n.stack_push = 0;
dyn->n.swapped = 0;
NEW_INST;
if(dyn->insts[ninst].pred_sz>1) {SMSTART();}
fpu_reset_scratch(dyn);
if((dyn->insts[ninst].x64.need_before&~X_PEND) && !dyn->insts[ninst].pred_sz) {
READFLAGS(dyn->insts[ninst].x64.need_before&~X_PEND);
}
#ifdef HAVE_TRACE
if(my_context->dec && box64_dynarec_trace) {
if((trace_end == 0)
|| ((ip >= trace_start) && (ip < trace_end))) {
MESSAGE(LOG_DUMP, "TRACE ----\n");
fpu_reflectcache(dyn, ninst, x1, x2, x3);
GO_TRACE();
MESSAGE(LOG_DUMP, "----------\n");
}
}
#endif
rep = 0;
uint8_t pk = PK(0);
while((pk==0xF2) || (pk==0xF3)) {
rep = pk-0xF1;
++addr;
pk = PK(0);
}
while(pk==0x3E || pk==0x26) { //Branch Taken Hint ignored, same for ES: prefix
++addr;
pk = PK(0);
}
rex.rex = 0;
while(pk>=0x40 && pk<=0x4f) {
rex.rex = pk;
++addr;
pk = PK(0);
}
addr = dynarec64_00(dyn, addr, ip, ninst, rex, rep, &ok, &need_epilog);
INST_EPILOG;
int next = ninst+1;
#if STEP > 0
if(!dyn->insts[ninst].x64.has_next && dyn->insts[ninst].x64.jmp && dyn->insts[ninst].x64.jmp_insts!=-1)
next = dyn->insts[ninst].x64.jmp_insts;
#endif
if(dyn->insts[ninst].x64.has_next && dyn->insts[next].x64.barrier) {
if(dyn->insts[next].x64.barrier&BARRIER_FLOAT)
fpu_purgecache(dyn, ninst, 0, x1, x2, x3);
if(dyn->insts[next].x64.barrier&BARRIER_FLAGS) {
dyn->f.pending = 0;
dyn->f.dfnone = 0;
dyn->last_ip = 0;
}
}
#ifndef PROT_READ
#define PROT_READ 1
#endif
#if STEP != 0
if(!ok && !need_epilog && (addr < (dyn->start+dyn->isize))) {
ok = 1;
// we use the 1st predecessor here
int ii = ninst+1;
while(ii<dyn->size && !dyn->insts[ii].pred_sz)
++ii;
if((dyn->insts[ii].x64.barrier&BARRIER_FULL)==BARRIER_FULL)
reset_n = -2; // hack to say Barrier!
else {
reset_n = getNominalPred(dyn, ii); // may get -1 if no predecessor are availble
if(reset_n==-1) {
reset_n = -2;
MESSAGE(LOG_DEBUG, "Warning, Reset Caches mark not found\n");
}
}
}
#else
if(dyn->forward) {
if(dyn->forward_to == addr && !need_epilog) {
// we made it!
if(box64_dynarec_dump) dynarec_log(LOG_NONE, "Forward extend block for %d bytes %p -> %p\n", dyn->forward_to-dyn->forward, (void*)dyn->forward, (void*)dyn->forward_to);
dyn->forward = 0;
dyn->forward_to = 0;
dyn->forward_size = 0;
dyn->forward_ninst = 0;
ok = 1; // in case it was 0
} else if ((dyn->forward_to < addr) || !ok) {
// something when wrong! rollback
if(box64_dynarec_dump) dynarec_log(LOG_NONE, "Could not forward extend block for %d bytes %p -> %p\n", dyn->forward_to-dyn->forward, (void*)dyn->forward, (void*)dyn->forward_to);
ok = 0;
dyn->size = dyn->forward_size;
ninst = dyn->forward_ninst;
addr = dyn->forward;
dyn->forward = 0;
dyn->forward_to = 0;
dyn->forward_size = 0;
dyn->forward_ninst = 0;
}
// else just continue
} else if(!ok && !need_epilog && box64_dynarec_bigblock && (getProtection(addr+3)&~PROT_READ))
if(*(uint32_t*)addr!=0) { // check if need to continue (but is next 4 bytes are 0, stop)
uintptr_t next = get_closest_next(dyn, addr);
if(next && (
(((next-addr)<15) && is_nops(dyn, addr, next-addr))
/*||(((next-addr)<30) && is_instructions(dyn, addr, next-addr))*/ ))
{
ok = 1;
// need to find back that instruction to copy the caches, as previous version cannot be used anymore
reset_n = -2;
for(int ii=0; ii<ninst; ++ii)
if(dyn->insts[ii].x64.jmp == next) {
reset_n = ii;
ii=ninst;
}
if(box64_dynarec_dump) dynarec_log(LOG_NONE, "Extend block %p, %p -> %p (ninst=%d, jump from %d)\n", dyn, (void*)addr, (void*)next, ninst, reset_n);
} else if(next && (next-addr)<box64_dynarec_forward && (getProtection(next)&PROT_READ)/*box64_dynarec_bigblock>=stopblock*/) {
dyn->forward = addr;
dyn->forward_to = next;
dyn->forward_size = dyn->size;
dyn->forward_ninst = ninst;
reset_n = -2;
ok = 1;
}
}
#endif
if(ok<0) {ok = 0; need_epilog=1;}
++ninst;
#if STEP == 0
if(ok && (((box64_dynarec_bigblock<stopblock) && !isJumpTableDefault64((void*)addr))
|| (addr>=box64_nodynarec_start && addr<box64_nodynarec_end)))
#else
if(ok && (ninst==dyn->size))
#endif
{
int j32;
MAYUSE(j32);
MESSAGE(LOG_DEBUG, "Stopping block %p (%d / %d)\n",(void*)init_addr, ninst, dyn->size);
if(!box64_dynarec_dump && addr>=box64_nodynarec_start && addr<box64_nodynarec_end)
dynarec_log(LOG_INFO, "Stopping block in no-dynarec zone\n");
--ninst;
if(!dyn->insts[ninst].x64.barrier) {
BARRIER(BARRIER_FLOAT);
}
#if STEP == 0
dyn->insts[ninst].x64.need_after |= X_PEND;
#endif
++ninst;
fpu_purgecache(dyn, ninst, 0, x1, x2, x3);
jump_to_next(dyn, addr, 0, ninst);
ok=0; need_epilog=0;
}
}
if(need_epilog) {
fpu_purgecache(dyn, ninst, 0, x1, x2, x3);
jump_to_epilog(dyn, ip, 0, ninst); // no linker here, it's an unknow instruction
}
FINI;
MESSAGE(LOG_DUMP, "---- END OF BLOCK ---- (%d)\n", dyn->size);
return addr;
}
+22
View File
@@ -0,0 +1,22 @@
#ifndef __DYNAREC_NEXT_H__
#define __DYNAREC_NEXT_H__
#ifdef ARM64
void arm64_next(void) EXPORTDYN;
void arm64_prolog(x64emu_t* emu, void* addr) EXPORTDYN;
void arm64_epilog() EXPORTDYN;
#define native_next arm64_next
#define native_prolog arm64_prolog
#define native_epilog arm64_epilog
#elif defined(LA464)
void la464_next(void) EXPORTDYN;
void la464_prolog(x64emu_t* emu, void* addr) EXPORTDYN;
void la464_epilog() EXPORTDYN;
#define native_next la464_next
#define native_prolog la464_prolog
#define native_epilog la464_epilog
#else
#error Unsupported architecture
#endif
#endif //__DYNAREC_NEXT_H__
+47
View File
@@ -0,0 +1,47 @@
#ifndef __DYNAREC_PRIVATE_H_
#define __DYNAREC_PRIVATE_H_
#define BARRIER_NONE 0
#define BARRIER_FLAGS 1
#define BARRIER_FLOAT 2
#define BARRIER_FULL 3
// all flags for the use_flags field
#define X_CF (1<<0)
#define X_PF (1<<1)
#define X_AF (1<<2)
#define X_ZF (1<<3)
#define X_SF (1<<4)
#define X_OF (1<<5)
#define X_ALL ((1<<6)-1)
#define X_PEND (0x80)
// all state flags
#define SF_UNKNOWN 0
#define SF_SET 1
#define SF_PENDING 2
#define SF_SET_PENDING (SF_SET|SF_PENDING)
#define SF_SUB 4
#define SF_SUBSET (SF_SUB|SF_SET)
#define SF_SUBSET_PENDING (SF_SUBSET|SF_PENDING)
typedef struct instruction_x64_s {
uintptr_t addr; //address of the instruction
int32_t size; // size of the instruction
uintptr_t jmp; // offset to jump to, even if conditionnal (0 if not), no relative offset here
int jmp_insts; // instuction to jump to (-1 if out of the block)
uint8_t jmp_cond; // 1 of conditionnal jump
uint8_t has_next; // does this opcode can continue to the next?
uint8_t barrier; // next instruction is a jump point, so no optim allowed
uint8_t state_flags;// One of SF_XXX state
uint8_t use_flags; // 0 or combination of X_?F
uint8_t set_flags; // 0 or combination of X_?F
uint8_t may_set; // 1 if the flags may not be set
uint8_t gen_flags; // calculated
uint8_t need_before;// calculated
uint8_t need_after; // calculated
} instruction_x64_t;
void printf_x64_instruction(zydis_dec_t* dec, instruction_x64_t* inst, const char* name);
#endif //__DYNAREC_PRIVATE_H_
+34
View File
@@ -0,0 +1,34 @@
#ifndef __NATIVE_LOCK__H__
#define __NATIVE_LOCK__H__
#ifdef ARM64
#include "arm64/arm64_lock.h"
#define native_lock_read_b(A) arm64_lock_read_b(A)
#define native_lock_write_b(A, B) arm64_lock_write_b(A, B)
#define native_lock_read_h(A) arm64_lock_read_h(A)
#define native_lock_write_h(A, B) arm64_lock_write_h(A, B)
#define native_lock_read_d(A) arm64_lock_read_d(A)
#define native_lock_write_d(A, B) arm64_lock_write_d(A, B)
#define native_lock_read_dd(A) arm64_lock_read_dd(A)
#define native_lock_write_dd(A, B) arm64_lock_write_dd(A, B)
#define native_lock_read_dq(A, B, C) arm64_lock_read_dq(A, B, C)
#define native_lock_write_dq(A, B, C) arm64_lock_write_dq(A, B, C)
#define native_lock_xchg(A, B) arm64_lock_xchg(A, B)
#define native_lock_xchg_d(A, B) arm64_lock_xchg_d(A, B)
#define native_lock_storeifref(A, B, C) arm64_lock_storeifref(A, B, C)
#define native_lock_storeifref_d(A, B, C) arm64_lock_storeifref_d(A, B, C)
#define native_lock_storeifref2_d(A, B, C) arm64_lock_storeifref2_d(A, B, C)
#define native_lock_storeifnull(A, B) arm64_lock_storeifnull(A, B)
#define native_lock_storeifnull_d(A, B) arm64_lock_storeifnull_d(A, B)
#define native_lock_decifnot0b(A) arm64_lock_decifnot0b(A)
#define native_lock_storeb(A, B) arm64_lock_storeb(A, B)
#define native_lock_incif0(A) arm64_lock_incif0(A)
#define native_lock_decifnot0(A) arm64_lock_decifnot0(A)
#define native_lock_store(A, B) arm64_lock_store(A, B)
#else
#error Unsupported architecture
#endif
#endif //#define __NATIVE_LOCK__H__
+721
View File
@@ -0,0 +1,721 @@
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "debug.h"
#include "elfloader_private.h"
#include "elfdwarf_private.h"
typedef struct dwarf_unwind_constr_s {
uint8_t reg_count;
uint64_t *table;
uint8_t *statuses;
#define GET_STATUS(n,i) (((n).statuses[(i) >> 1] >> (((i) & 1) << 2)) & 0xF)
#define SET_STATUS(n,i,v) (n).statuses[(i) >> 1] = ((n).statuses[(i) >> 1] & (0xF0 >> (((i) & 1) << 2))) | (v << (((i) & 1) << 2))
#define REGSTATUS_undefined 0b0000
#define REGSTATUS_same_val 0b0101
#define REGSTATUS_offset 0b0010
#define REGSTATUS_val_offset 0b0011
#define REGSTATUS_register 0b0100
} dwarf_unwind_constr_t;
#define DW_EH_PE_uptr 0x00
#define DW_EH_PE_uleb128 0x01
#define DW_EH_PE_udata2 0x02
#define DW_EH_PE_udata4 0x03
#define DW_EH_PE_udata8 0x04
#define DW_EH_PE_SIZE_MASK 0x07
#define DW_EH_PE_signed 0x08
#define DW_EH_PE_absptr 0x00
#define DW_EH_PE_pcrel 0x10
#define DW_EH_PE_textrel 0x20 // Unsupported
#define DW_EH_PE_datarel 0x30 // Unsupported
#define DW_EH_PE_indirect 0x80 // May crash
#define DW_EH_PE_omit 0xff
#define READ_U1(var, ptr) do { (var) = *( uint8_t*)(ptr); (ptr) += 1; } while (0)
#define READ_S1(var, ptr) do { (var) = *( int8_t*)(ptr); (ptr) += 1; } while (0)
#define READ_U2(var, ptr) do { (var) = *(uint16_t*)(ptr); (ptr) += 2; } while (0)
#define READ_S2(var, ptr) do { (var) = *( int16_t*)(ptr); (ptr) += 2; } while (0)
#define READ_U4(var, ptr) do { (var) = *(uint32_t*)(ptr); (ptr) += 4; } while (0)
#define READ_S4(var, ptr) do { (var) = *( int32_t*)(ptr); (ptr) += 4; } while (0)
#define READ_U8(var, ptr) do { (var) = *(uint64_t*)(ptr); (ptr) += 8; } while (0)
#define READ_S8(var, ptr) do { (var) = *( int64_t*)(ptr); (ptr) += 8; } while (0)
#define READ_ULEB128(var, ptr) readULEB(&(var), &(ptr))
#define READ_SLEB128(var, ptr) readSLEB((int64_t*)&(var), &(ptr))
// Seems like DW_EH_PE_signed is actually an invalid encoding
#define READ_ENCODED(var, ptr, enc, isptr) do { uintptr_t optr = (uintptr_t)(ptr); \
if ((((enc) & DW_EH_PE_SIZE_MASK) == DW_EH_PE_uleb128) && ((enc) & DW_EH_PE_signed)) READ_SLEB128(var, ptr); \
else if ((((enc) & DW_EH_PE_SIZE_MASK) == DW_EH_PE_uleb128) && !((enc) & DW_EH_PE_signed)) READ_ULEB128(var, ptr); \
else if ((((enc) & DW_EH_PE_SIZE_MASK) == DW_EH_PE_udata2 ) && ((enc) & DW_EH_PE_signed)) READ_S2 (var, ptr); \
else if ((((enc) & DW_EH_PE_SIZE_MASK) == DW_EH_PE_udata2 ) && !((enc) & DW_EH_PE_signed)) READ_U2 (var, ptr); \
else if ((((enc) & DW_EH_PE_SIZE_MASK) == DW_EH_PE_udata4 ) && ((enc) & DW_EH_PE_signed)) READ_S4 (var, ptr); \
else if ((((enc) & DW_EH_PE_SIZE_MASK) == DW_EH_PE_udata4 ) && !((enc) & DW_EH_PE_signed)) READ_U4 (var, ptr); \
else if ((((enc) & DW_EH_PE_SIZE_MASK) == DW_EH_PE_udata8 ) && ((enc) & DW_EH_PE_signed)) READ_S8 (var, ptr); \
else if ((((enc) & DW_EH_PE_SIZE_MASK) == DW_EH_PE_udata8 ) && !((enc) & DW_EH_PE_signed)) READ_U8 (var, ptr); \
else if ((((enc) & DW_EH_PE_SIZE_MASK) == DW_EH_PE_uptr ) && ((enc) & DW_EH_PE_signed)) READ_S8 (var, ptr); \
else if ((((enc) & DW_EH_PE_SIZE_MASK) == DW_EH_PE_uptr ) && !((enc) & DW_EH_PE_signed)) READ_U8 (var, ptr); \
else { printf_log(LOG_DEBUG, "Invalid encoding 0x%02X\n", (enc)); (var) = 0; } \
if (((enc) & DW_EH_PE_pcrel) && isptr) (var) += optr; \
if ((enc) & DW_EH_PE_indirect) (var) = *(uint64_t*)(var); \
} while (0)
#define SKIP_1(ptr) (ptr) += 1
#define SKIP_2(ptr) (ptr) += 2
#define SKIP_4(ptr) (ptr) += 4
#define SKIP_8(ptr) (ptr) += 8
#define SKIP_LEB128(ptr) do { ++(ptr); } while (((*(((unsigned char*)(ptr))-1))) & (1 << 7))
#define SKIP_ENCODED(ptr, enc) \
do { if (((enc) & DW_EH_PE_SIZE_MASK) == DW_EH_PE_uleb128) SKIP_LEB128(ptr); \
else if (((enc) & DW_EH_PE_SIZE_MASK) == DW_EH_PE_udata2 ) SKIP_2 (ptr); \
else if (((enc) & DW_EH_PE_SIZE_MASK) == DW_EH_PE_udata4 ) SKIP_4 (ptr); \
else if (((enc) & DW_EH_PE_SIZE_MASK) == DW_EH_PE_udata8 ) SKIP_8 (ptr); \
else if (((enc) & DW_EH_PE_SIZE_MASK) == DW_EH_PE_uptr ) SKIP_8 (ptr); \
else printf_log(LOG_DEBUG, "Invalid encoding 0x%02X\n", (enc)); \
} while (0)
// LEB128 wil only work on 64 bits numbers (unsigned long, like the Linux kernel)
void readULEB(uint64_t *var, unsigned char **ptr) {
*var = 0;
int shift = 0;
while (1) {
unsigned char byte = **ptr; ++*ptr;
*var |= ((byte & 0x7F) << shift);
if (!(byte & (1 << 7))) break;
shift += 7;
}
}
void readSLEB(int64_t *var, unsigned char **ptr) {
uint64_t tmp = 0;
int shift = 0;
unsigned char byte;
while (1) {
byte = **ptr; ++*ptr;
tmp |= ((byte & 0x7F) << shift);
if (!(byte & (1 << 7))) break;
shift += 7;
}
// Sign extend
if (byte & (1 << 6)) {
*(uint64_t*)var = tmp | (0xFFFFFFFFFFFFFFFFull << (shift + 7));
} else {
*var = tmp;
}
}
uintptr_t get_parent_registers(dwarf_unwind_t *unwind, const elfheader_t *ehdr, uintptr_t addr, char *success) {
if (!ehdr) {
*success = 0;
return 0;
}
if(!IsAddressInElfSpace(ehdr, ehdr->ehframehdr)) {
*success = 0;
return 0;
}
unsigned char ehfh_version = *(unsigned char*)ehdr->ehframehdr;
if (ehfh_version != 1) {
*success = 0;
return 0;
}
// printf_log(LOG_NONE, "Address: 0x%016lX\nEH frame address: 0x%016lX\n", addr, ehdr->ehframe);
// Not using the binary search table (for now)
unsigned char *cur_addr = (unsigned char*)ehdr->ehframe;
unsigned char *end_addr = (unsigned char*)ehdr->ehframe_end;
#define AUG_EHDATA (1 << 0)
#define AUG_AUGDATA (1 << 1)
#define AUG_LSDA (1 << 2)
#define AUG_PARG (1 << 3)
#define AUG_FDEENC (1 << 4)
#define AUG_SIGHDLER (1 << 5)
unsigned short aug_fields = 0;
unsigned char lsda_encoding = DW_EH_PE_omit;
unsigned char fde_encoding = DW_EH_PE_omit;
uint64_t eh_data = 0; // Note: these are never reset, so use aug_fields & AUG_EHDATA
uint64_t code_alignment_factor = 0;
int64_t data_alignment_factor = 0;
uint64_t cie_aug_data_len = 0; // Note: these are never reset, so use aug_fields & AUG_AUGDATA
unsigned char *cie_aug_data = NULL; // Note: these are never reset, so use aug_fields & AUG_AUGDATA
unsigned char *initCIEinstr = NULL; // Never NULL if initialized
unsigned char *endCIEinstr = NULL; // Never NULL if initialized
uint64_t return_addr_reg = 0; // Description absent in the LSBCS 5.0, but still present
while (cur_addr < end_addr) {
// Length
uint64_t len; int extended = 0;
READ_U4(len, cur_addr);
if (!len) {
// Terminator, end parsing
*success = 0;
return 0;
} else if (len == 0xFFFFFFFF) {
// Extended Length (optional)
extended = 1;
READ_U8(len, cur_addr);
}
(void)extended;
// printf_log(LOG_NONE, "[???] Length %02X\n", len);
// printf_log(LOG_NONE, "[???] Extended %c\n", extended ? 'Y' : 'N');
unsigned char *next_addr = cur_addr + len;
// CIE ID (always 0) or CIE Pointer (never 0)
uint32_t cie_ptr;
READ_U4(cie_ptr, cur_addr);
if (cie_ptr == 0) {
// Current block is a CIE
// printf_log(LOG_NONE, "[CIE] ID %02X\n", cie_ptr);
// Version (always 1 or 3)
uint8_t cie_version;
READ_U1(cie_version, cur_addr);
// printf_log(LOG_NONE, "[CIE] Version %01X\n", cie_version);
if ((cie_version != 1) && (cie_version != 3)) { // Only 1 is in the LSBCS 5.0 but I found 3 exists as well
// Invalid CIE version
printf_log(LOG_DEBUG, "Invalid CIE version %d (should be 1 or 3), stopping parsing\n", cie_version);
// Failed to process CIE
*success = 0;
return 0;
}
// Augmentation String
char *aug_str = (char*)cur_addr; cur_addr += strlen(aug_str) + 1;
// printf_log(LOG_NONE, "[CIE] Augmentation st %s\n", aug_str);
aug_fields = (aug_str[0] == 'z') ? AUG_AUGDATA : 0;
for (char *aug_str2 = aug_str + ((aug_fields & AUG_AUGDATA) ? 1 : 0); *aug_str2; ++aug_str2) {
if ((aug_str2[0] == 'e') && (aug_str2[1] == 'h')) {
// Use has also been left untold in the Linux Standard Base Core Specification 3.0RC1
printf_log(LOG_DEBUG, "Warning: EH data detected but this was removed from the standard\n");
aug_fields |= AUG_EHDATA; ++aug_str2;
} else if (aug_fields & AUG_AUGDATA) {
if (aug_str2[0] == 'L') {
aug_fields |= AUG_LSDA;
} else if (aug_str2[0] == 'P') {
aug_fields |= AUG_PARG;
printf_log(LOG_DEBUG, "Warning: augmentation string attribute 'P' unsupported\n");
} else if (aug_str2[0] == 'S') {
aug_fields |= AUG_SIGHDLER;
printf_log(LOG_DEBUG, "Warning: augmentation string attribute 'S' ignored\n");
} else if (aug_str2[0] == 'R') {
aug_fields |= AUG_FDEENC;
} else {
printf_log(LOG_DEBUG, "Error: invalid augmentation string %s\n", aug_str);
// Failed to process augmentation string
break;
}
} else {
printf_log(LOG_DEBUG, "Error: invalid augmentation string %s\n", aug_str);
// Failed to process augmentation string
break;
}
}
// printf_log(LOG_NONE, "[CIE] Augmentation fs %02x\n", aug_fields);
// Code Alignment Factor
READ_ULEB128(code_alignment_factor, cur_addr);
// printf_log(LOG_NONE, "[CIE] Code AF %d\n", code_alignment_factor);
// Data Alignment Factor
READ_SLEB128(data_alignment_factor, cur_addr);
// printf_log(LOG_NONE, "[CIE] Data AF %d\n", data_alignment_factor);
if (cie_version == 1) {
READ_U1(return_addr_reg, cur_addr);
} else {
READ_ULEB128(return_addr_reg, cur_addr);
}
// printf_log(LOG_NONE, "[CIE] Return addr reg %01X\n", return_addr_reg);
lsda_encoding = DW_EH_PE_omit;
fde_encoding = DW_EH_PE_absptr;
if (aug_fields & AUG_AUGDATA) {
// Augmentation Data Length (optional)
READ_ULEB128(cie_aug_data_len, cur_addr);
// printf_log(LOG_NONE, "[CIE] Aug data len %01X\n", cie_aug_data_len);
// Augmentation Data (optional)
cie_aug_data = cur_addr; cur_addr += cie_aug_data_len;
char *cie_aug_data2 = (char*)cie_aug_data;
for (char *aug_str2 = aug_str + ((aug_fields & AUG_AUGDATA) ? 1 : 0); *aug_str2; ++aug_str2) {
if ((aug_str2[0] == 'e') && (aug_str2[1] == 'h')) {
break; // Unknown usage
} else if (aug_fields & AUG_AUGDATA) {
if (aug_str2[0] == 'L') {
READ_U1(lsda_encoding, cie_aug_data2);
if (lsda_encoding != DW_EH_PE_omit) printf_log(LOG_DEBUG, "Warning: LSDA unsupported\n");
} else if (aug_str2[0] == 'P') {
unsigned char pencoding;
READ_U1(pencoding, cie_aug_data2);
SKIP_ENCODED(cie_aug_data2, pencoding);
} else if (aug_str2[0] == 'S') {
} else if (aug_str2[0] == 'R') {
READ_U1(fde_encoding, cie_aug_data2);
// printf_log(LOG_NONE, "[CIE] FDE encoding %02X\n", fde_encoding);
if (fde_encoding == DW_EH_PE_omit) printf_log(LOG_DEBUG, "Error: FDE encoding set to 'omit'\n");
} else {
break;
}
} else {
break;
}
}
}
// Initial Instructions
initCIEinstr = cur_addr;
endCIEinstr = next_addr;
} else if (initCIEinstr) {
// Current block is a FDE
// printf_log(LOG_NONE, "[FDE] Ptr %02X\n", cie_ptr);
// PC Begin
uintptr_t pc_begin;
READ_ENCODED(pc_begin, cur_addr, fde_encoding, 1);
// printf_log(LOG_NONE, "[FDE] PC begin %016lX\n", pc_begin);
// PC Range
uint64_t pc_range;
READ_ENCODED(pc_range, cur_addr, fde_encoding, 0);
// printf_log(LOG_NONE, "[FDE] PC end %016lX\n", pc_begin + pc_range);
uint64_t aug_data_len;
unsigned char *aug_data;
if (aug_fields & AUG_AUGDATA) {
// Augmentation Data Length (optional)
READ_ULEB128(aug_data_len, cur_addr);
// printf_log(LOG_NONE, "[FDE] Aug data len %01X\n", aug_data_len);
// Augmentation Data (optional)
aug_data = cur_addr; cur_addr += aug_data_len;
(void)aug_data;
}
if (lsda_encoding != DW_EH_PE_omit) {
SKIP_ENCODED(cur_addr, lsda_encoding);
}
// Call Frame Instructions
if ((pc_begin <= addr) && (addr < pc_begin + pc_range)) {
// Corresponding Frame Descriptor Entry found!
#define setmax(a, b) a = (a < (b) ? (b) : a)
dwarf_unwind_constr_t unwind_constr;
unwind_constr.reg_count = return_addr_reg;
uint64_t maxstacksize = 0;
uint64_t curstacksize = 0;
unsigned char *cur_inst = initCIEinstr;
uint64_t nreg;
#define PARSE_INST \
switch (inst >> 6) { \
case 0b01: \
break; \
case 0b10: \
setmax(unwind_constr.reg_count, inst & 0x3F); \
SKIP_LEB128(cur_inst); \
break; \
case 0b11: \
setmax(unwind_constr.reg_count, inst & 0x3F); \
break; \
case 0b00: \
switch (inst & 0x3F) { \
case 0b000000: \
break; \
case 0b001010: \
++curstacksize; \
setmax(maxstacksize, curstacksize); \
break; \
case 0b001011: \
if (!curstacksize) { \
printf_log(LOG_DEBUG, "Negative stack size during CFI execution\n"); \
*success = 0; \
return 0; \
} \
--curstacksize; \
break; \
case 0b000010: \
SKIP_1(cur_inst); \
break; \
case 0b000011: \
SKIP_2(cur_inst); \
break; \
case 0b000100: \
SKIP_4(cur_inst); \
break; \
case 0b000001: \
SKIP_8(cur_inst); \
break; \
case 0b001110: \
case 0b010011: \
SKIP_LEB128(cur_inst); \
break; \
case 0b000110: \
case 0b000111: \
case 0b001000: \
case 0b001101: \
READ_ULEB128(nreg, cur_inst); \
setmax(unwind_constr.reg_count, nreg); \
break; \
case 0b000101: \
case 0b001100: \
case 0b010001: \
case 0b010010: \
case 0b010100: \
case 0b010101: \
READ_ULEB128(nreg, cur_inst); \
setmax(unwind_constr.reg_count, nreg); \
SKIP_LEB128(cur_inst); \
break; \
case 0b001001: \
READ_ULEB128(nreg, cur_inst); \
setmax(unwind_constr.reg_count, nreg); \
READ_ULEB128(nreg, cur_inst); \
setmax(unwind_constr.reg_count, nreg); \
break; \
default: \
/* Contains undefined, user and expression CFIs */ \
printf_log(LOG_DEBUG, "Unknown CFI 0x%02X\n", inst); \
*success = 0; \
return 0; \
} \
break; \
}
while (cur_inst < endCIEinstr) {
unsigned char inst; READ_U1(inst, cur_inst);
PARSE_INST
}
cur_inst = cur_addr;
while (cur_inst < next_addr) {
unsigned char inst; READ_U1(inst, cur_inst);
PARSE_INST
}
#undef PARSE_INST
uint64_t cfa_reg = -1;
unsigned char cfa_signed = 0;
union { uint64_t uoff; int64_t soff; } cfa_offset = { .uoff = 0 };
++unwind_constr.reg_count;
size_t tablelen = unwind_constr.reg_count * sizeof(uint64_t);
size_t statuseslen = ((unwind_constr.reg_count+1) >> 1) * sizeof(uint8_t);
unwind_constr.table = (uint64_t*)box_malloc(tablelen);
unwind_constr.statuses = (uint8_t*)box_calloc((unwind_constr.reg_count+1) >> 1, sizeof(uint8_t));
// ~~undefined is 0: no initialization needed~~ still initialize the first 17 to same_val
for (int i = 0; (i < 17) && (i <= unwind_constr.reg_count); ++i) {
SET_STATUS(unwind_constr, i, REGSTATUS_same_val);
}
curstacksize = 0;
uint64_t **table_stack = (uint64_t**)box_malloc(maxstacksize * sizeof(uint64_t*));
for (uint64_t i = 0; i < maxstacksize; ++i) {
table_stack[i] = (uint64_t*)box_malloc(tablelen);
}
cur_inst = initCIEinstr;
uintptr_t cur_pointed_addr = pc_begin;
// Missing:
/* DW_CFA_def_cfa_expression 0 0x0f BLOCK */
/* DW_CFA_expression 0 0x10 ULEB128 register BLOCK */
/* DW_CFA_val_expression 0 0x16 ULEB128 BLOCK */
/* DW_CFA_lo_user 0 0x1c */
/* DW_CFA_GNU_args_size 0 0x2e ULEB128 argsize */
/* DW_CFA_GNU_negative_offset_extended 0 0x2f ULEB128 register ULEB128 offset (obsoleted by DW_CFA_offset_extended_sf) */
/* DW_CFA_hi_user 0 0x3f */
// Known "bug": DW_CFA_set_loc can go backwards, this is ignored
uint64_t tmpreg;
uint64_t tmpuval;
int64_t tmpsval;
#define PARSE_INST \
switch (inst >> 6) { \
case 0b01: /* DW_CFA_advance_loc 0x1 delta */ \
cur_pointed_addr += (inst & 0x3F) * code_alignment_factor; \
break; \
case 0b10: /* DW_CFA_offset 0x2 register ULEB128 offset */ \
READ_ULEB128(tmpuval, cur_inst); \
SET_STATUS(unwind_constr, inst & 0x3F, REGSTATUS_offset); \
unwind_constr.table[inst & 0x3F] = (int64_t)tmpuval * data_alignment_factor; \
break; \
case 0b11: /* DW_CFA_restore 0x3 register */ \
RESTORE_REG(inst & 0x3F) \
break; \
case 0b00: \
switch (inst & 0x3F) { \
case 0b000001: /* DW_CFA_set_loc 0 0x01 address */ \
READ_U8(cur_pointed_addr, cur_inst); \
break; \
case 0b000010: /* DW_CFA_advance_loc1 0 0x02 1-byte delta */ \
READ_U1(tmpuval, cur_inst); \
cur_pointed_addr += tmpuval * code_alignment_factor; \
break; \
case 0b000011: /* DW_CFA_advance_loc2 0 0x03 2-byte delta */ \
READ_U2(tmpuval, cur_inst); \
cur_pointed_addr += tmpuval * code_alignment_factor; \
break; \
case 0b000100: /* DW_CFA_advance_loc4 0 0x04 4-byte delta */ \
READ_U4(tmpuval, cur_inst); \
cur_pointed_addr += tmpuval * code_alignment_factor; \
break; \
\
case 0b001100: /* DW_CFA_def_cfa 0 0x0c ULEB128 register ULEB128 offset */ \
READ_ULEB128(cfa_reg, cur_inst); \
cfa_signed = 0; \
READ_ULEB128(cfa_offset.uoff, cur_inst); \
break; \
case 0b010010: /* DW_CFA_def_cfa_sf 0 0x12 ULEB128 register SLEB128 offset */ \
READ_ULEB128(cfa_reg, cur_inst); \
cfa_signed = 1; \
READ_SLEB128(cfa_offset.soff, cur_inst); \
cfa_offset.soff *= data_alignment_factor; \
break; \
case 0b001101: /* DW_CFA_def_cfa_register 0 0x0d ULEB128 register */ \
READ_ULEB128(cfa_reg, cur_inst); \
break; \
case 0b001110: /* DW_CFA_def_cfa_offset 0 0x0e ULEB128 offset */ \
cfa_signed = 0; \
READ_ULEB128(cfa_offset.uoff, cur_inst); \
break; \
case 0b010011: /* DW_CFA_def_cfa_offset_sf 0 0x13 SLEB128 offset */ \
READ_SLEB128(cfa_offset.soff, cur_inst); \
cfa_offset.soff *= data_alignment_factor; \
break; \
/* DW_CFA_def_cfa_expression */ \
\
case 0b000111: /* DW_CFA_undefined 0 0x07 ULEB128 register */ \
READ_ULEB128(tmpreg, cur_inst); \
SET_STATUS(unwind_constr, tmpreg, REGSTATUS_undefined); \
break; \
case 0b001000: /* DW_CFA_same_value 0 0x08 ULEB128 register */ \
READ_ULEB128(tmpreg, cur_inst); \
SET_STATUS(unwind_constr, tmpreg, REGSTATUS_same_val); \
break; \
case 0b000101: /* DW_CFA_offset_extended 0 0x05 ULEB128 register ULEB128 offset */ \
READ_ULEB128(tmpreg, cur_inst); \
READ_ULEB128(tmpuval, cur_inst); \
SET_STATUS(unwind_constr, tmpreg, REGSTATUS_offset); \
unwind_constr.table[tmpreg] = (int64_t)tmpuval * data_alignment_factor; \
break; \
case 0b010001: /* DW_CFA_offset_extended_sf 0 0x11 ULEB128 register SLEB128 offset */ \
READ_ULEB128(tmpreg, cur_inst); \
READ_SLEB128(tmpsval, cur_inst); \
SET_STATUS(unwind_constr, tmpreg, REGSTATUS_offset); \
unwind_constr.table[tmpreg] = tmpsval * data_alignment_factor; \
break; \
case 0b010100: /* DW_CFA_val_offset 0 0x14 ULEB128 register ULEB128 offset */ \
READ_ULEB128(tmpreg, cur_inst); \
READ_ULEB128(tmpuval, cur_inst); \
SET_STATUS(unwind_constr, tmpreg, REGSTATUS_val_offset); \
unwind_constr.table[tmpreg] = (int64_t)tmpuval * data_alignment_factor; \
break; \
case 0b010101: /* DW_CFA_val_offset_sf 0 0x15 ULEB128 register SLEB128 offset */ \
READ_ULEB128(tmpreg, cur_inst); \
READ_SLEB128(tmpsval, cur_inst); \
SET_STATUS(unwind_constr, tmpreg, REGSTATUS_val_offset); \
unwind_constr.table[tmpreg] = tmpsval * data_alignment_factor; \
break; \
case 0b001001: /* DW_CFA_register 0 0x09 ULEB128 register ULEB128 register */ \
READ_ULEB128(tmpreg, cur_inst); \
READ_ULEB128(tmpuval, cur_inst); \
SET_STATUS(unwind_constr, tmpreg, REGSTATUS_register); \
unwind_constr.table[tmpreg] = tmpuval; \
break; \
/* DW_CFA_expression */ \
/* DW_CFA_val_expression */ \
case 0b000110: /* DW_CFA_restore_extended 0 0x06 ULEB128 register */ \
READ_ULEB128(tmpreg, cur_inst); \
RESTORE_REG(tmpreg) \
break; \
\
case 0b001010: /* DW_CFA_remember_state 0 0x0a */ \
memcpy(table_stack[curstacksize], unwind_constr.table, tablelen); \
++curstacksize; \
break; \
case 0b001011: /* DW_CFA_restore_state 0 0x0b */ \
--curstacksize; \
memcpy(unwind_constr.table, table_stack[curstacksize], tablelen); \
break; \
\
case 0b000000: /* DW_CFA_nop 0 0 */ \
break; \
default: \
/* Contains undefined, user and expression CFIs */ \
printf_log(LOG_DEBUG, "Unknown CFI 0x%02X\n", inst); \
FAILED \
} \
break; \
}
#define RESTORE_REG(reg) \
printf_log(LOG_DEBUG, "Trying to restore register 0x%02lX while in the intial CFIs\n", (uint64_t)reg); \
FAILED
#define FAILED \
box_free(unwind_constr.statuses); \
box_free(unwind_constr.table); \
for (uint64_t i = 0; i < maxstacksize; ++i) box_free(table_stack[i]); \
box_free(table_stack); \
*success = 0; return 0;
while (cur_inst < endCIEinstr) {
unsigned char inst; READ_U1(inst, cur_inst);
// printf_log(LOG_NONE, "Executing pre 0x%02X\n", inst);
PARSE_INST
}
#undef FAILED
#undef RESTORE_REG
uint64_t *init_table = (uint64_t*)box_malloc(tablelen);
memcpy(init_table, unwind_constr.table, tablelen);
uint8_t *init_statuses = (uint8_t*)box_malloc(statuseslen);
memcpy(init_statuses, unwind_constr.statuses, statuseslen);
cur_inst = cur_addr;
#define RESTORE_REG(reg) \
unwind_constr.table[reg] = init_table[reg]; \
SET_STATUS(unwind_constr, (reg), ((init_statuses[(reg) >> 1] >> (((reg) & 1) << 2)) & 0xF));
#define FAILED \
box_free(init_statuses); \
box_free(init_table); \
box_free(unwind_constr.statuses); \
box_free(unwind_constr.table); \
for (uint64_t i = 0; i < maxstacksize; ++i) box_free(table_stack[i]); \
box_free(table_stack); \
*success = 0; return 0;
while ((cur_inst < next_addr) && (cur_pointed_addr <= addr)) {
unsigned char inst; READ_U1(inst, cur_inst);
// printf_log(LOG_NONE, "Executing post 0x%02X\n", inst);
PARSE_INST
}
#undef FAILED
#undef RESTORE_REG
#undef PARSE_INST
box_free(init_statuses);
box_free(init_table);
for (int i = 0; i < maxstacksize; ++i) {
box_free(table_stack[i]);
}
box_free(table_stack);
dwarf_unwind_t new_unwind;
new_unwind.reg_count = unwind_constr.reg_count;
new_unwind.regs = box_calloc(unwind_constr.reg_count, sizeof(uint64_t));
uintptr_t cfa = unwind->regs[cfa_reg];
if (cfa_signed) cfa += cfa_offset.soff;
else cfa += cfa_offset.uoff;
// printf_log(LOG_NONE, "Done, rewriting registers (CFA at r%d(0x%016lX) + %lld (%c) -> 0x%016lX\n", cfa_reg, unwind->regs[cfa_reg], cfa_offset.soff, cfa_signed ? 's' : 'u', cfa);
for (uint64_t i = 0; i < unwind_constr.reg_count; ++i) {
switch (GET_STATUS(unwind_constr, i)) {
case REGSTATUS_undefined:
// printf_log(LOG_NONE, "Register %02lX: (undefined)\n", i);
break;
case REGSTATUS_same_val:
if (i >= unwind->reg_count) {
printf_log(LOG_DEBUG, "Invalid register status (value copied from register 0x%02lX)\n", i);
box_free(unwind_constr.statuses);
box_free(unwind_constr.table);
box_free(new_unwind.regs);
*success = 0;
return 0;
}
new_unwind.regs[i] = unwind->regs[i];
// printf_log(LOG_NONE, "Register %02lX: copy %016lX\n", i, new_unwind.regs[i]);
break;
case REGSTATUS_offset:
new_unwind.regs[i] = *(uint64_t*)(cfa + (int64_t)unwind_constr.table[i]);
// printf_log(LOG_NONE, "Register %02lX: offset %016lX [%016lX + %lld]\n", i, new_unwind.regs[i], cfa, (int64_t)unwind_constr.table[i]);
break;
case REGSTATUS_val_offset:
new_unwind.regs[i] = (uint64_t)(cfa + (int64_t)unwind_constr.table[i]);
// printf_log(LOG_NONE, "Register %02lX: voff %016lX\n", i, new_unwind.regs[i]);
break;
case REGSTATUS_register:
if (unwind_constr.table[i] >= unwind->reg_count) {
printf_log(LOG_DEBUG, "Invalid register status (value copied from register 0x%02lX)\n", unwind_constr.table[i]);
box_free(unwind_constr.statuses);
box_free(unwind_constr.table);
box_free(new_unwind.regs);
*success = 0;
return 0;
}
new_unwind.regs[i] = unwind->regs[unwind_constr.table[i]];
// printf_log(LOG_NONE, "Register %02lX: reg %016lX\n", i, new_unwind.regs[i]);
break;
}
}
*success = (GET_STATUS(unwind_constr, return_addr_reg) == REGSTATUS_undefined) ? 0 : ((aug_fields & AUG_SIGHDLER) ? 2 : 1);
box_free(unwind_constr.statuses);
box_free(unwind_constr.table);
box_free(unwind->regs);
unwind->reg_count = new_unwind.reg_count;
unwind->regs = new_unwind.regs;
// Maybe?
unwind->regs[cfa_reg] = cfa;
// printf_log(LOG_NONE, "Returning %016lX\n", unwind->regs[return_addr_reg]);
return unwind->regs[return_addr_reg];
}
} else {
// printf_log(LOG_NONE, "[FDE] Ptr %02X\n", cie_ptr);
printf_log(LOG_DEBUG, "Unexpected FDE, corresponding CIE missing\n");
return 0;
}
cur_addr = next_addr;
}
*success = 0;
return 0;
}
dwarf_unwind_t *init_dwarf_unwind_registers(x64emu_t *emu) {
dwarf_unwind_t *unwind_struct = (dwarf_unwind_t*)box_malloc(sizeof(dwarf_unwind_t));
unwind_struct->reg_count = 17;
unwind_struct->regs = (uint64_t*)box_malloc(17*sizeof(uint64_t));
/* x86_64-abi-0.99.pdf
* Register Name | Number | Abbreviation
* General Purpose Register RAX | 0 | %rax
* General Purpose Register RDX | 1 | %rdx
* General Purpose Register RCX | 2 | %rcx
* General Purpose Register RBX | 3 | %rbx
* General Purpose Register RSI | 4 | %rsi
* General Purpose Register RDI | 5 | %rdi
* Frame Pointer Register RBP | 6 | %rbp
* Stack Pointer Register RSP | 7 | %rsp
* Extended Integer Registers 8-15 | 8-15 | %r8-%r15
* Return Address RA | 16 |
* Vector Registers 0-7 | 17-24 | %xmm0-%xmm7
* Extended Vector Registers 8-15 | 25-32 | %xmm8-%xmm15
* Floating Point Registers 0-7 | 33-40 | %st0-%st7
* MMX Registers 0-7 | 41-48 | %mm0-%mm7
* Flag Register | 49 | %rFLAGS
* Segment Register ES | 50 | %es
* Segment Register CS | 51 | %cs
* Segment Register SS | 52 | %ss
* Segment Register DS | 53 | %ds
* Segment Register FS | 54 | %fs
* Segment Register GS | 55 | %gs
* Reserved | 56-57 |
* FS Base address | 58 | %fs.base
* GS Base address | 59 | %gs.base
* Reserved | 60-61 |
* Task Register | 62 | %tr
* LDT Register | 63 | %ldtr
* 128-bit Media Control and Status | 64 | %mxcsr
* x87 Control Word | 65 | %fcw
* x87 Status Word | 66 | %fsw
*/
unwind_struct->regs[ 0] = emu->regs[_RAX].q[0];
unwind_struct->regs[ 1] = emu->regs[_RDX].q[0];
unwind_struct->regs[ 2] = emu->regs[_RCX].q[0];
unwind_struct->regs[ 3] = emu->regs[_RBX].q[0];
unwind_struct->regs[ 4] = emu->regs[_RSI].q[0];
unwind_struct->regs[ 5] = emu->regs[_RDI].q[0];
unwind_struct->regs[ 6] = emu->regs[_RBP].q[0];
unwind_struct->regs[ 7] = emu->regs[_RSP].q[0] + 8;
unwind_struct->regs[ 8] = emu->regs[_R8 ].q[0];
unwind_struct->regs[ 9] = emu->regs[_R9 ].q[0];
unwind_struct->regs[10] = emu->regs[_R10].q[0];
unwind_struct->regs[11] = emu->regs[_R11].q[0];
unwind_struct->regs[12] = emu->regs[_R12].q[0];
unwind_struct->regs[13] = emu->regs[_R13].q[0];
unwind_struct->regs[14] = emu->regs[_R14].q[0];
unwind_struct->regs[15] = emu->regs[_R15].q[0];
unwind_struct->regs[16] = emu->ip.q[0];
return unwind_struct;
}
void free_dwarf_unwind_registers(dwarf_unwind_t **unwind_struct) {
box_free((*unwind_struct)->regs);
box_free(*unwind_struct);
*unwind_struct = NULL;
}
+19
View File
@@ -0,0 +1,19 @@
#ifndef __ELFDWARF_PRIVATE_H_
#define __ELFDWARF_PRIVATE_H_
#include "emu/x64emu_private.h"
typedef struct dwarf_unwind_s {
uint8_t reg_count;
uint64_t *regs;
} dwarf_unwind_t;
typedef struct elfheader_s elfheader_t;
dwarf_unwind_t *init_dwarf_unwind_registers(x64emu_t *emu);
void free_dwarf_unwind_registers(dwarf_unwind_t **unwind_struct);
// Returns the callee's address on success or NULL on failure (may be NULL regardless).
// If success equals 2, the frame is a signal frame.
uintptr_t get_parent_registers(dwarf_unwind_t *emu, const elfheader_t *ehdr, uintptr_t addr, char *success);
#endif // __ELFDWARF_PRIVATE_H_
+68 -65
View File
@@ -225,13 +225,14 @@ const char* DumpRelType(int t)
return buff;
}
const char* DumpSym(elfheader_t *h, Elf64_Sym* sym)
const char* DumpSym(elfheader_t *h, Elf64_Sym* sym, int version)
{
static char buff[4096];
const char* vername = (version==-1)?"(none)":((version==0)?"*local*":((version==1)?"*global*":GetSymbolVersion(h, version)));
memset(buff, 0, sizeof(buff));
sprintf(buff, "\"%s\", value=%p, size=%ld, info/other=%d/%d index=%d",
sprintf(buff, "\"%s\", value=%p, size=%ld, info/other=%d/%d index=%d (ver=%d/%s)",
h->DynStr+sym->st_name, (void*)sym->st_value, sym->st_size,
sym->st_info, sym->st_other, sym->st_shndx);
sym->st_info, sym->st_other, sym->st_shndx, version, vername);
return buff;
}
@@ -246,116 +247,118 @@ const char* IdxSymName(elfheader_t *h, int sym)
void DumpMainHeader(Elf64_Ehdr *header, elfheader_t *h)
{
if(box64_log>=LOG_DUMP) {
printf_log(LOG_DUMP, "ELF Dump main header\n");
printf_log(LOG_DUMP, " Entry point = %p\n", (void*)header->e_entry);
printf_log(LOG_DUMP, " Program Header table offset = %p\n", (void*)header->e_phoff);
printf_log(LOG_DUMP, " Section Header table offset = %p\n", (void*)header->e_shoff);
printf_log(LOG_DUMP, " Flags = 0x%X\n", header->e_flags);
printf_log(LOG_DUMP, " ELF Header size = %d\n", header->e_ehsize);
printf_log(LOG_DUMP, " Program Header Entry num/size = %d(%d)/%d\n", h->numPHEntries, header->e_phnum, header->e_phentsize);
printf_log(LOG_DUMP, " Section Header Entry num/size = %d(%d)/%d\n", h->numSHEntries, header->e_shnum, header->e_shentsize);
printf_log(LOG_DUMP, " Section Header index num = %d(%d)\n", h->SHIdx, header->e_shstrndx);
printf_log(LOG_DUMP, "ELF Dump ==========\n");
if(box64_dump) {
printf_dump(LOG_NEVER, "ELF Dump main header\n");
printf_dump(LOG_NEVER, " Entry point = %p\n", (void*)header->e_entry);
printf_dump(LOG_NEVER, " Program Header table offset = %p\n", (void*)header->e_phoff);
printf_dump(LOG_NEVER, " Section Header table offset = %p\n", (void*)header->e_shoff);
printf_dump(LOG_NEVER, " Flags = 0x%X\n", header->e_flags);
printf_dump(LOG_NEVER, " ELF Header size = %d\n", header->e_ehsize);
printf_dump(LOG_NEVER, " Program Header Entry num/size = %zu(%d)/%d\n", h->numPHEntries, header->e_phnum, header->e_phentsize);
printf_dump(LOG_NEVER, " Section Header Entry num/size = %zu(%d)/%d\n", h->numSHEntries, header->e_shnum, header->e_shentsize);
printf_dump(LOG_NEVER, " Section Header index num = %zu(%d)\n", h->SHIdx, header->e_shstrndx);
printf_dump(LOG_NEVER, "ELF Dump ==========\n");
printf_log(LOG_DUMP, "ELF Dump PEntries (%d)\n", h->numSHEntries);
for (int i=0; i<h->numPHEntries; ++i)
printf_log(LOG_DUMP, " PHEntry %04d : %s\n", i, DumpPHEntry(h->PHEntries+i));
printf_log(LOG_DUMP, "ELF Dump PEntries ====\n");
printf_dump(LOG_NEVER, "ELF Dump PEntries (%zu)\n", h->numPHEntries);
for (size_t i=0; i<h->numPHEntries; ++i)
printf_dump(LOG_NEVER, " PHEntry %04zu : %s\n", i, DumpPHEntry(h->PHEntries+i));
printf_dump(LOG_NEVER, "ELF Dump PEntries ====\n");
printf_log(LOG_DUMP, "ELF Dump Sections (%d)\n", h->numSHEntries);
for (int i=0; i<h->numSHEntries; ++i)
printf_log(LOG_DUMP, " Section %04d : %s\n", i, DumpSection(h->SHEntries+i, h->SHStrTab));
printf_log(LOG_DUMP, "ELF Dump Sections ====\n");
printf_dump(LOG_NEVER, "ELF Dump Sections (%zu)\n", h->numSHEntries);
for (size_t i=0; i<h->numSHEntries; ++i)
printf_dump(LOG_NEVER, " Section %04zu : %s\n", i, DumpSection(h->SHEntries+i, h->SHStrTab));
printf_dump(LOG_NEVER, "ELF Dump Sections ====\n");
}
}
void DumpSymTab(elfheader_t *h)
{
if(box64_log>=LOG_DUMP && h->SymTab) {
if(box64_dump && h->SymTab) {
const char* name = ElfName(h);
printf_log(LOG_DUMP, "ELF Dump SymTab(%d)=\n", h->numSymTab);
for (int i=0; i<h->numSymTab; ++i)
printf_log(LOG_DUMP, " %s:SymTab[%d] = \"%s\", value=%p, size=%ld, info/other=%d/%d index=%d\n", name,
printf_dump(LOG_NEVER, "ELF Dump SymTab(%zu)=\n", h->numSymTab);
for (size_t i=0; i<h->numSymTab; ++i)
printf_dump(LOG_NEVER, " %s:SymTab[%zu] = \"%s\", value=%p, size=%ld, info/other=%d/%d index=%d\n", name,
i, h->StrTab+h->SymTab[i].st_name, (void*)h->SymTab[i].st_value, h->SymTab[i].st_size,
h->SymTab[i].st_info, h->SymTab[i].st_other, h->SymTab[i].st_shndx);
printf_log(LOG_DUMP, "ELF Dump SymTab=====\n");
printf_dump(LOG_NEVER, "ELF Dump SymTab=====\n");
}
}
void DumpDynamicSections(elfheader_t *h)
{
if(box64_log>=LOG_DUMP && h->Dynamic) {
printf_log(LOG_DUMP, "ELF Dump Dynamic(%d)=\n", h->numDynamic);
for (int i=0; i<h->numDynamic; ++i)
printf_log(LOG_DUMP, " Dynamic %04d : %s\n", i, DumpDynamic(h->Dynamic+i));
printf_log(LOG_DUMP, "ELF Dump Dynamic=====\n");
if(box64_dump && h->Dynamic) {
printf_dump(LOG_NEVER, "ELF Dump Dynamic(%zu)=\n", h->numDynamic);
for (size_t i=0; i<h->numDynamic; ++i)
printf_dump(LOG_NEVER, " Dynamic %04zu : %s\n", i, DumpDynamic(h->Dynamic+i));
printf_dump(LOG_NEVER, "ELF Dump Dynamic=====\n");
}
}
void DumpDynSym(elfheader_t *h)
{
if(box64_log>=LOG_DUMP && h->DynSym) {
if(box64_dump && h->DynSym) {
const char* name = ElfName(h);
printf_log(LOG_DUMP, "ELF Dump DynSym(%d)=\n", h->numDynSym);
for (int i=0; i<h->numDynSym; ++i)
printf_log(LOG_DUMP, " %s:DynSym[%d] = %s\n", name, i, DumpSym(h, h->DynSym+i));
printf_log(LOG_DUMP, "ELF Dump DynSym=====\n");
printf_dump(LOG_NEVER, "ELF Dump DynSym(%zu)=\n", h->numDynSym);
for (size_t i=0; i<h->numDynSym; ++i) {
int version = h->VerSym?((Elf64_Half*)((uintptr_t)h->VerSym+h->delta))[i]:-1;
printf_dump(LOG_NEVER, " %s:DynSym[%zu] = %s\n", name, i, DumpSym(h, h->DynSym+i, version));
}
printf_dump(LOG_NEVER, "ELF Dump DynSym=====\n");
}
}
void DumpDynamicNeeded(elfheader_t *h)
{
if(box64_log>=LOG_DUMP && h->DynStrTab) {
printf_log(LOG_DUMP, "ELF Dump DT_NEEDED=====\n");
for (int i=0; i<h->numDynamic; ++i)
if(box64_dump && h->DynStrTab) {
printf_dump(LOG_NEVER, "ELF Dump DT_NEEDED=====\n");
for (size_t i=0; i<h->numDynamic; ++i)
if(h->Dynamic[i].d_tag==DT_NEEDED) {
printf_log(LOG_DUMP, " Needed : %s\n", h->DynStrTab+h->Dynamic[i].d_un.d_val + h->delta);
printf_dump(LOG_NEVER, " Needed : %s\n", h->DynStrTab+h->Dynamic[i].d_un.d_val + h->delta);
}
printf_log(LOG_DUMP, "ELF Dump DT_NEEDED=====\n");
printf_dump(LOG_NEVER, "ELF Dump DT_NEEDED=====\n");
}
}
void DumpDynamicRPath(elfheader_t *h)
{
if(box64_log>=LOG_DUMP && h->DynStrTab) {
printf_log(LOG_DUMP, "ELF Dump DT_RPATH/DT_RUNPATH=====\n");
for (int i=0; i<h->numDynamic; ++i) {
if(box64_dump && h->DynStrTab) {
printf_dump(LOG_NEVER, "ELF Dump DT_RPATH/DT_RUNPATH=====\n");
for (size_t i=0; i<h->numDynamic; ++i) {
if(h->Dynamic[i].d_tag==DT_RPATH) {
printf_log(LOG_DUMP, " RPATH : %s\n", h->DynStrTab+h->Dynamic[i].d_un.d_val + h->delta);
printf_dump(LOG_NEVER, " RPATH : %s\n", h->DynStrTab+h->Dynamic[i].d_un.d_val + h->delta);
}
if(h->Dynamic[i].d_tag==DT_RUNPATH) {
printf_log(LOG_DUMP, " RUNPATH : %s\n", h->DynStrTab+h->Dynamic[i].d_un.d_val + h->delta);
printf_dump(LOG_NEVER, " RUNPATH : %s\n", h->DynStrTab+h->Dynamic[i].d_un.d_val + h->delta);
}
}
printf_log(LOG_DUMP, "=====ELF Dump DT_RPATH/DT_RUNPATH\n");
printf_dump(LOG_NEVER, "=====ELF Dump DT_RPATH/DT_RUNPATH\n");
}
}
void DumpRelTable(elfheader_t *h, int cnt, Elf64_Rel *rel, const char* name)
{
if(box64_log>=LOG_DUMP) {
if(box64_dump) {
const char* elfname = ElfName(h);
printf_log(LOG_DUMP, "ELF Dump %s Table(%d) @%p\n", name, cnt, rel);
printf_dump(LOG_NEVER, "ELF Dump %s Table(%d) @%p\n", name, cnt, rel);
for (int i = 0; i<cnt; ++i)
printf_log(LOG_DUMP, " %s:Rel[%d] = %p (0x%lX: %s, sym=0x%0lX/%s)\n", elfname,
printf_dump(LOG_NEVER, " %s:Rel[%d] = %p (0x%lX: %s, sym=0x%0lX/%s)\n", elfname,
i, (void*)rel[i].r_offset, rel[i].r_info, DumpRelType(ELF64_R_TYPE(rel[i].r_info)),
ELF64_R_SYM(rel[i].r_info), IdxSymName(h, ELF64_R_SYM(rel[i].r_info)));
printf_log(LOG_DUMP, "ELF Dump Rel Table=====\n");
printf_dump(LOG_NEVER, "ELF Dump Rel Table=====\n");
}
}
void DumpRelATable(elfheader_t *h, int cnt, Elf64_Rela *rela, const char* name)
{
if(box64_log>=LOG_DUMP && h->rela) {
if(box64_dump && h->rela) {
const char* elfname = ElfName(h);
printf_log(LOG_DUMP, "ELF Dump %s Table(%d) @%p\n", name, cnt, rela);
printf_dump(LOG_NEVER, "ELF Dump %s Table(%d) @%p\n", name, cnt, rela);
for (int i = 0; i<cnt; ++i)
printf_log(LOG_DUMP, " %s:RelA[%d] = %p (0x%lX: %s, sym=0x%lX/%s) Addend=%ld\n", elfname,
printf_dump(LOG_NEVER, " %s:%s[%d] = %p (0x%lX: %s, sym=0x%lX/%s) Addend=0x%lx\n", elfname, name,
i, (void*)rela[i].r_offset, rela[i].r_info, DumpRelType(ELF64_R_TYPE(rela[i].r_info)),
ELF64_R_SYM(rela[i].r_info), IdxSymName(h, ELF64_R_SYM(rela[i].r_info)),
rela[i].r_addend);
printf_log(LOG_DUMP, "ELF Dump RelA Table=====\n");
printf_dump(LOG_NEVER, "ELF Dump %s Table=====\n", name);
}
}
@@ -366,24 +369,24 @@ void DumpBinary(char* p, int sz)
unsigned char* d = (unsigned char*)p;
int delta = ((uintptr_t)p)&0xf;
for (int i = 0; sz; ++i) {
printf_log(LOG_DUMP, "%p ", (void*)(((uintptr_t)d)&~0xf));
printf_dump(LOG_NEVER, "%p ", (void*)(((uintptr_t)d)&~0xf));
int n = 16 - delta;
if (n>sz) n = sz;
int fill = 16-sz;
for (int j = 0; j<delta; ++j)
printf_log(LOG_DUMP, " ");
printf_dump(LOG_NEVER, " ");
for (int j = 0; j<n; ++j)
printf_log(LOG_DUMP, "%02X ", d[j]);
printf_dump(LOG_NEVER, "%02X ", d[j]);
for (int j = 0; j<fill; ++j)
printf_log(LOG_DUMP, " ");
printf_log(LOG_DUMP, " | ");
printf_dump(LOG_NEVER, " ");
printf_dump(LOG_NEVER, " | ");
for (int j = 0; j<delta; ++j)
printf_log(LOG_DUMP, " ");
printf_dump(LOG_NEVER, " ");
for (int j = 0; j<n; ++j)
printf_log(LOG_DUMP, "%c", (d[j]<32 || d[j]>127)?'.':d[j]);
printf_dump(LOG_NEVER, "%c", (d[j]<32 || d[j]>127)?'.':d[j]);
for (int j = 0; j<fill; ++j)
printf_log(LOG_DUMP, " ");
printf_log(LOG_DUMP, "\n");
printf_dump(LOG_NEVER, " ");
printf_dump(LOG_NEVER, "\n");
d+=n;
sz-=n;
delta=0;
Loaded 100 of 1148 files, more files were not shown because too many files have changed in this diff. Show more