提交 624f7979 编写于 作者: P pbrook

Make signal queues per thread.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4635 c046a42c-6fe2-441c-8c8c-71466251a162
上级 afd7cd92
...@@ -230,7 +230,7 @@ void cpu_loop(CPUX86State *env) ...@@ -230,7 +230,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(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
break; break;
case EXCP0D_GPF: case EXCP0D_GPF:
/* XXX: potential problem if ABI32 */ /* XXX: potential problem if ABI32 */
...@@ -244,7 +244,7 @@ void cpu_loop(CPUX86State *env) ...@@ -244,7 +244,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(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
} }
break; break;
case EXCP0E_PAGE: case EXCP0E_PAGE:
...@@ -255,7 +255,7 @@ void cpu_loop(CPUX86State *env) ...@@ -255,7 +255,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(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
break; break;
case EXCP00_DIVZ: case EXCP00_DIVZ:
#ifndef TARGET_X86_64 #ifndef TARGET_X86_64
...@@ -269,7 +269,7 @@ void cpu_loop(CPUX86State *env) ...@@ -269,7 +269,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(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
} }
break; break;
case EXCP01_SSTP: case EXCP01_SSTP:
...@@ -289,7 +289,7 @@ void cpu_loop(CPUX86State *env) ...@@ -289,7 +289,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(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
} }
break; break;
case EXCP04_INTO: case EXCP04_INTO:
...@@ -304,7 +304,7 @@ void cpu_loop(CPUX86State *env) ...@@ -304,7 +304,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(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
} }
break; break;
case EXCP06_ILLOP: case EXCP06_ILLOP:
...@@ -312,7 +312,7 @@ void cpu_loop(CPUX86State *env) ...@@ -312,7 +312,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(info.si_signo, &info); queue_signal(env, info.si_signo, &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 */
...@@ -327,7 +327,7 @@ void cpu_loop(CPUX86State *env) ...@@ -327,7 +327,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(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
} }
} }
break; break;
...@@ -441,7 +441,7 @@ void cpu_loop(CPUARMState *env) ...@@ -441,7 +441,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(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
} else if (rc < 0) { /* FP exception */ } else if (rc < 0) { /* FP exception */
int arm_fpe=0; int arm_fpe=0;
...@@ -472,7 +472,7 @@ void cpu_loop(CPUARMState *env) ...@@ -472,7 +472,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(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
} else { } else {
env->regs[15] += 4; env->regs[15] += 4;
} }
...@@ -584,7 +584,7 @@ void cpu_loop(CPUARMState *env) ...@@ -584,7 +584,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(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
} }
break; break;
case EXCP_DEBUG: case EXCP_DEBUG:
...@@ -597,7 +597,7 @@ void cpu_loop(CPUARMState *env) ...@@ -597,7 +597,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(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
} }
} }
break; break;
...@@ -780,7 +780,7 @@ void cpu_loop (CPUSPARCState *env) ...@@ -780,7 +780,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(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
} }
break; break;
#else #else
...@@ -801,7 +801,7 @@ void cpu_loop (CPUSPARCState *env) ...@@ -801,7 +801,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 = env->tsptr->tpc; info._sifields._sigfault._addr = env->tsptr->tpc;
queue_signal(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
} }
break; break;
#ifndef TARGET_ABI32 #ifndef TARGET_ABI32
...@@ -828,7 +828,7 @@ void cpu_loop (CPUSPARCState *env) ...@@ -828,7 +828,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(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
} }
} }
break; break;
...@@ -949,7 +949,7 @@ void cpu_loop(CPUPPCState *env) ...@@ -949,7 +949,7 @@ void cpu_loop(CPUPPCState *env)
break; break;
} }
info._sifields._sigfault._addr = env->nip; info._sifields._sigfault._addr = env->nip;
queue_signal(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
break; break;
case POWERPC_EXCP_ISI: /* Instruction storage exception */ case POWERPC_EXCP_ISI: /* Instruction storage exception */
EXCP_DUMP(env, "Invalid instruction fetch: 0x\n" ADDRX "\n", EXCP_DUMP(env, "Invalid instruction fetch: 0x\n" ADDRX "\n",
...@@ -977,7 +977,7 @@ void cpu_loop(CPUPPCState *env) ...@@ -977,7 +977,7 @@ void cpu_loop(CPUPPCState *env)
break; break;
} }
info._sifields._sigfault._addr = env->nip - 4; info._sifields._sigfault._addr = env->nip - 4;
queue_signal(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
break; break;
case POWERPC_EXCP_EXTERNAL: /* External input */ case POWERPC_EXCP_EXTERNAL: /* External input */
cpu_abort(env, "External interrupt while in user mode. " cpu_abort(env, "External interrupt while in user mode. "
...@@ -990,7 +990,7 @@ void cpu_loop(CPUPPCState *env) ...@@ -990,7 +990,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 - 4; info._sifields._sigfault._addr = env->nip - 4;
queue_signal(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
break; break;
case POWERPC_EXCP_PROGRAM: /* Program exception */ case POWERPC_EXCP_PROGRAM: /* Program exception */
/* XXX: check this */ /* XXX: check this */
...@@ -1083,7 +1083,7 @@ void cpu_loop(CPUPPCState *env) ...@@ -1083,7 +1083,7 @@ void cpu_loop(CPUPPCState *env)
break; break;
} }
info._sifields._sigfault._addr = env->nip - 4; info._sifields._sigfault._addr = env->nip - 4;
queue_signal(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
break; break;
case POWERPC_EXCP_FPU: /* Floating-point unavailable exception */ case POWERPC_EXCP_FPU: /* Floating-point unavailable exception */
EXCP_DUMP(env, "No floating point allowed\n"); EXCP_DUMP(env, "No floating point allowed\n");
...@@ -1091,7 +1091,7 @@ void cpu_loop(CPUPPCState *env) ...@@ -1091,7 +1091,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 - 4; info._sifields._sigfault._addr = env->nip - 4;
queue_signal(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
break; break;
case POWERPC_EXCP_SYSCALL: /* System call exception */ case POWERPC_EXCP_SYSCALL: /* System call exception */
cpu_abort(env, "Syscall exception while in user mode. " cpu_abort(env, "Syscall exception while in user mode. "
...@@ -1103,7 +1103,7 @@ void cpu_loop(CPUPPCState *env) ...@@ -1103,7 +1103,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 - 4; info._sifields._sigfault._addr = env->nip - 4;
queue_signal(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
break; break;
case POWERPC_EXCP_DECR: /* Decrementer exception */ case POWERPC_EXCP_DECR: /* Decrementer exception */
cpu_abort(env, "Decrementer interrupt while in user mode. " cpu_abort(env, "Decrementer interrupt while in user mode. "
...@@ -1135,7 +1135,7 @@ void cpu_loop(CPUPPCState *env) ...@@ -1135,7 +1135,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(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
} }
} }
break; break;
...@@ -1145,7 +1145,7 @@ void cpu_loop(CPUPPCState *env) ...@@ -1145,7 +1145,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 - 4; info._sifields._sigfault._addr = env->nip - 4;
queue_signal(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
break; break;
case POWERPC_EXCP_EFPDI: /* Embedded floating-point data IRQ */ case POWERPC_EXCP_EFPDI: /* Embedded floating-point data IRQ */
cpu_abort(env, "Embedded floating-point data IRQ not handled\n"); cpu_abort(env, "Embedded floating-point data IRQ not handled\n");
...@@ -1209,7 +1209,7 @@ void cpu_loop(CPUPPCState *env) ...@@ -1209,7 +1209,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 - 4; info._sifields._sigfault._addr = env->nip - 4;
queue_signal(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
break; break;
case POWERPC_EXCP_PIT: /* Programmable interval timer IRQ */ case POWERPC_EXCP_PIT: /* Programmable interval timer IRQ */
cpu_abort(env, "Programable interval timer interrupt " cpu_abort(env, "Programable interval timer interrupt "
...@@ -1685,7 +1685,7 @@ void cpu_loop(CPUMIPSState *env) ...@@ -1685,7 +1685,7 @@ void cpu_loop(CPUMIPSState *env)
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(info.si_signo, &info); queue_signal(env, info.si_signo, &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 */
...@@ -1700,7 +1700,7 @@ void cpu_loop(CPUMIPSState *env) ...@@ -1700,7 +1700,7 @@ void cpu_loop(CPUMIPSState *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(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
} }
} }
break; break;
...@@ -1751,7 +1751,7 @@ void cpu_loop (CPUState *env) ...@@ -1751,7 +1751,7 @@ void cpu_loop (CPUState *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(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
} }
} }
break; break;
...@@ -1761,7 +1761,7 @@ void cpu_loop (CPUState *env) ...@@ -1761,7 +1761,7 @@ void cpu_loop (CPUState *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(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
break; break;
default: default:
...@@ -1790,7 +1790,7 @@ void cpu_loop (CPUState *env) ...@@ -1790,7 +1790,7 @@ void cpu_loop (CPUState *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(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
} }
break; break;
case EXCP_INTERRUPT: case EXCP_INTERRUPT:
...@@ -1818,7 +1818,7 @@ void cpu_loop (CPUState *env) ...@@ -1818,7 +1818,7 @@ void cpu_loop (CPUState *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(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
} }
} }
break; break;
...@@ -1869,7 +1869,7 @@ void cpu_loop(CPUM68KState *env) ...@@ -1869,7 +1869,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(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
break; break;
case EXCP_TRAP0: case EXCP_TRAP0:
{ {
...@@ -1896,7 +1896,7 @@ void cpu_loop(CPUM68KState *env) ...@@ -1896,7 +1896,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(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
} }
break; break;
case EXCP_DEBUG: case EXCP_DEBUG:
...@@ -1909,7 +1909,7 @@ void cpu_loop(CPUM68KState *env) ...@@ -1909,7 +1909,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(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
} }
} }
break; break;
...@@ -2000,7 +2000,7 @@ void cpu_loop (CPUState *env) ...@@ -2000,7 +2000,7 @@ void cpu_loop (CPUState *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(info.si_signo, &info); queue_signal(env, info.si_signo, &info);
} }
} }
break; break;
...@@ -2047,9 +2047,19 @@ void usage(void) ...@@ -2047,9 +2047,19 @@ void usage(void)
/* XXX: currently only used for async signals (see signal.c) */ /* XXX: currently only used for async signals (see signal.c) */
CPUState *global_env; CPUState *global_env;
/* used to free thread contexts */ void init_task_state(TaskState *ts)
TaskState *first_task_state; {
int i;
memset(ts, 0, sizeof(TaskState));
ts->used = 1;
ts->first_free = ts->sigqueue_table;
for (i = 0; i < MAX_SIGQUEUE_SIZE - 1; i++) {
ts->sigqueue_table[i].next = &ts->sigqueue_table[i + 1];
}
ts->sigqueue_table[i].next = NULL;
}
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
const char *filename; const char *filename;
...@@ -2246,9 +2256,9 @@ int main(int argc, char **argv) ...@@ -2246,9 +2256,9 @@ int main(int argc, char **argv)
/* build Task State */ /* build Task State */
memset(ts, 0, sizeof(TaskState)); memset(ts, 0, sizeof(TaskState));
env->opaque = ts; init_task_state(ts);
ts->used = 1;
ts->info = info; ts->info = info;
env->opaque = ts;
env->user_mode_only = 1; env->user_mode_only = 1;
#if defined(TARGET_I386) #if defined(TARGET_I386)
......
...@@ -82,6 +82,20 @@ struct vm86_saved_state { ...@@ -82,6 +82,20 @@ struct vm86_saved_state {
#include "nwfpe/fpa11.h" #include "nwfpe/fpa11.h"
#endif #endif
#define MAX_SIGQUEUE_SIZE 1024
struct sigqueue {
struct sigqueue *next;
target_siginfo_t info;
};
struct emulated_sigtable {
int pending; /* true if signal is pending */
struct sigqueue *first;
struct sigqueue info; /* in order to always have memory for the
first signal, we put it here */
};
/* NOTE: we force a big alignment so that the stack stored after is /* NOTE: we force a big alignment so that the stack stored after is
aligned too */ aligned too */
typedef struct TaskState { typedef struct TaskState {
...@@ -109,10 +123,16 @@ typedef struct TaskState { ...@@ -109,10 +123,16 @@ typedef struct TaskState {
#endif #endif
int used; /* non zero if used */ int used; /* non zero if used */
struct image_info *info; struct image_info *info;
struct emulated_sigtable sigtab[TARGET_NSIG];
struct sigqueue sigqueue_table[MAX_SIGQUEUE_SIZE]; /* siginfo queue */
struct sigqueue *first_free; /* first free siginfo queue entry */
int signal_pending; /* non zero if a signal may be pending */
uint8_t stack[0]; uint8_t stack[0];
} __attribute__((aligned(16))) TaskState; } __attribute__((aligned(16))) TaskState;
extern TaskState *first_task_state; void init_task_state(TaskState *ts);
extern const char *qemu_uname_release; extern const char *qemu_uname_release;
/* ??? See if we can avoid exposing so much of the loader internals. */ /* ??? See if we can avoid exposing so much of the loader internals. */
...@@ -182,9 +202,9 @@ void print_syscall_ret(int num, abi_long arg1); ...@@ -182,9 +202,9 @@ void print_syscall_ret(int num, abi_long arg1);
extern int do_strace; extern int do_strace;
/* signal.c */ /* signal.c */
void process_pending_signals(void *cpu_env); void process_pending_signals(CPUState *cpu_env);
void signal_init(void); void signal_init(void);
int queue_signal(int sig, target_siginfo_t *info); int queue_signal(CPUState *env, int sig, 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);
......
此差异已折叠。
...@@ -2736,12 +2736,8 @@ int do_fork(CPUState *env, unsigned int flags, abi_ulong newsp) ...@@ -2736,12 +2736,8 @@ int do_fork(CPUState *env, unsigned int flags, abi_ulong newsp)
} }
#endif #endif
ts = malloc(sizeof(TaskState) + NEW_STACK_SIZE); ts = malloc(sizeof(TaskState) + NEW_STACK_SIZE);
memset(ts, 0, sizeof(TaskState)); init_task_state(ts);
new_stack = ts->stack; new_stack = ts->stack;
ts->used = 1;
/* add in task state list */
ts->next = first_task_state;
first_task_state = ts;
/* we create a new CPU instance. */ /* we create a new CPU instance. */
new_env = cpu_copy(env); new_env = cpu_copy(env);
/* Init regs that differ from the parent. */ /* Init regs that differ from the parent. */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册