Lines Matching refs:regs

118 static int save_sigregs(struct pt_regs *regs, _sigregs __user *sregs)  in save_sigregs()  argument
124 user_sregs.regs.psw.mask = PSW_USER_BITS | in save_sigregs()
125 (regs->psw.mask & (PSW_MASK_USER | PSW_MASK_RI)); in save_sigregs()
126 user_sregs.regs.psw.addr = regs->psw.addr; in save_sigregs()
127 memcpy(&user_sregs.regs.gprs, &regs->gprs, sizeof(sregs->regs.gprs)); in save_sigregs()
128 memcpy(&user_sregs.regs.acrs, current->thread.acrs, in save_sigregs()
129 sizeof(user_sregs.regs.acrs)); in save_sigregs()
136 static int restore_sigregs(struct pt_regs *regs, _sigregs __user *sregs) in restore_sigregs() argument
146 if (!is_ri_task(current) && (user_sregs.regs.psw.mask & PSW_MASK_RI)) in restore_sigregs()
154 regs->psw.mask = (regs->psw.mask & ~(PSW_MASK_USER | PSW_MASK_RI)) | in restore_sigregs()
155 (user_sregs.regs.psw.mask & (PSW_MASK_USER | PSW_MASK_RI)); in restore_sigregs()
157 if ((regs->psw.mask & PSW_MASK_ASC) == PSW_ASC_HOME) in restore_sigregs()
158 regs->psw.mask = PSW_ASC_PRIMARY | in restore_sigregs()
159 (regs->psw.mask & ~PSW_MASK_ASC); in restore_sigregs()
161 if (regs->psw.mask & PSW_MASK_EA) in restore_sigregs()
162 regs->psw.mask |= PSW_MASK_BA; in restore_sigregs()
163 regs->psw.addr = user_sregs.regs.psw.addr; in restore_sigregs()
164 memcpy(&regs->gprs, &user_sregs.regs.gprs, sizeof(sregs->regs.gprs)); in restore_sigregs()
165 memcpy(&current->thread.acrs, &user_sregs.regs.acrs, in restore_sigregs()
170 clear_pt_regs_flag(regs, PIF_SYSCALL); /* No longer in a system call */ in restore_sigregs()
175 static int save_sigregs_ext(struct pt_regs *regs, in save_sigregs_ext() argument
195 static int restore_sigregs_ext(struct pt_regs *regs, in restore_sigregs_ext() argument
217 struct pt_regs *regs = task_pt_regs(current); in SYSCALL_DEFINE0() local
219 (struct sigframe __user *) regs->gprs[15]; in SYSCALL_DEFINE0()
226 if (restore_sigregs(regs, &frame->sregs)) in SYSCALL_DEFINE0()
228 if (restore_sigregs_ext(regs, &frame->sregs_ext)) in SYSCALL_DEFINE0()
231 return regs->gprs[2]; in SYSCALL_DEFINE0()
239 struct pt_regs *regs = task_pt_regs(current); in SYSCALL_DEFINE0() local
241 (struct rt_sigframe __user *)regs->gprs[15]; in SYSCALL_DEFINE0()
250 if (restore_sigregs(regs, &frame->uc.uc_mcontext)) in SYSCALL_DEFINE0()
252 if (restore_sigregs_ext(regs, &frame->uc.uc_mcontext_ext)) in SYSCALL_DEFINE0()
255 return regs->gprs[2]; in SYSCALL_DEFINE0()
265 get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size) in get_sigframe() argument
270 sp = regs->gprs[15]; in get_sigframe()
286 sigset_t *set, struct pt_regs * regs) in setup_frame() argument
302 frame = get_sigframe(ka, regs, frame_size); in setup_frame()
307 if (__put_user(regs->gprs[15], (addr_t __user *) frame)) in setup_frame()
320 if (save_sigregs(regs, &frame->sregs)) in setup_frame()
324 if (__put_user(regs->gprs[2], (int __user *) &frame->signo)) in setup_frame()
328 if (save_sigregs_ext(regs, &frame->sregs_ext)) in setup_frame()
344 regs->gprs[14] = restorer; in setup_frame()
345 regs->gprs[15] = (unsigned long) frame; in setup_frame()
347 regs->psw.mask = PSW_MASK_EA | PSW_MASK_BA | in setup_frame()
349 (regs->psw.mask & ~PSW_MASK_ASC); in setup_frame()
350 regs->psw.addr = (unsigned long) ka->sa.sa_handler | PSW_ADDR_AMODE; in setup_frame()
352 regs->gprs[2] = sig; in setup_frame()
353 regs->gprs[3] = (unsigned long) &frame->sc; in setup_frame()
360 regs->gprs[4] = regs->int_code & 127; in setup_frame()
361 regs->gprs[5] = regs->int_parm_long; in setup_frame()
362 regs->gprs[6] = task_thread_info(current)->last_break; in setup_frame()
368 struct pt_regs *regs) in setup_rt_frame() argument
386 frame = get_sigframe(&ksig->ka, regs, frame_size); in setup_rt_frame()
391 if (__put_user(regs->gprs[15], (addr_t __user *) frame)) in setup_rt_frame()
416 __save_altstack(&frame->uc.uc_stack, regs->gprs[15]) || in setup_rt_frame()
417 save_sigregs(regs, &frame->uc.uc_mcontext) || in setup_rt_frame()
419 save_sigregs_ext(regs, &frame->uc.uc_mcontext_ext)) in setup_rt_frame()
423 regs->gprs[14] = restorer; in setup_rt_frame()
424 regs->gprs[15] = (unsigned long) frame; in setup_rt_frame()
426 regs->psw.mask = PSW_MASK_EA | PSW_MASK_BA | in setup_rt_frame()
428 (regs->psw.mask & ~PSW_MASK_ASC); in setup_rt_frame()
429 regs->psw.addr = (unsigned long) ksig->ka.sa.sa_handler | PSW_ADDR_AMODE; in setup_rt_frame()
431 regs->gprs[2] = ksig->sig; in setup_rt_frame()
432 regs->gprs[3] = (unsigned long) &frame->info; in setup_rt_frame()
433 regs->gprs[4] = (unsigned long) &frame->uc; in setup_rt_frame()
434 regs->gprs[5] = task_thread_info(current)->last_break; in setup_rt_frame()
439 struct pt_regs *regs) in handle_signal() argument
445 ret = setup_rt_frame(ksig, oldset, regs); in handle_signal()
447 ret = setup_frame(ksig->sig, &ksig->ka, oldset, regs); in handle_signal()
461 void do_signal(struct pt_regs *regs) in do_signal() argument
472 test_pt_regs_flag(regs, PIF_SYSCALL) ? regs->int_code : 0; in do_signal()
477 regs->int_code = current_thread_info()->system_call; in do_signal()
479 switch (regs->gprs[2]) { in do_signal()
482 regs->gprs[2] = -EINTR; in do_signal()
486 regs->gprs[2] = -EINTR; in do_signal()
491 regs->gprs[2] = regs->orig_gpr2; in do_signal()
492 regs->psw.addr = in do_signal()
493 __rewind_psw(regs->psw, in do_signal()
494 regs->int_code >> 16); in do_signal()
499 clear_pt_regs_flag(regs, PIF_SYSCALL); in do_signal()
502 handle_signal32(&ksig, oldset, regs); in do_signal()
504 handle_signal(&ksig, oldset, regs); in do_signal()
509 clear_pt_regs_flag(regs, PIF_SYSCALL); in do_signal()
511 regs->int_code = current_thread_info()->system_call; in do_signal()
512 switch (regs->gprs[2]) { in do_signal()
515 regs->int_code = __NR_restart_syscall; in do_signal()
521 regs->gprs[2] = regs->orig_gpr2; in do_signal()
522 set_pt_regs_flag(regs, PIF_SYSCALL); in do_signal()
524 clear_pt_regs_flag(regs, PIF_PER_TRAP); in do_signal()
535 void do_notify_resume(struct pt_regs *regs) in do_notify_resume() argument
538 tracehook_notify_resume(regs); in do_notify_resume()