xref: /netbsd-src/sys/arch/sparc/sparc/trap.c (revision 68fa58437753598de948829082f591c269b48777)
1 /*	$NetBSD: trap.c,v 1.201 2023/10/05 19:41:05 ad Exp $ */
2 
3 /*
4  * Copyright (c) 1996
5  *	The President and Fellows of Harvard College. All rights reserved.
6  * Copyright (c) 1992, 1993
7  *	The Regents of the University of California.  All rights reserved.
8  *
9  * This software was developed by the Computer Systems Engineering group
10  * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
11  * contributed to Berkeley.
12  *
13  * All advertising materials mentioning features or use of this software
14  * must display the following acknowledgement:
15  *	This product includes software developed by the University of
16  *	California, Lawrence Berkeley Laboratory.
17  *	This product includes software developed by Harvard University.
18  *
19  * Redistribution and use in source and binary forms, with or without
20  * modification, are permitted provided that the following conditions
21  * are met:
22  * 1. Redistributions of source code must retain the above copyright
23  *    notice, this list of conditions and the following disclaimer.
24  * 2. Redistributions in binary form must reproduce the above copyright
25  *    notice, this list of conditions and the following disclaimer in the
26  *    documentation and/or other materials provided with the distribution.
27  * 3. All advertising materials mentioning features or use of this software
28  *    must display the following acknowledgement:
29  *	This product includes software developed by the University of
30  *	California, Berkeley and its contributors.
31  *	This product includes software developed by Harvard University.
32  * 4. Neither the name of the University nor the names of its contributors
33  *    may be used to endorse or promote products derived from this software
34  *    without specific prior written permission.
35  *
36  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
37  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
38  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
39  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
40  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
41  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
42  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
43  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
44  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
45  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
46  * SUCH DAMAGE.
47  *
48  *	@(#)trap.c	8.4 (Berkeley) 9/23/93
49  */
50 
51 #include <sys/cdefs.h>
52 __KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.201 2023/10/05 19:41:05 ad Exp $");
53 
54 #include "opt_ddb.h"
55 #include "opt_compat_sunos.h"
56 #include "opt_sparc_arch.h"
57 #include "opt_multiprocessor.h"
58 
59 #include <sys/param.h>
60 #include <sys/systm.h>
61 #include <sys/proc.h>
62 #include <sys/kernel.h>
63 #include <sys/kmem.h>
64 #include <sys/resource.h>
65 #include <sys/signal.h>
66 #include <sys/wait.h>
67 #include <sys/syscall.h>
68 #include <sys/syslog.h>
69 #include <sys/kauth.h>
70 
71 #include <uvm/uvm_extern.h>
72 
73 #include <sparc/sparc/asm.h>
74 #include <machine/cpu.h>
75 #include <machine/ctlreg.h>
76 #include <machine/trap.h>
77 #include <machine/instr.h>
78 #include <machine/pcb.h>
79 #include <machine/pmap.h>
80 #include <machine/userret.h>
81 #include <machine/locore.h>
82 
83 #ifdef DDB
84 #include <machine/db_machdep.h>
85 #else
86 #include <machine/frame.h>
87 #endif
88 #ifdef COMPAT_SUNOS
89 #include <compat/sunos/sunos_exec.h>
90 #define SUNOS_MAXSADDR_SLOP (32 * 1024)
91 #endif
92 
93 #include <sparc/fpu/fpu_extern.h>
94 #include <sparc/sparc/memreg.h>
95 #include <sparc/sparc/cpuvar.h>
96 
97 #ifdef DEBUG
98 int	rwindow_debug = 0;
99 #endif
100 
101 /*
102  * Initial FPU state is all registers == all 1s, everything else == all 0s.
103  * This makes every floating point register a signalling NaN, with sign bit
104  * set, no matter how it is interpreted.  Appendix N of the Sparc V8 document
105  * seems to imply that we should do this, and it does make sense.
106  */
107 struct fpstate initfpstate = {
108     .fs_reg = {
109 	.fr_regs = {
110 	    ~0, ~0, ~0, ~0, ~0, ~0, ~0, ~0, ~0, ~0, ~0, ~0, ~0, ~0, ~0, ~0,
111 	    ~0, ~0, ~0, ~0, ~0, ~0, ~0, ~0, ~0, ~0, ~0, ~0, ~0, ~0, ~0, ~0,
112 	},
113 	.fr_fsr = 0,
114     },
115     .fs_qsize = 0,
116     .fs_queue = { {
117 	.fq_addr = NULL,
118 	.fq_instr = 0,
119     }, },
120 };
121 
122 /*
123  * There are more than 100 trap types, but most are unused.
124  *
125  * Trap type 0 is taken over as an `Asynchronous System Trap'.
126  * This is left-over Vax emulation crap that should be fixed.
127  */
128 static const char T[] = "trap";
129 const char *trap_type[] = {
130 	/* non-user vectors */
131 	"ast",			/* 0 */
132 	"text fault",		/* 1 */
133 	"illegal instruction",	/* 2 */
134 	"privileged instruction",/*3 */
135 	"fp disabled",		/* 4 */
136 	"window overflow",	/* 5 */
137 	"window underflow",	/* 6 */
138 	"alignment fault",	/* 7 */
139 	"fp exception",		/* 8 */
140 	"data fault",		/* 9 */
141 	"tag overflow",		/* 0a */
142 	"watchpoint",		/* 0b */
143 	T, T, T, T, T,		/* 0c..10 */
144 	"level 1 int",		/* 11 */
145 	"level 2 int",		/* 12 */
146 	"level 3 int",		/* 13 */
147 	"level 4 int",		/* 14 */
148 	"level 5 int",		/* 15 */
149 	"level 6 int",		/* 16 */
150 	"level 7 int",		/* 17 */
151 	"level 8 int",		/* 18 */
152 	"level 9 int",		/* 19 */
153 	"level 10 int",		/* 1a */
154 	"level 11 int",		/* 1b */
155 	"level 12 int",		/* 1c */
156 	"level 13 int",		/* 1d */
157 	"level 14 int",		/* 1e */
158 	"level 15 int",		/* 1f */
159 	"register access error",/* 20 */
160 	"instruction access error",/* 21 */
161 	T, T,			/* 22..23 */
162 	"cp disabled",		/* 24 */
163 	"unimplemented flush",	/* 25 */
164 	T, T,			/* 26..27 */
165 	"cp exception",		/* 28 */
166 	"data access error",	/* 29 */
167 	"hw zero divide",	/* 2a */
168 	"data store error",	/* 2b */
169 	"data access MMU miss",	/* 2c */
170 	T, T, T,		/* 2d..2f */
171 	T, T, T, T, T, T, T, T,	/* 30..37 */
172 	T, T, T, T,		/* 38..3b */
173 	"insn access MMU miss",	/* 3c */
174 	T, T, T,		/* 3d..3f */
175 	T, T, T, T, T, T, T, T,	/* 40..47 */
176 	T, T, T, T, T, T, T, T,	/* 48..4f */
177 	T, T, T, T, T, T, T, T,	/* 50..57 */
178 	T, T, T, T, T, T, T, T,	/* 58..5f */
179 	T, T, T, T, T, T, T, T,	/* 60..67 */
180 	T, T, T, T, T, T, T, T,	/* 68..6f */
181 	T, T, T, T, T, T, T, T,	/* 70..77 */
182 	T, T, T, T, T, T, T, T,	/* 78..7f */
183 
184 	/* user (software trap) vectors */
185 	"syscall",		/* 80 */
186 	"breakpoint",		/* 81 */
187 	"zero divide",		/* 82 */
188 	"flush windows",	/* 83 */
189 	"clean windows",	/* 84 */
190 	"range check",		/* 85 */
191 	"fix align",		/* 86 */
192 	"integer overflow",	/* 87 */
193 	"svr4 syscall",		/* 88 */
194 	"4.4 syscall",		/* 89 */
195 	"kgdb exec",		/* 8a */
196 	T, T, T, T, T,		/* 8b..8f */
197 	T, T, T, T, T, T, T, T,	/* 9a..97 */
198 	T, T, T, T, T, T, T, T,	/* 98..9f */
199 	"svr4 getcc",		/* a0 */
200 	"svr4 setcc",		/* a1 */
201 	"svr4 getpsr",		/* a2 */
202 	"svr4 setpsr",		/* a3 */
203 	"svr4 gethrtime",	/* a4 */
204 	"svr4 gethrvtime",	/* a5 */
205 	T,			/* a6 */
206 	"svr4 gethrestime",	/* a7 */
207 };
208 
209 #define	N_TRAP_TYPES	(sizeof trap_type / sizeof *trap_type)
210 
211 void trap(unsigned, int, int, struct trapframe *);
212 void mem_access_fault(unsigned, int, u_int, int, int, struct trapframe *);
213 void mem_access_fault4m(unsigned, u_int, u_int, struct trapframe *);
214 
215 int ignore_bogus_traps = 1;
216 
217 /*
218  * Called from locore.s trap handling, for non-MMU-related traps.
219  * (MMU-related traps go through mem_access_fault, below.)
220  */
221 void
trap(unsigned type,int psr,int pc,struct trapframe * tf)222 trap(unsigned type, int psr, int pc, struct trapframe *tf)
223 {
224 	struct proc *p;
225 	struct lwp *l;
226 	struct pcb *pcb;
227 	int n, s;
228 	char bits[64];
229 	u_quad_t sticks;
230 	ksiginfo_t ksi;
231 	int code, sig;
232 
233 	/* This steps the PC over the trap. */
234 #define	ADVANCE (n = tf->tf_npc, tf->tf_pc = n, tf->tf_npc = n + 4)
235 
236 	curcpu()->ci_data.cpu_ntrap++;
237 	/*
238 	 * Generally, kernel traps cause a panic.  Any exceptions are
239 	 * handled early here.
240 	 */
241 	if (psr & PSR_PS) {
242 #ifdef DDB
243 		if (type == T_BREAKPOINT) {
244 			write_all_windows();
245 			if (kdb_trap(type, tf)) {
246 				return;
247 			}
248 		}
249 #if defined(MULTIPROCESSOR)
250 		if (type == T_DBPAUSE) {
251 			/* XXX - deal with kgdb too */
252 			write_all_windows();
253 			ddb_suspend(tf);
254 			ADVANCE;
255 			return;
256 		}
257 #endif
258 #endif
259 #ifdef DIAGNOSTIC
260 		/*
261 		 * Currently, we allow DIAGNOSTIC kernel code to
262 		 * flush the windows to record stack traces.
263 		 */
264 		if (type == T_FLUSHWIN) {
265 			write_all_windows();
266 			ADVANCE;
267 			return;
268 		}
269 #endif
270 		if (type == T_UNIMPLFLUSH) {
271 			/*
272 			 * This should happen only on hypersparc.
273 			 * It also is a rare event to get this trap
274 			 * from kernel space. For now, just flush the
275 			 * entire I-cache.
276 			 */
277 #if defined(MULTIPROCESSOR)
278 			/* Broadcast to all CPUs */
279 			XCALL0(*cpuinfo.pure_vcache_flush, CPUSET_ALL);
280 #else
281 			(*cpuinfo.pure_vcache_flush)();
282 #endif
283 			ADVANCE;
284 			return;
285 		}
286 
287 		/*
288 		 * Storing %fsr in cpu_attach will cause this trap
289 		 * even though the fpu has been enabled, if and only
290 		 * if there is no FPU.
291 		 */
292 		if (type == T_FPDISABLED && cold) {
293 			ADVANCE;
294 			return;
295 		}
296 	dopanic:
297 	        snprintb(bits, sizeof(bits), PSR_BITS, psr);
298 		printf("trap type 0x%x: pc=0x%x npc=0x%x psr=%s\n",
299 		       type, pc, tf->tf_npc, bits);
300 #ifdef DDB
301 		write_all_windows();
302 		(void) kdb_trap(type, tf);
303 #endif
304 		panic("%s", type < N_TRAP_TYPES ? trap_type[type] : T);
305 		/* NOTREACHED */
306 	}
307 	if ((l = curlwp) == NULL)
308 		l = &lwp0;
309 	p = l->l_proc;
310 	sticks = p->p_sticks;
311 	pcb = lwp_getpcb(l);
312 	l->l_md.md_tf = tf;	/* for ptrace/signals */
313 
314 #ifdef FPU_DEBUG
315 	if (type != T_FPDISABLED && (tf->tf_psr & PSR_EF) != 0) {
316 		if (cpuinfo.fplwp != l)
317 			panic("FPU enabled but wrong proc (0) [l=%p, fwlp=%p]",
318 				l, cpuinfo.fplwp);
319 		savefpstate(l->l_md.md_fpstate);
320 		l->l_md.md_fpu = NULL;
321 		cpuinfo.fplwp = NULL;
322 		tf->tf_psr &= ~PSR_EF;
323 		setpsr(getpsr() & ~PSR_EF);
324 	}
325 #endif
326 
327 	sig = 0;
328 
329 	switch (type) {
330 
331 	default:
332 		if (type < 0x80) {
333 			if (!ignore_bogus_traps)
334 				goto dopanic;
335 		        snprintb(bits, sizeof(bits), PSR_BITS, psr);
336 			printf("trap type 0x%x: pc=0x%x npc=0x%x psr=%s\n",
337 			       type, pc, tf->tf_npc, bits);
338 			sig = SIGILL;
339 			KSI_INIT_TRAP(&ksi);
340 			ksi.ksi_trap = type;
341 			ksi.ksi_code = ILL_ILLTRP;
342 			ksi.ksi_addr = (void *)pc;
343 			break;
344 		}
345 
346 #ifdef DIAGNOSTIC
347 		if (type < 0x90 || type > 0x9f) {
348 			/* the following message is gratuitous */
349 			/* ... but leave it in until we find anything */
350 			uprintf("%s[%d]: unimplemented software trap 0x%x\n",
351 				p->p_comm, p->p_pid, type);
352 		}
353 #endif
354 		sig = SIGILL;
355 		KSI_INIT_TRAP(&ksi);
356 		ksi.ksi_trap = type;
357 		ksi.ksi_code = ILL_ILLTRP;
358 		ksi.ksi_addr = (void *)pc;
359 		break;
360 
361 	case T_AST:
362 		break;	/* the work is all in userret() */
363 
364 	case T_UNIMPLFLUSH:
365 		/* Invalidate the entire I-cache */
366 #if defined(MULTIPROCESSOR)
367 		/* Broadcast to all CPUs */
368 		XCALL0(*cpuinfo.pure_vcache_flush, CPUSET_ALL);
369 #else
370 		(*cpuinfo.pure_vcache_flush)();
371 #endif
372 		ADVANCE;
373 		break;
374 
375 	case T_ILLINST:
376 		/* Note: Cypress generates a T_ILLINST on FLUSH instructions */
377 		if ((sig = emulinstr(pc, tf)) == 0) {
378 			ADVANCE;
379 			break;
380 		}
381 		KSI_INIT_TRAP(&ksi);
382 		ksi.ksi_trap = type;
383 		ksi.ksi_code = ILL_ILLOPC;
384 		ksi.ksi_addr = (void *)pc;
385 		break;
386 
387 	case T_PRIVINST:
388 		sig = SIGILL;
389 		KSI_INIT_TRAP(&ksi);
390 		ksi.ksi_trap = type;
391 		ksi.ksi_code = ILL_PRVOPC;
392 		ksi.ksi_addr = (void *)pc;
393 		break;
394 
395 	case T_FPDISABLED: {
396 		struct fpstate *fs = l->l_md.md_fpstate;
397 
398 #ifdef FPU_DEBUG
399 		if ((tf->tf_psr & PSR_PS) != 0) {
400 			printf("FPU fault from kernel mode, pc=%x\n", pc);
401 #ifdef DDB
402 			Debugger();
403 #endif
404 		}
405 #endif
406 
407 		if (fs == NULL) {
408 			fs = kmem_alloc(sizeof(struct fpstate), KM_SLEEP);
409 			*fs = initfpstate;
410 			l->l_md.md_fpstate = fs;
411 		}
412 		/*
413 		 * If we have not found an FPU, we have to emulate it.
414 		 */
415 		if (!cpuinfo.fpupresent) {
416 #ifdef notyet
417 			fpu_emulate(l, tf, fs);
418 #else
419 			sig = SIGFPE;
420 			KSI_INIT_TRAP(&ksi);
421 			ksi.ksi_trap = type;
422 			ksi.ksi_code = SI_NOINFO;
423 			ksi.ksi_addr = (void *)pc;
424 #endif
425 			break;
426 		}
427 		/*
428 		 * We may have more FPEs stored up and/or ops queued.
429 		 * If they exist, handle them and get out.  Otherwise,
430 		 * resolve the FPU state, turn it on, and try again.
431 		 */
432 		if (fs->fs_qsize) {
433 			if ((code = fpu_cleanup(l, fs)) != 0) {
434 				sig = SIGFPE;
435 				KSI_INIT_TRAP(&ksi);
436 				ksi.ksi_trap = type;
437 				ksi.ksi_code = code;
438 				ksi.ksi_addr = (void *)pc;
439 			}
440 			break;
441 		}
442 
443 		/*
444 		 * If we do not own the FPU state on this CPU, we must
445 		 * now acquire it.
446 		 */
447 		if (cpuinfo.fplwp != l) {
448 			struct cpu_info *cpi;
449 
450 			FPU_LOCK(s);
451 			if (cpuinfo.fplwp != NULL) {
452 				/* someone else had it*/
453 				savefpstate(cpuinfo.fplwp->l_md.md_fpstate);
454 				cpuinfo.fplwp->l_md.md_fpu = NULL;
455 			}
456 
457 			/*
458 			 * On MP machines, some of the other FPUs might
459 			 * still have our state. Tell the owning processor
460 			 * to save the process' FPU state.
461 			 */
462 			if ((cpi = l->l_md.md_fpu) != NULL) {
463 				if (cpi->ci_cpuid == cpuinfo.ci_cpuid)
464 					panic("FPU(%d): state for %p",
465 							cpi->ci_cpuid, l);
466 #if defined(MULTIPROCESSOR)
467 				XCALL1(ipi_savefpstate, fs, 1 << cpi->ci_cpuid);
468 #endif
469 				cpi->fplwp = NULL;
470 			}
471 			loadfpstate(fs);
472 
473 			/* now we do have it */
474 			cpuinfo.fplwp = l;
475 			l->l_md.md_fpu = curcpu();
476 			FPU_UNLOCK(s);
477 		}
478 
479 		tf->tf_psr |= PSR_EF;
480 		break;
481 	}
482 
483 	case T_WINOF:
484 		if (rwindow_save(l)) {
485 			mutex_enter(p->p_lock);
486 			sigexit(l, SIGILL);
487 		}
488 		break;
489 
490 #define read_rw(src, dst) \
491 	copyin((void *)(src), (void *)(dst), sizeof(struct rwindow))
492 
493 	case T_RWRET:
494 		/*
495 		 * T_RWRET is a window load needed in order to rett.
496 		 * It simply needs the window to which tf->tf_out[6]
497 		 * (%sp) points.  There are no user or saved windows now.
498 		 * Copy the one from %sp into pcb->pcb_rw[0] and set
499 		 * nsaved to -1.  If we decide to deliver a signal on
500 		 * our way out, we will clear nsaved.
501 		 */
502 		if (pcb->pcb_uw || pcb->pcb_nsaved)
503 			panic("trap T_RWRET 1");
504 #ifdef DEBUG
505 		if (rwindow_debug)
506 			printf("cpu%d:%s[%d]: rwindow: pcb<-stack: 0x%x\n",
507 				cpuinfo.ci_cpuid, p->p_comm, p->p_pid,
508 				tf->tf_out[6]);
509 #endif
510 		if (read_rw(tf->tf_out[6], &pcb->pcb_rw[0])) {
511 			mutex_enter(p->p_lock);
512 			sigexit(l, SIGILL);
513 		}
514 		if (pcb->pcb_nsaved)
515 			panic("trap T_RWRET 2");
516 		pcb->pcb_nsaved = -1;		/* mark success */
517 		break;
518 
519 	case T_WINUF:
520 		/*
521 		 * T_WINUF is a real window underflow, from a restore
522 		 * instruction.  It needs to have the contents of two
523 		 * windows---the one belonging to the restore instruction
524 		 * itself, which is at its %sp, and the one belonging to
525 		 * the window above, which is at its %fp or %i6---both
526 		 * in the pcb.  The restore's window may still be in
527 		 * the CPU; we need to force it out to the stack.
528 		 */
529 #ifdef DEBUG
530 		if (rwindow_debug)
531 			printf("cpu%d:%s[%d]: rwindow: T_WINUF 0: pcb<-stack: 0x%x\n",
532 				cpuinfo.ci_cpuid, p->p_comm, p->p_pid,
533 				tf->tf_out[6]);
534 #endif
535 		write_user_windows();
536 		if (rwindow_save(l) || read_rw(tf->tf_out[6], &pcb->pcb_rw[0])) {
537 			mutex_enter(p->p_lock);
538 			sigexit(l, SIGILL);
539 		}
540 #ifdef DEBUG
541 		if (rwindow_debug)
542 			printf("cpu%d:%s[%d]: rwindow: T_WINUF 1: pcb<-stack: 0x%x\n",
543 				cpuinfo.ci_cpuid, p->p_comm, p->p_pid,
544 				pcb->pcb_rw[0].rw_in[6]);
545 #endif
546 		if (read_rw(pcb->pcb_rw[0].rw_in[6], &pcb->pcb_rw[1])) {
547 			mutex_enter(p->p_lock);
548 			sigexit(l, SIGILL);
549 		}
550 		if (pcb->pcb_nsaved)
551 			panic("trap T_WINUF");
552 		pcb->pcb_nsaved = -1;		/* mark success */
553 		break;
554 
555 	case T_ALIGN:
556 		if ((p->p_md.md_flags & MDP_FIXALIGN) != 0) {
557 			n = fixalign(l, tf, NULL);
558 			if (n == 0) {
559 				ADVANCE;
560 				break;
561 			}
562 		}
563 		sig = SIGBUS;
564 		KSI_INIT_TRAP(&ksi);
565 		ksi.ksi_trap = type;
566 		ksi.ksi_code = BUS_ADRALN;
567 		fixalign(l, tf, &ksi.ksi_addr);
568 		break;
569 
570 	case T_FPE:
571 		/*
572 		 * Clean up after a floating point exception.
573 		 * fpu_cleanup can (and usually does) modify the
574 		 * state we save here, so we must `give up' the FPU
575 		 * chip context.  (The software and hardware states
576 		 * will not match once fpu_cleanup does its job, so
577 		 * we must not save again later.)
578 		 */
579 		if (l != cpuinfo.fplwp)
580 			panic("fpe without being the FP user");
581 		FPU_LOCK(s);
582 		savefpstate(l->l_md.md_fpstate);
583 		cpuinfo.fplwp = NULL;
584 		l->l_md.md_fpu = NULL;
585 		FPU_UNLOCK(s);
586 		/* tf->tf_psr &= ~PSR_EF; */	/* share_fpu will do this */
587 		if ((code = fpu_cleanup(l, l->l_md.md_fpstate)) != 0) {
588 			sig = SIGFPE;
589 			KSI_INIT_TRAP(&ksi);
590 			ksi.ksi_trap = type;
591 			ksi.ksi_code = code;
592 			ksi.ksi_addr = (void *)pc;
593 		}
594 #if 0		/* ??? really never??? */
595 		ADVANCE;
596 #endif
597 		break;
598 
599 	case T_TAGOF:
600 		sig = SIGEMT;
601 		KSI_INIT_TRAP(&ksi);
602 		ksi.ksi_trap = type;
603 		ksi.ksi_code = SI_NOINFO;
604 		ksi.ksi_addr = (void *)pc;
605 		break;
606 
607 	case T_CPDISABLED:
608 		sig = SIGILL;
609 		KSI_INIT_TRAP(&ksi);
610 		ksi.ksi_trap = type;
611 		ksi.ksi_code = ILL_COPROC;
612 		ksi.ksi_addr = (void *)pc;
613 		break;
614 
615 	case T_BREAKPOINT:
616 		sig = SIGTRAP;
617 		KSI_INIT_TRAP(&ksi);
618 		ksi.ksi_trap = type;
619 		ksi.ksi_code = TRAP_BRKPT;
620 		ksi.ksi_addr = (void *)pc;
621 		break;
622 
623 	case T_DIV0:
624 	case T_IDIV0:
625 		ADVANCE;
626 		sig = SIGFPE;
627 		KSI_INIT_TRAP(&ksi);
628 		ksi.ksi_trap = type;
629 		ksi.ksi_code = FPE_INTDIV;
630 		ksi.ksi_addr = (void *)pc;
631 		break;
632 
633 	case T_FLUSHWIN:
634 		write_user_windows();
635 #ifdef probably_slower_since_this_is_usually_false
636 		if (pcb->pcb_nsaved && rwindow_save(p)) {
637 			mutex_enter(p->p_lock);
638 			sigexit(l, SIGILL);
639 		}
640 #endif
641 		ADVANCE;
642 		break;
643 
644 	case T_CLEANWIN:
645 		uprintf("T_CLEANWIN\n");	/* XXX */
646 		ADVANCE;
647 		break;
648 
649 	case T_RANGECHECK:
650 		uprintf("T_RANGECHECK\n");	/* XXX */
651 		ADVANCE;
652 		sig = SIGILL;
653 		KSI_INIT_TRAP(&ksi);
654 		ksi.ksi_trap = type;
655 		ksi.ksi_code = ILL_ILLOPN;
656 		ksi.ksi_addr = (void *)pc;
657 		break;
658 
659 	case T_FIXALIGN:
660 #ifdef DEBUG_ALIGN
661 		uprintf("T_FIXALIGN\n");
662 #endif
663 		/* User wants us to fix alignment faults */
664 		p->p_md.md_flags |= MDP_FIXALIGN;
665 		ADVANCE;
666 		break;
667 
668 	case T_INTOF:
669 		uprintf("T_INTOF\n");		/* XXX */
670 		ADVANCE;
671 		sig = SIGFPE;
672 		KSI_INIT_TRAP(&ksi);
673 		ksi.ksi_trap = type;
674 		ksi.ksi_code = FPE_INTOVF;
675 		ksi.ksi_addr = (void *)pc;
676 		break;
677 	}
678 	if (sig != 0) {
679 		ksi.ksi_signo = sig;
680 		trapsignal(l, &ksi);
681 	}
682 	userret(l, pc, sticks);
683 	share_fpu(l, tf);
684 #undef ADVANCE
685 }
686 
687 /*
688  * Save windows from PCB into user stack, and return 0.  This is used on
689  * window overflow pseudo-traps (from locore.s, just before returning to
690  * user mode) and when ptrace or sendsig needs a consistent state.
691  * As a side effect, rwindow_save() always sets pcb_nsaved to 0,
692  * clobbering the `underflow restore' indicator if it was -1.
693  *
694  * If the windows cannot be saved, pcb_nsaved is restored and we return -1.
695  */
696 int
rwindow_save(struct lwp * l)697 rwindow_save(struct lwp *l)
698 {
699 	struct pcb *pcb = lwp_getpcb(l);
700 	struct rwindow *rw = &pcb->pcb_rw[0];
701 	int i;
702 
703 	i = pcb->pcb_nsaved;
704 	if (i < 0) {
705 		pcb->pcb_nsaved = 0;
706 		return (0);
707 	}
708 	if (i == 0)
709 		return (0);
710 #ifdef DEBUG
711 	if (rwindow_debug)
712 		printf("cpu%d:%s[%d]: rwindow: pcb->stack:",
713 			cpuinfo.ci_cpuid, l->l_proc->p_comm, l->l_proc->p_pid);
714 #endif
715 	do {
716 #ifdef DEBUG
717 		if (rwindow_debug)
718 			printf(" [%d]0x%x", cpuinfo.ci_cpuid, rw[1].rw_in[6]);
719 #endif
720 		if (copyout((void *)rw, (void *)rw[1].rw_in[6],
721 		    sizeof *rw))
722 			return (-1);
723 		rw++;
724 	} while (--i > 0);
725 #ifdef DEBUG
726 	if (rwindow_debug)
727 		printf("\n");
728 #endif
729 	pcb->pcb_nsaved = 0;
730 	return (0);
731 }
732 
733 /*
734  * Kill user windows (before exec) by writing back to stack or pcb
735  * and then erasing any pcb tracks.  Otherwise we might try to write
736  * the registers into the new process after the exec.
737  */
738 void
cpu_vmspace_exec(struct lwp * l,vaddr_t vstart,vaddr_t vend)739 cpu_vmspace_exec(struct lwp *l, vaddr_t vstart, vaddr_t vend)
740 {
741 	struct pcb *pcb = lwp_getpcb(l);
742 
743 	write_user_windows();
744 	pcb->pcb_nsaved = 0;
745 }
746 
747 /*
748  * Called from locore.s trap handling, for synchronous memory faults.
749  *
750  * This duplicates a lot of logic in trap() and perhaps should be
751  * moved there; but the bus-error-register parameters are unique to
752  * this routine.
753  *
754  * Since synchronous errors accumulate during prefetch, we can have
755  * more than one `cause'.  But we do not care what the cause, here;
756  * we just want to page in the page and try again.
757  */
758 void
mem_access_fault(unsigned type,int ser,u_int v,int pc,int psr,struct trapframe * tf)759 mem_access_fault(unsigned type, int ser, u_int v, int pc, int psr,
760 		 struct trapframe *tf)
761 {
762 #if defined(SUN4) || defined(SUN4C)
763 	struct proc *p;
764 	struct lwp *l;
765 	struct pcb *pcb;
766 	struct vmspace *vm;
767 	vaddr_t va;
768 	int rv;
769 	vm_prot_t atype;
770 	vaddr_t onfault;
771 	u_quad_t sticks;
772 	char bits[64];
773 	ksiginfo_t ksi;
774 
775 	curcpu()->ci_data.cpu_ntrap++;
776 	l = curlwp;
777 	p = l->l_proc;
778 	pcb = lwp_getpcb(l);
779 	onfault = (vaddr_t)pcb->pcb_onfault;
780 
781 	sticks = p->p_sticks;
782 
783 #ifdef FPU_DEBUG
784 	if ((tf->tf_psr & PSR_EF) != 0) {
785 		if (cpuinfo.fplwp != l)
786 			panic("FPU enabled but wrong proc (1) [l=%p, fwlp=%p]",
787 				l, cpuinfo.fplwp);
788 		savefpstate(l->l_md.md_fpstate);
789 		l->l_md.md_fpu = NULL;
790 		cpuinfo.fplwp = NULL;
791 		tf->tf_psr &= ~PSR_EF;
792 		setpsr(getpsr() & ~PSR_EF);
793 	}
794 #endif
795 
796 	/*
797 	 * Figure out what to pass the VM code, and ignore the sva register
798 	 * value in v on text faults (text faults are always at pc).
799 	 * Kernel faults are somewhat different: text faults are always
800 	 * illegal, and data faults are extra complex.  User faults must
801 	 * set p->p_md.md_tf, in case we decide to deliver a signal.  Check
802 	 * for illegal virtual addresses early since those can induce more
803 	 * faults.
804 	 */
805 	if (type == T_TEXTFAULT)
806 		v = pc;
807 	if (VA_INHOLE(v)) {
808 		rv = EACCES;
809 		goto fault;
810 	}
811 	atype = ser & SER_WRITE ? VM_PROT_WRITE : VM_PROT_READ;
812 	if ((ser & SER_PROT) && atype == VM_PROT_READ && type != T_TEXTFAULT) {
813 
814 		/*
815 		 * The hardware reports faults by the atomic load/store
816 		 * instructions as read faults, so if the faulting instruction
817 		 * is one of those, relabel this fault as both read and write.
818 		 */
819 		u_int insn;
820 		if (ufetch_int((void *)pc, &insn) == 0 &&
821 		    (insn & 0xc1680000) == 0xc0680000) {
822 			atype = VM_PROT_READ | VM_PROT_WRITE;
823 		}
824 	}
825 	va = trunc_page(v);
826 	if (psr & PSR_PS) {
827 		if (type == T_TEXTFAULT) {
828 			(void) splhigh();
829 		        snprintb(bits, sizeof(bits), SER_BITS, ser);
830 			printf("cpu%d: text fault: pc=0x%x ser=%s\n",
831 			       cpu_number(), pc, bits);
832 			panic("kernel fault");
833 			/* NOTREACHED */
834 		}
835 		/*
836 		 * If this was an access that we shouldn't try to page in,
837 		 * resume at the fault handler without any action.
838 		 */
839 		if (onfault == (vaddr_t)sparc_fsbail) {
840 			rv = EFAULT;
841 			goto kfault;
842 		}
843 
844 		/*
845 		 * During autoconfiguration, faults are never OK unless
846 		 * pcb_onfault is set.  Once running normally we must allow
847 		 * exec() to cause copy-on-write faults to kernel addresses.
848 		 */
849 		if (cold) {
850 			rv = EFAULT;
851 			goto kfault;
852 		}
853 		if (va >= KERNBASE) {
854 			rv = mmu_pagein(pmap_kernel(), va, atype);
855 			if (rv < 0) {
856 				rv = EACCES;
857 				goto kfault;
858 			}
859 			if (rv > 0)
860 				return;
861 			pcb->pcb_onfault = NULL;
862 			rv = uvm_fault(kernel_map, va, atype);
863 			pcb->pcb_onfault = (void *)onfault;
864 			if (rv == 0)
865 				return;
866 			goto kfault;
867 		}
868 	} else {
869 		l->l_md.md_tf = tf;
870 	}
871 
872 	/*
873 	 * mmu_pagein returns -1 if the page is already valid, in which
874 	 * case we have a hard fault; it returns 1 if it loads a segment
875 	 * that got bumped out via LRU replacement.
876 	 */
877 	vm = p->p_vmspace;
878 	rv = mmu_pagein(vm->vm_map.pmap, va, atype);
879 	if (rv < 0) {
880 		rv = EACCES;
881 		goto fault;
882 	}
883 	if (rv > 0)
884 		goto out;
885 
886 	/* alas! must call the horrible vm code */
887 	pcb->pcb_onfault = NULL;
888 	rv = uvm_fault(&vm->vm_map, (vaddr_t)va, atype);
889 	pcb->pcb_onfault = (void *)onfault;
890 
891 	/*
892 	 * If this was a stack access we keep track of the maximum
893 	 * accessed stack size.  Also, if vm_fault gets a protection
894 	 * failure it is due to accessing the stack region outside
895 	 * the current limit and we need to reflect that as an access
896 	 * error.
897 	 */
898 	if ((void *)va >= vm->vm_maxsaddr
899 #ifdef COMPAT_SUNOS
900 	    && !(p->p_emul == &emul_sunos && va < USRSTACK -
901 		 (vaddr_t)p->p_limit->pl_rlimit[RLIMIT_STACK].rlim_cur +
902 		 SUNOS_MAXSADDR_SLOP)
903 #endif
904 	    && rv == 0)
905 		uvm_grow(p, va);
906 
907 	if (rv == 0) {
908 		/*
909 		 * pmap_enter() does not enter all requests made from
910 		 * vm_fault into the MMU (as that causes unnecessary
911 		 * entries for `wired' pages).  Instead, we call
912 		 * mmu_pagein here to make sure the new PTE gets installed.
913 		 */
914 		(void) mmu_pagein(vm->vm_map.pmap, va, VM_PROT_NONE);
915 	} else {
916 		/*
917 		 * Pagein failed.  If doing copyin/out, return to onfault
918 		 * address.  Any other page fault in kernel, die; if user
919 		 * fault, deliver SIGSEGV.
920 		 */
921 fault:
922 		if (psr & PSR_PS) {
923 kfault:
924 			if (!onfault) {
925 				(void) splhigh();
926 				snprintb(bits, sizeof(bits), SER_BITS, ser);
927 				printf("cpu%d: data fault: pc=0x%x "
928 				       "addr=0x%x ser=%s\n",
929 				       cpu_number(), pc, v, bits);
930 				panic("kernel fault");
931 				/* NOTREACHED */
932 			}
933 			tf->tf_pc = onfault;
934 			tf->tf_npc = onfault + 4;
935 			tf->tf_out[0] = (rv == EACCES) ? EFAULT : rv;
936 			return;
937 		}
938 		KSI_INIT_TRAP(&ksi);
939 		switch (rv) {
940 		case ENOMEM:
941 			printf("UVM: pid %d (%s), uid %d killed: out of swap\n",
942 			       p->p_pid, p->p_comm,
943 			       l->l_cred ?
944 			       kauth_cred_geteuid(l->l_cred) : -1);
945 			ksi.ksi_signo = SIGKILL;
946 			break;
947 		case EINVAL:
948 			ksi.ksi_signo = SIGBUS;
949 			ksi.ksi_code = BUS_ADRERR;
950 			break;
951 		case EACCES:
952 			ksi.ksi_signo = SIGSEGV;
953 			ksi.ksi_code = SEGV_ACCERR;
954 			break;
955 		default:
956 			ksi.ksi_signo = SIGSEGV;
957 			ksi.ksi_code = SEGV_MAPERR;
958 			break;
959 		}
960 		ksi.ksi_trap = type;
961 		ksi.ksi_addr = (void *)v;
962 		trapsignal(l, &ksi);
963 	}
964 out:
965 	if ((psr & PSR_PS) == 0) {
966 		userret(l, pc, sticks);
967 		share_fpu(l, tf);
968 	}
969 #endif /* SUN4 || SUN4C */
970 }
971 
972 #if defined(SUN4M)	/* 4m version of mem_access_fault() follows */
973 static int tfaultaddr = (int) 0xdeadbeef;
974 
975 void
mem_access_fault4m(unsigned type,u_int sfsr,u_int sfva,struct trapframe * tf)976 mem_access_fault4m(unsigned type, u_int sfsr, u_int sfva, struct trapframe *tf)
977 {
978 	int pc, psr;
979 	struct proc *p;
980 	struct lwp *l;
981 	struct pcb *pcb;
982 	struct vmspace *vm;
983 	vaddr_t va;
984 	int rv;
985 	vm_prot_t atype;
986 	int onfault;
987 	u_quad_t sticks;
988 	char bits[64];
989 	ksiginfo_t ksi;
990 
991 	curcpu()->ci_data.cpu_ntrap++;
992 
993 	l = curlwp;
994 	p = l->l_proc;
995 	sticks = p->p_sticks;
996 	pcb = lwp_getpcb(l);
997 	onfault = (vaddr_t)pcb->pcb_onfault;
998 
999 #ifdef FPU_DEBUG
1000 	if ((tf->tf_psr & PSR_EF) != 0) {
1001 		if (cpuinfo.fplwp != l)
1002 			panic("FPU enabled but wrong proc (2) [l=%p, fwlp=%p]",
1003 				l, cpuinfo.fplwp);
1004 		savefpstate(l->l_md.md_fpstate);
1005 		l->l_md.md_fpu = NULL;
1006 		cpuinfo.fplwp = NULL;
1007 		tf->tf_psr &= ~PSR_EF;
1008 		setpsr(getpsr() & ~PSR_EF);
1009 	}
1010 #endif
1011 
1012 	pc = tf->tf_pc;			/* These are needed below */
1013 	psr = tf->tf_psr;
1014 
1015 #if /*DIAGNOSTICS*/1
1016 	if (type == T_DATAERROR || type == T_TEXTERROR)
1017 		printf("%s[%d]: trap 0x%x: pc=0x%x sfsr=0x%x sfva=0x%x\n",
1018 			p->p_comm, p->p_pid, type, pc, sfsr, sfva);
1019 #endif
1020 
1021 	/*
1022 	 * Our first priority is handling serious faults, such as
1023 	 * parity errors or async faults that might have come through here.
1024 	 * If afsr & AFSR_AFO != 0, then we're on a HyperSPARC and we
1025 	 * got an async fault. We pass it on to memerr4m. Similarly, if
1026 	 * the trap was T_STOREBUFFAULT, we pass it on to memerr4m.
1027 	 * If we have a data fault, but SFSR_FAV is not set in the sfsr,
1028 	 * then things are really bizarre, and we treat it as a hard
1029 	 * error and pass it on to memerr4m. See section 8.12.4 in the
1030 	 * SuperSPARC user's guide for more info, and for a possible
1031 	 * solution which we don't implement here.
1032 	 * Note: store buffer faults may also lead to a level 15 interrupt
1033 	 * being posted to the module (see sun4m system architecture,
1034 	 * section B.I.9).
1035 	 */
1036 	if (type == T_STOREBUFFAULT ||
1037 	    (type == T_DATAFAULT && (sfsr & SFSR_FAV) == 0)) {
1038 		(*cpuinfo.memerr)(type, sfsr, sfva, tf);
1039 		/*
1040 		 * If we get here, exit the trap handler and wait for the
1041 		 * trap to re-occur.
1042 		 */
1043 		goto out_nounlock;
1044 	}
1045 
1046 	/*
1047 	 * Figure out what to pass the VM code. We cannot ignore the sfva
1048 	 * register on text faults, since this might be a trap on an
1049 	 * alternate-ASI access to code space. However, if we're on a
1050 	 * supersparc, we can't help using PC, since we don't get a VA in
1051 	 * sfva.
1052 	 * Kernel faults are somewhat different: text faults are always
1053 	 * illegal, and data faults are extra complex.  User faults must
1054 	 * set p->p_md.md_tf, in case we decide to deliver a signal.  Check
1055 	 * for illegal virtual addresses early since those can induce more
1056 	 * faults.
1057 	 * All translation faults are illegal, and result in a SIGSEGV
1058 	 * being delivered to the running process (or a kernel panic, for
1059 	 * a kernel fault). We check the translation first to make sure
1060 	 * it is not spurious.
1061 	 * Also, note that in the case where we have an overwritten
1062 	 * text fault (OW==1, AT==2,3), we attempt to service the
1063 	 * second (overwriting) fault, then restart the instruction
1064 	 * (which is from the first fault) and allow the first trap
1065 	 * to reappear. XXX is this right? It will probably change...
1066 	 */
1067 	if ((sfsr & SFSR_FT) == SFSR_FT_NONE)
1068 		goto out;	/* No fault. Why were we called? */
1069 
1070 	/*
1071 	 * NOTE: the per-CPU fault status register readers (in locore)
1072 	 * may already have decided to pass `pc' in `sfva', so we avoid
1073 	 * testing CPU types here.
1074 	 * Q: test SFSR_FAV in the locore stubs too?
1075 	 */
1076 	if ((sfsr & SFSR_FAV) == 0) {
1077 		/* note: T_TEXTERROR == T_TEXTFAULT | 0x20 */
1078 		if ((type & ~0x20) == T_TEXTFAULT)
1079 			sfva = pc;
1080 		else {
1081 			rv = EACCES;
1082 			goto fault;
1083 		}
1084 	}
1085 
1086 	if ((sfsr & SFSR_FT) == SFSR_FT_TRANSERR) {
1087 		/*
1088 		 * Translation errors are always fatal, as they indicate
1089 		 * a corrupt translation (page) table hierarchy.
1090 		 */
1091 		rv = EACCES;
1092 
1093 		/* XXXSMP - why bother with this anyway? */
1094 		if (tfaultaddr == sfva)	/* Prevent infinite loops w/a static */
1095 			goto fault;
1096 		tfaultaddr = sfva;
1097 		if ((lda((sfva & 0xFFFFF000) | ASI_SRMMUFP_LN, ASI_SRMMUFP) &
1098 		    SRMMU_TETYPE) != SRMMU_TEPTE)
1099 			goto fault;	/* Translation bad */
1100 		lda(SRMMU_SFSR, ASI_SRMMU);
1101 #ifdef DEBUG
1102 		printf("mem_access_fault4m: SFSR_FT_TRANSERR: "
1103 			"pid %d, va 0x%x: retrying\n", p->p_pid, sfva);
1104 #endif
1105 		goto out;	/* Translation OK, retry operation */
1106 	}
1107 
1108 	va = trunc_page(sfva);
1109 
1110 	if (((sfsr & SFSR_AT_TEXT) || type == T_TEXTFAULT) &&
1111 	    !(sfsr & SFSR_AT_STORE) && (sfsr & SFSR_OW)) {
1112 		if (psr & PSR_PS) {	/* never allow in kernel */
1113 			rv = EFAULT;
1114 			goto kfault;
1115 		}
1116 #if 0
1117 		/*
1118 		 * Double text fault. The evil "case 5" from the HS manual...
1119 		 * Attempt to handle early fault. Ignores ASI 8,9 issue...may
1120 		 * do a useless VM read.
1121 		 * XXX: Is this really necessary?
1122 		 * XXX: If it's necessary, add SA_PAGEFAULT handling
1123 		 */
1124 		if (cpuinfo.cpu_type == CPUTYP_HS_MBUS) {
1125 			/* On HS, we have va for both */
1126 			vm = p->p_vmspace;
1127 			pcb->pcb_onfault = NULL;
1128 			rv = uvm_fault(&vm->vm_map, trunc_page(pc),
1129 				      VM_PROT_READ);
1130 			pcb->pcb_onfault = onfault;
1131 			if (rv != 0)
1132 #ifdef DEBUG
1133 				printf("mem_access_fault: "
1134 					"can't pagein 1st text fault.\n")
1135 #endif
1136 				;
1137 		}
1138 #endif
1139 	}
1140 
1141 	/* Now munch on protections... */
1142 	if (sfsr & SFSR_AT_STORE) {
1143 		/* stores are never text faults. */
1144 		atype = VM_PROT_WRITE;
1145 	} else {
1146 		if ((sfsr & SFSR_AT_TEXT) || (type & ~0x20) == T_TEXTFAULT) {
1147 			atype = VM_PROT_EXECUTE;
1148 		} else {
1149 			atype = VM_PROT_READ;
1150 		}
1151 	}
1152 
1153 	if (psr & PSR_PS) {
1154 		if (sfsr & SFSR_AT_TEXT || type == T_TEXTFAULT) {
1155 			(void) splhigh();
1156 			snprintb(bits, sizeof(bits), SFSR_BITS, sfsr);
1157 			printf("cpu%d text fault: pc=0x%x sfsr=%s sfva=0x%x\n",
1158 			       cpu_number(), pc, bits, sfva);
1159 			panic("kernel fault");
1160 			/* NOTREACHED */
1161 		}
1162 		/*
1163 		 * If this was an access that we shouldn't try to page in,
1164 		 * resume at the fault handler without any action.
1165 		 */
1166 		if (onfault == (vaddr_t)sparc_fsbail) {
1167 			rv = EFAULT;
1168 			goto kfault;
1169 		}
1170 
1171 		/*
1172 		 * During autoconfiguration, faults are never OK unless
1173 		 * pcb_onfault is set.  Once running normally we must allow
1174 		 * exec() to cause copy-on-write faults to kernel addresses.
1175 		 */
1176 		if (cold) {
1177 			rv = EFAULT;
1178 			goto kfault;
1179 		}
1180 		if (va >= KERNBASE) {
1181 			pcb->pcb_onfault = NULL;
1182 			rv = uvm_fault(kernel_map, va, atype);
1183 			pcb->pcb_onfault = (void *)onfault;
1184 			if (rv == 0) {
1185 				return;
1186 			}
1187 			goto kfault;
1188 		}
1189 	} else {
1190 		l->l_md.md_tf = tf;
1191 	}
1192 
1193 	vm = p->p_vmspace;
1194 
1195 	/* alas! must call the horrible vm code */
1196 	pcb->pcb_onfault = NULL;
1197 	rv = uvm_fault(&vm->vm_map, (vaddr_t)va, atype);
1198 	pcb->pcb_onfault = (void *)onfault;
1199 
1200 	/*
1201 	 * If this was a stack access we keep track of the maximum
1202 	 * accessed stack size.  Also, if vm_fault gets a protection
1203 	 * failure it is due to accessing the stack region outside
1204 	 * the current limit and we need to reflect that as an access
1205 	 * error.
1206 	 */
1207 	if (rv == 0 && (void *)va >= vm->vm_maxsaddr)
1208 		uvm_grow(p, va);
1209 	if (rv != 0) {
1210 		/*
1211 		 * Pagein failed.  If doing copyin/out, return to onfault
1212 		 * address.  Any other page fault in kernel, die; if user
1213 		 * fault, deliver SIGSEGV.
1214 		 */
1215 fault:
1216 		if (psr & PSR_PS) {
1217 kfault:
1218 			if (!onfault) {
1219 				(void) splhigh();
1220 				snprintb(bits, sizeof(bits), SFSR_BITS, sfsr);
1221 				printf("cpu%d: data fault: pc=0x%x "
1222 				       "addr=0x%x sfsr=%s\n",
1223 				       cpu_number(), pc, sfva, bits);
1224 				panic("kernel fault");
1225 				/* NOTREACHED */
1226 			}
1227 			tf->tf_pc = onfault;
1228 			tf->tf_npc = onfault + 4;
1229 			tf->tf_out[0] = (rv == EACCES) ? EFAULT : rv;
1230 			return;
1231 		}
1232 		KSI_INIT_TRAP(&ksi);
1233 		switch (rv) {
1234 		case ENOMEM:
1235 			printf("UVM: pid %d (%s), uid %d killed: out of swap\n",
1236 			       p->p_pid, p->p_comm,
1237 			       l->l_cred ?
1238 			       kauth_cred_geteuid(l->l_cred) : -1);
1239 			ksi.ksi_signo = SIGKILL;
1240 			break;
1241 		case EINVAL:
1242 			ksi.ksi_signo = SIGBUS;
1243 			ksi.ksi_code = BUS_ADRERR;
1244 			break;
1245 		case EACCES:
1246 			ksi.ksi_signo = SIGSEGV;
1247 			ksi.ksi_code = SEGV_ACCERR;
1248 			break;
1249 		default:
1250 			ksi.ksi_signo = SIGSEGV;
1251 			ksi.ksi_code = SEGV_MAPERR;
1252 			break;
1253 		}
1254 		ksi.ksi_trap = type;
1255 		ksi.ksi_addr = (void *)sfva;
1256 		trapsignal(l, &ksi);
1257 	}
1258 out:
1259 	if ((psr & PSR_PS) == 0) {
1260 out_nounlock:
1261 		userret(l, pc, sticks);
1262 		share_fpu(l, tf);
1263 	}
1264 }
1265 #endif /* SUN4M */
1266 
1267 /*
1268  * Start a new LWP
1269  */
1270 void
startlwp(void * arg)1271 startlwp(void *arg)
1272 {
1273 	ucontext_t *uc = arg;
1274 	lwp_t *l = curlwp;
1275 	int error __diagused;
1276 
1277 	error = cpu_setmcontext(l, &uc->uc_mcontext, uc->uc_flags);
1278 	KASSERT(error == 0);
1279 
1280 	kmem_free(uc, sizeof(ucontext_t));
1281 	userret(l, l->l_md.md_tf->tf_pc, 0);
1282 }
1283 
1284