Release 960824
[wine] / include / registers.h
1 /*
2  * Register definitions
3  *
4  * Copyright 1995 Alexandre Julliard
5  */
6
7 #ifndef __WINE_REGISTERS_H
8 #define __WINE_REGISTERS_H
9
10 #include "wintypes.h"
11
12 /* The Win32 register context */
13
14 #define CONTEXT_i386      0x00010000
15 #define CONTEXT_i486      CONTEXT_i386
16 #define CONTEXT_CONTROL   (CONTEXT_i386 | 0x0001) /* SS:SP, CS:IP, FLAGS, BP */
17 #define CONTEXT_INTEGER   (CONTEXT_i386 | 0x0002) /* AX, BX, CX, DX, SI, DI */
18 #define CONTEXT_SEGMENTS  (CONTEXT_i386 | 0x0004) /* DS, ES, FS, GS */
19 #define CONTEXT_FLOATING_POINT  (CONTEXT_i386 | 0x0008L) /* 387 state */
20 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386 | 0x0010L) /* DB 0-3,6,7 */
21 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS)
22
23 #define SIZE_OF_80387_REGISTERS      80
24
25 typedef struct
26 {
27     DWORD   ControlWord;
28     DWORD   StatusWord;
29     DWORD   TagWord;    
30     DWORD   ErrorOffset;
31     DWORD   ErrorSelector;
32     DWORD   DataOffset;
33     DWORD   DataSelector;    
34     BYTE    RegisterArea[SIZE_OF_80387_REGISTERS];
35     DWORD   Cr0NpxState;
36 } FLOATING_SAVE_AREA;
37
38 typedef struct
39 {
40     DWORD   ContextFlags;
41
42     /* These are selected by CONTEXT_DEBUG_REGISTERS */
43     DWORD   Dr0;
44     DWORD   Dr1;
45     DWORD   Dr2;
46     DWORD   Dr3;
47     DWORD   Dr6;
48     DWORD   Dr7;
49
50     /* These are selected by CONTEXT_FLOATING_POINT */
51     FLOATING_SAVE_AREA FloatSave;
52
53     /* These are selected by CONTEXT_SEGMENTS */
54     DWORD   SegGs;
55     DWORD   SegFs;
56     DWORD   SegEs;
57     DWORD   SegDs;    
58
59     /* These are selected by CONTEXT_INTEGER */
60     DWORD   Edi;
61     DWORD   Esi;
62     DWORD   Ebx;
63     DWORD   Edx;    
64     DWORD   Ecx;
65     DWORD   Eax;
66
67     /* These are selected by CONTEXT_CONTROL */
68     DWORD   Ebp;    
69     DWORD   Eip;
70     DWORD   SegCs;
71     DWORD   EFlags;
72     DWORD   Esp;
73     DWORD   SegSs;
74 } CONTEXT, *PCONTEXT;
75
76 #ifndef WINELIB
77
78 #ifdef i386
79 extern int runtime_cpu (void);
80 #else
81 static inline int runtime_cpu(void) { return 3; }
82 #endif
83
84 #ifdef linux
85 typedef struct
86 {
87     unsigned short sc_gs, __gsh;
88     unsigned short sc_fs, __fsh;
89     unsigned short sc_es, __esh;
90     unsigned short sc_ds, __dsh;
91     unsigned long sc_edi;
92     unsigned long sc_esi;
93     unsigned long sc_ebp;
94     unsigned long sc_esp;
95     unsigned long sc_ebx;
96     unsigned long sc_edx;
97     unsigned long sc_ecx;
98     unsigned long sc_eax;
99     unsigned long sc_trapno;
100     unsigned long sc_err;
101     unsigned long sc_eip;
102     unsigned short sc_cs, __csh;
103     unsigned long sc_eflags;
104     unsigned long esp_at_signal;
105     unsigned short sc_ss, __ssh;
106     unsigned long i387;
107     unsigned long oldmask;
108     unsigned long cr2;
109 } SIGCONTEXT;
110 #define WINE_DATA_SELECTOR 0x2b
111 #define WINE_CODE_SELECTOR 0x23
112 #endif  /* linux */
113
114 #ifdef __NetBSD__
115 #include <signal.h>
116 typedef struct sigcontext SIGCONTEXT;
117 #define WINE_DATA_SELECTOR 0x1f
118 #define WINE_CODE_SELECTOR 0x17
119 #endif  /* NetBSD */
120
121 #if defined(__svr4__) || defined(_SCO_DS)
122 #include <signal.h>
123 #ifdef _SCO_DS
124 #include <sys/regset.h>
125 #endif
126 #include <sys/ucontext.h>
127 typedef struct ucontext SIGCONTEXT;
128 #define WINE_DATA_SELECTOR 0x1f
129 #define WINE_CODE_SELECTOR 0x17
130 #endif  /* svr4 || SCO_DS */
131
132 #ifdef __FreeBSD__
133 #include <signal.h>
134 typedef struct sigcontext SIGCONTEXT;
135 #define WINE_DATA_SELECTOR 0x27
136 #define WINE_CODE_SELECTOR 0x1f
137 #endif  /* FreeBSD */
138
139 #if !defined(__svr4__) && !defined(_SCO_DS)
140
141 #define EAX_reg(context)     ((context)->sc_eax)
142 #define EBX_reg(context)     ((context)->sc_ebx)
143 #define ECX_reg(context)     ((context)->sc_ecx)
144 #define EDX_reg(context)     ((context)->sc_edx)
145 #define ESI_reg(context)     ((context)->sc_esi)
146 #define EDI_reg(context)     ((context)->sc_edi)
147 #define EBP_reg(context)     ((context)->sc_ebp)
148                             
149 #define CS_reg(context)      ((context)->sc_cs)
150 #define DS_reg(context)      ((context)->sc_ds)
151 #define ES_reg(context)      ((context)->sc_es)
152 #define SS_reg(context)      ((context)->sc_ss)
153                             
154 #ifdef linux
155 /* fs and gs are not supported on *BSD. Hopefully we won't need them. */
156 #define FS_reg(context)      ((context)->sc_fs)
157 #define GS_reg(context)      ((context)->sc_gs)
158 #endif
159                             
160 #ifndef __FreeBSD__         
161 #define EFL_reg(context)     ((context)->sc_eflags)
162 #else                       
163 #define EFL_reg(context)     ((context)->sc_efl)
164 #endif                      
165                             
166 #define EIP_reg(context)     ((context)->sc_eip)
167 #define ESP_reg(context)     ((context)->sc_esp)
168                             
169 #else  /* __svr4__ || _SCO_DS */
170
171 #ifdef _SCO_DS
172 #define gregs regs
173 #endif
174
175 #define EAX_reg(context)     ((context)->uc_mcontext.gregs[EAX])
176 #define EBX_reg(context)     ((context)->uc_mcontext.gregs[EBX])
177 #define ECX_reg(context)     ((context)->uc_mcontext.gregs[ECX])
178 #define EDX_reg(context)     ((context)->uc_mcontext.gregs[EDX])
179 #define ESI_reg(context)     ((context)->uc_mcontext.gregs[ESI])
180 #define EDI_reg(context)     ((context)->uc_mcontext.gregs[EDI])
181 #define EBP_reg(context)     ((context)->uc_mcontext.gregs[EBP])
182                             
183 #define CS_reg(context)      ((context)->uc_mcontext.gregs[CS])
184 #define DS_reg(context)      ((context)->uc_mcontext.gregs[DS])
185 #define ES_reg(context)      ((context)->uc_mcontext.gregs[ES])
186 #define SS_reg(context)      ((context)->uc_mcontext.gregs[SS])
187                             
188 #define FS_reg(context)      ((context)->uc_mcontext.gregs[FS])
189 #define GS_reg(context)      ((context)->uc_mcontext.gregs[GS])
190
191 #define EFL_reg(context)     ((context)->uc_mcontext.gregs[EFL])
192                             
193 #define EIP_reg(context)     ((context)->uc_mcontext.gregs[EIP])
194 #ifdef R_ESP
195 #define ESP_reg(context)     ((context)->uc_mcontext.gregs[R_ESP])
196 #else
197 #define ESP_reg(context)     ((context)->uc_mcontext.gregs[ESP])
198 #endif
199                             
200 #endif  /* __svr4__ || _SCO_DS */
201
202 #define AX_reg(context)      (*(WORD*)&EAX_reg(context))
203 #define BX_reg(context)      (*(WORD*)&EBX_reg(context))
204 #define CX_reg(context)      (*(WORD*)&ECX_reg(context))
205 #define DX_reg(context)      (*(WORD*)&EDX_reg(context))
206 #define SI_reg(context)      (*(WORD*)&ESI_reg(context))
207 #define DI_reg(context)      (*(WORD*)&EDI_reg(context))
208 #define BP_reg(context)      (*(WORD*)&EBP_reg(context))
209
210 #define AL_reg(context)      (*(BYTE*)&EAX_reg(context))
211 #define AH_reg(context)      (*((BYTE*)&EAX_reg(context)+1))
212 #define BL_reg(context)      (*(BYTE*)&EBX_reg(context))
213 #define BH_reg(context)      (*((BYTE*)&EBX_reg(context)+1))
214 #define CL_reg(context)      (*(BYTE*)&ECX_reg(context))
215 #define CH_reg(context)      (*((BYTE*)&ECX_reg(context)+1))
216 #define DL_reg(context)      (*(BYTE*)&EDX_reg(context))
217 #define DH_reg(context)      (*((BYTE*)&EDX_reg(context)+1))
218                             
219 #define IP_reg(context)      (*(WORD*)&EIP_reg(context))
220 #define SP_reg(context)      (*(WORD*)&ESP_reg(context))
221                             
222 #define FL_reg(context)      (*(WORD*)&EFL_reg(context))
223
224 #define SET_CFLAG(context)   (EFL_reg(context) |= 0x0001)
225 #define RESET_CFLAG(context) (EFL_reg(context) &= 0xfffffffe)
226
227 #else  /* ifndef WINELIB */
228
229 typedef void SIGCONTEXT;
230 #define WINE_DATA_SELECTOR 0x00
231 #define WINE_CODE_SELECTOR 0x00
232
233 #endif  /* ifndef WINELIB */
234
235 #endif /* __WINE_REGISTERS_H */