[FAST486]
authorAleksandar Andrejevic <aandrejevic@reactos.org>
Sat, 26 Oct 2013 17:33:10 +0000 (17:33 +0000)
committerAleksandar Andrejevic <aandrejevic@reactos.org>
Sat, 26 Oct 2013 17:33:10 +0000 (17:33 +0000)
Implement the CLTS instruction.

svn path=/branches/ntvdm/; revision=60752

lib/fast486/extraops.c
lib/fast486/extraops.h

index 8ac7fc2..7c6da5e 100644 (file)
@@ -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;
index d650c74..46ad861 100644 (file)
@@ -23,6 +23,7 @@
 #define _EXTRAOPS_H_
 
 /* DEFINES ********************************************************************/
+FAST486_OPCODE_HANDLER(Fast486ExtOpcodeClts);
 FAST486_OPCODE_HANDLER(Fast486ExtOpcodeStoreControlReg);
 FAST486_OPCODE_HANDLER(Fast486ExtOpcodeStoreDebugReg);
 FAST486_OPCODE_HANDLER(Fast486ExtOpcodeLoadControlReg);