xref: /freebsd/sys/compat/linuxkpi/common/include/linux/module.h (revision 1f4fbcf342f41fecc8dff4e0d9a1f9bdb1cdf784)
1 /*-
2  * Copyright (c) 2010 Isilon Systems, Inc.
3  * Copyright (c) 2010 iX Systems, Inc.
4  * Copyright (c) 2010 Panasas, Inc.
5  * Copyright (c) 2013, 2014 Mellanox Technologies, Ltd.
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice unmodified, this list of conditions, and the following
13  *    disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29 #ifndef	_LINUXKPI_LINUX_MODULE_H_
30 #define	_LINUXKPI_LINUX_MODULE_H_
31 
32 #include <sys/types.h>
33 #include <sys/param.h>
34 #include <sys/module.h>
35 #include <sys/queue.h>
36 #include <sys/linker.h>
37 
38 #include <linux/list.h>
39 #include <linux/compiler.h>
40 #include <linux/stringify.h>
41 #include <linux/kmod.h>
42 #include <linux/kobject.h>
43 #include <linux/sysfs.h>
44 #include <linux/moduleparam.h>
45 #include <linux/slab.h>
46 #include <linux/export.h>
47 
48 #define MODULE_AUTHOR(name)
49 #define MODULE_DESCRIPTION(name)
50 #define MODULE_LICENSE(name)
51 #define	MODULE_INFO(tag, info)
52 #define	MODULE_FIRMWARE(firmware)
53 #define	MODULE_SUPPORTED_DEVICE(name)
54 #define	MODULE_IMPORT_NS(_name)
55 
56 /* Linux has an empty element at the end of the ID table -> nitems() - 1. */
57 #define	MODULE_DEVICE_TABLE(_bus, _table)				\
58 									\
59 static device_method_t _ ## _bus ## _ ## _table ## _methods[] = {	\
60 	DEVMETHOD_END							\
61 };									\
62 									\
63 static driver_t _ ## _bus ## _ ## _table ## _driver = {			\
64 	"lkpi_" #_bus #_table,						\
65 	_ ## _bus ## _ ## _table ## _methods,				\
66 	0								\
67 };									\
68 									\
69 DRIVER_MODULE(lkpi_ ## _table, _bus, _ ## _bus ## _ ## _table ## _driver,\
70 	0, 0);								\
71 									\
72 MODULE_DEVICE_TABLE_BUS_ ## _bus(_bus, _table)
73 
74 /*
75  * THIS_MODULE is used to differentiate modules on Linux. We currently
76  * completely stub out any Linux struct module usage, but THIS_MODULE is still
77  * used to populate the "owner" fields of various drivers.  Even though we
78  * don't actually dereference these "owner" fields they are still used by
79  * drivers to check if devices/dmabufs/etc come from different modules. For
80  * example, during DRM GEM import some drivers check if the dmabuf's owner
81  * matches the dev's owner. If they match because they are both NULL drivers
82  * may incorrectly think two resources come from the same module.
83  *
84  * To handle this we specify an undefined symbol __this_linker_file, which
85  * will get special treatment from the linker when resolving. This will
86  * populate the usages of __this_linker_file with the linker_file_t of the
87  * module.
88  */
89 #ifdef KLD_MODULE
90 #define	THIS_MODULE	((struct module *)&__this_linker_file)
91 #else
92 #define	THIS_MODULE	((struct module *)0)
93 #endif
94 
95 #define	__MODULE_STRING(x) __stringify(x)
96 
97 /* OFED pre-module initialization */
98 #define	SI_SUB_OFED_PREINIT	(SI_SUB_ROOT_CONF - 2)
99 /* OFED default module initialization */
100 #define	SI_SUB_OFED_MODINIT	(SI_SUB_ROOT_CONF - 1)
101 
102 #include <sys/linker.h>
103 
104 static inline void
105 _module_run(void *arg)
106 {
107 	void (*fn)(void);
108 #ifdef OFED_DEBUG_INIT
109 	char name[1024];
110 	caddr_t pc;
111 	long offset;
112 
113 	pc = (caddr_t)arg;
114 	if (linker_search_symbol_name(pc, name, sizeof(name), &offset) != 0)
115 		printf("Running ??? (%p)\n", pc);
116 	else
117 		printf("Running %s (%p)\n", name, pc);
118 #endif
119 	fn = arg;
120 	fn();
121 }
122 
123 #define	module_init(fn)							\
124 	SYSINIT(fn, SI_SUB_OFED_MODINIT, SI_ORDER_FIRST, _module_run, (fn))
125 
126 #define	module_exit(fn)						\
127 	SYSUNINIT(fn, SI_SUB_OFED_MODINIT, SI_ORDER_SECOND, _module_run, (fn))
128 
129 /*
130  * The following two macros are a workaround for not having a module
131  * load and unload order resolver:
132  */
133 #define	module_init_order(fn, order)					\
134 	SYSINIT(fn, SI_SUB_OFED_MODINIT, (order), _module_run, (fn))
135 
136 #define	module_exit_order(fn, order)				\
137 	SYSUNINIT(fn, SI_SUB_OFED_MODINIT, (order), _module_run, (fn))
138 
139 #define	module_get(module)
140 #define	module_put(module)
141 #define	try_module_get(module)	1
142 
143 #define	postcore_initcall(fn)	module_init(fn)
144 
145 #endif	/* _LINUXKPI_LINUX_MODULE_H_ */
146