root / lab4 / .minix-src / include / sys / module.h @ 13
History | View | Annotate | Download (6.91 KB)
1 |
/* $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_ */ |