xref: /reactos/sdk/lib/fast486/common.h (revision 50cf16b3)
1 /*
2  * Fast486 386/486 CPU Emulation Library
3  * common.h
4  *
5  * Copyright (C) 2015 Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
20  */
21 
22 #ifndef _COMMON_H_
23 #define _COMMON_H_
24 
25 #pragma once
26 
27 /* DEFINES ********************************************************************/
28 
29 #define SIGN_FLAG_BYTE  0x80
30 #define SIGN_FLAG_WORD  0x8000
31 #define SIGN_FLAG_LONG  0x80000000
32 #define REAL_MODE_FLAGS_MASK 0x57FD5
33 #define PROT_MODE_FLAGS_MASK 0x50DD5
34 
35 /* Block size for string operations */
36 #define STRING_BLOCK_SIZE 4096
37 
38 #define GET_SEGMENT_RPL(s)          ((s) & 3u)
39 #define GET_SEGMENT_INDEX(s)        ((s) & 0xFFF8u)
40 #define SEGMENT_TABLE_INDICATOR     (1 << 2)
41 #define EXCEPTION_HAS_ERROR_CODE(x) (((x) == 8) || ((x) >= 10 && (x) <= 14))
42 
43 #define NO_LOCK_PREFIX()\
44 if (State->PrefixFlags & FAST486_PREFIX_LOCK)\
45 {\
46     Fast486Exception(State, FAST486_EXCEPTION_UD);\
47     return;\
48 }
49 
50 #define TOGGLE_OPSIZE(x)\
51     if (State->PrefixFlags & FAST486_PREFIX_OPSIZE) x = !x;
52 
53 #define TOGGLE_ADSIZE(x)\
54     if (State->PrefixFlags & FAST486_PREFIX_ADSIZE) x = !x;
55 
56 #define SWAP(x, y) { (x) ^= (y); (y) ^= (x); (x) ^= (y); }
57 
58 #define ALIGNMENT_CHECK(x, a) if (State->Flags.Ac \
59                                   && (State->ControlRegisters[FAST486_REG_CR0] & FAST486_CR0_AM)\
60                                   && (State->Cpl == 3)\
61                                   && (((x) % (a)) != 0))\
62 {\
63     Fast486Exception(State, FAST486_EXCEPTION_AC);\
64     return FALSE;\
65 }
66 
67 #define PAGE_ALIGN(x)   ((x) & 0xFFFFF000)
68 #define PAGE_OFFSET(x)  ((x) & 0x00000FFF)
69 #define GET_ADDR_PDE(x) ((x) >> 22)
70 #define GET_ADDR_PTE(x) (((x) >> 12) & 0x3FF)
71 #define INVALID_TLB_FIELD 0xFFFFFFFF
72 #define NUM_TLB_ENTRIES 0x100000
73 
74 typedef struct _FAST486_MOD_REG_RM
75 {
76     FAST486_GEN_REGS Register;
77     BOOLEAN Memory;
78     union
79     {
80         FAST486_GEN_REGS SecondRegister;
81         ULONG MemoryAddress;
82     };
83 } FAST486_MOD_REG_RM, *PFAST486_MOD_REG_RM;
84 
85 typedef enum _FAST486_TASK_SWITCH_TYPE
86 {
87     FAST486_TASK_JUMP,
88     FAST486_TASK_CALL,
89     FAST486_TASK_RETURN
90 } FAST486_TASK_SWITCH_TYPE, *PFAST486_TASK_SWITCH_TYPE;
91 
92 #include <pshpack1.h>
93 
94 typedef union _FAST486_PAGE_DIR
95 {
96     struct
97     {
98         ULONG Present       : 1;
99         ULONG Writeable     : 1;
100         ULONG Usermode      : 1;
101         ULONG WriteThrough  : 1;
102         ULONG NoCache       : 1;
103         ULONG Accessed      : 1;
104         ULONG AlwaysZero    : 1;
105         ULONG Size          : 1;
106         ULONG Unused        : 4;
107         ULONG TableAddress  : 20;
108     };
109     ULONG Value;
110 } FAST486_PAGE_DIR, *PFAST486_PAGE_DIR;
111 
112 C_ASSERT(sizeof(FAST486_PAGE_DIR) == sizeof(ULONG));
113 
114 typedef union _FAST486_PAGE_TABLE
115 {
116     struct
117     {
118         ULONG Present       : 1;
119         ULONG Writeable     : 1;
120         ULONG Usermode      : 1;
121         ULONG WriteThrough  : 1;
122         ULONG NoCache       : 1;
123         ULONG Accessed      : 1;
124         ULONG Dirty         : 1;
125         ULONG AlwaysZero    : 1;
126         ULONG Global        : 1;
127         ULONG Unused        : 3;
128         ULONG Address       : 20;
129     };
130     ULONG Value;
131 } FAST486_PAGE_TABLE, *PFAST486_PAGE_TABLE;
132 
133 C_ASSERT(sizeof(FAST486_PAGE_DIR) == sizeof(ULONG));
134 
135 #include <poppack.h>
136 
137 /* FUNCTIONS ******************************************************************/
138 
139 BOOLEAN
140 FASTCALL
141 Fast486ReadMemory
142 (
143     PFAST486_STATE State,
144     FAST486_SEG_REGS SegmentReg,
145     ULONG Offset,
146     BOOLEAN InstFetch,
147     PVOID Buffer,
148     ULONG Size
149 );
150 
151 BOOLEAN
152 FASTCALL
153 Fast486WriteMemory
154 (
155     PFAST486_STATE State,
156     FAST486_SEG_REGS SegmentReg,
157     ULONG Offset,
158     PVOID Buffer,
159     ULONG Size
160 );
161 
162 BOOLEAN
163 FASTCALL
164 Fast486PerformInterrupt
165 (
166     PFAST486_STATE State,
167     UCHAR Number
168 );
169 
170 VOID
171 FASTCALL
172 Fast486ExceptionWithErrorCode
173 (
174     PFAST486_STATE State,
175     FAST486_EXCEPTIONS ExceptionCode,
176     ULONG ErrorCode
177 );
178 
179 BOOLEAN
180 FASTCALL
181 Fast486TaskSwitch
182 (
183     PFAST486_STATE State,
184     FAST486_TASK_SWITCH_TYPE Type,
185     USHORT Selector
186 );
187 
188 BOOLEAN
189 FASTCALL
190 Fast486CallGate
191 (
192     PFAST486_STATE State,
193     PFAST486_CALL_GATE Gate,
194     BOOLEAN Call
195 );
196 
197 /* INLINED FUNCTIONS **********************************************************/
198 
199 #include "common.inl"
200 
201 #endif // _COMMON_H_
202 
203 /* EOF */
204