1 /*	$NetBSD: nbcompat.c,v 1.12 2011/07/17 20:54:50 joerg Exp $	*/
2 
3 /* nbcompat.c
4  * Implementations of some FreeBSD functions on NetBSD to make things
5  * a bit smoother.
6  */
7 
8 #include <sys/cdefs.h>
9 __KERNEL_RCSID(0, "$NetBSD: nbcompat.c,v 1.12 2011/07/17 20:54:50 joerg Exp $");
10 
11 #include <sys/param.h>
12 #include <sys/systm.h>
13 #include <sys/kernel.h>
14 #include <sys/kthread.h>
15 #include <sys/proc.h>
16 #include <sys/wait.h>
17 #include <sys/unistd.h>
18 #include <sys/types.h>
19 #include <sys/errno.h>
20 #include <sys/lock.h>
21 #include <sys/bus.h>
22 
23 #include "nbcompat.h"
24 
25 /* note: this is also defined in ntoskrnl_var.h, but I didn't want to include
26  * the whole file here
27  */
28 #define NDIS_KSTACK_PAGES	8
29 
30 struct ndis_resource{
31    bus_space_handle_t res_handle;
32    bus_space_tag_t    res_tag;
33    bus_addr_t         res_base;
34    bus_size_t         res_size;
35 };
36 
37 int
bus_release_resource(device_t dev,int type,int rid,struct ndis_resource * r)38 bus_release_resource(device_t dev, int type, int rid,
39     struct ndis_resource *r)
40 {
41 	switch(type) {
42 	case SYS_RES_IOPORT:
43 		bus_space_unmap(r->res_tag, r->res_handle, r->res_size);
44 		break;
45 	case SYS_RES_MEMORY:
46 		bus_space_unmap(r->res_tag, r->res_handle, r->res_size);
47 		break;
48 	default:
49 		printf("error: bus_release_resource()");
50 	}
51 
52 	return 0;
53 }
54 
55 int
device_is_attached(device_t dev)56 device_is_attached(device_t dev)
57 {
58 	/* Sure, it's attached? */
59 	return TRUE;
60 }
61 
62 /* I took this from sys/kern/kern_kthread.c (in the NetBSD source tree).
63  * The only difference is the kernel stack size
64  */
65 
66 /*
67  * Fork a kernel thread.  Any process can request this to be done.
68  * The VM space and limits, etc. will be shared with proc0.
69  */
70 int
ndis_kthread_create(void (* func)(void *),void * arg,struct proc ** newpp,void * stack,size_t stacksize,const char * name)71 ndis_kthread_create(void (*func)(void *), void *arg,
72   struct proc **newpp, void *stack, size_t stacksize, const char *name)
73 {
74   struct lwp *l;
75   int error;
76 
77   error = kthread_create(PRI_NONE, 0, NULL, func, arg, &l, "%s", name);
78   if (__predict_false(error != 0))
79     return (error);
80 
81   /* All done! */
82   if (newpp != NULL)
83     *newpp = l->l_proc;
84   return (0);
85 }
86