regop.isa (5429:52dbcf7f7328) regop.isa (5433:1b0b8e9ba6a9)
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.
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;
1033 SegSelector selector = DestReg;
1034 SegDescriptor desc = SrcReg1;
1035 HandyM5Reg m5reg = M5Reg;
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:
1036
1037 switch (imm8)
1038 {
1039 case SegNoCheck:
1040 break;
1041 case SegCSCheck:
1042 panic("CS checks for far calls/jumps not implemented.\\n");
1043 break;
1044 case SegCallGateCheck:
1045 panic("CS checks for far calls/jumps through call gates"
1046 "not implemented.\\n");
1047 break;
1048 case SegSSCheck:
1047 panic("SS selector checks not implemented.\\n");
1049 if (selector.si || selector.ti) {
1050 if (!desc.p) {
1051 //FIXME This needs to also push the selector.
1052 return new StackFault;
1053 }
1054 } else {
1055 if ((m5reg.mode != SixtyFourBitMode || m5reg.cpl == 3) ||
1056 !(desc.s == 1 &&
1057 desc.type.codeOrData == 0 && desc.type.w) ||
1058 (desc.dpl != m5reg.cpl) ||
1059 (selector.rpl != m5reg.cpl)) {
1060 return new GeneralProtection(psrc1 & 0xFFFF);
1061 }
1062 }
1048 break;
1049 case SegIretCheck:
1050 {
1063 break;
1064 case SegIretCheck:
1065 {
1051 SegAttr csAttr = CSAttr;
1052 if (!selector.si && !selector.ti)
1066 if ((!selector.si && !selector.ti) ||
1067 (selector.rpl < m5reg.cpl) ||
1068 !(desc.s == 1 && desc.type.codeOrData == 1) ||
1069 (!desc.type.c && desc.dpl != selector.rpl) ||
1070 (desc.type.c && desc.dpl > selector.rpl))
1053 return new GeneralProtection(psrc1 & 0xFFFF);
1071 return new GeneralProtection(psrc1 & 0xFFFF);
1054 if (selector.rpl < csAttr.dpl)
1055 return new GeneralProtection(psrc1 & 0xFFFF);
1072 if (!desc.p)
1073 return new SegmentNotPresent;
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 }
1074 break;
1075 }
1076 case SegIntCSCheck:
1077 panic("CS selector checks for interrupts and exceptions"
1078 "not implemented.\\n");
1079 break;
1080 default:
1081 panic("Undefined segment check type.\\n");
1082 }
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;
1083 '''
1084 flag_code = '''
1085 // Check for a NULL selector and set ZF,EZF appropriately.
1086 ccFlagBits = ccFlagBits & ~(ext & (ZFBit | EZFBit));
1087 if (!selector.si && !selector.ti)
1088 ccFlagBits = ccFlagBits | (ext & (ZFBit | EZFBit));
1089 '''
1090

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

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