Revision 6fea2ea4 linux-user/signal.c
b/linux-user/signal.c | ||
---|---|---|
3662 | 3662 |
} sigframe; |
3663 | 3663 |
|
3664 | 3664 |
struct target_ucontext { |
3665 |
target_ulong uc_flags; |
|
3666 |
struct target_ucontext *uc_link; |
|
3667 |
target_stack_t uc_stack; |
|
3668 |
target_sigregs uc_mcontext; |
|
3669 |
target_sigset_t uc_sigmask; /* mask last for extensibility */ |
|
3665 |
target_ulong tuc_flags;
|
|
3666 |
struct target_ucontext *tuc_link;
|
|
3667 |
target_stack_t tuc_stack;
|
|
3668 |
target_sigregs tuc_mcontext;
|
|
3669 |
target_sigset_t tuc_sigmask; /* mask last for extensibility */
|
|
3670 | 3670 |
}; |
3671 | 3671 |
|
3672 | 3672 |
typedef struct { |
... | ... | |
3814 | 3814 |
} |
3815 | 3815 |
|
3816 | 3816 |
/* Create the ucontext. */ |
3817 |
__put_user(0, &frame->uc.uc_flags); |
|
3818 |
__put_user((abi_ulong)0, (abi_ulong *)&frame->uc.uc_link); |
|
3819 |
__put_user(target_sigaltstack_used.ss_sp, &frame->uc.uc_stack.ss_sp); |
|
3817 |
__put_user(0, &frame->uc.tuc_flags);
|
|
3818 |
__put_user((abi_ulong)0, (abi_ulong *)&frame->uc.tuc_link);
|
|
3819 |
__put_user(target_sigaltstack_used.ss_sp, &frame->uc.tuc_stack.ss_sp);
|
|
3820 | 3820 |
__put_user(sas_ss_flags(get_sp_from_cpustate(env)), |
3821 |
&frame->uc.uc_stack.ss_flags); |
|
3822 |
__put_user(target_sigaltstack_used.ss_size, &frame->uc.uc_stack.ss_size); |
|
3823 |
save_sigregs(env, &frame->uc.uc_mcontext); |
|
3821 |
&frame->uc.tuc_stack.ss_flags);
|
|
3822 |
__put_user(target_sigaltstack_used.ss_size, &frame->uc.tuc_stack.ss_size);
|
|
3823 |
save_sigregs(env, &frame->uc.tuc_mcontext);
|
|
3824 | 3824 |
for (i = 0; i < TARGET_NSIG_WORDS; i++) { |
3825 | 3825 |
__put_user((abi_ulong)set->sig[i], |
3826 |
(abi_ulong *)&frame->uc.uc_sigmask.sig[i]); |
|
3826 |
(abi_ulong *)&frame->uc.tuc_sigmask.sig[i]);
|
|
3827 | 3827 |
} |
3828 | 3828 |
|
3829 | 3829 |
/* Set up to return from userspace. If provided, use a stub |
... | ... | |
3928 | 3928 |
if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) { |
3929 | 3929 |
goto badframe; |
3930 | 3930 |
} |
3931 |
target_to_host_sigset(&set, &frame->uc.uc_sigmask); |
|
3931 |
target_to_host_sigset(&set, &frame->uc.tuc_sigmask);
|
|
3932 | 3932 |
|
3933 | 3933 |
sigprocmask(SIG_SETMASK, &set, NULL); /* ~_BLOCKABLE? */ |
3934 | 3934 |
|
3935 |
if (restore_sigregs(env, &frame->uc.uc_mcontext)) { |
|
3935 |
if (restore_sigregs(env, &frame->uc.tuc_mcontext)) {
|
|
3936 | 3936 |
goto badframe; |
3937 | 3937 |
} |
3938 | 3938 |
|
3939 |
if (do_sigaltstack(frame_addr + offsetof(rt_sigframe, uc.uc_stack), 0, |
|
3939 |
if (do_sigaltstack(frame_addr + offsetof(rt_sigframe, uc.tuc_stack), 0,
|
|
3940 | 3940 |
get_sp_from_cpustate(env)) == -EFAULT) { |
3941 | 3941 |
goto badframe; |
3942 | 3942 |
} |
Also available in: Unified diff