linux-user: Pass si_type information to queue_signal() explicitly

Instead of assuming in queue_signal() that all callers are passing
a siginfo structure which uses the _sifields._sigfault part of the
union (and thus a si_type of QEMU_SI_FAULT), make callers pass
the si_type they require in as an argument.

[RV adjusted to apply]
Reviewed-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
This commit is contained in:
Peter Maydell 2016-07-28 16:44:46 +01:00 committed by Riku Voipio
parent 8bd3773cce
commit 9d2803f720
4 changed files with 71 additions and 72 deletions

View File

@ -339,7 +339,7 @@ void cpu_loop(CPUX86State *env)
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_SI_KERNEL; info.si_code = TARGET_SI_KERNEL;
info._sifields._sigfault._addr = 0; info._sifields._sigfault._addr = 0;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break; break;
case EXCP0D_GPF: case EXCP0D_GPF:
/* XXX: potential problem if ABI32 */ /* XXX: potential problem if ABI32 */
@ -353,7 +353,7 @@ void cpu_loop(CPUX86State *env)
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_SI_KERNEL; info.si_code = TARGET_SI_KERNEL;
info._sifields._sigfault._addr = 0; info._sifields._sigfault._addr = 0;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
} }
break; break;
case EXCP0E_PAGE: case EXCP0E_PAGE:
@ -364,7 +364,7 @@ void cpu_loop(CPUX86State *env)
else else
info.si_code = TARGET_SEGV_ACCERR; info.si_code = TARGET_SEGV_ACCERR;
info._sifields._sigfault._addr = env->cr[2]; info._sifields._sigfault._addr = env->cr[2];
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break; break;
case EXCP00_DIVZ: case EXCP00_DIVZ:
#ifndef TARGET_X86_64 #ifndef TARGET_X86_64
@ -378,7 +378,7 @@ void cpu_loop(CPUX86State *env)
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_FPE_INTDIV; info.si_code = TARGET_FPE_INTDIV;
info._sifields._sigfault._addr = env->eip; info._sifields._sigfault._addr = env->eip;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
} }
break; break;
case EXCP01_DB: case EXCP01_DB:
@ -398,7 +398,7 @@ void cpu_loop(CPUX86State *env)
info.si_code = TARGET_SI_KERNEL; info.si_code = TARGET_SI_KERNEL;
info._sifields._sigfault._addr = 0; info._sifields._sigfault._addr = 0;
} }
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
} }
break; break;
case EXCP04_INTO: case EXCP04_INTO:
@ -413,7 +413,7 @@ void cpu_loop(CPUX86State *env)
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_SI_KERNEL; info.si_code = TARGET_SI_KERNEL;
info._sifields._sigfault._addr = 0; info._sifields._sigfault._addr = 0;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
} }
break; break;
case EXCP06_ILLOP: case EXCP06_ILLOP:
@ -421,7 +421,7 @@ void cpu_loop(CPUX86State *env)
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_ILL_ILLOPN; info.si_code = TARGET_ILL_ILLOPN;
info._sifields._sigfault._addr = env->eip; info._sifields._sigfault._addr = env->eip;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break; break;
case EXCP_INTERRUPT: case EXCP_INTERRUPT:
/* just indicate that signals should be handled asap */ /* just indicate that signals should be handled asap */
@ -436,7 +436,7 @@ void cpu_loop(CPUX86State *env)
info.si_signo = sig; info.si_signo = sig;
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_TRAP_BRKPT; info.si_code = TARGET_TRAP_BRKPT;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
} }
} }
break; break;
@ -576,7 +576,7 @@ segv:
/* XXX: check env->error_code */ /* XXX: check env->error_code */
info.si_code = TARGET_SEGV_MAPERR; info.si_code = TARGET_SEGV_MAPERR;
info._sifields._sigfault._addr = env->exception.vaddress; info._sifields._sigfault._addr = env->exception.vaddress;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
} }
/* Handle a jump to the kernel code page. */ /* Handle a jump to the kernel code page. */
@ -755,7 +755,7 @@ void cpu_loop(CPUARMState *env)
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_ILL_ILLOPN; info.si_code = TARGET_ILL_ILLOPN;
info._sifields._sigfault._addr = env->regs[15]; info._sifields._sigfault._addr = env->regs[15];
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
} else if (rc < 0) { /* FP exception */ } else if (rc < 0) { /* FP exception */
int arm_fpe=0; int arm_fpe=0;
@ -786,7 +786,7 @@ void cpu_loop(CPUARMState *env)
if (arm_fpe & BIT_IOC) info.si_code = TARGET_FPE_FLTINV; if (arm_fpe & BIT_IOC) info.si_code = TARGET_FPE_FLTINV;
info._sifields._sigfault._addr = env->regs[15]; info._sifields._sigfault._addr = env->regs[15];
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
} else { } else {
env->regs[15] += 4; env->regs[15] += 4;
} }
@ -907,7 +907,7 @@ void cpu_loop(CPUARMState *env)
/* XXX: check env->error_code */ /* XXX: check env->error_code */
info.si_code = TARGET_SEGV_MAPERR; info.si_code = TARGET_SEGV_MAPERR;
info._sifields._sigfault._addr = addr; info._sifields._sigfault._addr = addr;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
} }
break; break;
case EXCP_DEBUG: case EXCP_DEBUG:
@ -921,7 +921,7 @@ void cpu_loop(CPUARMState *env)
info.si_signo = sig; info.si_signo = sig;
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_TRAP_BRKPT; info.si_code = TARGET_TRAP_BRKPT;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
} }
} }
break; break;
@ -1099,7 +1099,7 @@ void cpu_loop(CPUARMState *env)
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_ILL_ILLOPN; info.si_code = TARGET_ILL_ILLOPN;
info._sifields._sigfault._addr = env->pc; info._sifields._sigfault._addr = env->pc;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break; break;
case EXCP_STREX: case EXCP_STREX:
if (!do_strex_a64(env)) { if (!do_strex_a64(env)) {
@ -1113,7 +1113,7 @@ void cpu_loop(CPUARMState *env)
/* XXX: check env->error_code */ /* XXX: check env->error_code */
info.si_code = TARGET_SEGV_MAPERR; info.si_code = TARGET_SEGV_MAPERR;
info._sifields._sigfault._addr = env->exception.vaddress; info._sifields._sigfault._addr = env->exception.vaddress;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break; break;
case EXCP_DEBUG: case EXCP_DEBUG:
case EXCP_BKPT: case EXCP_BKPT:
@ -1122,7 +1122,7 @@ void cpu_loop(CPUARMState *env)
info.si_signo = sig; info.si_signo = sig;
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_TRAP_BRKPT; info.si_code = TARGET_TRAP_BRKPT;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
} }
break; break;
case EXCP_SEMIHOST: case EXCP_SEMIHOST:
@ -1202,7 +1202,7 @@ void cpu_loop(CPUUniCore32State *env)
/* XXX: check env->error_code */ /* XXX: check env->error_code */
info.si_code = TARGET_SEGV_MAPERR; info.si_code = TARGET_SEGV_MAPERR;
info._sifields._sigfault._addr = env->cp0.c4_faultaddr; info._sifields._sigfault._addr = env->cp0.c4_faultaddr;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break; break;
case EXCP_INTERRUPT: case EXCP_INTERRUPT:
/* just indicate that signals should be handled asap */ /* just indicate that signals should be handled asap */
@ -1216,7 +1216,7 @@ void cpu_loop(CPUUniCore32State *env)
info.si_signo = sig; info.si_signo = sig;
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_TRAP_BRKPT; info.si_code = TARGET_TRAP_BRKPT;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
} }
} }
break; break;
@ -1431,7 +1431,7 @@ void cpu_loop (CPUSPARCState *env)
/* XXX: check env->error_code */ /* XXX: check env->error_code */
info.si_code = TARGET_SEGV_MAPERR; info.si_code = TARGET_SEGV_MAPERR;
info._sifields._sigfault._addr = env->mmuregs[4]; info._sifields._sigfault._addr = env->mmuregs[4];
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
} }
break; break;
#else #else
@ -1452,7 +1452,7 @@ void cpu_loop (CPUSPARCState *env)
info._sifields._sigfault._addr = env->dmmuregs[4]; info._sifields._sigfault._addr = env->dmmuregs[4];
else else
info._sifields._sigfault._addr = cpu_tsptr(env)->tpc; info._sifields._sigfault._addr = cpu_tsptr(env)->tpc;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
} }
break; break;
#ifndef TARGET_ABI32 #ifndef TARGET_ABI32
@ -1475,7 +1475,7 @@ void cpu_loop (CPUSPARCState *env)
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_ILL_ILLOPC; info.si_code = TARGET_ILL_ILLOPC;
info._sifields._sigfault._addr = env->pc; info._sifields._sigfault._addr = env->pc;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
} }
break; break;
case EXCP_DEBUG: case EXCP_DEBUG:
@ -1488,7 +1488,7 @@ void cpu_loop (CPUSPARCState *env)
info.si_signo = sig; info.si_signo = sig;
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_TRAP_BRKPT; info.si_code = TARGET_TRAP_BRKPT;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
} }
} }
break; break;
@ -1679,7 +1679,7 @@ void cpu_loop(CPUPPCState *env)
break; break;
} }
info._sifields._sigfault._addr = env->nip; info._sifields._sigfault._addr = env->nip;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break; break;
case POWERPC_EXCP_ISI: /* Instruction storage exception */ case POWERPC_EXCP_ISI: /* Instruction storage exception */
/* XXX: check this */ /* XXX: check this */
@ -1705,7 +1705,7 @@ void cpu_loop(CPUPPCState *env)
break; break;
} }
info._sifields._sigfault._addr = env->nip - 4; info._sifields._sigfault._addr = env->nip - 4;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break; break;
case POWERPC_EXCP_EXTERNAL: /* External input */ case POWERPC_EXCP_EXTERNAL: /* External input */
cpu_abort(cs, "External interrupt while in user mode. " cpu_abort(cs, "External interrupt while in user mode. "
@ -1717,7 +1717,7 @@ void cpu_loop(CPUPPCState *env)
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_BUS_ADRALN; info.si_code = TARGET_BUS_ADRALN;
info._sifields._sigfault._addr = env->nip; info._sifields._sigfault._addr = env->nip;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break; break;
case POWERPC_EXCP_PROGRAM: /* Program exception */ case POWERPC_EXCP_PROGRAM: /* Program exception */
case POWERPC_EXCP_HV_EMU: /* HV emulation */ case POWERPC_EXCP_HV_EMU: /* HV emulation */
@ -1808,14 +1808,14 @@ void cpu_loop(CPUPPCState *env)
break; break;
} }
info._sifields._sigfault._addr = env->nip; info._sifields._sigfault._addr = env->nip;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break; break;
case POWERPC_EXCP_FPU: /* Floating-point unavailable exception */ case POWERPC_EXCP_FPU: /* Floating-point unavailable exception */
info.si_signo = TARGET_SIGILL; info.si_signo = TARGET_SIGILL;
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_ILL_COPROC; info.si_code = TARGET_ILL_COPROC;
info._sifields._sigfault._addr = env->nip; info._sifields._sigfault._addr = env->nip;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break; break;
case POWERPC_EXCP_SYSCALL: /* System call exception */ case POWERPC_EXCP_SYSCALL: /* System call exception */
cpu_abort(cs, "Syscall exception while in user mode. " cpu_abort(cs, "Syscall exception while in user mode. "
@ -1826,7 +1826,7 @@ void cpu_loop(CPUPPCState *env)
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_ILL_COPROC; info.si_code = TARGET_ILL_COPROC;
info._sifields._sigfault._addr = env->nip; info._sifields._sigfault._addr = env->nip;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break; break;
case POWERPC_EXCP_DECR: /* Decrementer exception */ case POWERPC_EXCP_DECR: /* Decrementer exception */
cpu_abort(cs, "Decrementer interrupt while in user mode. " cpu_abort(cs, "Decrementer interrupt while in user mode. "
@ -1853,7 +1853,7 @@ void cpu_loop(CPUPPCState *env)
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_ILL_COPROC; info.si_code = TARGET_ILL_COPROC;
info._sifields._sigfault._addr = env->nip; info._sifields._sigfault._addr = env->nip;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break; break;
case POWERPC_EXCP_EFPDI: /* Embedded floating-point data IRQ */ case POWERPC_EXCP_EFPDI: /* Embedded floating-point data IRQ */
cpu_abort(cs, "Embedded floating-point data IRQ not handled\n"); cpu_abort(cs, "Embedded floating-point data IRQ not handled\n");
@ -1916,7 +1916,7 @@ void cpu_loop(CPUPPCState *env)
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_ILL_COPROC; info.si_code = TARGET_ILL_COPROC;
info._sifields._sigfault._addr = env->nip; info._sifields._sigfault._addr = env->nip;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break; break;
case POWERPC_EXCP_PIT: /* Programmable interval timer IRQ */ case POWERPC_EXCP_PIT: /* Programmable interval timer IRQ */
cpu_abort(cs, "Programmable interval timer interrupt " cpu_abort(cs, "Programmable interval timer interrupt "
@ -2010,7 +2010,7 @@ void cpu_loop(CPUPPCState *env)
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_SEGV_MAPERR; info.si_code = TARGET_SEGV_MAPERR;
info._sifields._sigfault._addr = env->nip; info._sifields._sigfault._addr = env->nip;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
} }
break; break;
case EXCP_DEBUG: case EXCP_DEBUG:
@ -2022,7 +2022,7 @@ void cpu_loop(CPUPPCState *env)
info.si_signo = sig; info.si_signo = sig;
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_TRAP_BRKPT; info.si_code = TARGET_TRAP_BRKPT;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
} }
} }
break; break;
@ -2456,13 +2456,13 @@ static int do_break(CPUMIPSState *env, target_siginfo_t *info,
info->si_signo = TARGET_SIGFPE; info->si_signo = TARGET_SIGFPE;
info->si_errno = 0; info->si_errno = 0;
info->si_code = (code == BRK_OVERFLOW) ? FPE_INTOVF : FPE_INTDIV; info->si_code = (code == BRK_OVERFLOW) ? FPE_INTOVF : FPE_INTDIV;
queue_signal(env, info->si_signo, &*info); queue_signal(env, info->si_signo, QEMU_SI_FAULT, &*info);
ret = 0; ret = 0;
break; break;
default: default:
info->si_signo = TARGET_SIGTRAP; info->si_signo = TARGET_SIGTRAP;
info->si_errno = 0; info->si_errno = 0;
queue_signal(env, info->si_signo, &*info); queue_signal(env, info->si_signo, QEMU_SI_FAULT, &*info);
ret = 0; ret = 0;
break; break;
} }
@ -2560,14 +2560,14 @@ done_syscall:
/* XXX: check env->error_code */ /* XXX: check env->error_code */
info.si_code = TARGET_SEGV_MAPERR; info.si_code = TARGET_SEGV_MAPERR;
info._sifields._sigfault._addr = env->CP0_BadVAddr; info._sifields._sigfault._addr = env->CP0_BadVAddr;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break; break;
case EXCP_CpU: case EXCP_CpU:
case EXCP_RI: case EXCP_RI:
info.si_signo = TARGET_SIGILL; info.si_signo = TARGET_SIGILL;
info.si_errno = 0; info.si_errno = 0;
info.si_code = 0; info.si_code = 0;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break; break;
case EXCP_INTERRUPT: case EXCP_INTERRUPT:
/* just indicate that signals should be handled asap */ /* just indicate that signals should be handled asap */
@ -2582,7 +2582,7 @@ done_syscall:
info.si_signo = sig; info.si_signo = sig;
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_TRAP_BRKPT; info.si_code = TARGET_TRAP_BRKPT;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
} }
} }
break; break;
@ -2592,14 +2592,14 @@ done_syscall:
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_SEGV_MAPERR; info.si_code = TARGET_SEGV_MAPERR;
info._sifields._sigfault._addr = env->active_tc.PC; info._sifields._sigfault._addr = env->active_tc.PC;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
} }
break; break;
case EXCP_DSPDIS: case EXCP_DSPDIS:
info.si_signo = TARGET_SIGILL; info.si_signo = TARGET_SIGILL;
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_ILL_ILLOPC; info.si_code = TARGET_ILL_ILLOPC;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break; break;
/* The code below was inspired by the MIPS Linux kernel trap /* The code below was inspired by the MIPS Linux kernel trap
* handling code in arch/mips/kernel/traps.c. * handling code in arch/mips/kernel/traps.c.
@ -2850,7 +2850,7 @@ void cpu_loop(CPUSH4State *env)
info.si_signo = sig; info.si_signo = sig;
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_TRAP_BRKPT; info.si_code = TARGET_TRAP_BRKPT;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
} }
} }
break; break;
@ -2860,7 +2860,7 @@ void cpu_loop(CPUSH4State *env)
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_SEGV_MAPERR; info.si_code = TARGET_SEGV_MAPERR;
info._sifields._sigfault._addr = env->tea; info._sifields._sigfault._addr = env->tea;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break; break;
default: default:
@ -2892,7 +2892,7 @@ void cpu_loop(CPUCRISState *env)
/* XXX: check env->error_code */ /* XXX: check env->error_code */
info.si_code = TARGET_SEGV_MAPERR; info.si_code = TARGET_SEGV_MAPERR;
info._sifields._sigfault._addr = env->pregs[PR_EDA]; info._sifields._sigfault._addr = env->pregs[PR_EDA];
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
} }
break; break;
case EXCP_INTERRUPT: case EXCP_INTERRUPT:
@ -2924,7 +2924,7 @@ void cpu_loop(CPUCRISState *env)
info.si_signo = sig; info.si_signo = sig;
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_TRAP_BRKPT; info.si_code = TARGET_TRAP_BRKPT;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
} }
} }
break; break;
@ -2957,7 +2957,7 @@ void cpu_loop(CPUMBState *env)
/* XXX: check env->error_code */ /* XXX: check env->error_code */
info.si_code = TARGET_SEGV_MAPERR; info.si_code = TARGET_SEGV_MAPERR;
info._sifields._sigfault._addr = 0; info._sifields._sigfault._addr = 0;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
} }
break; break;
case EXCP_INTERRUPT: case EXCP_INTERRUPT:
@ -3006,7 +3006,7 @@ void cpu_loop(CPUMBState *env)
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_FPE_FLTDIV; info.si_code = TARGET_FPE_FLTDIV;
info._sifields._sigfault._addr = 0; info._sifields._sigfault._addr = 0;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break; break;
case ESR_EC_FPU: case ESR_EC_FPU:
info.si_signo = TARGET_SIGFPE; info.si_signo = TARGET_SIGFPE;
@ -3018,7 +3018,7 @@ void cpu_loop(CPUMBState *env)
info.si_code = TARGET_FPE_FLTDIV; info.si_code = TARGET_FPE_FLTDIV;
} }
info._sifields._sigfault._addr = 0; info._sifields._sigfault._addr = 0;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break; break;
default: default:
printf ("Unhandled hw-exception: 0x%x\n", printf ("Unhandled hw-exception: 0x%x\n",
@ -3038,7 +3038,7 @@ void cpu_loop(CPUMBState *env)
info.si_signo = sig; info.si_signo = sig;
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_TRAP_BRKPT; info.si_code = TARGET_TRAP_BRKPT;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
} }
} }
break; break;
@ -3092,7 +3092,7 @@ void cpu_loop(CPUM68KState *env)
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_ILL_ILLOPN; info.si_code = TARGET_ILL_ILLOPN;
info._sifields._sigfault._addr = env->pc; info._sifields._sigfault._addr = env->pc;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break; break;
case EXCP_TRAP0: case EXCP_TRAP0:
{ {
@ -3126,7 +3126,7 @@ void cpu_loop(CPUM68KState *env)
/* XXX: check env->error_code */ /* XXX: check env->error_code */
info.si_code = TARGET_SEGV_MAPERR; info.si_code = TARGET_SEGV_MAPERR;
info._sifields._sigfault._addr = env->mmu.ar; info._sifields._sigfault._addr = env->mmu.ar;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
} }
break; break;
case EXCP_DEBUG: case EXCP_DEBUG:
@ -3139,7 +3139,7 @@ void cpu_loop(CPUM68KState *env)
info.si_signo = sig; info.si_signo = sig;
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_TRAP_BRKPT; info.si_code = TARGET_TRAP_BRKPT;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
} }
} }
break; break;
@ -3195,7 +3195,7 @@ static void do_store_exclusive(CPUAlphaState *env, int reg, int quad)
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_SEGV_MAPERR; info.si_code = TARGET_SEGV_MAPERR;
info._sifields._sigfault._addr = addr; info._sifields._sigfault._addr = addr;
queue_signal(env, TARGET_SIGSEGV, &info); queue_signal(env, TARGET_SIGSEGV, QEMU_SI_FAULT, &info);
} }
void cpu_loop(CPUAlphaState *env) void cpu_loop(CPUAlphaState *env)
@ -3237,7 +3237,7 @@ void cpu_loop(CPUAlphaState *env)
info.si_code = (page_get_flags(env->trap_arg0) & PAGE_VALID info.si_code = (page_get_flags(env->trap_arg0) & PAGE_VALID
? TARGET_SEGV_ACCERR : TARGET_SEGV_MAPERR); ? TARGET_SEGV_ACCERR : TARGET_SEGV_MAPERR);
info._sifields._sigfault._addr = env->trap_arg0; info._sifields._sigfault._addr = env->trap_arg0;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break; break;
case EXCP_UNALIGN: case EXCP_UNALIGN:
env->lock_addr = -1; env->lock_addr = -1;
@ -3245,7 +3245,7 @@ void cpu_loop(CPUAlphaState *env)
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_BUS_ADRALN; info.si_code = TARGET_BUS_ADRALN;
info._sifields._sigfault._addr = env->trap_arg0; info._sifields._sigfault._addr = env->trap_arg0;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break; break;
case EXCP_OPCDEC: case EXCP_OPCDEC:
do_sigill: do_sigill:
@ -3254,7 +3254,7 @@ void cpu_loop(CPUAlphaState *env)
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_ILL_ILLOPC; info.si_code = TARGET_ILL_ILLOPC;
info._sifields._sigfault._addr = env->pc; info._sifields._sigfault._addr = env->pc;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break; break;
case EXCP_ARITH: case EXCP_ARITH:
env->lock_addr = -1; env->lock_addr = -1;
@ -3262,7 +3262,7 @@ void cpu_loop(CPUAlphaState *env)
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_FPE_FLTINV; info.si_code = TARGET_FPE_FLTINV;
info._sifields._sigfault._addr = env->pc; info._sifields._sigfault._addr = env->pc;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break; break;
case EXCP_FEN: case EXCP_FEN:
/* No-op. Linux simply re-enables the FPU. */ /* No-op. Linux simply re-enables the FPU. */
@ -3276,7 +3276,7 @@ void cpu_loop(CPUAlphaState *env)
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_TRAP_BRKPT; info.si_code = TARGET_TRAP_BRKPT;
info._sifields._sigfault._addr = env->pc; info._sifields._sigfault._addr = env->pc;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break; break;
case 0x81: case 0x81:
/* BUGCHK */ /* BUGCHK */
@ -3284,7 +3284,7 @@ void cpu_loop(CPUAlphaState *env)
info.si_errno = 0; info.si_errno = 0;
info.si_code = 0; info.si_code = 0;
info._sifields._sigfault._addr = env->pc; info._sifields._sigfault._addr = env->pc;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break; break;
case 0x83: case 0x83:
/* CALLSYS */ /* CALLSYS */
@ -3356,7 +3356,7 @@ void cpu_loop(CPUAlphaState *env)
} }
info.si_errno = 0; info.si_errno = 0;
info._sifields._sigfault._addr = env->pc; info._sifields._sigfault._addr = env->pc;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break; break;
default: default:
goto do_sigill; goto do_sigill;
@ -3368,7 +3368,7 @@ void cpu_loop(CPUAlphaState *env)
env->lock_addr = -1; env->lock_addr = -1;
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_TRAP_BRKPT; info.si_code = TARGET_TRAP_BRKPT;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
} }
break; break;
case EXCP_STL_C: case EXCP_STL_C:
@ -3502,7 +3502,7 @@ void cpu_loop(CPUS390XState *env)
info.si_errno = 0; info.si_errno = 0;
info.si_code = n; info.si_code = n;
info._sifields._sigfault._addr = addr; info._sifields._sigfault._addr = addr;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break; break;
default: default:
@ -3526,7 +3526,7 @@ static void gen_sigill_reg(CPUTLGState *env)
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_ILL_PRVREG; info.si_code = TARGET_ILL_PRVREG;
info._sifields._sigfault._addr = env->pc; info._sifields._sigfault._addr = env->pc;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
} }
static void do_signal(CPUTLGState *env, int signo, int sigcode) static void do_signal(CPUTLGState *env, int signo, int sigcode)
@ -3550,7 +3550,7 @@ static void do_signal(CPUTLGState *env, int signo, int sigcode)
} }
info.si_code = sigcode; info.si_code = sigcode;
queue_signal(env, info.si_signo, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
} }
static void gen_sigsegv_maperr(CPUTLGState *env, target_ulong addr) static void gen_sigsegv_maperr(CPUTLGState *env, target_ulong addr)

View File

@ -377,7 +377,8 @@ extern int do_strace;
/* signal.c */ /* signal.c */
void process_pending_signals(CPUArchState *cpu_env); void process_pending_signals(CPUArchState *cpu_env);
void signal_init(void); void signal_init(void);
int queue_signal(CPUArchState *env, int sig, target_siginfo_t *info); int queue_signal(CPUArchState *env, int sig, int si_type,
target_siginfo_t *info);
void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info); void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info);
void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo); void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo);
int target_to_host_signal(int sig); int target_to_host_signal(int sig);

View File

@ -569,19 +569,15 @@ static void QEMU_NORETURN force_sig(int target_sig)
/* queue a signal so that it will be send to the virtual CPU as soon /* queue a signal so that it will be send to the virtual CPU as soon
as possible */ as possible */
int queue_signal(CPUArchState *env, int sig, target_siginfo_t *info) int queue_signal(CPUArchState *env, int sig, int si_type,
target_siginfo_t *info)
{ {
CPUState *cpu = ENV_GET_CPU(env); CPUState *cpu = ENV_GET_CPU(env);
TaskState *ts = cpu->opaque; TaskState *ts = cpu->opaque;
trace_user_queue_signal(env, sig); trace_user_queue_signal(env, sig);
/* Currently all callers define siginfo structures which info->si_code = deposit32(info->si_code, 16, 16, si_type);
* use the _sifields._sigfault union member, so we can
* set the type here. If that changes we should push this
* out so the si_type is passed in by callers.
*/
info->si_code = deposit32(info->si_code, 16, 16, QEMU_SI_FAULT);
ts->sync_signal.info = *info; ts->sync_signal.info = *info;
ts->sync_signal.pending = sig; ts->sync_signal.pending = sig;

View File

@ -10577,7 +10577,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
info.si_code = si_code; info.si_code = si_code;
info._sifields._sigfault._addr info._sifields._sigfault._addr
= ((CPUArchState *)cpu_env)->pc; = ((CPUArchState *)cpu_env)->pc;
queue_signal((CPUArchState *)cpu_env, info.si_signo, &info); queue_signal((CPUArchState *)cpu_env, info.si_signo,
QEMU_SI_FAULT, &info);
} }
} }
break; break;
@ -11665,7 +11666,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
info.si_errno = 0; info.si_errno = 0;
info.si_code = TARGET_SEGV_MAPERR; info.si_code = TARGET_SEGV_MAPERR;
info._sifields._sigfault._addr = arg6; info._sifields._sigfault._addr = arg6;
queue_signal((CPUArchState *)cpu_env, info.si_signo, &info); queue_signal((CPUArchState *)cpu_env, info.si_signo,
QEMU_SI_FAULT, &info);
ret = 0xdeadbeef; ret = 0xdeadbeef;
} }