X86: Make the chks microop check for the right int descriptor type.
This commit is contained in:
parent
c0cd58812e
commit
6b53b8387e
2 changed files with 7 additions and 10 deletions
|
@ -43,18 +43,9 @@ def rom
|
|||
ld t2, idtr, [1, t0, t4], 8, dataSize=8, addressSize=8
|
||||
ld t4, idtr, [1, t0, t4], dataSize=8, addressSize=8
|
||||
|
||||
# Check permissions
|
||||
# Make sure the descriptor is a legal gate.
|
||||
chks t1, t4, IntGateCheck
|
||||
|
||||
mov t1, t1, t4, dataSize=8
|
||||
|
||||
# Check that it's the right type
|
||||
srli t4, t1, 40, dataSize=8
|
||||
andi t4, t4, 0xe, dataSize=8
|
||||
xori t4, t4, 0xe, flags=(EZF,), dataSize=8
|
||||
fault "new GeneralProtection(0)", flags=(nCEZF,)
|
||||
|
||||
|
||||
#
|
||||
# Get the target CS descriptor using the selector in the gate
|
||||
# descriptor.
|
||||
|
|
|
@ -1067,9 +1067,15 @@ let {{
|
|||
"not implemented.\\n");
|
||||
break;
|
||||
case SegIntGateCheck:
|
||||
// Check permissions.
|
||||
if (desc.dpl < m5reg.cpl) {
|
||||
fault = new GeneralProtection((uint16_t)selector);
|
||||
}
|
||||
// Make sure the gate's the right type.
|
||||
if (m5reg.mode == LongMode && ((desc.type & 0xe) != 0xe) ||
|
||||
((desc.type & 0x6) != 0x6)) {
|
||||
fault = new GeneralProtection(0);
|
||||
}
|
||||
break;
|
||||
case SegSSCheck:
|
||||
if (selector.si || selector.ti) {
|
||||
|
|
Loading…
Reference in a new issue