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