home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mod201j.zip / modula2.exe / os2api / dosexcep.def < prev    next >
Text File  |  1994-05-03  |  14KB  |  376 lines

  1. DEFINITION MODULE DOSEXCEPTIONS;
  2.  
  3. (************************************************************************
  4.   OS/2 2.0 interface for exception management support.
  5.  
  6.   Copyright (c) 1992 by Juergen Neuhoff
  7. *************************************************************************)
  8.  
  9. (*$XL+       Modula-2 language extensions: '_' allowed for symbol names *)
  10. (*$CDECL+    C-style procedures                                         *)
  11. (*$A         default alignment for record fields                        *)
  12.  
  13. IMPORT SYSTEM;
  14. FROM   OS2DEF     IMPORT TYPEPREFIX, APIRET, PID;
  15.  
  16. CONST (* DosSetSigExceptionFocus() codes *)
  17.   SIG_UNSETFOCUS = 0;
  18.   SIG_SETFOCUS   = 1;
  19.  
  20. CONST (* User Exception Handler Return Codes *)
  21.   XCPT_CONTINUE_SEARCH    =  00000000H;     (* exception not handled   *)
  22.   XCPT_CONTINUE_EXECUTION = 0FFFFFFFFH;     (* exception handled       *)
  23.   XCPT_CONTINUE_STOP      =  00716668H;     (* exception handled by    *)
  24.                                             (* debugger (VIA DosDebug) *)
  25.  
  26. CONST (* HandlerFlags values (see ExceptionReportRecord) *)
  27.       (* The user may only set (but not clear) the EH_NONCONTINUABLE flag. *)
  28.       (* All other flags are set by the system. *)
  29.   EH_NONCONTINUABLE = 1H;          (* Noncontinuable exception *)
  30.   EH_UNWINDING      = 2H;          (* Unwind is in progress *)
  31.   EH_EXIT_UNWIND    = 4H;          (* Exit unwind is in progress *)
  32.   EH_STACK_INVALID  = 8H;          (* Stack out of limits or unaligned *)
  33.   EH_NESTED_CALL    = 10H;         (* Nested exception handler call *)
  34.  
  35.  
  36. CONST (* Unwind all exception handlers (see DosUnwindException API) *)
  37.   UNWIND_ALL        = 0;
  38.  
  39.  
  40. (*
  41.  *   Exception values are 32 bit values layed out as follows:
  42.  *
  43.  *   3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
  44.  *   1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
  45.  *   +---+-+-------------------------+-------------------------------+
  46.  *   |Sev|C|       Facility          |               Code            |
  47.  *   +---+-+-------------------------+-------------------------------+
  48.  *
  49.  *   where
  50.  *
  51.  *       Sev - is the severity code
  52.  *           00 - Success
  53.  *           01 - Informational
  54.  *           10 - Warning
  55.  *           11 - Error
  56.  *
  57.  *       C - is the Customer code flag
  58.  *
  59.  *       Facility - is the facility code
  60.  *
  61.  *       Code - is the facility's status code
  62.  *
  63.  *   Exceptions specific to OS/2 2.0 (e.g. XCPT_SIGNAL) will be marked
  64.  *   with a facility code of 1.
  65.  *
  66.  *   System defined exceptions have a facility code of zero.
  67.  *
  68.  *   Each exception may also have several pieces of additional information.
  69.  *   These are stored in the ExceptionInfo fields of the
  70.  *   ExceptionReportRecord. They are documented here with the exceptions
  71.  *   only for ease of reference.
  72.  *)
  73.  
  74. CONST
  75.   XCPT_FATAL_EXCEPTION = 0C0000000H;
  76.   XCPT_SEVERITY_CODE   = 0C0000000H;
  77.   XCPT_CUSTOMER_CODE   =  20000000H;
  78.   XCPT_FACILITY_CODE   =  1FFF0000H;
  79.   XCPT_EXCEPTION_CODE  =  0000FFFFH;
  80.  
  81.   (* Violation flags in ExceptionInfo *)
  82.   XCPT_UNKNOWN_ACCESS  =  00000000H;    (* Unknown access *)
  83.   XCPT_READ_ACCESS     =  00000001H;    (* Read access    *)
  84.   XCPT_WRITE_ACCESS    =  00000002H;    (* Write access   *)
  85.   XCPT_EXECUTE_ACCESS  =  00000004H;    (* Execute access *)
  86.   XCPT_SPACE_ACCESS    =  00000008H;    (* Address space access *)
  87.   XCPT_LIMIT_ACCESS    =  00000010H;    (* Address space limit violation *)
  88.   XCPT_DATA_UNKNOWN    = 0FFFFFFFFH;
  89.  
  90.   (* Signal numbers for XCPT_SIGNAL *)
  91.   XCPT_SIGNAL_INTR     = 1;
  92.   XCPT_SIGNAL_KILLPROC = 3;
  93.   XCPT_SIGNAL_BREAK    = 4;
  94.  
  95.   (* Portable non-fatal software generated exceptions   *)
  96.   (* ExceptionInfo[ 0 ] - Access Code: XCPT_READ_ACCESS *)
  97.   (* ExceptionInfo[ 1 ] - FaultAddr                     *)
  98.   XCPT_GUARD_PAGE_VIOLATION  = 80000001H;
  99.  
  100.   XCPT_UNABLE_TO_GROW_STACK  = 80010001H;
  101.  
  102.   (* Portable fatal hardware generated exceptions *)
  103.   XCPT_DATATYPE_MISALIGNMENT = 0C000009EH;
  104.     (* ExceptionInfo[ 0 ] - Access Code:      *)
  105.     (*   XCPT_READ_ACCESS                     *)
  106.     (*   XCPT_WRITE_ACCESS                    *)
  107.     (* ExceptionInfo[ 1 ] - Alignment         *)
  108.     (* ExceptionInfo[ 2 ] - FaultAddr         *)
  109.  
  110.   XCPT_BREAKPOINT            = 0C000009FH;
  111.   XCPT_SINGLE_STEP           = 0C00000A0H;
  112.   XCPT_ACCESS_VIOLATION      = 0C0000005H;
  113.     (* ExceptionInfo[ 0 ] - Access Code:      *)
  114.     (*   XCPT_READ_ACCESS                     *)
  115.     (*   XCPT_WRITE_ACCESS                    *)
  116.     (*   XCPT_SPACE_ACCESS                    *)
  117.     (*   XCPT_LIMIT_ACCESS                    *)
  118.     (*   XCPT_UNKNOWN_ACCESS                  *)
  119.     (* ExceptionInfo[ 1 ] - FaultAddr         *)
  120.     (*   (XCPT_READ_ACCESS/XCPT_WRITE_ACCESS) *)
  121.     (*   Selector  (XCPT_SPACE_ACCESS)        *)
  122.     (*   -1        (XCPT_LIMIT_ACCESS)        *)
  123.  
  124.   XCPT_ILLEGAL_INSTRUCTION      = 0C000001CH;
  125.   XCPT_FLOAT_DENORMAL_OPERAND   = 0C0000094H;
  126.   XCPT_FLOAT_DIVIDE_BY_ZERO     = 0C0000095H;
  127.   XCPT_FLOAT_INEXACT_RESULT     = 0C0000096H;
  128.   XCPT_FLOAT_INVALID_OPERATION  = 0C0000097H;
  129.   XCPT_FLOAT_OVERFLOW           = 0C0000098H;
  130.   XCPT_FLOAT_STACK_CHECK        = 0C0000099H;
  131.   XCPT_FLOAT_UNDERFLOW          = 0C000009AH;
  132.   XCPT_INTEGER_DIVIDE_BY_ZERO   = 0C000009BH;
  133.   XCPT_INTEGER_OVERFLOW         = 0C000009CH;
  134.   XCPT_PRIVILEGED_INSTRUCTION   = 0C000009DH;
  135.  
  136.   (* Portable fatal software generated exceptions *)
  137.   XCPT_IN_PAGE_ERROR            = 0C0000006H;
  138.     (* ExceptionInfo[ 0 ] - FaultAddr *)
  139.   XCPT_PROCESS_TERMINATE        = 0C0010001H;
  140.   XCPT_ASYNC_PROCESS_TERMINATE  = 0C0010002H;
  141.     (* ExceptionInfo[ 0 ] - TID of 'terminator' thread *)
  142.   XCPT_NONCONTINUABLE_EXCEPTION = 0C0000024H;
  143.   XCPT_INVALID_DISPOSITION      = 0C0000025H;
  144.  
  145.   (* Non-portable fatal exceptions *)
  146.   XCPT_INVALID_LOCK_SEQUENCE    = 0C000001DH;
  147.   XCPT_ARRAY_BOUNDS_EXCEEDED    = 0C0000093H;
  148.   XCPT_B1NPX_ERRATA_02          = 0C0010004H;
  149.  
  150.   (* Misc exceptions *)
  151.   XCPT_UNWIND                   = 0C0000026H;
  152.   XCPT_BAD_STACK                = 0C0000027H;
  153.   XCPT_INVALID_UNWIND_TARGET    = 0C0000028H;
  154.  
  155.   (* Signal Exceptions *)
  156.   XCPT_SIGNAL                   = 0C0010003H;
  157.     (* ExceptionInfo[ 0 ] - Signal Number *)
  158.  
  159.  
  160. (*
  161.  * ContextRecord
  162.  *
  163.  * This is the machine specific register contents for the thread
  164.  * at the time of the exception. Note that only the register sets
  165.  * specified by ContextFlags contain valid data. Conversely, only
  166.  * registers specified in ContextFlags will be restored if an exception
  167.  * is handled.
  168.  *)
  169.  
  170.  
  171. CONST
  172.   (* The following flags control the contents of the CONTEXT structure. *)
  173.  
  174.   CONTEXT_CONTROL        = 000000001H;    (* SS:ESP, CS:EIP, EFLAGS,   *)
  175.                                           (* EBP                       *)
  176.   CONTEXT_INTEGER        = 000000002H;    (* EAX, EBX, ECX, EDX, ESI,  *)
  177.                                           (* EDI                       *)
  178.   CONTEXT_SEGMENTS       = 000000004H;    (* DS, ES, FS, GS            *)
  179.   CONTEXT_FLOATING_POINT = 000000008H;    (* numeric coprocessor state *)
  180.  
  181.   CONTEXT_FULL           = ( CONTEXT_CONTROL  OR CONTEXT_INTEGER        OR
  182.                              CONTEXT_SEGMENTS OR CONTEXT_FLOATING_POINT
  183.                            );
  184.  
  185.  
  186. TYPE (* coprocessor stack register element *)
  187.   FPREG     = RECORD
  188.     CASE      : TYPEPREFIX OF
  189.     | TRUE    :
  190.       losig   : LONGCARD;
  191.       hisig   : LONGCARD;
  192.       signexp : CARDINAL;
  193.       filler  : SYSTEM.WORD;
  194.     | FALSE   :
  195.       LoSig   : LONGCARD;
  196.       HiSig   : LONGCARD;
  197.       SignExp : CARDINAL;
  198.       Filler  : SYSTEM.WORD;
  199.     END;      END;
  200.   PFPREG    = POINTER TO FPREG;
  201.  
  202. TYPE
  203.   CONTEXTRECORD  = RECORD
  204.     (*
  205.      * The flags values within this flag control the contents of
  206.      * a ContextRecord.
  207.      *
  208.      * If the ContextRecord is used as an input parameter, then
  209.      * for each portion of the ContextRecord controlled by a flag
  210.      * whose value is set, it is assumed that that portion of the
  211.      * ContextRecord contains valid context. If the ContextRecord
  212.      * is being used to modify a thread's context, then only that
  213.      * portion of the thread's context will be modified.
  214.      *
  215.      * If the ContextRecord is used as an Input/Output parameter to
  216.      * capture the context of a thread, then only those portions of the
  217.      * thread's context corresponding to set flags will be returned.
  218.      *)
  219.     ContextFlags   : LONGCARD;
  220.     CASE           : TYPEPREFIX OF
  221.     | FALSE        :
  222.       (*
  223.        * This section is specified/returned if the ContextFlags
  224.        * contains the flag CONTEXT_FLOATING_POINT.
  225.        *)
  226.       env          : ARRAY [0..6] OF LONGCARD;
  227.       stack        : ARRAY [0..7] OF FPREG;
  228.       (*
  229.        * This section is specified/returned if the ContextFlags
  230.        * contains the flag CONTEXT_SEGMENTS.
  231.        *)
  232.       SegGs        : LONGCARD;
  233.       SegFs        : LONGCARD;
  234.       SegEs        : LONGCARD;
  235.       SegDs        : LONGCARD;
  236.       (*
  237.        * This section is specified/returned if the ContextFlags
  238.        * contains the flag CONTEXT_INTEGER.
  239.        *)
  240.       RegEdi       : LONGCARD;
  241.       RegEsi       : LONGCARD;
  242.       RegEax       : LONGCARD;
  243.       RegEbx       : LONGCARD;
  244.       RegEcx       : LONGCARD;
  245.       RegEdx       : LONGCARD;
  246.       (*
  247.        * This section is specified/returned if the ContextFlags
  248.        * contains the flag CONTEXT_CONTROL.
  249.        *)
  250.       RegEbp       : LONGCARD;
  251.       RegEip       : LONGCARD;
  252.       SegCs        : LONGCARD;
  253.       EFlags       : LONGCARD;
  254.       RegEsp       : LONGCARD;
  255.       SegSs        : LONGCARD;
  256.     | TRUE         :
  257.       ctx_env      : ARRAY [0..6] OF LONGCARD;
  258.       ctx_stack    : ARRAY [0..7] OF FPREG;
  259.       ctx_SegGs    : LONGCARD;
  260.       ctx_SegFs    : LONGCARD;
  261.       ctx_SegEs    : LONGCARD;
  262.       ctx_SegDs    : LONGCARD;
  263.       ctx_RegEdi   : LONGCARD;
  264.       ctx_RegEsi   : LONGCARD;
  265.       ctx_RegEax   : LONGCARD;
  266.       ctx_RegEbx   : LONGCARD;
  267.       ctx_RegEcx   : LONGCARD;
  268.       ctx_RegEdx   : LONGCARD;
  269.       ctx_RegEbp   : LONGCARD;
  270.       ctx_RegEip   : LONGCARD;
  271.       ctx_SegCs    : LONGCARD;
  272.       ctx_EFlags   : LONGCARD;
  273.       ctx_RegEsp   : LONGCARD;
  274.       ctx_SegSs    : LONGCARD;
  275.     END;           END;
  276.   PCONTEXTRECORD = POINTER TO CONTEXTRECORD;
  277.  
  278.  
  279. TYPE
  280. (*
  281.  * ExceptionReportRecord
  282.  *
  283.  * This structure contains machine independant information about an
  284.  * exception/unwind. No system exception will ever have more than
  285.  * EXCEPTION_MAXIMUM_PARAMETERS parameters. User exceptions are not
  286.  * bound to this limit.
  287.  *)
  288. CONST
  289.   EXCEPTION_MAXIMUM_PARAMETERS = 4;  (* Enough for all system exceptions. *)
  290. TYPE
  291.   EXCEPTIONREPORTRECORD  = RECORD
  292.     ExceptionNum           : LONGCARD; (* exception number *)
  293.     CASE                   : TYPEPREFIX OF
  294.     | FALSE                :
  295.       HandlerFlags         : LONGCARD;
  296.     | TRUE                 :
  297.       fHandlerFlags        : LONGCARD;
  298.     END;
  299.     NestedExceptionReportRecord : POINTER TO EXCEPTIONREPORTRECORD;
  300.     ExceptionAddress       : SYSTEM.ADDRESS;
  301.     CASE                   : TYPEPREFIX OF
  302.     | FALSE                :
  303.       ParametersSize       : LONGCARD; (* Size of Exception Specific Info *)
  304.     | TRUE                 :
  305.       cParameters          : LONGCARD; (* Size of Exception Specific Info *)
  306.     END;
  307.     ExceptionInfo          : ARRAY [0..EXCEPTION_MAXIMUM_PARAMETERS-1]
  308.                              OF LONGCARD; (* Exception Specfic Info *)
  309.                            END;
  310.   PEXCEPTIONREPORTRECORD = POINTER TO EXCEPTIONREPORTRECORD;
  311.  
  312.  
  313. TYPE
  314. (*
  315.  * ExceptionRegistrationRecord
  316.  *
  317.  * These are linked together to form a chain of exception handlers that
  318.  * will be dispatched to upon receipt of an exception.
  319.  *
  320.  *)
  321. TYPE
  322.   PEXCEPTIONREGISTRATIONRECORD = POINTER TO EXCEPTIONREGISTRATIONRECORD;
  323.   ERR = PROCEDURE
  324.   ( PEXCEPTIONREPORTRECORD,
  325.     PEXCEPTIONREGISTRATIONRECORD,
  326.     PCONTEXTRECORD,
  327.     SYSTEM.ADDRESS
  328.   );
  329.   EXCEPTIONREGISTRATIONRECORD = RECORD
  330.     prev_structure   : POINTER TO EXCEPTIONREGISTRATIONRECORD;
  331.     ExceptionHandler : ERR;
  332.   END;
  333.  
  334.  
  335. PROCEDURE DosSetExceptionHandler
  336. ( VAR ERegRec               : EXCEPTIONREGISTRATIONRECORD
  337. )                           : APIRET;
  338.  
  339. PROCEDURE DosUnsetExceptionHandler
  340. ( VAR ERegRec               : EXCEPTIONREGISTRATIONRECORD
  341. )                           : APIRET;
  342.  
  343. PROCEDURE DosRaiseException
  344. ( VAR ExceptionReportRecord : EXCEPTIONREPORTRECORD
  345. )                           : APIRET;
  346.  
  347. PROCEDURE DosSendSignalException
  348. ( ProcessId                 : PID;
  349.   Exception                 : LONGCARD
  350. )                           : APIRET;
  351.  
  352. PROCEDURE DosUnwindException
  353. ( HandlerAddr               : PEXCEPTIONREGISTRATIONRECORD;
  354.   TargetIP                  : SYSTEM.LONGWORD;
  355.   ERepRec                   : PEXCEPTIONREPORTRECORD
  356. )                           : APIRET;
  357.  
  358. PROCEDURE DosSetSignalExceptionFocus
  359. ( Flag                      : BOOLEAN;
  360.   VAR Times                 : LONGCARD
  361. )                           : APIRET;
  362.  
  363. PROCEDURE DosEnterMustComplete
  364. ( VAR Nesting               : LONGCARD
  365. )                           : APIRET;
  366.  
  367. PROCEDURE DosExitMustComplete
  368. ( VAR Nesting               : LONGCARD
  369. )                           : APIRET;
  370.  
  371. PROCEDURE DosAcknowledgeSignalException
  372. ( SignalNumber              : LONGCARD
  373. )                           : APIRET;
  374.  
  375. END DOSEXCEPTIONS.
  376.