root / lab4 / .minix-src / include / sys / module.h @ 13
History | View | Annotate | Download (6.91 KB)
1 | 13 | up20180614 | /* $NetBSD: module.h,v 1.38 2015/06/22 16:35:13 matt Exp $ */
|
---|---|---|---|
2 | |||
3 | /*-
|
||
4 | * Copyright (c) 2008 The NetBSD Foundation, Inc.
|
||
5 | * All rights reserved.
|
||
6 | *
|
||
7 | * Redistribution and use in source and binary forms, with or without
|
||
8 | * modification, are permitted provided that the following conditions
|
||
9 | * are met:
|
||
10 | * 1. Redistributions of source code must retain the above copyright
|
||
11 | * notice, this list of conditions and the following disclaimer.
|
||
12 | * 2. Redistributions in binary form must reproduce the above copyright
|
||
13 | * notice, this list of conditions and the following disclaimer in the
|
||
14 | * documentation and/or other materials provided with the distribution.
|
||
15 | *
|
||
16 | * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
||
17 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||
18 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||
19 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
||
20 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||
25 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||
26 | * POSSIBILITY OF SUCH DAMAGE.
|
||
27 | */
|
||
28 | |||
29 | #ifndef _SYS_MODULE_H_
|
||
30 | #define _SYS_MODULE_H_
|
||
31 | |||
32 | #include <sys/types.h> |
||
33 | #include <sys/param.h> |
||
34 | #include <sys/cdefs.h> |
||
35 | #include <sys/queue.h> |
||
36 | #include <sys/uio.h> |
||
37 | |||
38 | #define MAXMODNAME 32 |
||
39 | #define MAXMODDEPS 10 |
||
40 | |||
41 | /* Module classes, provided only for system boot and cosmetic purposes. */
|
||
42 | typedef enum modclass { |
||
43 | MODULE_CLASS_ANY, |
||
44 | MODULE_CLASS_MISC, |
||
45 | MODULE_CLASS_VFS, |
||
46 | MODULE_CLASS_DRIVER, |
||
47 | MODULE_CLASS_EXEC, |
||
48 | MODULE_CLASS_SECMODEL |
||
49 | } modclass_t; |
||
50 | |||
51 | /* Module sources: where did it come from? */
|
||
52 | typedef enum modsrc { |
||
53 | MODULE_SOURCE_KERNEL, |
||
54 | MODULE_SOURCE_BOOT, |
||
55 | MODULE_SOURCE_FILESYS |
||
56 | } modsrc_t; |
||
57 | |||
58 | /* Commands passed to module control routine. */
|
||
59 | typedef enum modcmd { |
||
60 | MODULE_CMD_INIT, /* mandatory */
|
||
61 | MODULE_CMD_FINI, /* mandatory */
|
||
62 | MODULE_CMD_STAT, /* optional */
|
||
63 | MODULE_CMD_AUTOUNLOAD, /* optional */
|
||
64 | } modcmd_t; |
||
65 | |||
66 | #ifdef _KERNEL
|
||
67 | |||
68 | #include <sys/mutex.h> |
||
69 | |||
70 | #include <prop/proplib.h> |
||
71 | |||
72 | /* Module header structure. */
|
||
73 | typedef struct modinfo { |
||
74 | u_int mi_version; |
||
75 | modclass_t mi_class; |
||
76 | int (*mi_modcmd)(modcmd_t, void *); |
||
77 | const char *mi_name; |
||
78 | const char *mi_required; |
||
79 | } const modinfo_t;
|
||
80 | |||
81 | /* Per module information, maintained by kern_module.c */
|
||
82 | typedef struct module { |
||
83 | u_int mod_refcnt; |
||
84 | const modinfo_t *mod_info;
|
||
85 | struct kobj *mod_kobj;
|
||
86 | TAILQ_ENTRY(module) mod_chain; |
||
87 | struct module *mod_required[MAXMODDEPS];
|
||
88 | u_int mod_nrequired; |
||
89 | modsrc_t mod_source; |
||
90 | time_t mod_autotime; |
||
91 | void *mod_ctf;
|
||
92 | u_int mod_fbtentries; /* DTrace FBT entry count */
|
||
93 | int mod_flags;
|
||
94 | #define MODFLG_MUST_FORCE 0x01 |
||
95 | #define MODFLG_AUTO_LOADED 0x02 |
||
96 | |||
97 | } module_t; |
||
98 | |||
99 | /*
|
||
100 | * Per-module linkage. Loadable modules have a `link_set_modules' section
|
||
101 | * containing only one entry, pointing to the module's modinfo_t record.
|
||
102 | * For the kernel, `link_set_modules' can contain multiple entries and
|
||
103 | * records all modules built into the kernel at link time.
|
||
104 | *
|
||
105 | * Alternatively, in some environments rump kernels use
|
||
106 | * __attribute__((constructor)) due to link sets being
|
||
107 | * difficult (impossible?) to implement (e.g. GNU gold, OS X, etc.)
|
||
108 | */
|
||
109 | |||
110 | #ifdef RUMP_USE_CTOR
|
||
111 | struct modinfo_chain {
|
||
112 | const struct modinfo *mc_info; |
||
113 | LIST_ENTRY(modinfo_chain) mc_entries; |
||
114 | }; |
||
115 | LIST_HEAD(modinfo_boot_chain, modinfo_chain); |
||
116 | #define _MODULE_REGISTER(name) \
|
||
117 | static void __CONCAT(modctor_,name)(void) __attribute__((__constructor__));\ |
||
118 | static void __CONCAT(modctor_,name)(void) \ |
||
119 | { \ |
||
120 | static struct modinfo_chain mc = { \ |
||
121 | .mc_info = &__CONCAT(name,_modinfo), \ |
||
122 | }; \ |
||
123 | extern struct modinfo_boot_chain modinfo_boot_chain; \ |
||
124 | LIST_INSERT_HEAD(&modinfo_boot_chain, &mc, mc_entries); \ |
||
125 | } |
||
126 | |||
127 | #else /* RUMP_USE_CTOR */ |
||
128 | |||
129 | #define _MODULE_REGISTER(name) __link_set_add_rodata(modules, __CONCAT(name,_modinfo));
|
||
130 | |||
131 | #endif /* RUMP_USE_CTOR */ |
||
132 | |||
133 | #define MODULE(class, name, required) \
|
||
134 | static int __CONCAT(name,_modcmd)(modcmd_t, void *); \ |
||
135 | static const modinfo_t __CONCAT(name,_modinfo) = { \ |
||
136 | .mi_version = __NetBSD_Version__, \ |
||
137 | .mi_class = (class), \ |
||
138 | .mi_modcmd = __CONCAT(name,_modcmd), \ |
||
139 | .mi_name = __STRING(name), \ |
||
140 | .mi_required = (required) \ |
||
141 | }; \ |
||
142 | _MODULE_REGISTER(name) |
||
143 | |||
144 | TAILQ_HEAD(modlist, module); |
||
145 | |||
146 | extern struct vm_map *module_map; |
||
147 | extern u_int module_count;
|
||
148 | extern u_int module_builtinlist;
|
||
149 | extern struct modlist module_list; |
||
150 | extern struct modlist module_builtins; |
||
151 | extern u_int module_gen;
|
||
152 | |||
153 | void module_init(void); |
||
154 | void module_start_unload_thread(void); |
||
155 | void module_builtin_require_force(void); |
||
156 | void module_init_md(void); |
||
157 | void module_init_class(modclass_t);
|
||
158 | int module_prime(const char *, void *, size_t); |
||
159 | |||
160 | bool module_compatible(int, int); |
||
161 | int module_load(const char *, int, prop_dictionary_t, modclass_t); |
||
162 | int module_builtin_add(modinfo_t * const *, size_t, bool); |
||
163 | int module_builtin_remove(modinfo_t *, bool); |
||
164 | int module_autoload(const char *, modclass_t); |
||
165 | int module_unload(const char *); |
||
166 | int module_hold(const char *); |
||
167 | void module_rele(const char *); |
||
168 | int module_find_section(const char *, void **, size_t *); |
||
169 | void module_thread_kick(void); |
||
170 | void module_load_vfs_init(void); |
||
171 | |||
172 | void module_whatis(uintptr_t, void (*)(const char *, ...) |
||
173 | __printflike(1, 2)); |
||
174 | void module_print_list(void (*)(const char *, ...) __printflike(1, 2)); |
||
175 | |||
176 | #ifdef _MODULE_INTERNAL
|
||
177 | extern
|
||
178 | int (*module_load_vfs_vec)(const char *, int, bool, module_t *, |
||
179 | prop_dictionary_t *); |
||
180 | int module_load_vfs(const char *, int, bool, module_t *, |
||
181 | prop_dictionary_t *); |
||
182 | void module_error(const char *, ...) __printflike(1, 2); |
||
183 | void module_print(const char *, ...) __printflike(1, 2); |
||
184 | #endif /* _MODULE_INTERNAL */ |
||
185 | |||
186 | #define MODULE_BASE_SIZE 64 |
||
187 | extern char module_base[MODULE_BASE_SIZE]; |
||
188 | extern const char *module_machine; |
||
189 | |||
190 | #else /* _KERNEL */ |
||
191 | |||
192 | #include <stdint.h> |
||
193 | |||
194 | #endif /* _KERNEL */ |
||
195 | |||
196 | typedef struct modctl_load { |
||
197 | const char *ml_filename; |
||
198 | |||
199 | #define MODCTL_NO_PROP 0x2 |
||
200 | #define MODCTL_LOAD_FORCE 0x1 |
||
201 | int ml_flags;
|
||
202 | |||
203 | const char *ml_props; |
||
204 | size_t ml_propslen; |
||
205 | } modctl_load_t; |
||
206 | |||
207 | typedef enum modctl { |
||
208 | MODCTL_LOAD, /* modctl_load_t *ml */
|
||
209 | MODCTL_UNLOAD, /* char *name */
|
||
210 | MODCTL_STAT, /* struct iovec *buffer */
|
||
211 | MODCTL_EXISTS /* enum: 0: load, 1: autoload */
|
||
212 | } modctl_t; |
||
213 | |||
214 | /*
|
||
215 | * This structure intentionally has the same layout for 32 and 64
|
||
216 | * bit builds.
|
||
217 | */
|
||
218 | typedef struct modstat { |
||
219 | char ms_name[MAXMODNAME];
|
||
220 | char ms_required[MAXMODNAME * MAXMODDEPS];
|
||
221 | uint64_t ms_addr; |
||
222 | modsrc_t ms_source; |
||
223 | modclass_t ms_class; |
||
224 | u_int ms_size; |
||
225 | u_int ms_refcnt; |
||
226 | u_int ms_reserved[4];
|
||
227 | } modstat_t; |
||
228 | |||
229 | int modctl(int, void *); |
||
230 | |||
231 | #ifdef _KERNEL
|
||
232 | /* attention: pointers passed are userland pointers!,
|
||
233 | see modctl_load_t */
|
||
234 | int handle_modctl_load(const char *, int, const char *, size_t); |
||
235 | #endif
|
||
236 | |||
237 | #endif /* !_SYS_MODULE_H_ */ |