1 /* $NetBSD: compat_13_machdep.c,v 1.10 2001/07/12 23:35:42 thorpej Exp $ */ 2 3 /* 4 * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University. 5 * All rights reserved. 6 * 7 * Author: Chris G. Demetriou 8 * 9 * Permission to use, copy, modify and distribute this software and 10 * its documentation is hereby granted, provided that both the copyright 11 * notice and this permission notice appear in all copies of the 12 * software, derivative works or modified versions, and any portions 13 * thereof, and that both notices appear in supporting documentation. 14 * 15 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 16 * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND 17 * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 18 * 19 * Carnegie Mellon requests users of this software to return to 20 * 21 * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU 22 * School of Computer Science 23 * Carnegie Mellon University 24 * Pittsburgh PA 15213-3890 25 * 26 * any improvements or extensions that they make and grant Carnegie the 27 * rights to redistribute these changes. 28 */ 29 30 #include <sys/cdefs.h> /* RCS ID & Copyright macro defns */ 31 32 __KERNEL_RCSID(0, "$NetBSD: compat_13_machdep.c,v 1.10 2001/07/12 23:35:42 thorpej Exp $"); 33 34 #include <sys/param.h> 35 #include <sys/systm.h> 36 #include <sys/signalvar.h> 37 #include <sys/kernel.h> 38 #include <sys/proc.h> 39 #include <sys/user.h> 40 #include <sys/mount.h> 41 #include <sys/syscallargs.h> 42 43 #include <machine/cpu.h> 44 #include <machine/reg.h> 45 #include <machine/alpha.h> 46 47 /* 48 * System call to cleanup state after a signal 49 * has been taken. Reset signal mask and 50 * stack state from context left by sendsig (above). 51 * Return to previous pc and psl as specified by 52 * context left by sendsig. Check carefully to 53 * make sure that the user has not modified the 54 * psl to gain improper privileges or to cause 55 * a machine fault. 56 */ 57 /* ARGSUSED */ 58 int 59 compat_13_sys_sigreturn(p, v, retval) 60 struct proc *p; 61 void *v; 62 register_t *retval; 63 { 64 struct compat_13_sys_sigreturn_args /* { 65 syscallarg(struct sigcontext13 *) sigcntxp; 66 } */ *uap = v; 67 struct sigcontext13 *scp, ksc; 68 sigset13_t mask13; 69 sigset_t mask; 70 71 /* 72 * The trampoline code hands us the context. 73 * It is unsafe to keep track of it ourselves, in the event that a 74 * program jumps out of a signal handler. 75 */ 76 scp = SCARG(uap, sigcntxp); 77 if (ALIGN(scp) != (u_int64_t)scp) 78 return (EINVAL); 79 80 if (copyin((caddr_t)scp, &ksc, sizeof(ksc)) != 0) 81 return (EFAULT); 82 83 if (ksc.sc_regs[R_ZERO] != 0xACEDBADE) /* magic number */ 84 return (EINVAL); 85 86 /* Restore register context. */ 87 p->p_md.md_tf->tf_regs[FRAME_PC] = ksc.sc_pc; 88 p->p_md.md_tf->tf_regs[FRAME_PS] = 89 (ksc.sc_ps | ALPHA_PSL_USERSET) & ~ALPHA_PSL_USERCLR; 90 91 regtoframe((struct reg *)ksc.sc_regs, p->p_md.md_tf); 92 alpha_pal_wrusp(ksc.sc_regs[R_SP]); 93 94 /* XXX ksc.sc_ownedfp ? */ 95 if (p->p_addr->u_pcb.pcb_fpcpu != NULL) 96 fpusave_proc(p, 0); 97 memcpy(&p->p_addr->u_pcb.pcb_fp, (struct fpreg *)ksc.sc_fpregs, 98 sizeof(struct fpreg)); 99 /* XXX ksc.sc_fp_control ? */ 100 101 /* Restore signal stack. */ 102 if (ksc.sc_onstack & SS_ONSTACK) 103 p->p_sigctx.ps_sigstk.ss_flags |= SS_ONSTACK; 104 else 105 p->p_sigctx.ps_sigstk.ss_flags &= ~SS_ONSTACK; 106 107 /* 108 * Restore signal mask. Note the mask is a "long" in the stack 109 * frame. 110 */ 111 mask13 = ksc.sc_mask; 112 native_sigset13_to_sigset(&mask13, &mask); 113 (void) sigprocmask1(p, SIG_SETMASK, &mask, 0); 114 115 return (EJUSTRETURN); 116 } 117