Ensure that signal handlers see the C stack, not the Scheme stack.
authorTaylor R Campbell <campbell@mumble.net>
Thu, 5 Aug 2010 17:15:17 +0000 (17:15 +0000)
committerTaylor R Campbell <campbell@mumble.net>
Thu, 5 Aug 2010 17:15:17 +0000 (17:15 +0000)
commit58ebfe2cf949468ce5d14d2372462e13f223989d
treee58929ad67541af0bce0773bdaa6c2892161552a
parent1a24cc9da63c032efb8c2b0a15986e04e10ecfa1
Ensure that signal handlers see the C stack, not the Scheme stack.

Do this by wrapping all the signal handlers in stubs that call an
assembly hook to make the stack pointer point into the C stack rather
than the Scheme stack if necessary.  To indicate that this is not
necessary, define SIGNAL_HANDLERS_CAN_USE_SCHEME_STACK.  For now, I'm
leaving that undefined by default, because it is the safer option.

This solves a problem on operating systems such as NetBSD that store
the current pthread identifier in the stack pointer.  When Scheme's
signal handler calls routines that are pthread cancellation points,
such as waitpid, they try to find the current pthread identifier in a
stack pointer that points off into oblivion (into Scheme's stack) and
promptly crash -- or, worse, trigger SIGSEGV, to be handled by a
signal handler while the stack pointer still points into Scheme's
stack, with the same problem.

I am told that this will be fixed in NetBSD 6 (since it interferes
not just with Scheme but also with sigaltstack, makecontext, and
anything else that wants to mess with the stack pointer), but only on
i386 and amd64 for certain, and in any case, this workaround will
work on any other systems that try to use the same trick to store the
current pthread identifier, of which I believe there may be several.
(E.g., older versions of GNU/Linux with LinuxThreads.)
src/microcode/cmpauxmd/i386.m4
src/microcode/cmpauxmd/x86-64.m4
src/microcode/cmpintmd/i386.h
src/microcode/cmpintmd/x86-64.h
src/microcode/uxsig.h