mirror of
https://github.com/reactos/reactos.git
synced 2024-10-15 13:45:58 +00:00
[SOFT386]
Add checks for illegal prefixes. Implement HLT and PAUSE. svn path=/branches/ntvdm/; revision=59890
This commit is contained in:
parent
5a14da958f
commit
c0a39279ae
|
@ -150,6 +150,13 @@ VOID
|
||||||
ULONG Size
|
ULONG Size
|
||||||
);
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
VOID
|
||||||
|
(NTAPI *SOFT386_IDLE_PROC)
|
||||||
|
(
|
||||||
|
PSOFT386_STATE State
|
||||||
|
);
|
||||||
|
|
||||||
typedef union _SOFT386_REG
|
typedef union _SOFT386_REG
|
||||||
{
|
{
|
||||||
struct
|
struct
|
||||||
|
@ -280,6 +287,7 @@ struct _SOFT386_STATE
|
||||||
SOFT386_MEM_WRITE_PROC MemWriteCallback;
|
SOFT386_MEM_WRITE_PROC MemWriteCallback;
|
||||||
SOFT386_IO_READ_PROC IoReadCallback;
|
SOFT386_IO_READ_PROC IoReadCallback;
|
||||||
SOFT386_IO_WRITE_PROC IoWriteCallback;
|
SOFT386_IO_WRITE_PROC IoWriteCallback;
|
||||||
|
SOFT386_IDLE_PROC IdleCallback;
|
||||||
SOFT386_REG GeneralRegs[SOFT386_NUM_GEN_REGS];
|
SOFT386_REG GeneralRegs[SOFT386_NUM_GEN_REGS];
|
||||||
SOFT386_SEG_REG SegmentRegs[SOFT386_NUM_SEG_REGS];
|
SOFT386_SEG_REG SegmentRegs[SOFT386_NUM_SEG_REGS];
|
||||||
SOFT386_REG InstPtr;
|
SOFT386_REG InstPtr;
|
||||||
|
@ -291,6 +299,7 @@ struct _SOFT386_STATE
|
||||||
ULONG ExceptionCount;
|
ULONG ExceptionCount;
|
||||||
ULONG PrefixFlags;
|
ULONG PrefixFlags;
|
||||||
INT SegmentOverride;
|
INT SegmentOverride;
|
||||||
|
BOOLEAN HardwareInt;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* FUNCTIONS ******************************************************************/
|
/* FUNCTIONS ******************************************************************/
|
||||||
|
|
|
@ -600,7 +600,8 @@ Soft386OpcodeNop(PSOFT386_STATE State, UCHAR Opcode)
|
||||||
|
|
||||||
if (State->PrefixFlags & SOFT386_PREFIX_REP)
|
if (State->PrefixFlags & SOFT386_PREFIX_REP)
|
||||||
{
|
{
|
||||||
// TODO: Handle PAUSE instruction.
|
/* Idle cycle */
|
||||||
|
State->IdleCallback(State);
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -748,6 +749,13 @@ Soft386OpcodeClearCarry(PSOFT386_STATE State, UCHAR Opcode)
|
||||||
/* Make sure this is the right instruction */
|
/* Make sure this is the right instruction */
|
||||||
ASSERT(Opcode == 0xF8);
|
ASSERT(Opcode == 0xF8);
|
||||||
|
|
||||||
|
/* No prefixes allowed */
|
||||||
|
if (State->PrefixFlags)
|
||||||
|
{
|
||||||
|
Soft386Exception(State, SOFT386_EXCEPTION_UD);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/* Clear CF and return success */
|
/* Clear CF and return success */
|
||||||
State->Flags.Cf = FALSE;
|
State->Flags.Cf = FALSE;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -760,6 +768,13 @@ Soft386OpcodeSetCarry(PSOFT386_STATE State, UCHAR Opcode)
|
||||||
/* Make sure this is the right instruction */
|
/* Make sure this is the right instruction */
|
||||||
ASSERT(Opcode == 0xF9);
|
ASSERT(Opcode == 0xF9);
|
||||||
|
|
||||||
|
/* No prefixes allowed */
|
||||||
|
if (State->PrefixFlags)
|
||||||
|
{
|
||||||
|
Soft386Exception(State, SOFT386_EXCEPTION_UD);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/* Set CF and return success*/
|
/* Set CF and return success*/
|
||||||
State->Flags.Cf = TRUE;
|
State->Flags.Cf = TRUE;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -772,6 +787,13 @@ Soft386OpcodeClearInt(PSOFT386_STATE State, UCHAR Opcode)
|
||||||
/* Make sure this is the right instruction */
|
/* Make sure this is the right instruction */
|
||||||
ASSERT(Opcode == 0xFA);
|
ASSERT(Opcode == 0xFA);
|
||||||
|
|
||||||
|
/* No prefixes allowed */
|
||||||
|
if (State->PrefixFlags)
|
||||||
|
{
|
||||||
|
Soft386Exception(State, SOFT386_EXCEPTION_UD);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/* Check for protected mode */
|
/* Check for protected mode */
|
||||||
if (State->ControlRegisters[SOFT386_REG_CR0] & SOFT386_CR0_PE)
|
if (State->ControlRegisters[SOFT386_REG_CR0] & SOFT386_CR0_PE)
|
||||||
{
|
{
|
||||||
|
@ -805,6 +827,13 @@ Soft386OpcodeSetInt(PSOFT386_STATE State, UCHAR Opcode)
|
||||||
/* Make sure this is the right instruction */
|
/* Make sure this is the right instruction */
|
||||||
ASSERT(Opcode == 0xFB);
|
ASSERT(Opcode == 0xFB);
|
||||||
|
|
||||||
|
/* No prefixes allowed */
|
||||||
|
if (State->PrefixFlags)
|
||||||
|
{
|
||||||
|
Soft386Exception(State, SOFT386_EXCEPTION_UD);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/* Check for protected mode */
|
/* Check for protected mode */
|
||||||
if (State->ControlRegisters[SOFT386_REG_CR0] & SOFT386_CR0_PE)
|
if (State->ControlRegisters[SOFT386_REG_CR0] & SOFT386_CR0_PE)
|
||||||
{
|
{
|
||||||
|
@ -838,6 +867,13 @@ Soft386OpcodeClearDir(PSOFT386_STATE State, UCHAR Opcode)
|
||||||
/* Make sure this is the right instruction */
|
/* Make sure this is the right instruction */
|
||||||
ASSERT(Opcode == 0xFC);
|
ASSERT(Opcode == 0xFC);
|
||||||
|
|
||||||
|
/* No prefixes allowed */
|
||||||
|
if (State->PrefixFlags)
|
||||||
|
{
|
||||||
|
Soft386Exception(State, SOFT386_EXCEPTION_UD);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/* Clear DF and return success */
|
/* Clear DF and return success */
|
||||||
State->Flags.Df = FALSE;
|
State->Flags.Df = FALSE;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -850,7 +886,42 @@ Soft386OpcodeSetDir(PSOFT386_STATE State, UCHAR Opcode)
|
||||||
/* Make sure this is the right instruction */
|
/* Make sure this is the right instruction */
|
||||||
ASSERT(Opcode == 0xFD);
|
ASSERT(Opcode == 0xFD);
|
||||||
|
|
||||||
|
/* No prefixes allowed */
|
||||||
|
if (State->PrefixFlags)
|
||||||
|
{
|
||||||
|
Soft386Exception(State, SOFT386_EXCEPTION_UD);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/* Set DF and return success*/
|
/* Set DF and return success*/
|
||||||
State->Flags.Df = TRUE;
|
State->Flags.Df = TRUE;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
FASTCALL
|
||||||
|
Soft386OpcodeHalt(PSOFT386_STATE State, UCHAR Opcode)
|
||||||
|
{
|
||||||
|
/* Make sure this is the right instruction */
|
||||||
|
ASSERT(Opcode == 0xF4);
|
||||||
|
|
||||||
|
/* No prefixes allowed */
|
||||||
|
if (State->PrefixFlags)
|
||||||
|
{
|
||||||
|
Soft386Exception(State, SOFT386_EXCEPTION_UD);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Privileged instructions can only be executed under CPL = 0 */
|
||||||
|
if (State->SegmentRegs[SOFT386_REG_CS].Dpl != 0)
|
||||||
|
{
|
||||||
|
Soft386Exception(State, SOFT386_EXCEPTION_GP);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Halt */
|
||||||
|
while (!State->HardwareInt) State->IdleCallback(State);
|
||||||
|
|
||||||
|
/* Return success */
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
|
@ -201,6 +201,7 @@ Soft386Reset(PSOFT386_STATE State)
|
||||||
SOFT386_MEM_WRITE_PROC MemWriteCallback = State->MemWriteCallback;
|
SOFT386_MEM_WRITE_PROC MemWriteCallback = State->MemWriteCallback;
|
||||||
SOFT386_IO_READ_PROC IoReadCallback = State->IoReadCallback;
|
SOFT386_IO_READ_PROC IoReadCallback = State->IoReadCallback;
|
||||||
SOFT386_IO_WRITE_PROC IoWriteCallback = State->IoWriteCallback;
|
SOFT386_IO_WRITE_PROC IoWriteCallback = State->IoWriteCallback;
|
||||||
|
SOFT386_IDLE_PROC IdleCallback = State->IdleCallback;
|
||||||
|
|
||||||
/* Clear the entire structure */
|
/* Clear the entire structure */
|
||||||
RtlZeroMemory(State, sizeof(*State));
|
RtlZeroMemory(State, sizeof(*State));
|
||||||
|
@ -234,6 +235,7 @@ Soft386Reset(PSOFT386_STATE State)
|
||||||
State->MemWriteCallback = MemWriteCallback;
|
State->MemWriteCallback = MemWriteCallback;
|
||||||
State->IoReadCallback = IoReadCallback;
|
State->IoReadCallback = IoReadCallback;
|
||||||
State->IoWriteCallback = IoWriteCallback;
|
State->IoWriteCallback = IoWriteCallback;
|
||||||
|
State->IdleCallback = IdleCallback;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
|
Loading…
Reference in a new issue