[parisc-linux] sigsetreturn (was utssys?)
Cary Coutant
cary@cup.hp.com
Tue, 17 Aug 1999 12:20:07 -0700
>I also can't find a manual page for sigsetreturn() which I probably need
>to understand more deeply than utssys :-)
When the kernel passes control to a signal handler, it needs to set the
stack up with a signal context structure and a return address that
results in the restoration of that context when (and if) the signal
handler returns. Since the normal BV instruction used for returns can't
branch across space boundaries, the signal handler can't return directly
to kernel space, so the kernel needs to supply a return address in user
space that will implement the restoration of the interrupted context.
This return address is the sigreturn() system call, found in libc. In
order for the kernel to know the address of sigreturn, it needs to be
told in advance; that's what sigsetreturn() does.
The call to sigsetreturn() has been moved around several times in the
history of HP-UX. At one point, it was in the _start() routine in the C
library, but that didn't get called for Fortran programs, so it was added
to several of the signal routines, to make sure it got called before any
signal handlers could be installed. Ultimately, I think it ended up in
crt0, where it should have been all along.
Sigsetreturn() also supplies a "cookie" that the kernel can use to
determine what the vintage is of the running program. For programs build
for PA 1.0, for example, the cookie tells the kernel to deliver a shorter
signal context record, since some of those early applications were
actually dependent on the size and layout of the context record. Someone
in OS land will probably have to supply you with the detailed meanings of
the cookies used in this call, if it matters.
Cary Coutant
Runtime Architect