On Sun, Apr 15, 2012 at 14:13, Stefan Weil <s...@weilnetz.de> wrote: > The default definition of setjmp which is implemented in MinGW-w64 > cannot be used with programs like QEMU which call longjmp from > code without structured exception handling (SEH).
We're currently compiling QEMU with -no-seh, is that correct for Mingw64? > > This code therefore disables stack unwinding. > > We could also implement SEH for QEMU's generated JIT code, but > that is much more difficult. Stack unwinding would also cost > execution time. > > Signed-off-by: Stefan Weil <s...@weilnetz.de> > --- > qemu-os-win32.h | 9 +++++++++ > 1 files changed, 9 insertions(+), 0 deletions(-) > > diff --git a/qemu-os-win32.h b/qemu-os-win32.h > index b6533c0..753679b 100644 > --- a/qemu-os-win32.h > +++ b/qemu-os-win32.h > @@ -56,6 +56,15 @@ > # define EWOULDBLOCK WSAEWOULDBLOCK > #endif > > +#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 > + > /* Declaration of ffs() is missing in MinGW's strings.h. */ > int ffs(int i); > > -- > 1.7.0.4 >