$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 #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 */ }