Old World of Warcraft clients still contain x87 code. WoW 3.3.5a also uses
the legacy ARPL instruction, which current Rosetta releases do not translate.
The result is an ILLEGAL_INSTRUCTION crash before the client reaches the
login screen.
Rosetta Timewalker is a small compatibility layer for running those clients
through CrossOver on Apple Silicon. It adds native AArch64 lowering for x87 and
ARPL, then carries that patched Rosetta path through Wine's child processes.
The goal is simple: keep old WoW clients and community projects usable on
modern Macs.
It does not include a WoW client, server, launcher, or game data.
- Apple Silicon Mac with Rosetta 2
- CrossOver installed in
/Applications/CrossOver.app - World of Warcraft 3.3.5a, build 12340
- Rosetta runtime 367.8, UUID
08AF6CF5-24B6-3C0C-A2D8-DB54C603B21C
Rosetta Timewalker patches undocumented Rosetta internals. It checks the runtime before touching it and refuses unknown or half-patched versions, but a macOS update can still require a new profile.
Install Xcode Command Line Tools, CMake, and Homebrew LLVM:
xcode-select --install
brew install cmake llvmThen build the translator, patch library, tests, and app bundle:
git clone https://github.com/aprilmaccydee/rosetta-timewalker.git
cd rosetta-timewalker
make
make testPass the CrossOver bottle name and the path to your client:
./scripts/run-wow.sh "WoW 3.3.5a" "$HOME/Games/WoW-3.3.5a/Wow.exe"Or launch the app bundle with the same two arguments:
open -n build/Rosetta-Timewalker.app --args \
"WoW 3.3.5a" "$HOME/Games/WoW-3.3.5a/Wow.exe"With no arguments, the launcher uses the GTA2 bottle and
~/Games/World of Warcraft/Wow.exe. You can change those defaults with
TIMEWALKER_BOTTLE and TIMEWALKER_WOW_EXE when using the shell script.
To run the two real CrossOver probes against another bottle:
make crossover-test CROSSOVER_BOTTLE="WoW 3.3.5a"Set TIMEWALKER_DEBUG=1 for loader and patch diagnostics. The app bundle writes
its output to ~/Library/Logs/RosettaTimewalker.log.
The x87 translator is enabled by default. It translates hot x87 sequences to AArch64, including cached and fused instruction runs. Full guest SIMD/FP state is saved only at decode and translation boundaries; translated code does not pay that cost each time it runs.
The ARPL side finds an unused Rosetta decoder descriptor, publishes opcode
0x63 transactionally, and lowers the instruction natively. VM protections
are restored after each write, and a failed install is rolled back before the
opcode becomes visible.
CrossOver starts several Wine executables on the way to Wow.exe. The loader
shim redirects each one through the same x87 runtime so the patch is not lost
between processes.
The x87 translator, cache, fusion work, and runtime began in
Lifeisawful/rosettax87_jit.
This repository carries a modified snapshot of commit
a44f1eff28591a90f4a8c7297134294811da06b5 under
third_party/rosettax87_jit. Rosetta Timewalker
adds the CrossOver loader chain, Rosetta 367.8 integration fixes, live-state
preservation, native ARPL support, and the WoW-facing tests and launcher.
The upstream MIT license and modification notice are preserved in THIRD_PARTY_NOTICES.md.
MIT. See LICENSE.
World of Warcraft, CrossOver, and Rosetta are the property of their respective owners. This project is not affiliated with Blizzard, CodeWeavers, or Apple.