proc->thread stage 4: rework the VFS and DEVICE subsystems to take thread
[dragonfly.git] / sys / platform / pc32 / i386 / trap.c
index 095edcb..bdb65a8 100644 (file)
@@ -36,7 +36,7 @@
  *
  *     from: @(#)trap.c        7.4 (Berkeley) 5/13/91
  * $FreeBSD: src/sys/i386/i386/trap.c,v 1.147.2.11 2003/02/27 19:09:59 luoqi Exp $
- * $DragonFly: src/sys/platform/pc32/i386/trap.c,v 1.3 2003/06/18 18:29:55 dillon Exp $
+ * $DragonFly: src/sys/platform/pc32/i386/trap.c,v 1.8 2003/06/25 03:55:53 dillon Exp $
  */
 
 /*
@@ -93,6 +93,7 @@
 #include <machine/vm86.h>
 
 #include <ddb/ddb.h>
+#include <sys/thread2.h>
 
 #include "isa.h"
 #include "npx.h"
@@ -166,6 +167,7 @@ userret(p, frame, oticks, have_mplock)
        int have_mplock;
 {
        int sig, s;
+       struct thread *td;
 
        while ((sig = CURSIG(p)) != 0) {
                if (have_mplock == 0) {
@@ -205,8 +207,9 @@ userret(p, frame, oticks, have_mplock)
                        get_mplock();
                        have_mplock = 1;
                }
-               addupc_task(p, frame->tf_eip,
-                           (u_int)(p->p_sticks - oticks) * psratio);
+               td = curthread;
+               addupc_task(p, frame->tf_eip, 
+                   (u_int)(td->td_sticks - oticks) * psratio);
        }
        curpriority = p->p_priority;
        return(have_mplock);
@@ -321,7 +324,7 @@ restart:
         if ((ISPL(frame.tf_cs) == SEL_UPL) || (frame.tf_eflags & PSL_VM)) {
                /* user trap */
 
-               sticks = p->p_sticks;
+               sticks = curthread->td_sticks;
                p->p_md.md_regs = &frame;
 
                switch (type) {
@@ -941,16 +944,20 @@ trap_fatal(frame, eva)
        } else {
                printf("Idle\n");
        }
+       printf("current thread          = pri %d ", curthread->td_pri);
+       if (curthread->td_pri >= TDPRI_CRIT)
+               printf("(CRIT)");
+       printf("\n");
        printf("interrupt mask          = ");
-       if ((cpl & net_imask) == net_imask)
+       if ((curthread->td_cpl & net_imask) == net_imask)
                printf("net ");
-       if ((cpl & tty_imask) == tty_imask)
+       if ((curthread->td_cpl & tty_imask) == tty_imask)
                printf("tty ");
-       if ((cpl & bio_imask) == bio_imask)
+       if ((curthread->td_cpl & bio_imask) == bio_imask)
                printf("bio ");
-       if ((cpl & cam_imask) == cam_imask)
+       if ((curthread->td_cpl & cam_imask) == cam_imask)
                printf("cam ");
-       if (cpl == 0)
+       if (curthread->td_cpl == 0)
                printf("none");
 #ifdef SMP
 /**
@@ -1064,10 +1071,11 @@ void
 syscall2(frame)
        struct trapframe frame;
 {
+       struct thread *td = curthread;
+       struct proc *p = td->td_proc;
        caddr_t params;
        int i;
        struct sysent *callp;
-       struct proc *p = curproc;
        register_t orig_tf_eflags;
        u_quad_t sticks;
        int error;
@@ -1085,12 +1093,12 @@ syscall2(frame)
 #endif
 
        /*
-        * handle atomicy by looping since interrupts are enabled and the 
-        * MP lock is not held.
+        * access non-atomic field from critical section.  p_sticks is
+        * updated by the clock interrupt.
         */
-       sticks = ((volatile struct proc *)p)->p_sticks; 
-       while (sticks != ((volatile struct proc *)p)->p_sticks)
-               sticks = ((volatile struct proc *)p)->p_sticks;
+       crit_enter();
+       sticks = curthread->td_sticks;
+       crit_exit();
 
        p->p_md.md_regs = &frame;
        params = (caddr_t)frame.tf_esp + sizeof(int);
@@ -1143,7 +1151,7 @@ syscall2(frame)
                get_mplock();
                have_mplock = 1;
 #ifdef KTRACE
-               if (KTRPOINT(p, KTR_SYSCALL))
+               if (KTRPOINT(td, KTR_SYSCALL))
                        ktrsyscall(p->p_tracep, code, narg, args);
 #endif
                goto bad;
@@ -1160,7 +1168,7 @@ syscall2(frame)
        }
 
 #ifdef KTRACE
-       if (KTRPOINT(p, KTR_SYSCALL)) {
+       if (KTRPOINT(td, KTR_SYSCALL)) {
                if (have_mplock == 0) {
                        get_mplock();
                        have_mplock = 1;
@@ -1173,7 +1181,7 @@ syscall2(frame)
 
        STOPEVENT(p, S_SCE, narg);      /* MP aware */
 
-       error = (*callp->sy_call)(p, args);
+       error = (*callp->sy_call)(args);
 
        /*
         * MP SAFE (we may or may not have the MP lock at this point)
@@ -1232,7 +1240,7 @@ bad:
        have_mplock = userret(p, &frame, sticks, have_mplock);
 
 #ifdef KTRACE
-       if (KTRPOINT(p, KTR_SYSRET)) {
+       if (KTRPOINT(td, KTR_SYSRET)) {
                if (have_mplock == 0) {
                        get_mplock();
                        have_mplock = 1;
@@ -1271,7 +1279,7 @@ fork_return(p, frame)
 
        userret(p, &frame, 0, 1);
 #ifdef KTRACE
-       if (KTRPOINT(p, KTR_SYSRET))
+       if (KTRPOINT(p->p_thread, KTR_SYSRET))
                ktrsysret(p->p_tracep, SYS_fork, 0, 0);
 #endif
 }