628 FAST486_SYSTEM_DESCRIPTOR NewTssDescriptor;
630 PFAST486_LEGACY_TSS OldLegacyTss = (PFAST486_LEGACY_TSS)&OldTss;
632 PFAST486_LEGACY_TSS NewLegacyTss = (PFAST486_LEGACY_TSS)&NewTss;
633 USHORT NewLdtr, NewEs, NewCs, NewSs, NewDs;
635 if ((
State->TaskReg.Modern &&
State->TaskReg.Limit < (
sizeof(FAST486_TSS) - 1))
636 || (!
State->TaskReg.Modern &&
State->TaskReg.Limit < (
sizeof(FAST486_LEGACY_TSS) - 1)))
644 if (!Fast486ReadLinearMemory(
State,
647 State->TaskReg.Modern
648 ?
sizeof(FAST486_TSS) :
sizeof(FAST486_LEGACY_TSS),
659 if (
State->TaskReg.Modern) Selector =
LOWORD(OldTss.Link);
660 else Selector = OldLegacyTss->Link;
673 if (!Fast486ReadLinearMemory(
State,
676 sizeof(NewTssDescriptor),
683 if (!NewTssDescriptor.Present)
691 NewTssAddress = NewTssDescriptor.Base;
692 NewTssAddress |= NewTssDescriptor.BaseMid << 16;
693 NewTssAddress |= NewTssDescriptor.BaseHigh << 24;
696 NewTssLimit = NewTssDescriptor.Limit | (NewTssDescriptor.LimitHigh << 16);
698 if (NewTssDescriptor.Granularity)
701 NewTssLimit |= 0x00000FFF;
704 if (NewTssLimit < (
sizeof(FAST486_TSS) - 1)
705 && NewTssLimit != (
sizeof(FAST486_LEGACY_TSS) - 1))
728 if (!Fast486ReadLinearMemory(
State,
733 ?
sizeof(FAST486_TSS) :
sizeof(FAST486_LEGACY_TSS),
743 FAST486_SYSTEM_DESCRIPTOR OldTssDescriptor;
745 if (!Fast486ReadLinearMemory(
State,
749 sizeof(OldTssDescriptor),
758 if (!Fast486WriteLinearMemory(
State,
762 sizeof(OldTssDescriptor),
775 NewTss.Link =
State->TaskReg.Selector;
778 if (!Fast486WriteLinearMemory(
State,
790 NewLegacyTss->Link =
State->TaskReg.Selector;
793 if (!Fast486WriteLinearMemory(
State,
796 sizeof(NewLegacyTss->Link),
806 if (
State->TaskReg.Modern)
808 OldTss.Cr3 =
State->ControlRegisters[FAST486_REG_CR3];
809 OldTss.Eip =
State->InstPtr.Long;
810 OldTss.Eflags =
State->Flags.Long;
811 OldTss.Eax =
State->GeneralRegs[FAST486_REG_EAX].Long;
812 OldTss.Ecx =
State->GeneralRegs[FAST486_REG_ECX].Long;
813 OldTss.Edx =
State->GeneralRegs[FAST486_REG_EDX].Long;
814 OldTss.Ebx =
State->GeneralRegs[FAST486_REG_EBX].Long;
815 OldTss.Esp =
State->GeneralRegs[FAST486_REG_ESP].Long;
816 OldTss.Ebp =
State->GeneralRegs[FAST486_REG_EBP].Long;
817 OldTss.Esi =
State->GeneralRegs[FAST486_REG_ESI].Long;
818 OldTss.Edi =
State->GeneralRegs[FAST486_REG_EDI].Long;
819 OldTss.Es =
State->SegmentRegs[FAST486_REG_ES].Selector;
820 OldTss.Cs =
State->SegmentRegs[FAST486_REG_CS].Selector;
821 OldTss.Ss =
State->SegmentRegs[FAST486_REG_SS].Selector;
822 OldTss.Ds =
State->SegmentRegs[FAST486_REG_DS].Selector;
823 OldTss.Fs =
State->SegmentRegs[FAST486_REG_FS].Selector;
824 OldTss.Gs =
State->SegmentRegs[FAST486_REG_GS].Selector;
825 OldTss.Ldtr =
State->Ldtr.Selector;
829 OldLegacyTss->Ip =
State->InstPtr.LowWord;
830 OldLegacyTss->Flags =
State->Flags.LowWord;
831 OldLegacyTss->Ax =
State->GeneralRegs[FAST486_REG_EAX].LowWord;
832 OldLegacyTss->Cx =
State->GeneralRegs[FAST486_REG_ECX].LowWord;
833 OldLegacyTss->Dx =
State->GeneralRegs[FAST486_REG_EDX].LowWord;
834 OldLegacyTss->Bx =
State->GeneralRegs[FAST486_REG_EBX].LowWord;
835 OldLegacyTss->Sp =
State->GeneralRegs[FAST486_REG_ESP].LowWord;
836 OldLegacyTss->Bp =
State->GeneralRegs[FAST486_REG_EBP].LowWord;
837 OldLegacyTss->Si =
State->GeneralRegs[FAST486_REG_ESI].LowWord;
838 OldLegacyTss->Di =
State->GeneralRegs[FAST486_REG_EDI].LowWord;
839 OldLegacyTss->Es =
State->SegmentRegs[FAST486_REG_ES].Selector;
840 OldLegacyTss->Cs =
State->SegmentRegs[FAST486_REG_CS].Selector;
841 OldLegacyTss->Ss =
State->SegmentRegs[FAST486_REG_SS].Selector;
842 OldLegacyTss->Ds =
State->SegmentRegs[FAST486_REG_DS].Selector;
843 OldLegacyTss->Ldtr =
State->Ldtr.Selector;
847 if (!Fast486WriteLinearMemory(
State,
850 State->TaskReg.Modern
851 ?
sizeof(FAST486_TSS) :
sizeof(FAST486_LEGACY_TSS),
872 if (!Fast486WriteLinearMemory(
State,
875 sizeof(NewTssDescriptor),
886 State->TaskReg.Selector = Selector;
887 State->TaskReg.Base = NewTssAddress;
888 State->TaskReg.Limit = NewTssLimit;
894 State->ControlRegisters[FAST486_REG_CR3] = NewTss.Cr3;
898 Fast486FlushTlb(
State);
910 #ifndef FAST486_NO_PREFETCH 918 State->InstPtr.Long =
State->SavedInstPtr.Long = NewTss.Eip;
919 State->Flags.Long = NewTss.Eflags;
920 State->GeneralRegs[FAST486_REG_EAX].Long = NewTss.Eax;
921 State->GeneralRegs[FAST486_REG_ECX].Long = NewTss.Ecx;
922 State->GeneralRegs[FAST486_REG_EDX].Long = NewTss.Edx;
923 State->GeneralRegs[FAST486_REG_EBX].Long = NewTss.Ebx;
924 State->GeneralRegs[FAST486_REG_EBP].Long = NewTss.Ebp;
925 State->GeneralRegs[FAST486_REG_ESI].Long = NewTss.Esi;
926 State->GeneralRegs[FAST486_REG_EDI].Long = NewTss.Edi;
930 NewLdtr = NewTss.Ldtr;
938 State->GeneralRegs[FAST486_REG_ESP].Long = NewTss.Esp0;
945 State->GeneralRegs[FAST486_REG_ESP].Long = NewTss.Esp1;
952 State->GeneralRegs[FAST486_REG_ESP].Long = NewTss.Esp2;
960 State->GeneralRegs[FAST486_REG_ESP].Long = NewTss.Esp;
966 State->InstPtr.LowWord =
State->SavedInstPtr.LowWord = NewLegacyTss->Ip;
967 State->Flags.LowWord = NewLegacyTss->Flags;
968 State->GeneralRegs[FAST486_REG_EAX].LowWord = NewLegacyTss->Ax;
969 State->GeneralRegs[FAST486_REG_ECX].LowWord = NewLegacyTss->Cx;
970 State->GeneralRegs[FAST486_REG_EDX].LowWord = NewLegacyTss->Dx;
971 State->GeneralRegs[FAST486_REG_EBX].LowWord = NewLegacyTss->Bx;
972 State->GeneralRegs[FAST486_REG_EBP].LowWord = NewLegacyTss->Bp;
973 State->GeneralRegs[FAST486_REG_ESI].LowWord = NewLegacyTss->Si;
974 State->GeneralRegs[FAST486_REG_EDI].LowWord = NewLegacyTss->Di;
975 NewEs = NewLegacyTss->Es;
976 NewCs = NewLegacyTss->Cs;
977 NewDs = NewLegacyTss->Ds;
978 NewLdtr = NewLegacyTss->Ldtr;
986 State->GeneralRegs[FAST486_REG_ESP].Long = NewLegacyTss->Sp0;
987 NewSs = NewLegacyTss->Ss0;
993 State->GeneralRegs[FAST486_REG_ESP].Long = NewLegacyTss->Sp1;
994 NewSs = NewLegacyTss->Ss1;
1000 State->GeneralRegs[FAST486_REG_ESP].Long = NewLegacyTss->Sp2;
1001 NewSs = NewLegacyTss->Ss2;
1008 State->GeneralRegs[FAST486_REG_ESP].Long = NewLegacyTss->Sp;
1009 NewSs = NewLegacyTss->Ss;
1019 FAST486_SYSTEM_DESCRIPTOR GdtEntry;
1028 if (!Fast486ReadDescriptorEntry(
State, NewLdtr, &Valid, (PFAST486_GDT_ENTRY)&GdtEntry))
1048 if (!GdtEntry.Present)
1055 State->Ldtr.Selector = NewLdtr;
1056 State->Ldtr.Base = GdtEntry.Base | (GdtEntry.BaseMid << 16) | (GdtEntry.BaseHigh << 24);
1057 State->Ldtr.Limit = GdtEntry.Limit | (GdtEntry.LimitHigh << 16);
1059 if (GdtEntry.Granularity)
1061 State->Ldtr.Limit <<= 12;
1062 State->Ldtr.Limit |= 0x00000FFF;
1072 if (!Fast486LoadSegmentInternal(
State, FAST486_REG_CS, NewCs, FAST486_EXCEPTION_TS))
1077 if (!Fast486LoadSegmentInternal(
State, FAST486_REG_SS, NewSs, FAST486_EXCEPTION_TS))
1082 if (!Fast486LoadSegmentInternal(
State, FAST486_REG_ES, NewEs, FAST486_EXCEPTION_TS))
1087 if (!Fast486LoadSegmentInternal(
State, FAST486_REG_DS, NewDs, FAST486_EXCEPTION_TS))
1094 if (!Fast486LoadSegmentInternal(
State,
1097 FAST486_EXCEPTION_TS))
1102 if (!Fast486LoadSegmentInternal(
State,
1105 FAST486_EXCEPTION_TS))
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
#define GET_SEGMENT_INDEX(s)
#define FAST486_BUSY_TSS_SIGNATURE
#define FAST486_BUSY_TSS_16_SIGNATURE
#define FAST486_TSS_16_SIGNATURE
#define SEGMENT_TABLE_INDICATOR
#define GET_SEGMENT_RPL(s)
VOID FASTCALL Fast486ExceptionWithErrorCode(PFAST486_STATE State, FAST486_EXCEPTIONS ExceptionCode, ULONG ErrorCode)
#define FAST486_TSS_SIGNATURE
#define RtlZeroMemory(Destination, Length)
#define FAST486_LDT_SIGNATURE