X86: Add segmentation checks for ldt related descriptors and selectors.

This commit is contained in:
Gabe Black 2009-02-25 10:21:21 -08:00
parent e08d60389d
commit bda7077c64
2 changed files with 14 additions and 2 deletions

View file

@ -87,7 +87,7 @@ let {{
# Add in symbols for the various checks of segment selectors. # Add in symbols for the various checks of segment selectors.
for check in ("NoCheck", "CSCheck", "CallGateCheck", "IntGateCheck", for check in ("NoCheck", "CSCheck", "CallGateCheck", "IntGateCheck",
"SoftIntGateCheck", "SSCheck", "IretCheck", "IntCSCheck", "SoftIntGateCheck", "SSCheck", "IretCheck", "IntCSCheck",
"TRCheck", "TSSCheck"): "TRCheck", "TSSCheck", "InGDTCheck", "LDTCheck"):
assembler.symbols[check] = "Seg%s" % check assembler.symbols[check] = "Seg%s" % check
for reg in ("TR", "IDTR"): for reg in ("TR", "IDTR"):

View file

@ -235,7 +235,7 @@ output header {{
enum SegmentSelectorCheck { enum SegmentSelectorCheck {
SegNoCheck, SegCSCheck, SegCallGateCheck, SegIntGateCheck, SegNoCheck, SegCSCheck, SegCallGateCheck, SegIntGateCheck,
SegSoftIntGateCheck, SegSSCheck, SegIretCheck, SegIntCSCheck, SegSoftIntGateCheck, SegSSCheck, SegIretCheck, SegIntCSCheck,
SegTRCheck, SegTSSCheck SegTRCheck, SegTSSCheck, SegInGDTCheck, SegLDTCheck
}; };
enum LongModeDescriptorType { enum LongModeDescriptorType {
@ -1174,6 +1174,18 @@ let {{
fault = new GeneralProtection(selector); fault = new GeneralProtection(selector);
} }
break; break;
case SegInGDTCheck:
if (selector.ti) {
fault = new GeneralProtection(selector);
}
break;
case SegLDTCheck:
if (!desc.p) {
fault = new SegmentNotPresent(selector);
} else if (desc.type != 0x2) {
fault = new GeneralProtection(selector);
}
break;
default: default:
panic("Undefined segment check type.\\n"); panic("Undefined segment check type.\\n");
} }