From: Gabe Black Date: Mon, 13 Oct 2008 05:24:06 +0000 (-0700) Subject: X86: Make sure register microops set fault rather than returning one. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f813a4be4954bfedb95747b4635b38b1a13ee8a6;p=gem5.git X86: Make sure register microops set fault rather than returning one. --- 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 "