mirror of
https://github.com/FEX-Emu/FEX.git
synced 2025-02-11 01:46:19 +00:00
![Ryan Houdek](/assets/img/avatar_default.png)
Due to how we use a modified ABI for these indirect functions, we don't have a clean way to say that the host_addr lives in a side-argument. The previous inline asm that moved the value from r11 in to a variable worked up until you hit functions with 8 or more arguments. At that point the compiler was generating code before our inline assembly and using r11 as a temporary, thus destroying our value. Then a crash would occur and it was very hard to determine why. It would end up calling some random function (0x1 in this case) from an indirect call. This made it /look/ like it was calling an invalid function returned from the loader but in reality it was a corrupt register loading bad data. To work around this case, we can use an inline asm register variable and a volatile asm block that "sets" the variable. In this case GCC and Clang both seem to extend the live range of the register from the start of the function to the use of the variable. This resolves the issue for now, and I tested quite a large number of function signatures to see if it would break in the future. Theoretically our functional testing should catch this, but we don't currently have something that abuses all the functions like this currently.