Fix build. Forgot a file.
[reactos.git] / reactos / include / reactos / libs / fast486 / fast486.h
index 2606a35..d4f3cf1 100644 (file)
@@ -2,7 +2,7 @@
  * Fast486 386/486 CPU Emulation Library
  * fast486.h
  *
- * Copyright (C) 2014 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_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;
 
@@ -157,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)
@@ -190,7 +198,7 @@ VOID
 (NTAPI *FAST486_IO_READ_PROC)
 (
     PFAST486_STATE State,
-    ULONG Port,
+    USHORT Port,
     PVOID Buffer,
     ULONG DataCount,
     UCHAR DataSize
@@ -201,7 +209,7 @@ VOID
 (NTAPI *FAST486_IO_WRITE_PROC)
 (
     PFAST486_STATE State,
-    ULONG Port,
+    USHORT Port,
     PVOID Buffer,
     ULONG DataCount,
     UCHAR DataSize
@@ -222,6 +230,13 @@ UCHAR
     PFAST486_STATE State
 );
 
+typedef
+VOID
+(NTAPI *FAST486_FPU_PROC)
+(
+    PFAST486_STATE State
+);
+
 typedef union _FAST486_REG
 {
     union
@@ -266,7 +281,6 @@ typedef struct _FAST486_TASK_REG
     USHORT Selector;
     ULONG Base;
     ULONG Limit;
-    BOOLEAN Busy;
 } FAST486_TASK_REG, *PFAST486_TASK_REG;
 
 #include <pshpack1.h>
@@ -343,6 +357,62 @@ typedef struct
 /* Verify the structure size */
 C_ASSERT(sizeof(FAST486_IDT_ENTRY) == sizeof(ULONGLONG));
 
+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
@@ -381,36 +451,6 @@ 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;
@@ -418,6 +458,8 @@ typedef struct _FAST486_FPU_DATA_REG
     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;
@@ -469,6 +511,7 @@ struct _FAST486_STATE
     FAST486_IO_WRITE_PROC IoWriteCallback;
     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;
@@ -483,14 +526,24 @@ struct _FAST486_STATE
     ULONG PrefixFlags;
     FAST486_SEG_REGS SegmentOverride;
     BOOLEAN Halted;
-    FAST486_INT_STATUS IntStatus;
-    UCHAR PendingIntNum;
+    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
 };
 
@@ -505,6 +558,7 @@ Fast486Initialize(PFAST486_STATE         State,
                   FAST486_IO_WRITE_PROC  IoWriteCallback,
                   FAST486_BOP_PROC       BopCallback,
                   FAST486_INT_ACK_PROC   IntAckCallback,
+                  FAST486_FPU_PROC       FpuCallback,
                   PULONG                 Tlb);
 
 VOID
@@ -531,10 +585,6 @@ VOID
 NTAPI
 Fast486DumpState(PFAST486_STATE State);
 
-VOID
-NTAPI
-Fast486Interrupt(PFAST486_STATE State, UCHAR Number);
-
 VOID
 NTAPI
 Fast486InterruptSignal(PFAST486_STATE State);
@@ -556,6 +606,10 @@ Fast486SetSegment
     USHORT Selector
 );
 
+VOID
+NTAPI
+Fast486Rewind(PFAST486_STATE State);
+
 #endif // _FAST486_H_
 
 /* EOF */