26 |
#include <errno.h> |
#include <errno.h> |
27 |
#include <sys/ucontext.h> |
#include <sys/ucontext.h> |
28 |
|
|
|
#ifdef __ia64__ |
|
|
#undef uc_mcontext |
|
|
#undef uc_sigmask |
|
|
#undef uc_stack |
|
|
#undef uc_link |
|
|
#endif |
|
|
|
|
29 |
#include "qemu.h" |
#include "qemu.h" |
30 |
|
|
31 |
//#define DEBUG_SIGNAL |
//#define DEBUG_SIGNAL |
550 |
} target_stack_t; |
} target_stack_t; |
551 |
|
|
552 |
struct target_ucontext { |
struct target_ucontext { |
553 |
target_ulong uc_flags; |
target_ulong tuc_flags; |
554 |
target_ulong uc_link; |
target_ulong tuc_link; |
555 |
target_stack_t uc_stack; |
target_stack_t tuc_stack; |
556 |
struct target_sigcontext uc_mcontext; |
struct target_sigcontext tuc_mcontext; |
557 |
target_sigset_t uc_sigmask; /* mask last for extensibility */ |
target_sigset_t tuc_sigmask; /* mask last for extensibility */ |
558 |
}; |
}; |
559 |
|
|
560 |
struct sigframe |
struct sigframe |
736 |
goto give_sigsegv; |
goto give_sigsegv; |
737 |
|
|
738 |
/* Create the ucontext. */ |
/* Create the ucontext. */ |
739 |
err |= __put_user(0, &frame->uc.uc_flags); |
err |= __put_user(0, &frame->uc.tuc_flags); |
740 |
err |= __put_user(0, &frame->uc.uc_link); |
err |= __put_user(0, &frame->uc.tuc_link); |
741 |
err |= __put_user(/*current->sas_ss_sp*/ 0, &frame->uc.uc_stack.ss_sp); |
err |= __put_user(/*current->sas_ss_sp*/ 0, |
742 |
|
&frame->uc.tuc_stack.ss_sp); |
743 |
err |= __put_user(/* sas_ss_flags(regs->esp) */ 0, |
err |= __put_user(/* sas_ss_flags(regs->esp) */ 0, |
744 |
&frame->uc.uc_stack.ss_flags); |
&frame->uc.tuc_stack.ss_flags); |
745 |
err |= __put_user(/* current->sas_ss_size */ 0, &frame->uc.uc_stack.ss_size); |
err |= __put_user(/* current->sas_ss_size */ 0, |
746 |
err |= setup_sigcontext(&frame->uc.uc_mcontext, &frame->fpstate, |
&frame->uc.tuc_stack.ss_size); |
747 |
|
err |= setup_sigcontext(&frame->uc.tuc_mcontext, &frame->fpstate, |
748 |
env, set->sig[0]); |
env, set->sig[0]); |
749 |
for(i = 0; i < TARGET_NSIG_WORDS; i++) { |
for(i = 0; i < TARGET_NSIG_WORDS; i++) { |
750 |
if (__put_user(set->sig[i], &frame->uc.uc_sigmask.sig[i])) |
if (__put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i])) |
751 |
goto give_sigsegv; |
goto give_sigsegv; |
752 |
} |
} |
753 |
|
|
875 |
if (verify_area(VERIFY_READ, frame, sizeof(*frame))) |
if (verify_area(VERIFY_READ, frame, sizeof(*frame))) |
876 |
goto badframe; |
goto badframe; |
877 |
#endif |
#endif |
878 |
target_to_host_sigset(&set, &frame->uc.uc_sigmask); |
target_to_host_sigset(&set, &frame->uc.tuc_sigmask); |
879 |
sigprocmask(SIG_SETMASK, &set, NULL); |
sigprocmask(SIG_SETMASK, &set, NULL); |
880 |
|
|
881 |
if (restore_sigcontext(env, &frame->uc.uc_mcontext, &eax)) |
if (restore_sigcontext(env, &frame->uc.tuc_mcontext, &eax)) |
882 |
goto badframe; |
goto badframe; |
883 |
|
|
884 |
#if 0 |
#if 0 |
885 |
if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st))) |
if (__copy_from_user(&st, &frame->uc.tuc_stack, sizeof(st))) |
886 |
goto badframe; |
goto badframe; |
887 |
/* It is more difficult to avoid calling this function than to |
/* It is more difficult to avoid calling this function than to |
888 |
call it and ignore errors. */ |
call it and ignore errors. */ |
928 |
} target_stack_t; |
} target_stack_t; |
929 |
|
|
930 |
struct target_ucontext { |
struct target_ucontext { |
931 |
target_ulong uc_flags; |
target_ulong tuc_flags; |
932 |
target_ulong uc_link; |
target_ulong tuc_link; |
933 |
target_stack_t uc_stack; |
target_stack_t tuc_stack; |
934 |
struct target_sigcontext uc_mcontext; |
struct target_sigcontext tuc_mcontext; |
935 |
target_sigset_t uc_sigmask; /* mask last for extensibility */ |
target_sigset_t tuc_sigmask; /* mask last for extensibility */ |
936 |
}; |
}; |
937 |
|
|
938 |
struct sigframe |
struct sigframe |
1130 |
/* Clear all the bits of the ucontext we don't use. */ |
/* Clear all the bits of the ucontext we don't use. */ |
1131 |
err |= __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext)); |
err |= __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext)); |
1132 |
|
|
1133 |
err |= setup_sigcontext(&frame->uc.uc_mcontext, /*&frame->fpstate,*/ |
err |= setup_sigcontext(&frame->uc.tuc_mcontext, /*&frame->fpstate,*/ |
1134 |
env, set->sig[0]); |
env, set->sig[0]); |
1135 |
for(i = 0; i < TARGET_NSIG_WORDS; i++) { |
for(i = 0; i < TARGET_NSIG_WORDS; i++) { |
1136 |
if (__put_user(set->sig[i], &frame->uc.uc_sigmask.sig[i])) |
if (__put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i])) |
1137 |
return; |
return; |
1138 |
} |
} |
1139 |
|
|
1248 |
if (verify_area(VERIFY_READ, frame, sizeof (*frame))) |
if (verify_area(VERIFY_READ, frame, sizeof (*frame))) |
1249 |
goto badframe; |
goto badframe; |
1250 |
#endif |
#endif |
1251 |
target_to_host_sigset(&host_set, &frame->uc.uc_sigmask); |
target_to_host_sigset(&host_set, &frame->uc.tuc_sigmask); |
1252 |
sigprocmask(SIG_SETMASK, &host_set, NULL); |
sigprocmask(SIG_SETMASK, &host_set, NULL); |
1253 |
|
|
1254 |
if (restore_sigcontext(env, &frame->uc.uc_mcontext)) |
if (restore_sigcontext(env, &frame->uc.tuc_mcontext)) |
1255 |
goto badframe; |
goto badframe; |
1256 |
|
|
1257 |
#if 0 |
#if 0 |