Deleted Added
sdiff udiff text old ( 5429:52dbcf7f7328 ) new ( 5433:1b0b8e9ba6a9 )
full compact
1// Copyright (c) 2007-2008 The Hewlett-Packard Development Company
2// All rights reserved.
3//
4// Redistribution and use of this software in source and binary forms,
5// with or without modification, are permitted provided that the
6// following conditions are met:
7//
8// The software must be used only for Non-Commercial Use which means any

--- 1016 unchanged lines hidden (view full) ---

1025
1026 class Chks(RegOp):
1027 def __init__(self, dest, src1, src2=0,
1028 flags=None, dataSize="env.dataSize"):
1029 super(Chks, self).__init__(dest,
1030 src1, src2, flags, dataSize)
1031 code = '''
1032 // The selector is in source 1 and can be at most 16 bits.
1033 SegSelector selector = psrc1;
1034
1035 switch (imm8)
1036 {
1037 case SegNoCheck:
1038 break;
1039 case SegCSCheck:
1040 panic("CS checks for far calls/jumps not implemented.\\n");
1041 break;
1042 case SegCallGateCheck:
1043 panic("CS checks for far calls/jumps through call gates"
1044 "not implemented.\\n");
1045 break;
1046 case SegSSCheck:
1047 panic("SS selector checks not implemented.\\n");
1048 break;
1049 case SegIretCheck:
1050 {
1051 SegAttr csAttr = CSAttr;
1052 if (!selector.si && !selector.ti)
1053 return new GeneralProtection(psrc1 & 0xFFFF);
1054 if (selector.rpl < csAttr.dpl)
1055 return new GeneralProtection(psrc1 & 0xFFFF);
1056 break;
1057 }
1058 case SegIntCSCheck:
1059 panic("CS selector checks for interrupts and exceptions"
1060 "not implemented.\\n");
1061 break;
1062 default:
1063 panic("Undefined segment check type.\\n");
1064 }
1065
1066 // Compute the address of the descriptor and set DestReg to it.
1067 if (selector.ti) {
1068 // A descriptor in the LDT
1069 Addr target = (selector.si << 3) + LDTRBase;
1070 if (!LDTRSel || (selector.si << 3) + dataSize > LDTRLimit)
1071 fault = new GeneralProtection(selector & mask(16));
1072 DestReg = target;
1073 } else {
1074 // A descriptor in the GDT
1075 Addr target = (selector.si << 3) + GDTRBase;
1076 if ((selector.si << 3) + dataSize > GDTRLimit)
1077 fault = new GeneralProtection(selector & mask(16));
1078 DestReg = target;
1079 }
1080 '''
1081 flag_code = '''
1082 // Check for a NULL selector and set ZF,EZF appropriately.
1083 ccFlagBits = ccFlagBits & ~(ext & (ZFBit | EZFBit));
1084 if (!selector.si && !selector.ti)
1085 ccFlagBits = ccFlagBits | (ext & (ZFBit | EZFBit));
1086 '''
1087

--- 15 unchanged lines hidden (view full) ---

1103 class Rdm5reg(RdRegOp):
1104 code = '''
1105 DestReg = M5Reg;
1106 '''
1107
1108 class Wrdl(RegOp):
1109 code = '''
1110 SegDescriptor desc = SrcReg1;
1111 SegAttr attr = 0;
1112 attr.dpl = desc.dpl;
1113 attr.defaultSize = desc.d;
1114 if (!desc.s) {
1115 SegBaseDest = SegBaseDest;
1116 SegLimitDest = SegLimitDest;
1117 SegAttrDest = SegAttrDest;
1118 panic("System segment encountered.\\n");
1119 } else {
1120 if (!desc.p)
1121 panic("Segment not present.\\n");
1122 if (desc.type.codeOrData) {
1123 attr.readable = desc.type.r;
1124 attr.longMode = desc.l;
1125 } else {
1126 attr.expandDown = desc.type.e;
1127 attr.readable = 1;
1128 attr.writable = desc.type.w;
1129 }
1130 Addr base = desc.baseLow | (desc.baseHigh << 24);
1131 Addr limit = desc.limitLow | (desc.limitHigh << 16);
1132 if (desc.g)
1133 limit = (limit << 12) | mask(12);
1134 SegBaseDest = base;
1135 SegLimitDest = limit;
1136 SegAttrDest = attr;
1137 }
1138 '''
1139}};