[FAST486]
authorAleksandar Andrejevic <aandrejevic@reactos.org>
Wed, 20 Nov 2013 10:48:26 +0000 (10:48 +0000)
committerAleksandar Andrejevic <aandrejevic@reactos.org>
Wed, 20 Nov 2013 10:48:26 +0000 (10:48 +0000)
Read the LDT instead of the GDT when the table indicator is set.

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

lib/fast486/common.h
lib/fast486/common.inl

index 76ec3f4..cc47a72 100644 (file)
@@ -37,6 +37,7 @@
 
 #define GET_SEGMENT_RPL(s)          ((s) & 3)
 #define GET_SEGMENT_INDEX(s)        ((s) & 0xFFF8)
+#define SEGMENT_TABLE_INDICATOR     (1 << 2)
 #define EXCEPTION_HAS_ERROR_CODE(x) (((x) == 8) || ((x) >= 10 && (x) <= 14))
 
 #define NO_LOCK_PREFIX() if (State->PrefixFlags & FAST486_PREFIX_LOCK)\
index 3883ad9..4e84576 100644 (file)
@@ -399,22 +399,45 @@ Fast486LoadSegment(PFAST486_STATE State,
     /* Check for protected mode */
     if ((State->ControlRegisters[FAST486_REG_CR0] & FAST486_CR0_PE) && !State->Flags.Vm)
     {
-        /* Make sure the GDT contains the entry */
-        if (GET_SEGMENT_INDEX(Selector) >= (State->Gdtr.Size + 1))
+        if (!(Selector & SEGMENT_TABLE_INDICATOR))
         {
-            Fast486Exception(State, FAST486_EXCEPTION_GP);
-            return FALSE;
-        }
+            /* Make sure the GDT contains the entry */
+            if (GET_SEGMENT_INDEX(Selector) >= (State->Gdtr.Size + 1))
+            {
+                Fast486ExceptionWithErrorCode(State, FAST486_EXCEPTION_GP, Selector);
+                return FALSE;
+            }
 
-        /* Read the GDT */
-        if (!Fast486ReadLinearMemory(State,
-                                     State->Gdtr.Address
-                                     + GET_SEGMENT_INDEX(Selector),
-                                     &GdtEntry,
-                                     sizeof(GdtEntry)))
+            /* Read the GDT */
+            if (!Fast486ReadLinearMemory(State,
+                                         State->Gdtr.Address
+                                         + GET_SEGMENT_INDEX(Selector),
+                                         &GdtEntry,
+                                         sizeof(GdtEntry)))
+            {
+                /* Exception occurred */
+                return FALSE;
+            }
+        }
+        else
         {
-            /* Exception occurred */
-            return FALSE;
+            /* Make sure the LDT contains the entry */
+            if (GET_SEGMENT_INDEX(Selector) >= (State->Ldtr.Size + 1))
+            {
+                Fast486ExceptionWithErrorCode(State, FAST486_EXCEPTION_GP, Selector);
+                return FALSE;
+            }
+
+            /* Read the LDT */
+            if (!Fast486ReadLinearMemory(State,
+                                         State->Ldtr.Address
+                                         + GET_SEGMENT_INDEX(Selector),
+                                         &GdtEntry,
+                                         sizeof(GdtEntry)))
+            {
+                /* Exception occurred */
+                return FALSE;
+            }
         }
 
         if (Segment == FAST486_REG_SS)
@@ -503,7 +526,6 @@ Fast486LoadSegment(PFAST486_STATE State,
                         Fast486ExceptionWithErrorCode(State, FAST486_EXCEPTION_GP, Selector);
                         return FALSE;
                     }
-
                 }
 
                 /* Update CPL */