exc_resume, exc_longjmp, exc_capture_context, exc_continue,
exc_unwind, RtlUnwindRfp - entry points that support
resuming execution of user code
PCONTEXT contextRecord ); void exc_longjmp(
long returnValue ); unsigned long exc_capture_context(
PCONTEXT contextRecord ); void exc_continue(
PCONTEXT contextRecord ); void exc_unwind(
long returnValue ); void RtlUnwindRfp(
long returnValue );
Exception Handling Library (libexc.a)
Pointer to a struct sigcontext (see signal(2)) used to
represent a procedure's context. Value to be passed to
the continuing code at the completion of the unwind. If
nonzero, virtual frame pointer of the target procedure
invocation to which the unwind is to be done; if zero,
specifies that an exit unwind is to be initiated and
causes the EXCEPTION_EXIT_UNWIND flag to be set in the
exception record. If TargetRealFrame is nonzero, address
within the target invocation at which to continue execution;
otherwise, this parameter is ignored. Address of
primary exception record. If nonzero, real frame pointer
of the target procedure invocation to which the unwind is
to be done; if zero, specifies that an exit unwind is to
be initiated and causes the EXCEPTION_EXIT_UNWIND flag to
be set in the exception record.
The exc_resume() and exc_continue() functions perform
essentially the same operation as longjmp(3). The
exc_resume() function is a libexc entry point.
The exc_capture_context() function saves the current procedure
context in the struct sigcontext identified by contextRecord.
The exc_longjmp() function restores the context that was
saved by a previous call to exc_capture_context() and
calls exc_unwind(), setting up its arguments from information
taken from the contextRecord argument. If the returnValue
argument is 0 (zero), it is set to 1 (one) before
The exc_unwind() function initiates an unwind of procedure
call frames. It sets the EXCEPTION_UNWINDING flag in the
exception flags of the exception record, which describes
the machine state at the time of the exc_unwind() call. If
the TargetFrame argument is zero, then exc_unwind() also
sets the EXCEPTION_EXIT_UNWIND flag. It then scans the
procedure call frames towards the base of the call stack
to find the target of the unwind operation.
The RtlUnwindRfp() function is similar to exc_unwind()
except that its first argument is a real frame pointer
instead of a virtual frame pointer. Real frame pointers
point to the bottom of the statically allocated portion of
a stack frame. Virtual frame pointers point to the top of
the stack frame.
As it encounters each frame, the unwind code determines
the program counter where control left the corresponding
function by looking at exception handler information in
the run-time function table built by the linker. If the
respective routine has an exception handler, then the
unwind code calls it. This handler should perform cleanup
code required for that activation. Programs written in
the C programming language, which supports structured
exception handling, usually contain a try...finally block
that implements a termination handler that performs these
chores (see c_excpt(4)). The unwind code also calls a
handler when it reaches the TargetFrame so that any scopeoriented
cleanup code or termination handler can execute.
In this case, it sets the EXCEPTION_TARGET_FRAME flag in
the ExceptionFlags field of the exception record.
Once it finds the TargetFrame (if specified) and calls its
handler (if available), exc_unwind(): Sets the PC to the
TargetIp Sets the return value to be the returnValue argument,
if the returnValue argument is nonzero, Sets the
return value to be the ExceptionCode of the exception
record if the returnValue argument is zero Calls exc_continue()
The exc_capture_context() function returns a value of 0
(zero), unless the return is from a call to the
exc_longjmp() function, in which case exc_capture_context()
returns the nonzero value specified in the returnValue
argument to exc_longjmp().
The exc_longjmp() function cannot return 0 (zero) to the
previous context. The value 0 is reserved to indicate the
actual return from the exc_capture_context() function when
first called by the program. If the exc_longjmp function()
is passed a returnValue parameter of 0, execution continues
as if the corresponding call to the exc_capture_context()
function had returned a value of 1.
/usr/ccs/lib/cmplrs/cc/libexc.a -- exception handling library
/usr/include/excpt.h -- include file
/usr/include/pdsc.h -- include file
/usr/include/signal.h -- include file
/usr/include/machine/fpu.h -- include file
Functions: exception_intro(3), exception_dispatcher(3),
exc_lookup_function_entry(3), signal(2), sigaction(2),
Files: excpt(4), c_excpt(4), signal(4), pdsc(4).
Assembly Language Programmer's Guide.
Calling Standard for Alpha Systems.
[ Back ]