Revision f3f2d9be target-i386/helper.c
b/target-i386/helper.c | ||
---|---|---|
19 | 19 |
*/ |
20 | 20 |
#include "exec.h" |
21 | 21 |
|
22 |
//#define DEBUG_PCALL |
|
23 |
|
|
22 | 24 |
const uint8_t parity_table[256] = { |
23 | 25 |
CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, |
24 | 26 |
0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, |
... | ... | |
540 | 542 |
uint32_t e1, e2, offset, ss, esp, ss_e1, ss_e2, push_size; |
541 | 543 |
uint32_t old_cs, old_ss, old_esp, old_eip; |
542 | 544 |
|
545 |
#ifdef DEBUG_PCALL |
|
546 |
if (loglevel) { |
|
547 |
static int count; |
|
548 |
fprintf(logfile, "%d: interrupt: vector=%02x error_code=%04x int=%d CS:IP=%04x:%08x CPL=%d\n", |
|
549 |
count, intno, error_code, is_int, env->segs[R_CS].selector, env->eip, env->hflags & 3); |
|
550 |
#if 0 |
|
551 |
{ |
|
552 |
int i; |
|
553 |
uint8_t *ptr; |
|
554 |
printf(" code="); |
|
555 |
ptr = env->segs[R_CS].base + env->eip; |
|
556 |
for(i = 0; i < 16; i++) { |
|
557 |
printf(" %02x", ldub(ptr + i)); |
|
558 |
} |
|
559 |
printf("\n"); |
|
560 |
} |
|
561 |
#endif |
|
562 |
count++; |
|
563 |
} |
|
564 |
#endif |
|
565 |
|
|
543 | 566 |
has_error_code = 0; |
544 | 567 |
if (!is_int && !is_hw) { |
545 | 568 |
switch(intno) { |
... | ... | |
1260 | 1283 |
|
1261 | 1284 |
new_cs = T0; |
1262 | 1285 |
new_eip = T1; |
1286 |
#ifdef DEBUG_PCALL |
|
1287 |
if (loglevel) { |
|
1288 |
fprintf(logfile, "lcall %04x:%08x\n", |
|
1289 |
new_cs, new_eip); |
|
1290 |
} |
|
1291 |
#endif |
|
1263 | 1292 |
if ((new_cs & 0xfffc) == 0) |
1264 | 1293 |
raise_exception_err(EXCP0D_GPF, 0); |
1265 | 1294 |
if (load_segment(&e1, &e2, new_cs) != 0) |
1266 | 1295 |
raise_exception_err(EXCP0D_GPF, new_cs & 0xfffc); |
1267 | 1296 |
cpl = env->hflags & HF_CPL_MASK; |
1297 |
#ifdef DEBUG_PCALL |
|
1298 |
if (loglevel) { |
|
1299 |
fprintf(logfile, "desc=%08x:%08x\n", e1, e2); |
|
1300 |
} |
|
1301 |
#endif |
|
1268 | 1302 |
if (e2 & DESC_S_MASK) { |
1269 | 1303 |
if (!(e2 & DESC_CS_MASK)) |
1270 | 1304 |
raise_exception_err(EXCP0D_GPF, new_cs & 0xfffc); |
... | ... | |
1341 | 1375 |
raise_exception_err(EXCP0B_NOSEG, new_cs & 0xfffc); |
1342 | 1376 |
selector = e1 >> 16; |
1343 | 1377 |
offset = (e2 & 0xffff0000) | (e1 & 0x0000ffff); |
1378 |
param_count = e2 & 0x1f; |
|
1344 | 1379 |
if ((selector & 0xfffc) == 0) |
1345 | 1380 |
raise_exception_err(EXCP0D_GPF, 0); |
1346 | 1381 |
|
... | ... | |
1357 | 1392 |
if (!(e2 & DESC_C_MASK) && dpl < cpl) { |
1358 | 1393 |
/* to inner priviledge */ |
1359 | 1394 |
get_ss_esp_from_tss(&ss, &sp, dpl); |
1395 |
#ifdef DEBUG_PCALL |
|
1396 |
if (loglevel) |
|
1397 |
fprintf(logfile, "ss=%04x sp=%04x param_count=%d ESP=%x\n", |
|
1398 |
ss, sp, param_count, ESP); |
|
1399 |
#endif |
|
1360 | 1400 |
if ((ss & 0xfffc) == 0) |
1361 | 1401 |
raise_exception_err(EXCP0A_TSS, ss & 0xfffc); |
1362 | 1402 |
if ((ss & 3) != dpl) |
... | ... | |
1373 | 1413 |
if (!(ss_e2 & DESC_P_MASK)) |
1374 | 1414 |
raise_exception_err(EXCP0A_TSS, ss & 0xfffc); |
1375 | 1415 |
|
1376 |
param_count = e2 & 0x1f; |
|
1377 | 1416 |
push_size = ((param_count * 2) + 8) << shift; |
1378 | 1417 |
|
1379 | 1418 |
old_esp = ESP; |
... | ... | |
1389 | 1428 |
get_seg_limit(ss_e1, ss_e2), |
1390 | 1429 |
ss_e2); |
1391 | 1430 |
|
1392 |
if (!(env->segs[R_SS].flags & DESC_B_MASK))
|
|
1431 |
if (!(ss_e2 & DESC_B_MASK))
|
|
1393 | 1432 |
sp &= 0xffff; |
1394 | 1433 |
ssp = env->segs[R_SS].base + sp; |
1395 | 1434 |
if (shift) { |
... | ... | |
1441 | 1480 |
e2); |
1442 | 1481 |
cpu_x86_set_cpl(env, dpl); |
1443 | 1482 |
|
1444 |
/* from this point, not restartable if same priviledge */ |
|
1445 | 1483 |
if (!(env->segs[R_SS].flags & DESC_B_MASK)) |
1446 | 1484 |
ESP = (ESP & 0xffff0000) | (sp & 0xffff); |
1447 | 1485 |
else |
... | ... | |
1838 | 1876 |
if (dpl < cpl || dpl < rpl) |
1839 | 1877 |
return; |
1840 | 1878 |
} |
1841 |
/* ok */
|
|
1879 |
CC_SRC |= CC_Z;
|
|
1842 | 1880 |
} |
1843 | 1881 |
|
1844 | 1882 |
void helper_verw(void) |
... | ... | |
1866 | 1904 |
if (!(e2 & DESC_W_MASK)) |
1867 | 1905 |
return; |
1868 | 1906 |
} |
1869 |
/* ok */
|
|
1907 |
CC_SRC |= CC_Z;
|
|
1870 | 1908 |
} |
1871 | 1909 |
|
1872 | 1910 |
/* FPU helpers */ |
Also available in: Unified diff