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.
70 [1] = -1, /* sizeof_field(struct frame, un.fmt1), */
74 [5] = -1, /* sizeof_field(struct frame, un.fmt5), */
75 [6] = -1, /* sizeof_field(struct frame, un.fmt6), */
77 [8] = -1, /* sizeof_field(struct frame, un.fmt8), */
81 [12] = -1, /* sizeof_field(struct frame, un.fmtc), */
82 [13] = -1, /* sizeof_field(struct frame, un.fmtd), */
83 [14] = -1, /* sizeof_field(struct frame, un.fmte), */
84 [15] = -1, /* sizeof_field(struct frame, un.fmtf), */
98 fixup = search_exception_tables(regs->pc); in fixup_exception()
103 regs->stkadj = frame_extra_sizes(regs->format); in fixup_exception()
104 tregs = (struct pt_regs *)((long)regs + regs->stkadj); in fixup_exception()
105 tregs->vector = regs->vector; in fixup_exception()
106 tregs->format = FORMAT; in fixup_exception()
107 tregs->pc = fixup->fixup; in fixup_exception()
108 tregs->sr = regs->sr; in fixup_exception()
195 /* No frame size adjustments required on non-MMU CPUs */ in frame_extra_sizes()
205 regs->format = 0x4; in adjustformat()
210 sc->sc_a5 = ((struct switch_stack *)regs - 1)->a5; in save_a5_state()
233 unsigned long extramask[_NSIG_WORDS-1];
263 memcpy(current->thread.fpcntl, sc->sc_fpcntl, 12); in restore_fpu_state()
264 memcpy(current->thread.fp, sc->sc_fpregs, 24); in restore_fpu_state()
268 if (CPU_IS_060 ? sc->sc_fpstate[2] : sc->sc_fpstate[0]) { in restore_fpu_state()
271 (sc->sc_fpstate[0] != fpu_version)) in restore_fpu_state()
275 !(sc->sc_fpstate[1] == 0x18 || sc->sc_fpstate[1] == 0xb4)) in restore_fpu_state()
278 !(sc->sc_fpstate[1] == 0x38 || sc->sc_fpstate[1] == 0xd4)) in restore_fpu_state()
281 if (!(sc->sc_fpstate[1] == 0x00 || in restore_fpu_state()
282 sc->sc_fpstate[1] == 0x28 || in restore_fpu_state()
283 sc->sc_fpstate[1] == 0x60)) in restore_fpu_state()
286 if (!(sc->sc_fpstate[3] == 0x00 || in restore_fpu_state()
287 sc->sc_fpstate[3] == 0x60 || in restore_fpu_state()
288 sc->sc_fpstate[3] == 0xe0)) in restore_fpu_state()
291 if (!(sc->sc_fpstate[0] == 0x00 || in restore_fpu_state()
292 sc->sc_fpstate[0] == 0x05 || in restore_fpu_state()
293 sc->sc_fpstate[0] == 0xe5)) in restore_fpu_state()
299 __asm__ volatile ("fmovemd %0,%%fp0-%%fp1\n\t" in restore_fpu_state()
304 : "m" (sc->sc_fpregs[0]), in restore_fpu_state()
305 "m" (sc->sc_fpcntl[0]), in restore_fpu_state()
306 "m" (sc->sc_fpcntl[1]), in restore_fpu_state()
307 "m" (sc->sc_fpcntl[2])); in restore_fpu_state()
310 "fmovemx %0,%%fp0-%%fp1\n\t" in restore_fpu_state()
314 : "m" (*sc->sc_fpregs), in restore_fpu_state()
315 "m" (*sc->sc_fpcntl)); in restore_fpu_state()
320 __asm__ volatile ("frestore %0" : : "m" (*sc->sc_fpstate)); in restore_fpu_state()
325 : : "m" (*sc->sc_fpstate)); in restore_fpu_state()
342 if (__copy_from_user(current->thread.fpcntl, in rt_restore_fpu_state()
343 uc->uc_mcontext.fpregs.f_fpcntl, 12)) in rt_restore_fpu_state()
346 if (__copy_from_user(current->thread.fp, in rt_restore_fpu_state()
347 uc->uc_mcontext.fpregs.f_fpregs, 96)) in rt_restore_fpu_state()
352 if (__get_user(*(long *)fpstate, (long __user *)&uc->uc_fpstate)) in rt_restore_fpu_state()
385 if (__copy_from_user(&fpregs, &uc->uc_mcontext.fpregs, in rt_restore_fpu_state()
390 __asm__ volatile ("fmovemd %0,%%fp0-%%fp7\n\t" in rt_restore_fpu_state()
401 "fmovemx %0,%%fp0-%%fp7\n\t" in rt_restore_fpu_state()
410 __copy_from_user(fpstate + 4, (long __user *)&uc->uc_fpstate + 1, in rt_restore_fpu_state()
435 memcpy(sc->sc_fpcntl, current->thread.fpcntl, 12); in save_fpu_state()
436 memcpy(sc->sc_fpregs, current->thread.fp, 24); in save_fpu_state()
442 : : "m" (*sc->sc_fpstate) : "memory"); in save_fpu_state()
447 : : "m" (*sc->sc_fpstate) : "memory"); in save_fpu_state()
450 if (CPU_IS_060 ? sc->sc_fpstate[2] : sc->sc_fpstate[0]) { in save_fpu_state()
451 fpu_version = sc->sc_fpstate[0]; in save_fpu_state()
452 if (CPU_IS_020_OR_030 && !regs->stkadj && in save_fpu_state()
453 regs->vector >= (VEC_FPBRUC * 4) && in save_fpu_state()
454 regs->vector <= (VEC_FPNAN * 4)) { in save_fpu_state()
455 /* Clear pending exception in 68882 idle frame */ in save_fpu_state()
456 if (*(unsigned short *) sc->sc_fpstate == 0x1f38) in save_fpu_state()
457 sc->sc_fpstate[0x38] |= 1 << 3; in save_fpu_state()
461 __asm__ volatile ("fmovemd %%fp0-%%fp1,%0\n\t" in save_fpu_state()
465 : "=m" (sc->sc_fpregs[0]), in save_fpu_state()
466 "=m" (sc->sc_fpcntl[0]), in save_fpu_state()
467 "=m" (sc->sc_fpcntl[1]), in save_fpu_state()
468 "=m" (sc->sc_fpcntl[2]) in save_fpu_state()
473 "fmovemx %%fp0-%%fp1,%0\n\t" in save_fpu_state()
476 : "=m" (*sc->sc_fpregs), in save_fpu_state()
477 "=m" (*sc->sc_fpcntl) in save_fpu_state()
492 err |= copy_to_user(uc->uc_mcontext.fpregs.f_fpcntl, in rt_save_fpu_state()
493 current->thread.fpcntl, 12); in rt_save_fpu_state()
495 err |= copy_to_user(uc->uc_mcontext.fpregs.f_fpregs, in rt_save_fpu_state()
496 current->thread.fp, 96); in rt_save_fpu_state()
509 err |= __put_user(*(long *)fpstate, (long __user *)&uc->uc_fpstate); in rt_save_fpu_state()
515 if (CPU_IS_020_OR_030 && !regs->stkadj && in rt_save_fpu_state()
516 regs->vector >= (VEC_FPBRUC * 4) && in rt_save_fpu_state()
517 regs->vector <= (VEC_FPNAN * 4)) { in rt_save_fpu_state()
518 /* Clear pending exception in 68882 idle frame */ in rt_save_fpu_state()
523 __asm__ volatile ("fmovemd %%fp0-%%fp7,%0\n\t" in rt_save_fpu_state()
535 "fmovemx %%fp0-%%fp7,%0\n\t" in rt_save_fpu_state()
543 err |= copy_to_user(&uc->uc_mcontext.fpregs, &fpregs, in rt_save_fpu_state()
547 err |= copy_to_user((long __user *)&uc->uc_fpstate + 1, fpstate + 4, in rt_save_fpu_state()
655 return -1; in mangle_kernel_stack()
658 return -1; in mangle_kernel_stack()
659 regs->format = formatvec >> 12; in mangle_kernel_stack()
660 regs->vector = formatvec & 0xfff; in mangle_kernel_stack()
662 void *p = (struct switch_stack *)regs - 1; in mangle_kernel_stack()
663 struct frame *new = (void *)regs - extra; in mangle_kernel_stack()
666 memmove(p - extra, p, size); in mangle_kernel_stack()
667 memcpy(p - extra + size, buf, extra); in mangle_kernel_stack()
668 current->thread.esp0 = (unsigned long)&new->ptregs; in mangle_kernel_stack()
671 if (new->ptregs.format == 7) // bus error frame in mangle_kernel_stack()
686 /* Always make any pending restarted system calls return -EINTR */ in restore_sigcontext()
687 current->restart_block.fn = do_no_restart_syscall; in restore_sigcontext()
691 return -1; in restore_sigcontext()
694 regs->d0 = context.sc_d0; in restore_sigcontext()
695 regs->d1 = context.sc_d1; in restore_sigcontext()
696 regs->a0 = context.sc_a0; in restore_sigcontext()
697 regs->a1 = context.sc_a1; in restore_sigcontext()
698 regs->sr = (regs->sr & 0xff00) | (context.sc_sr & 0xff); in restore_sigcontext()
699 regs->pc = context.sc_pc; in restore_sigcontext()
700 regs->orig_d0 = -1; /* disable syscall checks */ in restore_sigcontext()
705 return -1; in restore_sigcontext()
711 rt_restore_ucontext(struct pt_regs *regs, struct switch_stack *sw, in rt_restore_ucontext() argument
715 greg_t __user *gregs = uc->uc_mcontext.gregs; in rt_restore_ucontext()
719 /* Always make any pending restarted system calls return -EINTR */ in rt_restore_ucontext()
720 current->restart_block.fn = do_no_restart_syscall; in rt_restore_ucontext()
722 err = __get_user(temp, &uc->uc_mcontext.version); in rt_restore_ucontext()
724 return -1; in rt_restore_ucontext()
726 err |= __get_user(regs->d0, &gregs[0]); in rt_restore_ucontext()
727 err |= __get_user(regs->d1, &gregs[1]); in rt_restore_ucontext()
728 err |= __get_user(regs->d2, &gregs[2]); in rt_restore_ucontext()
729 err |= __get_user(regs->d3, &gregs[3]); in rt_restore_ucontext()
730 err |= __get_user(regs->d4, &gregs[4]); in rt_restore_ucontext()
731 err |= __get_user(regs->d5, &gregs[5]); in rt_restore_ucontext()
732 err |= __get_user(sw->d6, &gregs[6]); in rt_restore_ucontext()
733 err |= __get_user(sw->d7, &gregs[7]); in rt_restore_ucontext()
734 err |= __get_user(regs->a0, &gregs[8]); in rt_restore_ucontext()
735 err |= __get_user(regs->a1, &gregs[9]); in rt_restore_ucontext()
736 err |= __get_user(regs->a2, &gregs[10]); in rt_restore_ucontext()
737 err |= __get_user(sw->a3, &gregs[11]); in rt_restore_ucontext()
738 err |= __get_user(sw->a4, &gregs[12]); in rt_restore_ucontext()
739 err |= __get_user(sw->a5, &gregs[13]); in rt_restore_ucontext()
740 err |= __get_user(sw->a6, &gregs[14]); in rt_restore_ucontext()
743 err |= __get_user(regs->pc, &gregs[16]); in rt_restore_ucontext()
745 regs->sr = (regs->sr & 0xff00) | (temp & 0xff); in rt_restore_ucontext()
746 regs->orig_d0 = -1; /* disable syscall checks */ in rt_restore_ucontext()
747 err |= __get_user(temp, &uc->uc_formatvec); in rt_restore_ucontext()
750 err |= restore_altstack(&uc->uc_stack); in rt_restore_ucontext()
753 return -1; in rt_restore_ucontext()
755 return mangle_kernel_stack(regs, temp, &uc->uc_extra); in rt_restore_ucontext()
758 asmlinkage void *do_sigreturn(struct pt_regs *regs, struct switch_stack *sw) in do_sigreturn() argument
761 struct sigframe __user *frame = (struct sigframe __user *)(usp - 4); in do_sigreturn()
767 if (__get_user(set.sig[0], &frame->sc.sc_mask) || in do_sigreturn()
769 __copy_from_user(&set.sig[1], &frame->extramask, in do_sigreturn()
770 sizeof(frame->extramask)))) in do_sigreturn()
775 size = restore_sigcontext(regs, &frame->sc, frame + 1); in do_sigreturn()
778 return (void *)sw - size; in do_sigreturn()
782 return sw; in do_sigreturn()
785 asmlinkage void *do_rt_sigreturn(struct pt_regs *regs, struct switch_stack *sw) in do_rt_sigreturn() argument
788 struct rt_sigframe __user *frame = (struct rt_sigframe __user *)(usp - 4); in do_rt_sigreturn()
794 if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set))) in do_rt_sigreturn()
799 size = rt_restore_ucontext(regs, sw, &frame->uc); in do_rt_sigreturn()
802 return (void *)sw - size; in do_rt_sigreturn()
806 return sw; in do_rt_sigreturn()
811 return (void *)regs + regs->stkadj; in rte_regs()
818 sc->sc_mask = mask; in setup_sigcontext()
819 sc->sc_usp = rdusp(); in setup_sigcontext()
820 sc->sc_d0 = regs->d0; in setup_sigcontext()
821 sc->sc_d1 = regs->d1; in setup_sigcontext()
822 sc->sc_a0 = regs->a0; in setup_sigcontext()
823 sc->sc_a1 = regs->a1; in setup_sigcontext()
824 sc->sc_sr = tregs->sr; in setup_sigcontext()
825 sc->sc_pc = tregs->pc; in setup_sigcontext()
826 sc->sc_formatvec = tregs->format << 12 | tregs->vector; in setup_sigcontext()
833 struct switch_stack *sw = (struct switch_stack *)regs - 1; in rt_setup_ucontext() local
835 greg_t __user *gregs = uc->uc_mcontext.gregs; in rt_setup_ucontext()
838 err |= __put_user(MCONTEXT_VERSION, &uc->uc_mcontext.version); in rt_setup_ucontext()
839 err |= __put_user(regs->d0, &gregs[0]); in rt_setup_ucontext()
840 err |= __put_user(regs->d1, &gregs[1]); in rt_setup_ucontext()
841 err |= __put_user(regs->d2, &gregs[2]); in rt_setup_ucontext()
842 err |= __put_user(regs->d3, &gregs[3]); in rt_setup_ucontext()
843 err |= __put_user(regs->d4, &gregs[4]); in rt_setup_ucontext()
844 err |= __put_user(regs->d5, &gregs[5]); in rt_setup_ucontext()
845 err |= __put_user(sw->d6, &gregs[6]); in rt_setup_ucontext()
846 err |= __put_user(sw->d7, &gregs[7]); in rt_setup_ucontext()
847 err |= __put_user(regs->a0, &gregs[8]); in rt_setup_ucontext()
848 err |= __put_user(regs->a1, &gregs[9]); in rt_setup_ucontext()
849 err |= __put_user(regs->a2, &gregs[10]); in rt_setup_ucontext()
850 err |= __put_user(sw->a3, &gregs[11]); in rt_setup_ucontext()
851 err |= __put_user(sw->a4, &gregs[12]); in rt_setup_ucontext()
852 err |= __put_user(sw->a5, &gregs[13]); in rt_setup_ucontext()
853 err |= __put_user(sw->a6, &gregs[14]); in rt_setup_ucontext()
855 err |= __put_user(tregs->pc, &gregs[16]); in rt_setup_ucontext()
856 err |= __put_user(tregs->sr, &gregs[17]); in rt_setup_ucontext()
857 err |= __put_user((tregs->format << 12) | tregs->vector, &uc->uc_formatvec); in rt_setup_ucontext()
868 if (CPU_IS_020_OR_030 && tregs->format == 0xb) { in get_sigframe()
869 /* USP is unreliable so use worst-case value */ in get_sigframe()
873 return (void __user *)((usp - gap - frame_size) & -8UL); in get_sigframe()
881 int fsize = frame_extra_sizes(tregs->format); in setup_frame()
883 int err = 0, sig = ksig->sig; in setup_frame()
887 tregs->format); in setup_frame()
888 return -EFAULT; in setup_frame()
896 err |= __put_user(sig, &frame->sig); in setup_frame()
898 err |= __put_user(tregs->vector, &frame->code); in setup_frame()
899 err |= __put_user(&frame->sc, &frame->psc); in setup_frame()
902 err |= copy_to_user(frame->extramask, &set->sig[1], in setup_frame()
903 sizeof(frame->extramask)); in setup_frame()
905 setup_sigcontext(&context, regs, set->sig[0]); in setup_frame()
906 err |= copy_to_user (&frame->sc, &context, sizeof(context)); in setup_frame()
910 err |= __put_user(frame->retcode, &frame->pretcode); in setup_frame()
913 (long __user *)(frame->retcode)); in setup_frame()
916 (long __user *) &frame->pretcode); in setup_frame()
920 return -EFAULT; in setup_frame()
922 push_cache ((unsigned long) &frame->retcode); in setup_frame()
930 regs->stkadj = fsize; in setup_frame()
932 pr_debug("Performing stackadjust=%04lx\n", regs->stkadj); in setup_frame()
933 tregs->vector = 0; in setup_frame()
934 tregs->format = 0; in setup_frame()
935 tregs->sr = regs->sr; in setup_frame()
943 tregs->pc = (unsigned long) ksig->ka.sa.sa_handler; in setup_frame()
954 int fsize = frame_extra_sizes(tregs->format); in setup_rt_frame()
955 int err = 0, sig = ksig->sig; in setup_rt_frame()
959 regs->format); in setup_rt_frame()
960 return -EFAULT; in setup_rt_frame()
966 err |= copy_to_user (&frame->uc.uc_extra, regs + 1, fsize); in setup_rt_frame()
968 err |= __put_user(sig, &frame->sig); in setup_rt_frame()
969 err |= __put_user(&frame->info, &frame->pinfo); in setup_rt_frame()
970 err |= __put_user(&frame->uc, &frame->puc); in setup_rt_frame()
971 err |= copy_siginfo_to_user(&frame->info, &ksig->info); in setup_rt_frame()
974 err |= __put_user(0, &frame->uc.uc_flags); in setup_rt_frame()
975 err |= __put_user(NULL, &frame->uc.uc_link); in setup_rt_frame()
976 err |= __save_altstack(&frame->uc.uc_stack, rdusp()); in setup_rt_frame()
977 err |= rt_setup_ucontext(&frame->uc, regs); in setup_rt_frame()
978 err |= copy_to_user (&frame->uc.uc_sigmask, set, sizeof(*set)); in setup_rt_frame()
982 err |= __put_user(frame->retcode, &frame->pretcode); in setup_rt_frame()
985 err |= __put_user(0x203c0000, (long __user *)(frame->retcode + 0)); in setup_rt_frame()
987 (long __user *)(frame->retcode + 4)); in setup_rt_frame()
991 (long __user *)(frame->retcode + 0)); in setup_rt_frame()
992 err |= __put_user(0x4e40, (short __user *)(frame->retcode + 4)); in setup_rt_frame()
996 (long __user *) &frame->pretcode); in setup_rt_frame()
1000 return -EFAULT; in setup_rt_frame()
1002 push_cache ((unsigned long) &frame->retcode); in setup_rt_frame()
1010 regs->stkadj = fsize; in setup_rt_frame()
1012 pr_debug("Performing stackadjust=%04lx\n", regs->stkadj); in setup_rt_frame()
1013 tregs->vector = 0; in setup_rt_frame()
1014 tregs->format = 0; in setup_rt_frame()
1015 tregs->sr = regs->sr; in setup_rt_frame()
1023 tregs->pc = (unsigned long) ksig->ka.sa.sa_handler; in setup_rt_frame()
1031 switch (regs->d0) { in handle_restart()
1032 case -ERESTARTNOHAND: in handle_restart()
1035 regs->d0 = -EINTR; in handle_restart()
1038 case -ERESTART_RESTARTBLOCK: in handle_restart()
1040 regs->d0 = __NR_restart_syscall; in handle_restart()
1041 regs->pc -= 2; in handle_restart()
1044 regs->d0 = -EINTR; in handle_restart()
1047 case -ERESTARTSYS: in handle_restart()
1048 if (has_handler && !(ka->sa.sa_flags & SA_RESTART)) { in handle_restart()
1049 regs->d0 = -EINTR; in handle_restart()
1053 case -ERESTARTNOINTR: in handle_restart()
1055 regs->d0 = regs->orig_d0; in handle_restart()
1056 regs->pc -= 2; in handle_restart()
1070 if (regs->orig_d0 >= 0) in handle_signal()
1072 handle_restart(regs, &ksig->ka, 1); in handle_signal()
1075 if (ksig->ka.sa.sa_flags & SA_SIGINFO) in handle_signal()
1083 regs->sr &= ~0x8000; in handle_signal()
1097 current->thread.esp0 = (unsigned long) regs; in do_signal()
1106 if (regs->orig_d0 >= 0) in do_signal()
1107 /* Restart the system call - no handlers present */ in do_signal()