1272 |
} |
} |
1273 |
|
|
1274 |
#elif defined(TARGET_SPARC) |
#elif defined(TARGET_SPARC) |
1275 |
|
|
1276 |
#define __SUNOS_MAXWIN 31 |
#define __SUNOS_MAXWIN 31 |
1277 |
|
|
1278 |
/* This is what SunOS does, so shall I. */ |
/* This is what SunOS does, so shall I. */ |
1401 |
return err; |
return err; |
1402 |
} |
} |
1403 |
|
|
1404 |
|
#if 0 |
1405 |
static int |
static int |
1406 |
setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/ |
setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/ |
1407 |
CPUState *env, unsigned long mask) |
CPUState *env, unsigned long mask) |
1418 |
|
|
1419 |
return err; |
return err; |
1420 |
} |
} |
1421 |
|
#endif |
1422 |
#define NF_ALIGNEDSZ (((sizeof(struct target_signal_frame) + 7) & (~7))) |
#define NF_ALIGNEDSZ (((sizeof(struct target_signal_frame) + 7) & (~7))) |
1423 |
|
|
1424 |
static void setup_frame(int sig, struct emulated_sigaction *ka, |
static void setup_frame(int sig, struct emulated_sigaction *ka, |
1486 |
|
|
1487 |
/* Flush instruction space. */ |
/* Flush instruction space. */ |
1488 |
//flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0])); |
//flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0])); |
1489 |
tb_flush(env); |
// tb_flush(env); |
1490 |
} |
} |
1491 |
//cpu_dump_state(env, stderr, fprintf, 0); |
//cpu_dump_state(env, stderr, fprintf, 0); |
1492 |
return; |
return; |
1493 |
|
|
1494 |
sigill_and_return: |
//sigill_and_return: |
1495 |
force_sig(TARGET_SIGILL); |
force_sig(TARGET_SIGILL); |
1496 |
sigsegv: |
sigsegv: |
1497 |
//fprintf(stderr, "force_sig\n"); |
//fprintf(stderr, "force_sig\n"); |
1547 |
uint32_t up_psr, pc, npc; |
uint32_t up_psr, pc, npc; |
1548 |
target_sigset_t set; |
target_sigset_t set; |
1549 |
sigset_t host_set; |
sigset_t host_set; |
1550 |
__siginfo_fpu_t *fpu_save; |
target_ulong fpu_save; |
1551 |
int err, i; |
int err, i; |
1552 |
|
|
1553 |
sf = (struct target_signal_frame *) env->regwptr[UREG_FP]; |
sf = (struct target_signal_frame *) env->regwptr[UREG_FP]; |
1554 |
|
#if 0 |
1555 |
fprintf(stderr, "sigreturn\n"); |
fprintf(stderr, "sigreturn\n"); |
1556 |
fprintf(stderr, "sf: %x pc %x fp %x sp %x\n", sf, env->pc, env->regwptr[UREG_FP], env->regwptr[UREG_SP]); |
fprintf(stderr, "sf: %x pc %x fp %x sp %x\n", sf, env->pc, env->regwptr[UREG_FP], env->regwptr[UREG_SP]); |
1557 |
|
#endif |
1558 |
//cpu_dump_state(env, stderr, fprintf, 0); |
//cpu_dump_state(env, stderr, fprintf, 0); |
1559 |
|
|
1560 |
/* 1. Make sure we are not getting garbage from the user */ |
/* 1. Make sure we are not getting garbage from the user */ |
1569 |
err = __get_user(pc, &sf->info.si_regs.pc); |
err = __get_user(pc, &sf->info.si_regs.pc); |
1570 |
err |= __get_user(npc, &sf->info.si_regs.npc); |
err |= __get_user(npc, &sf->info.si_regs.npc); |
1571 |
|
|
1572 |
fprintf(stderr, "pc: %lx npc %lx\n", pc, npc); |
// fprintf(stderr, "pc: %lx npc %lx\n", pc, npc); |
1573 |
if ((pc | npc) & 3) |
if ((pc | npc) & 3) |
1574 |
goto segv_and_exit; |
goto segv_and_exit; |
1575 |
|
|
1590 |
err |= __get_user(env->regwptr[i + UREG_I0], &sf->info.si_regs.u_regs[i+8]); |
err |= __get_user(env->regwptr[i + UREG_I0], &sf->info.si_regs.u_regs[i+8]); |
1591 |
} |
} |
1592 |
|
|
1593 |
err |= __get_user(fpu_save, &sf->fpu_save); |
err |= __get_user(fpu_save, (target_ulong *)&sf->fpu_save); |
1594 |
|
|
1595 |
//if (fpu_save) |
//if (fpu_save) |
1596 |
// err |= restore_fpu_state(env, fpu_save); |
// err |= restore_fpu_state(env, fpu_save); |
1609 |
if (err) |
if (err) |
1610 |
goto segv_and_exit; |
goto segv_and_exit; |
1611 |
|
|
1612 |
fprintf(stderr, "returning %lx\n", env->regwptr[0]); |
// fprintf(stderr, "returning %lx\n", env->regwptr[0]); |
1613 |
return env->regwptr[0]; |
return env->regwptr[0]; |
1614 |
|
|
1615 |
segv_and_exit: |
segv_and_exit: |