MP Implementation 2/4: Implement a poor-man's IPI messaging subsystem,
[dragonfly.git] / sys / i386 / i386 / vm86.c
index 105d7d7..4bfde76 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/i386/i386/vm86.c,v 1.31.2.2 2001/10/05 06:18:55 peter Exp $
- * $DragonFly: src/sys/i386/i386/Attic/vm86.c,v 1.3 2003/06/18 18:29:55 dillon Exp $
+ * $DragonFly: src/sys/i386/i386/Attic/vm86.c,v 1.7 2003/07/08 06:27:26 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -39,6 +39,7 @@
 #include <vm/vm_page.h>
 
 #include <sys/user.h>
+#include <sys/thread2.h>
 
 #include <machine/md_var.h>
 #include <machine/pcb_ext.h>   /* pcb.h included via sys/user.h */
@@ -544,6 +545,9 @@ vm86_prepcall(struct vm86frame vmf)
 /*
  * vm86 trap handler; determines whether routine succeeded or not.
  * Called while in vm86 space, returns to calling process.
+ *
+ * A MP lock ref is held on entry from trap() and must be released prior
+ * to returning to the VM86 call.
  */
 void
 vm86_trap(struct vm86frame *vmf)
@@ -560,17 +564,25 @@ vm86_trap(struct vm86frame *vmf)
        else
                vmf->vmf_trapno = vmf->vmf_trapno << 16;
 
+       rel_mplock();
        vm86_biosret(vmf);
 }
 
 int
 vm86_intcall(int intnum, struct vm86frame *vmf)
 {
+       int error;
+
        if (intnum < 0 || intnum > 0xff)
                return (EINVAL);
 
+       crit_enter();
+       ASSERT_MP_LOCK_HELD();
+
        vmf->vmf_trapno = intnum;
-       return (vm86_bioscall(vmf));
+       error = vm86_bioscall(vmf);
+       crit_exit();
+       return(error);
 }
 
 /*
@@ -589,6 +601,9 @@ vm86_datacall(intnum, vmf, vmc)
        u_int page;
        int i, entry, retval;
 
+       crit_enter();
+       ASSERT_MP_LOCK_HELD();
+
        for (i = 0; i < vmc->npages; i++) {
                page = vtophys(vmc->pmap[i].kva & PG_FRAME);
                entry = vmc->pmap[i].pte_num; 
@@ -603,7 +618,7 @@ vm86_datacall(intnum, vmf, vmc)
                entry = vmc->pmap[i].pte_num;
                pte[entry] = vmc->pmap[i].old_pte;
        }
-
+       crit_exit();
        return (retval);
 }
 
@@ -645,9 +660,7 @@ vm86_getptr(vmc, kva, sel, off)
 }
        
 int
-vm86_sysarch(p, args)
-       struct proc *p;
-       char *args;
+vm86_sysarch(struct proc *p, char *args)
 {
        int error = 0;
        struct i386_vm86_args ua;
@@ -705,7 +718,7 @@ vm86_sysarch(p, args)
        case VM86_INTCALL: {
                struct vm86_intcall_args sa;
 
-               if ((error = suser(p)))
+               if ((error = suser_cred(p->p_ucred, 0)))
                        return (error);
                if ((error = copyin(ua.sub_args, &sa, sizeof(sa))))
                        return (error);