compat_13_machdep.c revision 1.3
11.3Seeh/* $NetBSD: compat_13_machdep.c,v 1.3 1998/11/16 06:51:35 eeh Exp $ */ 21.1Sthorpej 31.1Sthorpej/*- 41.1Sthorpej * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc. 51.1Sthorpej * All rights reserved. 61.1Sthorpej * 71.1Sthorpej * This code is derived from software contributed to The NetBSD Foundation 81.1Sthorpej * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, 91.1Sthorpej * NASA Ames Research Center. 101.1Sthorpej * 111.1Sthorpej * Redistribution and use in source and binary forms, with or without 121.1Sthorpej * modification, are permitted provided that the following conditions 131.1Sthorpej * are met: 141.1Sthorpej * 1. Redistributions of source code must retain the above copyright 151.1Sthorpej * notice, this list of conditions and the following disclaimer. 161.1Sthorpej * 2. Redistributions in binary form must reproduce the above copyright 171.1Sthorpej * notice, this list of conditions and the following disclaimer in the 181.1Sthorpej * documentation and/or other materials provided with the distribution. 191.1Sthorpej * 3. All advertising materials mentioning features or use of this software 201.1Sthorpej * must display the following acknowledgement: 211.1Sthorpej * This product includes software developed by the NetBSD 221.1Sthorpej * Foundation, Inc. and its contributors. 231.1Sthorpej * 4. Neither the name of The NetBSD Foundation nor the names of its 241.1Sthorpej * contributors may be used to endorse or promote products derived 251.1Sthorpej * from this software without specific prior written permission. 261.1Sthorpej * 271.1Sthorpej * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 281.1Sthorpej * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 291.1Sthorpej * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 301.1Sthorpej * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 311.1Sthorpej * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 321.1Sthorpej * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 331.1Sthorpej * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 341.1Sthorpej * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 351.1Sthorpej * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 361.1Sthorpej * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 371.1Sthorpej * POSSIBILITY OF SUCH DAMAGE. 381.1Sthorpej */ 391.1Sthorpej 401.1Sthorpej#include <sys/param.h> 411.1Sthorpej#include <sys/systm.h> 421.1Sthorpej#include <sys/proc.h> 431.1Sthorpej#include <sys/user.h> 441.1Sthorpej#include <sys/kernel.h> 451.1Sthorpej#include <sys/mount.h> 461.1Sthorpej#include <sys/signal.h> 471.1Sthorpej#include <sys/signalvar.h> 481.1Sthorpej 491.1Sthorpej#include <sys/syscallargs.h> 501.1Sthorpej 511.1Sthorpej/* 521.1Sthorpej * System call to cleanup state after a signal 531.1Sthorpej * has been taken. Reset signal mask and 541.1Sthorpej * stack state from context left by sendsig (above), 551.1Sthorpej * and return to the given trap frame (if there is one). 561.1Sthorpej * Check carefully to make sure that the user has not 571.1Sthorpej * modified the state to gain improper privileges or to cause 581.1Sthorpej * a machine fault. 591.1Sthorpej */ 601.1Sthorpej/* ARGSUSED */ 611.1Sthorpejint 621.1Sthorpejcompat_13_sys_sigreturn(p, v, retval) 631.1Sthorpej struct proc *p; 641.1Sthorpej void *v; 651.1Sthorpej register_t *retval; 661.1Sthorpej{ 671.1Sthorpej struct compat_13_sys_sigreturn_args /* { 681.1Sthorpej syscallarg(struct sigcontext13 *) sigcntxp; 691.1Sthorpej } */ *uap = v; 701.1Sthorpej struct sigcontext13 sc, *scp; 711.1Sthorpej sigset_t mask; 721.1Sthorpej struct trapframe *tf; 731.1Sthorpej 741.1Sthorpej /* First ensure consistent stack state (see sendsig). */ 751.1Sthorpej write_user_windows(); 761.1Sthorpej#if 0 771.1Sthorpej /* Make sure our D$ is not polluted w/bad data */ 781.1Sthorpej blast_vcache(); 791.1Sthorpej#endif 801.1Sthorpej if (rwindow_save(p)) 811.1Sthorpej sigexit(p, SIGILL); 821.1Sthorpej 831.1Sthorpej scp = SCARG(uap, sigcntxp); 841.2Seeh if ((vaddr_t)scp & 3 || (copyin((caddr_t)scp, &sc, sizeof sc) != 0)) 851.1Sthorpej return (EFAULT); 861.1Sthorpej scp = ≻ 871.1Sthorpej 881.1Sthorpej tf = p->p_md.md_tf; 891.1Sthorpej /* 901.1Sthorpej * Only the icc bits in the psr are used, so it need not be 911.1Sthorpej * verified. pc and npc must be multiples of 4. This is all 921.1Sthorpej * that is required; if it holds, just do it. 931.1Sthorpej */ 941.3Seeh if (((scp->sc_pc | scp->sc_npc) & 3) != 0 || scp->sc_pc == 0 || scp->sc_npc == 0) 951.3Seeh#ifdef DEBUG 961.3Seeh { 971.3Seeh printf("sigreturn13: pc %p or npc %p invalid\n", scp->sc_pc, scp->sc_npc); 981.3Seeh Debugger(); 991.3Seeh return (EINVAL); 1001.3Seeh } 1011.3Seeh#endif 1021.1Sthorpej return (EINVAL); 1031.1Sthorpej /* take only psr ICC field */ 1041.2Seeh#ifdef _LP64 1051.2Seeh tf->tf_tstate = (int64_t)(tf->tf_tstate & ~TSTATE_CCR) | scp->sc_tstate; 1061.2Seeh#else 1071.1Sthorpej tf->tf_tstate = (int64_t)(tf->tf_tstate & ~TSTATE_CCR) | PSRCC_TO_TSTATE(scp->sc_psr); 1081.2Seeh#endif 1091.1Sthorpej tf->tf_pc = scp->sc_pc; 1101.1Sthorpej tf->tf_npc = scp->sc_npc; 1111.1Sthorpej tf->tf_global[1] = scp->sc_g1; 1121.1Sthorpej tf->tf_out[0] = scp->sc_o0; 1131.1Sthorpej tf->tf_out[6] = scp->sc_sp; 1141.1Sthorpej 1151.1Sthorpej if (scp->sc_onstack & SS_ONSTACK) 1161.1Sthorpej p->p_sigacts->ps_sigstk.ss_flags |= SS_ONSTACK; 1171.1Sthorpej else 1181.1Sthorpej p->p_sigacts->ps_sigstk.ss_flags &= ~SS_ONSTACK; 1191.1Sthorpej 1201.1Sthorpej /* Restore signal mask */ 1211.1Sthorpej native_sigset13_to_sigset(&scp->sc_mask, &mask); 1221.1Sthorpej (void) sigprocmask1(p, SIG_SETMASK, &mask, 0); 1231.1Sthorpej 1241.1Sthorpej return (EJUSTRETURN); 1251.1Sthorpej} 126