TODO revision 1.22 1 1.5 uebayasi o Call module as module.
2 1.5 uebayasi
3 1.5 uebayasi Until now, everything is called as attribute. Separate module from it:
4 1.5 uebayasi
5 1.5 uebayasi - Module is a collection of code (*.[cSo]), and provides a function.
6 1.5 uebayasi Module can depend on other modules.
7 1.5 uebayasi
8 1.5 uebayasi - Attribute provides metadata for modules. One module can have
9 1.5 uebayasi multiple attributes. Attribute doesn't generate a module (*.o,
10 1.5 uebayasi *.ko).
11 1.5 uebayasi
12 1.1 uebayasi o Emit everything (ioconf.*, Makefile, ...) per-attribute.
13 1.1 uebayasi
14 1.9 uebayasi config(9) related metadata (cfdriver, cfattach, cfdata, ...) should be
15 1.9 uebayasi collected using linker. Create ELF sections like
16 1.9 uebayasi .{rodata,data}.config.{cfdriver,cfattach,cfdata}. Provide reference
17 1.9 uebayasi symbols (e.g. cfdriverinit[]) using linker script. Sort entries by name
18 1.9 uebayasi to lookup entries by binary search in kernel.
19 1.9 uebayasi
20 1.1 uebayasi o Generate modular(9) related information. Especially module dependency.
21 1.1 uebayasi
22 1.9 uebayasi At this moment modular(9) modules hardcode dependency in *.c using the
23 1.9 uebayasi MODULE() macro:
24 1.9 uebayasi
25 1.9 uebayasi MODULE(MODULE_CLASS_DRIVER, hdaudio, "pci");
26 1.9 uebayasi
27 1.9 uebayasi This information already exists in config(5) definitions (files.*).
28 1.9 uebayasi Extend config(5) to be able to specify module's class.
29 1.9 uebayasi
30 1.9 uebayasi Ideally these module metadata are kept somewhere in ELF headers, so that
31 1.9 uebayasi loaders (e.g. boot(8)) can easily read. One idea is to abuse DYNAMIC
32 1.9 uebayasi sections to record dependency, as shared library does. (Feasibility
33 1.9 uebayasi unknown.)
34 1.9 uebayasi
35 1.1 uebayasi o Rename "interface attribute" to "bus".
36 1.1 uebayasi
37 1.1 uebayasi Instead of
38 1.1 uebayasi
39 1.1 uebayasi define audiobus {}
40 1.1 uebayasi attach audio at audiobus
41 1.1 uebayasi
42 1.1 uebayasi Do like this
43 1.1 uebayasi
44 1.1 uebayasi defbus audiobus {}
45 1.1 uebayasi attach audio at audiobus
46 1.1 uebayasi
47 1.15 uebayasi Always provide xxxbusprint() (and xxxbussubmatch if multiple children).
48 1.15 uebayasi Extend struct cfiattrdata like:
49 1.15 uebayasi
50 1.15 uebayasi struct cfiattrdata {
51 1.15 uebayasi const char *ci_name;
52 1.15 uebayasi cfprint_t ci_print;
53 1.15 uebayasi cfsubmatch_t ci_submatch;
54 1.15 uebayasi int ci_loclen;
55 1.15 uebayasi const struct cflocdesc ci_locdesc[];
56 1.15 uebayasi };
57 1.15 uebayasi
58 1.15 uebayasi o Simplify child configuration API
59 1.15 uebayasi
60 1.15 uebayasi With said struct cfiattrdata extension, config_found*() can omit
61 1.15 uebayasi print/submatch args. If the found child is known (e.g., "pcibus" creating
62 1.15 uebayasi "pci"):
63 1.15 uebayasi
64 1.16 uebayasi config_found(self, "pcibus");
65 1.15 uebayasi
66 1.15 uebayasi If finding unknown children (e.g. "pci" finding pci devices):
67 1.15 uebayasi
68 1.15 uebayasi config_find(self, "pci", locs, aux);
69 1.15 uebayasi
70 1.8 uebayasi o Retire "attach foo at bar with foo_bar.c"
71 1.8 uebayasi
72 1.8 uebayasi Most of these should be rewritten by defining a common interface attribute
73 1.8 uebayasi "foobus", instead of writing multiple attachments. com(4), ld(4), ehci(4)
74 1.8 uebayasi are typical examples. For ehci(4), EHCI-capable controller drivers implement
75 1.8 uebayasi "ehcibus" interface, like:
76 1.8 uebayasi
77 1.8 uebayasi defne ehcibus {}
78 1.8 uebayasi device imxehci: ehcibus
79 1.8 uebayasi
80 1.8 uebayasi These drivers' attach functions call config_found() to attach ehci(4) via
81 1.8 uebayasi the "ehcibus" interface attribute, instead of calling ehci_init() directly.
82 1.8 uebayasi Same for com(4) (com_attach_subr()) and ld(4) (ldattach()).
83 1.8 uebayasi
84 1.1 uebayasi o Sort objects in more reasonable order.
85 1.1 uebayasi
86 1.1 uebayasi Put machdep.ko in the lowest address. uvm.ko and kern.ko follow.
87 1.1 uebayasi
88 1.1 uebayasi Kill alphabetical sort (${OBJS:O} in sys/conf/Makefile.inc.kern.
89 1.1 uebayasi
90 1.1 uebayasi Use ldscript. Do like this
91 1.1 uebayasi
92 1.1 uebayasi .text :
93 1.1 uebayasi AT (ADDR(.text) & 0x0fffffff)
94 1.1 uebayasi {
95 1.1 uebayasi *(.text.machdep.locore.entry)
96 1.1 uebayasi *(.text.machdep.locore)
97 1.1 uebayasi *(.text.machdep)
98 1.1 uebayasi *(.text)
99 1.1 uebayasi *(.text.*)
100 1.1 uebayasi :
101 1.1 uebayasi
102 1.1 uebayasi Kill linker definitions in sys/conf/Makefile.inc.kern.
103 1.2 uebayasi
104 1.3 wiz o Differentiate "options" and "flags"/"params".
105 1.2 uebayasi
106 1.3 wiz "options" enables features by adding *.c files (via attributes).
107 1.2 uebayasi
108 1.2 uebayasi "flags" and "params" are to change contents of *.c files. These don't add
109 1.3 wiz *.c files to the result kernel, or don't build attributes (modules).
110 1.2 uebayasi
111 1.2 uebayasi o Make flags/params per attributes (modules).
112 1.2 uebayasi
113 1.2 uebayasi Basically flags and params are cpp(1) #define's generated in opt_*.h. Make
114 1.2 uebayasi them local to one attributes (modules). Flags/params which affects files
115 1.2 uebayasi across attributes (modules) are possible, but should be discouraged.
116 1.2 uebayasi
117 1.2 uebayasi o Generate things only by definitions.
118 1.2 uebayasi
119 1.2 uebayasi In the ideal dynamically modular world, "selection" will be done not at
120 1.2 uebayasi compile time but at runtime. Users select their wanted modules, by
121 1.2 uebayasi dynamically loading them.
122 1.2 uebayasi
123 1.2 uebayasi This means that the system provides all choices; that is, build all modules
124 1.2 uebayasi in the source tree. Necessary information is defined in the "definition"
125 1.2 uebayasi part.
126 1.2 uebayasi
127 1.2 uebayasi o Split cfdata.
128 1.2 uebayasi
129 1.8 uebayasi cfdata is a set of pattern matching rules to enable devices at runtime device
130 1.3 wiz auto-configuration. It is pure data and can (should) be generated separately
131 1.2 uebayasi from the code.
132 1.4 apb
133 1.4 apb o Allow easier adding and removing of options.
134 1.4 apb
135 1.4 apb It should be possible to add or remove options, flags, etc.,
136 1.4 apb without regard to whether or not they are already defined.
137 1.4 apb For example, a configuration like this:
138 1.4 apb
139 1.4 apb include GENERIC
140 1.4 apb options FOO
141 1.4 apb no options BAR
142 1.4 apb
143 1.4 apb should work regardless of whether or not options FOO and/or
144 1.4 apb options BAR were defined in GENERIC. It should not give
145 1.4 apb errors like "options BAR was already defined" or "options FOO
146 1.4 apb was not defined".
147 1.4 apb
148 1.5 uebayasi o Introduce "class".
149 1.5 uebayasi
150 1.7 wiz Every module should be classified as at least one class, as modular(9)
151 1.7 wiz modules already do. For example, file systems are marked as "vfs", network
152 1.5 uebayasi protocols are "netproto".
153 1.5 uebayasi
154 1.5 uebayasi Consider to merge "devclass" into "class".
155 1.5 uebayasi
156 1.5 uebayasi For syntax clarity, class names could be used as a keyword to select the
157 1.5 uebayasi class's instance module:
158 1.5 uebayasi
159 1.5 uebayasi # Define net80211 module as netproto class
160 1.5 uebayasi class netproto
161 1.5 uebayasi define net80211: netproto
162 1.5 uebayasi
163 1.5 uebayasi # Select net80211 to be builtin
164 1.5 uebayasi netproto net80211
165 1.5 uebayasi
166 1.5 uebayasi Accordingly device/attach selection syntax should be revisited.
167 1.5 uebayasi
168 1.6 uebayasi o Support kernel constructor/destructor (.kctors/.kdtors)
169 1.5 uebayasi
170 1.5 uebayasi Initialization and finalization should be called via constructors and
171 1.5 uebayasi destructors. Don't hardcode those sequences as sys/kern/init_main.c:main()
172 1.5 uebayasi does.
173 1.5 uebayasi
174 1.6 uebayasi The order of .kctors/.kdtors is resolved by dependency. The difference from
175 1.5 uebayasi userland is that in kernel depended ones are located in lower addresses;
176 1.5 uebayasi "machdep" module is the lowest. Thus the lowest entry in .ctors must be
177 1.5 uebayasi executed the first.
178 1.5 uebayasi
179 1.6 uebayasi The .kctors/.kdtors entries are executed by kernel's main() function, unlike
180 1.6 uebayasi userland where start code executes .ctors/.dtors before main(). The hardcoded
181 1.6 uebayasi sequence of various subsystem initializations in init_main.c:main() will be
182 1.7 wiz replaced by an array of .kctors invocations, and #ifdef's there will be gone.
183 1.6 uebayasi
184 1.12 uebayasi o Hide link-set in the final kernel.
185 1.5 uebayasi
186 1.12 uebayasi Link-set is used to collect references (pointers) at link time. It relys on
187 1.12 uebayasi the ld(1) behavior that it automatically generates `__start_X' and `__stop_X'
188 1.12 uebayasi symbols for the section `X' to reduce coding.
189 1.12 uebayasi
190 1.12 uebayasi Don't allow kernel subsystems create random ELF sections.
191 1.12 uebayasi
192 1.12 uebayasi Pre-define all the available link-set names and pre-generate a linker script
193 1.12 uebayasi to merge them into .rodata.
194 1.12 uebayasi
195 1.12 uebayasi (For modular(9) modules, `link_set_modules' is looked up by kernel loader.
196 1.12 uebayasi Provide only it.)
197 1.12 uebayasi
198 1.12 uebayasi Provide a way for 3rd party modules to declare extra link-set.
199 1.6 uebayasi
200 1.6 uebayasi o Shared kernel objects.
201 1.6 uebayasi
202 1.7 wiz Since NetBSD has not established a clear kernel ABI, every single kernel
203 1.6 uebayasi has to build all the objects by their own. As a result, similar kernels
204 1.6 uebayasi (e.g. evbarm kernels) repeatedly compile similar objects, that is waste of
205 1.6 uebayasi energy & space.
206 1.6 uebayasi
207 1.6 uebayasi Share them if possible. For evb* ports, ideally everything except machdep.ko
208 1.6 uebayasi should be shared.
209 1.6 uebayasi
210 1.6 uebayasi While leaving optimizations as options (CPU specific optimizations, inlined
211 1.6 uebayasi bus_space(9) operations, etc.) for users, the official binaries build
212 1.6 uebayasi provided by TNF should be as portable as possible.
213 1.10 uebayasi
214 1.10 uebayasi o Control ELF sections using linker script.
215 1.10 uebayasi
216 1.10 uebayasi Now kernel is linked and built directly from object files (*.o). Each port
217 1.10 uebayasi has an MD linker script, which does everything needed to be done at link
218 1.10 uebayasi time. As a result, they do from MI alignment restriction (read_mostly,
219 1.10 uebayasi cacheline_aligned) to load address specification for external boot loaders.
220 1.10 uebayasi
221 1.10 uebayasi Make this into multiple stages to make linkage more structural. Especially,
222 1.11 uebayasi reserve the final link for purely MD purpose. Note that in modular build,
223 1.11 uebayasi *.ko are shared between build of kernel and modular(9) modules (*.kmod).
224 1.10 uebayasi
225 1.10 uebayasi Monolithic build:
226 1.10 uebayasi *.o ---> netbsd.ko Generic MI linkage
227 1.10 uebayasi netbsd.ko ---> netbsd.ro Kernel MI linkage
228 1.10 uebayasi netbsd.ro ---> netbsd Kernel MD linkage
229 1.10 uebayasi
230 1.10 uebayasi Modular build (kernel):
231 1.10 uebayasi *.o ---> *.ko Generic + Per-module MI linkage
232 1.10 uebayasi *.ko ---> netbsd.ro Kernel MI linkage
233 1.10 uebayasi netbsd.ro ---> netbsd Kernel MD linkage
234 1.10 uebayasi
235 1.10 uebayasi Modular build (module):
236 1.10 uebayasi *.o ---> *.ko Generic + Per-module MI linkage
237 1.10 uebayasi *.ko ---> *.ro Modular MI linkage
238 1.10 uebayasi *.ro ---> *.kmod Modular MD linkage
239 1.10 uebayasi
240 1.10 uebayasi Genric MI linkage is for processing MI linkage that can be applied generally.
241 1.10 uebayasi Data section alignment (.data.read_mostly and .data.cacheline_aligned) is
242 1.10 uebayasi processed here.
243 1.10 uebayasi
244 1.10 uebayasi Per-module MI linkage is for modules that want some ordering. For example,
245 1.10 uebayasi machdep.ko wants to put entry code at the top of .text and .data.
246 1.10 uebayasi
247 1.10 uebayasi Kernel MI linkage is for collecting kernel global section data, that is what
248 1.10 uebayasi link-set is used for now. Once they are collected and symbols to the ranges
249 1.10 uebayasi are assigned, those sections are merged into the pre-existing sections
250 1.10 uebayasi (.rodata) because link-set sections in "netbsd" will never be interpreted by
251 1.10 uebayasi external loaders.
252 1.10 uebayasi
253 1.10 uebayasi Kernel MD linkage is used purely for MD purposes, that is, how kernels are
254 1.10 uebayasi loaded by external loaders. It might be possible that one kernel relocatable
255 1.10 uebayasi (netbsd.ro) is linked into multiple final kernel image (netbsd) for diferent
256 1.10 uebayasi load addresses.
257 1.10 uebayasi
258 1.11 uebayasi Modular MI linkage is to prepare a module to be loadable as modular(9). This
259 1.11 uebayasi may add some extra sections and/or symbols.
260 1.11 uebayasi
261 1.11 uebayasi Modular MD linkage is again for pure MD purposes like kernel MD linkage.
262 1.11 uebayasi Adjustment and/or optimization may be done.
263 1.11 uebayasi
264 1.11 uebayasi Kernel and modular MI linkages may change behavior depending on existence
265 1.11 uebayasi of debug information. In the future .symtab will be copied using linker
266 1.11 uebayasi during this stage.
267 1.13 uebayasi
268 1.19 uebayasi o Preprocess and generate linker scripts dynamically.
269 1.19 uebayasi
270 1.19 uebayasi Include opt_xxx.h and replace some constant values (e.g. COHERENCY_UNIT,
271 1.19 uebayasi PAGE_SIZE, KERNEL_BASE_PHYS, KERNEL_BASE_VIRT, ...) with cpp(1).
272 1.19 uebayasi
273 1.19 uebayasi Don't unnecessarily define symbols. Don't use sed(1).
274 1.19 uebayasi
275 1.19 uebayasi o Clean up linker scripts.
276 1.19 uebayasi
277 1.19 uebayasi o Don't specify OUTPUT_FORMAT()/OUTPUT_ARCH()
278 1.19 uebayasi
279 1.19 uebayasi These are basically set in compilers/linkers. If non-default ABI is used,
280 1.19 uebayasi command-line arguments should be specified.
281 1.19 uebayasi
282 1.19 uebayasi o Remove .rel/.rela handlings.
283 1.19 uebayasi
284 1.19 uebayasi These are set in relocatable objects, and handled by dynamic linkers.
285 1.19 uebayasi Totally irrelefant for kernels.
286 1.19 uebayasi
287 1.19 uebayasi o Clean up debug section handlings.
288 1.19 uebayasi
289 1.19 uebayasi o Document (section boundary) symbols set in linker scripts.
290 1.19 uebayasi
291 1.19 uebayasi There must be a reason why symbols are defined and exported.
292 1.19 uebayasi
293 1.19 uebayasi PROVIDE() is to define internal symbols.
294 1.19 uebayasi
295 1.19 uebayasi o Clean up load addresses.
296 1.19 uebayasi
297 1.19 uebayasi o Program headers.
298 1.19 uebayasi
299 1.19 uebayasi o According to matt@, .ARM.extab/.ARM.exidx sections are no longer needed.
300 1.19 uebayasi
301 1.13 uebayasi o Redesign swapnetbsd.c (root/swap device specification)
302 1.13 uebayasi
303 1.13 uebayasi Don't build a whole kernel only to specify root/swap devices.
304 1.13 uebayasi
305 1.13 uebayasi Make these parameter re-configurable afterwards.
306 1.14 uebayasi
307 1.14 uebayasi o Namespace.
308 1.14 uebayasi
309 1.14 uebayasi Investigate namespace of attributes/modules/options. Figure out the hidden
310 1.14 uebayasi design about these, document it, then re-design it.
311 1.14 uebayasi
312 1.14 uebayasi At this moment, all of them share the single "selecttab", which means their
313 1.14 uebayasi namespaces are common, but they also have respective tables (attrtab,
314 1.14 uebayasi opttab, etc.).
315 1.14 uebayasi
316 1.14 uebayasi Selecting an option (addoption()), that is also a module name, works only if
317 1.14 uebayasi the module doesn't depend on anything, because addoption() doesn't select
318 1.14 uebayasi module and its dependencies (selectattr()). In other words, an option is
319 1.14 uebayasi only safely converted to a module (define), only if it doesn't depend on
320 1.14 uebayasi anything. (One example is DDB.)
321 1.17 uebayasi
322 1.17 uebayasi o Convert pseudo(dev) attach functions to take (void) (== kernel ctors).
323 1.17 uebayasi
324 1.17 uebayasi The pseudo attach function was originally designed to take `int n' as
325 1.17 uebayasi the number of instances of the pseudo device. Now most of pseudo
326 1.17 uebayasi devices have been converted to be `cloneable', meaning that their
327 1.17 uebayasi instances are dynamically allocated at run-time, because guessing how
328 1.17 uebayasi much instances are needed for users at compile time is almost impossible.
329 1.17 uebayasi Restricting such a pure software resource at compile time is senseless,
330 1.17 uebayasi considering that the rest of the world is dynamic.
331 1.17 uebayasi
332 1.17 uebayasi If pseudo attach functions once become (void), config(1) no longer
333 1.17 uebayasi has to generate iteration to call those functions, by making them part
334 1.17 uebayasi of kernel constructors, that are a list of (void) functions.
335 1.17 uebayasi
336 1.17 uebayasi Some pseudo devices may have dependency/ordering problems, because
337 1.17 uebayasi pseudo attach functions have no choice when to be called. This could
338 1.17 uebayasi be solved by converting to kctors, where functions are called in order
339 1.17 uebayasi by dependency.
340 1.18 pgoyette
341 1.18 pgoyette o Enhance ioconf behavior for pseudo-devices
342 1.18 pgoyette
343 1.18 pgoyette See "bin/48571: config(1) ioconf is insufficient for pseudo-devices" for
344 1.18 pgoyette more details. In a nutshell, it would be "useful" for config to emit
345 1.18 pgoyette the necessary stuff in the generated ioconf.[ch] to enable use of
346 1.18 pgoyette config_{init,fini}_component() for attaching and detaching pseudodev's.
347 1.18 pgoyette
348 1.18 pgoyette Currently, you need to manually construct your own data structures, and
349 1.18 pgoyette manually "attach" them, one at a time. This leads to duplication of
350 1.18 pgoyette code (where multiple drivers contain the same basic logic), and doesn't
351 1.18 pgoyette necessarily handle all of the "frobbing" of the kernel lists.
352 1.20 uebayasi
353 1.20 uebayasi o Disallow unknown options.
354 1.20 uebayasi
355 1.20 uebayasi Don't accept options that are not defined as either defflag or defparam.
356 1.20 uebayasi Report them and exit. Don't set ${IDENT} in the generated Makefile.
357 1.20 uebayasi
358 1.21 uebayasi o Kill makeoptions.
359 1.21 uebayasi
360 1.21 uebayasi It adds a variable defined in the generated `Makefile'. While it looks
361 1.21 uebayasi useful, it is too flexible and easy to abuse. The `Makefile' should be
362 1.21 uebayasi kept as simple as possible and have nothing that affects output contents.
363 1.21 uebayasi Consider to kill `makeoptions' totally, replace existing ones with `options'.
364 1.21 uebayasi
365 1.22 uebayasi o Don't use -Ttext ${TEXTADDR}.
366 1.22 uebayasi
367 1.22 uebayasi Although ld(1)'s `-Ttext ${TEXTADDR}' is an easy way to specify the virtual
368 1.22 uebayasi base address of .text at link time, it needs to change command-line; in
369 1.22 uebayasi kernel build, Makefile needs to change to reflect kernel's configuration.
370 1.22 uebayasi It is simpler to reflect kenel configuration using linker script via assym.h.
371 1.22 uebayasi
372 1.20 uebayasi o Convert ${DIAGNOSTIC} and ${DEBUG} as flags (defflag).
373 1.20 uebayasi
374 1.20 uebayasi Probably generate opt_diagnostic.h/opt_debug.h and include them in
375 1.20 uebayasi sys/param.h.
376 1.20 uebayasi
377 1.20 uebayasi o Strictly define DIAGNOSTIC.
378 1.20 uebayasi
379 1.20 uebayasi It is possible to make DIAGNOSTIC kernel and modules binary-compatible with
380 1.20 uebayasi non-DIAGNOSTIC ones. In that case, debug type informations should match
381 1.20 uebayasi theoretically (not confirmed).
382