2 * arch/sh/kernel/signal_64.c
4 * Copyright (C) 2000, 2001 Paolo Alberelli
5 * Copyright (C) 2003 Paul Mundt
6 * Copyright (C) 2004 Richard Curnow
8 * This file is subject to the terms and conditions of the GNU General Public
9 * License. See the file "COPYING" in the main directory of this archive
12 #include <linux/rwsem.h>
13 #include <linux/sched.h>
15 #include <linux/smp.h>
16 #include <linux/kernel.h>
17 #include <linux/signal.h>
18 #include <linux/errno.h>
19 #include <linux/wait.h>
20 #include <linux/personality.h>
21 #include <linux/freezer.h>
22 #include <linux/ptrace.h>
23 #include <linux/unistd.h>
24 #include <linux/stddef.h>
25 #include <linux/tracehook.h>
26 #include <asm/ucontext.h>
27 #include <asm/uaccess.h>
28 #include <asm/pgtable.h>
29 #include <asm/cacheflush.h>
38 #define REF_REG_RET regs->regs[REG_RET]
39 #define REF_REG_SP regs->regs[REG_SP]
40 #define DEREF_REG_PR regs->regs[REG_PR]
44 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
47 handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
48 sigset_t *oldset, struct pt_regs * regs);
51 * Note that 'init' is a special process: it doesn't get signals it doesn't
52 * want to handle. Thus you cannot kill init even with a SIGKILL even by
55 * Note that we go through the signals twice: once to check the signals that
56 * the kernel can handle, and then we build all the user-level signal handling
57 * stack-frames in one go after that.
59 static int do_signal(struct pt_regs *regs, sigset_t *oldset)
63 struct k_sigaction ka;
66 * We want the common case to go fast, which
67 * is why we may in certain cases get here from
68 * kernel mode. Just return without doing anything
77 if (test_thread_flag(TIF_RESTORE_SIGMASK))
78 oldset = ¤t->saved_sigmask;
80 oldset = ¤t->blocked;
82 signr = get_signal_to_deliver(&info, &ka, regs, 0);
85 /* Whee! Actually deliver the signal. */
86 handle_signal(signr, &info, &ka, oldset, regs);
89 * If a signal was successfully delivered, the saved sigmask
90 * is in its frame, and we can clear the TIF_RESTORE_SIGMASK
93 if (test_thread_flag(TIF_RESTORE_SIGMASK))
94 clear_thread_flag(TIF_RESTORE_SIGMASK);
96 tracehook_signal_handler(signr, &info, &ka, regs, 0);
101 /* Did we come from a system call? */
102 if (regs->syscall_nr >= 0) {
103 /* Restart the system call - no handlers present */
104 switch (regs->regs[REG_RET]) {
105 case -ERESTARTNOHAND:
107 case -ERESTARTNOINTR:
108 /* Decode Syscall # */
109 regs->regs[REG_RET] = regs->syscall_nr;
113 case -ERESTART_RESTARTBLOCK:
114 regs->regs[REG_RET] = __NR_restart_syscall;
120 /* No signal to deliver -- put the saved sigmask back */
121 if (test_thread_flag(TIF_RESTORE_SIGMASK)) {
122 clear_thread_flag(TIF_RESTORE_SIGMASK);
123 sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL);
130 * Atomically swap in the new signal mask, and wait for a signal.
134 sys_sigsuspend(old_sigset_t mask,
135 unsigned long r3, unsigned long r4, unsigned long r5,
136 unsigned long r6, unsigned long r7,
137 struct pt_regs * regs)
142 spin_lock_irq(¤t->sighand->siglock);
143 saveset = current->blocked;
144 siginitset(¤t->blocked, mask);
146 spin_unlock_irq(¤t->sighand->siglock);
148 REF_REG_RET = -EINTR;
150 current->state = TASK_INTERRUPTIBLE;
152 regs->pc += 4; /* because sys_sigreturn decrements the pc */
153 if (do_signal(regs, &saveset)) {
154 /* pc now points at signal handler. Need to decrement
155 it because entry.S will increment it. */
163 sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize,
164 unsigned long r4, unsigned long r5, unsigned long r6,
166 struct pt_regs * regs)
168 sigset_t saveset, newset;
170 /* XXX: Don't preclude handling different sized sigset_t's. */
171 if (sigsetsize != sizeof(sigset_t))
174 if (copy_from_user(&newset, unewset, sizeof(newset)))
176 sigdelsetmask(&newset, ~_BLOCKABLE);
177 spin_lock_irq(¤t->sighand->siglock);
178 saveset = current->blocked;
179 current->blocked = newset;
181 spin_unlock_irq(¤t->sighand->siglock);
183 REF_REG_RET = -EINTR;
185 current->state = TASK_INTERRUPTIBLE;
187 regs->pc += 4; /* because sys_sigreturn decrements the pc */
188 if (do_signal(regs, &saveset)) {
189 /* pc now points at signal handler. Need to decrement
190 it because entry.S will increment it. */
198 sys_sigaction(int sig, const struct old_sigaction __user *act,
199 struct old_sigaction __user *oact)
201 struct k_sigaction new_ka, old_ka;
206 if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
207 __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
208 __get_user(new_ka.sa.sa_restorer, &act->sa_restorer))
210 __get_user(new_ka.sa.sa_flags, &act->sa_flags);
211 __get_user(mask, &act->sa_mask);
212 siginitset(&new_ka.sa.sa_mask, mask);
215 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
218 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
219 __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
220 __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer))
222 __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
223 __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
230 sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
231 unsigned long r4, unsigned long r5, unsigned long r6,
233 struct pt_regs * regs)
235 return do_sigaltstack(uss, uoss, REF_REG_SP);
240 * Do a signal return; undo the signal stack.
245 struct sigcontext sc;
246 unsigned long extramask[_NSIG_WORDS-1];
247 long long retcode[2];
252 struct siginfo __user *pinfo;
256 long long retcode[2];
261 restore_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc)
266 err |= __get_user (fpvalid, &sc->sc_fpvalid);
267 conditional_used_math(fpvalid);
271 if (current == last_task_used_math) {
272 last_task_used_math = NULL;
276 err |= __copy_from_user(¤t->thread.fpu.hard, &sc->sc_fpregs[0],
277 (sizeof(long long) * 32) + (sizeof(int) * 1));
283 setup_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc)
288 fpvalid = !!used_math();
289 err |= __put_user(fpvalid, &sc->sc_fpvalid);
293 if (current == last_task_used_math) {
295 save_fpu(current, regs);
297 last_task_used_math = NULL;
301 err |= __copy_to_user(&sc->sc_fpregs[0], ¤t->thread.fpu.hard,
302 (sizeof(long long) * 32) + (sizeof(int) * 1));
309 restore_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc)
314 setup_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc)
321 restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, long long *r2_p)
323 unsigned int err = 0;
324 unsigned long long current_sr, new_sr;
325 #define SR_MASK 0xffff8cfd
327 #define COPY(x) err |= __get_user(regs->x, &sc->sc_##x)
329 COPY(regs[0]); COPY(regs[1]); COPY(regs[2]); COPY(regs[3]);
330 COPY(regs[4]); COPY(regs[5]); COPY(regs[6]); COPY(regs[7]);
331 COPY(regs[8]); COPY(regs[9]); COPY(regs[10]); COPY(regs[11]);
332 COPY(regs[12]); COPY(regs[13]); COPY(regs[14]); COPY(regs[15]);
333 COPY(regs[16]); COPY(regs[17]); COPY(regs[18]); COPY(regs[19]);
334 COPY(regs[20]); COPY(regs[21]); COPY(regs[22]); COPY(regs[23]);
335 COPY(regs[24]); COPY(regs[25]); COPY(regs[26]); COPY(regs[27]);
336 COPY(regs[28]); COPY(regs[29]); COPY(regs[30]); COPY(regs[31]);
337 COPY(regs[32]); COPY(regs[33]); COPY(regs[34]); COPY(regs[35]);
338 COPY(regs[36]); COPY(regs[37]); COPY(regs[38]); COPY(regs[39]);
339 COPY(regs[40]); COPY(regs[41]); COPY(regs[42]); COPY(regs[43]);
340 COPY(regs[44]); COPY(regs[45]); COPY(regs[46]); COPY(regs[47]);
341 COPY(regs[48]); COPY(regs[49]); COPY(regs[50]); COPY(regs[51]);
342 COPY(regs[52]); COPY(regs[53]); COPY(regs[54]); COPY(regs[55]);
343 COPY(regs[56]); COPY(regs[57]); COPY(regs[58]); COPY(regs[59]);
344 COPY(regs[60]); COPY(regs[61]); COPY(regs[62]);
345 COPY(tregs[0]); COPY(tregs[1]); COPY(tregs[2]); COPY(tregs[3]);
346 COPY(tregs[4]); COPY(tregs[5]); COPY(tregs[6]); COPY(tregs[7]);
348 /* Prevent the signal handler manipulating SR in a way that can
349 crash the kernel. i.e. only allow S, Q, M, PR, SZ, FR to be
351 current_sr = regs->sr;
352 err |= __get_user(new_sr, &sc->sc_sr);
354 regs->sr |= (new_sr & ~SR_MASK);
360 /* Must do this last in case it sets regs->sr.fd (i.e. after rest of sr
361 * has been restored above.) */
362 err |= restore_sigcontext_fpu(regs, sc);
364 regs->syscall_nr = -1; /* disable syscall checks */
365 err |= __get_user(*r2_p, &sc->sc_regs[REG_RET]);
369 asmlinkage int sys_sigreturn(unsigned long r2, unsigned long r3,
370 unsigned long r4, unsigned long r5,
371 unsigned long r6, unsigned long r7,
372 struct pt_regs * regs)
374 struct sigframe __user *frame = (struct sigframe __user *) (long) REF_REG_SP;
378 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
381 if (__get_user(set.sig[0], &frame->sc.oldmask)
383 && __copy_from_user(&set.sig[1], &frame->extramask,
384 sizeof(frame->extramask))))
387 sigdelsetmask(&set, ~_BLOCKABLE);
389 spin_lock_irq(¤t->sighand->siglock);
390 current->blocked = set;
392 spin_unlock_irq(¤t->sighand->siglock);
394 if (restore_sigcontext(regs, &frame->sc, &ret))
401 force_sig(SIGSEGV, current);
405 asmlinkage int sys_rt_sigreturn(unsigned long r2, unsigned long r3,
406 unsigned long r4, unsigned long r5,
407 unsigned long r6, unsigned long r7,
408 struct pt_regs * regs)
410 struct rt_sigframe __user *frame = (struct rt_sigframe __user *) (long) REF_REG_SP;
415 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
418 if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
421 sigdelsetmask(&set, ~_BLOCKABLE);
422 spin_lock_irq(¤t->sighand->siglock);
423 current->blocked = set;
425 spin_unlock_irq(¤t->sighand->siglock);
427 if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ret))
431 if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st)))
433 /* It is more difficult to avoid calling this function than to
434 call it and ignore errors. */
435 do_sigaltstack(&st, NULL, REF_REG_SP);
440 force_sig(SIGSEGV, current);
445 * Set up a signal frame.
449 setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
454 /* Do this first, otherwise is this sets sr->fd, that value isn't preserved. */
455 err |= setup_sigcontext_fpu(regs, sc);
457 #define COPY(x) err |= __put_user(regs->x, &sc->sc_##x)
459 COPY(regs[0]); COPY(regs[1]); COPY(regs[2]); COPY(regs[3]);
460 COPY(regs[4]); COPY(regs[5]); COPY(regs[6]); COPY(regs[7]);
461 COPY(regs[8]); COPY(regs[9]); COPY(regs[10]); COPY(regs[11]);
462 COPY(regs[12]); COPY(regs[13]); COPY(regs[14]); COPY(regs[15]);
463 COPY(regs[16]); COPY(regs[17]); COPY(regs[18]); COPY(regs[19]);
464 COPY(regs[20]); COPY(regs[21]); COPY(regs[22]); COPY(regs[23]);
465 COPY(regs[24]); COPY(regs[25]); COPY(regs[26]); COPY(regs[27]);
466 COPY(regs[28]); COPY(regs[29]); COPY(regs[30]); COPY(regs[31]);
467 COPY(regs[32]); COPY(regs[33]); COPY(regs[34]); COPY(regs[35]);
468 COPY(regs[36]); COPY(regs[37]); COPY(regs[38]); COPY(regs[39]);
469 COPY(regs[40]); COPY(regs[41]); COPY(regs[42]); COPY(regs[43]);
470 COPY(regs[44]); COPY(regs[45]); COPY(regs[46]); COPY(regs[47]);
471 COPY(regs[48]); COPY(regs[49]); COPY(regs[50]); COPY(regs[51]);
472 COPY(regs[52]); COPY(regs[53]); COPY(regs[54]); COPY(regs[55]);
473 COPY(regs[56]); COPY(regs[57]); COPY(regs[58]); COPY(regs[59]);
474 COPY(regs[60]); COPY(regs[61]); COPY(regs[62]);
475 COPY(tregs[0]); COPY(tregs[1]); COPY(tregs[2]); COPY(tregs[3]);
476 COPY(tregs[4]); COPY(tregs[5]); COPY(tregs[6]); COPY(tregs[7]);
481 err |= __put_user(mask, &sc->oldmask);
487 * Determine which stack to use..
489 static inline void __user *
490 get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size)
492 if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && ! sas_ss_flags(sp))
493 sp = current->sas_ss_sp + current->sas_ss_size;
495 return (void __user *)((sp - frame_size) & -8ul);
498 void sa_default_restorer(void); /* See comments below */
499 void sa_default_rt_restorer(void); /* See comments below */
501 static void setup_frame(int sig, struct k_sigaction *ka,
502 sigset_t *set, struct pt_regs *regs)
504 struct sigframe __user *frame;
508 frame = get_sigframe(ka, regs->regs[REG_SP], sizeof(*frame));
510 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
513 signal = current_thread_info()->exec_domain
514 && current_thread_info()->exec_domain->signal_invmap
516 ? current_thread_info()->exec_domain->signal_invmap[sig]
519 err |= setup_sigcontext(&frame->sc, regs, set->sig[0]);
521 /* Give up earlier as i386, in case */
525 if (_NSIG_WORDS > 1) {
526 err |= __copy_to_user(frame->extramask, &set->sig[1],
527 sizeof(frame->extramask)); }
529 /* Give up earlier as i386, in case */
533 /* Set up to return from userspace. If provided, use a stub
534 already in userspace. */
535 if (ka->sa.sa_flags & SA_RESTORER) {
536 DEREF_REG_PR = (unsigned long) ka->sa.sa_restorer | 0x1;
539 * On SH5 all edited pointers are subject to NEFF
541 DEREF_REG_PR = (DEREF_REG_PR & NEFF_SIGN) ?
542 (DEREF_REG_PR | NEFF_MASK) : DEREF_REG_PR;
545 * Different approach on SH5.
546 * . Endianness independent asm code gets placed in entry.S .
547 * This is limited to four ASM instructions corresponding
548 * to two long longs in size.
549 * . err checking is done on the else branch only
550 * . flush_icache_range() is called upon __put_user() only
551 * . all edited pointers are subject to NEFF
552 * . being code, linker turns ShMedia bit on, always
553 * dereference index -1.
555 DEREF_REG_PR = (unsigned long) frame->retcode | 0x01;
556 DEREF_REG_PR = (DEREF_REG_PR & NEFF_SIGN) ?
557 (DEREF_REG_PR | NEFF_MASK) : DEREF_REG_PR;
559 if (__copy_to_user(frame->retcode,
560 (unsigned long long)sa_default_restorer & (~1), 16) != 0)
563 /* Cohere the trampoline with the I-cache. */
564 flush_cache_sigtramp(DEREF_REG_PR-1);
568 * Set up registers for signal handler.
569 * All edited pointers are subject to NEFF.
571 regs->regs[REG_SP] = (unsigned long) frame;
572 regs->regs[REG_SP] = (regs->regs[REG_SP] & NEFF_SIGN) ?
573 (regs->regs[REG_SP] | NEFF_MASK) : regs->regs[REG_SP];
574 regs->regs[REG_ARG1] = signal; /* Arg for signal handler */
577 The glibc profiling support for SH-5 needs to be passed a sigcontext
578 so it can retrieve the PC. At some point during 2003 the glibc
579 support was changed to receive the sigcontext through the 2nd
580 argument, but there are still versions of libc.so in use that use
581 the 3rd argument. Until libc.so is stabilised, pass the sigcontext
582 through both 2nd and 3rd arguments.
585 regs->regs[REG_ARG2] = (unsigned long long)(unsigned long)(signed long)&frame->sc;
586 regs->regs[REG_ARG3] = (unsigned long long)(unsigned long)(signed long)&frame->sc;
588 regs->pc = (unsigned long) ka->sa.sa_handler;
589 regs->pc = (regs->pc & NEFF_SIGN) ? (regs->pc | NEFF_MASK) : regs->pc;
595 printk("SIG deliver (#%d,%s:%d): sp=%p pc=%08Lx%08Lx link=%08Lx%08Lx\n",
597 current->comm, current->pid, frame,
598 regs->pc >> 32, regs->pc & 0xffffffff,
599 DEREF_REG_PR >> 32, DEREF_REG_PR & 0xffffffff);
605 force_sigsegv(sig, current);
608 static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
609 sigset_t *set, struct pt_regs *regs)
611 struct rt_sigframe __user *frame;
615 frame = get_sigframe(ka, regs->regs[REG_SP], sizeof(*frame));
617 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
620 signal = current_thread_info()->exec_domain
621 && current_thread_info()->exec_domain->signal_invmap
623 ? current_thread_info()->exec_domain->signal_invmap[sig]
626 err |= __put_user(&frame->info, &frame->pinfo);
627 err |= __put_user(&frame->uc, &frame->puc);
628 err |= copy_siginfo_to_user(&frame->info, info);
630 /* Give up earlier as i386, in case */
634 /* Create the ucontext. */
635 err |= __put_user(0, &frame->uc.uc_flags);
636 err |= __put_user(0, &frame->uc.uc_link);
637 err |= __put_user((void *)current->sas_ss_sp,
638 &frame->uc.uc_stack.ss_sp);
639 err |= __put_user(sas_ss_flags(regs->regs[REG_SP]),
640 &frame->uc.uc_stack.ss_flags);
641 err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
642 err |= setup_sigcontext(&frame->uc.uc_mcontext,
644 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
646 /* Give up earlier as i386, in case */
650 /* Set up to return from userspace. If provided, use a stub
651 already in userspace. */
652 if (ka->sa.sa_flags & SA_RESTORER) {
653 DEREF_REG_PR = (unsigned long) ka->sa.sa_restorer | 0x1;
656 * On SH5 all edited pointers are subject to NEFF
658 DEREF_REG_PR = (DEREF_REG_PR & NEFF_SIGN) ?
659 (DEREF_REG_PR | NEFF_MASK) : DEREF_REG_PR;
662 * Different approach on SH5.
663 * . Endianness independent asm code gets placed in entry.S .
664 * This is limited to four ASM instructions corresponding
665 * to two long longs in size.
666 * . err checking is done on the else branch only
667 * . flush_icache_range() is called upon __put_user() only
668 * . all edited pointers are subject to NEFF
669 * . being code, linker turns ShMedia bit on, always
670 * dereference index -1.
673 DEREF_REG_PR = (unsigned long) frame->retcode | 0x01;
674 DEREF_REG_PR = (DEREF_REG_PR & NEFF_SIGN) ?
675 (DEREF_REG_PR | NEFF_MASK) : DEREF_REG_PR;
677 if (__copy_to_user(frame->retcode,
678 (unsigned long long)sa_default_rt_restorer & (~1), 16) != 0)
681 flush_icache_range(DEREF_REG_PR-1, DEREF_REG_PR-1+15);
685 * Set up registers for signal handler.
686 * All edited pointers are subject to NEFF.
688 regs->regs[REG_SP] = (unsigned long) frame;
689 regs->regs[REG_SP] = (regs->regs[REG_SP] & NEFF_SIGN) ?
690 (regs->regs[REG_SP] | NEFF_MASK) : regs->regs[REG_SP];
691 regs->regs[REG_ARG1] = signal; /* Arg for signal handler */
692 regs->regs[REG_ARG2] = (unsigned long long)(unsigned long)(signed long)&frame->info;
693 regs->regs[REG_ARG3] = (unsigned long long)(unsigned long)(signed long)&frame->uc.uc_mcontext;
694 regs->pc = (unsigned long) ka->sa.sa_handler;
695 regs->pc = (regs->pc & NEFF_SIGN) ? (regs->pc | NEFF_MASK) : regs->pc;
701 printk("SIG deliver (#%d,%s:%d): sp=%p pc=%08Lx%08Lx link=%08Lx%08Lx\n",
703 current->comm, current->pid, frame,
704 regs->pc >> 32, regs->pc & 0xffffffff,
705 DEREF_REG_PR >> 32, DEREF_REG_PR & 0xffffffff);
711 force_sigsegv(sig, current);
715 * OK, we're invoking a handler
719 handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
720 sigset_t *oldset, struct pt_regs * regs)
722 /* Are we from a system call? */
723 if (regs->syscall_nr >= 0) {
724 /* If so, check system call restarting.. */
725 switch (regs->regs[REG_RET]) {
726 case -ERESTART_RESTARTBLOCK:
727 case -ERESTARTNOHAND:
728 no_system_call_restart:
729 regs->regs[REG_RET] = -EINTR;
733 if (!(ka->sa.sa_flags & SA_RESTART))
734 goto no_system_call_restart;
736 case -ERESTARTNOINTR:
737 /* Decode syscall # */
738 regs->regs[REG_RET] = regs->syscall_nr;
743 /* Set up the stack frame */
744 if (ka->sa.sa_flags & SA_SIGINFO)
745 setup_rt_frame(sig, ka, info, oldset, regs);
747 setup_frame(sig, ka, oldset, regs);
749 spin_lock_irq(¤t->sighand->siglock);
750 sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
751 if (!(ka->sa.sa_flags & SA_NODEFER))
752 sigaddset(¤t->blocked,sig);
754 spin_unlock_irq(¤t->sighand->siglock);
757 asmlinkage void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags)
759 if (thread_info_flags & _TIF_SIGPENDING)
762 if (thread_info_flags & _TIF_NOTIFY_RESUME) {
763 clear_thread_flag(TIF_NOTIFY_RESUME);
764 tracehook_notify_resume(regs);