Reactos
at listview 203 lines 4.9 kB view raw
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()\ 44if (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 74typedef 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 85typedef 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 94typedef 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 112C_ASSERT(sizeof(FAST486_PAGE_DIR) == sizeof(ULONG)); 113 114typedef 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 133C_ASSERT(sizeof(FAST486_PAGE_DIR) == sizeof(ULONG)); 134 135#include <poppack.h> 136 137/* FUNCTIONS ******************************************************************/ 138 139BOOLEAN 140FASTCALL 141Fast486ReadMemory 142( 143 PFAST486_STATE State, 144 FAST486_SEG_REGS SegmentReg, 145 ULONG Offset, 146 BOOLEAN InstFetch, 147 PVOID Buffer, 148 ULONG Size 149); 150 151BOOLEAN 152FASTCALL 153Fast486WriteMemory 154( 155 PFAST486_STATE State, 156 FAST486_SEG_REGS SegmentReg, 157 ULONG Offset, 158 PVOID Buffer, 159 ULONG Size 160); 161 162BOOLEAN 163FASTCALL 164Fast486PerformInterrupt 165( 166 PFAST486_STATE State, 167 UCHAR Number 168); 169 170VOID 171FASTCALL 172Fast486ExceptionWithErrorCode 173( 174 PFAST486_STATE State, 175 FAST486_EXCEPTIONS ExceptionCode, 176 ULONG ErrorCode 177); 178 179BOOLEAN 180FASTCALL 181Fast486TaskSwitch 182( 183 PFAST486_STATE State, 184 FAST486_TASK_SWITCH_TYPE Type, 185 USHORT Selector 186); 187 188BOOLEAN 189FASTCALL 190Fast486CallGate 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 */