$NetBSD: patch-ac,v 1.3 2007/07/31 14:44:03 obache Exp $

--- source/vmmon/netbsd/drv.c.orig	2003-02-16 21:28:36.000000000 +0900
+++ source/vmmon/netbsd/drv.c
@@ -68,6 +68,29 @@
 #include <vm/vm.h>
 #endif
 
+/* use curproc for pre-nathanw-sa world, curlwp post */
+#if __NetBSD_Version__ >= 106130000
+#define CURLWP		curlwp		/* new world order */
+#else
+#define CURLWP		curproc		/* old world order */
+#endif
+
+/* change to pass lwp rather than proc to driver entry points in 1.6V */
+#if __NetBSD_Version__ == 106220000 || __NetBSD_Version__ >= 399001400
+#define ENTRYARG	lwp
+#define LWP2PROC(l)	(l->l_proc)
+#else
+#define ENTRYARG	proc
+#define LWP2PROC(l)	(l)
+#endif
+
+/* dupfd moved from struct proc to struct lwp in 1.6ZA */
+#if __NetBSD_Version__ >= 106270000
+#define DUPFD(p)	(curlwp)->l_dupfd
+#else
+#define DUPFD(p)	(p)->p_dupfd
+#endif
+
 #define FILECODE "F(300)"
 
 #include "x86.h"
@@ -95,13 +118,13 @@
 int vmmon_lkmentry(struct lkm_table *, int, int);
 static int vmmon_handle(struct lkm_table *, int);
 
-static int vmmon_open(dev_t dev, int oflags, int devtype, struct proc *p);
-static int vmmon_close(dev_t dev, int cflags, int devtype, struct proc *p);
+static int vmmon_open(dev_t dev, int oflags, int devtype, struct ENTRYARG *l);
+static int vmmon_close(dev_t dev, int cflags, int devtype, struct ENTRYARG *l);
 static int vmmon_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags,
-		 struct proc *p);
-static int vmmon_poll(dev_t, int, struct proc *);
+		 struct ENTRYARG *l);
+static int vmmon_poll(dev_t, int, struct ENTRYARG *);
 
-static int vmmon_fake_clonedev(dev_t, int, struct proc *);
+static int vmmon_fake_clonedev(dev_t, int, struct ENTRYARG *);
 
 static int vm_create(struct vmmon_softc *, struct vmx86_softc **);
 static struct vmx86_softc * vm_allocate(struct vmmon_softc *);
@@ -163,19 +186,19 @@ vmmon_handle(struct lkm_table *lkmtp, in
 }
 
 static int
-vmmon_open(dev_t dev, int flag, int mode, struct proc *p)
+vmmon_open(dev_t dev, int flag, int mode, struct ENTRYARG *l)
 {
 	struct vmmon_softc *vmmonsc;
 	struct vmx86_softc *vmxsc;
 	int error;
 	VMDriver *vm;
 
-	if (p->p_dupfd >= 0)
+	if (DUPFD(LWP2PROC(l)) >= 0)
 		return ENODEV;
 
-	VMDEBUG("vmmon: %d opened device\n", p->p_pid);
+	VMDEBUG("vmmon: %d opened device\n", LWP2PROC(l)->p_pid);
 
-	if (suser(p->p_ucred, &p->p_acflag) != 0)
+	if (suser(LWP2PROC(l)->p_ucred, &LWP2PROC(l)->p_acflag) != 0)
 		return (EPERM);
 
 	vmmonsc = &vmmon_sc;
@@ -189,15 +212,15 @@ vmmon_open(dev_t dev, int flag, int mode
 	vmmon_refcnt++;
 
 	VMDEBUG("vmmon: pid %d new vm: num %d major %d\n",
-	    p->p_pid, VMNUM(vmxsc->vm_dev), major(vmxsc->vm_dev));
+	    LWP2PROC(l)->p_pid, VMNUM(vmxsc->vm_dev), major(vmxsc->vm_dev));
 
-	error = vmmon_fake_clonedev(vmxsc->vm_dev, flag, p);
-	if (error != 0 && p->p_dupfd < 0) {
+	error = vmmon_fake_clonedev(vmxsc->vm_dev, flag, l);
+	if (error != 0 && DUPFD(LWP2PROC(l)) < 0) {
 		vm_destroy(vmmonsc, VMNUM(vmxsc->vm_dev));
 		return error;
 	}
 
-	vm = Vmx86_Init((void *)vmxsc, (void *)(p->p_pid));
+	vm = Vmx86_Init((void *)vmxsc, (void *)(LWP2PROC(l)->p_pid));
 	if (vm == NULL) {
 		vm_destroy(vmmonsc, VMNUM(vmxsc->vm_dev));
 		error = ENOMEM;
@@ -211,13 +234,13 @@ vmmon_open(dev_t dev, int flag, int mode
 
 
 static int
-vmmon_close(dev_t dev, int flags, int mode, struct proc *p)
+vmmon_close(dev_t dev, int flags, int mode, struct ENTRYARG *l)
 {
 	int num;
 	struct vmmon_softc *sc;
 	struct vmx86_softc *vmxsc;
 
-	VMDEBUG("vmmon: close vm %d by pid %d\n", VMNUM(dev), p->p_pid);
+	VMDEBUG("vmmon: close vm %d by pid %d\n", VMNUM(dev), LWP2PROC(l)->p_pid);
 
 	sc = &vmmon_sc;
 
@@ -240,7 +263,7 @@ vmmon_close(dev_t dev, int flags, int mo
 		printf("vmmon: refcnt < 0 ??\n");
 	}
 
-	VMDEBUG("vmmon: vm %d closed by %d\n", num, p->p_pid);
+	VMDEBUG("vmmon: vm %d closed by %d\n", num, LWP2PROC(l)->p_pid);
 
 	return (0);
 }
@@ -250,7 +273,7 @@ vmmon_close(dev_t dev, int flags, int mo
  * XXXX - poor man's device cloning.
  */
 int
-vmmon_fake_clonedev(dev_t dev, int flag, struct proc *p)
+vmmon_fake_clonedev(dev_t dev, int flag, struct ENTRYARG *l)
 {
 	struct file *fp;
 	int error, fd;
@@ -260,7 +283,7 @@ vmmon_fake_clonedev(dev_t dev, int flag,
 		/* XXX */
 		return EINVAL;
 
-	error = falloc(p, &fp, &fd);
+	error = falloc(LWP2PROC(l), &fp, &fd);
 	if (error != 0)
 		return error;
 	error = cdevvp(dev, &vp);
@@ -279,9 +302,9 @@ vmmon_fake_clonedev(dev_t dev, int flag,
 	FILE_SET_MATURE(fp);
 #endif
 #endif
-	FILE_UNUSE(fp, p);
+	FILE_UNUSE(fp, l);
 
-	p->p_dupfd = fd;
+	DUPFD(LWP2PROC(l)) = fd;
 
 	return ENXIO;
 }
@@ -292,7 +315,7 @@ vmmon_fake_clonedev(dev_t dev, int flag,
  * set syscall return values for the benefit of Linux emulation.
  */
 static int
-vmmon_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
+vmmon_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct ENTRYARG *l)
 {
 	struct vmx86_softc *vmxsc;
 	struct vmmon_softc *sc;
@@ -307,7 +330,7 @@ vmmon_ioctl(dev_t dev, u_long cmd, caddr
 	VMDriver *vm;
 
 	VMDEBUG("vmmon: ioctl %lx on vm %d by pid %d\n",
-	    cmd, VMNUM(dev), p->p_pid);
+	    cmd, VMNUM(dev), LWP2PROC(l)->p_pid);
 
 	sc = &vmmon_sc;
 
@@ -469,7 +492,7 @@ vm_select_timo(void *arg)
 
 
 static int
-vmmon_poll(dev_t dev, int events, struct proc *p)
+vmmon_poll(dev_t dev, int events, struct ENTRYARG *l)
 {
 	struct vmmon_softc *sc;
 	struct vmx86_softc *vmxsc;
@@ -484,7 +507,7 @@ vmmon_poll(dev_t dev, int events, struct
 		return ENXIO;
 
 	VMDEBUG("vmmon: poll on vm %d by pid %d\n",
-	    VMNUM(dev), p->p_pid);
+	    VMNUM(dev), LWP2PROC(l)->p_pid);
 
 	s = splsoftclock();
 	if (vmxsc->vm_flags & VMFL_SELTIMO) {
@@ -493,7 +516,7 @@ vmmon_poll(dev_t dev, int events, struct
 	} else {
 		if (vmxsc->vm_flags & VMFL_SELWAIT)
 			callout_stop(&vmxsc->vm_callout);
-		selrecord(p, &vmxsc->vm_rsel);
+		selrecord(l, &vmxsc->vm_rsel);
 		vmxsc->vm_flags |= VMFL_SELWAIT;
 		callout_reset(&vmxsc->vm_callout, 1, vm_select_timo, vmxsc);
 	}
@@ -673,6 +696,6 @@ Panic(char *fmt, ...)
 		vWarning(vm);
 	}
   
-	exit1(curproc, 0);
+	exit1(CURLWP, 0);
 	/* NOTREACHED */
 }
