1*6e304966Shannken /*	$NetBSD: netbsd32_machdep_13.c,v 1.3 2019/01/30 10:11:11 hannken Exp $	*/
2cc17ee2eSpgoyette 
3cc17ee2eSpgoyette /*
4cc17ee2eSpgoyette  * Copyright (c) 1998, 2001 Matthew R. Green
5cc17ee2eSpgoyette  * All rights reserved.
6cc17ee2eSpgoyette  *
7cc17ee2eSpgoyette  * Redistribution and use in source and binary forms, with or without
8cc17ee2eSpgoyette  * modification, are permitted provided that the following conditions
9cc17ee2eSpgoyette  * are met:
10cc17ee2eSpgoyette  * 1. Redistributions of source code must retain the above copyright
11cc17ee2eSpgoyette  *    notice, this list of conditions and the following disclaimer.
12cc17ee2eSpgoyette  * 2. Redistributions in binary form must reproduce the above copyright
13cc17ee2eSpgoyette  *    notice, this list of conditions and the following disclaimer in the
14cc17ee2eSpgoyette  *    documentation and/or other materials provided with the distribution.
15cc17ee2eSpgoyette  *
16cc17ee2eSpgoyette  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17cc17ee2eSpgoyette  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18cc17ee2eSpgoyette  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19cc17ee2eSpgoyette  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20cc17ee2eSpgoyette  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21cc17ee2eSpgoyette  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22cc17ee2eSpgoyette  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23cc17ee2eSpgoyette  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24cc17ee2eSpgoyette  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25cc17ee2eSpgoyette  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26cc17ee2eSpgoyette  * SUCH DAMAGE.
27cc17ee2eSpgoyette  */
28cc17ee2eSpgoyette 
29cc17ee2eSpgoyette #include <sys/cdefs.h>
30*6e304966Shannken __KERNEL_RCSID(0, "$NetBSD: netbsd32_machdep_13.c,v 1.3 2019/01/30 10:11:11 hannken Exp $");
31cc17ee2eSpgoyette 
32cc17ee2eSpgoyette #ifdef _KERNEL_OPT
33cc17ee2eSpgoyette #include "opt_compat_netbsd.h"
34cc17ee2eSpgoyette #include "opt_modular.h"
35cc17ee2eSpgoyette #include "opt_execfmt.h"
36cc17ee2eSpgoyette #include "firm_events.h"
37cc17ee2eSpgoyette #endif
38cc17ee2eSpgoyette 
39cc17ee2eSpgoyette #include <sys/param.h>
40cc17ee2eSpgoyette #include <sys/exec.h>
41cc17ee2eSpgoyette #include <sys/exec_aout.h>
42cc17ee2eSpgoyette #include <sys/filedesc.h>
43cc17ee2eSpgoyette #include <sys/file.h>
44cc17ee2eSpgoyette #include <sys/proc.h>
45cc17ee2eSpgoyette #include <sys/signalvar.h>
46cc17ee2eSpgoyette #include <sys/systm.h>
47cc17ee2eSpgoyette #include <sys/core.h>
48cc17ee2eSpgoyette #include <sys/mount.h>
49cc17ee2eSpgoyette #include <sys/buf.h>
50cc17ee2eSpgoyette #include <sys/vnode.h>
51cc17ee2eSpgoyette #include <sys/select.h>
52cc17ee2eSpgoyette #include <sys/socketvar.h>
53cc17ee2eSpgoyette #include <sys/ucontext.h>
54cc17ee2eSpgoyette #include <sys/ioctl.h>
55cc17ee2eSpgoyette #include <sys/kmem.h>
56cc17ee2eSpgoyette 
57cc17ee2eSpgoyette #include <dev/sun/event_var.h>
58cc17ee2eSpgoyette 
59cc17ee2eSpgoyette #include <net/if.h>
60cc17ee2eSpgoyette #include <net/route.h>
61cc17ee2eSpgoyette 
62cc17ee2eSpgoyette #include <netinet/in.h>
63cc17ee2eSpgoyette #include <netinet/in_var.h>
64cc17ee2eSpgoyette #include <netinet/igmp.h>
65cc17ee2eSpgoyette #include <netinet/igmp_var.h>
66cc17ee2eSpgoyette #include <netinet/ip_mroute.h>
67cc17ee2eSpgoyette 
68cc17ee2eSpgoyette #include <compat/netbsd32/netbsd32.h>
69cc17ee2eSpgoyette #include <compat/netbsd32/netbsd32_ioctl.h>
70cc17ee2eSpgoyette #include <compat/netbsd32/netbsd32_syscallargs.h>
71cc17ee2eSpgoyette #include <compat/netbsd32/netbsd32_exec.h>
72cc17ee2eSpgoyette 
73cc17ee2eSpgoyette #include <compat/sys/signal.h>
74cc17ee2eSpgoyette #include <compat/sys/signalvar.h>
75cc17ee2eSpgoyette #include <compat/sys/siginfo.h>
76cc17ee2eSpgoyette #include <compat/sys/ucontext.h>
77cc17ee2eSpgoyette 
78cc17ee2eSpgoyette #include <machine/frame.h>
79cc17ee2eSpgoyette #include <machine/pcb.h>
80cc17ee2eSpgoyette #include <machine/reg.h>
81cc17ee2eSpgoyette #include <machine/vmparam.h>
82cc17ee2eSpgoyette #include <machine/vuid_event.h>
83cc17ee2eSpgoyette #include <machine/netbsd32_machdep.h>
84cc17ee2eSpgoyette #include <machine/userret.h>
85cc17ee2eSpgoyette 
86*6e304966Shannken #ifdef DEBUG
87*6e304966Shannken #include <sparc64/sparc64/sigdebug.h>
88*6e304966Shannken #endif
89*6e304966Shannken 
90cc17ee2eSpgoyette int
compat_13_netbsd32_sigreturn(struct lwp * l,const struct compat_13_netbsd32_sigreturn_args * uap,register_t * retval)91cc17ee2eSpgoyette compat_13_netbsd32_sigreturn(struct lwp *l, const struct compat_13_netbsd32_sigreturn_args *uap, register_t *retval)
92cc17ee2eSpgoyette {
93cc17ee2eSpgoyette 	/* {
94cc17ee2eSpgoyette 		syscallarg(struct netbsd32_sigcontext13 *) sigcntxp;
95cc17ee2eSpgoyette 	} */
96cc17ee2eSpgoyette 	struct netbsd32_sigcontext13 *scp;
97cc17ee2eSpgoyette 	struct netbsd32_sigcontext13 sc;
98cc17ee2eSpgoyette 	struct trapframe64 *tf;
99cc17ee2eSpgoyette 	struct proc *p = l->l_proc;
100cc17ee2eSpgoyette 	sigset_t mask;
101cc17ee2eSpgoyette 
102cc17ee2eSpgoyette 	/* First ensure consistent stack state (see sendsig). */
103cc17ee2eSpgoyette 	write_user_windows();
104cc17ee2eSpgoyette 	if (rwindow_save(l)) {
105cc17ee2eSpgoyette #ifdef DEBUG
106cc17ee2eSpgoyette 		printf("%s: rwindow_save(%p) failed, sending SIGILL\n",
107cc17ee2eSpgoyette 		    __func__, p);
108cc17ee2eSpgoyette 		Debugger();
109cc17ee2eSpgoyette #endif
110cc17ee2eSpgoyette 		mutex_enter(p->p_lock);
111cc17ee2eSpgoyette 		sigexit(l, SIGILL);
112cc17ee2eSpgoyette 	}
113cc17ee2eSpgoyette #ifdef DEBUG
114cc17ee2eSpgoyette 	if (sigdebug & SDB_FOLLOW) {
115*6e304966Shannken 		printf("%s: %s[%d], sigcntxp %u\n", __func__,
116cc17ee2eSpgoyette 		    p->p_comm, p->p_pid, SCARG(uap, sigcntxp));
117cc17ee2eSpgoyette 		if (sigdebug & SDB_DDB) Debugger();
118cc17ee2eSpgoyette 	}
119cc17ee2eSpgoyette #endif
120cc17ee2eSpgoyette 	scp = (struct netbsd32_sigcontext13 *)(u_long)SCARG(uap, sigcntxp);
121cc17ee2eSpgoyette  	if ((vaddr_t)scp & 3 || (copyin((void *)scp, &sc, sizeof sc) != 0))
122cc17ee2eSpgoyette 	{
123cc17ee2eSpgoyette #ifdef DEBUG
124cc17ee2eSpgoyette 		printf("%s: copyin failed\n", __func__);
125cc17ee2eSpgoyette 		Debugger();
126cc17ee2eSpgoyette #endif
127cc17ee2eSpgoyette 		return (EINVAL);
128cc17ee2eSpgoyette 	}
129cc17ee2eSpgoyette 	scp = &sc;
130cc17ee2eSpgoyette 
131cc17ee2eSpgoyette 	tf = l->l_md.md_tf;
132cc17ee2eSpgoyette 	/*
133cc17ee2eSpgoyette 	 * Only the icc bits in the psr are used, so it need not be
134cc17ee2eSpgoyette 	 * verified.  pc and npc must be multiples of 4.  This is all
135cc17ee2eSpgoyette 	 * that is required; if it holds, just do it.
136cc17ee2eSpgoyette 	 */
137cc17ee2eSpgoyette 	if (((sc.sc_pc | sc.sc_npc) & 3) != 0)
138cc17ee2eSpgoyette #ifdef DEBUG
139cc17ee2eSpgoyette 	{
140*6e304966Shannken 		printf("%s: pc %d or npc %d invalid\n",
141cc17ee2eSpgoyette 		   __func__, sc.sc_pc, sc.sc_npc);
142cc17ee2eSpgoyette 		Debugger();
143cc17ee2eSpgoyette 		return (EINVAL);
144cc17ee2eSpgoyette 	}
145cc17ee2eSpgoyette #else
146cc17ee2eSpgoyette 		return (EINVAL);
147cc17ee2eSpgoyette #endif
148cc17ee2eSpgoyette 	/* take only psr ICC field */
149cc17ee2eSpgoyette 	tf->tf_tstate = (int64_t)(tf->tf_tstate & ~TSTATE_CCR) | PSRCC_TO_TSTATE(sc.sc_psr);
150cc17ee2eSpgoyette 	tf->tf_pc = (int64_t)sc.sc_pc;
151cc17ee2eSpgoyette 	tf->tf_npc = (int64_t)sc.sc_npc;
152cc17ee2eSpgoyette 	tf->tf_global[1] = (int64_t)sc.sc_g1;
153cc17ee2eSpgoyette 	tf->tf_out[0] = (int64_t)sc.sc_o0;
154cc17ee2eSpgoyette 	tf->tf_out[6] = (int64_t)sc.sc_sp;
155cc17ee2eSpgoyette #ifdef DEBUG
156cc17ee2eSpgoyette 	if (sigdebug & SDB_FOLLOW) {
157*6e304966Shannken 		printf("%s: return trapframe pc=%d sp=%d tstate=%x\n", __func__,
158cc17ee2eSpgoyette 		       (int)tf->tf_pc, (int)tf->tf_out[6], (int)tf->tf_tstate);
159cc17ee2eSpgoyette 		if (sigdebug & SDB_DDB) Debugger();
160cc17ee2eSpgoyette 	}
161cc17ee2eSpgoyette #endif
162cc17ee2eSpgoyette 	mutex_enter(p->p_lock);
163cc17ee2eSpgoyette 	if (scp->sc_onstack & SS_ONSTACK)
164cc17ee2eSpgoyette 		l->l_sigstk.ss_flags |= SS_ONSTACK;
165cc17ee2eSpgoyette 	else
166cc17ee2eSpgoyette 		l->l_sigstk.ss_flags &= ~SS_ONSTACK;
167cc17ee2eSpgoyette 	/* Restore signal mask */
168cc17ee2eSpgoyette 	native_sigset13_to_sigset((sigset13_t *)&scp->sc_mask, &mask);
169cc17ee2eSpgoyette 	(void) sigprocmask1(l, SIG_SETMASK, &mask, 0);
170cc17ee2eSpgoyette 	mutex_exit(p->p_lock);
171cc17ee2eSpgoyette 
172cc17ee2eSpgoyette 	return (EJUSTRETURN);
173cc17ee2eSpgoyette }
174cc17ee2eSpgoyette 
175cc17ee2eSpgoyette void
netbsd32_machdep_md_13_init(void)176cc17ee2eSpgoyette netbsd32_machdep_md_13_init(void)
177cc17ee2eSpgoyette {
178cc17ee2eSpgoyette 
179cc17ee2eSpgoyette 	/* Nothing to do */
180cc17ee2eSpgoyette }
181cc17ee2eSpgoyette 
182cc17ee2eSpgoyette void
netbsd32_machdep_md_13_fini(void)183cc17ee2eSpgoyette netbsd32_machdep_md_13_fini(void)
184cc17ee2eSpgoyette {
185cc17ee2eSpgoyette 
186cc17ee2eSpgoyette 	/* Nothing to do */
187cc17ee2eSpgoyette }
188