A discussion came up today on MSYS2 Discord about trying to build qemu for
Windows ARM64
(https://discord.com/channels/792780131906617355/794889490941476915/958319683902259250).

Apparently QEMU is trying to use setjmp/longjmp within
TCG-generated code, and that is failing on ARM64 with  0xc00000ff:
STATUS_BAD_FUNCTION_TABLE

QEMU has a work-around for this situation on x86_64:
#if defined(_WIN64)
/* On w64, setjmp is implemented by _setjmp which needs a second parameter.
 * If this parameter is NULL, longjump does no stack unwinding.
 * That is what we need for QEMU. Passing the value of register rsp (default)
 * lets longjmp try a stack unwinding which will crash with generated code. */
# undef setjmp
# define setjmp(env) _setjmp(env, NULL)
#endif

This trick doesn't work on ARM64.  After some back-and-forth, we found
that __mingw_setjmp/__mingw_longjmp do work in this case, but it is not
obvious how to satisfy the conditions in the headers to switch to that
implementation without switching the exception model, which seems like
it could have some serious side-effects.

I was wondering if it might make sense to add a check for a
user-controllable define to override the implementation (something like
USE_NO_MINGW_SETJMP_TWO_ARGS seems to be intended to do) for situations
where code is generated at runtime without SEH tables.


_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to