diff options
-rw-r--r-- | src/arch/x86/isa/microops/regop.isa | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/src/arch/x86/isa/microops/regop.isa b/src/arch/x86/isa/microops/regop.isa index d7d1e3063..439116145 100644 --- a/src/arch/x86/isa/microops/regop.isa +++ b/src/arch/x86/isa/microops/regop.isa @@ -1052,14 +1052,14 @@ let {{ break; case SegIntGateCheck: if (desc.dpl < m5reg.cpl) { - return new GeneralProtection((uint16_t)selector); + fault = new GeneralProtection((uint16_t)selector); } break; case SegSSCheck: if (selector.si || selector.ti) { if (!desc.p) { //FIXME This needs to also push the selector. - return new StackFault; + fault = new StackFault; } } else { if ((m5reg.submode != SixtyFourBitMode || @@ -1068,7 +1068,7 @@ let {{ desc.type.codeOrData == 0 && desc.type.w) || (desc.dpl != m5reg.cpl) || (selector.rpl != m5reg.cpl)) { - return new GeneralProtection(psrc1 & 0xFFFF); + fault = new GeneralProtection(psrc1 & 0xFFFF); } } break; @@ -1078,16 +1078,17 @@ let {{ (selector.rpl < m5reg.cpl) || !(desc.s == 1 && desc.type.codeOrData == 1) || (!desc.type.c && desc.dpl != selector.rpl) || - (desc.type.c && desc.dpl > selector.rpl)) - return new GeneralProtection(psrc1 & 0xFFFF); - if (!desc.p) - return new SegmentNotPresent; + (desc.type.c && desc.dpl > selector.rpl)) { + fault = new GeneralProtection(psrc1 & 0xFFFF); + } else if (!desc.p) { + fault = new SegmentNotPresent; + } break; } case SegIntCSCheck: if (m5reg.mode == LongMode) { if (desc.l != 1 || desc.d != 0) { - return new GeneralProtection(selector); + fault = new GeneralProtection(selector); } } else { panic("Interrupt CS checks not implemented " |