1/*
2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23/*
24 * Copyright (c) 1992 NeXT Computer, Inc.
25 *
26 * Intel386 Family:	Processor exception frame.
27 *
28 * HISTORY
29 *
30 * 31 August 1992 ? at NeXT
31 *	Added v86 mode stuff.
32 *
33 * 8 June 1992 ? at NeXT
34 *	Changed name of write field in err_code_t
35 *	which collided with write() in shlib.
36 *
37 * 30 March 1992 ? at NeXT
38 *	Created.
39 */
40
41#ifndef _ARCH_I386_FRAME_H_
42#define _ARCH_I386_FRAME_H_
43
44/*
45 * Format of the error code
46 * generated by the hardware
47 * for certain exceptions.
48 */
49
50typedef union err_code {
51    struct err_code_normal {
52	unsigned int	ext	:1,
53			tbl	:2,
54#define ERR_GDT		0
55#define ERR_IDT		1
56#define ERR_LDT		2
57			index	:13,
58				:16;
59    } normal;
60    struct err_code_pgfault {
61	unsigned int	prot	:1,
62			wrtflt	:1,
63			user	:1,
64				:29;
65    } pgfault;
66} err_code_t;
67
68#include <architecture/i386/sel.h>
69
70/*
71 * The actual hardware exception frame
72 * is variable in size.  An error code is
73 * only pushed for certain exceptions.
74 * Previous stack information is only
75 * pushed for exceptions that cause a
76 * change in privilege level.  The dpl
77 * field of the saved CS selector can be
78 * used to determine whether this is the
79 * case.  If the interrupted task was
80 * executing in v86 mode, then the data
81 * segment registers are also present in
82 * the exception frame (in addition to
83 * previous stack information).  This
84 * case can be determined by examining
85 * eflags.
86 */
87
88typedef struct except_frame {
89    err_code_t		err;
90    unsigned int	eip;
91    sel_t		cs;
92    unsigned int		:0;
93    unsigned int	eflags;
94    unsigned int	esp;
95    sel_t		ss;
96    unsigned int		:0;
97    unsigned short	v_es;
98    unsigned int		:0;
99    unsigned short	v_ds;
100    unsigned int		:0;
101    unsigned short	v_fs;
102    unsigned int		:0;
103    unsigned short	v_gs;
104    unsigned int		:0;
105} except_frame_t;
106
107/*
108 * Values in eflags.
109 */
110
111#define EFL_CF		0x00001
112#define EFL_PF		0x00004
113#define EFL_AF		0x00010
114#define EFL_ZF		0x00040
115#define EFL_SF		0x00080
116#define EFL_TF		0x00100
117#define EFL_IF		0x00200
118#define EFL_DF		0x00400
119#define EFL_OF		0x00800
120#define EFL_IOPL	0x03000
121#define EFL_NT		0x04000
122#define EFL_RF		0x10000
123#define EFL_VM		0x20000
124#define EFL_AC		0x40000
125
126#define EFL_CLR		0xfff88028
127#define EFL_SET		0x00000002
128
129#endif	/* _ARCH_I386_FRAME_H_ */
130