#include <internal/v86m.h>
#include <internal/trap.h>
#include <internal/mm.h>
+#include <internal/ps.h>
#include <internal/i386/segment.h>
#include <string.h>
}
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;
{
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;
}
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);
{
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);
}
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;
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);
}
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;
}
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);
}
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
*/
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);
}