[KSUSER] Improve pointer arithmetics
[reactos.git] / sdk / lib / fast486 / common.h
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 */