X86: Make sure register microops set fault rather than returning one.
This commit is contained in:
parent
961b40cdb5
commit
f813a4be49
1 changed files with 9 additions and 8 deletions
|
@ -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 "
|
||||
|
|
Loading…
Reference in a new issue