update for HEAD-2003091401
[reactos.git] / ntoskrnl / ke / i386 / v86m.c
index 42e8605..be7e9a5 100644 (file)
@@ -29,6 +29,7 @@
 #include <internal/v86m.h>
 #include <internal/trap.h>
 #include <internal/mm.h>
+#include <internal/ps.h>
 #include <internal/i386/segment.h>
 #include <string.h>
 
@@ -247,6 +248,7 @@ KeV86GPF(PKV86M_TRAP_FRAME VTf, PKTRAP_FRAME Tf)
            }
          if (VTf->regs->Flags & KV86M_ALLOW_IO_PORT_ACCESS)
            {
+             DPRINT("outb %d, %x\n", (ULONG)ip[i + 1], Tf->Eax & 0xFF);
              WRITE_PORT_UCHAR((PUCHAR)(ULONG)ip[i + 1], 
                               Tf->Eax & 0xFF);
              Tf->Eip = Tf->Eip + 2;
@@ -266,10 +268,12 @@ KeV86GPF(PKV86M_TRAP_FRAME VTf, PKTRAP_FRAME Tf)
            {
              if (!BigDataPrefix)
                {
+                 DPRINT("outw %d, %x\n", (ULONG)ip[i + 1], Tf->Eax & 0xFFFF);
                  WRITE_PORT_USHORT((PUSHORT)(ULONG)ip[1], Tf->Eax & 0xFFFF);
                }
              else
                {
+                 DPRINT("outl %d, %x\n", (ULONG)ip[i + 1], Tf->Eax);
                  WRITE_PORT_ULONG((PULONG)(ULONG)ip[1], Tf->Eax);
                }
              Tf->Eip = Tf->Eip + 2;
@@ -287,6 +291,7 @@ KeV86GPF(PKV86M_TRAP_FRAME VTf, PKTRAP_FRAME Tf)
            }
          if (VTf->regs->Flags & KV86M_ALLOW_IO_PORT_ACCESS)
            {
+             DPRINT("outb %d, %x\n", Tf->Edx & 0xFFFF, Tf->Eax & 0xFF);
              WRITE_PORT_UCHAR((PUCHAR)(Tf->Edx & 0xFFFF), Tf->Eax & 0xFF);
              Tf->Eip = Tf->Eip + 1;
              return(0);
@@ -305,11 +310,13 @@ KeV86GPF(PKV86M_TRAP_FRAME VTf, PKTRAP_FRAME Tf)
            {
              if (!BigDataPrefix)
                {
+                 DPRINT("outw %d, %x\n", Tf->Edx & 0xFFFF, Tf->Eax & 0xFFFF);
                  WRITE_PORT_USHORT((PUSHORT)(Tf->Edx & 0xFFFF), 
                                    Tf->Eax & 0xFFFF);
                }
              else
                {
+                 DPRINT("outl %d, %x\n", Tf->Edx & 0xFFFF, Tf->Eax);
                  WRITE_PORT_ULONG((PULONG)(Tf->Edx & 0xFFFF), 
                                   Tf->Eax);
                }
@@ -331,6 +338,7 @@ KeV86GPF(PKV86M_TRAP_FRAME VTf, PKTRAP_FRAME Tf)
              UCHAR v;
              
              v = READ_PORT_UCHAR((PUCHAR)(ULONG)ip[1]);
+             DPRINT("inb %d\t%X\n", (ULONG)ip[1], v);
              Tf->Eax = Tf->Eax & (~0xFF);
              Tf->Eax = Tf->Eax | v;
              Tf->Eip = Tf->Eip + 2;
@@ -347,12 +355,22 @@ KeV86GPF(PKV86M_TRAP_FRAME VTf, PKTRAP_FRAME Tf)
              return(1);
            }
          if (VTf->regs->Flags & KV86M_ALLOW_IO_PORT_ACCESS)
-           {
-             USHORT v;
-             
-             v = READ_PORT_USHORT((PUSHORT)(ULONG)ip[1]);
-             Tf->Eax = Tf->Eax & (~0xFFFF);
-             Tf->Eax = Tf->Eax | v;
+           {        
+             if (!BigDataPrefix)
+               {
+                 USHORT v;
+                 v = READ_PORT_USHORT((PUSHORT)(ULONG)ip[1]);
+                 DPRINT("inw %d\t%X\n", (ULONG)ip[1], v);
+                 Tf->Eax = Tf->Eax & (~0xFFFF);
+                 Tf->Eax = Tf->Eax | v;
+               }
+             else
+               {
+                 ULONG v;
+                 v = READ_PORT_USHORT((PUSHORT)(ULONG)ip[1]);
+                 DPRINT("inl %d\t%X\n", (ULONG)ip[1], v);
+                 Tf->Eax = v;
+               }
              Tf->Eip = Tf->Eip + 2;
              return(0);
            }
@@ -369,8 +387,9 @@ KeV86GPF(PKV86M_TRAP_FRAME VTf, PKTRAP_FRAME Tf)
          if (VTf->regs->Flags & KV86M_ALLOW_IO_PORT_ACCESS)
            {
              UCHAR v;
-
+             
              v = READ_PORT_UCHAR((PUCHAR)(Tf->Edx & 0xFFFF));
+             DPRINT("inb %d\t%X\n", Tf->Edx & 0xFFFF, v);
              Tf->Eax = Tf->Eax & (~0xFF);
              Tf->Eax = Tf->Eax | v;
              Tf->Eip = Tf->Eip + 1;
@@ -388,11 +407,23 @@ KeV86GPF(PKV86M_TRAP_FRAME VTf, PKTRAP_FRAME Tf)
            }
          if (VTf->regs->Flags & KV86M_ALLOW_IO_PORT_ACCESS)
            {
-             USHORT v;
+             if (!BigDataPrefix)
+               {
+                 USHORT v;
 
-             v = READ_PORT_USHORT((PUSHORT)(Tf->Edx & 0xFFFF));
-             Tf->Eax = Tf->Eax & (~0xFFFF);
-             Tf->Eax = Tf->Eax | v;
+                 v = READ_PORT_USHORT((PUSHORT)(Tf->Edx & 0xFFFF));
+                 DPRINT("inw %d\t%X\n", Tf->Edx & 0xFFFF, v);
+                 Tf->Eax = Tf->Eax & (~0xFFFF);
+                 Tf->Eax = Tf->Eax | v;
+               }
+             else
+               {
+                 ULONG v;
+
+                 v = READ_PORT_USHORT((PUSHORT)(Tf->Edx & 0xFFFF));
+                 DPRINT("inl %d\t%X\n", Tf->Edx & 0xFFFF, v);
+                 Tf->Eax = v;
+               }
              Tf->Eip = Tf->Eip + 1;
              return(0);
            }
@@ -679,6 +710,12 @@ KeV86Exception(ULONG ExceptionNr, PKTRAP_FRAME Tf, ULONG address)
 
   VTf = (PKV86M_TRAP_FRAME)Tf;
 
+  if(KeGetCurrentProcess()->NtVdmFlag)
+  {
+    VTf->regs->PStatus = (PNTSTATUS) ExceptionNr;
+    if(ExceptionNr != 14) return 1;
+  }
+
   /*
    * Check if we have reached the recovery instruction
    */
@@ -784,7 +821,13 @@ KeV86Exception(ULONG ExceptionNr, PKTRAP_FRAME Tf, ULONG address)
                             Tf->ErrorCode);
        if (!NT_SUCCESS(Status))
          {
-           DPRINT("V86Exception, halting due to page fault\n");
+            if(KeGetCurrentProcess()->NtVdmFlag)
+            {
+              VTf->regs->PStatus = (PNTSTATUS) STATUS_NONCONTINUABLE_EXCEPTION;
+              return 1;
+            }
+
+            DPRINT("V86Exception, halting due to page fault\n");
            *VTf->regs->PStatus = STATUS_NONCONTINUABLE_EXCEPTION;
            return(1);
          }