Revision f631ef9b op-i386.c
b/op-i386.c | ||
---|---|---|
611 | 611 |
} |
612 | 612 |
} |
613 | 613 |
|
614 |
/* XXX: add IOPL/CPL tests */ |
|
615 |
void OPPROTO op_cli(void) |
|
616 |
{ |
|
617 |
raise_exception(EXCP0D_GPF); |
|
618 |
} |
|
619 |
|
|
620 |
/* XXX: add IOPL/CPL tests */ |
|
621 |
void OPPROTO op_sti(void) |
|
622 |
{ |
|
623 |
raise_exception(EXCP0D_GPF); |
|
624 |
} |
|
625 |
|
|
626 |
/* vm86plus instructions */ |
|
627 |
|
|
628 |
void OPPROTO op_cli_vm(void) |
|
629 |
{ |
|
630 |
env->eflags &= ~VIF_MASK; |
|
631 |
} |
|
632 |
|
|
633 |
void OPPROTO op_sti_vm(void) |
|
634 |
{ |
|
635 |
env->eflags |= VIF_MASK; |
|
636 |
if (env->eflags & VIP_MASK) { |
|
637 |
EIP = PARAM1; |
|
638 |
raise_exception(EXCP0D_GPF); |
|
639 |
} |
|
640 |
FORCE_RET(); |
|
641 |
} |
|
642 |
|
|
614 | 643 |
void OPPROTO op_boundw(void) |
615 | 644 |
{ |
616 | 645 |
int low, high, v; |
... | ... | |
1234 | 1263 |
CC_OP = PARAM1; |
1235 | 1264 |
} |
1236 | 1265 |
|
1237 |
#define FL_UPDATE_MASK (TF_MASK | AC_MASK | ID_MASK) |
|
1266 |
#define FL_UPDATE_MASK32 (TF_MASK | AC_MASK | ID_MASK) |
|
1267 |
#define FL_UPDATE_MASK16 (TF_MASK) |
|
1238 | 1268 |
|
1239 | 1269 |
void OPPROTO op_movl_eflags_T0(void) |
1240 | 1270 |
{ |
... | ... | |
1243 | 1273 |
CC_SRC = eflags & (CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C); |
1244 | 1274 |
DF = 1 - (2 * ((eflags >> 10) & 1)); |
1245 | 1275 |
/* we also update some system flags as in user mode */ |
1246 |
env->eflags = (env->eflags & ~FL_UPDATE_MASK) | (eflags & FL_UPDATE_MASK); |
|
1276 |
env->eflags = (env->eflags & ~FL_UPDATE_MASK32) | (eflags & FL_UPDATE_MASK32); |
|
1277 |
} |
|
1278 |
|
|
1279 |
void OPPROTO op_movw_eflags_T0(void) |
|
1280 |
{ |
|
1281 |
int eflags; |
|
1282 |
eflags = T0; |
|
1283 |
CC_SRC = eflags & (CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C); |
|
1284 |
DF = 1 - (2 * ((eflags >> 10) & 1)); |
|
1285 |
/* we also update some system flags as in user mode */ |
|
1286 |
env->eflags = (env->eflags & ~FL_UPDATE_MASK16) | (eflags & FL_UPDATE_MASK16); |
|
1287 |
} |
|
1288 |
|
|
1289 |
/* vm86 version */ |
|
1290 |
void OPPROTO op_movw_eflags_T0_vm(void) |
|
1291 |
{ |
|
1292 |
int eflags; |
|
1293 |
eflags = T0; |
|
1294 |
CC_SRC = eflags & (CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C); |
|
1295 |
DF = 1 - (2 * ((eflags >> 10) & 1)); |
|
1296 |
/* we also update some system flags as in user mode */ |
|
1297 |
env->eflags = (env->eflags & ~(FL_UPDATE_MASK16 | VIF_MASK)) | |
|
1298 |
(eflags & FL_UPDATE_MASK16); |
|
1299 |
if (eflags & IF_MASK) { |
|
1300 |
env->eflags |= VIF_MASK; |
|
1301 |
if (env->eflags & VIP_MASK) { |
|
1302 |
EIP = PARAM1; |
|
1303 |
raise_exception(EXCP0D_GPF); |
|
1304 |
} |
|
1305 |
} |
|
1306 |
FORCE_RET(); |
|
1307 |
} |
|
1308 |
|
|
1309 |
void OPPROTO op_movl_eflags_T0_vm(void) |
|
1310 |
{ |
|
1311 |
int eflags; |
|
1312 |
eflags = T0; |
|
1313 |
CC_SRC = eflags & (CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C); |
|
1314 |
DF = 1 - (2 * ((eflags >> 10) & 1)); |
|
1315 |
/* we also update some system flags as in user mode */ |
|
1316 |
env->eflags = (env->eflags & ~(FL_UPDATE_MASK32 | VIF_MASK)) | |
|
1317 |
(eflags & FL_UPDATE_MASK32); |
|
1318 |
if (eflags & IF_MASK) { |
|
1319 |
env->eflags |= VIF_MASK; |
|
1320 |
if (env->eflags & VIP_MASK) { |
|
1321 |
EIP = PARAM1; |
|
1322 |
raise_exception(EXCP0D_GPF); |
|
1323 |
} |
|
1324 |
} |
|
1325 |
FORCE_RET(); |
|
1247 | 1326 |
} |
1248 | 1327 |
|
1249 | 1328 |
/* XXX: compute only O flag */ |
... | ... | |
1263 | 1342 |
T0 = eflags; |
1264 | 1343 |
} |
1265 | 1344 |
|
1345 |
/* vm86 version */ |
|
1346 |
void OPPROTO op_movl_T0_eflags_vm(void) |
|
1347 |
{ |
|
1348 |
int eflags; |
|
1349 |
eflags = cc_table[CC_OP].compute_all(); |
|
1350 |
eflags |= (DF & DF_MASK); |
|
1351 |
eflags |= env->eflags & ~(VM_MASK | RF_MASK | IF_MASK); |
|
1352 |
if (env->eflags & VIF_MASK) |
|
1353 |
eflags |= IF_MASK; |
|
1354 |
T0 = eflags; |
|
1355 |
} |
|
1356 |
|
|
1266 | 1357 |
void OPPROTO op_cld(void) |
1267 | 1358 |
{ |
1268 | 1359 |
DF = 1; |
... | ... | |
1377 | 1468 |
[CC_OP_SARL] = { compute_all_sarl, compute_c_shll }, |
1378 | 1469 |
}; |
1379 | 1470 |
|
1380 |
/* floating point support */ |
|
1471 |
/* floating point support. Some of the code for complicated x87 |
|
1472 |
functions comes from the LGPL'ed x86 emulator found in the Willows |
|
1473 |
TWIN windows emulator. */ |
|
1381 | 1474 |
|
1382 | 1475 |
#ifdef USE_X86LDOUBLE |
1383 | 1476 |
/* use long double functions */ |
Also available in: Unified diff