From dfd1c031d679b6425d6f7827989f66895f68412e Mon Sep 17 00:00:00 2001 From: Aleksandar Andrejevic Date: Sat, 26 Oct 2013 17:33:10 +0000 Subject: [PATCH] [FAST486] Implement the CLTS instruction. svn path=/branches/ntvdm/; revision=60752 --- lib/fast486/extraops.c | 19 ++++++++++++++++++- lib/fast486/extraops.h | 1 + 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/fast486/extraops.c b/lib/fast486/extraops.c index 8ac7fc2d6fb..7c6da5e9c06 100644 --- a/lib/fast486/extraops.c +++ b/lib/fast486/extraops.c @@ -45,7 +45,7 @@ Fast486ExtendedHandlers[FAST486_NUM_OPCODE_HANDLERS] = NULL, // TODO: OPCODE 0x03 NOT IMPLEMENTED NULL, // TODO: OPCODE 0x04 NOT IMPLEMENTED NULL, // TODO: OPCODE 0x05 NOT IMPLEMENTED - NULL, // TODO: OPCODE 0x06 NOT IMPLEMENTED + Fast486ExtOpcodeClts, NULL, // TODO: OPCODE 0x07 NOT IMPLEMENTED NULL, // TODO: OPCODE 0x08 NOT IMPLEMENTED NULL, // TODO: OPCODE 0x09 NOT IMPLEMENTED @@ -299,6 +299,23 @@ Fast486ExtendedHandlers[FAST486_NUM_OPCODE_HANDLERS] = /* PUBLIC FUNCTIONS ***********************************************************/ +FAST486_OPCODE_HANDLER(Fast486ExtOpcodeClts) +{ + NO_LOCK_PREFIX(); + + /* The current privilege level must be zero */ + if (Fast486GetCurrentPrivLevel(State) != 0) + { + Fast486Exception(State, FAST486_EXCEPTION_GP); + return FALSE; + } + + /* Clear the task switch bit */ + State->ControlRegisters[FAST486_REG_CR0] &= ~FAST486_CR0_TS; + + return TRUE; +} + FAST486_OPCODE_HANDLER(Fast486ExtOpcodeStoreControlReg) { BOOLEAN AddressSize = State->SegmentRegs[FAST486_REG_CS].Size; diff --git a/lib/fast486/extraops.h b/lib/fast486/extraops.h index d650c7499d2..46ad8610098 100644 --- a/lib/fast486/extraops.h +++ b/lib/fast486/extraops.h @@ -23,6 +23,7 @@ #define _EXTRAOPS_H_ /* DEFINES ********************************************************************/ +FAST486_OPCODE_HANDLER(Fast486ExtOpcodeClts); FAST486_OPCODE_HANDLER(Fast486ExtOpcodeStoreControlReg); FAST486_OPCODE_HANDLER(Fast486ExtOpcodeStoreDebugReg); FAST486_OPCODE_HANDLER(Fast486ExtOpcodeLoadControlReg);