Commit 624f7979058b84cbf81c76d45f302ce757b213ca

Authored by pbrook
1 parent afd7cd92

Make signal queues per thread.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4635 c046a42c-6fe2-441c-8c8c-71466251a162
linux-user/main.c
@@ -230,7 +230,7 @@ void cpu_loop(CPUX86State *env) @@ -230,7 +230,7 @@ void cpu_loop(CPUX86State *env)
230 info.si_errno = 0; 230 info.si_errno = 0;
231 info.si_code = TARGET_SI_KERNEL; 231 info.si_code = TARGET_SI_KERNEL;
232 info._sifields._sigfault._addr = 0; 232 info._sifields._sigfault._addr = 0;
233 - queue_signal(info.si_signo, &info); 233 + queue_signal(env, info.si_signo, &info);
234 break; 234 break;
235 case EXCP0D_GPF: 235 case EXCP0D_GPF:
236 /* XXX: potential problem if ABI32 */ 236 /* XXX: potential problem if ABI32 */
@@ -244,7 +244,7 @@ void cpu_loop(CPUX86State *env) @@ -244,7 +244,7 @@ void cpu_loop(CPUX86State *env)
244 info.si_errno = 0; 244 info.si_errno = 0;
245 info.si_code = TARGET_SI_KERNEL; 245 info.si_code = TARGET_SI_KERNEL;
246 info._sifields._sigfault._addr = 0; 246 info._sifields._sigfault._addr = 0;
247 - queue_signal(info.si_signo, &info); 247 + queue_signal(env, info.si_signo, &info);
248 } 248 }
249 break; 249 break;
250 case EXCP0E_PAGE: 250 case EXCP0E_PAGE:
@@ -255,7 +255,7 @@ void cpu_loop(CPUX86State *env) @@ -255,7 +255,7 @@ void cpu_loop(CPUX86State *env)
255 else 255 else
256 info.si_code = TARGET_SEGV_ACCERR; 256 info.si_code = TARGET_SEGV_ACCERR;
257 info._sifields._sigfault._addr = env->cr[2]; 257 info._sifields._sigfault._addr = env->cr[2];
258 - queue_signal(info.si_signo, &info); 258 + queue_signal(env, info.si_signo, &info);
259 break; 259 break;
260 case EXCP00_DIVZ: 260 case EXCP00_DIVZ:
261 #ifndef TARGET_X86_64 261 #ifndef TARGET_X86_64
@@ -269,7 +269,7 @@ void cpu_loop(CPUX86State *env) @@ -269,7 +269,7 @@ void cpu_loop(CPUX86State *env)
269 info.si_errno = 0; 269 info.si_errno = 0;
270 info.si_code = TARGET_FPE_INTDIV; 270 info.si_code = TARGET_FPE_INTDIV;
271 info._sifields._sigfault._addr = env->eip; 271 info._sifields._sigfault._addr = env->eip;
272 - queue_signal(info.si_signo, &info); 272 + queue_signal(env, info.si_signo, &info);
273 } 273 }
274 break; 274 break;
275 case EXCP01_SSTP: 275 case EXCP01_SSTP:
@@ -289,7 +289,7 @@ void cpu_loop(CPUX86State *env) @@ -289,7 +289,7 @@ void cpu_loop(CPUX86State *env)
289 info.si_code = TARGET_SI_KERNEL; 289 info.si_code = TARGET_SI_KERNEL;
290 info._sifields._sigfault._addr = 0; 290 info._sifields._sigfault._addr = 0;
291 } 291 }
292 - queue_signal(info.si_signo, &info); 292 + queue_signal(env, info.si_signo, &info);
293 } 293 }
294 break; 294 break;
295 case EXCP04_INTO: 295 case EXCP04_INTO:
@@ -304,7 +304,7 @@ void cpu_loop(CPUX86State *env) @@ -304,7 +304,7 @@ void cpu_loop(CPUX86State *env)
304 info.si_errno = 0; 304 info.si_errno = 0;
305 info.si_code = TARGET_SI_KERNEL; 305 info.si_code = TARGET_SI_KERNEL;
306 info._sifields._sigfault._addr = 0; 306 info._sifields._sigfault._addr = 0;
307 - queue_signal(info.si_signo, &info); 307 + queue_signal(env, info.si_signo, &info);
308 } 308 }
309 break; 309 break;
310 case EXCP06_ILLOP: 310 case EXCP06_ILLOP:
@@ -312,7 +312,7 @@ void cpu_loop(CPUX86State *env) @@ -312,7 +312,7 @@ void cpu_loop(CPUX86State *env)
312 info.si_errno = 0; 312 info.si_errno = 0;
313 info.si_code = TARGET_ILL_ILLOPN; 313 info.si_code = TARGET_ILL_ILLOPN;
314 info._sifields._sigfault._addr = env->eip; 314 info._sifields._sigfault._addr = env->eip;
315 - queue_signal(info.si_signo, &info); 315 + queue_signal(env, info.si_signo, &info);
316 break; 316 break;
317 case EXCP_INTERRUPT: 317 case EXCP_INTERRUPT:
318 /* just indicate that signals should be handled asap */ 318 /* 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)
327 info.si_signo = sig; 327 info.si_signo = sig;
328 info.si_errno = 0; 328 info.si_errno = 0;
329 info.si_code = TARGET_TRAP_BRKPT; 329 info.si_code = TARGET_TRAP_BRKPT;
330 - queue_signal(info.si_signo, &info); 330 + queue_signal(env, info.si_signo, &info);
331 } 331 }
332 } 332 }
333 break; 333 break;
@@ -441,7 +441,7 @@ void cpu_loop(CPUARMState *env) @@ -441,7 +441,7 @@ void cpu_loop(CPUARMState *env)
441 info.si_errno = 0; 441 info.si_errno = 0;
442 info.si_code = TARGET_ILL_ILLOPN; 442 info.si_code = TARGET_ILL_ILLOPN;
443 info._sifields._sigfault._addr = env->regs[15]; 443 info._sifields._sigfault._addr = env->regs[15];
444 - queue_signal(info.si_signo, &info); 444 + queue_signal(env, info.si_signo, &info);
445 } else if (rc < 0) { /* FP exception */ 445 } else if (rc < 0) { /* FP exception */
446 int arm_fpe=0; 446 int arm_fpe=0;
447 447
@@ -472,7 +472,7 @@ void cpu_loop(CPUARMState *env) @@ -472,7 +472,7 @@ void cpu_loop(CPUARMState *env)
472 if (arm_fpe & BIT_IOC) info.si_code = TARGET_FPE_FLTINV; 472 if (arm_fpe & BIT_IOC) info.si_code = TARGET_FPE_FLTINV;
473 473
474 info._sifields._sigfault._addr = env->regs[15]; 474 info._sifields._sigfault._addr = env->regs[15];
475 - queue_signal(info.si_signo, &info); 475 + queue_signal(env, info.si_signo, &info);
476 } else { 476 } else {
477 env->regs[15] += 4; 477 env->regs[15] += 4;
478 } 478 }
@@ -584,7 +584,7 @@ void cpu_loop(CPUARMState *env) @@ -584,7 +584,7 @@ void cpu_loop(CPUARMState *env)
584 /* XXX: check env->error_code */ 584 /* XXX: check env->error_code */
585 info.si_code = TARGET_SEGV_MAPERR; 585 info.si_code = TARGET_SEGV_MAPERR;
586 info._sifields._sigfault._addr = addr; 586 info._sifields._sigfault._addr = addr;
587 - queue_signal(info.si_signo, &info); 587 + queue_signal(env, info.si_signo, &info);
588 } 588 }
589 break; 589 break;
590 case EXCP_DEBUG: 590 case EXCP_DEBUG:
@@ -597,7 +597,7 @@ void cpu_loop(CPUARMState *env) @@ -597,7 +597,7 @@ void cpu_loop(CPUARMState *env)
597 info.si_signo = sig; 597 info.si_signo = sig;
598 info.si_errno = 0; 598 info.si_errno = 0;
599 info.si_code = TARGET_TRAP_BRKPT; 599 info.si_code = TARGET_TRAP_BRKPT;
600 - queue_signal(info.si_signo, &info); 600 + queue_signal(env, info.si_signo, &info);
601 } 601 }
602 } 602 }
603 break; 603 break;
@@ -780,7 +780,7 @@ void cpu_loop (CPUSPARCState *env) @@ -780,7 +780,7 @@ void cpu_loop (CPUSPARCState *env)
780 /* XXX: check env->error_code */ 780 /* XXX: check env->error_code */
781 info.si_code = TARGET_SEGV_MAPERR; 781 info.si_code = TARGET_SEGV_MAPERR;
782 info._sifields._sigfault._addr = env->mmuregs[4]; 782 info._sifields._sigfault._addr = env->mmuregs[4];
783 - queue_signal(info.si_signo, &info); 783 + queue_signal(env, info.si_signo, &info);
784 } 784 }
785 break; 785 break;
786 #else 786 #else
@@ -801,7 +801,7 @@ void cpu_loop (CPUSPARCState *env) @@ -801,7 +801,7 @@ void cpu_loop (CPUSPARCState *env)
801 info._sifields._sigfault._addr = env->dmmuregs[4]; 801 info._sifields._sigfault._addr = env->dmmuregs[4];
802 else 802 else
803 info._sifields._sigfault._addr = env->tsptr->tpc; 803 info._sifields._sigfault._addr = env->tsptr->tpc;
804 - queue_signal(info.si_signo, &info); 804 + queue_signal(env, info.si_signo, &info);
805 } 805 }
806 break; 806 break;
807 #ifndef TARGET_ABI32 807 #ifndef TARGET_ABI32
@@ -828,7 +828,7 @@ void cpu_loop (CPUSPARCState *env) @@ -828,7 +828,7 @@ void cpu_loop (CPUSPARCState *env)
828 info.si_signo = sig; 828 info.si_signo = sig;
829 info.si_errno = 0; 829 info.si_errno = 0;
830 info.si_code = TARGET_TRAP_BRKPT; 830 info.si_code = TARGET_TRAP_BRKPT;
831 - queue_signal(info.si_signo, &info); 831 + queue_signal(env, info.si_signo, &info);
832 } 832 }
833 } 833 }
834 break; 834 break;
@@ -949,7 +949,7 @@ void cpu_loop(CPUPPCState *env) @@ -949,7 +949,7 @@ void cpu_loop(CPUPPCState *env)
949 break; 949 break;
950 } 950 }
951 info._sifields._sigfault._addr = env->nip; 951 info._sifields._sigfault._addr = env->nip;
952 - queue_signal(info.si_signo, &info); 952 + queue_signal(env, info.si_signo, &info);
953 break; 953 break;
954 case POWERPC_EXCP_ISI: /* Instruction storage exception */ 954 case POWERPC_EXCP_ISI: /* Instruction storage exception */
955 EXCP_DUMP(env, "Invalid instruction fetch: 0x\n" ADDRX "\n", 955 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)
977 break; 977 break;
978 } 978 }
979 info._sifields._sigfault._addr = env->nip - 4; 979 info._sifields._sigfault._addr = env->nip - 4;
980 - queue_signal(info.si_signo, &info); 980 + queue_signal(env, info.si_signo, &info);
981 break; 981 break;
982 case POWERPC_EXCP_EXTERNAL: /* External input */ 982 case POWERPC_EXCP_EXTERNAL: /* External input */
983 cpu_abort(env, "External interrupt while in user mode. " 983 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)
990 info.si_errno = 0; 990 info.si_errno = 0;
991 info.si_code = TARGET_BUS_ADRALN; 991 info.si_code = TARGET_BUS_ADRALN;
992 info._sifields._sigfault._addr = env->nip - 4; 992 info._sifields._sigfault._addr = env->nip - 4;
993 - queue_signal(info.si_signo, &info); 993 + queue_signal(env, info.si_signo, &info);
994 break; 994 break;
995 case POWERPC_EXCP_PROGRAM: /* Program exception */ 995 case POWERPC_EXCP_PROGRAM: /* Program exception */
996 /* XXX: check this */ 996 /* XXX: check this */
@@ -1083,7 +1083,7 @@ void cpu_loop(CPUPPCState *env) @@ -1083,7 +1083,7 @@ void cpu_loop(CPUPPCState *env)
1083 break; 1083 break;
1084 } 1084 }
1085 info._sifields._sigfault._addr = env->nip - 4; 1085 info._sifields._sigfault._addr = env->nip - 4;
1086 - queue_signal(info.si_signo, &info); 1086 + queue_signal(env, info.si_signo, &info);
1087 break; 1087 break;
1088 case POWERPC_EXCP_FPU: /* Floating-point unavailable exception */ 1088 case POWERPC_EXCP_FPU: /* Floating-point unavailable exception */
1089 EXCP_DUMP(env, "No floating point allowed\n"); 1089 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)
1091 info.si_errno = 0; 1091 info.si_errno = 0;
1092 info.si_code = TARGET_ILL_COPROC; 1092 info.si_code = TARGET_ILL_COPROC;
1093 info._sifields._sigfault._addr = env->nip - 4; 1093 info._sifields._sigfault._addr = env->nip - 4;
1094 - queue_signal(info.si_signo, &info); 1094 + queue_signal(env, info.si_signo, &info);
1095 break; 1095 break;
1096 case POWERPC_EXCP_SYSCALL: /* System call exception */ 1096 case POWERPC_EXCP_SYSCALL: /* System call exception */
1097 cpu_abort(env, "Syscall exception while in user mode. " 1097 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)
1103 info.si_errno = 0; 1103 info.si_errno = 0;
1104 info.si_code = TARGET_ILL_COPROC; 1104 info.si_code = TARGET_ILL_COPROC;
1105 info._sifields._sigfault._addr = env->nip - 4; 1105 info._sifields._sigfault._addr = env->nip - 4;
1106 - queue_signal(info.si_signo, &info); 1106 + queue_signal(env, info.si_signo, &info);
1107 break; 1107 break;
1108 case POWERPC_EXCP_DECR: /* Decrementer exception */ 1108 case POWERPC_EXCP_DECR: /* Decrementer exception */
1109 cpu_abort(env, "Decrementer interrupt while in user mode. " 1109 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)
1135 info.si_signo = sig; 1135 info.si_signo = sig;
1136 info.si_errno = 0; 1136 info.si_errno = 0;
1137 info.si_code = TARGET_TRAP_BRKPT; 1137 info.si_code = TARGET_TRAP_BRKPT;
1138 - queue_signal(info.si_signo, &info); 1138 + queue_signal(env, info.si_signo, &info);
1139 } 1139 }
1140 } 1140 }
1141 break; 1141 break;
@@ -1145,7 +1145,7 @@ void cpu_loop(CPUPPCState *env) @@ -1145,7 +1145,7 @@ void cpu_loop(CPUPPCState *env)
1145 info.si_errno = 0; 1145 info.si_errno = 0;
1146 info.si_code = TARGET_ILL_COPROC; 1146 info.si_code = TARGET_ILL_COPROC;
1147 info._sifields._sigfault._addr = env->nip - 4; 1147 info._sifields._sigfault._addr = env->nip - 4;
1148 - queue_signal(info.si_signo, &info); 1148 + queue_signal(env, info.si_signo, &info);
1149 break; 1149 break;
1150 case POWERPC_EXCP_EFPDI: /* Embedded floating-point data IRQ */ 1150 case POWERPC_EXCP_EFPDI: /* Embedded floating-point data IRQ */
1151 cpu_abort(env, "Embedded floating-point data IRQ not handled\n"); 1151 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)
1209 info.si_errno = 0; 1209 info.si_errno = 0;
1210 info.si_code = TARGET_ILL_COPROC; 1210 info.si_code = TARGET_ILL_COPROC;
1211 info._sifields._sigfault._addr = env->nip - 4; 1211 info._sifields._sigfault._addr = env->nip - 4;
1212 - queue_signal(info.si_signo, &info); 1212 + queue_signal(env, info.si_signo, &info);
1213 break; 1213 break;
1214 case POWERPC_EXCP_PIT: /* Programmable interval timer IRQ */ 1214 case POWERPC_EXCP_PIT: /* Programmable interval timer IRQ */
1215 cpu_abort(env, "Programable interval timer interrupt " 1215 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)
1685 info.si_signo = TARGET_SIGILL; 1685 info.si_signo = TARGET_SIGILL;
1686 info.si_errno = 0; 1686 info.si_errno = 0;
1687 info.si_code = 0; 1687 info.si_code = 0;
1688 - queue_signal(info.si_signo, &info); 1688 + queue_signal(env, info.si_signo, &info);
1689 break; 1689 break;
1690 case EXCP_INTERRUPT: 1690 case EXCP_INTERRUPT:
1691 /* just indicate that signals should be handled asap */ 1691 /* 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)
1700 info.si_signo = sig; 1700 info.si_signo = sig;
1701 info.si_errno = 0; 1701 info.si_errno = 0;
1702 info.si_code = TARGET_TRAP_BRKPT; 1702 info.si_code = TARGET_TRAP_BRKPT;
1703 - queue_signal(info.si_signo, &info); 1703 + queue_signal(env, info.si_signo, &info);
1704 } 1704 }
1705 } 1705 }
1706 break; 1706 break;
@@ -1751,7 +1751,7 @@ void cpu_loop (CPUState *env) @@ -1751,7 +1751,7 @@ void cpu_loop (CPUState *env)
1751 info.si_signo = sig; 1751 info.si_signo = sig;
1752 info.si_errno = 0; 1752 info.si_errno = 0;
1753 info.si_code = TARGET_TRAP_BRKPT; 1753 info.si_code = TARGET_TRAP_BRKPT;
1754 - queue_signal(info.si_signo, &info); 1754 + queue_signal(env, info.si_signo, &info);
1755 } 1755 }
1756 } 1756 }
1757 break; 1757 break;
@@ -1761,7 +1761,7 @@ void cpu_loop (CPUState *env) @@ -1761,7 +1761,7 @@ void cpu_loop (CPUState *env)
1761 info.si_errno = 0; 1761 info.si_errno = 0;
1762 info.si_code = TARGET_SEGV_MAPERR; 1762 info.si_code = TARGET_SEGV_MAPERR;
1763 info._sifields._sigfault._addr = env->tea; 1763 info._sifields._sigfault._addr = env->tea;
1764 - queue_signal(info.si_signo, &info); 1764 + queue_signal(env, info.si_signo, &info);
1765 break; 1765 break;
1766 1766
1767 default: 1767 default:
@@ -1790,7 +1790,7 @@ void cpu_loop (CPUState *env) @@ -1790,7 +1790,7 @@ void cpu_loop (CPUState *env)
1790 /* XXX: check env->error_code */ 1790 /* XXX: check env->error_code */
1791 info.si_code = TARGET_SEGV_MAPERR; 1791 info.si_code = TARGET_SEGV_MAPERR;
1792 info._sifields._sigfault._addr = env->pregs[PR_EDA]; 1792 info._sifields._sigfault._addr = env->pregs[PR_EDA];
1793 - queue_signal(info.si_signo, &info); 1793 + queue_signal(env, info.si_signo, &info);
1794 } 1794 }
1795 break; 1795 break;
1796 case EXCP_INTERRUPT: 1796 case EXCP_INTERRUPT:
@@ -1818,7 +1818,7 @@ void cpu_loop (CPUState *env) @@ -1818,7 +1818,7 @@ void cpu_loop (CPUState *env)
1818 info.si_signo = sig; 1818 info.si_signo = sig;
1819 info.si_errno = 0; 1819 info.si_errno = 0;
1820 info.si_code = TARGET_TRAP_BRKPT; 1820 info.si_code = TARGET_TRAP_BRKPT;
1821 - queue_signal(info.si_signo, &info); 1821 + queue_signal(env, info.si_signo, &info);
1822 } 1822 }
1823 } 1823 }
1824 break; 1824 break;
@@ -1869,7 +1869,7 @@ void cpu_loop(CPUM68KState *env) @@ -1869,7 +1869,7 @@ void cpu_loop(CPUM68KState *env)
1869 info.si_errno = 0; 1869 info.si_errno = 0;
1870 info.si_code = TARGET_ILL_ILLOPN; 1870 info.si_code = TARGET_ILL_ILLOPN;
1871 info._sifields._sigfault._addr = env->pc; 1871 info._sifields._sigfault._addr = env->pc;
1872 - queue_signal(info.si_signo, &info); 1872 + queue_signal(env, info.si_signo, &info);
1873 break; 1873 break;
1874 case EXCP_TRAP0: 1874 case EXCP_TRAP0:
1875 { 1875 {
@@ -1896,7 +1896,7 @@ void cpu_loop(CPUM68KState *env) @@ -1896,7 +1896,7 @@ void cpu_loop(CPUM68KState *env)
1896 /* XXX: check env->error_code */ 1896 /* XXX: check env->error_code */
1897 info.si_code = TARGET_SEGV_MAPERR; 1897 info.si_code = TARGET_SEGV_MAPERR;
1898 info._sifields._sigfault._addr = env->mmu.ar; 1898 info._sifields._sigfault._addr = env->mmu.ar;
1899 - queue_signal(info.si_signo, &info); 1899 + queue_signal(env, info.si_signo, &info);
1900 } 1900 }
1901 break; 1901 break;
1902 case EXCP_DEBUG: 1902 case EXCP_DEBUG:
@@ -1909,7 +1909,7 @@ void cpu_loop(CPUM68KState *env) @@ -1909,7 +1909,7 @@ void cpu_loop(CPUM68KState *env)
1909 info.si_signo = sig; 1909 info.si_signo = sig;
1910 info.si_errno = 0; 1910 info.si_errno = 0;
1911 info.si_code = TARGET_TRAP_BRKPT; 1911 info.si_code = TARGET_TRAP_BRKPT;
1912 - queue_signal(info.si_signo, &info); 1912 + queue_signal(env, info.si_signo, &info);
1913 } 1913 }
1914 } 1914 }
1915 break; 1915 break;
@@ -2000,7 +2000,7 @@ void cpu_loop (CPUState *env) @@ -2000,7 +2000,7 @@ void cpu_loop (CPUState *env)
2000 info.si_signo = sig; 2000 info.si_signo = sig;
2001 info.si_errno = 0; 2001 info.si_errno = 0;
2002 info.si_code = TARGET_TRAP_BRKPT; 2002 info.si_code = TARGET_TRAP_BRKPT;
2003 - queue_signal(info.si_signo, &info); 2003 + queue_signal(env, info.si_signo, &info);
2004 } 2004 }
2005 } 2005 }
2006 break; 2006 break;
@@ -2047,9 +2047,19 @@ void usage(void) @@ -2047,9 +2047,19 @@ void usage(void)
2047 /* XXX: currently only used for async signals (see signal.c) */ 2047 /* XXX: currently only used for async signals (see signal.c) */
2048 CPUState *global_env; 2048 CPUState *global_env;
2049 2049
2050 -/* used to free thread contexts */  
2051 -TaskState *first_task_state;  
2052 - 2050 +void init_task_state(TaskState *ts)
  2051 +{
  2052 + int i;
  2053 +
  2054 + memset(ts, 0, sizeof(TaskState));
  2055 + ts->used = 1;
  2056 + ts->first_free = ts->sigqueue_table;
  2057 + for (i = 0; i < MAX_SIGQUEUE_SIZE - 1; i++) {
  2058 + ts->sigqueue_table[i].next = &ts->sigqueue_table[i + 1];
  2059 + }
  2060 + ts->sigqueue_table[i].next = NULL;
  2061 +}
  2062 +
2053 int main(int argc, char **argv) 2063 int main(int argc, char **argv)
2054 { 2064 {
2055 const char *filename; 2065 const char *filename;
@@ -2246,9 +2256,9 @@ int main(int argc, char **argv) @@ -2246,9 +2256,9 @@ int main(int argc, char **argv)
2246 2256
2247 /* build Task State */ 2257 /* build Task State */
2248 memset(ts, 0, sizeof(TaskState)); 2258 memset(ts, 0, sizeof(TaskState));
2249 - env->opaque = ts;  
2250 - ts->used = 1; 2259 + init_task_state(ts);
2251 ts->info = info; 2260 ts->info = info;
  2261 + env->opaque = ts;
2252 env->user_mode_only = 1; 2262 env->user_mode_only = 1;
2253 2263
2254 #if defined(TARGET_I386) 2264 #if defined(TARGET_I386)
linux-user/qemu.h
@@ -82,6 +82,20 @@ struct vm86_saved_state { @@ -82,6 +82,20 @@ struct vm86_saved_state {
82 #include "nwfpe/fpa11.h" 82 #include "nwfpe/fpa11.h"
83 #endif 83 #endif
84 84
  85 +#define MAX_SIGQUEUE_SIZE 1024
  86 +
  87 +struct sigqueue {
  88 + struct sigqueue *next;
  89 + target_siginfo_t info;
  90 +};
  91 +
  92 +struct emulated_sigtable {
  93 + int pending; /* true if signal is pending */
  94 + struct sigqueue *first;
  95 + struct sigqueue info; /* in order to always have memory for the
  96 + first signal, we put it here */
  97 +};
  98 +
85 /* NOTE: we force a big alignment so that the stack stored after is 99 /* NOTE: we force a big alignment so that the stack stored after is
86 aligned too */ 100 aligned too */
87 typedef struct TaskState { 101 typedef struct TaskState {
@@ -109,10 +123,16 @@ typedef struct TaskState { @@ -109,10 +123,16 @@ typedef struct TaskState {
109 #endif 123 #endif
110 int used; /* non zero if used */ 124 int used; /* non zero if used */
111 struct image_info *info; 125 struct image_info *info;
  126 +
  127 + struct emulated_sigtable sigtab[TARGET_NSIG];
  128 + struct sigqueue sigqueue_table[MAX_SIGQUEUE_SIZE]; /* siginfo queue */
  129 + struct sigqueue *first_free; /* first free siginfo queue entry */
  130 + int signal_pending; /* non zero if a signal may be pending */
  131 +
112 uint8_t stack[0]; 132 uint8_t stack[0];
113 } __attribute__((aligned(16))) TaskState; 133 } __attribute__((aligned(16))) TaskState;
114 134
115 -extern TaskState *first_task_state; 135 +void init_task_state(TaskState *ts);
116 extern const char *qemu_uname_release; 136 extern const char *qemu_uname_release;
117 137
118 /* ??? See if we can avoid exposing so much of the loader internals. */ 138 /* ??? 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);
182 extern int do_strace; 202 extern int do_strace;
183 203
184 /* signal.c */ 204 /* signal.c */
185 -void process_pending_signals(void *cpu_env); 205 +void process_pending_signals(CPUState *cpu_env);
186 void signal_init(void); 206 void signal_init(void);
187 -int queue_signal(int sig, target_siginfo_t *info); 207 +int queue_signal(CPUState *env, int sig, target_siginfo_t *info);
188 void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info); 208 void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info);
189 void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo); 209 void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo);
190 int target_to_host_signal(int sig); 210 int target_to_host_signal(int sig);
linux-user/signal.c
@@ -31,31 +31,13 @@ @@ -31,31 +31,13 @@
31 31
32 //#define DEBUG_SIGNAL 32 //#define DEBUG_SIGNAL
33 33
34 -#define MAX_SIGQUEUE_SIZE 1024  
35 -  
36 -struct sigqueue {  
37 - struct sigqueue *next;  
38 - target_siginfo_t info;  
39 -};  
40 -  
41 -struct emulated_sigaction {  
42 - struct target_sigaction sa;  
43 - int pending; /* true if signal is pending */  
44 - struct sigqueue *first;  
45 - struct sigqueue info; /* in order to always have memory for the  
46 - first signal, we put it here */  
47 -};  
48 -  
49 struct target_sigaltstack target_sigaltstack_used = { 34 struct target_sigaltstack target_sigaltstack_used = {
50 .ss_sp = 0, 35 .ss_sp = 0,
51 .ss_size = 0, 36 .ss_size = 0,
52 .ss_flags = TARGET_SS_DISABLE, 37 .ss_flags = TARGET_SS_DISABLE,
53 }; 38 };
54 39
55 -static struct emulated_sigaction sigact_table[TARGET_NSIG];  
56 -static struct sigqueue sigqueue_table[MAX_SIGQUEUE_SIZE]; /* siginfo queue */  
57 -static struct sigqueue *first_free; /* first free siginfo queue entry */  
58 -static int signal_pending; /* non zero if a signal may be pending */ 40 +static struct target_sigaction sigact_table[TARGET_NSIG];
59 41
60 static void host_signal_handler(int host_signum, siginfo_t *info, 42 static void host_signal_handler(int host_signum, siginfo_t *info,
61 void *puc); 43 void *puc);
@@ -96,6 +78,12 @@ static uint8_t host_to_target_signal_table[65] = { @@ -96,6 +78,12 @@ static uint8_t host_to_target_signal_table[65] = {
96 [SIGPWR] = TARGET_SIGPWR, 78 [SIGPWR] = TARGET_SIGPWR,
97 [SIGSYS] = TARGET_SIGSYS, 79 [SIGSYS] = TARGET_SIGSYS,
98 /* next signals stay the same */ 80 /* next signals stay the same */
  81 + /* Nasty hack: Reverse SIGRTMIN and SIGRTMAX to avoid overlap with
  82 + host libpthread signals. This assumes noone actually uses SIGRTMAX :-/
  83 + To fix this properly we need to do manual signal delivery multiplexed
  84 + over a single host signal. */
  85 + [__SIGRTMIN] = __SIGRTMAX,
  86 + [__SIGRTMAX] = __SIGRTMIN,
99 }; 87 };
100 static uint8_t target_to_host_signal_table[65]; 88 static uint8_t target_to_host_signal_table[65];
101 89
@@ -278,7 +266,9 @@ void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo) @@ -278,7 +266,9 @@ void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo)
278 void signal_init(void) 266 void signal_init(void)
279 { 267 {
280 struct sigaction act; 268 struct sigaction act;
  269 + struct sigaction oact;
281 int i, j; 270 int i, j;
  271 + int host_sig;
282 272
283 /* generate signal conversion tables */ 273 /* generate signal conversion tables */
284 for(i = 1; i <= 64; i++) { 274 for(i = 1; i <= 64; i++) {
@@ -292,36 +282,45 @@ void signal_init(void) @@ -292,36 +282,45 @@ void signal_init(void)
292 282
293 /* set all host signal handlers. ALL signals are blocked during 283 /* set all host signal handlers. ALL signals are blocked during
294 the handlers to serialize them. */ 284 the handlers to serialize them. */
  285 + memset(sigact_table, 0, sizeof(sigact_table));
  286 +
295 sigfillset(&act.sa_mask); 287 sigfillset(&act.sa_mask);
296 act.sa_flags = SA_SIGINFO; 288 act.sa_flags = SA_SIGINFO;
297 act.sa_sigaction = host_signal_handler; 289 act.sa_sigaction = host_signal_handler;
298 - for(i = 1; i < NSIG; i++) {  
299 - sigaction(i, &act, NULL); 290 + for(i = 1; i <= TARGET_NSIG; i++) {
  291 + host_sig = target_to_host_signal(i);
  292 + sigaction(host_sig, NULL, &oact);
  293 + if (oact.sa_sigaction == (void *)SIG_IGN) {
  294 + sigact_table[i - 1]._sa_handler = TARGET_SIG_IGN;
  295 + } else if (oact.sa_sigaction == (void *)SIG_DFL) {
  296 + sigact_table[i - 1]._sa_handler = TARGET_SIG_DFL;
  297 + }
  298 + /* If there's already a handler installed then something has
  299 + gone horribly wrong, so don't even try to handle that case. */
  300 + /* Install some handlers for our own use. */
  301 + if (host_sig == SIGSEGV || host_sig == SIGBUS) {
  302 + sigaction(host_sig, &act, NULL);
  303 + }
300 } 304 }
301 -  
302 - memset(sigact_table, 0, sizeof(sigact_table));  
303 -  
304 - first_free = &sigqueue_table[0];  
305 - for(i = 0; i < MAX_SIGQUEUE_SIZE - 1; i++)  
306 - sigqueue_table[i].next = &sigqueue_table[i + 1];  
307 - sigqueue_table[MAX_SIGQUEUE_SIZE - 1].next = NULL;  
308 } 305 }
309 306
310 /* signal queue handling */ 307 /* signal queue handling */
311 308
312 -static inline struct sigqueue *alloc_sigqueue(void) 309 +static inline struct sigqueue *alloc_sigqueue(CPUState *env)
313 { 310 {
314 - struct sigqueue *q = first_free; 311 + TaskState *ts = env->opaque;
  312 + struct sigqueue *q = ts->first_free;
315 if (!q) 313 if (!q)
316 return NULL; 314 return NULL;
317 - first_free = q->next; 315 + ts->first_free = q->next;
318 return q; 316 return q;
319 } 317 }
320 318
321 -static inline void free_sigqueue(struct sigqueue *q) 319 +static inline void free_sigqueue(CPUState *env, struct sigqueue *q)
322 { 320 {
323 - q->next = first_free;  
324 - first_free = q; 321 + TaskState *ts = env->opaque;
  322 + q->next = ts->first_free;
  323 + ts->first_free = q;
325 } 324 }
326 325
327 /* abort execution with signal */ 326 /* abort execution with signal */
@@ -347,9 +346,10 @@ void __attribute((noreturn)) force_sig(int sig) @@ -347,9 +346,10 @@ void __attribute((noreturn)) force_sig(int sig)
347 346
348 /* queue a signal so that it will be send to the virtual CPU as soon 347 /* queue a signal so that it will be send to the virtual CPU as soon
349 as possible */ 348 as possible */
350 -int queue_signal(int sig, target_siginfo_t *info) 349 +int queue_signal(CPUState *env, int sig, target_siginfo_t *info)
351 { 350 {
352 - struct emulated_sigaction *k; 351 + TaskState *ts = env->opaque;
  352 + struct emulated_sigtable *k;
353 struct sigqueue *q, **pq; 353 struct sigqueue *q, **pq;
354 abi_ulong handler; 354 abi_ulong handler;
355 355
@@ -357,8 +357,8 @@ int queue_signal(int sig, target_siginfo_t *info) @@ -357,8 +357,8 @@ int queue_signal(int sig, target_siginfo_t *info)
357 fprintf(stderr, "queue_signal: sig=%d\n", 357 fprintf(stderr, "queue_signal: sig=%d\n",
358 sig); 358 sig);
359 #endif 359 #endif
360 - k = &sigact_table[sig - 1];  
361 - handler = k->sa._sa_handler; 360 + k = &ts->sigtab[sig - 1];
  361 + handler = sigact_table[sig - 1]._sa_handler;
362 if (handler == TARGET_SIG_DFL) { 362 if (handler == TARGET_SIG_DFL) {
363 /* default handler : ignore some signal. The other are fatal */ 363 /* default handler : ignore some signal. The other are fatal */
364 if (sig != TARGET_SIGCHLD && 364 if (sig != TARGET_SIGCHLD &&
@@ -386,7 +386,7 @@ int queue_signal(int sig, target_siginfo_t *info) @@ -386,7 +386,7 @@ int queue_signal(int sig, target_siginfo_t *info)
386 /* first signal */ 386 /* first signal */
387 q = &k->info; 387 q = &k->info;
388 } else { 388 } else {
389 - q = alloc_sigqueue(); 389 + q = alloc_sigqueue(env);
390 if (!q) 390 if (!q)
391 return -EAGAIN; 391 return -EAGAIN;
392 while (*pq != NULL) 392 while (*pq != NULL)
@@ -398,7 +398,7 @@ int queue_signal(int sig, target_siginfo_t *info) @@ -398,7 +398,7 @@ int queue_signal(int sig, target_siginfo_t *info)
398 q->next = NULL; 398 q->next = NULL;
399 k->pending = 1; 399 k->pending = 1;
400 /* signal that a new signal is pending */ 400 /* signal that a new signal is pending */
401 - signal_pending = 1; 401 + ts->signal_pending = 1;
402 return 1; /* indicates that the signal was queued */ 402 return 1; /* indicates that the signal was queued */
403 } 403 }
404 } 404 }
@@ -424,7 +424,7 @@ static void host_signal_handler(int host_signum, siginfo_t *info, @@ -424,7 +424,7 @@ static void host_signal_handler(int host_signum, siginfo_t *info,
424 fprintf(stderr, "qemu: got signal %d\n", sig); 424 fprintf(stderr, "qemu: got signal %d\n", sig);
425 #endif 425 #endif
426 host_to_target_siginfo_noswap(&tinfo, info); 426 host_to_target_siginfo_noswap(&tinfo, info);
427 - if (queue_signal(sig, &tinfo) == 1) { 427 + if (queue_signal(global_env, sig, &tinfo) == 1) {
428 /* interrupt the virtual CPU as soon as possible */ 428 /* interrupt the virtual CPU as soon as possible */
429 cpu_interrupt(global_env, CPU_INTERRUPT_EXIT); 429 cpu_interrupt(global_env, CPU_INTERRUPT_EXIT);
430 } 430 }
@@ -496,7 +496,7 @@ out: @@ -496,7 +496,7 @@ out:
496 int do_sigaction(int sig, const struct target_sigaction *act, 496 int do_sigaction(int sig, const struct target_sigaction *act,
497 struct target_sigaction *oact) 497 struct target_sigaction *oact)
498 { 498 {
499 - struct emulated_sigaction *k; 499 + struct target_sigaction *k;
500 struct sigaction act1; 500 struct sigaction act1;
501 int host_sig; 501 int host_sig;
502 int ret = 0; 502 int ret = 0;
@@ -509,34 +509,35 @@ int do_sigaction(int sig, const struct target_sigaction *act, @@ -509,34 +509,35 @@ int do_sigaction(int sig, const struct target_sigaction *act,
509 sig, (int)act, (int)oact); 509 sig, (int)act, (int)oact);
510 #endif 510 #endif
511 if (oact) { 511 if (oact) {
512 - oact->_sa_handler = tswapl(k->sa._sa_handler);  
513 - oact->sa_flags = tswapl(k->sa.sa_flags); 512 + oact->_sa_handler = tswapl(k->_sa_handler);
  513 + oact->sa_flags = tswapl(k->sa_flags);
514 #if !defined(TARGET_MIPS) 514 #if !defined(TARGET_MIPS)
515 - oact->sa_restorer = tswapl(k->sa.sa_restorer); 515 + oact->sa_restorer = tswapl(k->sa_restorer);
516 #endif 516 #endif
517 - oact->sa_mask = k->sa.sa_mask; 517 + oact->sa_mask = k->sa_mask;
518 } 518 }
519 if (act) { 519 if (act) {
520 - k->sa._sa_handler = tswapl(act->_sa_handler);  
521 - k->sa.sa_flags = tswapl(act->sa_flags); 520 + /* FIXME: This is not threadsafe. */
  521 + k->_sa_handler = tswapl(act->_sa_handler);
  522 + k->sa_flags = tswapl(act->sa_flags);
522 #if !defined(TARGET_MIPS) 523 #if !defined(TARGET_MIPS)
523 - k->sa.sa_restorer = tswapl(act->sa_restorer); 524 + k->sa_restorer = tswapl(act->sa_restorer);
524 #endif 525 #endif
525 - k->sa.sa_mask = act->sa_mask; 526 + k->sa_mask = act->sa_mask;
526 527
527 /* we update the host linux signal state */ 528 /* we update the host linux signal state */
528 host_sig = target_to_host_signal(sig); 529 host_sig = target_to_host_signal(sig);
529 if (host_sig != SIGSEGV && host_sig != SIGBUS) { 530 if (host_sig != SIGSEGV && host_sig != SIGBUS) {
530 sigfillset(&act1.sa_mask); 531 sigfillset(&act1.sa_mask);
531 act1.sa_flags = SA_SIGINFO; 532 act1.sa_flags = SA_SIGINFO;
532 - if (k->sa.sa_flags & TARGET_SA_RESTART) 533 + if (k->sa_flags & TARGET_SA_RESTART)
533 act1.sa_flags |= SA_RESTART; 534 act1.sa_flags |= SA_RESTART;
534 /* NOTE: it is important to update the host kernel signal 535 /* NOTE: it is important to update the host kernel signal
535 ignore state to avoid getting unexpected interrupted 536 ignore state to avoid getting unexpected interrupted
536 syscalls */ 537 syscalls */
537 - if (k->sa._sa_handler == TARGET_SIG_IGN) { 538 + if (k->_sa_handler == TARGET_SIG_IGN) {
538 act1.sa_sigaction = (void *)SIG_IGN; 539 act1.sa_sigaction = (void *)SIG_IGN;
539 - } else if (k->sa._sa_handler == TARGET_SIG_DFL) { 540 + } else if (k->_sa_handler == TARGET_SIG_DFL) {
540 act1.sa_sigaction = (void *)SIG_DFL; 541 act1.sa_sigaction = (void *)SIG_DFL;
541 } else { 542 } else {
542 act1.sa_sigaction = host_signal_handler; 543 act1.sa_sigaction = host_signal_handler;
@@ -712,14 +713,14 @@ setup_sigcontext(struct target_sigcontext *sc, struct target_fpstate *fpstate, @@ -712,14 +713,14 @@ setup_sigcontext(struct target_sigcontext *sc, struct target_fpstate *fpstate,
712 */ 713 */
713 714
714 static inline abi_ulong 715 static inline abi_ulong
715 -get_sigframe(struct emulated_sigaction *ka, CPUX86State *env, size_t frame_size) 716 +get_sigframe(struct target_sigaction *ka, CPUX86State *env, size_t frame_size)
716 { 717 {
717 unsigned long esp; 718 unsigned long esp;
718 719
719 /* Default to using normal stack */ 720 /* Default to using normal stack */
720 esp = env->regs[R_ESP]; 721 esp = env->regs[R_ESP];
721 /* This is the X/Open sanctioned signal stack switching. */ 722 /* This is the X/Open sanctioned signal stack switching. */
722 - if (ka->sa.sa_flags & TARGET_SA_ONSTACK) { 723 + if (ka->sa_flags & TARGET_SA_ONSTACK) {
723 if (sas_ss_flags(esp) == 0) 724 if (sas_ss_flags(esp) == 0)
724 esp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size; 725 esp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
725 } 726 }
@@ -727,15 +728,15 @@ get_sigframe(struct emulated_sigaction *ka, CPUX86State *env, size_t frame_size) @@ -727,15 +728,15 @@ get_sigframe(struct emulated_sigaction *ka, CPUX86State *env, size_t frame_size)
727 /* This is the legacy signal stack switching. */ 728 /* This is the legacy signal stack switching. */
728 else 729 else
729 if ((env->segs[R_SS].selector & 0xffff) != __USER_DS && 730 if ((env->segs[R_SS].selector & 0xffff) != __USER_DS &&
730 - !(ka->sa.sa_flags & TARGET_SA_RESTORER) &&  
731 - ka->sa.sa_restorer) {  
732 - esp = (unsigned long) ka->sa.sa_restorer; 731 + !(ka->sa_flags & TARGET_SA_RESTORER) &&
  732 + ka->sa_restorer) {
  733 + esp = (unsigned long) ka->sa_restorer;
733 } 734 }
734 return (esp - frame_size) & -8ul; 735 return (esp - frame_size) & -8ul;
735 } 736 }
736 737
737 /* compare linux/arch/i386/kernel/signal.c:setup_frame() */ 738 /* compare linux/arch/i386/kernel/signal.c:setup_frame() */
738 -static void setup_frame(int sig, struct emulated_sigaction *ka, 739 +static void setup_frame(int sig, struct target_sigaction *ka,
739 target_sigset_t *set, CPUX86State *env) 740 target_sigset_t *set, CPUX86State *env)
740 { 741 {
741 abi_ulong frame_addr; 742 abi_ulong frame_addr;
@@ -764,8 +765,8 @@ static void setup_frame(int sig, struct emulated_sigaction *ka, @@ -764,8 +765,8 @@ static void setup_frame(int sig, struct emulated_sigaction *ka,
764 765
765 /* Set up to return from userspace. If provided, use a stub 766 /* Set up to return from userspace. If provided, use a stub
766 already in userspace. */ 767 already in userspace. */
767 - if (ka->sa.sa_flags & TARGET_SA_RESTORER) {  
768 - err |= __put_user(ka->sa.sa_restorer, &frame->pretcode); 768 + if (ka->sa_flags & TARGET_SA_RESTORER) {
  769 + err |= __put_user(ka->sa_restorer, &frame->pretcode);
769 } else { 770 } else {
770 uint16_t val16; 771 uint16_t val16;
771 abi_ulong retcode_addr; 772 abi_ulong retcode_addr;
@@ -784,7 +785,7 @@ static void setup_frame(int sig, struct emulated_sigaction *ka, @@ -784,7 +785,7 @@ static void setup_frame(int sig, struct emulated_sigaction *ka,
784 785
785 /* Set up registers for signal handler */ 786 /* Set up registers for signal handler */
786 env->regs[R_ESP] = frame_addr; 787 env->regs[R_ESP] = frame_addr;
787 - env->eip = ka->sa._sa_handler; 788 + env->eip = ka->_sa_handler;
788 789
789 cpu_x86_load_seg(env, R_DS, __USER_DS); 790 cpu_x86_load_seg(env, R_DS, __USER_DS);
790 cpu_x86_load_seg(env, R_ES, __USER_DS); 791 cpu_x86_load_seg(env, R_ES, __USER_DS);
@@ -799,12 +800,12 @@ static void setup_frame(int sig, struct emulated_sigaction *ka, @@ -799,12 +800,12 @@ static void setup_frame(int sig, struct emulated_sigaction *ka,
799 give_sigsegv: 800 give_sigsegv:
800 unlock_user_struct(frame, frame_addr, 1); 801 unlock_user_struct(frame, frame_addr, 1);
801 if (sig == TARGET_SIGSEGV) 802 if (sig == TARGET_SIGSEGV)
802 - ka->sa._sa_handler = TARGET_SIG_DFL; 803 + ka->_sa_handler = TARGET_SIG_DFL;
803 force_sig(TARGET_SIGSEGV /* , current */); 804 force_sig(TARGET_SIGSEGV /* , current */);
804 } 805 }
805 806
806 /* compare linux/arch/i386/kernel/signal.c:setup_rt_frame() */ 807 /* compare linux/arch/i386/kernel/signal.c:setup_rt_frame() */
807 -static void setup_rt_frame(int sig, struct emulated_sigaction *ka, 808 +static void setup_rt_frame(int sig, struct target_sigaction *ka,
808 target_siginfo_t *info, 809 target_siginfo_t *info,
809 target_sigset_t *set, CPUX86State *env) 810 target_sigset_t *set, CPUX86State *env)
810 { 811 {
@@ -846,8 +847,8 @@ static void setup_rt_frame(int sig, struct emulated_sigaction *ka, @@ -846,8 +847,8 @@ static void setup_rt_frame(int sig, struct emulated_sigaction *ka,
846 847
847 /* Set up to return from userspace. If provided, use a stub 848 /* Set up to return from userspace. If provided, use a stub
848 already in userspace. */ 849 already in userspace. */
849 - if (ka->sa.sa_flags & TARGET_SA_RESTORER) {  
850 - err |= __put_user(ka->sa.sa_restorer, &frame->pretcode); 850 + if (ka->sa_flags & TARGET_SA_RESTORER) {
  851 + err |= __put_user(ka->sa_restorer, &frame->pretcode);
851 } else { 852 } else {
852 uint16_t val16; 853 uint16_t val16;
853 addr = frame_addr + offsetof(struct rt_sigframe, retcode); 854 addr = frame_addr + offsetof(struct rt_sigframe, retcode);
@@ -864,7 +865,7 @@ static void setup_rt_frame(int sig, struct emulated_sigaction *ka, @@ -864,7 +865,7 @@ static void setup_rt_frame(int sig, struct emulated_sigaction *ka,
864 865
865 /* Set up registers for signal handler */ 866 /* Set up registers for signal handler */
866 env->regs[R_ESP] = frame_addr; 867 env->regs[R_ESP] = frame_addr;
867 - env->eip = ka->sa._sa_handler; 868 + env->eip = ka->_sa_handler;
868 869
869 cpu_x86_load_seg(env, R_DS, __USER_DS); 870 cpu_x86_load_seg(env, R_DS, __USER_DS);
870 cpu_x86_load_seg(env, R_ES, __USER_DS); 871 cpu_x86_load_seg(env, R_ES, __USER_DS);
@@ -879,7 +880,7 @@ static void setup_rt_frame(int sig, struct emulated_sigaction *ka, @@ -879,7 +880,7 @@ static void setup_rt_frame(int sig, struct emulated_sigaction *ka,
879 give_sigsegv: 880 give_sigsegv:
880 unlock_user_struct(frame, frame_addr, 1); 881 unlock_user_struct(frame, frame_addr, 1);
881 if (sig == TARGET_SIGSEGV) 882 if (sig == TARGET_SIGSEGV)
882 - ka->sa._sa_handler = TARGET_SIG_DFL; 883 + ka->_sa_handler = TARGET_SIG_DFL;
883 force_sig(TARGET_SIGSEGV /* , current */); 884 force_sig(TARGET_SIGSEGV /* , current */);
884 } 885 }
885 886
@@ -1122,14 +1123,14 @@ setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/ @@ -1122,14 +1123,14 @@ setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/
1122 } 1123 }
1123 1124
1124 static inline abi_ulong 1125 static inline abi_ulong
1125 -get_sigframe(struct emulated_sigaction *ka, CPUState *regs, int framesize) 1126 +get_sigframe(struct target_sigaction *ka, CPUState *regs, int framesize)
1126 { 1127 {
1127 unsigned long sp = regs->regs[13]; 1128 unsigned long sp = regs->regs[13];
1128 1129
1129 /* 1130 /*
1130 * This is the X/Open sanctioned signal stack switching. 1131 * This is the X/Open sanctioned signal stack switching.
1131 */ 1132 */
1132 - if ((ka->sa.sa_flags & TARGET_SA_ONSTACK) && !sas_ss_flags(sp)) 1133 + if ((ka->sa_flags & TARGET_SA_ONSTACK) && !sas_ss_flags(sp))
1133 sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size; 1134 sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
1134 /* 1135 /*
1135 * ATPCS B01 mandates 8-byte alignment 1136 * ATPCS B01 mandates 8-byte alignment
@@ -1138,19 +1139,19 @@ get_sigframe(struct emulated_sigaction *ka, CPUState *regs, int framesize) @@ -1138,19 +1139,19 @@ get_sigframe(struct emulated_sigaction *ka, CPUState *regs, int framesize)
1138 } 1139 }
1139 1140
1140 static int 1141 static int
1141 -setup_return(CPUState *env, struct emulated_sigaction *ka, 1142 +setup_return(CPUState *env, struct target_sigaction *ka,
1142 abi_ulong *rc, abi_ulong frame_addr, int usig, abi_ulong rc_addr) 1143 abi_ulong *rc, abi_ulong frame_addr, int usig, abi_ulong rc_addr)
1143 { 1144 {
1144 - abi_ulong handler = ka->sa._sa_handler; 1145 + abi_ulong handler = ka->_sa_handler;
1145 abi_ulong retcode; 1146 abi_ulong retcode;
1146 int thumb = handler & 1; 1147 int thumb = handler & 1;
1147 1148
1148 - if (ka->sa.sa_flags & TARGET_SA_RESTORER) {  
1149 - retcode = ka->sa.sa_restorer; 1149 + if (ka->sa_flags & TARGET_SA_RESTORER) {
  1150 + retcode = ka->sa_restorer;
1150 } else { 1151 } else {
1151 unsigned int idx = thumb; 1152 unsigned int idx = thumb;
1152 1153
1153 - if (ka->sa.sa_flags & TARGET_SA_SIGINFO) 1154 + if (ka->sa_flags & TARGET_SA_SIGINFO)
1154 idx += 2; 1155 idx += 2;
1155 1156
1156 if (__put_user(retcodes[idx], rc)) 1157 if (__put_user(retcodes[idx], rc))
@@ -1200,7 +1201,7 @@ static void setup_sigframe_v2(struct target_ucontext_v2 *uc, @@ -1200,7 +1201,7 @@ static void setup_sigframe_v2(struct target_ucontext_v2 *uc,
1200 } 1201 }
1201 1202
1202 /* compare linux/arch/arm/kernel/signal.c:setup_frame() */ 1203 /* compare linux/arch/arm/kernel/signal.c:setup_frame() */
1203 -static void setup_frame_v1(int usig, struct emulated_sigaction *ka, 1204 +static void setup_frame_v1(int usig, struct target_sigaction *ka,
1204 target_sigset_t *set, CPUState *regs) 1205 target_sigset_t *set, CPUState *regs)
1205 { 1206 {
1206 struct sigframe_v1 *frame; 1207 struct sigframe_v1 *frame;
@@ -1224,7 +1225,7 @@ end: @@ -1224,7 +1225,7 @@ end:
1224 unlock_user_struct(frame, frame_addr, 1); 1225 unlock_user_struct(frame, frame_addr, 1);
1225 } 1226 }
1226 1227
1227 -static void setup_frame_v2(int usig, struct emulated_sigaction *ka, 1228 +static void setup_frame_v2(int usig, struct target_sigaction *ka,
1228 target_sigset_t *set, CPUState *regs) 1229 target_sigset_t *set, CPUState *regs)
1229 { 1230 {
1230 struct sigframe_v2 *frame; 1231 struct sigframe_v2 *frame;
@@ -1241,7 +1242,7 @@ static void setup_frame_v2(int usig, struct emulated_sigaction *ka, @@ -1241,7 +1242,7 @@ static void setup_frame_v2(int usig, struct emulated_sigaction *ka,
1241 unlock_user_struct(frame, frame_addr, 1); 1242 unlock_user_struct(frame, frame_addr, 1);
1242 } 1243 }
1243 1244
1244 -static void setup_frame(int usig, struct emulated_sigaction *ka, 1245 +static void setup_frame(int usig, struct target_sigaction *ka,
1245 target_sigset_t *set, CPUState *regs) 1246 target_sigset_t *set, CPUState *regs)
1246 { 1247 {
1247 if (get_osversion() >= 0x020612) { 1248 if (get_osversion() >= 0x020612) {
@@ -1252,7 +1253,7 @@ static void setup_frame(int usig, struct emulated_sigaction *ka, @@ -1252,7 +1253,7 @@ static void setup_frame(int usig, struct emulated_sigaction *ka,
1252 } 1253 }
1253 1254
1254 /* compare linux/arch/arm/kernel/signal.c:setup_rt_frame() */ 1255 /* compare linux/arch/arm/kernel/signal.c:setup_rt_frame() */
1255 -static void setup_rt_frame_v1(int usig, struct emulated_sigaction *ka, 1256 +static void setup_rt_frame_v1(int usig, struct target_sigaction *ka,
1256 target_siginfo_t *info, 1257 target_siginfo_t *info,
1257 target_sigset_t *set, CPUState *env) 1258 target_sigset_t *set, CPUState *env)
1258 { 1259 {
@@ -1296,7 +1297,7 @@ end: @@ -1296,7 +1297,7 @@ end:
1296 unlock_user_struct(frame, frame_addr, 1); 1297 unlock_user_struct(frame, frame_addr, 1);
1297 } 1298 }
1298 1299
1299 -static void setup_rt_frame_v2(int usig, struct emulated_sigaction *ka, 1300 +static void setup_rt_frame_v2(int usig, struct target_sigaction *ka,
1300 target_siginfo_t *info, 1301 target_siginfo_t *info,
1301 target_sigset_t *set, CPUState *env) 1302 target_sigset_t *set, CPUState *env)
1302 { 1303 {
@@ -1322,7 +1323,7 @@ static void setup_rt_frame_v2(int usig, struct emulated_sigaction *ka, @@ -1322,7 +1323,7 @@ static void setup_rt_frame_v2(int usig, struct emulated_sigaction *ka,
1322 unlock_user_struct(frame, frame_addr, 1); 1323 unlock_user_struct(frame, frame_addr, 1);
1323 } 1324 }
1324 1325
1325 -static void setup_rt_frame(int usig, struct emulated_sigaction *ka, 1326 +static void setup_rt_frame(int usig, struct target_sigaction *ka,
1326 target_siginfo_t *info, 1327 target_siginfo_t *info,
1327 target_sigset_t *set, CPUState *env) 1328 target_sigset_t *set, CPUState *env)
1328 { 1329 {
@@ -1650,7 +1651,7 @@ struct target_rt_signal_frame { @@ -1650,7 +1651,7 @@ struct target_rt_signal_frame {
1650 #define UREG_FP UREG_I6 1651 #define UREG_FP UREG_I6
1651 #define UREG_SP UREG_O6 1652 #define UREG_SP UREG_O6
1652 1653
1653 -static inline abi_ulong get_sigframe(struct emulated_sigaction *sa, 1654 +static inline abi_ulong get_sigframe(struct target_sigaction *sa,
1654 CPUState *env, unsigned long framesize) 1655 CPUState *env, unsigned long framesize)
1655 { 1656 {
1656 abi_ulong sp; 1657 abi_ulong sp;
@@ -1658,7 +1659,7 @@ static inline abi_ulong get_sigframe(struct emulated_sigaction *sa, @@ -1658,7 +1659,7 @@ static inline abi_ulong get_sigframe(struct emulated_sigaction *sa,
1658 sp = env->regwptr[UREG_FP]; 1659 sp = env->regwptr[UREG_FP];
1659 1660
1660 /* This is the X/Open sanctioned signal stack switching. */ 1661 /* This is the X/Open sanctioned signal stack switching. */
1661 - if (sa->sa.sa_flags & TARGET_SA_ONSTACK) { 1662 + if (sa->sa_flags & TARGET_SA_ONSTACK) {
1662 if (!on_sig_stack(sp) 1663 if (!on_sig_stack(sp)
1663 && !((target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size) & 7)) 1664 && !((target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size) & 7))
1664 sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size; 1665 sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
@@ -1705,7 +1706,7 @@ setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/ @@ -1705,7 +1706,7 @@ setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/
1705 #endif 1706 #endif
1706 #define NF_ALIGNEDSZ (((sizeof(struct target_signal_frame) + 7) & (~7))) 1707 #define NF_ALIGNEDSZ (((sizeof(struct target_signal_frame) + 7) & (~7)))
1707 1708
1708 -static void setup_frame(int sig, struct emulated_sigaction *ka, 1709 +static void setup_frame(int sig, struct target_sigaction *ka,
1709 target_sigset_t *set, CPUState *env) 1710 target_sigset_t *set, CPUState *env)
1710 { 1711 {
1711 abi_ulong sf_addr; 1712 abi_ulong sf_addr;
@@ -1758,11 +1759,11 @@ static void setup_frame(int sig, struct emulated_sigaction *ka, @@ -1758,11 +1759,11 @@ static void setup_frame(int sig, struct emulated_sigaction *ka,
1758 offsetof(struct target_signal_frame, info); 1759 offsetof(struct target_signal_frame, info);
1759 1760
1760 /* 4. signal handler */ 1761 /* 4. signal handler */
1761 - env->pc = ka->sa._sa_handler; 1762 + env->pc = ka->_sa_handler;
1762 env->npc = (env->pc + 4); 1763 env->npc = (env->pc + 4);
1763 /* 5. return to kernel instructions */ 1764 /* 5. return to kernel instructions */
1764 - if (ka->sa.sa_restorer)  
1765 - env->regwptr[UREG_I7] = ka->sa.sa_restorer; 1765 + if (ka->sa_restorer)
  1766 + env->regwptr[UREG_I7] = ka->sa_restorer;
1766 else { 1767 else {
1767 uint32_t val32; 1768 uint32_t val32;
1768 1769
@@ -1834,7 +1835,7 @@ restore_fpu_state(CPUState *env, qemu_siginfo_fpu_t *fpu) @@ -1834,7 +1835,7 @@ restore_fpu_state(CPUState *env, qemu_siginfo_fpu_t *fpu)
1834 } 1835 }
1835 1836
1836 1837
1837 -static void setup_rt_frame(int sig, struct emulated_sigaction *ka, 1838 +static void setup_rt_frame(int sig, struct target_sigaction *ka,
1838 target_siginfo_t *info, 1839 target_siginfo_t *info,
1839 target_sigset_t *set, CPUState *env) 1840 target_sigset_t *set, CPUState *env)
1840 { 1841 {
@@ -2182,13 +2183,13 @@ void sparc64_get_context(CPUSPARCState *env) @@ -2182,13 +2183,13 @@ void sparc64_get_context(CPUSPARCState *env)
2182 2183
2183 # warning signal handling not implemented 2184 # warning signal handling not implemented
2184 2185
2185 -static void setup_frame(int sig, struct emulated_sigaction *ka, 2186 +static void setup_frame(int sig, struct target_sigaction *ka,
2186 target_sigset_t *set, CPUState *env) 2187 target_sigset_t *set, CPUState *env)
2187 { 2188 {
2188 fprintf(stderr, "setup_frame: not implemented\n"); 2189 fprintf(stderr, "setup_frame: not implemented\n");
2189 } 2190 }
2190 2191
2191 -static void setup_rt_frame(int sig, struct emulated_sigaction *ka, 2192 +static void setup_rt_frame(int sig, struct target_sigaction *ka,
2192 target_siginfo_t *info, 2193 target_siginfo_t *info,
2193 target_sigset_t *set, CPUState *env) 2194 target_sigset_t *set, CPUState *env)
2194 { 2195 {
@@ -2211,13 +2212,13 @@ long do_rt_sigreturn(CPUState *env) @@ -2211,13 +2212,13 @@ long do_rt_sigreturn(CPUState *env)
2211 2212
2212 # warning signal handling not implemented 2213 # warning signal handling not implemented
2213 2214
2214 -static void setup_frame(int sig, struct emulated_sigaction *ka, 2215 +static void setup_frame(int sig, struct target_sigaction *ka,
2215 target_sigset_t *set, CPUState *env) 2216 target_sigset_t *set, CPUState *env)
2216 { 2217 {
2217 fprintf(stderr, "setup_frame: not implemented\n"); 2218 fprintf(stderr, "setup_frame: not implemented\n");
2218 } 2219 }
2219 2220
2220 -static void setup_rt_frame(int sig, struct emulated_sigaction *ka, 2221 +static void setup_rt_frame(int sig, struct target_sigaction *ka,
2221 target_siginfo_t *info, 2222 target_siginfo_t *info,
2222 target_sigset_t *set, CPUState *env) 2223 target_sigset_t *set, CPUState *env)
2223 { 2224 {
@@ -2431,7 +2432,7 @@ restore_sigcontext(CPUState *regs, struct target_sigcontext *sc) @@ -2431,7 +2432,7 @@ restore_sigcontext(CPUState *regs, struct target_sigcontext *sc)
2431 * Determine which stack to use.. 2432 * Determine which stack to use..
2432 */ 2433 */
2433 static inline abi_ulong 2434 static inline abi_ulong
2434 -get_sigframe(struct emulated_sigaction *ka, CPUState *regs, size_t frame_size) 2435 +get_sigframe(struct target_sigaction *ka, CPUState *regs, size_t frame_size)
2435 { 2436 {
2436 unsigned long sp; 2437 unsigned long sp;
2437 2438
@@ -2446,7 +2447,7 @@ get_sigframe(struct emulated_sigaction *ka, CPUState *regs, size_t frame_size) @@ -2446,7 +2447,7 @@ get_sigframe(struct emulated_sigaction *ka, CPUState *regs, size_t frame_size)
2446 sp -= 32; 2447 sp -= 32;
2447 2448
2448 /* This is the X/Open sanctioned signal stack switching. */ 2449 /* This is the X/Open sanctioned signal stack switching. */
2449 - if ((ka->sa.sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags (sp) == 0)) { 2450 + if ((ka->sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags (sp) == 0)) {
2450 sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size; 2451 sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
2451 } 2452 }
2452 2453
@@ -2454,7 +2455,7 @@ get_sigframe(struct emulated_sigaction *ka, CPUState *regs, size_t frame_size) @@ -2454,7 +2455,7 @@ get_sigframe(struct emulated_sigaction *ka, CPUState *regs, size_t frame_size)
2454 } 2455 }
2455 2456
2456 /* compare linux/arch/mips/kernel/signal.c:setup_frame() */ 2457 /* compare linux/arch/mips/kernel/signal.c:setup_frame() */
2457 -static void setup_frame(int sig, struct emulated_sigaction * ka, 2458 +static void setup_frame(int sig, struct target_sigaction * ka,
2458 target_sigset_t *set, CPUState *regs) 2459 target_sigset_t *set, CPUState *regs)
2459 { 2460 {
2460 struct sigframe *frame; 2461 struct sigframe *frame;
@@ -2493,7 +2494,7 @@ static void setup_frame(int sig, struct emulated_sigaction * ka, @@ -2493,7 +2494,7 @@ static void setup_frame(int sig, struct emulated_sigaction * ka,
2493 /* The original kernel code sets CP0_EPC to the handler 2494 /* The original kernel code sets CP0_EPC to the handler
2494 * since it returns to userland using eret 2495 * since it returns to userland using eret
2495 * we cannot do this here, and we must set PC directly */ 2496 * we cannot do this here, and we must set PC directly */
2496 - regs->PC[regs->current_tc] = regs->gpr[regs->current_tc][25] = ka->sa._sa_handler; 2497 + regs->PC[regs->current_tc] = regs->gpr[regs->current_tc][25] = ka->_sa_handler;
2497 unlock_user_struct(frame, frame_addr, 1); 2498 unlock_user_struct(frame, frame_addr, 1);
2498 return; 2499 return;
2499 2500
@@ -2552,7 +2553,7 @@ badframe: @@ -2552,7 +2553,7 @@ badframe:
2552 return 0; 2553 return 0;
2553 } 2554 }
2554 2555
2555 -static void setup_rt_frame(int sig, struct emulated_sigaction *ka, 2556 +static void setup_rt_frame(int sig, struct target_sigaction *ka,
2556 target_siginfo_t *info, 2557 target_siginfo_t *info,
2557 target_sigset_t *set, CPUState *env) 2558 target_sigset_t *set, CPUState *env)
2558 { 2559 {
@@ -2620,10 +2621,10 @@ struct target_rt_sigframe @@ -2620,10 +2621,10 @@ struct target_rt_sigframe
2620 #define MOVW(n) (0x9300|((n)-2)) /* Move mem word at PC+n to R3 */ 2621 #define MOVW(n) (0x9300|((n)-2)) /* Move mem word at PC+n to R3 */
2621 #define TRAP_NOARG 0xc310 /* Syscall w/no args (NR in R3) SH3/4 */ 2622 #define TRAP_NOARG 0xc310 /* Syscall w/no args (NR in R3) SH3/4 */
2622 2623
2623 -static abi_ulong get_sigframe(struct emulated_sigaction *ka, 2624 +static abi_ulong get_sigframe(struct target_sigaction *ka,
2624 unsigned long sp, size_t frame_size) 2625 unsigned long sp, size_t frame_size)
2625 { 2626 {
2626 - if ((ka->sa.sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags(sp) == 0)) { 2627 + if ((ka->sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags(sp) == 0)) {
2627 sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size; 2628 sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
2628 } 2629 }
2629 2630
@@ -2682,7 +2683,7 @@ static int restore_sigcontext(struct CPUState *regs, @@ -2682,7 +2683,7 @@ static int restore_sigcontext(struct CPUState *regs,
2682 return err; 2683 return err;
2683 } 2684 }
2684 2685
2685 -static void setup_frame(int sig, struct emulated_sigaction *ka, 2686 +static void setup_frame(int sig, struct target_sigaction *ka,
2686 target_sigset_t *set, CPUState *regs) 2687 target_sigset_t *set, CPUState *regs)
2687 { 2688 {
2688 struct target_sigframe *frame; 2689 struct target_sigframe *frame;
@@ -2705,8 +2706,8 @@ static void setup_frame(int sig, struct emulated_sigaction *ka, @@ -2705,8 +2706,8 @@ static void setup_frame(int sig, struct emulated_sigaction *ka,
2705 2706
2706 /* Set up to return from userspace. If provided, use a stub 2707 /* Set up to return from userspace. If provided, use a stub
2707 already in userspace. */ 2708 already in userspace. */
2708 - if (ka->sa.sa_flags & TARGET_SA_RESTORER) {  
2709 - regs->pr = (unsigned long) ka->sa.sa_restorer; 2709 + if (ka->sa_flags & TARGET_SA_RESTORER) {
  2710 + regs->pr = (unsigned long) ka->sa_restorer;
2710 } else { 2711 } else {
2711 /* Generate return code (system call to sigreturn) */ 2712 /* Generate return code (system call to sigreturn) */
2712 err |= __put_user(MOVW(2), &frame->retcode[0]); 2713 err |= __put_user(MOVW(2), &frame->retcode[0]);
@@ -2723,7 +2724,7 @@ static void setup_frame(int sig, struct emulated_sigaction *ka, @@ -2723,7 +2724,7 @@ static void setup_frame(int sig, struct emulated_sigaction *ka,
2723 regs->gregs[4] = signal; /* Arg for signal handler */ 2724 regs->gregs[4] = signal; /* Arg for signal handler */
2724 regs->gregs[5] = 0; 2725 regs->gregs[5] = 0;
2725 regs->gregs[6] = (unsigned long) &frame->sc; 2726 regs->gregs[6] = (unsigned long) &frame->sc;
2726 - regs->pc = (unsigned long) ka->sa._sa_handler; 2727 + regs->pc = (unsigned long) ka->_sa_handler;
2727 2728
2728 unlock_user_struct(frame, frame_addr, 1); 2729 unlock_user_struct(frame, frame_addr, 1);
2729 return; 2730 return;
@@ -2733,7 +2734,7 @@ give_sigsegv: @@ -2733,7 +2734,7 @@ give_sigsegv:
2733 force_sig(SIGSEGV); 2734 force_sig(SIGSEGV);
2734 } 2735 }
2735 2736
2736 -static void setup_rt_frame(int sig, struct emulated_sigaction *ka, 2737 +static void setup_rt_frame(int sig, struct target_sigaction *ka,
2737 target_siginfo_t *info, 2738 target_siginfo_t *info,
2738 target_sigset_t *set, CPUState *regs) 2739 target_sigset_t *set, CPUState *regs)
2739 { 2740 {
@@ -2768,8 +2769,8 @@ static void setup_rt_frame(int sig, struct emulated_sigaction *ka, @@ -2768,8 +2769,8 @@ static void setup_rt_frame(int sig, struct emulated_sigaction *ka,
2768 2769
2769 /* Set up to return from userspace. If provided, use a stub 2770 /* Set up to return from userspace. If provided, use a stub
2770 already in userspace. */ 2771 already in userspace. */
2771 - if (ka->sa.sa_flags & TARGET_SA_RESTORER) {  
2772 - regs->pr = (unsigned long) ka->sa.sa_restorer; 2772 + if (ka->sa_flags & TARGET_SA_RESTORER) {
  2773 + regs->pr = (unsigned long) ka->sa_restorer;
2773 } else { 2774 } else {
2774 /* Generate return code (system call to sigreturn) */ 2775 /* Generate return code (system call to sigreturn) */
2775 err |= __put_user(MOVW(2), &frame->retcode[0]); 2776 err |= __put_user(MOVW(2), &frame->retcode[0]);
@@ -2786,7 +2787,7 @@ static void setup_rt_frame(int sig, struct emulated_sigaction *ka, @@ -2786,7 +2787,7 @@ static void setup_rt_frame(int sig, struct emulated_sigaction *ka,
2786 regs->gregs[4] = signal; /* Arg for signal handler */ 2787 regs->gregs[4] = signal; /* Arg for signal handler */
2787 regs->gregs[5] = (unsigned long) &frame->info; 2788 regs->gregs[5] = (unsigned long) &frame->info;
2788 regs->gregs[6] = (unsigned long) &frame->uc; 2789 regs->gregs[6] = (unsigned long) &frame->uc;
2789 - regs->pc = (unsigned long) ka->sa._sa_handler; 2790 + regs->pc = (unsigned long) ka->_sa_handler;
2790 2791
2791 unlock_user_struct(frame, frame_addr, 1); 2792 unlock_user_struct(frame, frame_addr, 1);
2792 return; 2793 return;
@@ -2944,7 +2945,7 @@ static abi_ulong get_sigframe(CPUState *env, int framesize) @@ -2944,7 +2945,7 @@ static abi_ulong get_sigframe(CPUState *env, int framesize)
2944 return sp - framesize; 2945 return sp - framesize;
2945 } 2946 }
2946 2947
2947 -static void setup_frame(int sig, struct emulated_sigaction *ka, 2948 +static void setup_frame(int sig, struct target_sigaction *ka,
2948 target_sigset_t *set, CPUState *env) 2949 target_sigset_t *set, CPUState *env)
2949 { 2950 {
2950 struct target_signal_frame *frame; 2951 struct target_signal_frame *frame;
@@ -2983,7 +2984,7 @@ static void setup_frame(int sig, struct emulated_sigaction *ka, @@ -2983,7 +2984,7 @@ static void setup_frame(int sig, struct emulated_sigaction *ka,
2983 /* Move the stack and setup the arguments for the handler. */ 2984 /* Move the stack and setup the arguments for the handler. */
2984 env->regs[R_SP] = (uint32_t) frame; 2985 env->regs[R_SP] = (uint32_t) frame;
2985 env->regs[10] = sig; 2986 env->regs[10] = sig;
2986 - env->pc = (unsigned long) ka->sa._sa_handler; 2987 + env->pc = (unsigned long) ka->_sa_handler;
2987 /* Link SRP so the guest returns through the trampoline. */ 2988 /* Link SRP so the guest returns through the trampoline. */
2988 env->pregs[PR_SRP] = (uint32_t) &frame->retcode[0]; 2989 env->pregs[PR_SRP] = (uint32_t) &frame->retcode[0];
2989 2990
@@ -2994,7 +2995,7 @@ static void setup_frame(int sig, struct emulated_sigaction *ka, @@ -2994,7 +2995,7 @@ static void setup_frame(int sig, struct emulated_sigaction *ka,
2994 force_sig(TARGET_SIGSEGV); 2995 force_sig(TARGET_SIGSEGV);
2995 } 2996 }
2996 2997
2997 -static void setup_rt_frame(int sig, struct emulated_sigaction *ka, 2998 +static void setup_rt_frame(int sig, struct target_sigaction *ka,
2998 target_siginfo_t *info, 2999 target_siginfo_t *info,
2999 target_sigset_t *set, CPUState *env) 3000 target_sigset_t *set, CPUState *env)
3000 { 3001 {
@@ -3043,13 +3044,13 @@ long do_rt_sigreturn(CPUState *env) @@ -3043,13 +3044,13 @@ long do_rt_sigreturn(CPUState *env)
3043 3044
3044 #else 3045 #else
3045 3046
3046 -static void setup_frame(int sig, struct emulated_sigaction *ka, 3047 +static void setup_frame(int sig, struct target_sigaction *ka,
3047 target_sigset_t *set, CPUState *env) 3048 target_sigset_t *set, CPUState *env)
3048 { 3049 {
3049 fprintf(stderr, "setup_frame: not implemented\n"); 3050 fprintf(stderr, "setup_frame: not implemented\n");
3050 } 3051 }
3051 3052
3052 -static void setup_rt_frame(int sig, struct emulated_sigaction *ka, 3053 +static void setup_rt_frame(int sig, struct target_sigaction *ka,
3053 target_siginfo_t *info, 3054 target_siginfo_t *info,
3054 target_sigset_t *set, CPUState *env) 3055 target_sigset_t *set, CPUState *env)
3055 { 3056 {
@@ -3070,26 +3071,29 @@ long do_rt_sigreturn(CPUState *env) @@ -3070,26 +3071,29 @@ long do_rt_sigreturn(CPUState *env)
3070 3071
3071 #endif 3072 #endif
3072 3073
3073 -void process_pending_signals(void *cpu_env) 3074 +void process_pending_signals(CPUState *cpu_env)
3074 { 3075 {
3075 int sig; 3076 int sig;
3076 abi_ulong handler; 3077 abi_ulong handler;
3077 sigset_t set, old_set; 3078 sigset_t set, old_set;
3078 target_sigset_t target_old_set; 3079 target_sigset_t target_old_set;
3079 - struct emulated_sigaction *k; 3080 + struct emulated_sigtable *k;
  3081 + struct target_sigaction *sa;
3080 struct sigqueue *q; 3082 struct sigqueue *q;
  3083 + TaskState *ts = cpu_env->opaque;
3081 3084
3082 - if (!signal_pending) 3085 + if (!ts->signal_pending)
3083 return; 3086 return;
3084 3087
3085 - k = sigact_table; 3088 + /* FIXME: This is not threadsafe. */
  3089 + k = ts->sigtab;
3086 for(sig = 1; sig <= TARGET_NSIG; sig++) { 3090 for(sig = 1; sig <= TARGET_NSIG; sig++) {
3087 if (k->pending) 3091 if (k->pending)
3088 goto handle_signal; 3092 goto handle_signal;
3089 k++; 3093 k++;
3090 } 3094 }
3091 /* if no signal is pending, just return */ 3095 /* if no signal is pending, just return */
3092 - signal_pending = 0; 3096 + ts->signal_pending = 0;
3093 return; 3097 return;
3094 3098
3095 handle_signal: 3099 handle_signal:
@@ -3108,7 +3112,8 @@ void process_pending_signals(void *cpu_env) @@ -3108,7 +3112,8 @@ void process_pending_signals(void *cpu_env)
3108 abort(); 3112 abort();
3109 } 3113 }
3110 3114
3111 - handler = k->sa._sa_handler; 3115 + sa = &sigact_table[sig - 1];
  3116 + handler = sa->_sa_handler;
3112 if (handler == TARGET_SIG_DFL) { 3117 if (handler == TARGET_SIG_DFL) {
3113 /* default handler : ignore some signal. The other are fatal */ 3118 /* default handler : ignore some signal. The other are fatal */
3114 if (sig != TARGET_SIGCHLD && 3119 if (sig != TARGET_SIGCHLD &&
@@ -3122,10 +3127,10 @@ void process_pending_signals(void *cpu_env) @@ -3122,10 +3127,10 @@ void process_pending_signals(void *cpu_env)
3122 force_sig(sig); 3127 force_sig(sig);
3123 } else { 3128 } else {
3124 /* compute the blocked signals during the handler execution */ 3129 /* compute the blocked signals during the handler execution */
3125 - target_to_host_sigset(&set, &k->sa.sa_mask); 3130 + target_to_host_sigset(&set, &sa->sa_mask);
3126 /* SA_NODEFER indicates that the current signal should not be 3131 /* SA_NODEFER indicates that the current signal should not be
3127 blocked during the handler */ 3132 blocked during the handler */
3128 - if (!(k->sa.sa_flags & TARGET_SA_NODEFER)) 3133 + if (!(sa->sa_flags & TARGET_SA_NODEFER))
3129 sigaddset(&set, target_to_host_signal(sig)); 3134 sigaddset(&set, target_to_host_signal(sig));
3130 3135
3131 /* block signals in the handler using Linux */ 3136 /* block signals in the handler using Linux */
@@ -3143,13 +3148,13 @@ void process_pending_signals(void *cpu_env) @@ -3143,13 +3148,13 @@ void process_pending_signals(void *cpu_env)
3143 } 3148 }
3144 #endif 3149 #endif
3145 /* prepare the stack frame of the virtual CPU */ 3150 /* prepare the stack frame of the virtual CPU */
3146 - if (k->sa.sa_flags & TARGET_SA_SIGINFO)  
3147 - setup_rt_frame(sig, k, &q->info, &target_old_set, cpu_env); 3151 + if (sa->sa_flags & TARGET_SA_SIGINFO)
  3152 + setup_rt_frame(sig, sa, &q->info, &target_old_set, cpu_env);
3148 else 3153 else
3149 - setup_frame(sig, k, &target_old_set, cpu_env);  
3150 - if (k->sa.sa_flags & TARGET_SA_RESETHAND)  
3151 - k->sa._sa_handler = TARGET_SIG_DFL; 3154 + setup_frame(sig, sa, &target_old_set, cpu_env);
  3155 + if (sa->sa_flags & TARGET_SA_RESETHAND)
  3156 + sa->_sa_handler = TARGET_SIG_DFL;
3152 } 3157 }
3153 if (q != &k->info) 3158 if (q != &k->info)
3154 - free_sigqueue(q); 3159 + free_sigqueue(cpu_env, q);
3155 } 3160 }
linux-user/syscall.c
@@ -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)
2736 } 2736 }
2737 #endif 2737 #endif
2738 ts = malloc(sizeof(TaskState) + NEW_STACK_SIZE); 2738 ts = malloc(sizeof(TaskState) + NEW_STACK_SIZE);
2739 - memset(ts, 0, sizeof(TaskState)); 2739 + init_task_state(ts);
2740 new_stack = ts->stack; 2740 new_stack = ts->stack;
2741 - ts->used = 1;  
2742 - /* add in task state list */  
2743 - ts->next = first_task_state;  
2744 - first_task_state = ts;  
2745 /* we create a new CPU instance. */ 2741 /* we create a new CPU instance. */
2746 new_env = cpu_copy(env); 2742 new_env = cpu_copy(env);
2747 /* Init regs that differ from the parent. */ 2743 /* Init regs that differ from the parent. */