Am 06.08.2015 um 10:44 schrieb Kevin Wolf:
Am 05.08.2015 um 22:30 hat Stefan Weil geschrieben:
Am 05.08.2015 um 20:39 schrieb Liviu Ionescu:
On 05 Aug 2015, at 19:56, Paolo Bonzini <pbonz...@redhat.com> wrote:

... I am not sure why things break for Stefan...
I confirm Stefan's conclusion, neither in my configuration adding

#include "qemu-common.h"

... in cpu-exec.c makes any difference.

however adding:

#if defined(_WIN64)
#ifdef sigsetjmp
#undef sigsetjmp
#endif
#define sigsetjmp(env, savesigs) _setjmp(env, NULL)
#endif

... fixes the problem, my custom QEMU happily blinks the LEDs on Win 8.1 
64-bits (see below).

perhaps a headers check would be helpful, such mysterious behaviours usually 
back fire at a certain point.


regards,

Liviu
http://qemu.weilnetz.de/test/cpu-exec.i shows the result of
the C preprocessor:

cpu-exec.c gets QEMU's os-win32.h with our definition of setjmp
early, but the system header file setjmp.h is included later, and
that file re-defines our definitions. Including setjmp.h from
os-win32.h would solve the problem, but I think there is a
better solution.

I am planning to remove the special definitions for _WIN64 from
os-win32.h and add them to cpu-exec.c, similar to the code
above (which can be shortened a little)
but with some comment lines added.
What happens with the callers outside of cpu-exec.c then? Fixing the
problem inside os-win32.h seems more robust to me.

Kevin

(sig)setjmp/(sig)longjmp without TCG generated code on the stack
does not need special handling because stack unwinding works
for compiled normal C code.

We only have a problem on 64 bit Windows with code generated
at run time by TCG because stack unwinding does not work there,
so a siglongjmp which tries to exit from that code will crash QEMU
when trying to unwind the call stack.

As far as I see, the only siglongjmp exits from TCG generated code
are in cpu-exec.c (functions cpu_loop_exit and
cpu_resume_from_signal). The matching sigsetjmp is also in
cpu-exec.c, and here we have to disable stack unwinding
by calling _setjmp(cpu->jmp_env, NULL).

Stefan


Reply via email to