installer: Finish incomplete commit to merge nrelease/{installer,root}.
[dragonfly.git] / sys / platform / pc64 / amd64 / trap.c
1 /*-
2  * Copyright (c) 1990, 1993
3  *      The Regents of the University of California.  All rights reserved.
4  * Copyright (C) 1994, David Greenman
5  * Copyright (c) 2008 The DragonFly Project.
6  * Copyright (c) 2008 Jordan Gordeev.
7  *
8  * This code is derived from software contributed to Berkeley by
9  * the University of Utah, and William Jolitz.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  * 3. All advertising materials mentioning features or use of this software
20  *    must display the following acknowledgement:
21  *      This product includes software developed by the University of
22  *      California, Berkeley and its contributors.
23  * 4. Neither the name of the University nor the names of its contributors
24  *    may be used to endorse or promote products derived from this software
25  *    without specific prior written permission.
26  *
27  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
28  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
31  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
33  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
34  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
35  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
36  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37  * SUCH DAMAGE.
38  *
39  * from: @(#)trap.c     7.4 (Berkeley) 5/13/91
40  * $FreeBSD: src/sys/i386/i386/trap.c,v 1.147.2.11 2003/02/27 19:09:59 luoqi Exp $
41  * $DragonFly: src/sys/platform/pc64/amd64/trap.c,v 1.3 2008/09/09 04:06:18 dillon Exp $
42  */
43
44 /*
45  * AMD64 Trap and System call handling
46  */
47
48 #include "opt_ddb.h"
49 #include "opt_ktrace.h"
50
51 #include <machine/frame.h>
52 #include <sys/param.h>
53 #include <sys/systm.h>
54 #include <sys/kernel.h>
55 #include <sys/proc.h>
56 #include <sys/pioctl.h>
57 #include <sys/types.h>
58 #include <sys/signal2.h>
59 #include <sys/syscall.h>
60 #include <sys/sysctl.h>
61 #include <sys/sysent.h>
62 #include <sys/systm.h>
63 #ifdef KTRACE
64 #include <sys/ktrace.h>
65 #endif
66 #include <sys/ktr.h>
67 #include <sys/sysmsg.h>
68 #include <sys/sysproto.h>
69 #include <sys/sysunion.h>
70
71 #include <vm/pmap.h>
72 #include <vm/vm.h>
73 #include <vm/vm_extern.h>
74 #include <vm/vm_kern.h>
75 #include <vm/vm_param.h>
76 #include <machine/cpu.h>
77 #include <machine/pcb.h>
78 #include <machine/smp.h>
79 #include <machine/thread.h>
80 #include <machine/vmparam.h>
81 #include <machine/md_var.h>
82 #include <machine_base/isa/intr_machdep.h>
83
84 #include <ddb/ddb.h>
85 #include <sys/thread2.h>
86
87 #ifdef SMP
88
89 #define MAKEMPSAFE(have_mplock)                 \
90         if (have_mplock == 0) {                 \
91                 get_mplock();                   \
92                 have_mplock = 1;                \
93         }
94
95 #else
96
97 #define MAKEMPSAFE(have_mplock)
98
99 #endif
100
101 extern void trap(struct trapframe *frame);
102
103 static int trap_pfault(struct trapframe *, int);
104 static void trap_fatal(struct trapframe *, vm_offset_t);
105 void dblfault_handler(struct trapframe *frame);
106
107 #define MAX_TRAP_MSG            30
108 static char *trap_msg[] = {
109         "",                                     /*  0 unused */
110         "privileged instruction fault",         /*  1 T_PRIVINFLT */
111         "",                                     /*  2 unused */
112         "breakpoint instruction fault",         /*  3 T_BPTFLT */
113         "",                                     /*  4 unused */
114         "",                                     /*  5 unused */
115         "arithmetic trap",                      /*  6 T_ARITHTRAP */
116         "system forced exception",              /*  7 T_ASTFLT */
117         "",                                     /*  8 unused */
118         "general protection fault",             /*  9 T_PROTFLT */
119         "trace trap",                           /* 10 T_TRCTRAP */
120         "",                                     /* 11 unused */
121         "page fault",                           /* 12 T_PAGEFLT */
122         "",                                     /* 13 unused */
123         "alignment fault",                      /* 14 T_ALIGNFLT */
124         "",                                     /* 15 unused */
125         "",                                     /* 16 unused */
126         "",                                     /* 17 unused */
127         "integer divide fault",                 /* 18 T_DIVIDE */
128         "non-maskable interrupt trap",          /* 19 T_NMI */
129         "overflow trap",                        /* 20 T_OFLOW */
130         "FPU bounds check fault",               /* 21 T_BOUND */
131         "FPU device not available",             /* 22 T_DNA */
132         "double fault",                         /* 23 T_DOUBLEFLT */
133         "FPU operand fetch fault",              /* 24 T_FPOPFLT */
134         "invalid TSS fault",                    /* 25 T_TSSFLT */
135         "segment not present fault",            /* 26 T_SEGNPFLT */
136         "stack fault",                          /* 27 T_STKFLT */
137         "machine check trap",                   /* 28 T_MCHK */
138         "SIMD floating-point exception",        /* 29 T_XMMFLT */
139         "reserved (unknown) fault",             /* 30 T_RESERVED */
140 };
141
142 #ifdef DDB
143 static int ddb_on_nmi = 1;
144 SYSCTL_INT(_machdep, OID_AUTO, ddb_on_nmi, CTLFLAG_RW,
145         &ddb_on_nmi, 0, "Go to DDB on NMI");
146 #endif
147 static int panic_on_nmi = 1;
148 SYSCTL_INT(_machdep, OID_AUTO, panic_on_nmi, CTLFLAG_RW,
149         &panic_on_nmi, 0, "Panic on NMI");
150 static int fast_release;
151 SYSCTL_INT(_machdep, OID_AUTO, fast_release, CTLFLAG_RW,
152         &fast_release, 0, "Passive Release was optimal");
153 static int slow_release;
154 SYSCTL_INT(_machdep, OID_AUTO, slow_release, CTLFLAG_RW,
155         &slow_release, 0, "Passive Release was nonoptimal");
156 #ifdef SMP
157 static int syscall_mpsafe = 1;
158 SYSCTL_INT(_kern, OID_AUTO, syscall_mpsafe, CTLFLAG_RW,
159         &syscall_mpsafe, 0, "Allow MPSAFE marked syscalls to run without BGL");
160 TUNABLE_INT("kern.syscall_mpsafe", &syscall_mpsafe);
161 static int trap_mpsafe = 1;
162 SYSCTL_INT(_kern, OID_AUTO, trap_mpsafe, CTLFLAG_RW,
163         &trap_mpsafe, 0, "Allow traps to mostly run without the BGL");
164 TUNABLE_INT("kern.trap_mpsafe", &trap_mpsafe);
165 #endif
166
167 /*
168  * userenter() passively intercepts the thread switch function to increase
169  * the thread priority from a user priority to a kernel priority, reducing
170  * syscall and trap overhead for the case where no switch occurs.
171  */
172
173 static __inline void
174 userenter(struct thread *curtd)
175 {
176         curtd->td_release = lwkt_passive_release;
177 }
178
179 /*
180  * Handle signals, upcalls, profiling, and other AST's and/or tasks that
181  * must be completed before we can return to or try to return to userland.
182  *
183  * Note that td_sticks is a 64 bit quantity, but there's no point doing 64
184  * arithmatic on the delta calculation so the absolute tick values are
185  * truncated to an integer.
186  */
187 static void
188 userret(struct lwp *lp, struct trapframe *frame, int sticks)
189 {
190         struct proc *p = lp->lwp_proc;
191         int sig;
192
193         /*
194          * Charge system time if profiling.  Note: times are in microseconds.
195          * This may do a copyout and block, so do it first even though it
196          * means some system time will be charged as user time.
197          */
198         if (p->p_flag & P_PROFIL) {
199                 addupc_task(p, frame->tf_rip, 
200                         (u_int)((int)lp->lwp_thread->td_sticks - sticks));
201         }
202
203 recheck:
204         /*
205          * If the jungle wants us dead, so be it.
206          */
207         if (lp->lwp_flag & LWP_WEXIT) {
208                 get_mplock();
209                 lwp_exit(0);
210                 rel_mplock(); /* NOT REACHED */
211         }
212
213         /*
214          * Block here if we are in a stopped state.
215          */
216         if (p->p_stat == SSTOP) {
217                 get_mplock();
218                 tstop();
219                 rel_mplock();
220                 goto recheck;
221         }
222
223         /*
224          * Post any pending upcalls.  If running a virtual kernel be sure
225          * to restore the virtual kernel's vmspace before posting the upcall.
226          */
227         if (p->p_flag & P_UPCALLPEND) {
228                 p->p_flag &= ~P_UPCALLPEND;
229                 get_mplock();
230                 postupcall(lp);
231                 rel_mplock();
232                 goto recheck;
233         }
234
235         /*
236          * Post any pending signals.  If running a virtual kernel be sure
237          * to restore the virtual kernel's vmspace before posting the signal.
238          */
239         if ((sig = CURSIG_TRACE(lp)) != 0) {
240                 get_mplock();
241                 postsig(sig);
242                 rel_mplock();
243                 goto recheck;
244         }
245
246         /*
247          * block here if we are swapped out, but still process signals
248          * (such as SIGKILL).  proc0 (the swapin scheduler) is already
249          * aware of our situation, we do not have to wake it up.
250          */
251         if (p->p_flag & P_SWAPPEDOUT) {
252                 get_mplock();
253                 p->p_flag |= P_SWAPWAIT;
254                 swapin_request();
255                 if (p->p_flag & P_SWAPWAIT)
256                         tsleep(p, PCATCH, "SWOUT", 0);
257                 p->p_flag &= ~P_SWAPWAIT;
258                 rel_mplock();
259                 goto recheck;
260         }
261
262         /*
263          * Make sure postsig() handled request to restore old signal mask after
264          * running signal handler.
265          */
266         KKASSERT((lp->lwp_flag & LWP_OLDMASK) == 0);
267 }
268
269 /*
270  * Cleanup from userenter and any passive release that might have occured.
271  * We must reclaim the current-process designation before we can return
272  * to usermode.  We also handle both LWKT and USER reschedule requests.
273  */
274 static __inline void
275 userexit(struct lwp *lp)
276 {
277         struct thread *td = lp->lwp_thread;
278 /*      globaldata_t gd = td->td_gd;*/
279
280         /*
281          * Handle stop requests at kernel priority.  Any requests queued
282          * after this loop will generate another AST.
283          */
284         while (lp->lwp_proc->p_stat == SSTOP) {
285                 get_mplock();
286                 tstop();
287                 rel_mplock();
288         }
289
290         /*
291          * Reduce our priority in preparation for a return to userland.  If
292          * our passive release function was still in place, our priority was
293          * never raised and does not need to be reduced.
294          */
295         lwkt_passive_recover(td);
296
297         /*
298          * Become the current user scheduled process if we aren't already,
299          * and deal with reschedule requests and other factors.
300          */
301         lp->lwp_proc->p_usched->acquire_curproc(lp);
302         /* WARNING: we may have migrated cpu's */
303         /* gd = td->td_gd; */
304 }
305
306 #if !defined(KTR_KERNENTRY)
307 #define KTR_KERNENTRY   KTR_ALL
308 #endif
309 KTR_INFO_MASTER(kernentry);
310 KTR_INFO(KTR_KERNENTRY, kernentry, trap, 0, "STR",
311          sizeof(long) + sizeof(long) + sizeof(long) + sizeof(vm_offset_t));
312 KTR_INFO(KTR_KERNENTRY, kernentry, trap_ret, 0, "STR",
313          sizeof(long) + sizeof(long));
314 KTR_INFO(KTR_KERNENTRY, kernentry, syscall, 0, "STR",
315          sizeof(long) + sizeof(long) + sizeof(long));
316 KTR_INFO(KTR_KERNENTRY, kernentry, syscall_ret, 0, "STR",
317          sizeof(long) + sizeof(long) + sizeof(long));
318 KTR_INFO(KTR_KERNENTRY, kernentry, fork_ret, 0, "STR",
319          sizeof(long) + sizeof(long));
320
321 /*
322  * Exception, fault, and trap interface to the kernel.
323  * This common code is called from assembly language IDT gate entry
324  * routines that prepare a suitable stack frame, and restore this
325  * frame after the exception has been processed.
326  *
327  * This function is also called from doreti in an interlock to handle ASTs.
328  * For example:  hardwareint->INTROUTINE->(set ast)->doreti->trap
329  *
330  * NOTE!  We have to retrieve the fault address prior to obtaining the
331  * MP lock because get_mplock() may switch out.  YYY cr2 really ought
332  * to be retrieved by the assembly code, not here.
333  *
334  * XXX gd_trap_nesting_level currently prevents lwkt_switch() from panicing
335  * if an attempt is made to switch from a fast interrupt or IPI.  This is
336  * necessary to properly take fatal kernel traps on SMP machines if 
337  * get_mplock() has to block.
338  */
339
340 void
341 trap(struct trapframe *frame)
342 {
343         struct globaldata *gd = mycpu;
344         struct thread *td = gd->gd_curthread;
345         struct lwp *lp = td->td_lwp;
346         struct proc *p;
347         int sticks = 0;
348         int i = 0, ucode = 0, type, code;
349 #ifdef SMP
350         int have_mplock = 0;
351 #endif
352 #ifdef INVARIANTS
353         int crit_count = td->td_pri & ~TDPRI_MASK;
354 #endif
355         vm_offset_t eva;
356
357         p = td->td_proc;
358
359 #ifdef JG
360         kprintf0("TRAP ");
361         kprintf0("\"%s\" type=%ld\n",
362                 trap_msg[frame->tf_trapno], frame->tf_trapno);
363         kprintf0(" rip=%lx rsp=%lx\n", frame->tf_rip, frame->tf_rsp);
364         kprintf0(" err=%lx addr=%lx\n", frame->tf_err, frame->tf_addr);
365         kprintf0(" cs=%lx ss=%lx rflags=%lx\n", (unsigned long)frame->tf_cs, (unsigned long)frame->tf_ss, frame->tf_rflags);
366 #endif
367
368 #ifdef DDB
369         if (db_active) {
370                 ++gd->gd_trap_nesting_level;
371                 MAKEMPSAFE(have_mplock);
372                 trap_fatal(frame, frame->tf_addr);
373                 --gd->gd_trap_nesting_level;
374                 goto out2;
375         }
376 #endif
377 #ifdef DDB
378         if (db_active) {
379                 eva = (frame->tf_trapno == T_PAGEFLT ? frame->tf_addr : 0);
380                 ++gd->gd_trap_nesting_level;
381                 MAKEMPSAFE(have_mplock);
382                 trap_fatal(frame, eva);
383                 --gd->gd_trap_nesting_level;
384                 goto out2;
385         }
386 #endif
387
388         eva = 0;
389
390 #ifdef SMP
391         if (trap_mpsafe == 0) {
392                 ++gd->gd_trap_nesting_level;
393                 MAKEMPSAFE(have_mplock);
394                 --gd->gd_trap_nesting_level;
395         }
396 #endif
397
398         if ((frame->tf_rflags & PSL_I) == 0) {
399                 /*
400                  * Buggy application or kernel code has disabled interrupts
401                  * and then trapped.  Enabling interrupts now is wrong, but
402                  * it is better than running with interrupts disabled until
403                  * they are accidentally enabled later.
404                  */
405                 type = frame->tf_trapno;
406                 if (ISPL(frame->tf_cs) == SEL_UPL) {
407                         MAKEMPSAFE(have_mplock);
408                         /* JG curproc can be NULL */
409                         kprintf(
410                             "pid %ld (%s): trap %d with interrupts disabled\n",
411                             (long)curproc->p_pid, curproc->p_comm, type);
412                 } else if (type != T_NMI && type != T_BPTFLT &&
413                     type != T_TRCTRAP) {
414                         /*
415                          * XXX not quite right, since this may be for a
416                          * multiple fault in user mode.
417                          */
418                         MAKEMPSAFE(have_mplock);
419                         kprintf("kernel trap %d with interrupts disabled\n",
420                             type);
421                 }
422                 cpu_enable_intr();
423         }
424
425         type = frame->tf_trapno;
426         code = frame->tf_err;
427
428         if (ISPL(frame->tf_cs) == SEL_UPL) {
429                 /* user trap */
430
431                 KTR_LOG(kernentry_trap, p->p_pid, lp->lwp_tid,
432                         frame->tf_trapno, eva);
433
434                 userenter(td);
435
436                 sticks = (int)td->td_sticks;
437                 lp->lwp_md.md_regs = frame;
438
439                 switch (type) {
440                 case T_PRIVINFLT:       /* privileged instruction fault */
441                         ucode = ILL_PRVOPC;
442                         i = SIGILL;
443                         break;
444
445                 case T_BPTFLT:          /* bpt instruction fault */
446                 case T_TRCTRAP:         /* trace trap */
447                         frame->tf_rflags &= ~PSL_T;
448                         i = SIGTRAP;
449                         break;
450
451                 case T_ARITHTRAP:       /* arithmetic trap */
452                         ucode = code;
453                         i = SIGFPE;
454 #if 0
455 #if JG
456                         ucode = fputrap();
457 #else
458                         ucode = code;
459 #endif
460                         i = SIGFPE;
461 #endif
462                         break;
463
464                 case T_ASTFLT:          /* Allow process switch */
465                         mycpu->gd_cnt.v_soft++;
466                         if (mycpu->gd_reqflags & RQF_AST_OWEUPC) {
467                                 atomic_clear_int_nonlocked(&mycpu->gd_reqflags,
468                                             RQF_AST_OWEUPC);
469                                 addupc_task(p, p->p_prof.pr_addr,
470                                             p->p_prof.pr_ticks);
471                         }
472                         goto out;
473
474                 case T_PROTFLT:         /* general protection fault */
475                 case T_SEGNPFLT:        /* segment not present fault */
476                 case T_TSSFLT:          /* invalid TSS fault */
477                 case T_DOUBLEFLT:       /* double fault */
478                 default:
479                         ucode = code + BUS_SEGM_FAULT ;
480                         i = SIGBUS;
481                         break;
482
483                 case T_PAGEFLT:         /* page fault */
484                         MAKEMPSAFE(have_mplock);
485                         i = trap_pfault(frame, TRUE);
486                         if (frame->tf_rip == 0)
487                                 kprintf("T_PAGEFLT: Warning %%rip == 0!\n");
488                         if (i == -1)
489                                 goto out;
490                         if (i == 0)
491                                 goto out;
492
493                         ucode = T_PAGEFLT;
494                         break;
495
496                 case T_DIVIDE:          /* integer divide fault */
497                         ucode = FPE_INTDIV;
498                         i = SIGFPE;
499                         break;
500
501                 case T_NMI:
502                         MAKEMPSAFE(have_mplock);
503                         /* machine/parity/power fail/"kitchen sink" faults */
504                         if (isa_nmi(code) == 0) {
505 #ifdef DDB
506                                 /*
507                                  * NMI can be hooked up to a pushbutton
508                                  * for debugging.
509                                  */
510                                 if (ddb_on_nmi) {
511                                         kprintf ("NMI ... going to debugger\n");
512                                         kdb_trap(type, 0, frame);
513                                 }
514 #endif /* DDB */
515                                 goto out2;
516                         } else if (panic_on_nmi)
517                                 panic("NMI indicates hardware failure");
518                         break;
519
520                 case T_OFLOW:           /* integer overflow fault */
521                         ucode = FPE_INTOVF;
522                         i = SIGFPE;
523                         break;
524
525                 case T_BOUND:           /* bounds check fault */
526                         ucode = FPE_FLTSUB;
527                         i = SIGFPE;
528                         break;
529
530                 case T_DNA:
531                         /*
532                          * Virtual kernel intercept - pass the DNA exception
533                          * to the virtual kernel if it asked to handle it.
534                          * This occurs when the virtual kernel is holding
535                          * onto the FP context for a different emulated
536                          * process then the one currently running.
537                          *
538                          * We must still call npxdna() since we may have
539                          * saved FP state that the virtual kernel needs
540                          * to hand over to a different emulated process.
541                          */
542                         if (lp->lwp_vkernel && lp->lwp_vkernel->ve &&
543                             (td->td_pcb->pcb_flags & FP_VIRTFP)
544                         ) {
545                                 npxdna();
546                                 break;
547                         }
548
549                         /*
550                          * The kernel may have switched out the FP unit's
551                          * state, causing the user process to take a fault
552                          * when it tries to use the FP unit.  Restore the
553                          * state here
554                          */
555                         if (npxdna())
556                                 goto out;
557                         i = SIGFPE;
558                         ucode = FPE_FPU_NP_TRAP;
559                         break;
560
561                 case T_FPOPFLT:         /* FPU operand fetch fault */
562                         ucode = T_FPOPFLT;
563                         i = SIGILL;
564                         break;
565
566                 case T_XMMFLT:          /* SIMD floating-point exception */
567                         ucode = 0; /* XXX */
568                         i = SIGFPE;
569                         break;
570                 }
571         } else {
572                 /* kernel trap */
573
574                 switch (type) {
575                 case T_PAGEFLT:                 /* page fault */
576                         MAKEMPSAFE(have_mplock);
577                         trap_pfault(frame, FALSE);
578                         goto out2;
579
580                 case T_DNA:
581                         /*
582                          * The kernel is apparently using fpu for copying.
583                          * XXX this should be fatal unless the kernel has
584                          * registered such use.
585                          */
586                         if (npxdna())
587                                 goto out2;
588                         break;
589
590                 case T_STKFLT:          /* stack fault */
591                         break;
592
593                 case T_PROTFLT:         /* general protection fault */
594                 case T_SEGNPFLT:        /* segment not present fault */
595                         /*
596                          * Invalid segment selectors and out of bounds
597                          * %rip's and %rsp's can be set up in user mode.
598                          * This causes a fault in kernel mode when the
599                          * kernel tries to return to user mode.  We want
600                          * to get this fault so that we can fix the
601                          * problem here and not have to check all the
602                          * selectors and pointers when the user changes
603                          * them.
604                          */
605                         kprintf("trap.c line %d\n", __LINE__);
606                         if (mycpu->gd_intr_nesting_level == 0) {
607                                 if (td->td_pcb->pcb_onfault) {
608                                         frame->tf_rip = (register_t)
609                                                 td->td_pcb->pcb_onfault;
610                                         goto out2;
611                                 }
612                                 if (frame->tf_rip == (long)doreti_iret) {
613                                         frame->tf_rip = (long)doreti_iret_fault;
614                                         goto out2;
615                                 }
616                         }
617                         break;
618
619                 case T_TSSFLT:
620                         /*
621                          * PSL_NT can be set in user mode and isn't cleared
622                          * automatically when the kernel is entered.  This
623                          * causes a TSS fault when the kernel attempts to
624                          * `iret' because the TSS link is uninitialized.  We
625                          * want to get this fault so that we can fix the
626                          * problem here and not every time the kernel is
627                          * entered.
628                          */
629                         if (frame->tf_rflags & PSL_NT) {
630                                 frame->tf_rflags &= ~PSL_NT;
631                                 goto out2;
632                         }
633                         break;
634
635                 case T_TRCTRAP:  /* trace trap */
636 #if 0
637                         if (frame->tf_rip == (int)IDTVEC(syscall)) {
638                                 /*
639                                  * We've just entered system mode via the
640                                  * syscall lcall.  Continue single stepping
641                                  * silently until the syscall handler has
642                                  * saved the flags.
643                                  */
644                                 goto out2;
645                         }
646                         if (frame->tf_rip == (int)IDTVEC(syscall) + 1) {
647                                 /*
648                                  * The syscall handler has now saved the
649                                  * flags.  Stop single stepping it.
650                                  */
651                                 frame->tf_rflags &= ~PSL_T;
652                                 goto out2;
653                         }
654 #endif
655
656                         /*
657                          * Ignore debug register trace traps due to
658                          * accesses in the user's address space, which
659                          * can happen under several conditions such as
660                          * if a user sets a watchpoint on a buffer and
661                          * then passes that buffer to a system call.
662                          * We still want to get TRCTRAPS for addresses
663                          * in kernel space because that is useful when
664                          * debugging the kernel.
665                          */
666 #if JG
667                         if (user_dbreg_trap()) {
668                                 /*
669                                  * Reset breakpoint bits because the
670                                  * processor doesn't
671                                  */
672                                 /* XXX check upper bits here */
673                                 load_dr6(rdr6() & 0xfffffff0);
674                                 goto out2;
675                         }
676 #endif
677                         /*
678                          * FALLTHROUGH (TRCTRAP kernel mode, kernel address)
679                          */
680                 case T_BPTFLT:
681                         /*
682                          * If DDB is enabled, let it handle the debugger trap.
683                          * Otherwise, debugger traps "can't happen".
684                          */
685 #ifdef DDB
686                         MAKEMPSAFE(have_mplock);
687                         if (kdb_trap(type, 0, frame))
688                                 goto out2;
689 #endif
690                         break;
691
692                 case T_NMI:
693                         MAKEMPSAFE(have_mplock);
694                         /* machine/parity/power fail/"kitchen sink" faults */
695 #if NISA > 0
696                         if (isa_nmi(code) == 0) {
697 #ifdef DDB
698                                 /*
699                                  * NMI can be hooked up to a pushbutton
700                                  * for debugging.
701                                  */
702                                 if (ddb_on_nmi) {
703                                         kprintf ("NMI ... going to debugger\n");
704                                         kdb_trap(type, 0, frame);
705                                 }
706 #endif /* DDB */
707                                 goto out2;
708                         } else if (panic_on_nmi == 0)
709                                 goto out2;
710                         /* FALL THROUGH */
711 #endif /* NISA > 0 */
712                 }
713                 MAKEMPSAFE(have_mplock);
714                 trap_fatal(frame, 0);
715                 goto out2;
716         }
717
718         /*
719          * Virtual kernel intercept - if the fault is directly related to a
720          * VM context managed by a virtual kernel then let the virtual kernel
721          * handle it.
722          */
723         if (lp->lwp_vkernel && lp->lwp_vkernel->ve) {
724                 vkernel_trap(lp, frame);
725                 goto out2;
726         }
727
728         /*
729          * Virtual kernel intercept - if the fault is directly related to a
730          * VM context managed by a virtual kernel then let the virtual kernel
731          * handle it.
732          */
733         if (lp->lwp_vkernel && lp->lwp_vkernel->ve) {
734                 vkernel_trap(lp, frame);
735                 goto out;
736         }
737
738         /*
739          * Translate fault for emulators (e.g. Linux) 
740          */
741         if (*p->p_sysent->sv_transtrap)
742                 i = (*p->p_sysent->sv_transtrap)(i, type);
743
744         MAKEMPSAFE(have_mplock);
745         trapsignal(lp, i, ucode);
746
747 #ifdef DEBUG
748         if (type <= MAX_TRAP_MSG) {
749                 uprintf("fatal process exception: %s",
750                         trap_msg[type]);
751                 if ((type == T_PAGEFLT) || (type == T_PROTFLT))
752                         uprintf(", fault VA = 0x%lx", frame->tf_addr);
753                 uprintf("\n");
754         }
755 #endif
756
757 out:
758 #ifdef SMP
759         if (ISPL(frame->tf_cs) == SEL_UPL)
760                 KASSERT(td->td_mpcount == have_mplock, ("badmpcount trap/end from %p", (void *)frame->tf_rip));
761 #endif
762         userret(lp, frame, sticks);
763         userexit(lp);
764 out2:   ;
765 #ifdef SMP
766         if (have_mplock)
767                 rel_mplock();
768 #endif
769         if (p != NULL && lp != NULL)
770                 KTR_LOG(kernentry_trap_ret, p->p_pid, lp->lwp_tid);
771 #ifdef INVARIANTS
772         KASSERT(crit_count == (td->td_pri & ~TDPRI_MASK),
773                 ("syscall: critical section count mismatch! %d/%d",
774                 crit_count / TDPRI_CRIT, td->td_pri / TDPRI_CRIT));
775 #endif
776 }
777
778 static int
779 trap_pfault(struct trapframe *frame, int usermode)
780 {
781         vm_offset_t va;
782         struct vmspace *vm = NULL;
783         vm_map_t map;
784         int rv = 0;
785         vm_prot_t ftype;
786         thread_t td = curthread;
787         struct lwp *lp = td->td_lwp;
788
789         va = trunc_page(frame->tf_addr);
790         if (va >= VM_MIN_KERNEL_ADDRESS) {
791                 /*
792                  * Don't allow user-mode faults in kernel address space.
793                  */
794                 if (usermode)
795                         goto nogo;
796
797                 map = &kernel_map;
798         } else {
799                 /*
800                  * This is a fault on non-kernel virtual memory.
801                  * vm is initialized above to NULL. If curproc is NULL
802                  * or curproc->p_vmspace is NULL the fault is fatal.
803                  */
804                 if (lp != NULL)
805                         vm = lp->lwp_vmspace;
806
807                 if (vm == NULL)
808                         goto nogo;
809
810                 map = &vm->vm_map;
811         }
812
813         /*
814          * PGEX_I is defined only if the execute disable bit capability is
815          * supported and enabled.
816          */
817         if (frame->tf_err & PGEX_W)
818                 ftype = VM_PROT_WRITE;
819 #if JG
820         else if ((frame->tf_err & PGEX_I) && pg_nx != 0)
821                 ftype = VM_PROT_EXECUTE;
822 #endif
823         else
824                 ftype = VM_PROT_READ;
825
826         if (map != &kernel_map) {
827                 /*
828                  * Keep swapout from messing with us during this
829                  *      critical time.
830                  */
831                 PHOLD(lp->lwp_proc);
832
833                 /*
834                  * Grow the stack if necessary
835                  */
836                 /* grow_stack returns false only if va falls into
837                  * a growable stack region and the stack growth
838                  * fails.  It returns true if va was not within
839                  * a growable stack region, or if the stack 
840                  * growth succeeded.
841                  */
842                 if (!grow_stack(lp->lwp_proc, va)) {
843                         rv = KERN_FAILURE;
844                         PRELE(lp->lwp_proc);
845                         goto nogo;
846                 }
847
848                 /* Fault in the user page: */
849                 rv = vm_fault(map, va, ftype,
850                               (ftype & VM_PROT_WRITE) ? VM_FAULT_DIRTY
851                                                       : VM_FAULT_NORMAL);
852
853                 PRELE(lp->lwp_proc);
854         } else {
855                 /*
856                  * Don't have to worry about process locking or stacks
857                  * in the kernel.
858                  */
859                 rv = vm_fault(map, va, ftype, VM_FAULT_NORMAL);
860         }
861
862         if (rv == KERN_SUCCESS)
863                 return (0);
864 nogo:
865         if (!usermode) {
866                 if (td->td_gd->gd_intr_nesting_level == 0 &&
867                     td->td_pcb->pcb_onfault) {
868                         frame->tf_rip = (register_t)td->td_pcb->pcb_onfault;
869                         return (0);
870                 }
871                 trap_fatal(frame, frame->tf_addr);
872                 return (-1);
873         }
874
875         /*
876          * NOTE: on amd64 we have a tf_addr field in the trapframe, no
877          * kludge is needed to pass the fault address to signal handlers.
878          */
879         struct proc *p = td->td_proc;
880         kprintf("seg-fault accessing address %p rip=%p pid=%d p_comm=%s\n",
881                 (void *)va, (void *)frame->tf_rip, p->p_pid, p->p_comm);
882         /* Debugger("seg-fault"); */
883
884         return((rv == KERN_PROTECTION_FAILURE) ? SIGBUS : SIGSEGV);
885 }
886
887 static void
888 trap_fatal(struct trapframe *frame, vm_offset_t eva)
889 {
890         int code, ss;
891         u_int type;
892         long rsp;
893         struct soft_segment_descriptor softseg;
894         char *msg;
895
896         code = frame->tf_err;
897         type = frame->tf_trapno;
898         sdtossd(&gdt[IDXSEL(frame->tf_cs & 0xffff)], &softseg);
899
900         if (type <= MAX_TRAP_MSG)
901                 msg = trap_msg[type];
902         else
903                 msg = "UNKNOWN";
904         kprintf("\n\nFatal trap %d: %s while in %s mode\n", type, msg,
905             ISPL(frame->tf_cs) == SEL_UPL ? "user" : "kernel");
906 #ifdef SMP
907         /* three separate prints in case of a trap on an unmapped page */
908         kprintf("mp_lock = %08x; ", mp_lock);
909         kprintf("cpuid = %d; ", mycpu->gd_cpuid);
910         kprintf("lapic->id = %08x\n", lapic->id);
911 #endif
912         if (type == T_PAGEFLT) {
913                 kprintf("fault virtual address  = 0x%lx\n", eva);
914                 kprintf("fault code             = %s %s %s, %s\n",
915                         code & PGEX_U ? "user" : "supervisor",
916                         code & PGEX_W ? "write" : "read",
917                         code & PGEX_I ? "instruction" : "data",
918                         code & PGEX_P ? "protection violation" : "page not present");
919         }
920         kprintf("instruction pointer    = 0x%lx:0x%lx\n",
921                frame->tf_cs & 0xffff, frame->tf_rip);
922         if (ISPL(frame->tf_cs) == SEL_UPL) {
923                 ss = frame->tf_ss & 0xffff;
924                 rsp = frame->tf_rsp;
925         } else {
926                 ss = GSEL(GDATA_SEL, SEL_KPL);
927                 rsp = (long)&frame->tf_rsp;
928         }
929         kprintf("stack pointer          = 0x%x:0x%lx\n", ss, rsp);
930         kprintf("frame pointer          = 0x%x:0x%lx\n", ss, frame->tf_rbp);
931         kprintf("code segment           = base 0x%lx, limit 0x%lx, type 0x%x\n",
932                softseg.ssd_base, softseg.ssd_limit, softseg.ssd_type);
933         kprintf("                       = DPL %d, pres %d, long %d, def32 %d, gran %d\n",
934                softseg.ssd_dpl, softseg.ssd_p, softseg.ssd_long, softseg.ssd_def32,
935                softseg.ssd_gran);
936         kprintf("processor eflags       = ");
937         if (frame->tf_rflags & PSL_T)
938                 kprintf("trace trap, ");
939         if (frame->tf_rflags & PSL_I)
940                 kprintf("interrupt enabled, ");
941         if (frame->tf_rflags & PSL_NT)
942                 kprintf("nested task, ");
943         if (frame->tf_rflags & PSL_RF)
944                 kprintf("resume, ");
945         kprintf("IOPL = %ld\n", (frame->tf_rflags & PSL_IOPL) >> 12);
946         kprintf("current process                = ");
947         if (curproc) {
948                 kprintf("%lu\n",
949                     (u_long)curproc->p_pid);
950         } else {
951                 kprintf("Idle\n");
952         }
953         kprintf("current thread          = pri %d ", curthread->td_pri);
954         if (curthread->td_pri >= TDPRI_CRIT)
955                 kprintf("(CRIT)");
956         kprintf("\n");
957
958 #ifdef DDB
959         if ((debugger_on_panic || db_active) && kdb_trap(type, code, frame))
960                 return;
961 #endif
962         kprintf("trap number            = %d\n", type);
963         if (type <= MAX_TRAP_MSG)
964                 panic("%s", trap_msg[type]);
965         else
966                 panic("unknown/reserved trap");
967 }
968
969 /*
970  * Double fault handler. Called when a fault occurs while writing
971  * a frame for a trap/exception onto the stack. This usually occurs
972  * when the stack overflows (such is the case with infinite recursion,
973  * for example).
974  */
975 void
976 dblfault_handler(struct trapframe *frame)
977 {
978         kprintf0("DOUBLE FAULT\n");
979         kprintf("\nFatal double fault\n");
980         kprintf("rip = 0x%lx\n", frame->tf_rip);
981         kprintf("rsp = 0x%lx\n", frame->tf_rsp);
982         kprintf("rbp = 0x%lx\n", frame->tf_rbp);
983 #ifdef SMP
984         /* three separate prints in case of a trap on an unmapped page */
985         kprintf("mp_lock = %08x; ", mp_lock);
986         kprintf("cpuid = %d; ", mycpu->gd_cpuid);
987         kprintf("lapic->id = %08x\n", lapic->id);
988 #endif
989         panic("double fault");
990 }
991
992 /*
993  *      syscall2 -      MP aware system call request C handler
994  *
995  *      A system call is essentially treated as a trap except that the
996  *      MP lock is not held on entry or return.  We are responsible for
997  *      obtaining the MP lock if necessary and for handling ASTs
998  *      (e.g. a task switch) prior to return.
999  *
1000  *      In general, only simple access and manipulation of curproc and
1001  *      the current stack is allowed without having to hold MP lock.
1002  *
1003  *      MPSAFE - note that large sections of this routine are run without
1004  *               the MP lock.
1005  */
1006 void
1007 syscall2(struct trapframe *frame)
1008 {
1009         struct thread *td = curthread;
1010         struct proc *p = td->td_proc;
1011         struct lwp *lp = td->td_lwp;
1012         caddr_t params;
1013         struct sysent *callp;
1014         register_t orig_tf_rflags;
1015         int sticks;
1016         int error;
1017         int narg;
1018 #ifdef INVARIANTS
1019         int crit_count = td->td_pri & ~TDPRI_MASK;
1020 #endif
1021 #ifdef SMP
1022         int have_mplock = 0;
1023 #endif
1024         register_t *argp;
1025         u_int code;
1026         int reg, regcnt;
1027         union sysunion args;
1028         register_t *argsdst;
1029
1030         mycpu->gd_cnt.v_syscall++;
1031
1032 #ifdef DIAGNOSTIC
1033         if (ISPL(frame->tf_cs) != SEL_UPL) {
1034                 get_mplock();
1035                 panic("syscall");
1036                 /* NOT REACHED */
1037         }
1038 #endif
1039
1040         KTR_LOG(kernentry_syscall, p->p_pid, lp->lwp_tid,
1041                 frame->tf_eax);
1042
1043 #ifdef SMP
1044         KASSERT(td->td_mpcount == 0, ("badmpcount syscall2 from %p", (void *)frame->tf_rip));
1045         if (syscall_mpsafe == 0)
1046                 MAKEMPSAFE(have_mplock);
1047 #endif
1048         userenter(td);          /* lazy raise our priority */
1049
1050         reg = 0;
1051         regcnt = 6;
1052         /*
1053          * Misc
1054          */
1055         sticks = (int)td->td_sticks;
1056         orig_tf_rflags = frame->tf_rflags;
1057
1058         /*
1059          * Virtual kernel intercept - if a VM context managed by a virtual
1060          * kernel issues a system call the virtual kernel handles it, not us.
1061          * Restore the virtual kernel context and return from its system
1062          * call.  The current frame is copied out to the virtual kernel.
1063          */
1064         if (lp->lwp_vkernel && lp->lwp_vkernel->ve) {
1065                 error = vkernel_trap(lp, frame);
1066                 frame->tf_rax = error;
1067                 if (error)
1068                         frame->tf_rflags |= PSL_C;
1069                 error = EJUSTRETURN;
1070                 goto out;
1071         }
1072
1073         /*
1074          * Get the system call parameters and account for time
1075          */
1076         lp->lwp_md.md_regs = frame;
1077         params = (caddr_t)frame->tf_rsp + sizeof(register_t);
1078         code = frame->tf_rax;
1079
1080         if (p->p_sysent->sv_prepsyscall) {
1081                 (*p->p_sysent->sv_prepsyscall)(
1082                         frame, (int *)(&args.nosys.sysmsg + 1),
1083                         &code, &params);
1084         } else {
1085                 if (code == SYS_syscall || code == SYS___syscall) {
1086                         code = frame->tf_rdi;
1087                         reg++;
1088                         regcnt--;
1089                 }
1090         }
1091
1092         if (p->p_sysent->sv_mask)
1093                 code &= p->p_sysent->sv_mask;
1094
1095         if (code >= p->p_sysent->sv_size)
1096                 callp = &p->p_sysent->sv_table[0];
1097         else
1098                 callp = &p->p_sysent->sv_table[code];
1099
1100         narg = callp->sy_narg & SYF_ARGMASK;
1101
1102         /*
1103          * On amd64 we get up to six arguments in registers. The rest are
1104          * on the stack. The first six members of 'struct trapframe' happen
1105          * to be the registers used to pass arguments, in exactly the right
1106          * order.
1107          */
1108         argp = &frame->tf_rdi;
1109         argp += reg;
1110         argsdst = (register_t *)(&args.nosys.sysmsg + 1);
1111         /*
1112          * JG can we overflow the space pointed to by 'argsdst'
1113          * either with 'bcopy' or with 'copyin'?
1114          */
1115         bcopy(argp, argsdst, sizeof(register_t) * regcnt);
1116         /*
1117          * copyin is MP aware, but the tracing code is not
1118          */
1119         if (narg > regcnt) {
1120                 KASSERT(params != NULL, ("copyin args with no params!"));
1121                 error = copyin(params, &argsdst[regcnt],
1122                         (narg - regcnt) * sizeof(register_t));
1123                 if (error) {
1124 #ifdef KTRACE
1125                         if (KTRPOINT(td, KTR_SYSCALL)) {
1126                                 MAKEMPSAFE(have_mplock);
1127                                 
1128                                 ktrsyscall(lp, code, narg,
1129                                         (void *)(&args.nosys.sysmsg + 1));
1130                         }
1131 #endif
1132                         goto bad;
1133                 }
1134         }
1135
1136 #ifdef KTRACE
1137         if (KTRPOINT(td, KTR_SYSCALL)) {
1138                 MAKEMPSAFE(have_mplock);
1139                 ktrsyscall(lp, code, narg, (void *)(&args.nosys.sysmsg + 1));
1140         }
1141 #endif
1142
1143         /*
1144          * Default return value is 0 (will be copied to %rax).  Double-value
1145          * returns use %rax and %rdx.  %rdx is left unchanged for system
1146          * calls which return only one result.
1147          */
1148         args.sysmsg_fds[0] = 0;
1149         args.sysmsg_fds[1] = frame->tf_rdx;
1150
1151         /*
1152          * The syscall might manipulate the trap frame. If it does it
1153          * will probably return EJUSTRETURN.
1154          */
1155         args.sysmsg_frame = frame;
1156
1157         STOPEVENT(p, S_SCE, narg);      /* MP aware */
1158
1159 #ifdef SMP
1160         /*
1161          * Try to run the syscall without the MP lock if the syscall
1162          * is MP safe.  We have to obtain the MP lock no matter what if 
1163          * we are ktracing
1164          */
1165         if ((callp->sy_narg & SYF_MPSAFE) == 0)
1166                 MAKEMPSAFE(have_mplock);
1167 #endif
1168
1169         error = (*callp->sy_call)(&args);
1170
1171 out:
1172         /*
1173          * MP SAFE (we may or may not have the MP lock at this point)
1174          */
1175         //kprintf("SYSMSG %d ", error);
1176         switch (error) {
1177         case 0:
1178                 /*
1179                  * Reinitialize proc pointer `p' as it may be different
1180                  * if this is a child returning from fork syscall.
1181                  */
1182                 p = curproc;
1183                 lp = curthread->td_lwp;
1184                 frame->tf_rax = args.sysmsg_fds[0];
1185                 frame->tf_rdx = args.sysmsg_fds[1];
1186                 frame->tf_rflags &= ~PSL_C;
1187                 break;
1188         case ERESTART:
1189                 /*
1190                  * Reconstruct pc, we know that 'syscall' is 2 bytes.
1191                  * We have to do a full context restore so that %r10
1192                  * (which was holding the value of %rcx) is restored for
1193                  * the next iteration.
1194                  */
1195                 frame->tf_rip -= frame->tf_err;
1196                 frame->tf_r10 = frame->tf_rcx;
1197                 break;
1198         case EJUSTRETURN:
1199                 break;
1200         case EASYNC:
1201                 panic("Unexpected EASYNC return value (for now)");
1202         default:
1203 bad:
1204                 if (p->p_sysent->sv_errsize) {
1205                         if (error >= p->p_sysent->sv_errsize)
1206                                 error = -1;     /* XXX */
1207                         else
1208                                 error = p->p_sysent->sv_errtbl[error];
1209                 }
1210                 frame->tf_rax = error;
1211                 frame->tf_rflags |= PSL_C;
1212                 break;
1213         }
1214
1215         /*
1216          * Traced syscall.  trapsignal() is not MP aware.
1217          */
1218         if (orig_tf_rflags & PSL_T) {
1219                 MAKEMPSAFE(have_mplock);
1220                 frame->tf_rflags &= ~PSL_T;
1221                 trapsignal(lp, SIGTRAP, 0);
1222         }
1223
1224         /*
1225          * Handle reschedule and other end-of-syscall issues
1226          */
1227         userret(lp, frame, sticks);
1228
1229 #ifdef KTRACE
1230         if (KTRPOINT(td, KTR_SYSRET)) {
1231                 MAKEMPSAFE(have_mplock);
1232                 ktrsysret(lp, code, error, args.sysmsg_result);
1233         }
1234 #endif
1235
1236         /*
1237          * This works because errno is findable through the
1238          * register set.  If we ever support an emulation where this
1239          * is not the case, this code will need to be revisited.
1240          */
1241         STOPEVENT(p, S_SCX, code);
1242
1243         userexit(lp);
1244 #ifdef SMP
1245         /*
1246          * Release the MP lock if we had to get it
1247          */
1248         KASSERT(td->td_mpcount == have_mplock, 
1249                 ("badmpcount syscall2/end from %p", (void *)frame->tf_rip));
1250         if (have_mplock)
1251                 rel_mplock();
1252 #endif
1253         KTR_LOG(kernentry_syscall_ret, p->p_pid, lp->lwp_tid, error);
1254 #ifdef INVARIANTS
1255         KASSERT(crit_count == (td->td_pri & ~TDPRI_MASK), 
1256                 ("syscall: critical section count mismatch! %d/%d",
1257                 crit_count / TDPRI_CRIT, td->td_pri / TDPRI_CRIT));
1258 #endif
1259 }
1260
1261 void
1262 fork_return(struct lwp *lp, struct trapframe *frame)
1263 {
1264         frame->tf_rax = 0;              /* Child returns zero */
1265         frame->tf_rflags &= ~PSL_C;     /* success */
1266         frame->tf_rdx = 1;
1267
1268         generic_lwp_return(lp, frame);
1269         KTR_LOG(kernentry_fork_ret, lp->lwp_proc->p_pid, lp->lwp_tid);
1270 }
1271
1272 /*
1273  * Simplified back end of syscall(), used when returning from fork()
1274  * directly into user mode.  MP lock is held on entry and should be
1275  * released on return.  This code will return back into the fork
1276  * trampoline code which then runs doreti.
1277  */
1278 void
1279 generic_lwp_return(struct lwp *lp, struct trapframe *frame)
1280 {
1281         struct proc *p = lp->lwp_proc;
1282
1283         /*
1284          * Newly forked processes are given a kernel priority.  We have to
1285          * adjust the priority to a normal user priority and fake entry
1286          * into the kernel (call userenter()) to install a passive release
1287          * function just in case userret() decides to stop the process.  This
1288          * can occur when ^Z races a fork.  If we do not install the passive
1289          * release function the current process designation will not be
1290          * released when the thread goes to sleep.
1291          */
1292         lwkt_setpri_self(TDPRI_USER_NORM);
1293         userenter(lp->lwp_thread);
1294         userret(lp, frame, 0);
1295 #ifdef KTRACE
1296         if (KTRPOINT(lp->lwp_thread, KTR_SYSRET))
1297                 ktrsysret(lp, SYS_fork, 0, 0);
1298 #endif
1299         p->p_flag |= P_PASSIVE_ACQ;
1300         userexit(lp);
1301         p->p_flag &= ~P_PASSIVE_ACQ;
1302 #ifdef SMP
1303         KKASSERT(lp->lwp_thread->td_mpcount == 1);
1304         rel_mplock();
1305 #endif
1306 }
1307
1308 /*
1309  * If PGEX_FPFAULT is set then set FP_VIRTFP in the PCB to force a T_DNA
1310  * fault (which is then passed back to the virtual kernel) if an attempt is
1311  * made to use the FP unit.
1312  *
1313  * XXX this is a fairly big hack.
1314  */
1315 void
1316 set_vkernel_fp(struct trapframe *frame)
1317 {
1318         /* JGXXX */
1319 }