| Previous | Contents | Index |
The mechanism argument vector for the argument
mechanism_args contains information about the machine
state when an exception occurs or when a condition is signaled.
Therefore, the mechanism argument vector is highly specific to the
underlying machine architecture.
8.5.1.2.1 VAX Mechanism Vector Format
On VAX systems, the mechanism format for the argument vectors is shown in Figure 8-5. The first longword contains the argument vector count, which is the number of remaining longwords in the vector. The frame longword contains the contents of the FP in the establisher's context. If the restrictions described in Section 8.5.3.1 are met, the frame can be used as a base from which to access the local storage of the establisher.
The depth longword is a positive count of the number of procedure-activation stack frames between the frame in which the exception occurred and the frame depth that established the handler being called. (For more information about depth, see Section 8.5.1.3.)
The CHF$L_MCH_SAVR0 and CHF$L_MCH_SAVR1 longwords save the state of the R0 and R1 registers, respectively, at the time of the call to LIB$SIGNAL or LIB$STOP. If not modified by a handler during CHF processing, these values will become the values of those registers after completion of CHF processing (either by continuation or by unwinding). These two fields may be modified by a handler to establish different values to be used at CHF completion. Note that the contents of other registers are not available in the mechanism vector and can only be accessed by analysis of the stack. (See Section 8.7.1.)
CHF$L_MCH_SAVR0 and CHF$L_MCH_SAVR1 are the only fields of a VAX mechanism vector that can be validly modified by a handler. The effect of any other modification is undefined.
Figure 8-5 VAX Mechanism Vector Format
If the VAX vector hardware or emulator option is in use, then for hardware-detected exceptions, the vector state is implicitly saved before any condition handler is entered and restored after the condition handler returns. (Save and restore is not required for exceptions initiated by calls to LIB$SIGNAL or LIB$STOP, because there can be no useful vector state at the time of such calls in accordance with the rules for vector register usage in Section 2.1.2.) Thus, a condition handler can make use of the system vector facilities in the same manner as mainline code.
The VAX saved vector state is not directly available to a condition
handler. A condition handler that needs to manipulate the vector state
to carry out agreements with its callers can call the
SYS$RESTORE_VP_STATE service. This service restores the saved state to
the vector registers (whether hardware or emulated) and cancels any
subsequent restore. The vector state can then be manipulated directly
in the normal manner by means of vector instructions. (This service is
normally of interest only during processing for an unwind condition.)
8.5.1.2.2 Alpha Mechanism Vector Format
On Alpha systems, the 64-bit-wide mechanism array is the argument mechanism in the handler call. The array is shown in Figure 8-6. Table 8-5 lists and describes the fields.
The following table lists variable name equivalence for HP OpenVMS Version 8.2 and earlier and HP OpenVMS Version 8.2 and later. Although HP OpenVMS Version 8.2 and later offer backward compatibility, we recommend that you use the new names for that version of the operating system. |
| HP OpenVMS Version 8.2 and earlier | HP OpenVMS Version 8.2 and later |
|---|---|
| MCH_SAVR0 | MCH_RETVAL |
| MCH_SAVR1 | MCH_RETVAL2 |
| MCH_SAVF0 | MCH_RETVAL_FLOAT |
| MCH_SAVF1 | MCH_RETVAL2_FLOAT |
The CHF$IH_MCH_RETVALx and CHF$FH_MCH_RETVALx_FLOAT quadwords save the state of the nonpreserved general and floating registers, respectively, at the time of the call to LIB$SIGNAL or LIB$STOP. If not modified by a handler during CHF processing, these values will become the values of those registers after completion of CHF processing (either by continuation or by unwinding). These fields may be modified by a handler to establish different values to be used at CHF completion.
The CHF$IH_MCH_RETVALx and CHF$FH_MCH_RETVALx_FLOAT fields are the only fields of an Alpha mechanism vector that can be validly modified by a handler. The effect of any other modification is undefined. (See also Section 8.7.2.) Note that the contents of the normally preserved registers are not available in the mechanism vector and can only be accessed by analysis of the stack. (See Section 8.7.1.)
The recommended method for modifying return values in a procedure's invocation context (CHF$IH_MCH_RETVAL, CHF$IH_MCH_RETVAL2, CHF$IH_MCH_RETVAL_FLOAT, and CHF$IH_RETVAL2_FLOAT) is by using routine SYS$SET_RETURN_VALUE (see Section 8.7.2). The recommended method for modifying all other registers in a procedure's invocation context is by using routine LIB$PUT_INVO_REGISTERS ( Section 3.5.3.6).
Figure 8-6 Alpha Mechanism Vector Format
| Field Name | Contents | ||
|---|---|---|---|
| CHF$IS_MCH_ARGS | Count of quadwords in this array starting from the next quadword, CHF$PH_MCH_FRAME (not counting the first quadword that contains this longword). This value is always 44. | ||
| CHF$IS_MCH_FLAGS |
Flag bits <31:0> for related argument-mechanism information
defined as follows:
|
||
| CHF$PH_MCH_FRAME | Contains the frame pointer in the procedure context of the establisher. | ||
| CHF$IS_MCH_DEPTH | Positive count of the number of procedure activation stack frames between the frame in which the exception occurred and the frame depth that established the handler being called (see Section 8.5.1.3). | ||
| CHF$IS_MCH_RESVD1 | Reserved to Hewlett-Packard. | ||
| CHF$PH_MCH_DADDR | Address of the handler data quadword if the exception handler data field is present (as indicated by PDSC$V_HANDLER_DATA_VALID); otherwise, contains 0. | ||
| CHF$PH_MCH_ESF_ADDR | Address of the exception stack frame (see the Alpha Architecture Reference Manual). | ||
| CHF$PH_MCH_SIG_ADDR | Address of the 32-bit form of signal array. This array is a 32-bit wide (longword) array. This is the same array that is passed to a handler as the signal argument vector. | ||
| CHF$IH_MCH_RETVAL | Contains a copy of R0 at the time of the exception. | ||
| CHF$IH_MCH_RETVAL2 | Contains a copy of R1 at the time of the exception. | ||
| CHF$IH_MCH_SAVR nn | Contain copies of the saved integer registers at the time of the exception. The following registers are saved: R16 through R28. Registers R2 through R15 are implicitly saved in the call stack. | ||
| CHF$FH_MCH_RETVAL_FLOAT | Contains a copy of F0 at the time of the exception, or is unpredictable as described for the field CHF$IS_MCH_FLAGS. | ||
| CHF$FH_MCH_RETVAL2_FLOAT | Contains a copy of F1 at the time of the exception, or is unpredictable as described for the field CHF$IS_MCH_FLAGS. | ||
| CHF$FH_MCH_SAVF nn | Contain copies of the saved floating-point registers at the time of the exception, or are unpredictable as described at field CHF$IS_MCH_FLAGS. If the floating-point register fields are valid, the following registers are saved: F10 through F30. Registers F2 through F9 are implicitly saved in the call | ||
| CHF$PH_MCH_SIG64_ADDR | Address of the 64-bit form of signal array. This array is a 64-bit wide (quadword) array. |
8.5.1.2.3 I64 Mechanism Vector Format
On I64 systems, the 64-bit-wide mechanism array is the
argument mechanism in the handler call. The array is shown in
Figure 8-7.
The CHF$IH_MCH_RETVAL and CHF$FH_MCH_RETVAL2 quadwords save the state of registers R8 and R9 at the time of the call to LIB$SIGNAL or LIB$STOP. The CHF$FH_MCH_RETVAL_FLOAT, CHF$FH_MCH_RETVAL2_FLOAT, and CHF$FH_MCH_SAVFnn octawords save the state of the floating-point registers at the time of the call to LIB$SIGNAL or LIB$STOP. If not modified by a handler during CHF processing (as described below), these values will become the values of those registers after completion of CHF processing (either by continuation or by unwinding).
The only supported method for modifying return values in a procedure's invocation context (CHF$IH_MCH_RETVAL, CHF$IH_MCH_RETVAL2, CHF$FH_MCH_RETVAL_FLOAT, CHF$FH_MCH_RETVAL2_FLOAT) is by using routine SYS$SET_RETURN_VALUE (see Section 8.7.2). The only supported method for modifying all other registers in a procedure invocation context is by using routine LIB$I64_PUT_INVO_REGISTERS ( Section 4.8.3.13).
Figure 8-7 I64 Mechanism Vector Format
.
| Field Name | Contents | ||||
|---|---|---|---|---|---|
| CHF$IS_MCH_ARGS | Count of quadwords in this array starting from the next quadword, CHF$PH_MCH_FRAME (not counting the first quadword that contains this longword). This value is 73 if CHF$V_FPREGS2_VALID is clear, and 265 if CHF$V_FPREGS2_VALID is set. | ||||
| CHF$IS_MCH_FLAGS |
Flag bits <31:0> for related argument-mechanism information
defined as follows:
|
||||
| CHF$PH_MCH_FRAME | Contains the Previous Stack Pointer, PSP, (the value of the SP at procedure entry) for the procedure context of the establisher (see Section 4.5.1.) | ||||
| CHF$IS_MCH_DEPTH | Positive count of the number of procedure activation stack frames between the frame in which the exception occurred and the frame depth that established the handler being called (see Section 8.5.1.3). | ||||
| CHF$IS_MCH_RESVD1 | Reserved to Hewlett-Packard. | ||||
| CHF$PH_MCH_DADDR | Address of the handler data quadword (start of the Language Specific Data area, LSDA, see Section A.4.1 and Section A.4.4) if the exception handler data field is present in the unwind information block (as indicated by OSSD$V_HANDLER_DATA_VALID); otherwise, contains 0. | ||||
| CHF$PH_MCH_ESF_ADDR | Address of the exception stack frame. | ||||
| CHF$PH_MCH_SIG_ADDR | Address of the 32-bit form of signal array. This array is a 32-bit wide (longword) array. This is the same array that is passed to a handler as the signal argument vector. | ||||
| CHF$IH_MCH_RETVAL | Contains a copy of R8 at the time of the exception. | ||||
| CHF$IH_MCH_RETVAL2 | Contains a copy of R9 at the time of the exception. | ||||
| CHF$PH_MCH_SIG64_ADDR | Address of the 64-bit form of signal array. This array is a 64-bit wide (quadword) array. | ||||
| CHF$FH_MCH_SAVF32_SAVF127 | Address of the extension to the mechanism array that contains copies of F32-F127 at the time of the exception. | ||||
| CHF$FH_MCH_RETVAL_FLOAT | Contains a copy of F8 at the time of the exception. | ||||
| CHF$FH_MCH_RETVAL2_FLOAT | Contains a copy of F9 at the time of the exception. | ||||
| CHF$FH_MCH_SAVF nn | Contain copies of floating-point registers F2-F5 and F12-F31. Registers F6-F7 and F10-F11 are implicitly saved in the exception frame. | ||||
| CHF$IH_MCH_SAVB nn | Contains copies of branch registers B1-B5 at the time of the exception. | ||||
| CHF$IH_MCH_AR_LC | Contains a copy of the Loop Count Register (AR65) at the time of the exception. | ||||
| CHF$IH_MCH_AR_EC | Contains a copy of the Epilog Count Register (AR66) at the time of the exception. | ||||
| CHF$PH_MCH_OSSD | Address of the operating system-specific data area. | ||||
| CHF$PH_MCH_INVO_HANDLE | Contains the invocation handle of the procedure context of the establisher (see Section 4.8.2.2) | ||||
| CHF$PH_MCH_UWR_START | Address of the unwind region. | ||||
| CHF$IH_MCH_FPSR | Contains a copy of the hardware floating-point status register (AR.FPSR) at the time of the exception. | ||||
| CHF$IH_MCH_FPSS | Contains a copy of the software floating-point status register (which supplements CHF$IH_MCH_FPSR) at the time of the exception. |
For all argument mechanisms, the depth field has the value 0 for an exception that is handled by the procedure activation invoking the exception. The exception procedure contains the instruction that either causes the hardware exception or calls LIB$SIGNAL. The depth field of the argument mechanism has positive values for procedure activations calling the one having the exception, for example, 1 for the immediate caller.
If a system service gives an exception, the immediate caller of the service is notified at depth = 1. The depth field has a value of - 2 when the condition handler is established by the primary exception vector, a value of - 1 when it is established by the secondary vector, and a value of - 3 when it is established by the last-chance vector.
Given the same circumstances, the mechanism depth on any given processor type is not necessarily the same as the depth on a different processor type (that is, the depth on a VAX processor may differ from that on an Alpha or Intel Itanium processor, and so on) if any of the following are present:
If one of the default condition handlers established by the system is
entered, the handler calls the SYS$PUTMSG system service to interpret
the signal argument list and to output the indicated information or
error message. See the description of SYS$PUTMSG in the HP OpenVMS System Services Reference Manual
for the format of the signal argument list.
8.5.3 Coordinating the Handler and Establisher
This section describes the requirements for use of memory, exception
synchronization, and continuation of the handler.
8.5.3.1 Use of Memory
Exceptions can be raised and unwind operations (which cause exception handlers to be called) can occur when the current value of one or more variables is in registers rather than in memory. Because of this, a handler, and any descendant procedure called directly or indirectly by a handler, must not access any variables except those explicitly passed to the procedure as arguments or those that exist in the normal scope of the procedure.
This rule can be violated for specific memory locations only by
agreement between the handler and all procedures that might access
those memory locations. A handler that makes such agreements does not
conform to this standard.
8.5.3.2 Exception Synchronization (Alpha Only)
The Alpha hardware architecture allows instructions to complete in a different order than that in which they were issued, and for exceptions caused by an instruction to be raised after subsequently issued instructions have been completed.
Because of this, the state of the machine when a hardware exception occurs cannot be assumed with the same precision as it can be assumed on VAX or Intel Itanium processors unless such precision has been guaranteed by bounding the exception range with the appropriate insertion of TRAPB instructions.
The rules for bounding the exception range follow:
These rules ensure that exceptions are detected in the intended context of the exception handler.
These rules do not ensure that all exceptions are detected
while the procedure within which the exception-causing instruction was
issued is current. For example, if a procedure without an exception
handler is called by a procedure that has an exception handler not
sensitive to invocation depth, an exception detected while that called
procedure is current may have been caused by an instruction issued
while the caller was the current procedure. This means the frame,
designated by the exception-handling information, is the frame that was
current when the exception was detected, not necessarily the frame that
was current when the exception-causing instruction was issued.
8.5.3.3 Continuation from Exceptions (Alpha Only)
The Alpha architecture guarantees neither that instructions are completed in the same order in which they were fetched from memory nor that instruction execution is strictly sequential. Continuation is possible after some exceptions, but certain restrictions apply.
By definition, software-raised general exceptions are synchronous with the instruction stream and can have a well-defined continuation point. Therefore, a handler can request continuation from a software-raised exception. However, since compiler-generated code typically relies on error-free execution of previously executed code, continuing from a software-raised exception might produce unpredictable results and unreliable behavior unless the handler has explicitly fixed the cause of the exception so that it is transparent to subsequent code.
Hardware faults on Alpha processors follow the same rules as the strict interpretation of the VAX or Itanium rules. Loosely paraphrased, these rules state that if the offending exception is fixed, reexecution of the instruction (as determined from the supplied PC) will yield correct results. This does not imply that instructions following the faulting instruction have not been executed. Therefore, hardware faults can be viewed as similar to software-raised exceptions and can have well-defined continuation points.
Arithmetic traps cannot be restarted because all the information required for a restart is not available. The most straightforward and reliable way in which software can guarantee the ability to continue from this type of exception is by placing appropriate TRAPB instructions in the code stream. Although this technique does allow continuation, it must be used with extreme caution because of the negative effect on application performance.
| Previous | Next | Contents | Index |