/* $NetBSD: nbcompat.c,v 1.8 2007/12/11 13:22:50 lukem Exp $ */ /* nbcompat.c * Implementations of some FreeBSD functions on NetBSD to make things * a bit smoother. */ #include __KERNEL_RCSID(0, "$NetBSD: nbcompat.c,v 1.8 2007/12/11 13:22:50 lukem Exp $"); #include #include #include #include #include #include #include #include #include #include #include #include #include "nbcompat.h" /* note: this is also defined in ntoskrnl_var.h, but I didn't want to include * the whole file here */ #define NDIS_KSTACK_PAGES 8 struct ndis_resource{ bus_space_handle_t res_handle; bus_space_tag_t res_tag; bus_addr_t res_base; bus_size_t res_size; }; int bus_release_resource(device_t dev, int type, int rid, struct ndis_resource *r) { switch(type) { case SYS_RES_IOPORT: bus_space_unmap(r->res_tag, r->res_handle, r->res_size); break; case SYS_RES_MEMORY: bus_space_unmap(r->res_tag, r->res_handle, r->res_size); break; default: printf("error: bus_release_resource()"); } return 0; } void mtx_lock(struct mtx *mutex) { /* XXXSMP needs doing */ //mutex_enter(mutex); } void mtx_unlock(struct mtx *mutex) { //mutex_exit(mutex); } int device_is_attached(device_t dev) { /* Sure, it's attached? */ return TRUE; } /* I took this from sys/kern/kern_kthread.c (in the NetBSD source tree). * The only difference is the kernel stack size */ /* * Fork a kernel thread. Any process can request this to be done. * The VM space and limits, etc. will be shared with proc0. */ int ndis_kthread_create(void (*func)(void *), void *arg, struct proc **newpp, void *stack, size_t stacksize, const char *fmt, ...) { struct proc *p2; int error; va_list ap; /* First, create the new process. */ error = fork1(&lwp0, FORK_SHAREVM | FORK_SHARECWD | FORK_SHAREFILES | FORK_SHARESIGS, SIGCHLD, stack, stacksize, func, arg, NULL, &p2); if (__predict_false(error != 0)) return (error); /* * Mark it as a system process and not a candidate for * swapping. Set P_NOCLDWAIT so that children are reparented * to init(8) when they exit. init(8) can easily wait them * out for us. */ p2->p_flag |= PK_SYSTEM | PK_NOCLDWAIT; LIST_FIRST(&p2->p_lwps)->l_flag |= LW_INMEM; /* Name it as specified. */ va_start(ap, fmt); vsnprintf(p2->p_comm, MAXCOMLEN, fmt, ap); va_end(ap); /* All done! */ if (newpp != NULL) *newpp = p2; return (0); }