felix86 26.08
Software 80-bit float support, thousands of new tests, tons of bug fixes, new features, and quality of life improvements!
Open Sauce 2026
At Open Sauce 2026, our friends at Works with RISC-V showcased Rocket League running on RISC-V using felix86!
Rocket League running at around 30-60 FPS
This is the Steam version of Rocket League. As the internet connectivity was spotty, this is a single player match against a bot.
Heroic Games Launcher
After fixing a bug with Python when running through felix86, the x86-64 Linux version of the Heroic Games Launcher now works in felix86. The embedded browser also works and users are able to register to the Epic Games store and download games.
Heroic Games Launcher works in 26.08
While the launcher itself works, most games are untested for now.
Make sure to get the .deb file and install it in a privileged shell: sudo felix86 --shell="dpkg -i /path/to/heroic.deb"
80-bit floats
Previously, felix86 would emulate the x87 80-bit floats using RISC-V 64-bit floats. This turned out to be fine for a lot of programs and games. However, there’s some software that relies on the extra precision the 80-bit floats provide. GOG installers are one such example of a program that uses FILD and FISTP instructions to copy memory, and 64-bit integer values can’t be losslessly represented with 64-bit floats. Other programs would use FLD and FSTP to copy 80 bits at once. Since felix86 would convert those to 64-bit floats, some data would be lost during the copy and cause problems.
In felix86 26.08, we use berkeley-softfloat-3 to emulate the x87 80-bit floats in C code. Since we want programs like GOG Windows installers to work by default, software emulation of 80-bit floats is now the default. You may use the FELIX86_REDUCED_PRECISION environment variable or the performance.reduced_precision option to use the old method, which should improve performance drastically in games that make heavy use of x87, but it may cause issues with programs that rely on the extra precision.
Our implementation passes 200+ of the FEX-Emu x87 assembly tests, and allows new tests from the GCC test-suite to pass.
GOG Windows installers work in 26.08
Ubuntu 26.04 support
The Ubuntu 26.04 rootfs is now ready to use, and is recommended over the 24.04 rootfs. You can get it using the rootfs installer script.
bash <(curl -fsSL https://install.felix86.com/rootfs.sh)
Make sure to delete your old rootfs to free up space. The path to the rootfs can be obtained with felix86 --get-config general.rootfs_path.
New location for configuration file
Since felix86 may run programs that change the uid, different users need to have access to the same configuration file. The felix86 configuration file has been moved from $HOME/.config/felix86/config.toml to /etc/opt/felix86/config.toml. This can be configured via the CMakeLists.txt file, which allows packagers to set a different path. The file can be read by all users but can only be written to by the root user. As mentioned in the previous post, the credentials bit is disabled by default in binfmt_misc installation. However, we still care to fix potential security holes. With a root-owned configuration file, a malicious actor won’t be able to modify the configuration file to change options passed to felix86, which would be a security issue when running setuid executables.
Quality of life improvements
--set-config and --get-config
You can now use --set-config and --get-config to get or set a configuration. For reasons previously mentioned, --set-config needs root permission.
Example:
export ROOTFS_PATH=$(felix86 --get-config general.rootfs_path)
Passing arguments to --shell
You can now run a command with the --shell argument, and it will run as if it were run via bash -c.
Example:
felix86 --shell="LD_SHOW_AUXV=1 /bin/echo hello"
Separate shell history
Since $HOME is shared by default, previous versions would have a shared shell history file. The --shell argument will now use its own history file by default. This can be changed via the general.shell_history_path option, and if the filename specified is the same as the host history file, you can have a shared history file like before.
Installation script
The installation script will now use whiptail to display prettier dialogs.
Accuracy improvements, bug fixes, and features
Conversion and rounding
On top of the 80-bit floats being now way more accurately emulated by default, SIMD conversion instructions like CVTPD2DQ are more accurately emulated. Rounding instructions like ROUNDPS now also account for overflows and underflows that vfcvt.x.f is susceptible to. These x86 instructions would be easy to emulate, but RISC-V has no vfround.vv instruction, and thus we need to use masking.
Illegal instructions
Instructions that change the cs segment to an invalid value or instructions that fail to decode will now raise the correct fault instead of asserting. Same goes for privileged instructions like INT1 or OUT.
Unimplemented syscalls
Unimplemented syscalls will now return -ESYS and warn instead of asserting.
Fix 64-bit signal handlers being called from 32-bit programs
Wine WoW64 installs a signal handler during 64-bit mode, then switches to 32-bit mode. If a signal happens during guest code the CPU will switch to 64-bit mode to run the signal handler, while saving the old CS in the frame. This was previously not properly implemented, which caused issues in the UE4 dependency installer. It is now fixed.
Remove relocations in .text in thunks
Our thunking mechanism required relocations in the .text section, which caused issues when the library was dlopened with newer glibc versions. Those relocations are now moved in the .data section.
Trap flag setting on IRETQ
A game with heavy DRM protection was using the trap flag a lot for anti-debugger purposes. Our iretq implementation was not updating the single step mode in the recompiler when the trap flag was set, leading to a bug. The game now gets further but hits a different assertion.
Even more tests
Apart from the tests mentioned previously, many new tests are integrated. These include 130+ gvisor tests and test runs of bwrap to prevent syscall-related regressions, as well as the dav1d test suite to strengthen our SIMD testing.
We also pass four previously-failing tests from the Valgrind test suite.
Intel ADX
The Intel ADX extension is now implemented, allowing the ADCX and ADOX instructions to run.
More unaligned atomics implemented
Some more unaligned atomic instructions are now implemented using LR/SC sequences. This fixes the game Path of Titans and likely other games.
Thanks for reading this post.
If you like this project, please give us a star on GitHub: https://github.com/OFFTKP/felix86
