X86: Make sure register microops set fault rather than returning one.
authorGabe Black <gblack@eecs.umich.edu>
Mon, 13 Oct 2008 05:24:06 +0000 (22:24 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Mon, 13 Oct 2008 05:24:06 +0000 (22:24 -0700)
src/arch/x86/isa/microops/regop.isa

index d7d1e3063ab1a4aba5eae2872d3eefeaafa6f0d0..439116145ee5b3f8e06459389b60143e935c20dc 100644 (file)
@@ -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 "