Revision f711df67
b/linux-user/signal.c | ||
---|---|---|
3071 | 3071 |
}; |
3072 | 3072 |
|
3073 | 3073 |
struct target_ucontext { |
3074 |
abi_ulong uc_flags; |
|
3075 |
abi_ulong uc_link; |
|
3076 |
struct target_stack_t uc_stack; |
|
3077 |
struct target_sigcontext sc;
|
|
3078 |
uint32_t extramask[TARGET_NSIG_WORDS - 1]; |
|
3074 |
abi_ulong tuc_flags;
|
|
3075 |
abi_ulong tuc_link;
|
|
3076 |
struct target_stack_t tuc_stack;
|
|
3077 |
struct target_sigcontext tuc_mcontext;
|
|
3078 |
uint32_t tuc_extramask[TARGET_NSIG_WORDS - 1];
|
|
3079 | 3079 |
}; |
3080 | 3080 |
|
3081 | 3081 |
/* Signal frames. */ |
... | ... | |
3189 | 3189 |
goto badframe; |
3190 | 3190 |
|
3191 | 3191 |
/* Save the mask. */ |
3192 |
err |= __put_user(set->sig[0], &frame->uc.sc.oldmask);
|
|
3192 |
err |= __put_user(set->sig[0], &frame->uc.tuc_mcontext.oldmask);
|
|
3193 | 3193 |
if (err) |
3194 | 3194 |
goto badframe; |
3195 | 3195 |
|
... | ... | |
3198 | 3198 |
goto badframe; |
3199 | 3199 |
} |
3200 | 3200 |
|
3201 |
setup_sigcontext(&frame->uc.sc, env);
|
|
3201 |
setup_sigcontext(&frame->uc.tuc_mcontext, env);
|
|
3202 | 3202 |
|
3203 | 3203 |
/* Set up to return from userspace. If provided, use a stub |
3204 | 3204 |
already in userspace. */ |
... | ... | |
3261 | 3261 |
goto badframe; |
3262 | 3262 |
|
3263 | 3263 |
/* Restore blocked signals */ |
3264 |
if (__get_user(target_set.sig[0], &frame->uc.sc.oldmask))
|
|
3264 |
if (__get_user(target_set.sig[0], &frame->uc.tuc_mcontext.oldmask))
|
|
3265 | 3265 |
goto badframe; |
3266 | 3266 |
for(i = 1; i < TARGET_NSIG_WORDS; i++) { |
3267 | 3267 |
if (__get_user(target_set.sig[i], &frame->extramask[i - 1])) |
... | ... | |
3270 | 3270 |
target_to_host_sigset_internal(&set, &target_set); |
3271 | 3271 |
sigprocmask(SIG_SETMASK, &set, NULL); |
3272 | 3272 |
|
3273 |
restore_sigcontext(&frame->uc.sc, env);
|
|
3273 |
restore_sigcontext(&frame->uc.tuc_mcontext, env);
|
|
3274 | 3274 |
/* We got here through a sigreturn syscall, our path back is via an |
3275 | 3275 |
rtb insn so setup r14 for that. */ |
3276 | 3276 |
env->regs[14] = env->sregs[SR_PC]; |
Also available in: Unified diff