Lines Matching refs:regs
137 static int save_sigregs(struct pt_regs *regs, _sigregs __user *sregs) in save_sigregs() argument
143 user_sregs.regs.psw.mask = PSW_USER_BITS | in save_sigregs()
144 (regs->psw.mask & (PSW_MASK_USER | PSW_MASK_RI)); in save_sigregs()
145 user_sregs.regs.psw.addr = regs->psw.addr; in save_sigregs()
146 memcpy(&user_sregs.regs.gprs, ®s->gprs, sizeof(sregs->regs.gprs)); in save_sigregs()
147 memcpy(&user_sregs.regs.acrs, current->thread.acrs, in save_sigregs()
148 sizeof(user_sregs.regs.acrs)); in save_sigregs()
156 static int restore_sigregs(struct pt_regs *regs, _sigregs __user *sregs) in restore_sigregs() argument
166 if (!is_ri_task(current) && (user_sregs.regs.psw.mask & PSW_MASK_RI)) in restore_sigregs()
174 regs->psw.mask = (regs->psw.mask & ~(PSW_MASK_USER | PSW_MASK_RI)) | in restore_sigregs()
175 (user_sregs.regs.psw.mask & (PSW_MASK_USER | PSW_MASK_RI)); in restore_sigregs()
177 if ((regs->psw.mask & PSW_MASK_ASC) == PSW_ASC_HOME) in restore_sigregs()
178 regs->psw.mask = PSW_ASC_PRIMARY | in restore_sigregs()
179 (regs->psw.mask & ~PSW_MASK_ASC); in restore_sigregs()
181 if (regs->psw.mask & PSW_MASK_EA) in restore_sigregs()
182 regs->psw.mask |= PSW_MASK_BA; in restore_sigregs()
183 regs->psw.addr = user_sregs.regs.psw.addr; in restore_sigregs()
184 memcpy(®s->gprs, &user_sregs.regs.gprs, sizeof(sregs->regs.gprs)); in restore_sigregs()
185 memcpy(¤t->thread.acrs, &user_sregs.regs.acrs, in restore_sigregs()
191 clear_pt_regs_flag(regs, PIF_SYSCALL); /* No longer in a system call */ in restore_sigregs()
196 static int save_sigregs_ext(struct pt_regs *regs, in save_sigregs_ext() argument
216 static int restore_sigregs_ext(struct pt_regs *regs, in restore_sigregs_ext() argument
238 struct pt_regs *regs = task_pt_regs(current); in SYSCALL_DEFINE0() local
240 (struct sigframe __user *) regs->gprs[15]; in SYSCALL_DEFINE0()
246 if (restore_sigregs(regs, &frame->sregs)) in SYSCALL_DEFINE0()
248 if (restore_sigregs_ext(regs, &frame->sregs_ext)) in SYSCALL_DEFINE0()
251 return regs->gprs[2]; in SYSCALL_DEFINE0()
259 struct pt_regs *regs = task_pt_regs(current); in SYSCALL_DEFINE0() local
261 (struct rt_sigframe __user *)regs->gprs[15]; in SYSCALL_DEFINE0()
269 if (restore_sigregs(regs, &frame->uc.uc_mcontext)) in SYSCALL_DEFINE0()
271 if (restore_sigregs_ext(regs, &frame->uc.uc_mcontext_ext)) in SYSCALL_DEFINE0()
274 return regs->gprs[2]; in SYSCALL_DEFINE0()
284 get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size) in get_sigframe() argument
289 sp = regs->gprs[15]; in get_sigframe()
305 sigset_t *set, struct pt_regs * regs) in setup_frame() argument
321 frame = get_sigframe(ka, regs, frame_size); in setup_frame()
326 if (__put_user(regs->gprs[15], (addr_t __user *) frame)) in setup_frame()
339 if (save_sigregs(regs, &frame->sregs)) in setup_frame()
343 if (__put_user(regs->gprs[2], (int __user *) &frame->signo)) in setup_frame()
347 if (save_sigregs_ext(regs, &frame->sregs_ext)) in setup_frame()
363 regs->gprs[14] = restorer; in setup_frame()
364 regs->gprs[15] = (unsigned long) frame; in setup_frame()
366 regs->psw.mask = PSW_MASK_EA | PSW_MASK_BA | in setup_frame()
368 (regs->psw.mask & ~PSW_MASK_ASC); in setup_frame()
369 regs->psw.addr = (unsigned long) ka->sa.sa_handler | PSW_ADDR_AMODE; in setup_frame()
371 regs->gprs[2] = sig; in setup_frame()
372 regs->gprs[3] = (unsigned long) &frame->sc; in setup_frame()
379 regs->gprs[4] = regs->int_code & 127; in setup_frame()
380 regs->gprs[5] = regs->int_parm_long; in setup_frame()
381 regs->gprs[6] = task_thread_info(current)->last_break; in setup_frame()
387 struct pt_regs *regs) in setup_rt_frame() argument
406 frame = get_sigframe(&ksig->ka, regs, frame_size); in setup_rt_frame()
411 if (__put_user(regs->gprs[15], (addr_t __user *) frame)) in setup_rt_frame()
436 __save_altstack(&frame->uc.uc_stack, regs->gprs[15]) || in setup_rt_frame()
437 save_sigregs(regs, &frame->uc.uc_mcontext) || in setup_rt_frame()
439 save_sigregs_ext(regs, &frame->uc.uc_mcontext_ext)) in setup_rt_frame()
443 regs->gprs[14] = restorer; in setup_rt_frame()
444 regs->gprs[15] = (unsigned long) frame; in setup_rt_frame()
446 regs->psw.mask = PSW_MASK_EA | PSW_MASK_BA | in setup_rt_frame()
448 (regs->psw.mask & ~PSW_MASK_ASC); in setup_rt_frame()
449 regs->psw.addr = (unsigned long) ksig->ka.sa.sa_handler | PSW_ADDR_AMODE; in setup_rt_frame()
451 regs->gprs[2] = ksig->sig; in setup_rt_frame()
452 regs->gprs[3] = (unsigned long) &frame->info; in setup_rt_frame()
453 regs->gprs[4] = (unsigned long) &frame->uc; in setup_rt_frame()
454 regs->gprs[5] = task_thread_info(current)->last_break; in setup_rt_frame()
459 struct pt_regs *regs) in handle_signal() argument
465 ret = setup_rt_frame(ksig, oldset, regs); in handle_signal()
467 ret = setup_frame(ksig->sig, &ksig->ka, oldset, regs); in handle_signal()
481 void do_signal(struct pt_regs *regs) in do_signal() argument
492 test_pt_regs_flag(regs, PIF_SYSCALL) ? regs->int_code : 0; in do_signal()
497 regs->int_code = current_thread_info()->system_call; in do_signal()
499 switch (regs->gprs[2]) { in do_signal()
502 regs->gprs[2] = -EINTR; in do_signal()
506 regs->gprs[2] = -EINTR; in do_signal()
511 regs->gprs[2] = regs->orig_gpr2; in do_signal()
512 regs->psw.addr = in do_signal()
513 __rewind_psw(regs->psw, in do_signal()
514 regs->int_code >> 16); in do_signal()
519 clear_pt_regs_flag(regs, PIF_SYSCALL); in do_signal()
522 handle_signal32(&ksig, oldset, regs); in do_signal()
524 handle_signal(&ksig, oldset, regs); in do_signal()
529 clear_pt_regs_flag(regs, PIF_SYSCALL); in do_signal()
531 regs->int_code = current_thread_info()->system_call; in do_signal()
532 switch (regs->gprs[2]) { in do_signal()
535 regs->int_code = __NR_restart_syscall; in do_signal()
541 regs->gprs[2] = regs->orig_gpr2; in do_signal()
542 set_pt_regs_flag(regs, PIF_SYSCALL); in do_signal()
544 clear_pt_regs_flag(regs, PIF_PER_TRAP); in do_signal()
555 void do_notify_resume(struct pt_regs *regs) in do_notify_resume() argument
558 tracehook_notify_resume(regs); in do_notify_resume()