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 = ≻
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