Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Rosetta Timewalker

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.

Known working setup

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

Build

Install Xcode Command Line Tools, CMake, and Homebrew LLVM:

xcode-select --install
brew install cmake llvm

Then build the translator, patch library, tests, and app bundle:

git clone https://github.com/aprilmaccydee/rosetta-timewalker.git
cd rosetta-timewalker
make
make test

Run WoW

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

What is patched

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.

Credit

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.

License

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.

About

Run old World of Warcraft clients under CrossOver on Apple Silicon with native Rosetta x87 and ARPL translation.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages