[FAST486]

Whether a TSS is 16-bit or 32-bit depends solely on its signature.
Its size is irrelevant.


svn path=/trunk/; revision=69367
This commit is contained in:
Aleksandar Andrejevic 2015-09-26 19:22:50 +00:00
parent 3d49a7a6d4
commit 441ccab2b4
2 changed files with 14 additions and 12 deletions

View file

@ -328,7 +328,7 @@ Fast486InterruptInternal(PFAST486_STATE State,
if (!Fast486ReadLinearMemory(State, if (!Fast486ReadLinearMemory(State,
State->TaskReg.Base, State->TaskReg.Base,
&Tss, &Tss,
State->TaskReg.Limit >= (sizeof(FAST486_TSS) - 1) State->TaskReg.Modern
? sizeof(FAST486_TSS) : sizeof(FAST486_LEGACY_TSS), ? sizeof(FAST486_TSS) : sizeof(FAST486_LEGACY_TSS),
FALSE)) FALSE))
{ {
@ -347,7 +347,7 @@ Fast486InterruptInternal(PFAST486_STATE State,
{ {
case 0: case 0:
{ {
if (State->TaskReg.Limit >= (sizeof(FAST486_TSS) - 1)) if (State->TaskReg.Modern)
{ {
NewSs = Tss.Ss0; NewSs = Tss.Ss0;
NewEsp = Tss.Esp0; NewEsp = Tss.Esp0;
@ -363,7 +363,7 @@ Fast486InterruptInternal(PFAST486_STATE State,
case 1: case 1:
{ {
if (State->TaskReg.Limit >= (sizeof(FAST486_TSS) - 1)) if (State->TaskReg.Modern)
{ {
NewSs = Tss.Ss1; NewSs = Tss.Ss1;
NewEsp = Tss.Esp1; NewEsp = Tss.Esp1;
@ -379,7 +379,7 @@ Fast486InterruptInternal(PFAST486_STATE State,
case 2: case 2:
{ {
if (State->TaskReg.Limit >= (sizeof(FAST486_TSS) - 1)) if (State->TaskReg.Modern)
{ {
NewSs = Tss.Ss2; NewSs = Tss.Ss2;
NewEsp = Tss.Esp2; NewEsp = Tss.Esp2;
@ -632,7 +632,7 @@ Fast486TaskSwitch(PFAST486_STATE State, FAST486_TASK_SWITCH_TYPE Type, USHORT Se
if (!Fast486ReadLinearMemory(State, if (!Fast486ReadLinearMemory(State,
State->TaskReg.Base, State->TaskReg.Base,
&OldTss, &OldTss,
State->TaskReg.Limit >= (sizeof(FAST486_TSS) - 1) State->TaskReg.Modern
? sizeof(FAST486_TSS) : sizeof(FAST486_LEGACY_TSS), ? sizeof(FAST486_TSS) : sizeof(FAST486_LEGACY_TSS),
FALSE)) FALSE))
{ {
@ -644,7 +644,7 @@ Fast486TaskSwitch(PFAST486_STATE State, FAST486_TASK_SWITCH_TYPE Type, USHORT Se
/* If this is a task return, use the linked previous selector */ /* If this is a task return, use the linked previous selector */
if (Type == FAST486_TASK_RETURN) if (Type == FAST486_TASK_RETURN)
{ {
if (State->TaskReg.Limit >= (sizeof(FAST486_TSS) - 1)) Selector = LOWORD(OldTss.Link); if (State->TaskReg.Modern) Selector = LOWORD(OldTss.Link);
else Selector = OldLegacyTss->Link; else Selector = OldLegacyTss->Link;
} }
@ -761,7 +761,7 @@ Fast486TaskSwitch(PFAST486_STATE State, FAST486_TASK_SWITCH_TYPE Type, USHORT Se
} }
/* Save the current task into the TSS */ /* Save the current task into the TSS */
if (State->TaskReg.Limit >= (sizeof(FAST486_TSS) - 1)) if (State->TaskReg.Modern)
{ {
OldTss.Cr3 = State->ControlRegisters[FAST486_REG_CR3]; OldTss.Cr3 = State->ControlRegisters[FAST486_REG_CR3];
OldTss.Eip = State->InstPtr.Long; OldTss.Eip = State->InstPtr.Long;
@ -805,7 +805,7 @@ Fast486TaskSwitch(PFAST486_STATE State, FAST486_TASK_SWITCH_TYPE Type, USHORT Se
if (!Fast486WriteLinearMemory(State, if (!Fast486WriteLinearMemory(State,
State->TaskReg.Base, State->TaskReg.Base,
&OldTss, &OldTss,
State->TaskReg.Limit >= (sizeof(FAST486_TSS) - 1) State->TaskReg.Modern
? sizeof(FAST486_TSS) : sizeof(FAST486_LEGACY_TSS), ? sizeof(FAST486_TSS) : sizeof(FAST486_LEGACY_TSS),
FALSE)) FALSE))
{ {
@ -1059,7 +1059,7 @@ Fast486CallGate(PFAST486_STATE State,
if (!Fast486ReadLinearMemory(State, if (!Fast486ReadLinearMemory(State,
State->TaskReg.Base, State->TaskReg.Base,
&Tss, &Tss,
State->TaskReg.Limit >= (sizeof(FAST486_TSS) - 1) State->TaskReg.Modern
? sizeof(FAST486_TSS) : sizeof(FAST486_LEGACY_TSS), ? sizeof(FAST486_TSS) : sizeof(FAST486_LEGACY_TSS),
FALSE)) FALSE))
{ {
@ -1075,7 +1075,7 @@ Fast486CallGate(PFAST486_STATE State,
{ {
case 0: case 0:
{ {
if (State->TaskReg.Limit >= (sizeof(FAST486_TSS) - 1)) if (State->TaskReg.Modern)
{ {
NewSs = Tss.Ss0; NewSs = Tss.Ss0;
NewEsp = Tss.Esp0; NewEsp = Tss.Esp0;
@ -1091,7 +1091,7 @@ Fast486CallGate(PFAST486_STATE State,
case 1: case 1:
{ {
if (State->TaskReg.Limit >= (sizeof(FAST486_TSS) - 1)) if (State->TaskReg.Modern)
{ {
NewSs = Tss.Ss1; NewSs = Tss.Ss1;
NewEsp = Tss.Esp1; NewEsp = Tss.Esp1;
@ -1107,7 +1107,7 @@ Fast486CallGate(PFAST486_STATE State,
case 2: case 2:
{ {
if (State->TaskReg.Limit >= (sizeof(FAST486_TSS) - 1)) if (State->TaskReg.Modern)
{ {
NewSs = Tss.Ss2; NewSs = Tss.Ss2;
NewEsp = Tss.Esp2; NewEsp = Tss.Esp2;

View file

@ -1960,6 +1960,8 @@ FAST486_OPCODE_HANDLER(Fast486ExtOpcodeGroup0F00)
State->TaskReg.Selector = Selector; State->TaskReg.Selector = Selector;
State->TaskReg.Base = GdtEntry.Base | (GdtEntry.BaseMid << 16) | (GdtEntry.BaseHigh << 24); State->TaskReg.Base = GdtEntry.Base | (GdtEntry.BaseMid << 16) | (GdtEntry.BaseHigh << 24);
State->TaskReg.Limit = GdtEntry.Limit | (GdtEntry.LimitHigh << 16); State->TaskReg.Limit = GdtEntry.Limit | (GdtEntry.LimitHigh << 16);
State->TaskReg.Modern = GdtEntry.Signature == FAST486_TSS_SIGNATURE
|| GdtEntry.Signature == FAST486_BUSY_TSS_SIGNATURE;
if (GdtEntry.Granularity) if (GdtEntry.Granularity)
{ {