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