Updated: 11 December 1998 |
OpenVMS Programming Concepts Manual
Previous | Contents | Index |
On Alpha systems, an unaligned access trap is generated when an attempt is made to load or store a longword or quadword to or from a register using an address that does not have the natural alignment of the particular data reference and not using an Alpha instruction that takes an unaligned address as an operand (LDQ_U). For more information about data alignment, see Section 15.4.2.
Alpha compilers typically avoid triggering alignment faults by:
Note, however, that compilers cannot align dynamically defined data. Thus, alignment faults may be triggered.
An alignment exception is identified by the condition code SS$_ALIGN. Figure 15-2 illustrates the elements of the signal array returned by the SS$_ALIGN exception.
Figure 15-2 SS$_ALIGN Exception Signal Array
This signal array contains two arguments specific to the SS$_ALIGN
exception: the virtual address argument and the
register number argument. The virtual
address argument contains the address of the unaligned data
being accessed. The register number argument
identifies the target register of the operation.
15.4 How Run-Time Library Routines Handle Exceptions
Most general-purpose run-time library routines handle errors by returning a status in R0. In some cases, however, exceptions that occur during the execution of a run-time library routine are signaled. This section tells how run-time library routines signal exception conditions.
Some calls to the run-time library do not or cannot specify an action to be taken. In this case, the run-time library signals the proper exception condition by using the operating system's signaling mechanism.
In order to maintain modularity, the run-time library does not use
exception vectors, which are processwide data locations. Thus, the
run-time library itself does not establish handlers by using the
primary, secondary, or last-chance exception vectors.
15.4.1 Exception Conditions Signaled from Mathematics Routines (VAX Only)
On VAX systems, mathematics routines return function values in register
R0 or registers R0 and R1, unless the return values are larger than 64
bits. For this reason, mathematics routines cannot use R0 to return a
completion status and must signal all errors. In addition, all
mathematics routines signal an error specific to the MTH$ facility
rather than a general hardware error.
15.4.1.1 Integer Overflow and Floating-Point Overflow
Although the hardware normally detects integer overflow and floating-point overflow errors, run-time library mathematics routines are programmed with a software check to trap these conditions before the hardware signaling process can occur. This means that they call LIB$SIGNAL instead of allowing the hardware to initiate signaling.
The software check is needed because JSB routines cannot set up condition handlers. The check permits the JSB mathematics routines to add an extra stack frame so that the error message and stack traceback appear as if a CALL instruction had been performed. Because of the software check, JSB routines do not cause a hardware exception condition even when the calling program has enabled the detection of integer overflow. On the other hand, detection of floating-point overflow is always enabled and cannot be disabled.
If an integer or floating-point overflow occurs during a CALL or a JSB
routine, the routine signals a mathematics-specific error such as
MTH$_FLOOVEMAT (Floating Overflow in Math Library) by calling
LIB$SIGNAL explicitly.
15.4.1.2 Floating-Point Underflow
All mathematics routines are programmed to avoid floating-point underflow conditions. Software checks are made to determine if a floating-point underflow condition would occur. If so, the software makes an additional check:
The user can enable or disable detection of floating-point underflow at
run time by calling the routine LIB$FLT_UNDER.
15.4.2 System-Defined Arithmetic Condition Handlers
On VAX systems, you can use the following run-time library routines as arithmetic condition handlers to enable or disable the signaling of decimal overflow, floating-point underflow, and integer overflow:
You can establish these handlers in one of two ways:
You cannot disable the signaling of integer divide-by-zero, floating-point overflow, and floating-point or decimal divide-by-zero.
When the signaling of a hardware condition is enabled, the occurrence of the exception condition causes the operating system to signal the condition as a severe error. When the signaling of a hardware condition is disabled, the occurrence of the condition is ignored, and the processor executes the next instruction in the sequence.
The signaling of overflow and underflow detection is enabled independently for activation of each routine, because the call instruction saves the state of the calling program's hardware enable operations in the stack and then initializes the enable operations for the called routine. A return instruction restores the calling program's enable operations.
These run-time library routines are intended primarily for high-level languages, because you can achieve the same effect in MACRO with the single Bit Set PSW (BISPSW) or Bit Clear PSW (BICPSW) VAX instructions.
These routines allow you to enable and disable detection of decimal overflow, floating-point underflow, and integer overflow for a portion of your routine's execution. Note that the VAX BASIC and DEC Fortran compilers provide a compile-time qualifier that permits you to enable or disable integer overflow for your entire routine.
On Alpha systems, certain RTL routines that process conditions do not exist because the exception conditions defined by the Alpha architecture differ somewhat from those defined by the VAX architecture. Table 15-4 lists the run-time library condition-handling support routines available on VAX systems and indicates which are supported on Alpha systems.
Routine | Availability on Alpha Systems |
---|---|
Arithmetic Exception Support Routines | |
LIB$DEC_OVER--Enables or disables signaling of decimal overflow | Not supported |
LIB$FIXUP_FLT--Changes floating-point reserved operand to a specified value | Not supported |
LIB$FLT_UNDER--Enables or disables signaling of floating-point underflow | Not supported |
LIB$INT_OVER--Enables or disables signaling of integer overflow | Not supported |
General Condition-Handling Support Routines | |
LIB$DECODE_FAULT---Analyzes instruction context for fault | Not supported |
LIB$ESTABLISH---Establishes a condition handler | Not supported (languages may support for compatibility) |
LIB$MATCH_COND---Matches condition value | Supported |
LIB$REVERT--Deletes a condition handler | Not supported (languages may support for compatibility) |
LIB$SIG_TO_STOP---Converts a signaled condition to a condition that cannot be continued | Supported |
LIB$SIG_TO_RET---Converts a signal to a return status | Supported |
LIB$SIM_TRAP---Simulates a floating-point trap | Not supported |
LIB$SIGNAL---Signals an exception condition | Supported |
LIB$STOP---Stops execution by using signaling | Supported |
Error conditions are identified by integer values called condition codes or condition values. The operating system defines condition values to identify errors that might occur during execution of system-defined procedures. Each exception condition has associated with it a unique, 32-bit condition value that identifies the exception condition, and each condition value has a unique, systemwide symbol and an associated message. The condition value is used in both methods of indicating exception conditions, returning a status and signaling.
From a condition value you can determine whether an error has occurred, which error has occurred, and the severity of the error. Table 15-5 describes the fields of a condition value.
Field | Bits | Meaning |
---|---|---|
FAC_NO | <27:16> | Indicates the system facility in which the condition occurred |
MSG_NO | <15:3> | Indicates the condition that occurred |
SEVERITY | <2:0> | Indicates whether the condition is a success (bit <0> = 1) or a failure (bit <0> = 0) as well as the severity of the error, if any |
Figure 15-3 shows the format of a condition value.
Figure 15-3 Format of a Condition Value
severity
The severity of the error condition. Bit <0> indicates success (logical true) when set and failure (logical false) when clear. Bits <1> and <2> distinguish degrees of success or failure. The three bits, when taken as an unsigned integer, are interpreted as described in Table 15-6. The symbolic names are defined in module $STSDEF.
Table 15-6 Severity of Error Conditions Value Symbol Severity Response 0 STS$K_WARNING Warning Execution continues, unpredictable results 1 STS$K_SUCCESS Success Execution continues, expected results 2 STS$K_ERROR Error Execution continues, erroneous results 3 STS$K_INFO Information Execution continues, informational message displayed 4 STS$K_SEVERE Severe error Execution terminates, no output 5 Reserved for Compaq 6 Reserved for Compaq 7 Reserved for Compaq condition identification
Identifies the condition uniquely on a systemwide basis.control
Four control bits. Bit <28> inhibits the message associated with the condition value from being printed by the SYS$EXIT system service. After using the SYS$PUTMSG system service to display an error message, the system default handler sets this bit. It is also set in the condition value returned by a routine as a function value, if the routine has also signaled the condition, so that the condition has been either printed or suppressed. Bits <29:31> must be zero; they are reserved for Compaq.
When a software component completes execution, it returns a condition value in this format. When a severity value of warning, error, or severe error has been generated, the status value returned describes the nature of the problem. Your program can test this value to change the flow of control or to generate a message. Your program can also generate condition values to be examined by other routines and by the command language interpreter. Condition values defined by customers must set bits <27> and <15> so that these values do not conflict with values defined by Compaq.
message number
The number identifying the message associated with the error condition. It is a status identification, that is, a description of the hardware exception condition that occurred or a software-defined value. Message numbers with bit <15> set are specific to a single facility. Message numbers with bit <15> clear are systemwide status values.facility number
Identifies the software component generating the condition value. Bit <27> is set for user facilities and clear for Compaq facilities.
Most system-defined procedures are functions of longwords, where the
function value is equated to a condition value. In this capacity, the
condition value is referred to as a return status. You
can write your own routines to follow this convention. See
Section 15.14.3 for information about how to change a signal to a return
status. Each routine description in the OpenVMS System Services Reference Manual, OpenVMS RTL Library (LIB$) Manual,
OpenVMS Record Management Utilities Reference Manual, and OpenVMS Utility Routines Manual lists the condition values that can be
returned by that procedure.
15.5.1.1 Testing Returned Condition Values
When a function returns a condition value to your program unit, you should always examine the returned condition value. To check for a failure condition (warning, error, or severe error), test the returned condition value for a logical value of false. The following program segment invokes the run-time library procedure LIB$DATE_TIME, checks the returned condition value (returned in the variable STATUS), and, if an error has occurred, signals the condition value by calling the run-time library procedure LIB$SIGNAL ( Section 15.8 describes signaling):
INTEGER*4 STATUS, 2 LIB$DATE_TIME CHARACTER*23 DATE STATUS = LIB$DATE_TIME (DATE) IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL (STATUS)) |
To check for a specific error, test the return status for a particular condition value. For example, LIB$DATE_TIME returns a success value (LIB$_STRTRU) when it truncates the string. If you want to take special action when truncation occurs, specify the condition as shown in the following example (the special action would follow the IF statement):
INTEGER*4 STATUS, 2 LIB$DATE_TIME CHARACTER*23 DATE INCLUDE '($LIBDEF)' . . . STATUS = LIB$DATE_TIME (DATE) IF (STATUS .EQ. LIB$_STRTRU) THEN . . . |
The SS$_NOPRIV and SS$_EXQUOTA condition values returned by a number of system service procedures require special checking. Any system service that is listed as returning SS$_NOPRIV or SS$_EXQUOTA can instead return a more specific condition value that indicates the privilege or quota in question. Table 15-7 list the specific privilege errors, and Table 15-8 lists the quota errors.
SS$_NOACNT | SS$_NOALLSPOOL | SS$_NOALTPRI |
SS$_NOBUGCHK | SS$_NOBYPASS | SS$_NOCMEXEC |
SS$_NOCMKRNL | SS$_NODETACH | SS$_NODIAGNOSE |
SS$_NODOWNGRADE | SS$_NOEXQUOTA | SS$_NOGROUP |
SS$_NOGRPNAM | SS$_NOGRPPRV | SS$_NOLOGIO |
SS$_NOMOUNT | SS$_NONETMBX | SS$_NOOPER |
SS$_NOPFNMAP | SS$_NOPHYIO | SS$_NOPRMCEB |
SS$_NOPRMGBL | SS$_NOPRMMBX | SS$_NOPSWAPM |
SS$_NOREADALL | SS$_NOSECURITY | SS$_NOSETPRV |
SS$_NOSHARE | SS$_NOSHMEM | SS$_NOSYSGBL |
SS$_NOSYSLCK | SS$_NOSYSNAM | SS$_NOSYSPRV |
SS$_NOTMPMBX | SS$_NOUPGRADE | SS$_NOVOLPRO |
SS$_NOWORLD |
SS$_EXASTLM | SS$_EXBIOLM | SS$_EXBYTLM |
SS$_EXDIOLM | SS$_EXENQLM | SS$_EXFILLM |
SS$_EXPGFLQUOTA | SS$_EXPRCLM | SS$_EXTQELM |
Because either a general or a specific value can be returned, your program must test for both. The following four symbols provide a starting and ending point with which you can compare the returned condition value:
The following DEC Fortran example tests for a privilege error by comparing STATUS (the returned condition value) with the specific condition value SS$_NOPRIV and the range provided by SS$_NOPRIVSTRT and SS$_NOPRIVEND. You would test for SS$_NOEXQUOTA in a similar fashion.
. . . ! Declare status and status values INTEGER STATUS INCLUDE '($SSDEF)' . . . IF (.NOT. STATUS) THEN IF ((STATUS .EQ. SS$_NOPRIV) .OR. 2 ((STATUS .GE. SS$_NOPRIVSTRT) .AND. 2 (STATUS .LE. SS$_NOPRIVEND))) THEN . . . ELSE CALL LIB$SIGNAL (%VAL(STATUS)) END IF END IF |
To modify a condition value, copy a series of bits from one longword to another longword. For example, the following statement copies the first three bits (bits <2:0>) of STS$K_INFO to the first three bits of the signaled condition code, which is in the second element of the signal array named SIGARGS. As shown in Table 15-6, STS$K_INFO contains the symbolic severity code for an informational message.
! Declare STS$K_ symbols INCLUDE '($STSDEF)' . . . ! Change the severity of the condition code ! in SIGARGS(2) to informational CALL MVBITS (STS$K_INFO, 2 0, 2 3, 2 SIGARGS(2), 2 0) |
Once you modify the condition value, you can resignal the condition value and either let the default condition handler display the associated message or use the SYS$PUTMSG system service to display the message. If your condition handler displays the message, do not resignal the condition value, or the default condition handler will display the message a second time.
In the following example, the condition handler verifies that the signaled condition value is LIB$_NOSUCHSYM. If it is, the handler changes its severity from error to informational and then resignals the modified condition value. As a result of the handler's actions, the program displays an informational message indicating that the specified symbol does not exist, and then continues executing.
INTEGER FUNCTION SYMBOL (SIGARGS, 2 MECHARGS) ! Changes LIB$_NOSUCHSYM to an informational message ! Declare dummy arguments INTEGER*4 SIGARGS(*), 2 MECHARGS(*) ! Declare index variable for LIB$MATCH_COND INTEGER INDEX ! Declare condition codes INCLUDE '($LIBDEF)' INCLUDE '($STSDEF)' INCLUDE '($SSDEF)' ! Declare library procedures INTEGER LIB$MATCH_COND INDEX = LIB$MATCH_COND (SIGARGS(2), 2 LIB$NO_SUCHSYM) ! If the signaled condition code is LIB$NO_SUCHSYM, ! change its severity to informational. IF (INDEX .GT. 0) 2 CALL MVBITS (STS$K_INFO, 2 0, 2 3, 2 SIGARGS(2), 2 0) SYMBOL = SS$_RESIGNAL END |
Previous | Next | Contents | Index |
Copyright © Compaq Computer Corporation 1998. All rights reserved. Legal |
5841PRO_040.HTML
|