Lines Matching +full:big +full:- +full:endian +full:- +full:regs

12  * 1997-11-28  Modified for POSIX.1b signals by Richard Henderson
57 flush_window_regs_user(struct pt_regs *regs) in flush_window_regs_user() argument
59 const unsigned long ws = regs->windowstart; in flush_window_regs_user()
60 const unsigned long wb = regs->windowbase; in flush_window_regs_user()
68 if (regs->wmask == 1) in flush_window_regs_user()
73 wm = (ws >> wb) | (ws << (XCHAL_NUM_AREGS / 4 - wb)); in flush_window_regs_user()
74 base = (XCHAL_NUM_AREGS / 4) - (regs->wmask >> 4); in flush_window_regs_user()
78 if ((regs->wmask & 2) == 0) in flush_window_regs_user()
79 if (__get_user(sp, (int*)(regs->areg[base * 4 + 1] - 12))) in flush_window_regs_user()
96 &regs->areg[(base + 1) * 4], 16)) in flush_window_regs_user()
102 &regs->areg[(base + 1) * 4], 32)) in flush_window_regs_user()
109 sp = regs->areg[((base + inc) * 4 + 1) % XCHAL_NUM_AREGS]; in flush_window_regs_user()
110 if (copy_to_user(&SPILL_SLOT(sp, 0), &regs->areg[base * 4], 16)) in flush_window_regs_user()
115 sp = regs->areg[base * 4 + 1]; in flush_window_regs_user()
119 regs->wmask = 1; in flush_window_regs_user()
120 regs->windowstart = 1 << wb; in flush_window_regs_user()
129 flush_window_regs_user(struct pt_regs *regs) in flush_window_regs_user() argument
136 * Note: We don't copy double exception 'regs', we have to finish double exc.
144 setup_sigcontext(struct rt_sigframe __user *frame, struct pt_regs *regs) in setup_sigcontext() argument
146 struct sigcontext __user *sc = &frame->uc.uc_mcontext; in setup_sigcontext()
150 #define COPY(x) err |= __put_user(regs->x, &sc->sc_##x) in setup_sigcontext()
159 err |= flush_window_regs_user(regs); in setup_sigcontext()
160 err |= __copy_to_user (sc->sc_a, regs->areg, 16 * 4); in setup_sigcontext()
161 err |= __put_user(0, &sc->sc_xtregs); in setup_sigcontext()
168 err |= __copy_to_user(&frame->xtregs.cp, &ti->xtregs_cp, in setup_sigcontext()
169 sizeof (frame->xtregs.cp)); in setup_sigcontext()
171 err |= __copy_to_user(&frame->xtregs.opt, &regs->xtregs_opt, in setup_sigcontext()
173 err |= __copy_to_user(&frame->xtregs.user, &ti->xtregs_user, in setup_sigcontext()
176 err |= __put_user(err ? NULL : &frame->xtregs, &sc->sc_xtregs); in setup_sigcontext()
182 restore_sigcontext(struct pt_regs *regs, struct rt_sigframe __user *frame) in restore_sigcontext() argument
184 struct sigcontext __user *sc = &frame->uc.uc_mcontext; in restore_sigcontext()
189 #define COPY(x) err |= __get_user(regs->x, &sc->sc_##x) in restore_sigcontext()
199 regs->wmask = 1; in restore_sigcontext()
200 regs->windowbase = 0; in restore_sigcontext()
201 regs->windowstart = 1; in restore_sigcontext()
203 regs->syscall = NO_SYSCALL; /* disable syscall checks */ in restore_sigcontext()
209 err |= __get_user(ps, &sc->sc_ps); in restore_sigcontext()
210 regs->ps = (regs->ps & ~PS_CALLINC_MASK) | (ps & PS_CALLINC_MASK); in restore_sigcontext()
214 if ((regs->lcount > 0) in restore_sigcontext()
215 && ((regs->lbeg > TASK_SIZE) || (regs->lend > TASK_SIZE)) ) in restore_sigcontext()
218 err |= __copy_from_user(regs->areg, sc->sc_a, 16 * 4); in restore_sigcontext()
226 * context-switching mechanisms of CP exception handling. in restore_sigcontext()
232 err |= __copy_from_user(&ti->xtregs_cp, &frame->xtregs.cp, in restore_sigcontext()
233 sizeof (frame->xtregs.cp)); in restore_sigcontext()
235 err |= __copy_from_user(&ti->xtregs_user, &frame->xtregs.user, in restore_sigcontext()
237 err |= __copy_from_user(&regs->xtregs_opt, &frame->xtregs.opt, in restore_sigcontext()
250 struct pt_regs *regs = current_pt_regs(); in xtensa_rt_sigreturn() local
255 /* Always make any pending restarted system calls return -EINTR */ in xtensa_rt_sigreturn()
256 current->restart_block.fn = do_no_restart_syscall; in xtensa_rt_sigreturn()
258 if (regs->depc > 64) in xtensa_rt_sigreturn()
261 frame = (struct rt_sigframe __user *) regs->areg[1]; in xtensa_rt_sigreturn()
266 if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set))) in xtensa_rt_sigreturn()
271 if (restore_sigcontext(regs, frame)) in xtensa_rt_sigreturn()
274 ret = regs->areg[2]; in xtensa_rt_sigreturn()
276 if (restore_altstack(&frame->uc.uc_stack)) in xtensa_rt_sigreturn()
298 * The 12-bit immediate is really split up within the 24-bit MOVI in gen_return_code()
300 * 8-bits, the following code works fine. See the Xtensa ISA for in gen_return_code()
308 #ifdef __XTENSA_EB__ /* Big Endian version */ in gen_return_code()
318 #elif defined __XTENSA_EL__ /* Little Endian version */ in gen_return_code()
343 struct pt_regs *regs) in setup_frame() argument
346 int err = 0, sig = ksig->sig; in setup_frame()
348 unsigned long handler = (unsigned long)ksig->ka.sa.sa_handler; in setup_frame()
352 (current->personality & FDPIC_FUNCPTRS); in setup_frame()
359 return -EFAULT; in setup_frame()
362 sp = regs->areg[1]; in setup_frame()
364 if ((ksig->ka.sa.sa_flags & SA_ONSTACK) != 0 && sas_ss_flags(sp) == 0) { in setup_frame()
365 sp = current->sas_ss_sp + current->sas_ss_size; in setup_frame()
368 frame = (void *)((sp - sizeof(*frame)) & -16ul); in setup_frame()
370 if (regs->depc > 64) in setup_frame()
374 return -EFAULT; in setup_frame()
377 if (ksig->ka.sa.sa_flags & SA_SIGINFO) { in setup_frame()
378 err |= copy_siginfo_to_user(&frame->info, &ksig->info); in setup_frame()
383 err |= __put_user(0, &frame->uc.uc_flags); in setup_frame()
384 err |= __put_user(0, &frame->uc.uc_link); in setup_frame()
385 err |= __save_altstack(&frame->uc.uc_stack, regs->areg[1]); in setup_frame()
386 err |= setup_sigcontext(frame, regs); in setup_frame()
387 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); in setup_frame()
389 if (ksig->ka.sa.sa_flags & SA_RESTORER) { in setup_frame()
392 (unsigned long __user *)ksig->ka.sa.sa_restorer; in setup_frame()
396 ra = (unsigned long)ksig->ka.sa.sa_restorer; in setup_frame()
402 err |= gen_return_code(frame->retcode); in setup_frame()
403 ra = (unsigned long) frame->retcode; in setup_frame()
407 return -EFAULT; in setup_frame()
415 tp = regs->threadptr; in setup_frame()
416 ps = regs->ps; in setup_frame()
417 start_thread(regs, handler, (unsigned long)frame); in setup_frame()
422 regs->areg[base] = in setup_frame()
428 regs->areg[base] = (unsigned long) ra; in setup_frame()
430 regs->areg[base + 2] = (unsigned long) sig; in setup_frame()
431 regs->areg[base + 3] = (unsigned long) &frame->info; in setup_frame()
432 regs->areg[base + 4] = (unsigned long) &frame->uc; in setup_frame()
433 regs->threadptr = tp; in setup_frame()
434 regs->ps = ps; in setup_frame()
436 regs->areg[base + 11] = handler_fdpic_GOT; in setup_frame()
439 current->comm, current->pid, sig, frame, regs->pc); in setup_frame()
450 * the kernel can handle, and then we build all the user-level signal handling
451 * stack-frames in one go after that.
453 static void do_signal(struct pt_regs *regs) in do_signal() argument
457 task_pt_regs(current)->icountlevel = 0; in do_signal()
464 if (regs->syscall != NO_SYSCALL) { in do_signal()
468 switch (regs->areg[2]) { in do_signal()
469 case -ERESTARTNOHAND: in do_signal()
470 case -ERESTART_RESTARTBLOCK: in do_signal()
471 regs->areg[2] = -EINTR; in do_signal()
474 case -ERESTARTSYS: in do_signal()
476 regs->areg[2] = -EINTR; in do_signal()
480 case -ERESTARTNOINTR: in do_signal()
481 regs->areg[2] = regs->syscall; in do_signal()
482 regs->pc -= 3; in do_signal()
487 if (regs->areg[2] != 0) in do_signal()
494 ret = setup_frame(&ksig, sigmask_to_save(), regs); in do_signal()
497 task_pt_regs(current)->icountlevel = 1; in do_signal()
503 if (regs->syscall != NO_SYSCALL) { in do_signal()
504 /* Restart the system call - no handlers present */ in do_signal()
505 switch (regs->areg[2]) { in do_signal()
506 case -ERESTARTNOHAND: in do_signal()
507 case -ERESTARTSYS: in do_signal()
508 case -ERESTARTNOINTR: in do_signal()
509 regs->areg[2] = regs->syscall; in do_signal()
510 regs->pc -= 3; in do_signal()
512 case -ERESTART_RESTARTBLOCK: in do_signal()
513 regs->areg[2] = __NR_restart_syscall; in do_signal()
514 regs->pc -= 3; in do_signal()
523 task_pt_regs(current)->icountlevel = 1; in do_signal()
527 void do_notify_resume(struct pt_regs *regs) in do_notify_resume() argument
531 do_signal(regs); in do_notify_resume()
534 resume_user_mode_work(regs); in do_notify_resume()