Revision 80a9d035
b/linux-user/main.c | ||
---|---|---|
181 | 181 |
void cpu_loop(CPUX86State *env) |
182 | 182 |
{ |
183 | 183 |
int trapnr; |
184 |
uint8_t *pc;
|
|
184 |
target_ulong pc;
|
|
185 | 185 |
target_siginfo_t info; |
186 | 186 |
|
187 | 187 |
for(;;) { |
... | ... | |
440 | 440 |
env->wim = new_wim; |
441 | 441 |
} |
442 | 442 |
|
443 |
#if 0 |
|
443 | 444 |
static void flush_windows(CPUSPARCState *env) |
444 | 445 |
{ |
445 | 446 |
int offset, cwp1; |
... | ... | |
459 | 460 |
offset++; |
460 | 461 |
} |
461 | 462 |
} |
463 |
#endif |
|
462 | 464 |
|
463 | 465 |
void cpu_loop (CPUSPARCState *env) |
464 | 466 |
{ |
... | ... | |
1067 | 1069 |
env->eip = regs->eip; |
1068 | 1070 |
|
1069 | 1071 |
/* linux interrupt setup */ |
1070 |
env->idt.base = (void *)idt_table;
|
|
1072 |
env->idt.base = (long)idt_table;
|
|
1071 | 1073 |
env->idt.limit = sizeof(idt_table) - 1; |
1072 | 1074 |
set_idt(0, 0); |
1073 | 1075 |
set_idt(1, 0); |
... | ... | |
1092 | 1094 |
set_idt(0x80, 3); |
1093 | 1095 |
|
1094 | 1096 |
/* linux segment setup */ |
1095 |
env->gdt.base = (void *)gdt_table;
|
|
1097 |
env->gdt.base = (long)gdt_table;
|
|
1096 | 1098 |
env->gdt.limit = sizeof(gdt_table) - 1; |
1097 | 1099 |
write_dt(&gdt_table[__USER_CS >> 3], 0, 0xfffff, |
1098 | 1100 |
DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK | |
b/linux-user/signal.c | ||
---|---|---|
1272 | 1272 |
} |
1273 | 1273 |
|
1274 | 1274 |
#elif defined(TARGET_SPARC) |
1275 |
|
|
1275 | 1276 |
#define __SUNOS_MAXWIN 31 |
1276 | 1277 |
|
1277 | 1278 |
/* This is what SunOS does, so shall I. */ |
... | ... | |
1400 | 1401 |
return err; |
1401 | 1402 |
} |
1402 | 1403 |
|
1404 |
#if 0 |
|
1403 | 1405 |
static int |
1404 | 1406 |
setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/ |
1405 | 1407 |
CPUState *env, unsigned long mask) |
... | ... | |
1416 | 1418 |
|
1417 | 1419 |
return err; |
1418 | 1420 |
} |
1421 |
#endif |
|
1419 | 1422 |
#define NF_ALIGNEDSZ (((sizeof(struct target_signal_frame) + 7) & (~7))) |
1420 | 1423 |
|
1421 | 1424 |
static void setup_frame(int sig, struct emulated_sigaction *ka, |
... | ... | |
1483 | 1486 |
|
1484 | 1487 |
/* Flush instruction space. */ |
1485 | 1488 |
//flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0])); |
1486 |
tb_flush(env); |
|
1489 |
// tb_flush(env);
|
|
1487 | 1490 |
} |
1488 | 1491 |
//cpu_dump_state(env, stderr, fprintf, 0); |
1489 | 1492 |
return; |
1490 | 1493 |
|
1491 |
sigill_and_return: |
|
1494 |
//sigill_and_return:
|
|
1492 | 1495 |
force_sig(TARGET_SIGILL); |
1493 | 1496 |
sigsegv: |
1494 | 1497 |
//fprintf(stderr, "force_sig\n"); |
... | ... | |
1544 | 1547 |
uint32_t up_psr, pc, npc; |
1545 | 1548 |
target_sigset_t set; |
1546 | 1549 |
sigset_t host_set; |
1547 |
__siginfo_fpu_t *fpu_save;
|
|
1550 |
target_ulong fpu_save;
|
|
1548 | 1551 |
int err, i; |
1549 | 1552 |
|
1550 | 1553 |
sf = (struct target_signal_frame *) env->regwptr[UREG_FP]; |
1554 |
#if 0 |
|
1551 | 1555 |
fprintf(stderr, "sigreturn\n"); |
1552 | 1556 |
fprintf(stderr, "sf: %x pc %x fp %x sp %x\n", sf, env->pc, env->regwptr[UREG_FP], env->regwptr[UREG_SP]); |
1557 |
#endif |
|
1553 | 1558 |
//cpu_dump_state(env, stderr, fprintf, 0); |
1554 | 1559 |
|
1555 | 1560 |
/* 1. Make sure we are not getting garbage from the user */ |
... | ... | |
1564 | 1569 |
err = __get_user(pc, &sf->info.si_regs.pc); |
1565 | 1570 |
err |= __get_user(npc, &sf->info.si_regs.npc); |
1566 | 1571 |
|
1567 |
fprintf(stderr, "pc: %lx npc %lx\n", pc, npc); |
|
1572 |
// fprintf(stderr, "pc: %lx npc %lx\n", pc, npc);
|
|
1568 | 1573 |
if ((pc | npc) & 3) |
1569 | 1574 |
goto segv_and_exit; |
1570 | 1575 |
|
... | ... | |
1585 | 1590 |
err |= __get_user(env->regwptr[i + UREG_I0], &sf->info.si_regs.u_regs[i+8]); |
1586 | 1591 |
} |
1587 | 1592 |
|
1588 |
err |= __get_user(fpu_save, &sf->fpu_save); |
|
1593 |
err |= __get_user(fpu_save, (target_ulong *)&sf->fpu_save);
|
|
1589 | 1594 |
|
1590 | 1595 |
//if (fpu_save) |
1591 | 1596 |
// err |= restore_fpu_state(env, fpu_save); |
... | ... | |
1604 | 1609 |
if (err) |
1605 | 1610 |
goto segv_and_exit; |
1606 | 1611 |
|
1607 |
fprintf(stderr, "returning %lx\n", env->regwptr[0]); |
|
1612 |
// fprintf(stderr, "returning %lx\n", env->regwptr[0]);
|
|
1608 | 1613 |
return env->regwptr[0]; |
1609 | 1614 |
|
1610 | 1615 |
segv_and_exit: |
b/linux-user/syscall.c | ||
---|---|---|
1326 | 1326 |
if (!ldt_table) |
1327 | 1327 |
return -ENOMEM; |
1328 | 1328 |
memset(ldt_table, 0, TARGET_LDT_ENTRIES * TARGET_LDT_ENTRY_SIZE); |
1329 |
env->ldt.base = ldt_table; |
|
1329 |
env->ldt.base = (long)ldt_table;
|
|
1330 | 1330 |
env->ldt.limit = 0xffff; |
1331 | 1331 |
} |
1332 | 1332 |
|
... | ... | |
2502 | 2502 |
tnamelen = treclen - (2 * sizeof(target_long) + 2); |
2503 | 2503 |
if (tnamelen > 256) |
2504 | 2504 |
tnamelen = 256; |
2505 |
/* XXX: may not be correct */ |
|
2505 | 2506 |
strncpy(tde->d_name, de->d_name, tnamelen); |
2506 | 2507 |
de = (struct dirent *)((char *)de + reclen); |
2507 | 2508 |
len -= reclen; |
... | ... | |
3046 | 3047 |
default: |
3047 | 3048 |
unimplemented: |
3048 | 3049 |
gemu_log("qemu: Unsupported syscall: %d\n", num); |
3050 |
#if defined(TARGET_NR_setxattr) || defined(TARGET_NR_set_thread_area) |
|
3049 | 3051 |
unimplemented_nowarn: |
3052 |
#endif |
|
3050 | 3053 |
ret = -ENOSYS; |
3051 | 3054 |
break; |
3052 | 3055 |
} |
Also available in: Unified diff