Revision b8076a74 linux-user/signal.c
b/linux-user/signal.c | ||
---|---|---|
26 | 26 |
#include <errno.h> |
27 | 27 |
#include <sys/ucontext.h> |
28 | 28 |
|
29 |
#ifdef __ia64__ |
|
30 |
#undef uc_mcontext |
|
31 |
#undef uc_sigmask |
|
32 |
#undef uc_stack |
|
33 |
#undef uc_link |
|
34 |
#endif |
|
35 |
|
|
36 | 29 |
#include "qemu.h" |
37 | 30 |
|
38 | 31 |
//#define DEBUG_SIGNAL |
... | ... | |
557 | 550 |
} target_stack_t; |
558 | 551 |
|
559 | 552 |
struct target_ucontext { |
560 |
target_ulong uc_flags; |
|
561 |
target_ulong uc_link; |
|
562 |
target_stack_t uc_stack; |
|
563 |
struct target_sigcontext uc_mcontext; |
|
564 |
target_sigset_t uc_sigmask; /* mask last for extensibility */ |
|
553 |
target_ulong tuc_flags;
|
|
554 |
target_ulong tuc_link;
|
|
555 |
target_stack_t tuc_stack;
|
|
556 |
struct target_sigcontext tuc_mcontext;
|
|
557 |
target_sigset_t tuc_sigmask; /* mask last for extensibility */
|
|
565 | 558 |
}; |
566 | 559 |
|
567 | 560 |
struct sigframe |
... | ... | |
743 | 736 |
goto give_sigsegv; |
744 | 737 |
|
745 | 738 |
/* Create the ucontext. */ |
746 |
err |= __put_user(0, &frame->uc.uc_flags); |
|
747 |
err |= __put_user(0, &frame->uc.uc_link); |
|
748 |
err |= __put_user(/*current->sas_ss_sp*/ 0, &frame->uc.uc_stack.ss_sp); |
|
739 |
err |= __put_user(0, &frame->uc.tuc_flags); |
|
740 |
err |= __put_user(0, &frame->uc.tuc_link); |
|
741 |
err |= __put_user(/*current->sas_ss_sp*/ 0, |
|
742 |
&frame->uc.tuc_stack.ss_sp); |
|
749 | 743 |
err |= __put_user(/* sas_ss_flags(regs->esp) */ 0, |
750 |
&frame->uc.uc_stack.ss_flags); |
|
751 |
err |= __put_user(/* current->sas_ss_size */ 0, &frame->uc.uc_stack.ss_size); |
|
752 |
err |= setup_sigcontext(&frame->uc.uc_mcontext, &frame->fpstate, |
|
744 |
&frame->uc.tuc_stack.ss_flags); |
|
745 |
err |= __put_user(/* current->sas_ss_size */ 0, |
|
746 |
&frame->uc.tuc_stack.ss_size); |
|
747 |
err |= setup_sigcontext(&frame->uc.tuc_mcontext, &frame->fpstate, |
|
753 | 748 |
env, set->sig[0]); |
754 | 749 |
for(i = 0; i < TARGET_NSIG_WORDS; i++) { |
755 |
if (__put_user(set->sig[i], &frame->uc.uc_sigmask.sig[i])) |
|
750 |
if (__put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]))
|
|
756 | 751 |
goto give_sigsegv; |
757 | 752 |
} |
758 | 753 |
|
... | ... | |
880 | 875 |
if (verify_area(VERIFY_READ, frame, sizeof(*frame))) |
881 | 876 |
goto badframe; |
882 | 877 |
#endif |
883 |
target_to_host_sigset(&set, &frame->uc.uc_sigmask); |
|
878 |
target_to_host_sigset(&set, &frame->uc.tuc_sigmask);
|
|
884 | 879 |
sigprocmask(SIG_SETMASK, &set, NULL); |
885 | 880 |
|
886 |
if (restore_sigcontext(env, &frame->uc.uc_mcontext, &eax)) |
|
881 |
if (restore_sigcontext(env, &frame->uc.tuc_mcontext, &eax))
|
|
887 | 882 |
goto badframe; |
888 | 883 |
|
889 | 884 |
#if 0 |
890 |
if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st))) |
|
885 |
if (__copy_from_user(&st, &frame->uc.tuc_stack, sizeof(st)))
|
|
891 | 886 |
goto badframe; |
892 | 887 |
/* It is more difficult to avoid calling this function than to |
893 | 888 |
call it and ignore errors. */ |
... | ... | |
933 | 928 |
} target_stack_t; |
934 | 929 |
|
935 | 930 |
struct target_ucontext { |
936 |
target_ulong uc_flags; |
|
937 |
target_ulong uc_link; |
|
938 |
target_stack_t uc_stack; |
|
939 |
struct target_sigcontext uc_mcontext; |
|
940 |
target_sigset_t uc_sigmask; /* mask last for extensibility */ |
|
931 |
target_ulong tuc_flags;
|
|
932 |
target_ulong tuc_link;
|
|
933 |
target_stack_t tuc_stack;
|
|
934 |
struct target_sigcontext tuc_mcontext;
|
|
935 |
target_sigset_t tuc_sigmask; /* mask last for extensibility */
|
|
941 | 936 |
}; |
942 | 937 |
|
943 | 938 |
struct sigframe |
... | ... | |
1135 | 1130 |
/* Clear all the bits of the ucontext we don't use. */ |
1136 | 1131 |
err |= __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext)); |
1137 | 1132 |
|
1138 |
err |= setup_sigcontext(&frame->uc.uc_mcontext, /*&frame->fpstate,*/ |
|
1133 |
err |= setup_sigcontext(&frame->uc.tuc_mcontext, /*&frame->fpstate,*/
|
|
1139 | 1134 |
env, set->sig[0]); |
1140 | 1135 |
for(i = 0; i < TARGET_NSIG_WORDS; i++) { |
1141 |
if (__put_user(set->sig[i], &frame->uc.uc_sigmask.sig[i])) |
|
1136 |
if (__put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]))
|
|
1142 | 1137 |
return; |
1143 | 1138 |
} |
1144 | 1139 |
|
... | ... | |
1253 | 1248 |
if (verify_area(VERIFY_READ, frame, sizeof (*frame))) |
1254 | 1249 |
goto badframe; |
1255 | 1250 |
#endif |
1256 |
target_to_host_sigset(&host_set, &frame->uc.uc_sigmask); |
|
1251 |
target_to_host_sigset(&host_set, &frame->uc.tuc_sigmask);
|
|
1257 | 1252 |
sigprocmask(SIG_SETMASK, &host_set, NULL); |
1258 | 1253 |
|
1259 |
if (restore_sigcontext(env, &frame->uc.uc_mcontext)) |
|
1254 |
if (restore_sigcontext(env, &frame->uc.tuc_mcontext))
|
|
1260 | 1255 |
goto badframe; |
1261 | 1256 |
|
1262 | 1257 |
#if 0 |
Also available in: Unified diff