Index: kqemu-freebsd.c
@@ -222,9 +222,17 @@
 int CDECL kqemu_schedule(void)
 {
     /* kqemu_log("kqemu_schedule\n"); */
+#if __FreeBSD_version < 700044
     mtx_lock_spin(&sched_lock);
     mi_switch(SW_VOL, NULL);
     mtx_unlock_spin(&sched_lock);
+#else
+    /* -current no longer uses sched_lock */
+    struct thread *td = curthread;
+    thread_lock(td);
+    mi_switch(SW_VOL, NULL);
+    thread_unlock(td);
+#endif
     return SIGPENDING(curthread);
 }
 #endif
@@ -258,6 +266,10 @@
 static struct clonedevs *kqemuclones;
 static TAILQ_HEAD(,kqemu_instance) kqemuhead = TAILQ_HEAD_INITIALIZER(kqemuhead);
 static eventhandler_tag clonetag;
+#ifndef D_NEEDMINOR
+/* see http://svn.freebsd.org/viewvc/base?view=revision&revision=179726 */
+#define D_NEEDMINOR 0
+#endif
 #endif
 
 static d_close_t kqemu_close;
@@ -282,7 +294,7 @@
 	/* bmaj */	-1
 #else
 	.d_version =	D_VERSION,
-	.d_flags =	D_NEEDGIANT,
+	.d_flags =	D_NEEDGIANT | D_NEEDMINOR,
 	.d_open =	kqemu_open,
 	.d_ioctl =	kqemu_ioctl,
 	.d_close =	kqemu_close,
@@ -334,8 +346,15 @@
 #if __FreeBSD_version >= 500000
     dev->si_drv1 = NULL;
     TAILQ_REMOVE(&kqemuhead, ks, kqemu_ent);
+#if __FreeBSD_version >= 700051
+    destroy_dev_sched(dev);
+#else
+#if __FreeBSD_version >= 700024
+    dev_relthread(dev); 
+#endif
     destroy_dev(dev);
 #endif
+#endif
     free(ks, M_KQEMU);
     --kqemu_ref_count;
 }
@@ -412,6 +431,19 @@
 	ks->state = s;
 	break;
     }
+    case KQEMU_SET_PHYS_MEM: {
+	struct kqemu_phys_mem kphys_mem;
+	if (!s) {
+	    ret = -EIO;
+	    break;
+	}
+	kphys_mem = *(struct kqemu_phys_mem *)addr;
+	ret = kqemu_set_phys_mem(s, &kphys_mem);
+	if (ret != 0) {
+	    ret = -EINVAL;
+	}
+	break;
+    }
     case KQEMU_EXEC: {
 	struct kqemu_cpu_state *ctx;
 	if (s == NULL) {
@@ -514,7 +546,13 @@
 	while ((ks = TAILQ_FIRST(&kqemuhead)) != NULL) {
 	    kqemu_destroy(ks);
 	}
+#if __FreeBSD_version >= 700051
+	drain_dev_clone_events();
+#endif
 	clone_cleanup(&kqemuclones);
+#if __FreeBSD_version >= 700051
+	destroy_dev_drain(&kqemu_cdevsw);
+#endif
 #endif
         kqemu_global_delete(kqemu_gs);
         kqemu_gs = NULL;