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