|
|
1.1 root 1: /* SCCSID = @(#)except32.h 13.5 90/03/27 */
2:
3: /*************************** START OF SPECIFICATION *****************
4: *
5: * Source File Name: except32.h
6: *
7: * Descriptive Name: Thread Exception Constants and Structure Definitions.
8: *
9: * Copyright: IBM Corp. 1989
10: * Copyright: Microsoft Corp. 1989
11: *
12: * Function: This file provides constants and data structure
13: * definitions required by application programs to use 32 bit
14: * thread exceptions management facility.
15: *
16: * Notes: None.
17: *
18: *************************** END OF SPECIFICATION *******************/
19:
20: /*
21: * User Exception Handler Return Codes:
22: */
23: #define NOT_HANDLED -1 /* exception not handled */
24: #define HANDLED 0 /* exception handled (= NO_ERROR) */
25:
26: /*
27: * fHandlerFlags values (see ExceptionStructure):
28: *
29: * The exception manager sets EH_UNWINDING and EH_NESTED_CALL.
30: * The user exception handler sets EH_NONCONTINUABLE.
31: */
32: #define EH_UNWINDING 0x01 /* Set if call is being made for an unwind */
33: /* operation. Otherwise call is being made */
34: /* for an exception */
35: #define EH_NONCONTINUABLE 0x02 /* Set if exception is non-continuable */
36: #define EH_NESTED_CALL 0x04 /* Set when an exception occurs while an */
37: /* exception is active for the current */
38: /* handler */
39:
40: /*
41: * Unwind all exception handlers (see DosUnwindException API)
42: */
43: #define UNWIND_ALL 0
44:
45: /*
46: * ExceptionNum values (see ExceptionStructure):
47: *
48: * This includes all exceptions and signals supported by 32 bit thread
49: * exception management.
50: *
51: * The exception numbers are distrubuted as follows:
52: *
53: * 0x00000000-0x7fffffff - reserved for OS/2 use only
54: * 0x80000000-0xffffffff - available for application specific use
55: */
56: #define XCPT_INVALID 0 /* invalid exception number */
57: /* Supported Exceptions and Signals */
58: #define XCPT_DIV 1 /* Divide Error */
59: #define XCPT_OVERFLOW 2 /* Overflow */
60: #define XCPT_BOUND 3 /* Bound Check */
61: #define XCPT_OP 4 /* Invalid Opcode */
62: #define XCPT_GP 5 /* General Protection Fault */
63: #define XCPT_FPERR 6 /* NPX Error */
64: #define XCPT_GPF 7 /* Gaurd Page Fault */
65: #define XCPT_GPAF 8 /* Guard Page Alloc Failure */
66: #define XCPT_PTERM 9 /* Process Termination (sync) */
67: #define XCPT_BREAK 10 /* Control Break */
68: #define XCPT_INTR 11 /* Control C */
69: #define XCPT_TERM 12 /* Kill Process */
70: #define XCPT_APTERM 13 /* Process Termination (async) */
71:
72:
73: /*
74: * Bit mask to indicate which type of error code is in the rest of
75: * the ExceptionInfo field when the ExceptionNum is set to XCPT_GP.
76: * The high bit is clear for general protection (GP) faults and set
77: * for page faults. The EC_CR2 field is validate when this bit is set.
78: */
79: #define XCPTF_PF 0x80000000 /* if set, page fault */
80: /* if clear, GP fault */
81:
82:
83: /*
84: * Exception Context.
85: *
86: * This is the machine specific register contents for the thread
87: * at the time of the exception.
88: */
89: struct ExceptionContext { /* XCPTCTX */
90: ULONG EC_edi; /* general purpose regs */
91: ULONG EC_esi;
92: ULONG EC_ebp;
93: ULONG EC_esp;
94: ULONG EC_ebx;
95: ULONG EC_edx;
96: ULONG EC_ecx;
97: ULONG EC_eax;
98: ULONG EC_eip;
99: ULONG EC_eflags;
100: USHORT EC_cs; /* segment registers */
101: USHORT EC_ss;
102: USHORT EC_ds;
103: USHORT EC_es;
104: USHORT EC_fs;
105: USHORT EC_gs;
106: ULONG EC_cr0; /* machine state word (r/o) */
107: ULONG EC_cr2; /* for GP fault (r/o) */
108: };
109:
110: typedef struct ExceptionContext ECS;
111: typedef struct ExceptionContext * PECS;
112:
113:
114: /*
115: * Exception Structure.
116: *
117: * A pointer to this structure is passed to the user's thread
118: * exception handler. It contains the entire exception context.
119: */
120:
121: struct ExceptionStructure { /* XCPTSTRUCT */
122:
123: ULONG fHandlerFlags; /* bit 0, clear for exception */
124: /* set for unwind */
125: /* bit 1, set if not continuable */
126: /* bit 2, set if nested call */
127:
128: struct ExceptionHandler *pCurrentEH;
129:
130: /* The following values are undefined for unwind operation */
131:
132: ULONG ExceptionNum; /* exception number */
133:
134: struct ExceptionContext *pExceptionContext;
135:
136: ULONG cbExceptionInfo; /* Size of Exception Specific Info */
137:
138: ULONG ExceptionInfo[1]; /* Exception Specfic Info */
139: };
140:
141: typedef struct ExceptionStructure XCPT;
142: typedef struct ExceptionStructure * PXCPT;
143:
144:
145: /*
146: * Exception Handler Structure.
147: *
148: * This structure is used by APPs to register and unregister user
149: * thread exception handlers. The APP only needs to set the
150: * exception_handler_routine field. It should never modify the
151: * prev_handler field (modified by the OS/2 kernel only). Upon
152: * registration the structure remains in user space. Therefore,
153: * once a structure is registered, APPs should not modify any of the
154: * fields until it is unregistered.
155: *
156: * NOTE: Field prev_handler MUST be first field in structure (see code
157: * in DosSetExceptionHandler API).
158: */
159: struct ExceptionHandler { /* XCPTHAND */
160: /* prev_handler MUST BE FIRST */
161: struct ExceptionHandler *prev_handler;
162:
163: ULONG (*exception_handler_routine)(PXCPT);
164: };
165:
166: typedef struct ExceptionHandler EHS;
167: typedef struct ExceptionHandler * PEHS;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.