Fix build. Forgot a file.
[reactos.git] / reactos / include / reactos / libs / fast486 / fast486.h
index 5fa7291..d4f3cf1 100644 (file)
@@ -2,7 +2,7 @@
  * Fast486 386/486 CPU Emulation Library
  * fast486.h
  *
- * Copyright (C) 2013 Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
+ * Copyright (C) 2015 Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
 #define FAST486_DR4_RESERVED 0xFFFF1FF0
 #define FAST486_DR5_RESERVED 0x0000DC00
 
-#define FAST486_IDT_TASK_GATE       0x5
-#define FAST486_IDT_INT_GATE        0x6
-#define FAST486_IDT_TRAP_GATE       0x7
-#define FAST486_IDT_INT_GATE_32     0xE
-#define FAST486_IDT_TRAP_GATE_32    0xF
-
-#define FAST486_LDT_SIGNATURE 0x02
-#define FAST486_TSS_SIGNATURE 0x09
+#define FAST486_TSS_16_SIGNATURE       0x01
+#define FAST486_LDT_SIGNATURE          0x02
+#define FAST486_BUSY_TSS_16_SIGNATURE  0x03
+#define FAST486_CALL_GATE_16_SIGNATURE 0x04
+#define FAST486_TASK_GATE_SIGNATURE    0x05
+#define FAST486_IDT_INT_GATE           0x06
+#define FAST486_IDT_TRAP_GATE          0x07
+#define FAST486_TSS_SIGNATURE          0x09
+#define FAST486_BUSY_TSS_SIGNATURE     0x0B
+#define FAST486_CALL_GATE_SIGNATURE    0x0C
+#define FAST486_IDT_INT_GATE_32        0x0E
+#define FAST486_IDT_TRAP_GATE_32       0x0F
 
 #define FAST486_PREFIX_SEG      (1 << 0)
 #define FAST486_PREFIX_OPSIZE   (1 << 1)
 #define FAST486_PREFIX_REPNZ    (1 << 4)
 #define FAST486_PREFIX_REP      (1 << 5)
 
+#define FAST486_FPU_DEFAULT_CONTROL 0x037F
+
+#define FAST486_PAGE_SIZE 4096
+#define FAST486_CACHE_SIZE 32
+
+/*
+ * These are condiciones sine quibus non that should be respected, because
+ * otherwise when fetching DWORDs you would read extra garbage bytes
+ * (by reading outside of the prefetch buffer). The prefetch cache must
+ * also not cross a page boundary.
+ */
+C_ASSERT((FAST486_CACHE_SIZE >= sizeof(DWORD))
+         && (FAST486_CACHE_SIZE <= FAST486_PAGE_SIZE));
+
 struct _FAST486_STATE;
 typedef struct _FAST486_STATE FAST486_STATE, *PFAST486_STATE;
 
@@ -155,14 +173,6 @@ typedef enum _FAST486_EXCEPTIONS
     FAST486_EXCEPTION_MC = 0x12
 } FAST486_EXCEPTIONS, *PFAST486_EXCEPTIONS;
 
-typedef enum _FAST486_INT_STATUS
-{
-    FAST486_INT_NONE = 0,
-    FAST486_INT_EXECUTE = 1,
-    FAST486_INT_SIGNAL = 2,
-    FAST486_INT_DELAYED = 3
-} FAST486_INT_STATUS, *PFAST486_INT_STATUS;
-
 typedef
 VOID
 (NTAPI *FAST486_MEM_READ_PROC)
@@ -188,7 +198,7 @@ VOID
 (NTAPI *FAST486_IO_READ_PROC)
 (
     PFAST486_STATE State,
-    ULONG Port,
+    USHORT Port,
     PVOID Buffer,
     ULONG DataCount,
     UCHAR DataSize
@@ -199,19 +209,12 @@ VOID
 (NTAPI *FAST486_IO_WRITE_PROC)
 (
     PFAST486_STATE State,
-    ULONG Port,
+    USHORT Port,
     PVOID Buffer,
     ULONG DataCount,
     UCHAR DataSize
 );
 
-typedef
-VOID
-(NTAPI *FAST486_IDLE_PROC)
-(
-    PFAST486_STATE State
-);
-
 typedef
 VOID
 (NTAPI *FAST486_BOP_PROC)
@@ -227,6 +230,13 @@ UCHAR
     PFAST486_STATE State
 );
 
+typedef
+VOID
+(NTAPI *FAST486_FPU_PROC)
+(
+    PFAST486_STATE State
+);
+
 typedef union _FAST486_REG
 {
     union
@@ -251,6 +261,7 @@ typedef struct _FAST486_SEG_REG
     ULONG DirConf       : 1;
     ULONG Executable    : 1;
     ULONG SystemType    : 1;
+    ULONG Rpl           : 2;
     ULONG Dpl           : 2;
     ULONG Present       : 1;
     ULONG Size          : 1;
@@ -258,22 +269,21 @@ typedef struct _FAST486_SEG_REG
     ULONG Base;
 } FAST486_SEG_REG, *PFAST486_SEG_REG;
 
-typedef struct
+typedef struct _FAST486_LDT_REG
 {
     USHORT Selector;
     ULONG Base;
     ULONG Limit;
-} FAST486_LDT_REG;
+} FAST486_LDT_REG, *PFAST486_LDT_REG;
 
-typedef struct
+typedef struct _FAST486_TASK_REG
 {
     USHORT Selector;
     ULONG Base;
     ULONG Limit;
-    BOOLEAN Busy;
 } FAST486_TASK_REG, *PFAST486_TASK_REG;
 
-#pragma pack(push, 1)
+#include <pshpack1.h>
 
 typedef struct
 {
@@ -347,7 +357,63 @@ typedef struct
 /* Verify the structure size */
 C_ASSERT(sizeof(FAST486_IDT_ENTRY) == sizeof(ULONGLONG));
 
-#pragma pack(pop)
+typedef struct _FAST486_TSS
+{
+    ULONG Link;
+    ULONG Esp0;
+    ULONG Ss0;
+    ULONG Esp1;
+    ULONG Ss1;
+    ULONG Esp2;
+    ULONG Ss2;
+    ULONG Cr3;
+    ULONG Eip;
+    ULONG Eflags;
+    ULONG Eax;
+    ULONG Ecx;
+    ULONG Edx;
+    ULONG Ebx;
+    ULONG Esp;
+    ULONG Ebp;
+    ULONG Esi;
+    ULONG Edi;
+    ULONG Es;
+    ULONG Cs;
+    ULONG Ss;
+    ULONG Ds;
+    ULONG Fs;
+    ULONG Gs;
+    ULONG Ldtr;
+    ULONG IopbOffset;
+} FAST486_TSS, *PFAST486_TSS;
+
+typedef struct _FAST486_LEGACY_TSS
+{
+    USHORT Link;
+    USHORT Sp0;
+    USHORT Ss0;
+    USHORT Sp1;
+    USHORT Ss1;
+    USHORT Sp2;
+    USHORT Ss2;
+    USHORT Ip;
+    USHORT Flags;
+    USHORT Ax;
+    USHORT Cx;
+    USHORT Dx;
+    USHORT Bx;
+    USHORT Sp;
+    USHORT Bp;
+    USHORT Si;
+    USHORT Di;
+    USHORT Es;
+    USHORT Cs;
+    USHORT Ss;
+    USHORT Ds;
+    USHORT Ldtr;
+} FAST486_LEGACY_TSS, *PFAST486_LEGACY_TSS;
+
+#include <poppack.h>
 
 typedef struct _FAST486_TABLE_REG
 {
@@ -385,42 +451,15 @@ typedef union _FAST486_FLAGS_REG
     };
 } FAST486_FLAGS_REG, *PFAST486_FLAGS_REG;
 
-typedef struct _FAST486_TSS
-{
-    ULONG Link;
-    ULONG Esp0;
-    ULONG Ss0;
-    ULONG Esp1;
-    ULONG Ss1;
-    ULONG Esp2;
-    ULONG Ss2;
-    ULONG Cr3;
-    ULONG Eip;
-    ULONG Eflags;
-    ULONG Eax;
-    ULONG Ecx;
-    ULONG Edx;
-    ULONG Ebx;
-    ULONG Esp;
-    ULONG Ebp;
-    ULONG Esi;
-    ULONG Edi;
-    ULONG Es;
-    ULONG Cs;
-    ULONG Ss;
-    ULONG Ds;
-    ULONG Fs;
-    ULONG Gs;
-    ULONG Ldtr;
-    ULONG IopbOffset;
-} FAST486_TSS, *PFAST486_TSS;
-
 typedef struct _FAST486_FPU_DATA_REG
 {
     ULONGLONG Mantissa;
     USHORT Exponent;
+    UCHAR Sign;
 } FAST486_FPU_DATA_REG, *PFAST486_FPU_DATA_REG;
 
+typedef const FAST486_FPU_DATA_REG *PCFAST486_FPU_DATA_REG;
+
 typedef union _FAST486_FPU_STATUS_REG
 {
     USHORT Value;
@@ -470,9 +509,9 @@ struct _FAST486_STATE
     FAST486_MEM_WRITE_PROC MemWriteCallback;
     FAST486_IO_READ_PROC IoReadCallback;
     FAST486_IO_WRITE_PROC IoWriteCallback;
-    FAST486_IDLE_PROC IdleCallback;
     FAST486_BOP_PROC BopCallback;
     FAST486_INT_ACK_PROC IntAckCallback;
+    FAST486_FPU_PROC FpuCallback;
     FAST486_REG GeneralRegs[FAST486_NUM_GEN_REGS];
     FAST486_SEG_REG SegmentRegs[FAST486_NUM_SEG_REGS];
     FAST486_REG InstPtr, SavedInstPtr;
@@ -486,13 +525,26 @@ struct _FAST486_STATE
     ULONG ExceptionCount;
     ULONG PrefixFlags;
     FAST486_SEG_REGS SegmentOverride;
-    FAST486_INT_STATUS IntStatus;
-    UCHAR PendingIntNum;
+    BOOLEAN Halted;
+    BOOLEAN IntSignaled;
+    BOOLEAN DoNotInterrupt;
     PULONG Tlb;
+    BOOLEAN TlbEmpty;
+#ifndef FAST486_NO_PREFETCH
+    BOOLEAN PrefetchValid;
+    ULONG PrefetchAddress;
+    UCHAR PrefetchCache[FAST486_CACHE_SIZE];
+#endif
+#ifndef FAST486_NO_FPU
     FAST486_FPU_DATA_REG FpuRegisters[FAST486_NUM_FPU_REGS];
     FAST486_FPU_STATUS_REG FpuStatus;
     FAST486_FPU_CONTROL_REG FpuControl;
     USHORT FpuTag;
+    FAST486_REG FpuLastInstPtr;
+    USHORT FpuLastCodeSel;
+    FAST486_REG FpuLastOpPtr;
+    USHORT FpuLastDataSel;
+#endif
 };
 
 /* FUNCTIONS ******************************************************************/
@@ -504,9 +556,9 @@ Fast486Initialize(PFAST486_STATE         State,
                   FAST486_MEM_WRITE_PROC MemWriteCallback,
                   FAST486_IO_READ_PROC   IoReadCallback,
                   FAST486_IO_WRITE_PROC  IoWriteCallback,
-                  FAST486_IDLE_PROC      IdleCallback,
                   FAST486_BOP_PROC       BopCallback,
                   FAST486_INT_ACK_PROC   IntAckCallback,
+                  FAST486_FPU_PROC       FpuCallback,
                   PULONG                 Tlb);
 
 VOID
@@ -533,10 +585,6 @@ VOID
 NTAPI
 Fast486DumpState(PFAST486_STATE State);
 
-VOID
-NTAPI
-Fast486Interrupt(PFAST486_STATE State, UCHAR Number);
-
 VOID
 NTAPI
 Fast486InterruptSignal(PFAST486_STATE State);
@@ -558,6 +606,10 @@ Fast486SetSegment
     USHORT Selector
 );
 
+VOID
+NTAPI
+Fast486Rewind(PFAST486_STATE State);
+
 #endif // _FAST486_H_
 
 /* EOF */