TODO revision 1.9 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.8 uebayasi o Retire "attach foo at bar with foo_bar.c"
48 1.8 uebayasi
49 1.8 uebayasi Most of these should be rewritten by defining a common interface attribute
50 1.8 uebayasi "foobus", instead of writing multiple attachments. com(4), ld(4), ehci(4)
51 1.8 uebayasi are typical examples. For ehci(4), EHCI-capable controller drivers implement
52 1.8 uebayasi "ehcibus" interface, like:
53 1.8 uebayasi
54 1.8 uebayasi defne ehcibus {}
55 1.8 uebayasi device imxehci: ehcibus
56 1.8 uebayasi
57 1.8 uebayasi These drivers' attach functions call config_found() to attach ehci(4) via
58 1.8 uebayasi the "ehcibus" interface attribute, instead of calling ehci_init() directly.
59 1.8 uebayasi Same for com(4) (com_attach_subr()) and ld(4) (ldattach()).
60 1.8 uebayasi
61 1.1 uebayasi o Sort objects in more reasonable order.
62 1.1 uebayasi
63 1.1 uebayasi Put machdep.ko in the lowest address. uvm.ko and kern.ko follow.
64 1.1 uebayasi
65 1.1 uebayasi Kill alphabetical sort (${OBJS:O} in sys/conf/Makefile.inc.kern.
66 1.1 uebayasi
67 1.1 uebayasi Use ldscript. Do like this
68 1.1 uebayasi
69 1.1 uebayasi .text :
70 1.1 uebayasi AT (ADDR(.text) & 0x0fffffff)
71 1.1 uebayasi {
72 1.1 uebayasi *(.text.machdep.locore.entry)
73 1.1 uebayasi *(.text.machdep.locore)
74 1.1 uebayasi *(.text.machdep)
75 1.1 uebayasi *(.text)
76 1.1 uebayasi *(.text.*)
77 1.1 uebayasi :
78 1.1 uebayasi
79 1.1 uebayasi Kill linker definitions in sys/conf/Makefile.inc.kern.
80 1.2 uebayasi
81 1.3 wiz o Differentiate "options" and "flags"/"params".
82 1.2 uebayasi
83 1.3 wiz "options" enables features by adding *.c files (via attributes).
84 1.2 uebayasi
85 1.2 uebayasi "flags" and "params" are to change contents of *.c files. These don't add
86 1.3 wiz *.c files to the result kernel, or don't build attributes (modules).
87 1.2 uebayasi
88 1.2 uebayasi o Make flags/params per attributes (modules).
89 1.2 uebayasi
90 1.2 uebayasi Basically flags and params are cpp(1) #define's generated in opt_*.h. Make
91 1.2 uebayasi them local to one attributes (modules). Flags/params which affects files
92 1.2 uebayasi across attributes (modules) are possible, but should be discouraged.
93 1.2 uebayasi
94 1.2 uebayasi o Generate things only by definitions.
95 1.2 uebayasi
96 1.2 uebayasi In the ideal dynamically modular world, "selection" will be done not at
97 1.2 uebayasi compile time but at runtime. Users select their wanted modules, by
98 1.2 uebayasi dynamically loading them.
99 1.2 uebayasi
100 1.2 uebayasi This means that the system provides all choices; that is, build all modules
101 1.2 uebayasi in the source tree. Necessary information is defined in the "definition"
102 1.2 uebayasi part.
103 1.2 uebayasi
104 1.2 uebayasi o Split cfdata.
105 1.2 uebayasi
106 1.8 uebayasi cfdata is a set of pattern matching rules to enable devices at runtime device
107 1.3 wiz auto-configuration. It is pure data and can (should) be generated separately
108 1.2 uebayasi from the code.
109 1.4 apb
110 1.4 apb o Allow easier adding and removing of options.
111 1.4 apb
112 1.4 apb It should be possible to add or remove options, flags, etc.,
113 1.4 apb without regard to whether or not they are already defined.
114 1.4 apb For example, a configuration like this:
115 1.4 apb
116 1.4 apb include GENERIC
117 1.4 apb options FOO
118 1.4 apb no options BAR
119 1.4 apb
120 1.4 apb should work regardless of whether or not options FOO and/or
121 1.4 apb options BAR were defined in GENERIC. It should not give
122 1.4 apb errors like "options BAR was already defined" or "options FOO
123 1.4 apb was not defined".
124 1.4 apb
125 1.5 uebayasi o Introduce "class".
126 1.5 uebayasi
127 1.7 wiz Every module should be classified as at least one class, as modular(9)
128 1.7 wiz modules already do. For example, file systems are marked as "vfs", network
129 1.5 uebayasi protocols are "netproto".
130 1.5 uebayasi
131 1.5 uebayasi Consider to merge "devclass" into "class".
132 1.5 uebayasi
133 1.5 uebayasi For syntax clarity, class names could be used as a keyword to select the
134 1.5 uebayasi class's instance module:
135 1.5 uebayasi
136 1.5 uebayasi # Define net80211 module as netproto class
137 1.5 uebayasi class netproto
138 1.5 uebayasi define net80211: netproto
139 1.5 uebayasi
140 1.5 uebayasi # Select net80211 to be builtin
141 1.5 uebayasi netproto net80211
142 1.5 uebayasi
143 1.5 uebayasi Accordingly device/attach selection syntax should be revisited.
144 1.5 uebayasi
145 1.6 uebayasi o Support kernel constructor/destructor (.kctors/.kdtors)
146 1.5 uebayasi
147 1.5 uebayasi Initialization and finalization should be called via constructors and
148 1.5 uebayasi destructors. Don't hardcode those sequences as sys/kern/init_main.c:main()
149 1.5 uebayasi does.
150 1.5 uebayasi
151 1.6 uebayasi The order of .kctors/.kdtors is resolved by dependency. The difference from
152 1.5 uebayasi userland is that in kernel depended ones are located in lower addresses;
153 1.5 uebayasi "machdep" module is the lowest. Thus the lowest entry in .ctors must be
154 1.5 uebayasi executed the first.
155 1.5 uebayasi
156 1.6 uebayasi The .kctors/.kdtors entries are executed by kernel's main() function, unlike
157 1.6 uebayasi userland where start code executes .ctors/.dtors before main(). The hardcoded
158 1.6 uebayasi sequence of various subsystem initializations in init_main.c:main() will be
159 1.7 wiz replaced by an array of .kctors invocations, and #ifdef's there will be gone.
160 1.6 uebayasi
161 1.5 uebayasi o Replace linkset.
162 1.5 uebayasi
163 1.5 uebayasi Don't allow kernel subsystems create random ELF sections (with potentially
164 1.5 uebayasi long names) in the final kernel. To collect some data in statically linked
165 1.5 uebayasi modules, creating intermediate sections (e.g. .data.linkset.sysctl) and
166 1.5 uebayasi exporting the start/end symbols (e.g. _data_linkset_sysctl_{start,end})
167 1.5 uebayasi using linker script should be fine.
168 1.5 uebayasi
169 1.5 uebayasi Dynamically loaded modules have to register those entries via constructors
170 1.5 uebayasi (functions). This means that dynamically loaded modules are flexible but
171 1.5 uebayasi come with overhead.
172 1.6 uebayasi
173 1.6 uebayasi o Shared kernel objects.
174 1.6 uebayasi
175 1.7 wiz Since NetBSD has not established a clear kernel ABI, every single kernel
176 1.6 uebayasi has to build all the objects by their own. As a result, similar kernels
177 1.6 uebayasi (e.g. evbarm kernels) repeatedly compile similar objects, that is waste of
178 1.6 uebayasi energy & space.
179 1.6 uebayasi
180 1.6 uebayasi Share them if possible. For evb* ports, ideally everything except machdep.ko
181 1.6 uebayasi should be shared.
182 1.6 uebayasi
183 1.6 uebayasi While leaving optimizations as options (CPU specific optimizations, inlined
184 1.6 uebayasi bus_space(9) operations, etc.) for users, the official binaries build
185 1.6 uebayasi provided by TNF should be as portable as possible.
186