rws%mit-bold@sri-unix.UUCP (12/21/83)
From: Robert W. Scheifler <rws@mit-bold> Description: sigstack() seems like this wonderful thing, allowing applications to field signals without modifying the normal stack. This is useful, for example, when you need to control values on the stack to avoid garbage collection problems. Unfortunately, to take advantage of a VAX instruction (REI), the sigcontext structure that is passed to the signal handler is always pushed onto the CURRENT stack, not the stack specified with sigstack(). As near as I can tell, this largely defeats the whole purpose of sigstack(). (Fortunately for my applications, namely CLU and Argus, I can guarantee that these 5 longs won't look like heap references, so I luck out.) Repeat-By: Use sigstack() and sigvec() to set up a stack and handler, and cause the appropriate interrupt. Look which stack the sigcontext is on. Fix: The sigcontext is only pushed on the current stack so that the PS+PC part can be used by the REI instruction in the signal trampoline code. The fix is probably to do the REI "by hand" in sigcleanup() instead, or perhaps do some correctness checks on the PS+PC, and then update the PS+PC on the kernel stack for the REI back from the CHMK 139, thus collapsing what is currently an REI-to-REI into a single REI.