Lines Matching +full:sw +full:- +full:exception
16 * 1997-12-01 Modified for POSIX.1b signals by Andreas Schwab
25 * Atari :-) Current limitation: Only one sigstack can be active at one time.
68 [1] = -1, /* sizeof_field(struct frame, un.fmt1), */
72 [5] = -1, /* sizeof_field(struct frame, un.fmt5), */
73 [6] = -1, /* sizeof_field(struct frame, un.fmt6), */
75 [8] = -1, /* sizeof_field(struct frame, un.fmt8), */
79 [12] = -1, /* sizeof_field(struct frame, un.fmtc), */
80 [13] = -1, /* sizeof_field(struct frame, un.fmtd), */
81 [14] = -1, /* sizeof_field(struct frame, un.fmte), */
82 [15] = -1, /* sizeof_field(struct frame, un.fmtf), */
96 fixup = search_exception_tables(regs->pc); in fixup_exception()
101 regs->stkadj = frame_extra_sizes(regs->format); in fixup_exception()
102 tregs = (struct pt_regs *)((long)regs + regs->stkadj); in fixup_exception()
103 tregs->vector = regs->vector; in fixup_exception()
104 tregs->format = FORMAT; in fixup_exception()
105 tregs->pc = fixup->fixup; in fixup_exception()
106 tregs->sr = regs->sr; in fixup_exception()
193 /* No frame size adjustments required on non-MMU CPUs */ in frame_extra_sizes()
203 regs->format = 0x4; in adjustformat()
208 sc->sc_a5 = ((struct switch_stack *)regs - 1)->a5; in save_a5_state()
231 unsigned long extramask[_NSIG_WORDS-1];
261 memcpy(current->thread.fpcntl, sc->sc_fpcntl, 12); in restore_fpu_state()
262 memcpy(current->thread.fp, sc->sc_fpregs, 24); in restore_fpu_state()
266 if (CPU_IS_060 ? sc->sc_fpstate[2] : sc->sc_fpstate[0]) { in restore_fpu_state()
269 (sc->sc_fpstate[0] != fpu_version)) in restore_fpu_state()
273 !(sc->sc_fpstate[1] == 0x18 || sc->sc_fpstate[1] == 0xb4)) in restore_fpu_state()
276 !(sc->sc_fpstate[1] == 0x38 || sc->sc_fpstate[1] == 0xd4)) in restore_fpu_state()
279 if (!(sc->sc_fpstate[1] == 0x00 || in restore_fpu_state()
280 sc->sc_fpstate[1] == 0x28 || in restore_fpu_state()
281 sc->sc_fpstate[1] == 0x60)) in restore_fpu_state()
284 if (!(sc->sc_fpstate[3] == 0x00 || in restore_fpu_state()
285 sc->sc_fpstate[3] == 0x60 || in restore_fpu_state()
286 sc->sc_fpstate[3] == 0xe0)) in restore_fpu_state()
289 if (!(sc->sc_fpstate[0] == 0x00 || in restore_fpu_state()
290 sc->sc_fpstate[0] == 0x05 || in restore_fpu_state()
291 sc->sc_fpstate[0] == 0xe5)) in restore_fpu_state()
297 __asm__ volatile ("fmovemd %0,%%fp0-%%fp1\n\t" in restore_fpu_state()
302 : "m" (sc->sc_fpregs[0]), in restore_fpu_state()
303 "m" (sc->sc_fpcntl[0]), in restore_fpu_state()
304 "m" (sc->sc_fpcntl[1]), in restore_fpu_state()
305 "m" (sc->sc_fpcntl[2])); in restore_fpu_state()
308 "fmovemx %0,%%fp0-%%fp1\n\t" in restore_fpu_state()
312 : "m" (*sc->sc_fpregs), in restore_fpu_state()
313 "m" (*sc->sc_fpcntl)); in restore_fpu_state()
318 __asm__ volatile ("frestore %0" : : "m" (*sc->sc_fpstate)); in restore_fpu_state()
323 : : "m" (*sc->sc_fpstate)); in restore_fpu_state()
340 if (__copy_from_user(current->thread.fpcntl, in rt_restore_fpu_state()
341 uc->uc_mcontext.fpregs.f_fpcntl, 12)) in rt_restore_fpu_state()
344 if (__copy_from_user(current->thread.fp, in rt_restore_fpu_state()
345 uc->uc_mcontext.fpregs.f_fpregs, 96)) in rt_restore_fpu_state()
350 if (__get_user(*(long *)fpstate, (long __user *)&uc->uc_fpstate)) in rt_restore_fpu_state()
383 if (__copy_from_user(&fpregs, &uc->uc_mcontext.fpregs, in rt_restore_fpu_state()
388 __asm__ volatile ("fmovemd %0,%%fp0-%%fp7\n\t" in rt_restore_fpu_state()
399 "fmovemx %0,%%fp0-%%fp7\n\t" in rt_restore_fpu_state()
408 __copy_from_user(fpstate + 4, (long __user *)&uc->uc_fpstate + 1, in rt_restore_fpu_state()
433 memcpy(sc->sc_fpcntl, current->thread.fpcntl, 12); in save_fpu_state()
434 memcpy(sc->sc_fpregs, current->thread.fp, 24); in save_fpu_state()
440 : : "m" (*sc->sc_fpstate) : "memory"); in save_fpu_state()
445 : : "m" (*sc->sc_fpstate) : "memory"); in save_fpu_state()
448 if (CPU_IS_060 ? sc->sc_fpstate[2] : sc->sc_fpstate[0]) { in save_fpu_state()
449 fpu_version = sc->sc_fpstate[0]; in save_fpu_state()
451 regs->vector >= (VEC_FPBRUC * 4) && in save_fpu_state()
452 regs->vector <= (VEC_FPNAN * 4)) { in save_fpu_state()
453 /* Clear pending exception in 68882 idle frame */ in save_fpu_state()
454 if (*(unsigned short *) sc->sc_fpstate == 0x1f38) in save_fpu_state()
455 sc->sc_fpstate[0x38] |= 1 << 3; in save_fpu_state()
459 __asm__ volatile ("fmovemd %%fp0-%%fp1,%0\n\t" in save_fpu_state()
463 : "=m" (sc->sc_fpregs[0]), in save_fpu_state()
464 "=m" (sc->sc_fpcntl[0]), in save_fpu_state()
465 "=m" (sc->sc_fpcntl[1]), in save_fpu_state()
466 "=m" (sc->sc_fpcntl[2]) in save_fpu_state()
471 "fmovemx %%fp0-%%fp1,%0\n\t" in save_fpu_state()
474 : "=m" (*sc->sc_fpregs), in save_fpu_state()
475 "=m" (*sc->sc_fpcntl) in save_fpu_state()
490 err |= copy_to_user(uc->uc_mcontext.fpregs.f_fpcntl, in rt_save_fpu_state()
491 current->thread.fpcntl, 12); in rt_save_fpu_state()
493 err |= copy_to_user(uc->uc_mcontext.fpregs.f_fpregs, in rt_save_fpu_state()
494 current->thread.fp, 96); in rt_save_fpu_state()
507 err |= __put_user(*(long *)fpstate, (long __user *)&uc->uc_fpstate); in rt_save_fpu_state()
514 regs->vector >= (VEC_FPBRUC * 4) && in rt_save_fpu_state()
515 regs->vector <= (VEC_FPNAN * 4)) { in rt_save_fpu_state()
516 /* Clear pending exception in 68882 idle frame */ in rt_save_fpu_state()
521 __asm__ volatile ("fmovemd %%fp0-%%fp7,%0\n\t" in rt_save_fpu_state()
533 "fmovemx %%fp0-%%fp7,%0\n\t" in rt_save_fpu_state()
541 err |= copy_to_user(&uc->uc_mcontext.fpregs, &fpregs, in rt_save_fpu_state()
545 err |= copy_to_user((long __user *)&uc->uc_fpstate + 1, fpstate + 4, in rt_save_fpu_state()
649 regs->format = formatvec >> 12; in mangle_kernel_stack()
650 regs->vector = formatvec & 0xfff; in mangle_kernel_stack()
652 struct switch_stack *sw = (struct switch_stack *)regs - 1; in mangle_kernel_stack() local
661 regs->format = formatvec >> 12; in mangle_kernel_stack()
662 regs->vector = formatvec & 0xfff; in mangle_kernel_stack()
684 : "a" (sw), "d" (fsize), "d" (frame_offset/4-1), in mangle_kernel_stack()
701 /* Always make any pending restarted system calls return -EINTR */ in restore_sigcontext()
702 current->restart_block.fn = do_no_restart_syscall; in restore_sigcontext()
709 regs->d0 = context.sc_d0; in restore_sigcontext()
710 regs->d1 = context.sc_d1; in restore_sigcontext()
711 regs->a0 = context.sc_a0; in restore_sigcontext()
712 regs->a1 = context.sc_a1; in restore_sigcontext()
713 regs->sr = (regs->sr & 0xff00) | (context.sc_sr & 0xff); in restore_sigcontext()
714 regs->pc = context.sc_pc; in restore_sigcontext()
715 regs->orig_d0 = -1; /* disable syscall checks */ in restore_sigcontext()
731 rt_restore_ucontext(struct pt_regs *regs, struct switch_stack *sw, in rt_restore_ucontext() argument
735 greg_t __user *gregs = uc->uc_mcontext.gregs; in rt_restore_ucontext()
739 /* Always make any pending restarted system calls return -EINTR */ in rt_restore_ucontext()
740 current->restart_block.fn = do_no_restart_syscall; in rt_restore_ucontext()
742 err = __get_user(temp, &uc->uc_mcontext.version); in rt_restore_ucontext()
746 err |= __get_user(regs->d0, &gregs[0]); in rt_restore_ucontext()
747 err |= __get_user(regs->d1, &gregs[1]); in rt_restore_ucontext()
748 err |= __get_user(regs->d2, &gregs[2]); in rt_restore_ucontext()
749 err |= __get_user(regs->d3, &gregs[3]); in rt_restore_ucontext()
750 err |= __get_user(regs->d4, &gregs[4]); in rt_restore_ucontext()
751 err |= __get_user(regs->d5, &gregs[5]); in rt_restore_ucontext()
752 err |= __get_user(sw->d6, &gregs[6]); in rt_restore_ucontext()
753 err |= __get_user(sw->d7, &gregs[7]); in rt_restore_ucontext()
754 err |= __get_user(regs->a0, &gregs[8]); in rt_restore_ucontext()
755 err |= __get_user(regs->a1, &gregs[9]); in rt_restore_ucontext()
756 err |= __get_user(regs->a2, &gregs[10]); in rt_restore_ucontext()
757 err |= __get_user(sw->a3, &gregs[11]); in rt_restore_ucontext()
758 err |= __get_user(sw->a4, &gregs[12]); in rt_restore_ucontext()
759 err |= __get_user(sw->a5, &gregs[13]); in rt_restore_ucontext()
760 err |= __get_user(sw->a6, &gregs[14]); in rt_restore_ucontext()
763 err |= __get_user(regs->pc, &gregs[16]); in rt_restore_ucontext()
765 regs->sr = (regs->sr & 0xff00) | (temp & 0xff); in rt_restore_ucontext()
766 regs->orig_d0 = -1; /* disable syscall checks */ in rt_restore_ucontext()
767 err |= __get_user(temp, &uc->uc_formatvec); in rt_restore_ucontext()
770 err |= restore_altstack(&uc->uc_stack); in rt_restore_ucontext()
775 if (mangle_kernel_stack(regs, temp, &uc->uc_extra)) in rt_restore_ucontext()
784 asmlinkage int do_sigreturn(struct pt_regs *regs, struct switch_stack *sw) in do_sigreturn() argument
787 struct sigframe __user *frame = (struct sigframe __user *)(usp - 4); in do_sigreturn()
792 if (__get_user(set.sig[0], &frame->sc.sc_mask) || in do_sigreturn()
794 __copy_from_user(&set.sig[1], &frame->extramask, in do_sigreturn()
795 sizeof(frame->extramask)))) in do_sigreturn()
800 if (restore_sigcontext(regs, &frame->sc, frame + 1)) in do_sigreturn()
802 return regs->d0; in do_sigreturn()
809 asmlinkage int do_rt_sigreturn(struct pt_regs *regs, struct switch_stack *sw) in do_rt_sigreturn() argument
812 struct rt_sigframe __user *frame = (struct rt_sigframe __user *)(usp - 4); in do_rt_sigreturn()
817 if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set))) in do_rt_sigreturn()
822 if (rt_restore_ucontext(regs, sw, &frame->uc)) in do_rt_sigreturn()
824 return regs->d0; in do_rt_sigreturn()
834 sc->sc_mask = mask; in setup_sigcontext()
835 sc->sc_usp = rdusp(); in setup_sigcontext()
836 sc->sc_d0 = regs->d0; in setup_sigcontext()
837 sc->sc_d1 = regs->d1; in setup_sigcontext()
838 sc->sc_a0 = regs->a0; in setup_sigcontext()
839 sc->sc_a1 = regs->a1; in setup_sigcontext()
840 sc->sc_sr = regs->sr; in setup_sigcontext()
841 sc->sc_pc = regs->pc; in setup_sigcontext()
842 sc->sc_formatvec = regs->format << 12 | regs->vector; in setup_sigcontext()
849 struct switch_stack *sw = (struct switch_stack *)regs - 1; in rt_setup_ucontext() local
850 greg_t __user *gregs = uc->uc_mcontext.gregs; in rt_setup_ucontext()
853 err |= __put_user(MCONTEXT_VERSION, &uc->uc_mcontext.version); in rt_setup_ucontext()
854 err |= __put_user(regs->d0, &gregs[0]); in rt_setup_ucontext()
855 err |= __put_user(regs->d1, &gregs[1]); in rt_setup_ucontext()
856 err |= __put_user(regs->d2, &gregs[2]); in rt_setup_ucontext()
857 err |= __put_user(regs->d3, &gregs[3]); in rt_setup_ucontext()
858 err |= __put_user(regs->d4, &gregs[4]); in rt_setup_ucontext()
859 err |= __put_user(regs->d5, &gregs[5]); in rt_setup_ucontext()
860 err |= __put_user(sw->d6, &gregs[6]); in rt_setup_ucontext()
861 err |= __put_user(sw->d7, &gregs[7]); in rt_setup_ucontext()
862 err |= __put_user(regs->a0, &gregs[8]); in rt_setup_ucontext()
863 err |= __put_user(regs->a1, &gregs[9]); in rt_setup_ucontext()
864 err |= __put_user(regs->a2, &gregs[10]); in rt_setup_ucontext()
865 err |= __put_user(sw->a3, &gregs[11]); in rt_setup_ucontext()
866 err |= __put_user(sw->a4, &gregs[12]); in rt_setup_ucontext()
867 err |= __put_user(sw->a5, &gregs[13]); in rt_setup_ucontext()
868 err |= __put_user(sw->a6, &gregs[14]); in rt_setup_ucontext()
870 err |= __put_user(regs->pc, &gregs[16]); in rt_setup_ucontext()
871 err |= __put_user(regs->sr, &gregs[17]); in rt_setup_ucontext()
872 err |= __put_user((regs->format << 12) | regs->vector, &uc->uc_formatvec); in rt_setup_ucontext()
882 return (void __user *)((usp - frame_size) & -8UL); in get_sigframe()
889 int fsize = frame_extra_sizes(regs->format); in setup_frame()
891 int err = 0, sig = ksig->sig; in setup_frame()
895 regs->format); in setup_frame()
896 return -EFAULT; in setup_frame()
904 err |= __put_user(sig, &frame->sig); in setup_frame()
906 err |= __put_user(regs->vector, &frame->code); in setup_frame()
907 err |= __put_user(&frame->sc, &frame->psc); in setup_frame()
910 err |= copy_to_user(frame->extramask, &set->sig[1], in setup_frame()
911 sizeof(frame->extramask)); in setup_frame()
913 setup_sigcontext(&context, regs, set->sig[0]); in setup_frame()
914 err |= copy_to_user (&frame->sc, &context, sizeof(context)); in setup_frame()
918 err |= __put_user(frame->retcode, &frame->pretcode); in setup_frame()
921 (long __user *)(frame->retcode)); in setup_frame()
924 (long __user *) &frame->pretcode); in setup_frame()
928 return -EFAULT; in setup_frame()
930 push_cache ((unsigned long) &frame->retcode); in setup_frame()
937 regs->pc = (unsigned long) ksig->ka.sa.sa_handler; in setup_frame()
946 regs->stkadj = fsize; in setup_frame()
948 /* Prepare to skip over the extra stuff in the exception frame. */ in setup_frame()
949 if (regs->stkadj) { in setup_frame()
951 (struct pt_regs *)((ulong)regs + regs->stkadj); in setup_frame()
952 pr_debug("Performing stackadjust=%04lx\n", regs->stkadj); in setup_frame()
955 tregs->vector = 0; in setup_frame()
956 tregs->format = 0; in setup_frame()
957 tregs->pc = regs->pc; in setup_frame()
958 tregs->sr = regs->sr; in setup_frame()
967 int fsize = frame_extra_sizes(regs->format); in setup_rt_frame()
968 int err = 0, sig = ksig->sig; in setup_rt_frame()
972 regs->format); in setup_rt_frame()
973 return -EFAULT; in setup_rt_frame()
979 err |= copy_to_user (&frame->uc.uc_extra, regs + 1, fsize); in setup_rt_frame()
981 err |= __put_user(sig, &frame->sig); in setup_rt_frame()
982 err |= __put_user(&frame->info, &frame->pinfo); in setup_rt_frame()
983 err |= __put_user(&frame->uc, &frame->puc); in setup_rt_frame()
984 err |= copy_siginfo_to_user(&frame->info, &ksig->info); in setup_rt_frame()
987 err |= __put_user(0, &frame->uc.uc_flags); in setup_rt_frame()
988 err |= __put_user(NULL, &frame->uc.uc_link); in setup_rt_frame()
989 err |= __save_altstack(&frame->uc.uc_stack, rdusp()); in setup_rt_frame()
990 err |= rt_setup_ucontext(&frame->uc, regs); in setup_rt_frame()
991 err |= copy_to_user (&frame->uc.uc_sigmask, set, sizeof(*set)); in setup_rt_frame()
995 err |= __put_user(frame->retcode, &frame->pretcode); in setup_rt_frame()
998 err |= __put_user(0x203c0000, (long __user *)(frame->retcode + 0)); in setup_rt_frame()
1000 (long __user *)(frame->retcode + 4)); in setup_rt_frame()
1004 (long __user *)(frame->retcode + 0)); in setup_rt_frame()
1005 err |= __put_user(0x4e40, (short __user *)(frame->retcode + 4)); in setup_rt_frame()
1009 (long __user *) &frame->pretcode); in setup_rt_frame()
1013 return -EFAULT; in setup_rt_frame()
1015 push_cache ((unsigned long) &frame->retcode); in setup_rt_frame()
1022 regs->pc = (unsigned long) ksig->ka.sa.sa_handler; in setup_rt_frame()
1031 regs->stkadj = fsize; in setup_rt_frame()
1033 /* Prepare to skip over the extra stuff in the exception frame. */ in setup_rt_frame()
1034 if (regs->stkadj) { in setup_rt_frame()
1036 (struct pt_regs *)((ulong)regs + regs->stkadj); in setup_rt_frame()
1037 pr_debug("Performing stackadjust=%04lx\n", regs->stkadj); in setup_rt_frame()
1040 tregs->vector = 0; in setup_rt_frame()
1041 tregs->format = 0; in setup_rt_frame()
1042 tregs->pc = regs->pc; in setup_rt_frame()
1043 tregs->sr = regs->sr; in setup_rt_frame()
1051 switch (regs->d0) { in handle_restart()
1052 case -ERESTARTNOHAND: in handle_restart()
1055 regs->d0 = -EINTR; in handle_restart()
1058 case -ERESTART_RESTARTBLOCK: in handle_restart()
1060 regs->d0 = __NR_restart_syscall; in handle_restart()
1061 regs->pc -= 2; in handle_restart()
1064 regs->d0 = -EINTR; in handle_restart()
1067 case -ERESTARTSYS: in handle_restart()
1068 if (has_handler && !(ka->sa.sa_flags & SA_RESTART)) { in handle_restart()
1069 regs->d0 = -EINTR; in handle_restart()
1073 case -ERESTARTNOINTR: in handle_restart()
1075 regs->d0 = regs->orig_d0; in handle_restart()
1076 regs->pc -= 2; in handle_restart()
1090 if (regs->orig_d0 >= 0) in handle_signal()
1092 handle_restart(regs, &ksig->ka, 1); in handle_signal()
1095 if (ksig->ka.sa.sa_flags & SA_SIGINFO) in handle_signal()
1103 regs->sr &= ~0x8000; in handle_signal()
1117 current->thread.esp0 = (unsigned long) regs; in do_signal()
1126 if (regs->orig_d0 >= 0) in do_signal()
1127 /* Restart the system call - no handlers present */ in do_signal()