Commit 04b1db9fd7eea63c9663072feece616ea41b0a79
Committed by
Linus Torvalds
1 parent
3b5e0cbb4f
Exists in
master
and in
20 other branches
[PATCH] /sys/modules: allow full length section names
I've been using systemtap for some debugging and I noticed that it can't probe a lot of modules. Turns out it's kind of silly, the sections section of /sys/module is limited to 32byte filenames and many of the actual sections are a a bit longer than that. [akpm@osdl.org: rewrite to use dymanic allocation] Cc: Rusty Russell <rusty@rustcorp.com.au> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Showing 3 changed files with 24 additions and 9 deletions Inline Diff
CREDITS
1 | This is at least a partial credits-file of people that have | 1 | This is at least a partial credits-file of people that have |
2 | contributed to the Linux project. It is sorted by name and | 2 | contributed to the Linux project. It is sorted by name and |
3 | formatted to allow easy grepping and beautification by | 3 | formatted to allow easy grepping and beautification by |
4 | scripts. The fields are: name (N), email (E), web-address | 4 | scripts. The fields are: name (N), email (E), web-address |
5 | (W), PGP key ID and fingerprint (P), description (D), and | 5 | (W), PGP key ID and fingerprint (P), description (D), and |
6 | snail-mail address (S). | 6 | snail-mail address (S). |
7 | Thanks, | 7 | Thanks, |
8 | 8 | ||
9 | Linus | 9 | Linus |
10 | ---------- | 10 | ---------- |
11 | 11 | ||
12 | N: Matti Aarnio | 12 | N: Matti Aarnio |
13 | E: mea@nic.funet.fi | 13 | E: mea@nic.funet.fi |
14 | D: Alpha systems hacking, IPv6 and other network related stuff | 14 | D: Alpha systems hacking, IPv6 and other network related stuff |
15 | D: One of assisting postmasters for vger.kernel.org's lists | 15 | D: One of assisting postmasters for vger.kernel.org's lists |
16 | S: (ask for current address) | 16 | S: (ask for current address) |
17 | S: Finland | 17 | S: Finland |
18 | 18 | ||
19 | N: Dragos Acostachioaie | 19 | N: Dragos Acostachioaie |
20 | E: dragos@iname.com | 20 | E: dragos@iname.com |
21 | W: http://www.arbornet.org/~dragos | 21 | W: http://www.arbornet.org/~dragos |
22 | D: /proc/sysvipc | 22 | D: /proc/sysvipc |
23 | S: C. Negri 6, bl. D3 | 23 | S: C. Negri 6, bl. D3 |
24 | S: Iasi 6600 | 24 | S: Iasi 6600 |
25 | S: Romania | 25 | S: Romania |
26 | 26 | ||
27 | N: Mark Adler | 27 | N: Mark Adler |
28 | E: madler@alumni.caltech.edu | 28 | E: madler@alumni.caltech.edu |
29 | W: http://alumnus.caltech.edu/~madler/ | 29 | W: http://alumnus.caltech.edu/~madler/ |
30 | D: zlib decompression | 30 | D: zlib decompression |
31 | 31 | ||
32 | N: Monalisa Agrawal | 32 | N: Monalisa Agrawal |
33 | E: magrawal@nortelnetworks.com | 33 | E: magrawal@nortelnetworks.com |
34 | D: Basic Interphase 5575 driver with UBR and ABR support. | 34 | D: Basic Interphase 5575 driver with UBR and ABR support. |
35 | S: 75 Donald St, Apt 42 | 35 | S: 75 Donald St, Apt 42 |
36 | S: Weymouth, MA 02188 | 36 | S: Weymouth, MA 02188 |
37 | 37 | ||
38 | N: Dave Airlie | 38 | N: Dave Airlie |
39 | E: airlied@linux.ie | 39 | E: airlied@linux.ie |
40 | W: http://www.csn.ul.ie/~airlied | 40 | W: http://www.csn.ul.ie/~airlied |
41 | D: NFS over TCP patches | 41 | D: NFS over TCP patches |
42 | D: in-kernel DRM Maintainer | 42 | D: in-kernel DRM Maintainer |
43 | S: Longford, Ireland | 43 | S: Longford, Ireland |
44 | S: Sydney, Australia | 44 | S: Sydney, Australia |
45 | 45 | ||
46 | N: Tigran A. Aivazian | 46 | N: Tigran A. Aivazian |
47 | E: tigran@veritas.com | 47 | E: tigran@veritas.com |
48 | W: http://www.moses.uklinux.net/patches | 48 | W: http://www.moses.uklinux.net/patches |
49 | D: BFS filesystem | 49 | D: BFS filesystem |
50 | D: Intel IA32 CPU microcode update support | 50 | D: Intel IA32 CPU microcode update support |
51 | D: Various kernel patches | 51 | D: Various kernel patches |
52 | S: United Kingdom | 52 | S: United Kingdom |
53 | 53 | ||
54 | N: Werner Almesberger | 54 | N: Werner Almesberger |
55 | E: werner@almesberger.net | 55 | E: werner@almesberger.net |
56 | W: http://www.almesberger.net/ | 56 | W: http://www.almesberger.net/ |
57 | D: dosfs, LILO, some fd features, ATM, various other hacks here and there | 57 | D: dosfs, LILO, some fd features, ATM, various other hacks here and there |
58 | S: Buenos Aires | 58 | S: Buenos Aires |
59 | S: Argentina | 59 | S: Argentina |
60 | 60 | ||
61 | N: Tim Alpaerts | 61 | N: Tim Alpaerts |
62 | E: tim_alpaerts@toyota-motor-europe.com | 62 | E: tim_alpaerts@toyota-motor-europe.com |
63 | D: 802.2 class II logical link control layer, | 63 | D: 802.2 class II logical link control layer, |
64 | D: the humble start of an opening towards the IBM SNA protocols | 64 | D: the humble start of an opening towards the IBM SNA protocols |
65 | S: Klaproosstraat 72 c 10 | 65 | S: Klaproosstraat 72 c 10 |
66 | S: B-2610 Wilrijk-Antwerpen | 66 | S: B-2610 Wilrijk-Antwerpen |
67 | S: Belgium | 67 | S: Belgium |
68 | 68 | ||
69 | N: Anton Altaparmakov | 69 | N: Anton Altaparmakov |
70 | E: aia21@cantab.net | 70 | E: aia21@cantab.net |
71 | W: http://www-stu.christs.cam.ac.uk/~aia21/ | 71 | W: http://www-stu.christs.cam.ac.uk/~aia21/ |
72 | D: Author of new NTFS driver, various other kernel hacks. | 72 | D: Author of new NTFS driver, various other kernel hacks. |
73 | S: Christ's College | 73 | S: Christ's College |
74 | S: Cambridge CB2 3BU | 74 | S: Cambridge CB2 3BU |
75 | S: United Kingdom | 75 | S: United Kingdom |
76 | 76 | ||
77 | N: C. Scott Ananian | 77 | N: C. Scott Ananian |
78 | E: cananian@alumni.princeton.edu | 78 | E: cananian@alumni.princeton.edu |
79 | W: http://www.pdos.lcs.mit.edu/~cananian | 79 | W: http://www.pdos.lcs.mit.edu/~cananian |
80 | P: 1024/85AD9EED AD C0 49 08 91 67 DF D7 FA 04 1A EE 09 E8 44 B0 | 80 | P: 1024/85AD9EED AD C0 49 08 91 67 DF D7 FA 04 1A EE 09 E8 44 B0 |
81 | D: Unix98 pty support. | 81 | D: Unix98 pty support. |
82 | D: APM update to 1.2 spec. | 82 | D: APM update to 1.2 spec. |
83 | D: /devfs hacking. | 83 | D: /devfs hacking. |
84 | S: 7 Kiwi Loop | 84 | S: 7 Kiwi Loop |
85 | S: Howell, NJ 07731 | 85 | S: Howell, NJ 07731 |
86 | S: USA | 86 | S: USA |
87 | 87 | ||
88 | N: Erik Andersen | 88 | N: Erik Andersen |
89 | E: andersen@codepoet.org | 89 | E: andersen@codepoet.org |
90 | W: http://www.codepoet.org/ | 90 | W: http://www.codepoet.org/ |
91 | P: 1024D/30D39057 1BC4 2742 E885 E4DE 9301 0C82 5F9B 643E 30D3 9057 | 91 | P: 1024D/30D39057 1BC4 2742 E885 E4DE 9301 0C82 5F9B 643E 30D3 9057 |
92 | D: Maintainer of ide-cd and Uniform CD-ROM driver, | 92 | D: Maintainer of ide-cd and Uniform CD-ROM driver, |
93 | D: ATAPI CD-Changer support, Major 2.1.x CD-ROM update. | 93 | D: ATAPI CD-Changer support, Major 2.1.x CD-ROM update. |
94 | S: 352 North 525 East | 94 | S: 352 North 525 East |
95 | S: Springville, Utah 84663 | 95 | S: Springville, Utah 84663 |
96 | S: USA | 96 | S: USA |
97 | 97 | ||
98 | N: Michael Ang | 98 | N: Michael Ang |
99 | E: mang@subcarrier.org | 99 | E: mang@subcarrier.org |
100 | W: http://www.subcarrier.org/mang | 100 | W: http://www.subcarrier.org/mang |
101 | D: Linux/PA-RISC hacker | 101 | D: Linux/PA-RISC hacker |
102 | S: 85 Frank St. | 102 | S: 85 Frank St. |
103 | S: Ottawa, Ontario | 103 | S: Ottawa, Ontario |
104 | S: Canada K2P 0X3 | 104 | S: Canada K2P 0X3 |
105 | 105 | ||
106 | N: H. Peter Anvin | 106 | N: H. Peter Anvin |
107 | E: hpa@zytor.com | 107 | E: hpa@zytor.com |
108 | W: http://www.zytor.com/~hpa/ | 108 | W: http://www.zytor.com/~hpa/ |
109 | P: 2047/2A960705 BA 03 D3 2C 14 A8 A8 BD 1E DF FE 69 EE 35 BD 74 | 109 | P: 2047/2A960705 BA 03 D3 2C 14 A8 A8 BD 1E DF FE 69 EE 35 BD 74 |
110 | D: Author of the SYSLINUX boot loader, maintainer of the linux.* news | 110 | D: Author of the SYSLINUX boot loader, maintainer of the linux.* news |
111 | D: hierarchy and the Linux Device List; various kernel hacks | 111 | D: hierarchy and the Linux Device List; various kernel hacks |
112 | S: 4390 Albany Drive #46 | 112 | S: 4390 Albany Drive #46 |
113 | S: San Jose, California 95129 | 113 | S: San Jose, California 95129 |
114 | S: USA | 114 | S: USA |
115 | 115 | ||
116 | N: Andrea Arcangeli | 116 | N: Andrea Arcangeli |
117 | E: andrea@suse.de | 117 | E: andrea@suse.de |
118 | W: http://www.kernel.org/pub/linux/kernel/people/andrea/ | 118 | W: http://www.kernel.org/pub/linux/kernel/people/andrea/ |
119 | P: 1024D/68B9CB43 13D9 8355 295F 4823 7C49 C012 DFA1 686E 68B9 CB43 | 119 | P: 1024D/68B9CB43 13D9 8355 295F 4823 7C49 C012 DFA1 686E 68B9 CB43 |
120 | P: 1024R/CB4660B9 CC A0 71 81 F4 A0 63 AC C0 4B 81 1D 8C 15 C8 E5 | 120 | P: 1024R/CB4660B9 CC A0 71 81 F4 A0 63 AC C0 4B 81 1D 8C 15 C8 E5 |
121 | D: Parport hacker | 121 | D: Parport hacker |
122 | D: Implemented a workaround for some interrupt buggy printers | 122 | D: Implemented a workaround for some interrupt buggy printers |
123 | D: Author of pscan that helps to fix lp/parport bugs | 123 | D: Author of pscan that helps to fix lp/parport bugs |
124 | D: Author of lil (Linux Interrupt Latency benchmark) | 124 | D: Author of lil (Linux Interrupt Latency benchmark) |
125 | D: Fixed the shm swap deallocation at swapoff time (try_to_unuse message) | 125 | D: Fixed the shm swap deallocation at swapoff time (try_to_unuse message) |
126 | D: VM hacker | 126 | D: VM hacker |
127 | D: Various other kernel hacks | 127 | D: Various other kernel hacks |
128 | S: Imola 40026 | 128 | S: Imola 40026 |
129 | S: Italy | 129 | S: Italy |
130 | 130 | ||
131 | N: Derek Atkins | 131 | N: Derek Atkins |
132 | E: warlord@MIT.EDU | 132 | E: warlord@MIT.EDU |
133 | D: Linux-AFS Port, random kernel hacker, | 133 | D: Linux-AFS Port, random kernel hacker, |
134 | D: VFS fixes (new notify_change in particular) | 134 | D: VFS fixes (new notify_change in particular) |
135 | D: Moving all VFS access checks into the file systems | 135 | D: Moving all VFS access checks into the file systems |
136 | S: MIT Room E15-341 | 136 | S: MIT Room E15-341 |
137 | S: 20 Ames Street | 137 | S: 20 Ames Street |
138 | S: Cambridge, Massachusetts 02139 | 138 | S: Cambridge, Massachusetts 02139 |
139 | S: USA | 139 | S: USA |
140 | 140 | ||
141 | N: Michel Aubry | 141 | N: Michel Aubry |
142 | E: giovanni <giovanni@sudfr.com> | 142 | E: giovanni <giovanni@sudfr.com> |
143 | D: Aladdin 1533/1543(C) chipset IDE | 143 | D: Aladdin 1533/1543(C) chipset IDE |
144 | D: VIA MVP-3/TX Pro III chipset IDE | 144 | D: VIA MVP-3/TX Pro III chipset IDE |
145 | 145 | ||
146 | N: Jens Axboe | 146 | N: Jens Axboe |
147 | E: axboe@suse.de | 147 | E: axboe@suse.de |
148 | D: Linux CD-ROM maintainer, DVD support | 148 | D: Linux CD-ROM maintainer, DVD support |
149 | D: elevator + block layer rewrites | 149 | D: elevator + block layer rewrites |
150 | D: highmem I/O support | 150 | D: highmem I/O support |
151 | D: misc hacking on IDE, SCSI, block drivers, etc | 151 | D: misc hacking on IDE, SCSI, block drivers, etc |
152 | S: Peter Bangs Vej 258, 2TH | 152 | S: Peter Bangs Vej 258, 2TH |
153 | S: 2500 Valby | 153 | S: 2500 Valby |
154 | S: Denmark | 154 | S: Denmark |
155 | 155 | ||
156 | N: John Aycock | 156 | N: John Aycock |
157 | E: aycock@cpsc.ucalgary.ca | 157 | E: aycock@cpsc.ucalgary.ca |
158 | D: Adaptec 274x driver | 158 | D: Adaptec 274x driver |
159 | S: Department of Computer Science | 159 | S: Department of Computer Science |
160 | S: University of Calgary | 160 | S: University of Calgary |
161 | S: Calgary, Alberta | 161 | S: Calgary, Alberta |
162 | S: Canada | 162 | S: Canada |
163 | 163 | ||
164 | N: Miles Bader | 164 | N: Miles Bader |
165 | E: miles@gnu.org | 165 | E: miles@gnu.org |
166 | D: v850 port (uClinux) | 166 | D: v850 port (uClinux) |
167 | S: NEC Corporation | 167 | S: NEC Corporation |
168 | S: 1753 Shimonumabe, Nakahara-ku | 168 | S: 1753 Shimonumabe, Nakahara-ku |
169 | S: Kawasaki 211-8666 | 169 | S: Kawasaki 211-8666 |
170 | S: Japan | 170 | S: Japan |
171 | 171 | ||
172 | N: Ralf Baechle | 172 | N: Ralf Baechle |
173 | E: ralf@gnu.org | 173 | E: ralf@gnu.org |
174 | P: 1024/AF7B30C1 CF 97 C2 CC 6D AE A7 FE C8 BA 9C FC 88 DE 32 C3 | 174 | P: 1024/AF7B30C1 CF 97 C2 CC 6D AE A7 FE C8 BA 9C FC 88 DE 32 C3 |
175 | D: Linux/MIPS port | 175 | D: Linux/MIPS port |
176 | D: Linux/68k hacker | 176 | D: Linux/68k hacker |
177 | S: Hauptstrasse 19 | 177 | S: Hauptstrasse 19 |
178 | S: 79837 St. Blasien | 178 | S: 79837 St. Blasien |
179 | S: Germany | 179 | S: Germany |
180 | 180 | ||
181 | N: Krishna Balasubramanian | 181 | N: Krishna Balasubramanian |
182 | E: balasub@cis.ohio-state.edu | 182 | E: balasub@cis.ohio-state.edu |
183 | D: Wrote SYS V IPC (part of standard kernel since 0.99.10) | 183 | D: Wrote SYS V IPC (part of standard kernel since 0.99.10) |
184 | 184 | ||
185 | N: Dario Ballabio | 185 | N: Dario Ballabio |
186 | E: ballabio_dario@emc.com | 186 | E: ballabio_dario@emc.com |
187 | E: dario.ballabio@tiscalinet.it | 187 | E: dario.ballabio@tiscalinet.it |
188 | E: dario.ballabio@inwind.it | 188 | E: dario.ballabio@inwind.it |
189 | D: Author and maintainer of the Ultrastor 14F/34F SCSI driver | 189 | D: Author and maintainer of the Ultrastor 14F/34F SCSI driver |
190 | D: Author and maintainer of the EATA ISA/EISA/PCI SCSI driver | 190 | D: Author and maintainer of the EATA ISA/EISA/PCI SCSI driver |
191 | S: EMC Corporation | 191 | S: EMC Corporation |
192 | S: Milano | 192 | S: Milano |
193 | S: Italy | 193 | S: Italy |
194 | 194 | ||
195 | N: Paul Bame | 195 | N: Paul Bame |
196 | E: bame@debian.org | 196 | E: bame@debian.org |
197 | E: bame@puffin.external.hp.com | 197 | E: bame@puffin.external.hp.com |
198 | E: paul_bame@hp.com | 198 | E: paul_bame@hp.com |
199 | W: http://www.parisc-linux.org | 199 | W: http://www.parisc-linux.org |
200 | D: PA-RISC 32 and 64-bit early boot, firmware interface, interrupts, misc | 200 | D: PA-RISC 32 and 64-bit early boot, firmware interface, interrupts, misc |
201 | S: MS42 | 201 | S: MS42 |
202 | S: Hewlett-Packard | 202 | S: Hewlett-Packard |
203 | S: 3404 E Harmony Rd | 203 | S: 3404 E Harmony Rd |
204 | S: Fort Collins, CO 80525 | 204 | S: Fort Collins, CO 80525 |
205 | 205 | ||
206 | N: Arindam Banerji | 206 | N: Arindam Banerji |
207 | E: axb@cse.nd.edu | 207 | E: axb@cse.nd.edu |
208 | D: Contributed ESDI driver routines needed to port LINUX to the PS/2 MCA. | 208 | D: Contributed ESDI driver routines needed to port LINUX to the PS/2 MCA. |
209 | S: Department of Computer Science & Eng. | 209 | S: Department of Computer Science & Eng. |
210 | S: University of Notre Dame | 210 | S: University of Notre Dame |
211 | S: Notre Dame, Indiana | 211 | S: Notre Dame, Indiana |
212 | S: USA | 212 | S: USA |
213 | 213 | ||
214 | N: Greg Banks | 214 | N: Greg Banks |
215 | E: gnb@alphalink.com.au | 215 | E: gnb@alphalink.com.au |
216 | D: IDT77105 ATM network driver | 216 | D: IDT77105 ATM network driver |
217 | D: some SuperH port work | 217 | D: some SuperH port work |
218 | D: some trivial futzing with kconfig | 218 | D: some trivial futzing with kconfig |
219 | 219 | ||
220 | N: James Banks | 220 | N: James Banks |
221 | E: james@sovereign.org | 221 | E: james@sovereign.org |
222 | D: TLAN network driver | 222 | D: TLAN network driver |
223 | D: Logitech Busmouse driver | 223 | D: Logitech Busmouse driver |
224 | 224 | ||
225 | N: Krzysztof G. Baranowski | 225 | N: Krzysztof G. Baranowski |
226 | E: kgb@manjak.knm.org.pl | 226 | E: kgb@manjak.knm.org.pl |
227 | P: 1024/FA6F16D1 96 D1 1A CF 5F CA 69 EC F9 4F 36 1F 6D 60 7B DA | 227 | P: 1024/FA6F16D1 96 D1 1A CF 5F CA 69 EC F9 4F 36 1F 6D 60 7B DA |
228 | D: Maintainer of the System V file system. | 228 | D: Maintainer of the System V file system. |
229 | D: System V fs update for 2.1.x dcache. | 229 | D: System V fs update for 2.1.x dcache. |
230 | D: Forward ported a couple of SCSI drivers. | 230 | D: Forward ported a couple of SCSI drivers. |
231 | D: Various bugfixes. | 231 | D: Various bugfixes. |
232 | S: ul. Koscielna 12a | 232 | S: ul. Koscielna 12a |
233 | S: 62-300 Wrzesnia | 233 | S: 62-300 Wrzesnia |
234 | S: Poland | 234 | S: Poland |
235 | 235 | ||
236 | N: Fred Barnes | 236 | N: Fred Barnes |
237 | E: frmb2@ukc.ac.uk | 237 | E: frmb2@ukc.ac.uk |
238 | D: Various parport/ppdev hacks and fixes | 238 | D: Various parport/ppdev hacks and fixes |
239 | S: Computing Lab, The University | 239 | S: Computing Lab, The University |
240 | S: Canterbury, KENT | 240 | S: Canterbury, KENT |
241 | S: CT2 7NF | 241 | S: CT2 7NF |
242 | S: England | 242 | S: England |
243 | 243 | ||
244 | N: Paul Barton-Davis | 244 | N: Paul Barton-Davis |
245 | E: pbd@op.net | 245 | E: pbd@op.net |
246 | D: Driver for WaveFront soundcards (Turtle Beach Maui, Tropez, Tropez+) | 246 | D: Driver for WaveFront soundcards (Turtle Beach Maui, Tropez, Tropez+) |
247 | D: Various bugfixes and changes to sound drivers | 247 | D: Various bugfixes and changes to sound drivers |
248 | S: USA | 248 | S: USA |
249 | 249 | ||
250 | N: Carlos Henrique Bauer | 250 | N: Carlos Henrique Bauer |
251 | E: chbauer@acm.org | 251 | E: chbauer@acm.org |
252 | E: bauer@atlas.unisinos.br | 252 | E: bauer@atlas.unisinos.br |
253 | D: Some new sysctl entries for the parport driver. | 253 | D: Some new sysctl entries for the parport driver. |
254 | D: New sysctl function for handling unsigned longs | 254 | D: New sysctl function for handling unsigned longs |
255 | S: Universidade do Vale do Rio dos Sinos - UNISINOS | 255 | S: Universidade do Vale do Rio dos Sinos - UNISINOS |
256 | S: DSI/IDASI | 256 | S: DSI/IDASI |
257 | S: Av. Unisinos, 950 | 257 | S: Av. Unisinos, 950 |
258 | S: 93022000 Sao Leopoldo RS | 258 | S: 93022000 Sao Leopoldo RS |
259 | S: Brazil | 259 | S: Brazil |
260 | 260 | ||
261 | N: Peter Bauer | 261 | N: Peter Bauer |
262 | E: 100136.3530@compuserve.com | 262 | E: 100136.3530@compuserve.com |
263 | D: Driver for depca-ethernet-board | 263 | D: Driver for depca-ethernet-board |
264 | S: 69259 Wilhemsfeld | 264 | S: 69259 Wilhemsfeld |
265 | S: Rainweg 15 | 265 | S: Rainweg 15 |
266 | S: Germany | 266 | S: Germany |
267 | 267 | ||
268 | N: Fred Baumgarten | 268 | N: Fred Baumgarten |
269 | E: dc6iq@insl1.etec.uni-karlsruhe.de | 269 | E: dc6iq@insl1.etec.uni-karlsruhe.de |
270 | E: dc6iq@adacom.org | 270 | E: dc6iq@adacom.org |
271 | E: dc6iq@db0ais.#hes.deu.eu (packet radio) | 271 | E: dc6iq@db0ais.#hes.deu.eu (packet radio) |
272 | D: NET-2 & netstat(8) | 272 | D: NET-2 & netstat(8) |
273 | S: Soevener Strasse 11 | 273 | S: Soevener Strasse 11 |
274 | S: 53773 Hennef | 274 | S: 53773 Hennef |
275 | S: Germany | 275 | S: Germany |
276 | 276 | ||
277 | N: Donald Becker | 277 | N: Donald Becker |
278 | E: becker@cesdis.gsfc.nasa.gov | 278 | E: becker@cesdis.gsfc.nasa.gov |
279 | D: General low-level networking hacker | 279 | D: General low-level networking hacker |
280 | D: Most of the ethercard drivers | 280 | D: Most of the ethercard drivers |
281 | D: Original author of the NFS server | 281 | D: Original author of the NFS server |
282 | S: USRA Center of Excellence in Space Data and Information Sciences | 282 | S: USRA Center of Excellence in Space Data and Information Sciences |
283 | S: Code 930.5, Goddard Space Flight Center | 283 | S: Code 930.5, Goddard Space Flight Center |
284 | S: Greenbelt, Maryland 20771 | 284 | S: Greenbelt, Maryland 20771 |
285 | S: USA | 285 | S: USA |
286 | 286 | ||
287 | N: Adam Belay | 287 | N: Adam Belay |
288 | E: ambx1@neo.rr.com | 288 | E: ambx1@neo.rr.com |
289 | D: Linux Plug and Play Support | 289 | D: Linux Plug and Play Support |
290 | S: USA | 290 | S: USA |
291 | 291 | ||
292 | N: Daniele Bellucci | 292 | N: Daniele Bellucci |
293 | E: bellucda@tiscali.it | 293 | E: bellucda@tiscali.it |
294 | D: Various Janitor work. | 294 | D: Various Janitor work. |
295 | W: http://web.tiscali.it/bellucda | 295 | W: http://web.tiscali.it/bellucda |
296 | S: Via Delle Palme, 9 | 296 | S: Via Delle Palme, 9 |
297 | S: Terni 05100 | 297 | S: Terni 05100 |
298 | S: Italy | 298 | S: Italy |
299 | 299 | ||
300 | N: Krzysztof Benedyczak | 300 | N: Krzysztof Benedyczak |
301 | E: golbi@mat.uni.torun.pl | 301 | E: golbi@mat.uni.torun.pl |
302 | W: http://www.mat.uni.torun.pl/~golbi | 302 | W: http://www.mat.uni.torun.pl/~golbi |
303 | D: POSIX message queues fs (with M. Wronski) | 303 | D: POSIX message queues fs (with M. Wronski) |
304 | S: ul. Podmiejska 52 | 304 | S: ul. Podmiejska 52 |
305 | S: Radunica | 305 | S: Radunica |
306 | S: 83-000 Pruszcz Gdanski | 306 | S: 83-000 Pruszcz Gdanski |
307 | S: Poland | 307 | S: Poland |
308 | 308 | ||
309 | N: Randolph Bentson | 309 | N: Randolph Bentson |
310 | E: bentson@grieg.seaslug.org | 310 | E: bentson@grieg.seaslug.org |
311 | W: http://www.aa.net/~bentson/ | 311 | W: http://www.aa.net/~bentson/ |
312 | P: 1024/39ED5729 5C A8 7A F4 B2 7A D1 3E B5 3B 81 CF 47 30 11 71 | 312 | P: 1024/39ED5729 5C A8 7A F4 B2 7A D1 3E B5 3B 81 CF 47 30 11 71 |
313 | D: Author of driver for Cyclom-Y and Cyclades-Z async mux | 313 | D: Author of driver for Cyclom-Y and Cyclades-Z async mux |
314 | S: 2322 37th Ave SW | 314 | S: 2322 37th Ave SW |
315 | S: Seattle, Washington 98126-2010 | 315 | S: Seattle, Washington 98126-2010 |
316 | S: USA | 316 | S: USA |
317 | 317 | ||
318 | N: Stephen R. van den Berg (AKA BuGless) | 318 | N: Stephen R. van den Berg (AKA BuGless) |
319 | E: berg@pool.informatik.rwth-aachen.de | 319 | E: berg@pool.informatik.rwth-aachen.de |
320 | D: General kernel, gcc, and libc hacker | 320 | D: General kernel, gcc, and libc hacker |
321 | D: Specialisation: tweaking, ensuring portability, tweaking, cleaning, | 321 | D: Specialisation: tweaking, ensuring portability, tweaking, cleaning, |
322 | D: tweaking and occasionally debugging :-) | 322 | D: tweaking and occasionally debugging :-) |
323 | S: Bouwensstraat 22 | 323 | S: Bouwensstraat 22 |
324 | S: 6369 BG Simpelveld | 324 | S: 6369 BG Simpelveld |
325 | S: The Netherlands | 325 | S: The Netherlands |
326 | 326 | ||
327 | N: Peter Berger | 327 | N: Peter Berger |
328 | E: pberger@brimson.com | 328 | E: pberger@brimson.com |
329 | W: http://www.brimson.com | 329 | W: http://www.brimson.com |
330 | D: Author/maintainer of Digi AccelePort USB driver | 330 | D: Author/maintainer of Digi AccelePort USB driver |
331 | S: 1549 Hiironen Rd. | 331 | S: 1549 Hiironen Rd. |
332 | S: Brimson, MN 55602 | 332 | S: Brimson, MN 55602 |
333 | S: USA | 333 | S: USA |
334 | 334 | ||
335 | N: Hennus Bergman | 335 | N: Hennus Bergman |
336 | P: 1024/77D50909 76 99 FD 31 91 E1 96 1C 90 BB 22 80 62 F6 BD 63 | 336 | P: 1024/77D50909 76 99 FD 31 91 E1 96 1C 90 BB 22 80 62 F6 BD 63 |
337 | D: Author and maintainer of the QIC-02 tape driver | 337 | D: Author and maintainer of the QIC-02 tape driver |
338 | S: The Netherlands | 338 | S: The Netherlands |
339 | 339 | ||
340 | N: Tomas Berndtsson | 340 | N: Tomas Berndtsson |
341 | E: tomas@nocrew.org | 341 | E: tomas@nocrew.org |
342 | W: http://tomas.nocrew.org/ | 342 | W: http://tomas.nocrew.org/ |
343 | D: dsp56k device driver | 343 | D: dsp56k device driver |
344 | 344 | ||
345 | N: Ross Biro | 345 | N: Ross Biro |
346 | E: ross.biro@gmail.com | 346 | E: ross.biro@gmail.com |
347 | D: Original author of the Linux networking code | 347 | D: Original author of the Linux networking code |
348 | 348 | ||
349 | N: Anton Blanchard | 349 | N: Anton Blanchard |
350 | E: anton@samba.org | 350 | E: anton@samba.org |
351 | W: http://samba.org/~anton/ | 351 | W: http://samba.org/~anton/ |
352 | P: 1024/8462A731 4C 55 86 34 44 59 A7 99 2B 97 88 4A 88 9A 0D 97 | 352 | P: 1024/8462A731 4C 55 86 34 44 59 A7 99 2B 97 88 4A 88 9A 0D 97 |
353 | D: sun4 port, Sparc hacker | 353 | D: sun4 port, Sparc hacker |
354 | 354 | ||
355 | N: Hugh Blemings | 355 | N: Hugh Blemings |
356 | E: hugh@misc.nu | 356 | E: hugh@misc.nu |
357 | W: http://misc.nu/hugh/ | 357 | W: http://misc.nu/hugh/ |
358 | D: Author and maintainer of the Keyspan USB to Serial drivers | 358 | D: Author and maintainer of the Keyspan USB to Serial drivers |
359 | S: Po Box 234 | 359 | S: Po Box 234 |
360 | S: Belconnen ACT 2616 | 360 | S: Belconnen ACT 2616 |
361 | S: Australia | 361 | S: Australia |
362 | 362 | ||
363 | N: Philip Blundell | 363 | N: Philip Blundell |
364 | E: philb@gnu.org | 364 | E: philb@gnu.org |
365 | D: Linux/ARM hacker | 365 | D: Linux/ARM hacker |
366 | D: Device driver hacker (eexpress, 3c505, c-qcam, ...) | 366 | D: Device driver hacker (eexpress, 3c505, c-qcam, ...) |
367 | D: m68k port to HP9000/300 | 367 | D: m68k port to HP9000/300 |
368 | D: AUN network protocols | 368 | D: AUN network protocols |
369 | D: Co-architect of the parallel port sharing system | 369 | D: Co-architect of the parallel port sharing system |
370 | D: IPv6 netfilter | 370 | D: IPv6 netfilter |
371 | S: FutureTV Labs Ltd | 371 | S: FutureTV Labs Ltd |
372 | S: Brunswick House, 61-69 Newmarket Rd, Cambridge CB5 8EG | 372 | S: Brunswick House, 61-69 Newmarket Rd, Cambridge CB5 8EG |
373 | S: United Kingdom | 373 | S: United Kingdom |
374 | 374 | ||
375 | N: Thomas Bogendรถrfer | 375 | N: Thomas Bogendรถrfer |
376 | E: tsbogend@alpha.franken.de | 376 | E: tsbogend@alpha.franken.de |
377 | D: PCnet32 driver, SONIC driver, JAZZ_ESP driver | 377 | D: PCnet32 driver, SONIC driver, JAZZ_ESP driver |
378 | D: newport abscon driver, g364 framebuffer driver | 378 | D: newport abscon driver, g364 framebuffer driver |
379 | D: strace for Linux/Alpha | 379 | D: strace for Linux/Alpha |
380 | D: Linux/MIPS hacker | 380 | D: Linux/MIPS hacker |
381 | S: Schafhofstr. 40 | 381 | S: Schafhofstr. 40 |
382 | S: 90556 Cadolzburg | 382 | S: 90556 Cadolzburg |
383 | S: Germany | 383 | S: Germany |
384 | 384 | ||
385 | N: Bill Bogstad | 385 | N: Bill Bogstad |
386 | E: bogstad@pobox.com | 386 | E: bogstad@pobox.com |
387 | D: wrote /proc/self hack, minor samba & dosemu patches | 387 | D: wrote /proc/self hack, minor samba & dosemu patches |
388 | 388 | ||
389 | N: Axel Boldt | 389 | N: Axel Boldt |
390 | E: axel@uni-paderborn.de | 390 | E: axel@uni-paderborn.de |
391 | W: http://math-www.uni-paderborn.de/~axel/ | 391 | W: http://math-www.uni-paderborn.de/~axel/ |
392 | D: Configuration help text support | 392 | D: Configuration help text support |
393 | D: Linux CD and Support Giveaway List | 393 | D: Linux CD and Support Giveaway List |
394 | 394 | ||
395 | N: Erik Inge Bolsรธ | 395 | N: Erik Inge Bolsรธ |
396 | E: knan@mo.himolde.no | 396 | E: knan@mo.himolde.no |
397 | D: Misc kernel hacks | 397 | D: Misc kernel hacks |
398 | 398 | ||
399 | N: Andreas E. Bombe | 399 | N: Andreas E. Bombe |
400 | E: andreas.bombe@munich.netsurf.de | 400 | E: andreas.bombe@munich.netsurf.de |
401 | W: http://home.pages.de/~andreas.bombe/ | 401 | W: http://home.pages.de/~andreas.bombe/ |
402 | P: 1024/04880A44 72E5 7031 4414 2EB6 F6B4 4CBD 1181 7032 0488 0A44 | 402 | P: 1024/04880A44 72E5 7031 4414 2EB6 F6B4 4CBD 1181 7032 0488 0A44 |
403 | D: IEEE 1394 subsystem rewrite and maintainer | 403 | D: IEEE 1394 subsystem rewrite and maintainer |
404 | D: Texas Instruments PCILynx IEEE 1394 driver | 404 | D: Texas Instruments PCILynx IEEE 1394 driver |
405 | 405 | ||
406 | N: Al Borchers | 406 | N: Al Borchers |
407 | E: alborchers@steinerpoint.com | 407 | E: alborchers@steinerpoint.com |
408 | D: Author/maintainer of Digi AccelePort USB driver | 408 | D: Author/maintainer of Digi AccelePort USB driver |
409 | D: work on usbserial and keyspan_pda drivers | 409 | D: work on usbserial and keyspan_pda drivers |
410 | S: 4912 Zenith Ave. S. | 410 | S: 4912 Zenith Ave. S. |
411 | S: Minneapolis, MN 55410 | 411 | S: Minneapolis, MN 55410 |
412 | S: USA | 412 | S: USA |
413 | 413 | ||
414 | N: Marc Boucher | 414 | N: Marc Boucher |
415 | E: marc@mbsi.ca | 415 | E: marc@mbsi.ca |
416 | P: CA 67 A5 1A 38 CE B6 F2 D5 83 51 03 D2 9C 30 9E CE D2 DD 65 | 416 | P: CA 67 A5 1A 38 CE B6 F2 D5 83 51 03 D2 9C 30 9E CE D2 DD 65 |
417 | D: Netfilter core | 417 | D: Netfilter core |
418 | D: IP policy routing by mark | 418 | D: IP policy routing by mark |
419 | D: Various fixes (mostly networking) | 419 | D: Various fixes (mostly networking) |
420 | S: Montreal, Quebec | 420 | S: Montreal, Quebec |
421 | S: Canada | 421 | S: Canada |
422 | 422 | ||
423 | N: Zoltรกn Bรถszรถrmรฉnyi | 423 | N: Zoltรกn Bรถszรถrmรฉnyi |
424 | E: zboszor@mail.externet.hu | 424 | E: zboszor@mail.externet.hu |
425 | D: MTRR emulation with Cyrix style ARR registers, Athlon MTRR support | 425 | D: MTRR emulation with Cyrix style ARR registers, Athlon MTRR support |
426 | 426 | ||
427 | N: John Boyd | 427 | N: John Boyd |
428 | E: boyd@cis.ohio-state.edu | 428 | E: boyd@cis.ohio-state.edu |
429 | D: Co-author of wd7000 SCSI driver | 429 | D: Co-author of wd7000 SCSI driver |
430 | S: 101 Curl Drive #591 | 430 | S: 101 Curl Drive #591 |
431 | S: Columbus, Ohio 43210 | 431 | S: Columbus, Ohio 43210 |
432 | S: USA | 432 | S: USA |
433 | 433 | ||
434 | N: Peter Braam | 434 | N: Peter Braam |
435 | E: braam@clusterfs.com | 435 | E: braam@clusterfs.com |
436 | W: http://www.clusterfs.com/ | 436 | W: http://www.clusterfs.com/ |
437 | D: Coda & InterMezzo filesystems | 437 | D: Coda & InterMezzo filesystems |
438 | S: 181 McNeil | 438 | S: 181 McNeil |
439 | S: Canmore, AB | 439 | S: Canmore, AB |
440 | S: Canada, T1W 2R9 | 440 | S: Canada, T1W 2R9 |
441 | 441 | ||
442 | N: Ryan Bradetich | 442 | N: Ryan Bradetich |
443 | E: rbradetich@uswest.net | 443 | E: rbradetich@uswest.net |
444 | D: Linux/PA-RISC hacker | 444 | D: Linux/PA-RISC hacker |
445 | S: 1200 Goldenrod Dr. | 445 | S: 1200 Goldenrod Dr. |
446 | S: Nampa, Idaho 83686 | 446 | S: Nampa, Idaho 83686 |
447 | 447 | ||
448 | N: Derrick J. Brashear | 448 | N: Derrick J. Brashear |
449 | E: shadow@dementia.org | 449 | E: shadow@dementia.org |
450 | W: http://www.dementia.org/~shadow | 450 | W: http://www.dementia.org/~shadow |
451 | P: 512/71EC9367 C5 29 0F BC 83 51 B9 F0 BC 05 89 A0 4F 1F 30 05 | 451 | P: 512/71EC9367 C5 29 0F BC 83 51 B9 F0 BC 05 89 A0 4F 1F 30 05 |
452 | D: Author of Sparc CS4231 audio driver, random Sparc work | 452 | D: Author of Sparc CS4231 audio driver, random Sparc work |
453 | S: 403 Gilmore Avenue | 453 | S: 403 Gilmore Avenue |
454 | S: Trafford, Pennsylvania 15085 | 454 | S: Trafford, Pennsylvania 15085 |
455 | S: USA | 455 | S: USA |
456 | 456 | ||
457 | N: Dag Brattli | 457 | N: Dag Brattli |
458 | E: dagb@cs.uit.no | 458 | E: dagb@cs.uit.no |
459 | W: http://www.cs.uit.no/~dagb | 459 | W: http://www.cs.uit.no/~dagb |
460 | D: IrDA Subsystem | 460 | D: IrDA Subsystem |
461 | S: 19. Wellington Road | 461 | S: 19. Wellington Road |
462 | S: Lancaster, LA1 4DN | 462 | S: Lancaster, LA1 4DN |
463 | S: UK, England | 463 | S: UK, England |
464 | 464 | ||
465 | N: Lars Brinkhoff | 465 | N: Lars Brinkhoff |
466 | E: lars@nocrew.org | 466 | E: lars@nocrew.org |
467 | W: http://lars.nocrew.org/ | 467 | W: http://lars.nocrew.org/ |
468 | D: dsp56k device driver | 468 | D: dsp56k device driver |
469 | D: ptrace proxy in user mode kernel port | 469 | D: ptrace proxy in user mode kernel port |
470 | S: Kopmansg 2 | 470 | S: Kopmansg 2 |
471 | S: 411 13 Goteborg | 471 | S: 411 13 Goteborg |
472 | S: Sweden | 472 | S: Sweden |
473 | 473 | ||
474 | N: Dominik Brodowski | 474 | N: Dominik Brodowski |
475 | E: linux@brodo.de | 475 | E: linux@brodo.de |
476 | W: http://www.brodo.de/ | 476 | W: http://www.brodo.de/ |
477 | P: 1024D/725B37C6 190F 3E77 9C89 3B6D BECD 46EE 67C3 0308 725B 37C6 | 477 | P: 1024D/725B37C6 190F 3E77 9C89 3B6D BECD 46EE 67C3 0308 725B 37C6 |
478 | D: parts of CPUFreq code, ACPI bugfixes | 478 | D: parts of CPUFreq code, ACPI bugfixes |
479 | S: Tuebingen, Germany | 479 | S: Tuebingen, Germany |
480 | 480 | ||
481 | N: Andries Brouwer | 481 | N: Andries Brouwer |
482 | E: aeb@cwi.nl | 482 | E: aeb@cwi.nl |
483 | D: random Linux hacker | 483 | D: random Linux hacker |
484 | S: Bessemerstraat 21 | 484 | S: Bessemerstraat 21 |
485 | S: Amsterdam | 485 | S: Amsterdam |
486 | S: The Netherlands | 486 | S: The Netherlands |
487 | 487 | ||
488 | N: Zach Brown | 488 | N: Zach Brown |
489 | E: zab@zabbo.net | 489 | E: zab@zabbo.net |
490 | D: maestro pci sound | 490 | D: maestro pci sound |
491 | 491 | ||
492 | N: Gary Brubaker | 492 | N: Gary Brubaker |
493 | E: xavyer@ix.netcom.com | 493 | E: xavyer@ix.netcom.com |
494 | D: USB Serial Empeg Empeg-car Mark I/II Driver | 494 | D: USB Serial Empeg Empeg-car Mark I/II Driver |
495 | 495 | ||
496 | N: Matthias Bruestle | 496 | N: Matthias Bruestle |
497 | E: m@mbsks.franken.de | 497 | E: m@mbsks.franken.de |
498 | D: REINER SCT cyberJack pinpad/e-com USB chipcard reader driver | 498 | D: REINER SCT cyberJack pinpad/e-com USB chipcard reader driver |
499 | S: Germany | 499 | S: Germany |
500 | 500 | ||
501 | N: Adrian Bunk | 501 | N: Adrian Bunk |
502 | E: bunk@stusta.de | 502 | E: bunk@stusta.de |
503 | P: 1024D/4F12B400 B29C E71E FE19 6755 5C8A 84D4 99FC EA98 4F12 B400 | 503 | P: 1024D/4F12B400 B29C E71E FE19 6755 5C8A 84D4 99FC EA98 4F12 B400 |
504 | D: misc kernel hacking and testing | 504 | D: misc kernel hacking and testing |
505 | S: Grasmeierstrasse 11 | 505 | S: Grasmeierstrasse 11 |
506 | S: 80805 Muenchen | 506 | S: 80805 Muenchen |
507 | S: Germany | 507 | S: Germany |
508 | 508 | ||
509 | N: Ray Burr | 509 | N: Ray Burr |
510 | E: ryb@nightmare.com | 510 | E: ryb@nightmare.com |
511 | D: Original author of Amiga FFS filesystem | 511 | D: Original author of Amiga FFS filesystem |
512 | S: Orlando, Florida | 512 | S: Orlando, Florida |
513 | S: USA | 513 | S: USA |
514 | 514 | ||
515 | N: Lennert Buytenhek | 515 | N: Lennert Buytenhek |
516 | E: buytenh@gnu.org | 516 | E: buytenh@gnu.org |
517 | D: Rewrite of the ethernet bridging code | 517 | D: Rewrite of the ethernet bridging code |
518 | S: Ravenhorst 58B | 518 | S: Ravenhorst 58B |
519 | S: 2317 AK Leiden | 519 | S: 2317 AK Leiden |
520 | S: The Netherlands | 520 | S: The Netherlands |
521 | 521 | ||
522 | N: Michael Callahan | 522 | N: Michael Callahan |
523 | E: callahan@maths.ox.ac.uk | 523 | E: callahan@maths.ox.ac.uk |
524 | D: PPP for Linux | 524 | D: PPP for Linux |
525 | S: The Mathematical Institute | 525 | S: The Mathematical Institute |
526 | S: 25-29 St Giles | 526 | S: 25-29 St Giles |
527 | S: Oxford | 527 | S: Oxford |
528 | S: United Kingdom | 528 | S: United Kingdom |
529 | 529 | ||
530 | N: Luiz Fernando N. Capitulino | 530 | N: Luiz Fernando N. Capitulino |
531 | E: lcapitulino@mandriva.com.br | 531 | E: lcapitulino@mandriva.com.br |
532 | E: lcapitulino@gmail.com | 532 | E: lcapitulino@gmail.com |
533 | W: http://www.cpu.eti.br | 533 | W: http://www.cpu.eti.br |
534 | D: misc kernel hacking | 534 | D: misc kernel hacking |
535 | S: Mandriva | 535 | S: Mandriva |
536 | S: Brazil | 536 | S: Brazil |
537 | 537 | ||
538 | N: Remy Card | 538 | N: Remy Card |
539 | E: Remy.Card@masi.ibp.fr | 539 | E: Remy.Card@masi.ibp.fr |
540 | E: Remy.Card@linux.org | 540 | E: Remy.Card@linux.org |
541 | D: Extended file system [defunct] designer and developer | 541 | D: Extended file system [defunct] designer and developer |
542 | D: Second extended file system designer and developer | 542 | D: Second extended file system designer and developer |
543 | S: Institut Blaise Pascal | 543 | S: Institut Blaise Pascal |
544 | S: 4 Place Jussieu | 544 | S: 4 Place Jussieu |
545 | S: 75252 Paris Cedex 05 | 545 | S: 75252 Paris Cedex 05 |
546 | S: France | 546 | S: France |
547 | 547 | ||
548 | N: Ulf Carlsson | 548 | N: Ulf Carlsson |
549 | D: SGI Indy audio (HAL2) drivers | 549 | D: SGI Indy audio (HAL2) drivers |
550 | E: ulfc@bun.falkenberg.se | 550 | E: ulfc@bun.falkenberg.se |
551 | 551 | ||
552 | N: Ed Carp | 552 | N: Ed Carp |
553 | E: ecarp@netcom.com | 553 | E: ecarp@netcom.com |
554 | D: uucp, elm, pine, pico port | 554 | D: uucp, elm, pine, pico port |
555 | D: cron, at(1) developer | 555 | D: cron, at(1) developer |
556 | S: 48287 Sawleaf | 556 | S: 48287 Sawleaf |
557 | S: Fremont, California 94539 | 557 | S: Fremont, California 94539 |
558 | S: USA | 558 | S: USA |
559 | 559 | ||
560 | N: Florent Chabaud | 560 | N: Florent Chabaud |
561 | E: florent.chabaud@polytechnique.org | 561 | E: florent.chabaud@polytechnique.org |
562 | D: software suspend | 562 | D: software suspend |
563 | S: SGDN/DCSSI/SDS/LTI | 563 | S: SGDN/DCSSI/SDS/LTI |
564 | S: 58, Bd Latour-Maubourg | 564 | S: 58, Bd Latour-Maubourg |
565 | S: 75700 Paris 07 SP | 565 | S: 75700 Paris 07 SP |
566 | S: France | 566 | S: France |
567 | 567 | ||
568 | N: Gordon Chaffee | 568 | N: Gordon Chaffee |
569 | E: chaffee@cs.berkeley.edu | 569 | E: chaffee@cs.berkeley.edu |
570 | W: http://bmrc.berkeley.edu/people/chaffee/ | 570 | W: http://bmrc.berkeley.edu/people/chaffee/ |
571 | D: vfat, fat32, joliet, native language support | 571 | D: vfat, fat32, joliet, native language support |
572 | S: 3700 Warwick Road | 572 | S: 3700 Warwick Road |
573 | S: Fremont, California 94555 | 573 | S: Fremont, California 94555 |
574 | S: USA | 574 | S: USA |
575 | 575 | ||
576 | N: Chih-Jen Chang | 576 | N: Chih-Jen Chang |
577 | E: chihjenc@scf.usc.edu | 577 | E: chihjenc@scf.usc.edu |
578 | E: chihjen@iis.sinica.edu.tw | 578 | E: chihjen@iis.sinica.edu.tw |
579 | D: IGMP(Internet Group Management Protocol) version 2 | 579 | D: IGMP(Internet Group Management Protocol) version 2 |
580 | S: 3F, 65 Tajen street | 580 | S: 3F, 65 Tajen street |
581 | S: Tamsui town, Taipei county, | 581 | S: Tamsui town, Taipei county, |
582 | S: Taiwan 251 | 582 | S: Taiwan 251 |
583 | S: Republic of China | 583 | S: Republic of China |
584 | 584 | ||
585 | N: Michael Elizabeth Chastain | 585 | N: Michael Elizabeth Chastain |
586 | E: mec@shout.net | 586 | E: mec@shout.net |
587 | D: Configure, Menuconfig, xconfig | 587 | D: Configure, Menuconfig, xconfig |
588 | 588 | ||
589 | N: Raymond Chen | 589 | N: Raymond Chen |
590 | E: raymondc@microsoft.com | 590 | E: raymondc@microsoft.com |
591 | D: Author of Configure script | 591 | D: Author of Configure script |
592 | S: 14509 NE 39th Street #1096 | 592 | S: 14509 NE 39th Street #1096 |
593 | S: Bellevue, Washington 98007 | 593 | S: Bellevue, Washington 98007 |
594 | S: USA | 594 | S: USA |
595 | 595 | ||
596 | N: Christopher L. Cheney | 596 | N: Christopher L. Cheney |
597 | E: ccheney@debian.org | 597 | E: ccheney@debian.org |
598 | E: ccheney@cheney.cx | 598 | E: ccheney@cheney.cx |
599 | W: http://www.cheney.cx | 599 | W: http://www.cheney.cx |
600 | P: 1024D/8E384AF2 2D31 1927 87D7 1F24 9FF9 1BC5 D106 5AB3 8E38 4AF2 | 600 | P: 1024D/8E384AF2 2D31 1927 87D7 1F24 9FF9 1BC5 D106 5AB3 8E38 4AF2 |
601 | D: Vista Imaging usb webcam driver | 601 | D: Vista Imaging usb webcam driver |
602 | S: 314 Prince of Wales | 602 | S: 314 Prince of Wales |
603 | S: Conroe, TX 77304 | 603 | S: Conroe, TX 77304 |
604 | S: USA | 604 | S: USA |
605 | 605 | ||
606 | N: Stuart Cheshire | 606 | N: Stuart Cheshire |
607 | E: cheshire@cs.stanford.edu | 607 | E: cheshire@cs.stanford.edu |
608 | D: Author of Starmode Radio IP (STRIP) driver | 608 | D: Author of Starmode Radio IP (STRIP) driver |
609 | D: Originator of design for new combined interrupt handlers | 609 | D: Originator of design for new combined interrupt handlers |
610 | S: William Gates Department | 610 | S: William Gates Department |
611 | S: Stanford University | 611 | S: Stanford University |
612 | S: Stanford, California 94305 | 612 | S: Stanford, California 94305 |
613 | S: USA | 613 | S: USA |
614 | 614 | ||
615 | N: Randolph Chung | 615 | N: Randolph Chung |
616 | E: tausq@debian.org | 616 | E: tausq@debian.org |
617 | D: Linux/PA-RISC hacker | 617 | D: Linux/PA-RISC hacker |
618 | S: Hong Kong | 618 | S: Hong Kong |
619 | 619 | ||
620 | N: Juan Jose Ciarlante | 620 | N: Juan Jose Ciarlante |
621 | W: http://juanjox.kernelnotes.org/ | 621 | W: http://juanjox.kernelnotes.org/ |
622 | E: jjciarla@raiz.uncu.edu.ar | 622 | E: jjciarla@raiz.uncu.edu.ar |
623 | E: jjo@mendoza.gov.ar | 623 | E: jjo@mendoza.gov.ar |
624 | D: Network driver alias support | 624 | D: Network driver alias support |
625 | D: IP masq hashing and app modules | 625 | D: IP masq hashing and app modules |
626 | D: IP masq 2.1 features and bugs | 626 | D: IP masq 2.1 features and bugs |
627 | S: Las Cuevas 2385 - Bo Guemes | 627 | S: Las Cuevas 2385 - Bo Guemes |
628 | S: Las Heras, Mendoza CP 5539 | 628 | S: Las Heras, Mendoza CP 5539 |
629 | S: Argentina | 629 | S: Argentina |
630 | 630 | ||
631 | N: Steven P. Cole | 631 | N: Steven P. Cole |
632 | E: scole@lanl.gov | 632 | E: scole@lanl.gov |
633 | E: elenstev@mesatop.com | 633 | E: elenstev@mesatop.com |
634 | D: Various build fixes and kernel documentation. | 634 | D: Various build fixes and kernel documentation. |
635 | S: Los Alamos, New Mexico | 635 | S: Los Alamos, New Mexico |
636 | 636 | ||
637 | N: Hamish Coleman | 637 | N: Hamish Coleman |
638 | E: hamish@zot.apana.org.au | 638 | E: hamish@zot.apana.org.au |
639 | D: SEEQ8005 network driver | 639 | D: SEEQ8005 network driver |
640 | S: 98 Paxton Street | 640 | S: 98 Paxton Street |
641 | S: East Malvern, Victoria, 3145 | 641 | S: East Malvern, Victoria, 3145 |
642 | S: Australia | 642 | S: Australia |
643 | 643 | ||
644 | N: Neil Conway | 644 | N: Neil Conway |
645 | E: nconway.list@ukaea.org.uk | 645 | E: nconway.list@ukaea.org.uk |
646 | D: Assorted sched/mm titbits | 646 | D: Assorted sched/mm titbits |
647 | S: Oxfordshire, UK. | 647 | S: Oxfordshire, UK. |
648 | 648 | ||
649 | N: Kees Cook | 649 | N: Kees Cook |
650 | E: kees@outflux.net | 650 | E: kees@outflux.net |
651 | W: http://outflux.net/ | 651 | W: http://outflux.net/ |
652 | P: 1024D/17063E6D 9FA3 C49C 23C9 D1BC 2E30 1975 1FFF 4BA9 1706 3E6D | 652 | P: 1024D/17063E6D 9FA3 C49C 23C9 D1BC 2E30 1975 1FFF 4BA9 1706 3E6D |
653 | D: Minor updates to SCSI code for the Communications type | 653 | D: Minor updates to SCSI code for the Communications type |
654 | S: (ask for current address) | 654 | S: (ask for current address) |
655 | S: USA | 655 | S: USA |
656 | 656 | ||
657 | N: Mark Corner | 657 | N: Mark Corner |
658 | E: mcorner@umich.edu | 658 | E: mcorner@umich.edu |
659 | W: http://www.eecs.umich.edu/~mcorner/ | 659 | W: http://www.eecs.umich.edu/~mcorner/ |
660 | D: USB Bluetooth Driver | 660 | D: USB Bluetooth Driver |
661 | S: University of Michigan | 661 | S: University of Michigan |
662 | S: Ann Arbor, MI | 662 | S: Ann Arbor, MI |
663 | 663 | ||
664 | N: Michael Cornwell | 664 | N: Michael Cornwell |
665 | E: cornwell@acm.org | 665 | E: cornwell@acm.org |
666 | D: Original designer and co-author of ATA Taskfile | 666 | D: Original designer and co-author of ATA Taskfile |
667 | D: Kernel module SMART utilities | 667 | D: Kernel module SMART utilities |
668 | S: Santa Cruz, California | 668 | S: Santa Cruz, California |
669 | S: USA | 669 | S: USA |
670 | 670 | ||
671 | N: Alan Cox | 671 | N: Alan Cox |
672 | W: http://www.linux.org.uk/diary/ | 672 | W: http://www.linux.org.uk/diary/ |
673 | D: Linux Networking (0.99.10->2.0.29) | 673 | D: Linux Networking (0.99.10->2.0.29) |
674 | D: Original Appletalk, AX.25, and IPX code | 674 | D: Original Appletalk, AX.25, and IPX code |
675 | D: 3c501 hacker | 675 | D: 3c501 hacker |
676 | D: Watchdog timer drivers | 676 | D: Watchdog timer drivers |
677 | D: Linux/SMP x86 (up to 2.0 only) | 677 | D: Linux/SMP x86 (up to 2.0 only) |
678 | D: Initial Mac68K port | 678 | D: Initial Mac68K port |
679 | D: Video4Linux design, bw-qcam and PMS driver ports. | 679 | D: Video4Linux design, bw-qcam and PMS driver ports. |
680 | D: IDE modularisation work | 680 | D: IDE modularisation work |
681 | D: Z85230 driver | 681 | D: Z85230 driver |
682 | D: Former security contact point (please use vendor-sec@lst.de) | 682 | D: Former security contact point (please use vendor-sec@lst.de) |
683 | D: ex 2.2 maintainer | 683 | D: ex 2.2 maintainer |
684 | D: 2.1.x modular sound | 684 | D: 2.1.x modular sound |
685 | S: c/o Red Hat UK Ltd | 685 | S: c/o Red Hat UK Ltd |
686 | S: Alexandra House | 686 | S: Alexandra House |
687 | S: Alexandra Terrace | 687 | S: Alexandra Terrace |
688 | S: Guildford, GU1 3DA | 688 | S: Guildford, GU1 3DA |
689 | S: United Kingdom | 689 | S: United Kingdom |
690 | 690 | ||
691 | N: Cristian Mihail Craciunescu | 691 | N: Cristian Mihail Craciunescu |
692 | W: http://www.dnt.ro/~cristi/ | 692 | W: http://www.dnt.ro/~cristi/ |
693 | E: cristi@dnt.ro | 693 | E: cristi@dnt.ro |
694 | D: Support for Xircom PGSDB9 (firmware and host driver) | 694 | D: Support for Xircom PGSDB9 (firmware and host driver) |
695 | S: Bucharest | 695 | S: Bucharest |
696 | S: Romania | 696 | S: Romania |
697 | 697 | ||
698 | N: Laurence Culhane | 698 | N: Laurence Culhane |
699 | E: loz@holmes.demon.co.uk | 699 | E: loz@holmes.demon.co.uk |
700 | D: Wrote the initial alpha SLIP code | 700 | D: Wrote the initial alpha SLIP code |
701 | S: 81 Hood Street | 701 | S: 81 Hood Street |
702 | S: Northampton | 702 | S: Northampton |
703 | S: NN1 3QT | 703 | S: NN1 3QT |
704 | S: United Kingdom | 704 | S: United Kingdom |
705 | 705 | ||
706 | N: Uwe Dannowski | 706 | N: Uwe Dannowski |
707 | E: Uwe.Dannowski@ira.uka.de | 707 | E: Uwe.Dannowski@ira.uka.de |
708 | W: http://i30www.ira.uka.de/~dannowsk/ | 708 | W: http://i30www.ira.uka.de/~dannowsk/ |
709 | D: FORE PCA-200E driver | 709 | D: FORE PCA-200E driver |
710 | S: University of Karlsruhe | 710 | S: University of Karlsruhe |
711 | S: Germany | 711 | S: Germany |
712 | 712 | ||
713 | N: Ray Dassen | 713 | N: Ray Dassen |
714 | E: jdassen@wi.LeidenUniv.nl | 714 | E: jdassen@wi.LeidenUniv.nl |
715 | W: http://www.wi.leidenuniv.nl/~jdassen/ | 715 | W: http://www.wi.leidenuniv.nl/~jdassen/ |
716 | P: 1024/672D05C1 DD 60 32 60 F7 90 64 80 E7 6F D4 E4 F8 C9 4A 58 | 716 | P: 1024/672D05C1 DD 60 32 60 F7 90 64 80 E7 6F D4 E4 F8 C9 4A 58 |
717 | D: Debian GNU/Linux: www.debian.org maintainer, FAQ co-maintainer, | 717 | D: Debian GNU/Linux: www.debian.org maintainer, FAQ co-maintainer, |
718 | D: packages testing, nit-picking & fixing. Enjoying BugFree (TM) kernels. | 718 | D: packages testing, nit-picking & fixing. Enjoying BugFree (TM) kernels. |
719 | S: Zuidsingel 10A | 719 | S: Zuidsingel 10A |
720 | S: 2312 SB Leiden | 720 | S: 2312 SB Leiden |
721 | S: The Netherlands | 721 | S: The Netherlands |
722 | 722 | ||
723 | N: David Davies | 723 | N: David Davies |
724 | E: davies@wanton.lkg.dec.com | 724 | E: davies@wanton.lkg.dec.com |
725 | D: Network driver author - depca, ewrk3 and de4x5 | 725 | D: Network driver author - depca, ewrk3 and de4x5 |
726 | D: Wrote shared interrupt support | 726 | D: Wrote shared interrupt support |
727 | S: Digital Equipment Corporation | 727 | S: Digital Equipment Corporation |
728 | S: 550 King Street | 728 | S: 550 King Street |
729 | S: Littleton, Massachusetts 01460 | 729 | S: Littleton, Massachusetts 01460 |
730 | S: USA | 730 | S: USA |
731 | 731 | ||
732 | N: Frank Davis | 732 | N: Frank Davis |
733 | E: fdavis@si.rr.com | 733 | E: fdavis@si.rr.com |
734 | E: fdavis112@juno.com | 734 | E: fdavis112@juno.com |
735 | D: Various kernel patches | 735 | D: Various kernel patches |
736 | S: 8 Lakeview Terr. | 736 | S: 8 Lakeview Terr. |
737 | S: Kerhonkson, NY 12446 | 737 | S: Kerhonkson, NY 12446 |
738 | S: USA | 738 | S: USA |
739 | 739 | ||
740 | N: Wayne Davison | 740 | N: Wayne Davison |
741 | E: davison@borland.com | 741 | E: davison@borland.com |
742 | D: Second extended file system co-designer | 742 | D: Second extended file system co-designer |
743 | 743 | ||
744 | N: Terry Dawson | 744 | N: Terry Dawson |
745 | E: terry@perf.no.itg.telecom.com.au | 745 | E: terry@perf.no.itg.telecom.com.au |
746 | E: terry@albert.vk2ktj.ampr.org (Amateur Radio use only) | 746 | E: terry@albert.vk2ktj.ampr.org (Amateur Radio use only) |
747 | D: trivial hack to add variable address length routing to Rose. | 747 | D: trivial hack to add variable address length routing to Rose. |
748 | D: AX25-HOWTO, HAM-HOWTO, IPX-HOWTO, NET-2-HOWTO | 748 | D: AX25-HOWTO, HAM-HOWTO, IPX-HOWTO, NET-2-HOWTO |
749 | D: ax25-utils maintainer. | 749 | D: ax25-utils maintainer. |
750 | 750 | ||
751 | N: Helge Deller | 751 | N: Helge Deller |
752 | E: deller@gmx.de | 752 | E: deller@gmx.de |
753 | E: hdeller@redhat.de | 753 | E: hdeller@redhat.de |
754 | D: PA-RISC Linux hacker, LASI-, ASP-, WAX-, LCD/LED-driver | 754 | D: PA-RISC Linux hacker, LASI-, ASP-, WAX-, LCD/LED-driver |
755 | S: Schimmelsrain 1 | 755 | S: Schimmelsrain 1 |
756 | S: D-69231 Rauenberg | 756 | S: D-69231 Rauenberg |
757 | S: Germany | 757 | S: Germany |
758 | 758 | ||
759 | N: Jean Delvare | 759 | N: Jean Delvare |
760 | E: khali@linux-fr.org | 760 | E: khali@linux-fr.org |
761 | W: http://khali.linux-fr.org/ | 761 | W: http://khali.linux-fr.org/ |
762 | D: Several hardware monitoring drivers | 762 | D: Several hardware monitoring drivers |
763 | S: France | 763 | S: France |
764 | 764 | ||
765 | N: Peter Denison | 765 | N: Peter Denison |
766 | E: peterd@pnd-pc.demon.co.uk | 766 | E: peterd@pnd-pc.demon.co.uk |
767 | W: http://www.pnd-pc.demon.co.uk/promise/ | 767 | W: http://www.pnd-pc.demon.co.uk/promise/ |
768 | D: Promise DC4030VL caching HD controller drivers | 768 | D: Promise DC4030VL caching HD controller drivers |
769 | 769 | ||
770 | N: Todd J. Derr | 770 | N: Todd J. Derr |
771 | E: tjd@fore.com | 771 | E: tjd@fore.com |
772 | W: http://www.wordsmith.org/~tjd | 772 | W: http://www.wordsmith.org/~tjd |
773 | D: Random console hacks and other miscellaneous stuff | 773 | D: Random console hacks and other miscellaneous stuff |
774 | S: 3000 FORE Drive | 774 | S: 3000 FORE Drive |
775 | S: Warrendale, Pennsylvania 15086 | 775 | S: Warrendale, Pennsylvania 15086 |
776 | S: USA | 776 | S: USA |
777 | 777 | ||
778 | N: Martin Devera | 778 | N: Martin Devera |
779 | E: devik@cdi.cz | 779 | E: devik@cdi.cz |
780 | W: http://luxik.cdi.cz/~devik/qos/ | 780 | W: http://luxik.cdi.cz/~devik/qos/ |
781 | D: HTB qdisc and random networking hacks | 781 | D: HTB qdisc and random networking hacks |
782 | 782 | ||
783 | N: Alex deVries | 783 | N: Alex deVries |
784 | E: alex@onefishtwo.ca | 784 | E: alex@onefishtwo.ca |
785 | D: Various SGI parts, bits of HAL2 and Newport, PA-RISC Linux. | 785 | D: Various SGI parts, bits of HAL2 and Newport, PA-RISC Linux. |
786 | S: 41.5 William Street | 786 | S: 41.5 William Street |
787 | S: Ottawa, Ontario | 787 | S: Ottawa, Ontario |
788 | S: K1N 6Z9 | 788 | S: K1N 6Z9 |
789 | S: CANADA | 789 | S: CANADA |
790 | 790 | ||
791 | N: Jeff Dike | 791 | N: Jeff Dike |
792 | E: jdike@karaya.com | 792 | E: jdike@karaya.com |
793 | W: http://user-mode-linux.sourceforge.net | 793 | W: http://user-mode-linux.sourceforge.net |
794 | D: User mode kernel port | 794 | D: User mode kernel port |
795 | S: 375 Tubbs Hill Rd | 795 | S: 375 Tubbs Hill Rd |
796 | S: Deering NH 03244 | 796 | S: Deering NH 03244 |
797 | S: USA | 797 | S: USA |
798 | 798 | ||
799 | N: Matt Domsch | 799 | N: Matt Domsch |
800 | E: Matt_Domsch@dell.com | 800 | E: Matt_Domsch@dell.com |
801 | W: http://www.dell.com/linux | 801 | W: http://www.dell.com/linux |
802 | W: http://domsch.com/linux | 802 | W: http://domsch.com/linux |
803 | D: Linux/IA-64 | 803 | D: Linux/IA-64 |
804 | D: Dell PowerEdge server, SCSI layer, misc drivers, and other patches | 804 | D: Dell PowerEdge server, SCSI layer, misc drivers, and other patches |
805 | S: Dell Inc. | 805 | S: Dell Inc. |
806 | S: One Dell Way | 806 | S: One Dell Way |
807 | S: Round Rock, TX 78682 | 807 | S: Round Rock, TX 78682 |
808 | S: USA | 808 | S: USA |
809 | 809 | ||
810 | N: Ben Dooks | 810 | N: Ben Dooks |
811 | E: ben-linux@fluff.org | 811 | E: ben-linux@fluff.org |
812 | E: ben@simtec.co.uk | 812 | E: ben@simtec.co.uk |
813 | W: http://www.fluff.org/ben/ | 813 | W: http://www.fluff.org/ben/ |
814 | W: http://www.simtec.co.uk/ | 814 | W: http://www.simtec.co.uk/ |
815 | D: Samsung S3C2410/S3C2440 support, general ARM support | 815 | D: Samsung S3C2410/S3C2440 support, general ARM support |
816 | D: Maintaining Simtec Electronics development boards | 816 | D: Maintaining Simtec Electronics development boards |
817 | S: Simtec Electronics | 817 | S: Simtec Electronics |
818 | S: Avondale Drive | 818 | S: Avondale Drive |
819 | S: Tarleton | 819 | S: Tarleton |
820 | S: Preston | 820 | S: Preston |
821 | S: Lancs | 821 | S: Lancs |
822 | S: PR4 6AX | 822 | S: PR4 6AX |
823 | S: United Kingdom | 823 | S: United Kingdom |
824 | 824 | ||
825 | N: John G Dorsey | 825 | N: John G Dorsey |
826 | E: john+@cs.cmu.edu | 826 | E: john+@cs.cmu.edu |
827 | D: ARM Linux ports to Assabet/Neponset, Spot | 827 | D: ARM Linux ports to Assabet/Neponset, Spot |
828 | S: Department of Electrical and Computer Engineering | 828 | S: Department of Electrical and Computer Engineering |
829 | S: Carnegie Mellon University | 829 | S: Carnegie Mellon University |
830 | S: Pittsburgh, PA 15213 | 830 | S: Pittsburgh, PA 15213 |
831 | S: USA | 831 | S: USA |
832 | 832 | ||
833 | N: Eddie C. Dost | 833 | N: Eddie C. Dost |
834 | E: ecd@skynet.be | 834 | E: ecd@skynet.be |
835 | D: Linux/Sparc kernel hacker | 835 | D: Linux/Sparc kernel hacker |
836 | D: Linux/Sparc maintainer | 836 | D: Linux/Sparc maintainer |
837 | S: Rue de la Chapelle 51 | 837 | S: Rue de la Chapelle 51 |
838 | S: 4850 Moresnet | 838 | S: 4850 Moresnet |
839 | S: Belgium | 839 | S: Belgium |
840 | 840 | ||
841 | N: Cort Dougan | 841 | N: Cort Dougan |
842 | E: cort@fsmlabs.com | 842 | E: cort@fsmlabs.com |
843 | W: http://www.fsmlabs.com/linuxppcbk.html | 843 | W: http://www.fsmlabs.com/linuxppcbk.html |
844 | D: PowerPC | 844 | D: PowerPC |
845 | 845 | ||
846 | N: Daniel Drake | 846 | N: Daniel Drake |
847 | E: dsd@gentoo.org | 847 | E: dsd@gentoo.org |
848 | D: USBAT02 CompactFlash support in usb-storage | 848 | D: USBAT02 CompactFlash support in usb-storage |
849 | S: UK | 849 | S: UK |
850 | 850 | ||
851 | N: Oleg Drokin | 851 | N: Oleg Drokin |
852 | E: green@ccssu.crimea.ua | 852 | E: green@ccssu.crimea.ua |
853 | W: http://www.ccssu.crimea.ua/~green | 853 | W: http://www.ccssu.crimea.ua/~green |
854 | D: Cleaning up sound drivers, SA1100 Watchdog. | 854 | D: Cleaning up sound drivers, SA1100 Watchdog. |
855 | S: Skvoznoy per., 14a | 855 | S: Skvoznoy per., 14a |
856 | S: Evpatoria | 856 | S: Evpatoria |
857 | S: Crimea | 857 | S: Crimea |
858 | S: UKRAINE, 334320 | 858 | S: UKRAINE, 334320 |
859 | 859 | ||
860 | N: Walt Drummond | 860 | N: Walt Drummond |
861 | E: drummond@valinux.com | 861 | E: drummond@valinux.com |
862 | D: Linux/IA-64 | 862 | D: Linux/IA-64 |
863 | S: 1382 Bordeaux Drive | 863 | S: 1382 Bordeaux Drive |
864 | S: Sunnyvale, CA 94087 | 864 | S: Sunnyvale, CA 94087 |
865 | S: USA | 865 | S: USA |
866 | 866 | ||
867 | N: Bruno Ducrot | 867 | N: Bruno Ducrot |
868 | E: ducrot@poupinou.org | 868 | E: ducrot@poupinou.org |
869 | D: CPUFreq and ACPI bugfixes. | 869 | D: CPUFreq and ACPI bugfixes. |
870 | S: Mougin, France | 870 | S: Mougin, France |
871 | 871 | ||
872 | N: Don Dugger | 872 | N: Don Dugger |
873 | E: n0ano@valinux.com | 873 | E: n0ano@valinux.com |
874 | D: Linux/IA-64 | 874 | D: Linux/IA-64 |
875 | S: 1209 Pearl Street, #12 | 875 | S: 1209 Pearl Street, #12 |
876 | S: Boulder, CO 80302 | 876 | S: Boulder, CO 80302 |
877 | S: USA | 877 | S: USA |
878 | 878 | ||
879 | N: Thomas Dunbar | 879 | N: Thomas Dunbar |
880 | E: tdunbar@vt.edu | 880 | E: tdunbar@vt.edu |
881 | D: TeX & METAFONT hacking/maintenance | 881 | D: TeX & METAFONT hacking/maintenance |
882 | S: Virginia Tech Computing Center | 882 | S: Virginia Tech Computing Center |
883 | S: 1700 Pratt Drive | 883 | S: 1700 Pratt Drive |
884 | S: Blacksburg, Virginia 24061 | 884 | S: Blacksburg, Virginia 24061 |
885 | S: USA | 885 | S: USA |
886 | 886 | ||
887 | N: Randy Dunlap | 887 | N: Randy Dunlap |
888 | E: rdunlap@xenotime.net | 888 | E: rdunlap@xenotime.net |
889 | W: http://www.xenotime.net/linux/linux.html | 889 | W: http://www.xenotime.net/linux/linux.html |
890 | W: http://www.linux-usb.org | 890 | W: http://www.linux-usb.org |
891 | D: Linux-USB subsystem, USB core/UHCI/printer/storage drivers | 891 | D: Linux-USB subsystem, USB core/UHCI/printer/storage drivers |
892 | D: x86 SMP, ACPI, bootflag hacking | 892 | D: x86 SMP, ACPI, bootflag hacking |
893 | S: (ask for current address) | 893 | S: (ask for current address) |
894 | S: USA | 894 | S: USA |
895 | 895 | ||
896 | N: Bob Dunlop | 896 | N: Bob Dunlop |
897 | E: rjd@xyzzy.clara.co.uk | 897 | E: rjd@xyzzy.clara.co.uk |
898 | E: bob.dunlop@farsite.co.uk | 898 | E: bob.dunlop@farsite.co.uk |
899 | W: www.farsite.co.uk | 899 | W: www.farsite.co.uk |
900 | D: FarSync card device driver | 900 | D: FarSync card device driver |
901 | S: FarSite Communications Ltd | 901 | S: FarSite Communications Ltd |
902 | S: Tempus Business Centre | 902 | S: Tempus Business Centre |
903 | S: 60 Kingsclere Road | 903 | S: 60 Kingsclere Road |
904 | S: Basingstoke RG21 6XG | 904 | S: Basingstoke RG21 6XG |
905 | S: UK | 905 | S: UK |
906 | 906 | ||
907 | N: Cyrus Durgin | 907 | N: Cyrus Durgin |
908 | E: cider@speakeasy.org | 908 | E: cider@speakeasy.org |
909 | W: http://www.speakeasy.org/~cider/ | 909 | W: http://www.speakeasy.org/~cider/ |
910 | D: implemented kmod | 910 | D: implemented kmod |
911 | 911 | ||
912 | N: Torsten Duwe | 912 | N: Torsten Duwe |
913 | E: Torsten.Duwe@informatik.uni-erlangen.de | 913 | E: Torsten.Duwe@informatik.uni-erlangen.de |
914 | D: Part-time kernel hacker | 914 | D: Part-time kernel hacker |
915 | D: The Linux Support Team Erlangen | 915 | D: The Linux Support Team Erlangen |
916 | S: Grevenbroicher Str. 17 | 916 | S: Grevenbroicher Str. 17 |
917 | S: 47807 Krefeld | 917 | S: 47807 Krefeld |
918 | S: Germany | 918 | S: Germany |
919 | 919 | ||
920 | N: Tom Dyas | 920 | N: Tom Dyas |
921 | E: tdyas@eden.rutgers.edu | 921 | E: tdyas@eden.rutgers.edu |
922 | D: minor hacks and some sparc port stuff | 922 | D: minor hacks and some sparc port stuff |
923 | S: New Jersey | 923 | S: New Jersey |
924 | S: USA | 924 | S: USA |
925 | 925 | ||
926 | N: Drew Eckhardt | 926 | N: Drew Eckhardt |
927 | E: drew@PoohSticks.ORG | 927 | E: drew@PoohSticks.ORG |
928 | D: SCSI code | 928 | D: SCSI code |
929 | D: Assorted snippets elsewhere | 929 | D: Assorted snippets elsewhere |
930 | D: Boot sector "..." printing | 930 | D: Boot sector "..." printing |
931 | S: 2037 Walnut #6 | 931 | S: 2037 Walnut #6 |
932 | S: Boulder, Colorado 80302 | 932 | S: Boulder, Colorado 80302 |
933 | S: USA | 933 | S: USA |
934 | 934 | ||
935 | N: Heiko Eissfeldt | 935 | N: Heiko Eissfeldt |
936 | E: heiko@colossus.escape.de heiko@unifix.de | 936 | E: heiko@colossus.escape.de heiko@unifix.de |
937 | D: verify_area stuff, generic SCSI fixes | 937 | D: verify_area stuff, generic SCSI fixes |
938 | D: SCSI Programming HOWTO | 938 | D: SCSI Programming HOWTO |
939 | D: POSIX.1 compliance testing | 939 | D: POSIX.1 compliance testing |
940 | S: Unifix Software GmbH | 940 | S: Unifix Software GmbH |
941 | S: Bueltenweg 27a | 941 | S: Bueltenweg 27a |
942 | S: D-38106 Braunschweig | 942 | S: D-38106 Braunschweig |
943 | S: Germany | 943 | S: Germany |
944 | 944 | ||
945 | N: Bjorn Ekwall | 945 | N: Bjorn Ekwall |
946 | E: bj0rn@blox.se | 946 | E: bj0rn@blox.se |
947 | W: http://www.pi.se/blox/ | 947 | W: http://www.pi.se/blox/ |
948 | D: Extended support for loadable modules | 948 | D: Extended support for loadable modules |
949 | D: D-Link pocket adapter drivers | 949 | D: D-Link pocket adapter drivers |
950 | S: Brevia 1043 | 950 | S: Brevia 1043 |
951 | S: S-114 79 Stockholm | 951 | S: S-114 79 Stockholm |
952 | S: Sweden | 952 | S: Sweden |
953 | 953 | ||
954 | N: David Engebretsen | 954 | N: David Engebretsen |
955 | E: engebret@us.ibm.com | 955 | E: engebret@us.ibm.com |
956 | D: Linux port to 64-bit PowerPC architecture | 956 | D: Linux port to 64-bit PowerPC architecture |
957 | 957 | ||
958 | N: Michael Engel | 958 | N: Michael Engel |
959 | E: engel@unix-ag.org | 959 | E: engel@unix-ag.org |
960 | D: DECstation framebuffer drivers | 960 | D: DECstation framebuffer drivers |
961 | S: Germany | 961 | S: Germany |
962 | 962 | ||
963 | N: Paal-Kristian Engstad | 963 | N: Paal-Kristian Engstad |
964 | E: engstad@intermetrics.com | 964 | E: engstad@intermetrics.com |
965 | D: Kernel smbfs (to mount WfW, NT and OS/2 network drives.) | 965 | D: Kernel smbfs (to mount WfW, NT and OS/2 network drives.) |
966 | S: 17101 Springdale Street #225 | 966 | S: 17101 Springdale Street #225 |
967 | S: Huntington Beach, California 92649 | 967 | S: Huntington Beach, California 92649 |
968 | S: USA | 968 | S: USA |
969 | 969 | ||
970 | N: Stephane Eranian | 970 | N: Stephane Eranian |
971 | E: eranian@hpl.hp.com | 971 | E: eranian@hpl.hp.com |
972 | D: Linux/ia64 | 972 | D: Linux/ia64 |
973 | S: 1501 Page Mill Rd, MS 1U17 | 973 | S: 1501 Page Mill Rd, MS 1U17 |
974 | S: Palo Alto, CA 94304 | 974 | S: Palo Alto, CA 94304 |
975 | S: USA | 975 | S: USA |
976 | 976 | ||
977 | N: Johannes Erdfelt | 977 | N: Johannes Erdfelt |
978 | E: johannes@erdfelt.com | 978 | E: johannes@erdfelt.com |
979 | D: Linux/IA-64 bootloader and kernel goop, USB | 979 | D: Linux/IA-64 bootloader and kernel goop, USB |
980 | S: 6350 Stoneridge Mall Road | 980 | S: 6350 Stoneridge Mall Road |
981 | S: Pleasanton, CA 94588 | 981 | S: Pleasanton, CA 94588 |
982 | S: USA | 982 | S: USA |
983 | 983 | ||
984 | N: Doug Evans | 984 | N: Doug Evans |
985 | E: dje@cygnus.com | 985 | E: dje@cygnus.com |
986 | D: Wrote Xenix FS (part of standard kernel since 0.99.15) | 986 | D: Wrote Xenix FS (part of standard kernel since 0.99.15) |
987 | 987 | ||
988 | N: Riccardo Facchetti | 988 | N: Riccardo Facchetti |
989 | E: fizban@tin.it | 989 | E: fizban@tin.it |
990 | P: 1024/6E657BB5 AF 22 90 33 78 76 04 8B AF F9 97 1E B5 E2 65 30 | 990 | P: 1024/6E657BB5 AF 22 90 33 78 76 04 8B AF F9 97 1E B5 E2 65 30 |
991 | D: Audio Excel DSP 16 init driver author | 991 | D: Audio Excel DSP 16 init driver author |
992 | D: libmodem author | 992 | D: libmodem author |
993 | D: Yet Another Micro Monitor port and current maintainer | 993 | D: Yet Another Micro Monitor port and current maintainer |
994 | D: First ELF-HOWTO author | 994 | D: First ELF-HOWTO author |
995 | D: random kernel hacker | 995 | D: random kernel hacker |
996 | S: Via Paolo VI n.29 | 996 | S: Via Paolo VI n.29 |
997 | S: 23900 - LECCO (Lc) | 997 | S: 23900 - LECCO (Lc) |
998 | S: Italy | 998 | S: Italy |
999 | 999 | ||
1000 | N: Nils Faerber | 1000 | N: Nils Faerber |
1001 | E: nils@kernelconcepts.de | 1001 | E: nils@kernelconcepts.de |
1002 | D: i810 TCO watchdog driver author | 1002 | D: i810 TCO watchdog driver author |
1003 | D: Mitsumi LU005 tests and fixes | 1003 | D: Mitsumi LU005 tests and fixes |
1004 | D: port and fixes of cs46xx sounddriver | 1004 | D: port and fixes of cs46xx sounddriver |
1005 | S: Dreisbachstrasse 24 | 1005 | S: Dreisbachstrasse 24 |
1006 | S: D-57250 Netphen | 1006 | S: D-57250 Netphen |
1007 | S: Germany | 1007 | S: Germany |
1008 | 1008 | ||
1009 | N: Rik Faith | 1009 | N: Rik Faith |
1010 | E: faith@acm.org | 1010 | E: faith@acm.org |
1011 | D: Future Domain TMC-16x0 SCSI driver (author) | 1011 | D: Future Domain TMC-16x0 SCSI driver (author) |
1012 | D: APM driver (early port) | 1012 | D: APM driver (early port) |
1013 | D: DRM drivers (author of several) | 1013 | D: DRM drivers (author of several) |
1014 | 1014 | ||
1015 | N: Jรกnos Farkas | 1015 | N: Jรกnos Farkas |
1016 | E: chexum@shadow.banki.hu | 1016 | E: chexum@shadow.banki.hu |
1017 | D: romfs, various (mostly networking) fixes | 1017 | D: romfs, various (mostly networking) fixes |
1018 | P: 1024/F81FB2E1 41 B7 E4 E6 3E D4 A6 71 6D 9C F3 9F F2 BF DF 6E | 1018 | P: 1024/F81FB2E1 41 B7 E4 E6 3E D4 A6 71 6D 9C F3 9F F2 BF DF 6E |
1019 | S: Madarรกsz Viktor utca 25 | 1019 | S: Madarรกsz Viktor utca 25 |
1020 | S: 1131 Budapest | 1020 | S: 1131 Budapest |
1021 | S: Hungary | 1021 | S: Hungary |
1022 | 1022 | ||
1023 | N: Ben Fennema | 1023 | N: Ben Fennema |
1024 | E: bfennema@falcon.csc.calpoly.edu | 1024 | E: bfennema@falcon.csc.calpoly.edu |
1025 | W: http://www.csc.calpoly.edu/~bfennema | 1025 | W: http://www.csc.calpoly.edu/~bfennema |
1026 | D: UDF filesystem | 1026 | D: UDF filesystem |
1027 | S: (ask for current address) | 1027 | S: (ask for current address) |
1028 | S: USA | 1028 | S: USA |
1029 | 1029 | ||
1030 | N: Jรผrgen Fischer | 1030 | N: Jรผrgen Fischer |
1031 | E: fischer@norbit.de (=?iso-8859-1?q?J=FCrgen?= Fischer) | 1031 | E: fischer@norbit.de (=?iso-8859-1?q?J=FCrgen?= Fischer) |
1032 | D: Author of Adaptec AHA-152x SCSI driver | 1032 | D: Author of Adaptec AHA-152x SCSI driver |
1033 | S: Schulstraรe 18 | 1033 | S: Schulstraรe 18 |
1034 | S: 26506 Norden | 1034 | S: 26506 Norden |
1035 | S: Germany | 1035 | S: Germany |
1036 | 1036 | ||
1037 | N: Jeremy Fitzhardinge | 1037 | N: Jeremy Fitzhardinge |
1038 | E: jeremy@goop.org | 1038 | E: jeremy@goop.org |
1039 | W: http://www.goop.org/~jeremy | 1039 | W: http://www.goop.org/~jeremy |
1040 | D: author of userfs filesystem | 1040 | D: author of userfs filesystem |
1041 | D: Improved mmap and munmap handling | 1041 | D: Improved mmap and munmap handling |
1042 | D: General mm minor tidyups | 1042 | D: General mm minor tidyups |
1043 | D: autofs v4 maintainer | 1043 | D: autofs v4 maintainer |
1044 | S: 987 Alabama St | 1044 | S: 987 Alabama St |
1045 | S: San Francisco | 1045 | S: San Francisco |
1046 | S: CA, 94110 | 1046 | S: CA, 94110 |
1047 | S: USA | 1047 | S: USA |
1048 | 1048 | ||
1049 | N: Ralf Flaxa | 1049 | N: Ralf Flaxa |
1050 | E: rfflaxa@immd4.informatik.uni-erlangen.de | 1050 | E: rfflaxa@immd4.informatik.uni-erlangen.de |
1051 | D: The Linux Support Team Erlangen | 1051 | D: The Linux Support Team Erlangen |
1052 | D: Creator of LST distribution | 1052 | D: Creator of LST distribution |
1053 | D: Author of installation tool LISA | 1053 | D: Author of installation tool LISA |
1054 | S: Pfitznerweg 6 | 1054 | S: Pfitznerweg 6 |
1055 | S: 74523 Schwaebisch Hall | 1055 | S: 74523 Schwaebisch Hall |
1056 | S: Germany | 1056 | S: Germany |
1057 | 1057 | ||
1058 | N: Lawrence Foard | 1058 | N: Lawrence Foard |
1059 | E: entropy@world.std.com | 1059 | E: entropy@world.std.com |
1060 | D: Floppy track reading, fs code | 1060 | D: Floppy track reading, fs code |
1061 | S: 217 Park Avenue, Suite 108 | 1061 | S: 217 Park Avenue, Suite 108 |
1062 | S: Worcester, Massachusetts 01609 | 1062 | S: Worcester, Massachusetts 01609 |
1063 | S: USA | 1063 | S: USA |
1064 | 1064 | ||
1065 | N: Karl Fogel | 1065 | N: Karl Fogel |
1066 | E: kfogel@cs.oberlin.edu | 1066 | E: kfogel@cs.oberlin.edu |
1067 | D: Contributor, Linux User's Guide | 1067 | D: Contributor, Linux User's Guide |
1068 | S: 1123 North Oak Park Avenue | 1068 | S: 1123 North Oak Park Avenue |
1069 | S: Oak Park, Illinois 60302 | 1069 | S: Oak Park, Illinois 60302 |
1070 | S: USA | 1070 | S: USA |
1071 | 1071 | ||
1072 | N: Daniel J. Frasnelli | 1072 | N: Daniel J. Frasnelli |
1073 | E: dfrasnel@alphalinux.org | 1073 | E: dfrasnel@alphalinux.org |
1074 | W: http://www.alphalinux.org/ | 1074 | W: http://www.alphalinux.org/ |
1075 | P: 1024/3EF87611 B9 F1 44 50 D3 E8 C2 80 DA E5 55 AA 56 7C 42 DA | 1075 | P: 1024/3EF87611 B9 F1 44 50 D3 E8 C2 80 DA E5 55 AA 56 7C 42 DA |
1076 | D: DEC Alpha hacker | 1076 | D: DEC Alpha hacker |
1077 | D: Miscellaneous bug squisher | 1077 | D: Miscellaneous bug squisher |
1078 | 1078 | ||
1079 | N: Jim Freeman | 1079 | N: Jim Freeman |
1080 | E: jfree@sovereign.org | 1080 | E: jfree@sovereign.org |
1081 | W: http://www.sovereign.org/ | 1081 | W: http://www.sovereign.org/ |
1082 | D: Initial GPL'd Frame Relay driver | 1082 | D: Initial GPL'd Frame Relay driver |
1083 | D: Dynamic PPP devices | 1083 | D: Dynamic PPP devices |
1084 | D: Sundry modularizations (PPP, IPX, ...) and fixes | 1084 | D: Sundry modularizations (PPP, IPX, ...) and fixes |
1085 | 1085 | ||
1086 | N: Bob Frey | 1086 | N: Bob Frey |
1087 | E: bobf@advansys.com | 1087 | E: bobf@advansys.com |
1088 | D: AdvanSys SCSI driver | 1088 | D: AdvanSys SCSI driver |
1089 | S: 1150 Ringwood Court | 1089 | S: 1150 Ringwood Court |
1090 | S: San Jose, California 95131 | 1090 | S: San Jose, California 95131 |
1091 | S: USA | 1091 | S: USA |
1092 | 1092 | ||
1093 | N: Fernando Fuganti | 1093 | N: Fernando Fuganti |
1094 | E: fuganti@conectiva.com.br | 1094 | E: fuganti@conectiva.com.br |
1095 | E: fuganti@netbank.com.br | 1095 | E: fuganti@netbank.com.br |
1096 | D: random kernel hacker, ZF MachZ Watchdog driver | 1096 | D: random kernel hacker, ZF MachZ Watchdog driver |
1097 | S: Conectiva S.A. | 1097 | S: Conectiva S.A. |
1098 | S: R. Tocantins, 89 - Cristo Rei | 1098 | S: R. Tocantins, 89 - Cristo Rei |
1099 | S: 80050-430 - Curitiba - Paranรก | 1099 | S: 80050-430 - Curitiba - Paranรก |
1100 | S: Brazil | 1100 | S: Brazil |
1101 | 1101 | ||
1102 | N: Kumar Gala | 1102 | N: Kumar Gala |
1103 | E: galak@kernel.crashing.org | 1103 | E: galak@kernel.crashing.org |
1104 | D: Embedded PowerPC 6xx/7xx/74xx/82xx/83xx/85xx support | 1104 | D: Embedded PowerPC 6xx/7xx/74xx/82xx/83xx/85xx support |
1105 | S: Austin, Texas 78729 | 1105 | S: Austin, Texas 78729 |
1106 | S: USA | 1106 | S: USA |
1107 | 1107 | ||
1108 | N: Nigel Gamble | 1108 | N: Nigel Gamble |
1109 | E: nigel@nrg.org | 1109 | E: nigel@nrg.org |
1110 | D: Interrupt-driven printer driver | 1110 | D: Interrupt-driven printer driver |
1111 | D: Preemptible kernel | 1111 | D: Preemptible kernel |
1112 | S: 120 Alley Way | 1112 | S: 120 Alley Way |
1113 | S: Mountain View, California 94040 | 1113 | S: Mountain View, California 94040 |
1114 | S: USA | 1114 | S: USA |
1115 | 1115 | ||
1116 | N: Jeff Garzik | 1116 | N: Jeff Garzik |
1117 | E: jgarzik@pobox.com | 1117 | E: jgarzik@pobox.com |
1118 | 1118 | ||
1119 | N: Jacques Gelinas | 1119 | N: Jacques Gelinas |
1120 | E: jacques@solucorp.qc.ca | 1120 | E: jacques@solucorp.qc.ca |
1121 | D: Author of the Umsdos file system | 1121 | D: Author of the Umsdos file system |
1122 | S: 1326 De Val-Brillant | 1122 | S: 1326 De Val-Brillant |
1123 | S: Laval, Quebec | 1123 | S: Laval, Quebec |
1124 | S: Canada H7Y 1V9 | 1124 | S: Canada H7Y 1V9 |
1125 | 1125 | ||
1126 | N: David Gentzel | 1126 | N: David Gentzel |
1127 | E: gentzel@telerama.lm.com | 1127 | E: gentzel@telerama.lm.com |
1128 | D: Original BusLogic driver and original UltraStor driver | 1128 | D: Original BusLogic driver and original UltraStor driver |
1129 | S: Whitfield Software Services | 1129 | S: Whitfield Software Services |
1130 | S: 600 North Bell Avenue, Suite 160 | 1130 | S: 600 North Bell Avenue, Suite 160 |
1131 | S: Carnegie, Pennsylvania 15106-4304 | 1131 | S: Carnegie, Pennsylvania 15106-4304 |
1132 | S: USA | 1132 | S: USA |
1133 | 1133 | ||
1134 | N: Philip Gladstone | 1134 | N: Philip Gladstone |
1135 | E: philip@gladstonefamily.net | 1135 | E: philip@gladstonefamily.net |
1136 | D: Kernel / timekeeping stuff | 1136 | D: Kernel / timekeeping stuff |
1137 | S: Carlisle, MA 01741 | 1137 | S: Carlisle, MA 01741 |
1138 | S: USA | 1138 | S: USA |
1139 | 1139 | ||
1140 | N: Jan-Benedict Glaw | 1140 | N: Jan-Benedict Glaw |
1141 | E: jbglaw@lug-owl.de | 1141 | E: jbglaw@lug-owl.de |
1142 | D: SRM environment driver (for Alpha systems) | 1142 | D: SRM environment driver (for Alpha systems) |
1143 | P: 1024D/8399E1BB 250D 3BCF 7127 0D8C A444 A961 1DBD 5E75 8399 E1BB | 1143 | P: 1024D/8399E1BB 250D 3BCF 7127 0D8C A444 A961 1DBD 5E75 8399 E1BB |
1144 | 1144 | ||
1145 | N: Thomas Gleixner | 1145 | N: Thomas Gleixner |
1146 | E: tglx@linutronix.de | 1146 | E: tglx@linutronix.de |
1147 | D: NAND flash hardware support, JFFS2 on NAND flash | 1147 | D: NAND flash hardware support, JFFS2 on NAND flash |
1148 | 1148 | ||
1149 | N: Richard E. Gooch | 1149 | N: Richard E. Gooch |
1150 | E: rgooch@atnf.csiro.au | 1150 | E: rgooch@atnf.csiro.au |
1151 | D: parent process death signal to children | 1151 | D: parent process death signal to children |
1152 | D: prctl() syscall | 1152 | D: prctl() syscall |
1153 | D: /proc/mtrr support to manipulate MTRRs on Intel P6 family | 1153 | D: /proc/mtrr support to manipulate MTRRs on Intel P6 family |
1154 | D: Device FileSystem (devfs) | 1154 | D: Device FileSystem (devfs) |
1155 | S: CSIRO Australia Telescope National Facility | 1155 | S: CSIRO Australia Telescope National Facility |
1156 | S: P.O. Box 76, Epping | 1156 | S: P.O. Box 76, Epping |
1157 | S: New South Wales, 2121 | 1157 | S: New South Wales, 2121 |
1158 | S: Australia | 1158 | S: Australia |
1159 | 1159 | ||
1160 | N: Carlos E. Gorges | 1160 | N: Carlos E. Gorges |
1161 | E: carlos@techlinux.com.br | 1161 | E: carlos@techlinux.com.br |
1162 | D: fix smp support on cmpci driver | 1162 | D: fix smp support on cmpci driver |
1163 | P: 2048G/EA3C4B19 FF31 33A6 0362 4915 B7EB E541 17D0 0379 EA3C 4B19 | 1163 | P: 2048G/EA3C4B19 FF31 33A6 0362 4915 B7EB E541 17D0 0379 EA3C 4B19 |
1164 | S: Brazil | 1164 | S: Brazil |
1165 | 1165 | ||
1166 | N: Dmitry S. Gorodchanin | 1166 | N: Dmitry S. Gorodchanin |
1167 | E: pgmdsg@ibi.com | 1167 | E: pgmdsg@ibi.com |
1168 | D: RISCom/8 driver, misc kernel fixes. | 1168 | D: RISCom/8 driver, misc kernel fixes. |
1169 | S: 4 Main Street | 1169 | S: 4 Main Street |
1170 | S: Woodbridge, Connecticut 06525 | 1170 | S: Woodbridge, Connecticut 06525 |
1171 | S: USA | 1171 | S: USA |
1172 | 1172 | ||
1173 | N: Paul Gortmaker | 1173 | N: Paul Gortmaker |
1174 | E: p_gortmaker@yahoo.com | 1174 | E: p_gortmaker@yahoo.com |
1175 | D: Author of RTC driver & several net drivers, Ethernet & BootPrompt Howto. | 1175 | D: Author of RTC driver & several net drivers, Ethernet & BootPrompt Howto. |
1176 | D: Made support for modules, ramdisk, generic-serial, etc. optional. | 1176 | D: Made support for modules, ramdisk, generic-serial, etc. optional. |
1177 | D: Transformed old user space bdflush into 1st kernel thread - kflushd. | 1177 | D: Transformed old user space bdflush into 1st kernel thread - kflushd. |
1178 | D: Many other patches, documentation files, mini kernels, utilities, ... | 1178 | D: Many other patches, documentation files, mini kernels, utilities, ... |
1179 | 1179 | ||
1180 | N: Masanori GOTO | 1180 | N: Masanori GOTO |
1181 | E: gotom@debian.or.jp | 1181 | E: gotom@debian.or.jp |
1182 | D: Workbit NinjaSCSI-32Bi/UDE driver | 1182 | D: Workbit NinjaSCSI-32Bi/UDE driver |
1183 | S: Japan | 1183 | S: Japan |
1184 | 1184 | ||
1185 | N: John E. Gotts | 1185 | N: John E. Gotts |
1186 | E: jgotts@linuxsavvy.com | 1186 | E: jgotts@linuxsavvy.com |
1187 | D: kernel hacker | 1187 | D: kernel hacker |
1188 | S: 8124 Constitution Apt. 7 | 1188 | S: 8124 Constitution Apt. 7 |
1189 | S: Sterling Heights, Michigan 48313 | 1189 | S: Sterling Heights, Michigan 48313 |
1190 | S: USA | 1190 | S: USA |
1191 | 1191 | ||
1192 | N: William Greathouse | 1192 | N: William Greathouse |
1193 | E: wgreathouse@smva.com | 1193 | E: wgreathouse@smva.com |
1194 | E: wgreathouse@myfavoritei.com | 1194 | E: wgreathouse@myfavoritei.com |
1195 | D: Current Belkin USB Serial Adapter F5U103 hacker | 1195 | D: Current Belkin USB Serial Adapter F5U103 hacker |
1196 | D: Kernel hacker, embedded systems | 1196 | D: Kernel hacker, embedded systems |
1197 | S: 7802 Fitzwater Road | 1197 | S: 7802 Fitzwater Road |
1198 | S: Brecksville, OH 44141-1334 | 1198 | S: Brecksville, OH 44141-1334 |
1199 | S: USA | 1199 | S: USA |
1200 | 1200 | ||
1201 | N: Tristan Greaves | 1201 | N: Tristan Greaves |
1202 | E: tristan@extricate.org | 1202 | E: tristan@extricate.org |
1203 | W: http://www.extricate.org/ | 1203 | W: http://www.extricate.org/ |
1204 | D: Miscellaneous ipv4 sysctl patches | 1204 | D: Miscellaneous ipv4 sysctl patches |
1205 | 1205 | ||
1206 | N: Michael A. Griffith | 1206 | N: Michael A. Griffith |
1207 | E: grif@cs.ucr.edu | 1207 | E: grif@cs.ucr.edu |
1208 | W: http://www.cs.ucr.edu/~grif | 1208 | W: http://www.cs.ucr.edu/~grif |
1209 | D: Loopback speedup, qlogic SCSI hacking, VT_LOCKSWITCH | 1209 | D: Loopback speedup, qlogic SCSI hacking, VT_LOCKSWITCH |
1210 | S: Department of Computer Science | 1210 | S: Department of Computer Science |
1211 | S: University of California, Riverside | 1211 | S: University of California, Riverside |
1212 | S: Riverside, California 92521-0304 | 1212 | S: Riverside, California 92521-0304 |
1213 | S: USA | 1213 | S: USA |
1214 | 1214 | ||
1215 | N: Hans Grobler | 1215 | N: Hans Grobler |
1216 | E: grobh@sun.ac.za | 1216 | E: grobh@sun.ac.za |
1217 | D: Various AX.25/ROSE/NETROM + hamradio driver patches | 1217 | D: Various AX.25/ROSE/NETROM + hamradio driver patches |
1218 | D: Various X.25/LABP + driver patches | 1218 | D: Various X.25/LABP + driver patches |
1219 | D: Misc kernel fixes and updates | 1219 | D: Misc kernel fixes and updates |
1220 | S: Department of Electronic Engineering | 1220 | S: Department of Electronic Engineering |
1221 | S: University of Stellenbosch | 1221 | S: University of Stellenbosch |
1222 | S: Stellenbosch, Western Cape | 1222 | S: Stellenbosch, Western Cape |
1223 | S: South Africa | 1223 | S: South Africa |
1224 | 1224 | ||
1225 | N: Grant Grundler | 1225 | N: Grant Grundler |
1226 | E: grundler@parisc-linux.org | 1226 | E: grundler@parisc-linux.org |
1227 | W: http://obmouse.sourceforge.net/ | 1227 | W: http://obmouse.sourceforge.net/ |
1228 | W: http://www.parisc-linux.org/ | 1228 | W: http://www.parisc-linux.org/ |
1229 | D: obmouse - rewrote Olivier Florent's Omnibook 600 "pop-up" mouse driver | 1229 | D: obmouse - rewrote Olivier Florent's Omnibook 600 "pop-up" mouse driver |
1230 | D: PA-RISC - Interrupt/PCI HBA/IOMMU author and architect | 1230 | D: PA-RISC - Interrupt/PCI HBA/IOMMU author and architect |
1231 | S: Mountain View, California | 1231 | S: Mountain View, California |
1232 | S: USA | 1232 | S: USA |
1233 | 1233 | ||
1234 | N: Grant Guenther | 1234 | N: Grant Guenther |
1235 | E: grant@torque.net | 1235 | E: grant@torque.net |
1236 | W: http://www.torque.net/linux-pp.html | 1236 | W: http://www.torque.net/linux-pp.html |
1237 | D: original author of ppa driver for parallel port ZIP drive | 1237 | D: original author of ppa driver for parallel port ZIP drive |
1238 | D: original architect of the parallel-port sharing scheme | 1238 | D: original architect of the parallel-port sharing scheme |
1239 | D: PARIDE subsystem: drivers for parallel port IDE & ATAPI devices | 1239 | D: PARIDE subsystem: drivers for parallel port IDE & ATAPI devices |
1240 | S: 44 St. Joseph Street, Suite 506 | 1240 | S: 44 St. Joseph Street, Suite 506 |
1241 | S: Toronto, Ontario, M4Y 2W4 | 1241 | S: Toronto, Ontario, M4Y 2W4 |
1242 | S: Canada | 1242 | S: Canada |
1243 | 1243 | ||
1244 | N: Richard Gรผnther | 1244 | N: Richard Gรผnther |
1245 | E: rguenth@tat.physik.uni-tuebingen.de | 1245 | E: rguenth@tat.physik.uni-tuebingen.de |
1246 | W: http://www.tat.physik.uni-tuebingen.de/~rguenth | 1246 | W: http://www.tat.physik.uni-tuebingen.de/~rguenth |
1247 | P: 2048/2E829319 2F 83 FC 93 E9 E4 19 E2 93 7A 32 42 45 37 23 57 | 1247 | P: 2048/2E829319 2F 83 FC 93 E9 E4 19 E2 93 7A 32 42 45 37 23 57 |
1248 | D: binfmt_misc | 1248 | D: binfmt_misc |
1249 | S: 72074 Tรผbingen | 1249 | S: 72074 Tรผbingen |
1250 | S: Germany | 1250 | S: Germany |
1251 | 1251 | ||
1252 | N: Justin Guyett | 1252 | N: Justin Guyett |
1253 | E: jguyett@andrew.cmu.edu | 1253 | E: jguyett@andrew.cmu.edu |
1254 | D: via-rhine net driver hacking | 1254 | D: via-rhine net driver hacking |
1255 | 1255 | ||
1256 | N: Danny ter Haar | 1256 | N: Danny ter Haar |
1257 | E: dth@cistron.nl | 1257 | E: dth@cistron.nl |
1258 | D: /proc/cpuinfo, reboot on panic , kernel pre-patch tester ;) | 1258 | D: /proc/cpuinfo, reboot on panic , kernel pre-patch tester ;) |
1259 | S: Cistron | 1259 | S: Cistron |
1260 | S: PO-Box 297 | 1260 | S: PO-Box 297 |
1261 | S: 2400 AG, Alphen aan den Rijn | 1261 | S: 2400 AG, Alphen aan den Rijn |
1262 | S: The Netherlands | 1262 | S: The Netherlands |
1263 | 1263 | ||
1264 | N: Enver Haase | 1264 | N: Enver Haase |
1265 | E: ehaase@inf.fu-berlin.de | 1265 | E: ehaase@inf.fu-berlin.de |
1266 | W: http://www.inf.fu-berlin.de/~ehaase | 1266 | W: http://www.inf.fu-berlin.de/~ehaase |
1267 | D: Driver for the Commodore A2232 serial board | 1267 | D: Driver for the Commodore A2232 serial board |
1268 | 1268 | ||
1269 | N: Bruno Haible | 1269 | N: Bruno Haible |
1270 | E: haible@ma2s2.mathematik.uni-karlsruhe.de | 1270 | E: haible@ma2s2.mathematik.uni-karlsruhe.de |
1271 | D: SysV FS, shm swapping, memory management fixes | 1271 | D: SysV FS, shm swapping, memory management fixes |
1272 | S: 17 rue Danton | 1272 | S: 17 rue Danton |
1273 | S: F - 94270 Le Kremlin-Bicรชtre | 1273 | S: F - 94270 Le Kremlin-Bicรชtre |
1274 | S: France | 1274 | S: France |
1275 | 1275 | ||
1276 | N: Greg Hankins | 1276 | N: Greg Hankins |
1277 | E: gregh@cc.gatech.edu | 1277 | E: gregh@cc.gatech.edu |
1278 | D: fixed keyboard driver to separate LED and locking status | 1278 | D: fixed keyboard driver to separate LED and locking status |
1279 | S: 25360 Georgia Tech Station | 1279 | S: 25360 Georgia Tech Station |
1280 | S: Atlanta, Georgia 30332 | 1280 | S: Atlanta, Georgia 30332 |
1281 | S: USA | 1281 | S: USA |
1282 | 1282 | ||
1283 | N: Brad Hards | 1283 | N: Brad Hards |
1284 | E: bradh@frogmouth.net | 1284 | E: bradh@frogmouth.net |
1285 | D: Various USB bits, other minor patches | 1285 | D: Various USB bits, other minor patches |
1286 | 1286 | ||
1287 | N: Angelo Haritsis | 1287 | N: Angelo Haritsis |
1288 | E: ah@computer.org | 1288 | E: ah@computer.org |
1289 | D: kernel patches (serial, watchdog) | 1289 | D: kernel patches (serial, watchdog) |
1290 | D: xringd, vuzkern, greekXfonts | 1290 | D: xringd, vuzkern, greekXfonts |
1291 | S: 77 Clarence Mews | 1291 | S: 77 Clarence Mews |
1292 | S: London SE16 1GD | 1292 | S: London SE16 1GD |
1293 | S: United Kingdom | 1293 | S: United Kingdom |
1294 | 1294 | ||
1295 | N: Jan Harkes | 1295 | N: Jan Harkes |
1296 | E: jaharkes@cs.cmu.edu | 1296 | E: jaharkes@cs.cmu.edu |
1297 | W: http://www.coda.cs.cmu.edu/ | 1297 | W: http://www.coda.cs.cmu.edu/ |
1298 | D: Coda file system | 1298 | D: Coda file system |
1299 | S: Computer Science Department | 1299 | S: Computer Science Department |
1300 | S: Carnegie Mellon University | 1300 | S: Carnegie Mellon University |
1301 | S: 5000 Forbes Avenue | 1301 | S: 5000 Forbes Avenue |
1302 | S: Pittsburgh, Pennsylvania 15213 | 1302 | S: Pittsburgh, Pennsylvania 15213 |
1303 | S: USA | 1303 | S: USA |
1304 | 1304 | ||
1305 | N: Kai Harrekilde-Petersen | 1305 | N: Kai Harrekilde-Petersen |
1306 | E: kai.harrekilde@get2net.dk | 1306 | E: kai.harrekilde@get2net.dk |
1307 | D: Original author of the ftape-HOWTO, i82078 fdc detection code. | 1307 | D: Original author of the ftape-HOWTO, i82078 fdc detection code. |
1308 | 1308 | ||
1309 | N: Bart Hartgers | 1309 | N: Bart Hartgers |
1310 | E: bart@etpmod.phys.tue.nl | 1310 | E: bart@etpmod.phys.tue.nl |
1311 | D: MTRR emulation with Centaur MCRs | 1311 | D: MTRR emulation with Centaur MCRs |
1312 | S: Gen Stedmanstraat 212 | 1312 | S: Gen Stedmanstraat 212 |
1313 | S: 5623 HZ Eindhoven | 1313 | S: 5623 HZ Eindhoven |
1314 | S: The Netherlands | 1314 | S: The Netherlands |
1315 | 1315 | ||
1316 | N: Andrew Haylett | 1316 | N: Andrew Haylett |
1317 | E: ajh@primag.co.uk | 1317 | E: ajh@primag.co.uk |
1318 | D: Selection mechanism | 1318 | D: Selection mechanism |
1319 | 1319 | ||
1320 | N: Andre Hedrick | 1320 | N: Andre Hedrick |
1321 | E: andre@linux-ide.org | 1321 | E: andre@linux-ide.org |
1322 | E: andre@linuxdiskcert.org | 1322 | E: andre@linuxdiskcert.org |
1323 | W: http://www.linux-ide.org/ | 1323 | W: http://www.linux-ide.org/ |
1324 | W: http://www.linuxdiskcert.org/ | 1324 | W: http://www.linuxdiskcert.org/ |
1325 | D: Random SMP kernel hacker... | 1325 | D: Random SMP kernel hacker... |
1326 | D: Uniform Multi-Platform E-IDE driver | 1326 | D: Uniform Multi-Platform E-IDE driver |
1327 | D: Active-ATA-Chipset maddness.......... | 1327 | D: Active-ATA-Chipset maddness.......... |
1328 | D: Ultra DMA 133/100/66/33 w/48-bit Addressing | 1328 | D: Ultra DMA 133/100/66/33 w/48-bit Addressing |
1329 | D: ATA-Disconnect, ATA-TCQ | 1329 | D: ATA-Disconnect, ATA-TCQ |
1330 | D: ATA-Smart Kernel Daemon | 1330 | D: ATA-Smart Kernel Daemon |
1331 | D: Serial ATA | 1331 | D: Serial ATA |
1332 | D: ATA Command Block and Taskfile | 1332 | D: ATA Command Block and Taskfile |
1333 | S: Linux ATA Development (LAD) | 1333 | S: Linux ATA Development (LAD) |
1334 | S: Concord, CA | 1334 | S: Concord, CA |
1335 | 1335 | ||
1336 | N: Jochen Hein | 1336 | N: Jochen Hein |
1337 | E: jochen@jochen.org | 1337 | E: jochen@jochen.org |
1338 | P: 1024/4A27F015 25 72 FB E3 85 9F DE 3B CB 0A DA DA 40 77 05 6C | 1338 | P: 1024/4A27F015 25 72 FB E3 85 9F DE 3B CB 0A DA DA 40 77 05 6C |
1339 | P: 1024D/77D4FC9B F5C5 1C20 1DFC DEC3 3107 54A4 2332 ADFC 77D4 FC9B | 1339 | P: 1024D/77D4FC9B F5C5 1C20 1DFC DEC3 3107 54A4 2332 ADFC 77D4 FC9B |
1340 | D: National Language Support | 1340 | D: National Language Support |
1341 | D: Linux Internationalization Project | 1341 | D: Linux Internationalization Project |
1342 | D: German Localization for Linux and GNU software | 1342 | D: German Localization for Linux and GNU software |
1343 | S: Kriemhildring 12a | 1343 | S: Kriemhildring 12a |
1344 | S: 65795 Hattersheim am Main | 1344 | S: 65795 Hattersheim am Main |
1345 | S: Germany | 1345 | S: Germany |
1346 | 1346 | ||
1347 | N: Christoph Hellwig | 1347 | N: Christoph Hellwig |
1348 | E: hch@infradead.org | 1348 | E: hch@infradead.org |
1349 | D: all kinds of driver, filesystem & core kernel hacking | 1349 | D: all kinds of driver, filesystem & core kernel hacking |
1350 | D: freevxfs driver | 1350 | D: freevxfs driver |
1351 | D: sysvfs maintainer | 1351 | D: sysvfs maintainer |
1352 | D: chief codingstyle nitpicker | 1352 | D: chief codingstyle nitpicker |
1353 | S: Ampferstr. 50 / 4 | 1353 | S: Ampferstr. 50 / 4 |
1354 | S: 6020 Innsbruck | 1354 | S: 6020 Innsbruck |
1355 | S: Austria | 1355 | S: Austria |
1356 | 1356 | ||
1357 | N: Richard Henderson | 1357 | N: Richard Henderson |
1358 | E: rth@twiddle.net | 1358 | E: rth@twiddle.net |
1359 | E: rth@cygnus.com | 1359 | E: rth@cygnus.com |
1360 | D: Alpha hacker, kernel and userland | 1360 | D: Alpha hacker, kernel and userland |
1361 | S: 1668 California St. | 1361 | S: 1668 California St. |
1362 | S: Mountain View, California 94041 | 1362 | S: Mountain View, California 94041 |
1363 | S: USA | 1363 | S: USA |
1364 | 1364 | ||
1365 | N: Benjamin Herrenschmidt | 1365 | N: Benjamin Herrenschmidt |
1366 | E: benh@kernel.crashing.org | 1366 | E: benh@kernel.crashing.org |
1367 | D: Various parts of PPC/PPC64 & PowerMac | 1367 | D: Various parts of PPC/PPC64 & PowerMac |
1368 | S: 312/107 Canberra Avenue | 1368 | S: 312/107 Canberra Avenue |
1369 | S: Griffith, ACT 2603 | 1369 | S: Griffith, ACT 2603 |
1370 | S: Australia | 1370 | S: Australia |
1371 | 1371 | ||
1372 | N: Sebastian Hetze | 1372 | N: Sebastian Hetze |
1373 | E: she@lunetix.de | 1373 | E: she@lunetix.de |
1374 | D: German Linux Documentation, | 1374 | D: German Linux Documentation, |
1375 | D: Organization of German Linux Conferences | 1375 | D: Organization of German Linux Conferences |
1376 | S: Danckelmannstr. 48 | 1376 | S: Danckelmannstr. 48 |
1377 | S: 14059 Berlin | 1377 | S: 14059 Berlin |
1378 | S: Germany | 1378 | S: Germany |
1379 | 1379 | ||
1380 | N: David Hinds | 1380 | N: David Hinds |
1381 | E: dahinds@users.sourceforge.net | 1381 | E: dahinds@users.sourceforge.net |
1382 | W: http://tao.stanford.edu/~dhinds | 1382 | W: http://tao.stanford.edu/~dhinds |
1383 | D: PCMCIA and CardBus stuff, PCMCIA-HOWTO, PCMCIA client drivers | 1383 | D: PCMCIA and CardBus stuff, PCMCIA-HOWTO, PCMCIA client drivers |
1384 | S: 2019 W. Middlefield Rd #1 | 1384 | S: 2019 W. Middlefield Rd #1 |
1385 | S: Mountain View, CA 94043 | 1385 | S: Mountain View, CA 94043 |
1386 | S: USA | 1386 | S: USA |
1387 | 1387 | ||
1388 | N: Michael Hipp | 1388 | N: Michael Hipp |
1389 | E: hippm@informatik.uni-tuebingen.de | 1389 | E: hippm@informatik.uni-tuebingen.de |
1390 | D: drivers for the racal ni5210 & ni6510 Ethernet-boards | 1390 | D: drivers for the racal ni5210 & ni6510 Ethernet-boards |
1391 | S: Talstr. 1 | 1391 | S: Talstr. 1 |
1392 | S: D - 72072 Tuebingen | 1392 | S: D - 72072 Tuebingen |
1393 | S: Germany | 1393 | S: Germany |
1394 | 1394 | ||
1395 | N: Richard Hirst | 1395 | N: Richard Hirst |
1396 | E: richard@sleepie.demon.co.uk | 1396 | E: richard@sleepie.demon.co.uk |
1397 | E: rhirst@linuxcare.com | 1397 | E: rhirst@linuxcare.com |
1398 | W: http://www.sleepie.demon.co.uk/ | 1398 | W: http://www.sleepie.demon.co.uk/ |
1399 | D: linux-m68k VME support | 1399 | D: linux-m68k VME support |
1400 | D: PA-RISC port, scsi and network drivers | 1400 | D: PA-RISC port, scsi and network drivers |
1401 | D: 53c700/53c710 driver author, 82596 driver maintainer | 1401 | D: 53c700/53c710 driver author, 82596 driver maintainer |
1402 | S: United Kingdom | 1402 | S: United Kingdom |
1403 | 1403 | ||
1404 | N: Jauder Ho | 1404 | N: Jauder Ho |
1405 | E: jauderho@carumba.com | 1405 | E: jauderho@carumba.com |
1406 | W: http://www.carumba.com/ | 1406 | W: http://www.carumba.com/ |
1407 | D: bug toaster (A1 sauce makes all the difference) | 1407 | D: bug toaster (A1 sauce makes all the difference) |
1408 | D: Random linux hacker | 1408 | D: Random linux hacker |
1409 | 1409 | ||
1410 | N: Tim Hockin | 1410 | N: Tim Hockin |
1411 | E: thockin@hockin.org | 1411 | E: thockin@hockin.org |
1412 | W: http://www.hockin.org/~thockin | 1412 | W: http://www.hockin.org/~thockin |
1413 | D: Natsemi ethernet | 1413 | D: Natsemi ethernet |
1414 | D: Cobalt Networks (x86) support | 1414 | D: Cobalt Networks (x86) support |
1415 | D: This-and-That | 1415 | D: This-and-That |
1416 | 1416 | ||
1417 | N: Dirk Hohndel | 1417 | N: Dirk Hohndel |
1418 | E: hohndel@suse.de | 1418 | E: hohndel@suse.de |
1419 | D: The XFree86[tm] Project | 1419 | D: The XFree86[tm] Project |
1420 | D: USB mouse maintainer | 1420 | D: USB mouse maintainer |
1421 | S: SuSE Rhein/Main AG | 1421 | S: SuSE Rhein/Main AG |
1422 | S: Mergenthalerallee 45-47 | 1422 | S: Mergenthalerallee 45-47 |
1423 | S: 65760 Eschborn | 1423 | S: 65760 Eschborn |
1424 | S: Germany | 1424 | S: Germany |
1425 | 1425 | ||
1426 | N: Kenji Hollis | 1426 | N: Kenji Hollis |
1427 | E: kenji@bitgate.com | 1427 | E: kenji@bitgate.com |
1428 | W: http://www.bitgate.com/ | 1428 | W: http://www.bitgate.com/ |
1429 | D: Berkshire PC Watchdog Driver | 1429 | D: Berkshire PC Watchdog Driver |
1430 | D: Small/Industrial Driver Project | 1430 | D: Small/Industrial Driver Project |
1431 | 1431 | ||
1432 | N: Nick Holloway | 1432 | N: Nick Holloway |
1433 | E: Nick.Holloway@pyrites.org.uk | 1433 | E: Nick.Holloway@pyrites.org.uk |
1434 | W: http://www.pyrites.org.uk/ | 1434 | W: http://www.pyrites.org.uk/ |
1435 | P: 1024/36115A04 F4E1 3384 FCFD C055 15D6 BA4C AB03 FBF8 3611 5A04 | 1435 | P: 1024/36115A04 F4E1 3384 FCFD C055 15D6 BA4C AB03 FBF8 3611 5A04 |
1436 | D: Occasional Linux hacker... | 1436 | D: Occasional Linux hacker... |
1437 | S: (ask for current address) | 1437 | S: (ask for current address) |
1438 | S: United Kingdom | 1438 | S: United Kingdom |
1439 | 1439 | ||
1440 | N: Ron Holt | 1440 | N: Ron Holt |
1441 | E: ron@holt.org | 1441 | E: ron@holt.org |
1442 | E: rholt@netcom.com | 1442 | E: rholt@netcom.com |
1443 | W: http://www.holt.org/ | 1443 | W: http://www.holt.org/ |
1444 | W: http://www.ronholt.com/ | 1444 | W: http://www.ronholt.com/ |
1445 | D: Kernel development | 1445 | D: Kernel development |
1446 | D: Kernel LDT modifications to support Wabi and Wine | 1446 | D: Kernel LDT modifications to support Wabi and Wine |
1447 | S: Holtron Internetics, Inc. | 1447 | S: Holtron Internetics, Inc. |
1448 | S: 998 East 900 South, Suite 26 | 1448 | S: 998 East 900 South, Suite 26 |
1449 | S: Provo, Utah 84606-5607 | 1449 | S: Provo, Utah 84606-5607 |
1450 | S: USA | 1450 | S: USA |
1451 | 1451 | ||
1452 | N: Marcel Holtmann | 1452 | N: Marcel Holtmann |
1453 | E: marcel@holtmann.org | 1453 | E: marcel@holtmann.org |
1454 | W: http://www.holtmann.org | 1454 | W: http://www.holtmann.org |
1455 | D: Maintainer of the Linux Bluetooth Subsystem | 1455 | D: Maintainer of the Linux Bluetooth Subsystem |
1456 | D: Author and maintainer of the various Bluetooth HCI drivers | 1456 | D: Author and maintainer of the various Bluetooth HCI drivers |
1457 | D: Author and maintainer of the CAPI message transport protocol driver | 1457 | D: Author and maintainer of the CAPI message transport protocol driver |
1458 | D: Author and maintainer of the Bluetooth HID protocol driver | 1458 | D: Author and maintainer of the Bluetooth HID protocol driver |
1459 | D: Various other Bluetooth related patches, cleanups and fixes | 1459 | D: Various other Bluetooth related patches, cleanups and fixes |
1460 | S: Germany | 1460 | S: Germany |
1461 | 1461 | ||
1462 | N: Rob W. W. Hooft | 1462 | N: Rob W. W. Hooft |
1463 | E: hooft@EMBL-Heidelberg.DE | 1463 | E: hooft@EMBL-Heidelberg.DE |
1464 | D: Shared libs for graphics-tools and for the f2c compiler | 1464 | D: Shared libs for graphics-tools and for the f2c compiler |
1465 | D: Some kernel programming on the floppy and sound drivers in early days | 1465 | D: Some kernel programming on the floppy and sound drivers in early days |
1466 | D: Some other hacks to get different kinds of programs to work for linux | 1466 | D: Some other hacks to get different kinds of programs to work for linux |
1467 | S: Panoramastrasse 18 | 1467 | S: Panoramastrasse 18 |
1468 | S: D-69126 Heidelberg | 1468 | S: D-69126 Heidelberg |
1469 | S: Germany | 1469 | S: Germany |
1470 | 1470 | ||
1471 | N: Christopher Horn | 1471 | N: Christopher Horn |
1472 | E: chorn@warwick.net | 1472 | E: chorn@warwick.net |
1473 | D: Miscellaneous sysctl hacks | 1473 | D: Miscellaneous sysctl hacks |
1474 | S: 36 Mudtown Road | 1474 | S: 36 Mudtown Road |
1475 | S: Wantage, New Jersey 07461 | 1475 | S: Wantage, New Jersey 07461 |
1476 | S: USA | 1476 | S: USA |
1477 | 1477 | ||
1478 | N: Harald Hoyer | 1478 | N: Harald Hoyer |
1479 | E: harald.hoyer@parzelle.de | 1479 | E: harald.hoyer@parzelle.de |
1480 | W: http://parzelle.de/ | 1480 | W: http://parzelle.de/ |
1481 | D: ip_masq_quake | 1481 | D: ip_masq_quake |
1482 | D: md boot support | 1482 | D: md boot support |
1483 | S: Hohe Strasse 30 | 1483 | S: Hohe Strasse 30 |
1484 | S: D-70176 Stuttgart | 1484 | S: D-70176 Stuttgart |
1485 | S: Germany | 1485 | S: Germany |
1486 | 1486 | ||
1487 | N: Jan Hubicka | 1487 | N: Jan Hubicka |
1488 | E: hubicka@freesoft.cz | 1488 | E: hubicka@freesoft.cz |
1489 | E: hubicka@suse.cz | 1489 | E: hubicka@suse.cz |
1490 | W: http://www.paru.cas.cz/~hubicka/ | 1490 | W: http://www.paru.cas.cz/~hubicka/ |
1491 | D: Random kernel tweaks and fixes. | 1491 | D: Random kernel tweaks and fixes. |
1492 | S: Dukelskych bojovniku 1944 | 1492 | S: Dukelskych bojovniku 1944 |
1493 | S: Tabor 390 03 | 1493 | S: Tabor 390 03 |
1494 | S: Czech Republic | 1494 | S: Czech Republic |
1495 | 1495 | ||
1496 | N: David Huggins-Daines | 1496 | N: David Huggins-Daines |
1497 | E: dhd@debian.org | 1497 | E: dhd@debian.org |
1498 | E: dhd@eradicator.org | 1498 | E: dhd@eradicator.org |
1499 | E: dhd@cepstral.com | 1499 | E: dhd@cepstral.com |
1500 | D: PA-RISC port | 1500 | D: PA-RISC port |
1501 | D: Nubus subsystem | 1501 | D: Nubus subsystem |
1502 | D: Generic 68k Macintosh framebuffer driver | 1502 | D: Generic 68k Macintosh framebuffer driver |
1503 | D: STI framebuffer tweaks | 1503 | D: STI framebuffer tweaks |
1504 | D: LTPC driver tweaks | 1504 | D: LTPC driver tweaks |
1505 | S: 110 S. 12th St., Apt. A | 1505 | S: 110 S. 12th St., Apt. A |
1506 | S: Pittsburgh, PA 15203-1250 | 1506 | S: Pittsburgh, PA 15203-1250 |
1507 | S: USA | 1507 | S: USA |
1508 | 1508 | ||
1509 | N: Gareth Hughes | 1509 | N: Gareth Hughes |
1510 | E: gareth.hughes@acm.org | 1510 | E: gareth.hughes@acm.org |
1511 | D: Pentium III FXSR, SSE support | 1511 | D: Pentium III FXSR, SSE support |
1512 | D: Author/maintainer of most DRM drivers (especially ATI, MGA) | 1512 | D: Author/maintainer of most DRM drivers (especially ATI, MGA) |
1513 | D: Core DRM templates, general DRM and 3D-related hacking | 1513 | D: Core DRM templates, general DRM and 3D-related hacking |
1514 | S: No fixed address | 1514 | S: No fixed address |
1515 | 1515 | ||
1516 | N: Kenn Humborg | 1516 | N: Kenn Humborg |
1517 | E: kenn@wombat.ie | 1517 | E: kenn@wombat.ie |
1518 | D: Mods to loop device to support sparse backing files | 1518 | D: Mods to loop device to support sparse backing files |
1519 | S: Ballinagard | 1519 | S: Ballinagard |
1520 | S: Roscommon | 1520 | S: Roscommon |
1521 | S: Ireland | 1521 | S: Ireland |
1522 | 1522 | ||
1523 | N: Michael Hunold | 1523 | N: Michael Hunold |
1524 | E: michael@mihu.de | 1524 | E: michael@mihu.de |
1525 | W: http://www.mihu.de/linux/ | 1525 | W: http://www.mihu.de/linux/ |
1526 | D: Generic saa7146 video4linux-2 driver core, | 1526 | D: Generic saa7146 video4linux-2 driver core, |
1527 | D: Driver for the "Multimedia eXtension Board", "dpc7146", | 1527 | D: Driver for the "Multimedia eXtension Board", "dpc7146", |
1528 | D: "Hexium Orion", "Hexium Gemini" | 1528 | D: "Hexium Orion", "Hexium Gemini" |
1529 | 1529 | ||
1530 | N: Miguel de Icaza Amozurrutia | 1530 | N: Miguel de Icaza Amozurrutia |
1531 | E: miguel@nuclecu.unam.mx | 1531 | E: miguel@nuclecu.unam.mx |
1532 | D: Linux/SPARC team, Midnight Commander maintainer | 1532 | D: Linux/SPARC team, Midnight Commander maintainer |
1533 | S: Avenida Copilco 162, 22-1003 | 1533 | S: Avenida Copilco 162, 22-1003 |
1534 | S: Mexico, DF | 1534 | S: Mexico, DF |
1535 | S: Mexico | 1535 | S: Mexico |
1536 | 1536 | ||
1537 | N: Ian Jackson | 1537 | N: Ian Jackson |
1538 | E: iwj10@cus.cam.ac.uk | 1538 | E: iwj10@cus.cam.ac.uk |
1539 | E: ijackson@nyx.cs.du.edu | 1539 | E: ijackson@nyx.cs.du.edu |
1540 | D: FAQ maintainer and poster of the daily postings | 1540 | D: FAQ maintainer and poster of the daily postings |
1541 | D: FSSTND group member | 1541 | D: FSSTND group member |
1542 | D: Debian core team member and maintainer of several Debian packages | 1542 | D: Debian core team member and maintainer of several Debian packages |
1543 | S: 2 Lexington Close | 1543 | S: 2 Lexington Close |
1544 | S: Cambridge | 1544 | S: Cambridge |
1545 | S: CB3 0DS | 1545 | S: CB3 0DS |
1546 | S: United Kingdom | 1546 | S: United Kingdom |
1547 | 1547 | ||
1548 | N: Andreas Jaeger | 1548 | N: Andreas Jaeger |
1549 | E: aj@suse.de | 1549 | E: aj@suse.de |
1550 | D: Various smaller kernel fixes | 1550 | D: Various smaller kernel fixes |
1551 | D: glibc developer | 1551 | D: glibc developer |
1552 | S: Gottfried-Kinkel-Str. 18 | 1552 | S: Gottfried-Kinkel-Str. 18 |
1553 | S: D 67659 Kaiserslautern | 1553 | S: D 67659 Kaiserslautern |
1554 | S: Germany | 1554 | S: Germany |
1555 | 1555 | ||
1556 | N: Mike Jagdis | 1556 | N: Mike Jagdis |
1557 | E: jaggy@purplet.demon.co.uk | 1557 | E: jaggy@purplet.demon.co.uk |
1558 | E: Mike.Jagdis@purplet.demon.co.uk | 1558 | E: Mike.Jagdis@purplet.demon.co.uk |
1559 | D: iBCS personalities, socket and X interfaces, x.out loader, syscalls... | 1559 | D: iBCS personalities, socket and X interfaces, x.out loader, syscalls... |
1560 | D: Purple Distribution maintainer | 1560 | D: Purple Distribution maintainer |
1561 | D: UK FidoNet support | 1561 | D: UK FidoNet support |
1562 | D: ISODE && PP | 1562 | D: ISODE && PP |
1563 | D: Kernel and device driver hacking | 1563 | D: Kernel and device driver hacking |
1564 | S: 280 Silverdale Road | 1564 | S: 280 Silverdale Road |
1565 | S: Earley | 1565 | S: Earley |
1566 | S: Reading | 1566 | S: Reading |
1567 | S: RG6 2NU | 1567 | S: RG6 2NU |
1568 | S: United Kingdom | 1568 | S: United Kingdom |
1569 | 1569 | ||
1570 | N: Jakub Jelinek | 1570 | N: Jakub Jelinek |
1571 | E: jakub@redhat.com | 1571 | E: jakub@redhat.com |
1572 | W: http://sunsite.mff.cuni.cz/~jj | 1572 | W: http://sunsite.mff.cuni.cz/~jj |
1573 | P: 1024/0F7623C5 53 95 71 3C EB 73 99 97 02 49 40 47 F9 19 68 20 | 1573 | P: 1024/0F7623C5 53 95 71 3C EB 73 99 97 02 49 40 47 F9 19 68 20 |
1574 | D: Sparc hacker, SILO, mc | 1574 | D: Sparc hacker, SILO, mc |
1575 | D: Maintain sunsite.mff.cuni.cz | 1575 | D: Maintain sunsite.mff.cuni.cz |
1576 | S: K osmidomkum 723 | 1576 | S: K osmidomkum 723 |
1577 | S: 160 00 Praha 6 | 1577 | S: 160 00 Praha 6 |
1578 | S: Czech Republic | 1578 | S: Czech Republic |
1579 | 1579 | ||
1580 | N: Niels Kristian Bech Jensen | 1580 | N: Niels Kristian Bech Jensen |
1581 | E: nkbj1970@hotmail.com | 1581 | E: nkbj1970@hotmail.com |
1582 | D: Miscellaneous kernel updates and fixes. | 1582 | D: Miscellaneous kernel updates and fixes. |
1583 | 1583 | ||
1584 | N: Michael K. Johnson | 1584 | N: Michael K. Johnson |
1585 | E: johnsonm@redhat.com | 1585 | E: johnsonm@redhat.com |
1586 | W: http://www.redhat.com/~johnsonm | 1586 | W: http://www.redhat.com/~johnsonm |
1587 | P: 1024/4536A8DD 2A EC 88 08 40 64 CE D8 DD F8 12 2B 61 43 83 15 | 1587 | P: 1024/4536A8DD 2A EC 88 08 40 64 CE D8 DD F8 12 2B 61 43 83 15 |
1588 | D: The Linux Documentation Project | 1588 | D: The Linux Documentation Project |
1589 | D: Kernel Hackers' Guide | 1589 | D: Kernel Hackers' Guide |
1590 | D: Procps | 1590 | D: Procps |
1591 | D: Proc filesystem | 1591 | D: Proc filesystem |
1592 | D: Maintain tsx-11.mit.edu | 1592 | D: Maintain tsx-11.mit.edu |
1593 | D: LP driver | 1593 | D: LP driver |
1594 | S: 201 Howell Street, Apartment 1C | 1594 | S: 201 Howell Street, Apartment 1C |
1595 | S: Chapel Hill, North Carolina 27514-4818 | 1595 | S: Chapel Hill, North Carolina 27514-4818 |
1596 | S: USA | 1596 | S: USA |
1597 | 1597 | ||
1598 | N: Dave Jones | 1598 | N: Dave Jones |
1599 | E: davej@codemonkey.org.uk | 1599 | E: davej@codemonkey.org.uk |
1600 | W: http://www.codemonkey.org.uk | 1600 | W: http://www.codemonkey.org.uk |
1601 | D: x86 errata/setup maintenance. | 1601 | D: x86 errata/setup maintenance. |
1602 | D: AGPGART driver. | 1602 | D: AGPGART driver. |
1603 | D: CPUFREQ maintenance. | 1603 | D: CPUFREQ maintenance. |
1604 | D: Backport/Forwardport merge monkey. | 1604 | D: Backport/Forwardport merge monkey. |
1605 | D: Various Janitor work. | 1605 | D: Various Janitor work. |
1606 | S: United Kingdom | 1606 | S: United Kingdom |
1607 | 1607 | ||
1608 | N: Martin Josfsson | 1608 | N: Martin Josfsson |
1609 | E: gandalf@wlug.westbo.se | 1609 | E: gandalf@wlug.westbo.se |
1610 | P: 1024D/F6B6D3B1 7610 7CED 5C34 4AA6 DBA2 8BE1 5A6D AF95 F6B6 D3B1 | 1610 | P: 1024D/F6B6D3B1 7610 7CED 5C34 4AA6 DBA2 8BE1 5A6D AF95 F6B6 D3B1 |
1611 | D: netfilter: SAME target | 1611 | D: netfilter: SAME target |
1612 | D: netfilter: helper target | 1612 | D: netfilter: helper target |
1613 | D: netfilter: various other hacks | 1613 | D: netfilter: various other hacks |
1614 | S: Ronneby | 1614 | S: Ronneby |
1615 | S: Sweden | 1615 | S: Sweden |
1616 | 1616 | ||
1617 | N: Ani Joshi | 1617 | N: Ani Joshi |
1618 | E: ajoshi@shell.unixbox.com | 1618 | E: ajoshi@shell.unixbox.com |
1619 | D: fbdev hacking | 1619 | D: fbdev hacking |
1620 | 1620 | ||
1621 | N: Jesper Juhl | 1621 | N: Jesper Juhl |
1622 | E: jesper.juhl@gmail.com | 1622 | E: jesper.juhl@gmail.com |
1623 | D: Various fixes, cleanups and minor features all over the tree. | 1623 | D: Various fixes, cleanups and minor features all over the tree. |
1624 | D: Wrote initial version of the hdaps driver (since passed on to others). | 1624 | D: Wrote initial version of the hdaps driver (since passed on to others). |
1625 | S: Lemnosvej 1, 3.tv | 1625 | S: Lemnosvej 1, 3.tv |
1626 | S: 2300 Copenhagen S. | 1626 | S: 2300 Copenhagen S. |
1627 | S: Denmark | 1627 | S: Denmark |
1628 | 1628 | ||
1629 | N: Jozsef Kadlecsik | 1629 | N: Jozsef Kadlecsik |
1630 | E: kadlec@blackhole.kfki.hu | 1630 | E: kadlec@blackhole.kfki.hu |
1631 | P: 1024D/470DB964 4CB3 1A05 713E 9BF7 FAC5 5809 DD8C B7B1 470D B964 | 1631 | P: 1024D/470DB964 4CB3 1A05 713E 9BF7 FAC5 5809 DD8C B7B1 470D B964 |
1632 | D: netfilter: TCP window tracking code | 1632 | D: netfilter: TCP window tracking code |
1633 | D: netfilter: raw table | 1633 | D: netfilter: raw table |
1634 | D: netfilter: iprange match | 1634 | D: netfilter: iprange match |
1635 | D: netfilter: new logging interfaces | 1635 | D: netfilter: new logging interfaces |
1636 | D: netfilter: various other hacks | 1636 | D: netfilter: various other hacks |
1637 | S: Tata | 1637 | S: Tata |
1638 | S: Hungary | 1638 | S: Hungary |
1639 | 1639 | ||
1640 | N: Bernhard Kaindl | 1640 | N: Bernhard Kaindl |
1641 | E: bkaindl@netway.at | 1641 | E: bkaindl@netway.at |
1642 | E: edv@bartelt.via.at | 1642 | E: edv@bartelt.via.at |
1643 | D: Author of a menu based configuration tool, kmenu, which | 1643 | D: Author of a menu based configuration tool, kmenu, which |
1644 | D: is the predecessor of 'make menuconfig' and 'make xconfig'. | 1644 | D: is the predecessor of 'make menuconfig' and 'make xconfig'. |
1645 | D: digiboard driver update(modularisation work and 2.1.x upd) | 1645 | D: digiboard driver update(modularisation work and 2.1.x upd) |
1646 | S: Tallak 95 | 1646 | S: Tallak 95 |
1647 | S: 8103 Rein | 1647 | S: 8103 Rein |
1648 | S: Austria | 1648 | S: Austria |
1649 | 1649 | ||
1650 | N: Mitsuru Kanda | 1650 | N: Mitsuru Kanda |
1651 | E: mk@linux-ipv6.org | 1651 | E: mk@linux-ipv6.org |
1652 | E: mk@isl.rdc.toshiba.co.jp | 1652 | E: mk@isl.rdc.toshiba.co.jp |
1653 | E: mk@karaba.org | 1653 | E: mk@karaba.org |
1654 | W: http://www.karaba.org/~mk/ | 1654 | W: http://www.karaba.org/~mk/ |
1655 | P: 1024D/2EC7E30D 4DC3 949B 5A6C F0D6 375F 4472 8888 A8E1 2EC7 E30D | 1655 | P: 1024D/2EC7E30D 4DC3 949B 5A6C F0D6 375F 4472 8888 A8E1 2EC7 E30D |
1656 | D: IPsec, IPv6 | 1656 | D: IPsec, IPv6 |
1657 | D: USAGI/WIDE Project, TOSHIBA CORPORATION | 1657 | D: USAGI/WIDE Project, TOSHIBA CORPORATION |
1658 | S: 2-47-8, Takinogawa, | 1658 | S: 2-47-8, Takinogawa, |
1659 | S: Kita, Tokyo 114-0023 | 1659 | S: Kita, Tokyo 114-0023 |
1660 | S: Japan | 1660 | S: Japan |
1661 | 1661 | ||
1662 | N: Jan Kara | 1662 | N: Jan Kara |
1663 | E: jack@atrey.karlin.mff.cuni.cz | 1663 | E: jack@atrey.karlin.mff.cuni.cz |
1664 | E: jack@suse.cz | 1664 | E: jack@suse.cz |
1665 | D: Quota fixes for 2.2 kernel | 1665 | D: Quota fixes for 2.2 kernel |
1666 | D: Quota fixes for 2.3 kernel | 1666 | D: Quota fixes for 2.3 kernel |
1667 | D: Few other fixes in filesystem area (buffer cache, isofs, loopback) | 1667 | D: Few other fixes in filesystem area (buffer cache, isofs, loopback) |
1668 | W: http://atrey.karlin.mff.cuni.cz/~jack/ | 1668 | W: http://atrey.karlin.mff.cuni.cz/~jack/ |
1669 | S: Krosenska' 543 | 1669 | S: Krosenska' 543 |
1670 | S: 181 00 Praha 8 | 1670 | S: 181 00 Praha 8 |
1671 | S: Czech Republic | 1671 | S: Czech Republic |
1672 | 1672 | ||
1673 | N: Jan "Yenya" Kasprzak | 1673 | N: Jan "Yenya" Kasprzak |
1674 | E: kas@fi.muni.cz | 1674 | E: kas@fi.muni.cz |
1675 | D: Author of the COSA/SRP sync serial board driver. | 1675 | D: Author of the COSA/SRP sync serial board driver. |
1676 | D: Port of the syncppp.c from the 2.0 to the 2.1 kernel. | 1676 | D: Port of the syncppp.c from the 2.0 to the 2.1 kernel. |
1677 | P: 1024/D3498839 0D 99 A7 FB 20 66 05 D7 8B 35 FC DE 05 B1 8A 5E | 1677 | P: 1024/D3498839 0D 99 A7 FB 20 66 05 D7 8B 35 FC DE 05 B1 8A 5E |
1678 | W: http://www.fi.muni.cz/~kas/ | 1678 | W: http://www.fi.muni.cz/~kas/ |
1679 | S: c/o Faculty of Informatics, Masaryk University | 1679 | S: c/o Faculty of Informatics, Masaryk University |
1680 | S: Botanicka' 68a | 1680 | S: Botanicka' 68a |
1681 | S: 602 00 Brno | 1681 | S: 602 00 Brno |
1682 | S: Czech Republic | 1682 | S: Czech Republic |
1683 | 1683 | ||
1684 | N: Jakob Kemi | 1684 | N: Jakob Kemi |
1685 | E: jakob.kemi@telia.com | 1685 | E: jakob.kemi@telia.com |
1686 | D: V4L W9966 Webcam driver | 1686 | D: V4L W9966 Webcam driver |
1687 | S: Forsbyvรคgen 33 | 1687 | S: Forsbyvรคgen 33 |
1688 | S: 74143 Knivsta | 1688 | S: 74143 Knivsta |
1689 | S: Sweden | 1689 | S: Sweden |
1690 | 1690 | ||
1691 | N: Fred N. van Kempen | 1691 | N: Fred N. van Kempen |
1692 | E: waltje@linux.com | 1692 | E: waltje@linux.com |
1693 | D: NET-2 | 1693 | D: NET-2 |
1694 | D: Drivers | 1694 | D: Drivers |
1695 | D: Kernel cleanups | 1695 | D: Kernel cleanups |
1696 | S: Korte Heul 95 | 1696 | S: Korte Heul 95 |
1697 | S: 1403 ND BUSSUM | 1697 | S: 1403 ND BUSSUM |
1698 | S: The Netherlands | 1698 | S: The Netherlands |
1699 | 1699 | ||
1700 | N: Karl Keyte | 1700 | N: Karl Keyte |
1701 | E: karl@koft.com | 1701 | E: karl@koft.com |
1702 | D: Disk usage statistics and modifications to line printer driver | 1702 | D: Disk usage statistics and modifications to line printer driver |
1703 | S: 26a Sheen Road | 1703 | S: 26a Sheen Road |
1704 | S: Richmond | 1704 | S: Richmond |
1705 | S: Surrey | 1705 | S: Surrey |
1706 | S: TW9 1AE | 1706 | S: TW9 1AE |
1707 | S: United Kingdom | 1707 | S: United Kingdom |
1708 | 1708 | ||
1709 | N: Marko Kiiskila | 1709 | N: Marko Kiiskila |
1710 | E: marko@iprg.nokia.com | 1710 | E: marko@iprg.nokia.com |
1711 | D: Author of ATM Lan Emulation | 1711 | D: Author of ATM Lan Emulation |
1712 | S: 660 Harvard Ave. #7 | 1712 | S: 660 Harvard Ave. #7 |
1713 | S: Santa Clara, CA 95051 | 1713 | S: Santa Clara, CA 95051 |
1714 | S: USA | 1714 | S: USA |
1715 | 1715 | ||
1716 | N: Russell King | 1716 | N: Russell King |
1717 | E: rmk@arm.linux.org.uk | 1717 | E: rmk@arm.linux.org.uk |
1718 | D: Linux/arm integrator, maintainer & hacker | 1718 | D: Linux/arm integrator, maintainer & hacker |
1719 | D: Acornfb, Cyber2000fb author | 1719 | D: Acornfb, Cyber2000fb author |
1720 | S: Burgh Heath, Tadworth, Surrey. | 1720 | S: Burgh Heath, Tadworth, Surrey. |
1721 | S: England | 1721 | S: England |
1722 | 1722 | ||
1723 | N: Olaf Kirch | 1723 | N: Olaf Kirch |
1724 | E: okir@monad.swb.de | 1724 | E: okir@monad.swb.de |
1725 | D: Author of the Linux Network Administrators' Guide | 1725 | D: Author of the Linux Network Administrators' Guide |
1726 | S: Kattreinstr 38 | 1726 | S: Kattreinstr 38 |
1727 | S: D-64295 | 1727 | S: D-64295 |
1728 | S: Germany | 1728 | S: Germany |
1729 | 1729 | ||
1730 | N: Andi Kleen | 1730 | N: Andi Kleen |
1731 | E: ak@muc.de | 1731 | E: ak@muc.de |
1732 | D: network hacker, syncookies | 1732 | D: network hacker, syncookies |
1733 | S: Schwalbenstr. 96 | 1733 | S: Schwalbenstr. 96 |
1734 | S: 85551 Ottobrunn | 1734 | S: 85551 Ottobrunn |
1735 | S: Germany | 1735 | S: Germany |
1736 | 1736 | ||
1737 | N: Ian Kluft | 1737 | N: Ian Kluft |
1738 | E: ikluft@thunder.sbay.org | 1738 | E: ikluft@thunder.sbay.org |
1739 | W: http://www.kluft.com/~ikluft/ | 1739 | W: http://www.kluft.com/~ikluft/ |
1740 | D: NET-1 beta testing & minor patches, original Smail binary packages for | 1740 | D: NET-1 beta testing & minor patches, original Smail binary packages for |
1741 | D: Slackware and Debian, vote-taker for 2nd comp.os.linux reorganization | 1741 | D: Slackware and Debian, vote-taker for 2nd comp.os.linux reorganization |
1742 | S: Post Office Box 611311 | 1742 | S: Post Office Box 611311 |
1743 | S: San Jose, California 95161-1311 | 1743 | S: San Jose, California 95161-1311 |
1744 | S: USA | 1744 | S: USA |
1745 | 1745 | ||
1746 | N: Thorsten Knabe | 1746 | N: Thorsten Knabe |
1747 | E: Thorsten Knabe <tek@rbg.informatik.tu-darmstadt.de> | 1747 | E: Thorsten Knabe <tek@rbg.informatik.tu-darmstadt.de> |
1748 | E: Thorsten Knabe <tek01@hrzpub.tu-darmstadt.de> | 1748 | E: Thorsten Knabe <tek01@hrzpub.tu-darmstadt.de> |
1749 | W: http://www.student.informatik.tu-darmstadt.de/~tek | 1749 | W: http://www.student.informatik.tu-darmstadt.de/~tek |
1750 | W: http://www.tu-darmstadt.de/~tek01 | 1750 | W: http://www.tu-darmstadt.de/~tek01 |
1751 | P: 1024/3BC8D885 8C 29 C5 0A C0 D1 D6 F4 20 D4 2D AB 29 F6 D0 60 | 1751 | P: 1024/3BC8D885 8C 29 C5 0A C0 D1 D6 F4 20 D4 2D AB 29 F6 D0 60 |
1752 | D: AD1816 sound driver | 1752 | D: AD1816 sound driver |
1753 | S: Am Bergfried 10 | 1753 | S: Am Bergfried 10 |
1754 | S: 63225 Langen | 1754 | S: 63225 Langen |
1755 | S: Germany | 1755 | S: Germany |
1756 | 1756 | ||
1757 | N: Alain L. Knaff | 1757 | N: Alain L. Knaff |
1758 | E: Alain.Knaff@lll.lu | 1758 | E: Alain.Knaff@lll.lu |
1759 | D: floppy driver | 1759 | D: floppy driver |
1760 | S: 19, rue Jean l'Aveugle | 1760 | S: 19, rue Jean l'Aveugle |
1761 | S: L-1148 Luxembourg-City | 1761 | S: L-1148 Luxembourg-City |
1762 | S: Luxembourg | 1762 | S: Luxembourg |
1763 | 1763 | ||
1764 | N: Gerd Knorr | 1764 | N: Gerd Knorr |
1765 | W: http://bytesex.org | 1765 | W: http://bytesex.org |
1766 | E: kraxel@bytesex.org | 1766 | E: kraxel@bytesex.org |
1767 | E: kraxel@suse.de | 1767 | E: kraxel@suse.de |
1768 | D: video4linux, bttv, vesafb, some scsi, misc fixes | 1768 | D: video4linux, bttv, vesafb, some scsi, misc fixes |
1769 | 1769 | ||
1770 | N: Harald Koenig | 1770 | N: Harald Koenig |
1771 | E: koenig@tat.physik.uni-tuebingen.de | 1771 | E: koenig@tat.physik.uni-tuebingen.de |
1772 | D: XFree86 (S3), DCF77, some kernel hacks and fixes | 1772 | D: XFree86 (S3), DCF77, some kernel hacks and fixes |
1773 | S: Koenigsberger Str. 90 | 1773 | S: Koenigsberger Str. 90 |
1774 | S: D-72336 Balingen | 1774 | S: D-72336 Balingen |
1775 | S: Germany | 1775 | S: Germany |
1776 | 1776 | ||
1777 | N: Rudolf Koenig | 1777 | N: Rudolf Koenig |
1778 | E: rfkoenig@immd4.informatik.uni-erlangen.de | 1778 | E: rfkoenig@immd4.informatik.uni-erlangen.de |
1779 | D: The Linux Support Team Erlangen | 1779 | D: The Linux Support Team Erlangen |
1780 | 1780 | ||
1781 | N: Andreas Koensgen | 1781 | N: Andreas Koensgen |
1782 | E: ajk@iehk.rwth-aachen.de | 1782 | E: ajk@iehk.rwth-aachen.de |
1783 | D: 6pack driver for AX.25 | 1783 | D: 6pack driver for AX.25 |
1784 | 1784 | ||
1785 | N: Harald Koerfgen | 1785 | N: Harald Koerfgen |
1786 | E: hkoerfg@web.de | 1786 | E: hkoerfg@web.de |
1787 | D: Linux/MIPS kernel hacks and fixes, | 1787 | D: Linux/MIPS kernel hacks and fixes, |
1788 | D: DECstation port, Sharp Mobilon port | 1788 | D: DECstation port, Sharp Mobilon port |
1789 | S: D-50931 Koeln | 1789 | S: D-50931 Koeln |
1790 | S: Germany | 1790 | S: Germany |
1791 | 1791 | ||
1792 | N: Willy Konynenberg | 1792 | N: Willy Konynenberg |
1793 | E: willy@xos.nl | 1793 | E: willy@xos.nl |
1794 | W: http://www.xos.nl/ | 1794 | W: http://www.xos.nl/ |
1795 | D: IP transparent proxy support | 1795 | D: IP transparent proxy support |
1796 | S: X/OS Experts in Open Systems BV | 1796 | S: X/OS Experts in Open Systems BV |
1797 | S: Kruislaan 419 | 1797 | S: Kruislaan 419 |
1798 | S: 1098 VA Amsterdam | 1798 | S: 1098 VA Amsterdam |
1799 | S: The Netherlands | 1799 | S: The Netherlands |
1800 | 1800 | ||
1801 | N: Gene Kozin | 1801 | N: Gene Kozin |
1802 | E: 74604.152@compuserve.com | 1802 | E: 74604.152@compuserve.com |
1803 | W: http://www.sangoma.com | 1803 | W: http://www.sangoma.com |
1804 | D: WAN Router & Sangoma WAN drivers | 1804 | D: WAN Router & Sangoma WAN drivers |
1805 | S: Sangoma Technologies Inc. | 1805 | S: Sangoma Technologies Inc. |
1806 | S: 7170 Warden Avenue, Unit 2 | 1806 | S: 7170 Warden Avenue, Unit 2 |
1807 | S: Markham, Ontario | 1807 | S: Markham, Ontario |
1808 | S: L3R 8B2 | 1808 | S: L3R 8B2 |
1809 | S: Canada | 1809 | S: Canada |
1810 | 1810 | ||
1811 | N: Maxim Krasnyansky | 1811 | N: Maxim Krasnyansky |
1812 | E: maxk@qualcomm.com | 1812 | E: maxk@qualcomm.com |
1813 | W: http://vtun.sf.net | 1813 | W: http://vtun.sf.net |
1814 | W: http://bluez.sf.net | 1814 | W: http://bluez.sf.net |
1815 | D: Author of the Universal TUN/TAP driver | 1815 | D: Author of the Universal TUN/TAP driver |
1816 | D: Author of the Linux Bluetooth Subsystem (BlueZ) | 1816 | D: Author of the Linux Bluetooth Subsystem (BlueZ) |
1817 | D: Various other kernel patches, cleanups and fixes | 1817 | D: Various other kernel patches, cleanups and fixes |
1818 | S: 2213 La Terrace Circle | 1818 | S: 2213 La Terrace Circle |
1819 | S: San Jose, CA 95123 | 1819 | S: San Jose, CA 95123 |
1820 | S: USA | 1820 | S: USA |
1821 | 1821 | ||
1822 | N: Andreas S. Krebs | 1822 | N: Andreas S. Krebs |
1823 | E: akrebs@altavista.net | 1823 | E: akrebs@altavista.net |
1824 | D: CYPRESS CY82C693 chipset IDE, Digital's PC-Alpha 164SX boards | 1824 | D: CYPRESS CY82C693 chipset IDE, Digital's PC-Alpha 164SX boards |
1825 | 1825 | ||
1826 | N: Greg Kroah-Hartman | 1826 | N: Greg Kroah-Hartman |
1827 | E: greg@kroah.com | 1827 | E: greg@kroah.com |
1828 | E: gregkh@suse.de | 1828 | E: gregkh@suse.de |
1829 | W: http://www.kroah.com/linux/ | 1829 | W: http://www.kroah.com/linux/ |
1830 | D: USB Serial Converter driver framework, USB Handspring Visor driver | 1830 | D: USB Serial Converter driver framework, USB Handspring Visor driver |
1831 | D: ConnectTech WHITEHeat USB driver, Generic USB Serial driver | 1831 | D: ConnectTech WHITEHeat USB driver, Generic USB Serial driver |
1832 | D: USB I/O Edgeport driver, USB Serial IrDA driver | 1832 | D: USB I/O Edgeport driver, USB Serial IrDA driver |
1833 | D: USB Bluetooth driver, USB Skeleton driver | 1833 | D: USB Bluetooth driver, USB Skeleton driver |
1834 | D: bits and pieces of USB core code. | 1834 | D: bits and pieces of USB core code. |
1835 | D: PCI Hotplug core, PCI Hotplug Compaq driver modifications | 1835 | D: PCI Hotplug core, PCI Hotplug Compaq driver modifications |
1836 | D: portions of the Linux Security Module (LSM) framework | 1836 | D: portions of the Linux Security Module (LSM) framework |
1837 | D: parts of the driver core, debugfs. | 1837 | D: parts of the driver core, debugfs. |
1838 | 1838 | ||
1839 | N: Russell Kroll | 1839 | N: Russell Kroll |
1840 | E: rkroll@exploits.org | 1840 | E: rkroll@exploits.org |
1841 | W: http://www.exploits.org/ | 1841 | W: http://www.exploits.org/ |
1842 | D: V4L radio cards: radio-aztech (new), others (bugfixes/features) | 1842 | D: V4L radio cards: radio-aztech (new), others (bugfixes/features) |
1843 | D: Loopback block device: dynamic sizing ("max_loop" as module) | 1843 | D: Loopback block device: dynamic sizing ("max_loop" as module) |
1844 | S: Post Office Box 691886 | 1844 | S: Post Office Box 691886 |
1845 | S: San Antonio, Texas 78269-1886 | 1845 | S: San Antonio, Texas 78269-1886 |
1846 | S: USA | 1846 | S: USA |
1847 | 1847 | ||
1848 | N: Denis O. Kropp | 1848 | N: Denis O. Kropp |
1849 | E: dok@directfb.org | 1849 | E: dok@directfb.org |
1850 | D: NeoMagic framebuffer driver | 1850 | D: NeoMagic framebuffer driver |
1851 | S: Badensche Str. 46 | 1851 | S: Badensche Str. 46 |
1852 | S: 10715 Berlin | 1852 | S: 10715 Berlin |
1853 | S: Germany | 1853 | S: Germany |
1854 | 1854 | ||
1855 | N: Andrzej M. Krzysztofowicz | 1855 | N: Andrzej M. Krzysztofowicz |
1856 | E: ankry@mif.pg.gda.pl | 1856 | E: ankry@mif.pg.gda.pl |
1857 | D: Some 8-bit XT disk driver and devfs hacking | 1857 | D: Some 8-bit XT disk driver and devfs hacking |
1858 | D: Aladdin 1533/1543(C) chipset IDE | 1858 | D: Aladdin 1533/1543(C) chipset IDE |
1859 | D: PIIX chipset IDE | 1859 | D: PIIX chipset IDE |
1860 | S: ul. Matemblewska 1B/10 | 1860 | S: ul. Matemblewska 1B/10 |
1861 | S: 80-283 Gdansk | 1861 | S: 80-283 Gdansk |
1862 | S: Poland | 1862 | S: Poland |
1863 | 1863 | ||
1864 | N: Gero Kuhlmann | 1864 | N: Gero Kuhlmann |
1865 | E: gero@gkminix.han.de | 1865 | E: gero@gkminix.han.de |
1866 | D: mounting root via NFS | 1866 | D: mounting root via NFS |
1867 | S: Donarweg 4 | 1867 | S: Donarweg 4 |
1868 | S: D-30657 Hannover | 1868 | S: D-30657 Hannover |
1869 | S: Germany | 1869 | S: Germany |
1870 | 1870 | ||
1871 | N: Markus Kuhn | 1871 | N: Markus Kuhn |
1872 | E: mskuhn@cip.informatik.uni-erlangen.de | 1872 | E: mskuhn@cip.informatik.uni-erlangen.de |
1873 | W: http://wwwcip.informatik.uni-erlangen.de/user/mskuhn | 1873 | W: http://wwwcip.informatik.uni-erlangen.de/user/mskuhn |
1874 | D: Unicode, real-time, time, standards | 1874 | D: Unicode, real-time, time, standards |
1875 | S: Schlehenweg 9 | 1875 | S: Schlehenweg 9 |
1876 | S: D-91080 Uttenreuth | 1876 | S: D-91080 Uttenreuth |
1877 | S: Germany | 1877 | S: Germany |
1878 | 1878 | ||
1879 | N: Jaya Kumar | 1879 | N: Jaya Kumar |
1880 | E: jayalk@intworks.biz | 1880 | E: jayalk@intworks.biz |
1881 | W: http://www.intworks.biz | 1881 | W: http://www.intworks.biz |
1882 | D: Arc monochrome LCD framebuffer driver, x86 reboot fixups | 1882 | D: Arc monochrome LCD framebuffer driver, x86 reboot fixups |
1883 | D: pirq addr, CS5535 alsa audio driver | 1883 | D: pirq addr, CS5535 alsa audio driver |
1884 | S: Gurgaon, India | 1884 | S: Gurgaon, India |
1885 | S: Kuala Lumpur, Malaysia | 1885 | S: Kuala Lumpur, Malaysia |
1886 | 1886 | ||
1887 | N: Gabor Kuti | 1887 | N: Gabor Kuti |
1888 | M: seasons@falcon.sch.bme.hu | 1888 | M: seasons@falcon.sch.bme.hu |
1889 | M: seasons@makosteszta.sote.hu | 1889 | M: seasons@makosteszta.sote.hu |
1890 | D: Original author of software suspend | 1890 | D: Original author of software suspend |
1891 | 1891 | ||
1892 | N: Jaroslav Kysela | 1892 | N: Jaroslav Kysela |
1893 | E: perex@suse.cz | 1893 | E: perex@suse.cz |
1894 | W: http://www.perex.cz | 1894 | W: http://www.perex.cz |
1895 | D: Original Author and Maintainer for HP 10/100 Mbit Network Adapters | 1895 | D: Original Author and Maintainer for HP 10/100 Mbit Network Adapters |
1896 | D: ISA PnP | 1896 | D: ISA PnP |
1897 | S: Sindlovy Dvory 117 | 1897 | S: Sindlovy Dvory 117 |
1898 | S: 370 01 Ceske Budejovice | 1898 | S: 370 01 Ceske Budejovice |
1899 | S: Czech Republic | 1899 | S: Czech Republic |
1900 | 1900 | ||
1901 | N: Bas Laarhoven | 1901 | N: Bas Laarhoven |
1902 | E: sjml@xs4all.nl | 1902 | E: sjml@xs4all.nl |
1903 | D: Loadable modules and ftape driver | 1903 | D: Loadable modules and ftape driver |
1904 | S: J. Obrechtstr 23 | 1904 | S: J. Obrechtstr 23 |
1905 | S: NL-5216 GP 's-Hertogenbosch | 1905 | S: NL-5216 GP 's-Hertogenbosch |
1906 | S: The Netherlands | 1906 | S: The Netherlands |
1907 | 1907 | ||
1908 | N: Savio Lam | 1908 | N: Savio Lam |
1909 | E: lam836@cs.cuhk.hk | 1909 | E: lam836@cs.cuhk.hk |
1910 | D: Author of the dialog utility, foundation | 1910 | D: Author of the dialog utility, foundation |
1911 | D: for Menuconfig's lxdialog. | 1911 | D: for Menuconfig's lxdialog. |
1912 | 1912 | ||
1913 | N: Christoph Lameter | 1913 | N: Christoph Lameter |
1914 | E: christoph@lameter.com | 1914 | E: christoph@lameter.com |
1915 | D: Digiboard PC/Xe and PC/Xi, Digiboard EPCA | 1915 | D: Digiboard PC/Xe and PC/Xi, Digiboard EPCA |
1916 | D: Early protocol filter for bridging code | 1916 | D: Early protocol filter for bridging code |
1917 | D: Bug fixes | 1917 | D: Bug fixes |
1918 | 1918 | ||
1919 | N: Paul Laufer | 1919 | N: Paul Laufer |
1920 | E: paul@laufernet.com | 1920 | E: paul@laufernet.com |
1921 | D: Soundblaster driver fixes, ISAPnP quirk | 1921 | D: Soundblaster driver fixes, ISAPnP quirk |
1922 | S: California, USA | 1922 | S: California, USA |
1923 | 1923 | ||
1924 | N: Tom Lees | 1924 | N: Tom Lees |
1925 | E: tom@lpsg.demon.co.uk | 1925 | E: tom@lpsg.demon.co.uk |
1926 | W: http://www.lpsg.demon.co.uk/ | 1926 | W: http://www.lpsg.demon.co.uk/ |
1927 | P: 1024/87D4D065 2A 66 86 9D 02 4D A6 1E B8 A2 17 9D 4F 9B 89 D6 | 1927 | P: 1024/87D4D065 2A 66 86 9D 02 4D A6 1E B8 A2 17 9D 4F 9B 89 D6 |
1928 | D: Original author and current maintainer of | 1928 | D: Original author and current maintainer of |
1929 | D: PnP code. | 1929 | D: PnP code. |
1930 | 1930 | ||
1931 | N: David van Leeuwen | 1931 | N: David van Leeuwen |
1932 | E: david@tm.tno.nl | 1932 | E: david@tm.tno.nl |
1933 | D: Philips/LMS cm206 cdrom driver, generic cdrom driver | 1933 | D: Philips/LMS cm206 cdrom driver, generic cdrom driver |
1934 | S: Scheltemalaan 14 | 1934 | S: Scheltemalaan 14 |
1935 | S: 3817 KS Amersfoort | 1935 | S: 3817 KS Amersfoort |
1936 | S: The Netherlands | 1936 | S: The Netherlands |
1937 | 1937 | ||
1938 | N: Volker Lendecke | 1938 | N: Volker Lendecke |
1939 | E: vl@kki.org | 1939 | E: vl@kki.org |
1940 | D: Kernel smbfs (to mount WfW, NT and OS/2 network drives.) | 1940 | D: Kernel smbfs (to mount WfW, NT and OS/2 network drives.) |
1941 | D: NCP filesystem support (to mount NetWare volumes) | 1941 | D: NCP filesystem support (to mount NetWare volumes) |
1942 | S: Von Ossietzky Str. 12 | 1942 | S: Von Ossietzky Str. 12 |
1943 | S: 37085 Goettingen | 1943 | S: 37085 Goettingen |
1944 | S: Germany | 1944 | S: Germany |
1945 | 1945 | ||
1946 | N: Kevin Lentin | 1946 | N: Kevin Lentin |
1947 | E: kevinl@cs.monash.edu.au | 1947 | E: kevinl@cs.monash.edu.au |
1948 | D: NCR53C400/T130B SCSI extension to NCR5380 driver. | 1948 | D: NCR53C400/T130B SCSI extension to NCR5380 driver. |
1949 | S: 18 Board Street | 1949 | S: 18 Board Street |
1950 | S: Doncaster VIC 3108 | 1950 | S: Doncaster VIC 3108 |
1951 | S: Australia | 1951 | S: Australia |
1952 | 1952 | ||
1953 | N: Hans Lermen | 1953 | N: Hans Lermen |
1954 | E: lermen@elserv.ffm.fgan.de | 1954 | E: lermen@elserv.ffm.fgan.de |
1955 | D: Author of the LOADLIN Linux loader, hacking on boot stuff | 1955 | D: Author of the LOADLIN Linux loader, hacking on boot stuff |
1956 | D: Coordinator of DOSEMU releases | 1956 | D: Coordinator of DOSEMU releases |
1957 | S: Am Muehlenweg 38 | 1957 | S: Am Muehlenweg 38 |
1958 | S: D53424 Remagen | 1958 | S: D53424 Remagen |
1959 | S: Germany | 1959 | S: Germany |
1960 | 1960 | ||
1961 | N: Colin Leroy | 1961 | N: Colin Leroy |
1962 | E: colin@colino.net | 1962 | E: colin@colino.net |
1963 | W: http://www.geekounet.org/ | 1963 | W: http://www.geekounet.org/ |
1964 | D: PowerMac adt746x fan driver | 1964 | D: PowerMac adt746x fan driver |
1965 | D: Random fixing of various drivers (macintosh, usb, sound) | 1965 | D: Random fixing of various drivers (macintosh, usb, sound) |
1966 | S: Toulouse | 1966 | S: Toulouse |
1967 | S: France | 1967 | S: France |
1968 | 1968 | ||
1969 | N: Achim Leubner | 1969 | N: Achim Leubner |
1970 | E: achim_leubner@adaptec.com | 1970 | E: achim_leubner@adaptec.com |
1971 | D: GDT Disk Array Controller/Storage RAID controller driver | 1971 | D: GDT Disk Array Controller/Storage RAID controller driver |
1972 | S: ICP vortex GmbH | 1972 | S: ICP vortex GmbH |
1973 | S: Neckarsulm | 1973 | S: Neckarsulm |
1974 | S: Germany | 1974 | S: Germany |
1975 | 1975 | ||
1976 | N: Phil Lewis | 1976 | N: Phil Lewis |
1977 | E: beans@bucket.ualr.edu | 1977 | E: beans@bucket.ualr.edu |
1978 | D: Promised to send money if I would put his name in the source tree. | 1978 | D: Promised to send money if I would put his name in the source tree. |
1979 | S: Post Office Box 371 | 1979 | S: Post Office Box 371 |
1980 | S: North Little Rock, Arkansas 72115 | 1980 | S: North Little Rock, Arkansas 72115 |
1981 | S: USA | 1981 | S: USA |
1982 | 1982 | ||
1983 | N: Stephan Linz | 1983 | N: Stephan Linz |
1984 | E: linz@mazet.de | 1984 | E: linz@mazet.de |
1985 | E: Stephan.Linz@gmx.de | 1985 | E: Stephan.Linz@gmx.de |
1986 | W: http://www.crosswinds.net/~tuxer | 1986 | W: http://www.crosswinds.net/~tuxer |
1987 | D: PCILynx patch to work with 1394a PHY and without local RAM | 1987 | D: PCILynx patch to work with 1394a PHY and without local RAM |
1988 | S: (ask for current address) | 1988 | S: (ask for current address) |
1989 | S: Germany | 1989 | S: Germany |
1990 | 1990 | ||
1991 | N: Christophe Lizzi | 1991 | N: Christophe Lizzi |
1992 | E: lizzi@cnam.fr | 1992 | E: lizzi@cnam.fr |
1993 | W: http://cedric.cnam.fr/personne/lizzi | 1993 | W: http://cedric.cnam.fr/personne/lizzi |
1994 | D: FORE Systems 200E-series ATM network driver, sparc64 port of ATM | 1994 | D: FORE Systems 200E-series ATM network driver, sparc64 port of ATM |
1995 | S: CNAM, Laboratoire CEDRIC | 1995 | S: CNAM, Laboratoire CEDRIC |
1996 | S: 292, rue St-Martin | 1996 | S: 292, rue St-Martin |
1997 | S: 75141 Paris Cedex 03 | 1997 | S: 75141 Paris Cedex 03 |
1998 | S: France | 1998 | S: France |
1999 | 1999 | ||
2000 | N: Siegfried "Frieder" Loeffler (dg1sek) | 2000 | N: Siegfried "Frieder" Loeffler (dg1sek) |
2001 | E: floeff@tunix.mathematik.uni-stuttgart.de, fl@LF.net | 2001 | E: floeff@tunix.mathematik.uni-stuttgart.de, fl@LF.net |
2002 | W: http://www.mathematik.uni-stuttgart.de/~floeff | 2002 | W: http://www.mathematik.uni-stuttgart.de/~floeff |
2003 | D: Busmaster driver for HP 10/100 Mbit Network Adapters | 2003 | D: Busmaster driver for HP 10/100 Mbit Network Adapters |
2004 | S: University of Stuttgart, Germany and | 2004 | S: University of Stuttgart, Germany and |
2005 | S: Ecole Nationale Superieure des Telecommunications, Paris | 2005 | S: Ecole Nationale Superieure des Telecommunications, Paris |
2006 | 2006 | ||
2007 | N: Jamie Lokier | 2007 | N: Jamie Lokier |
2008 | E: jamie@shareable.org | 2008 | E: jamie@shareable.org |
2009 | W: http://www.shareable.org/ | 2009 | W: http://www.shareable.org/ |
2010 | D: Reboot-through-BIOS for broken 486 motherboards | 2010 | D: Reboot-through-BIOS for broken 486 motherboards |
2011 | D: Parport fixes, futex improvements | 2011 | D: Parport fixes, futex improvements |
2012 | D: First instruction of x86 sysenter path :) | 2012 | D: First instruction of x86 sysenter path :) |
2013 | S: 51 Sunningwell Road | 2013 | S: 51 Sunningwell Road |
2014 | S: Oxford | 2014 | S: Oxford |
2015 | S: OX1 4SZ | 2015 | S: OX1 4SZ |
2016 | S: United Kingdom | 2016 | S: United Kingdom |
2017 | 2017 | ||
2018 | N: Mark Lord | 2018 | N: Mark Lord |
2019 | E: mlord@pobox.com | 2019 | E: mlord@pobox.com |
2020 | D: EIDE driver, hd.c support | 2020 | D: EIDE driver, hd.c support |
2021 | D: EIDE PCI and bus-master DMA support | 2021 | D: EIDE PCI and bus-master DMA support |
2022 | D: Hard Disk Parameter (hdparm) utility | 2022 | D: Hard Disk Parameter (hdparm) utility |
2023 | S: 33 Ridgefield Cr | 2023 | S: 33 Ridgefield Cr |
2024 | S: Nepean, Ontario | 2024 | S: Nepean, Ontario |
2025 | S: Canada K2H 6S3 | 2025 | S: Canada K2H 6S3 |
2026 | 2026 | ||
2027 | N: Warner Losh | 2027 | N: Warner Losh |
2028 | E: imp@village.org | 2028 | E: imp@village.org |
2029 | D: Linux/MIPS Deskstation support, Provided OI/OB for Linux | 2029 | D: Linux/MIPS Deskstation support, Provided OI/OB for Linux |
2030 | S: 8786 Niwot Road | 2030 | S: 8786 Niwot Road |
2031 | S: Niwot, Colorado 80503 | 2031 | S: Niwot, Colorado 80503 |
2032 | S: USA | 2032 | S: USA |
2033 | 2033 | ||
2034 | N: Robert M. Love | 2034 | N: Robert M. Love |
2035 | E: rml@tech9.net | 2035 | E: rml@tech9.net |
2036 | E: rml@novell.com | 2036 | E: rml@novell.com |
2037 | D: misc. kernel hacking and debugging | 2037 | D: misc. kernel hacking and debugging |
2038 | S: Cambridge, MA 02139 | 2038 | S: Cambridge, MA 02139 |
2039 | S: USA | 2039 | S: USA |
2040 | 2040 | ||
2041 | N: Martin von Lรถwis | 2041 | N: Martin von Lรถwis |
2042 | E: loewis@informatik.hu-berlin.de | 2042 | E: loewis@informatik.hu-berlin.de |
2043 | D: script binary format | 2043 | D: script binary format |
2044 | D: NTFS driver | 2044 | D: NTFS driver |
2045 | 2045 | ||
2046 | N: H.J. Lu | 2046 | N: H.J. Lu |
2047 | E: hjl@gnu.ai.mit.edu | 2047 | E: hjl@gnu.ai.mit.edu |
2048 | D: GCC + libraries hacker | 2048 | D: GCC + libraries hacker |
2049 | 2049 | ||
2050 | N: Michal Ludvig | 2050 | N: Michal Ludvig |
2051 | E: michal@logix.cz | 2051 | E: michal@logix.cz |
2052 | E: michal.ludvig@asterisk.co.nz | 2052 | E: michal.ludvig@asterisk.co.nz |
2053 | W: http://www.logix.cz/michal | 2053 | W: http://www.logix.cz/michal |
2054 | P: 1024D/C45B2218 1162 6471 D391 76E0 9F99 29DA 0C3A 2509 C45B 2218 | 2054 | P: 1024D/C45B2218 1162 6471 D391 76E0 9F99 29DA 0C3A 2509 C45B 2218 |
2055 | D: VIA PadLock driver | 2055 | D: VIA PadLock driver |
2056 | D: Netfilter pkttype module | 2056 | D: Netfilter pkttype module |
2057 | S: Asterisk Ltd. | 2057 | S: Asterisk Ltd. |
2058 | S: Auckland | 2058 | S: Auckland |
2059 | S: New Zealand | 2059 | S: New Zealand |
2060 | 2060 | ||
2061 | N: Tuomas J. Lukka | 2061 | N: Tuomas J. Lukka |
2062 | E: Tuomas.Lukka@Helsinki.FI | 2062 | E: Tuomas.Lukka@Helsinki.FI |
2063 | D: Original dual-monitor patches | 2063 | D: Original dual-monitor patches |
2064 | D: Console-mouse-tracking patches | 2064 | D: Console-mouse-tracking patches |
2065 | S: Puistokaari 1 E 18 | 2065 | S: Puistokaari 1 E 18 |
2066 | S: 00200 Helsinki | 2066 | S: 00200 Helsinki |
2067 | S: Finland | 2067 | S: Finland |
2068 | 2068 | ||
2069 | N: Daniel J. Maas | 2069 | N: Daniel J. Maas |
2070 | E: dmaas@dcine.com | 2070 | E: dmaas@dcine.com |
2071 | W: http://www.maasdigital.com | 2071 | W: http://www.maasdigital.com |
2072 | D: dv1394 | 2072 | D: dv1394 |
2073 | 2073 | ||
2074 | N: Hamish Macdonald | 2074 | N: Hamish Macdonald |
2075 | E: hamishm@lucent.com | 2075 | E: hamishm@lucent.com |
2076 | D: Linux/68k port | 2076 | D: Linux/68k port |
2077 | S: 32 Clydesdale Avenue | 2077 | S: 32 Clydesdale Avenue |
2078 | S: Kanata, Ontario | 2078 | S: Kanata, Ontario |
2079 | S: Canada K2M-2G7 | 2079 | S: Canada K2M-2G7 |
2080 | 2080 | ||
2081 | N: Peter MacDonald | 2081 | N: Peter MacDonald |
2082 | D: SLS distribution | 2082 | D: SLS distribution |
2083 | D: Initial implementation of VC's, pty's and select() | 2083 | D: Initial implementation of VC's, pty's and select() |
2084 | 2084 | ||
2085 | N: Pavel Machek | 2085 | N: Pavel Machek |
2086 | E: pavel@ucw.cz | 2086 | E: pavel@ucw.cz |
2087 | E: pavel@suse.cz | 2087 | E: pavel@suse.cz |
2088 | D: Softcursor for vga, hypertech cdrom support, vcsa bugfix, nbd | 2088 | D: Softcursor for vga, hypertech cdrom support, vcsa bugfix, nbd |
2089 | D: sun4/330 port, capabilities for elf, speedup for rm on ext2, USB, | 2089 | D: sun4/330 port, capabilities for elf, speedup for rm on ext2, USB, |
2090 | D: work on suspend-to-ram/disk, killing duplicates from ioctl32 | 2090 | D: work on suspend-to-ram/disk, killing duplicates from ioctl32 |
2091 | S: Volkova 1131 | 2091 | S: Volkova 1131 |
2092 | S: 198 00 Praha 9 | 2092 | S: 198 00 Praha 9 |
2093 | S: Czech Republic | 2093 | S: Czech Republic |
2094 | 2094 | ||
2095 | N: Paul Mackerras | 2095 | N: Paul Mackerras |
2096 | E: paulus@samba.org | 2096 | E: paulus@samba.org |
2097 | D: PPP driver | 2097 | D: PPP driver |
2098 | D: Linux for PowerPC | 2098 | D: Linux for PowerPC |
2099 | D: Linux port for PCI Power Macintosh | 2099 | D: Linux port for PCI Power Macintosh |
2100 | 2100 | ||
2101 | N: Pat Mackinlay | 2101 | N: Pat Mackinlay |
2102 | E: pat@it.com.au | 2102 | E: pat@it.com.au |
2103 | D: 8 bit XT hard disk driver | 2103 | D: 8 bit XT hard disk driver |
2104 | D: Miscellaneous ST0x, TMC-8xx and other SCSI hacking | 2104 | D: Miscellaneous ST0x, TMC-8xx and other SCSI hacking |
2105 | S: 25 McMillan Street | 2105 | S: 25 McMillan Street |
2106 | S: Victoria Park 6100 | 2106 | S: Victoria Park 6100 |
2107 | S: Australia | 2107 | S: Australia |
2108 | 2108 | ||
2109 | N: James B. MacLean | 2109 | N: James B. MacLean |
2110 | E: macleajb@ednet.ns.ca | 2110 | E: macleajb@ednet.ns.ca |
2111 | W: http://www.ednet.ns.ca/~macleajb/dosemu.html | 2111 | W: http://www.ednet.ns.ca/~macleajb/dosemu.html |
2112 | D: Former Coordinator of DOSEMU releases | 2112 | D: Former Coordinator of DOSEMU releases |
2113 | D: Program in DOSEMU | 2113 | D: Program in DOSEMU |
2114 | S: PO BOX 220, HFX. CENTRAL | 2114 | S: PO BOX 220, HFX. CENTRAL |
2115 | S: Halifax, Nova Scotia | 2115 | S: Halifax, Nova Scotia |
2116 | S: Canada B3J 3C8 | 2116 | S: Canada B3J 3C8 |
2117 | 2117 | ||
2118 | N: Kai Mรคkisara | 2118 | N: Kai Mรคkisara |
2119 | E: Kai.Makisara@kolumbus.fi | 2119 | E: Kai.Makisara@kolumbus.fi |
2120 | D: SCSI Tape Driver | 2120 | D: SCSI Tape Driver |
2121 | 2121 | ||
2122 | N: Asit Mallick | 2122 | N: Asit Mallick |
2123 | E: asit.k.mallick@intel.com | 2123 | E: asit.k.mallick@intel.com |
2124 | D: Linux/IA-64 | 2124 | D: Linux/IA-64 |
2125 | S: 2200 Mission College Blvd | 2125 | S: 2200 Mission College Blvd |
2126 | S: Santa Clara, CA 95052 | 2126 | S: Santa Clara, CA 95052 |
2127 | S: USA | 2127 | S: USA |
2128 | 2128 | ||
2129 | N: Petko Manolov | 2129 | N: Petko Manolov |
2130 | E: petkan@users.sourceforge.net | 2130 | E: petkan@users.sourceforge.net |
2131 | D: USB ethernet pegasus/pegasus-II driver | 2131 | D: USB ethernet pegasus/pegasus-II driver |
2132 | D: USB ethernet rtl8150 driver | 2132 | D: USB ethernet rtl8150 driver |
2133 | D: optimizing i[45]86 string routines | 2133 | D: optimizing i[45]86 string routines |
2134 | D: i386 task switching hacks | 2134 | D: i386 task switching hacks |
2135 | S: 482 Shadowgraph Dr. | 2135 | S: 482 Shadowgraph Dr. |
2136 | S: San Jose, CA 95110 | 2136 | S: San Jose, CA 95110 |
2137 | S: USA | 2137 | S: USA |
2138 | 2138 | ||
2139 | N: Martin Mares | 2139 | N: Martin Mares |
2140 | E: mj@ucw.cz | 2140 | E: mj@ucw.cz |
2141 | W: http://www.ucw.cz/~mj/ | 2141 | W: http://www.ucw.cz/~mj/ |
2142 | D: BIOS video mode handling code | 2142 | D: BIOS video mode handling code |
2143 | D: MOXA C-218 serial board driver | 2143 | D: MOXA C-218 serial board driver |
2144 | D: Network autoconfiguration | 2144 | D: Network autoconfiguration |
2145 | D: PCI subsystem | 2145 | D: PCI subsystem |
2146 | D: Random kernel hacking | 2146 | D: Random kernel hacking |
2147 | S: Kankovskeho 1241 | 2147 | S: Kankovskeho 1241 |
2148 | S: 182 00 Praha 8 | 2148 | S: 182 00 Praha 8 |
2149 | S: Czech Republic | 2149 | S: Czech Republic |
2150 | 2150 | ||
2151 | N: John A. Martin | 2151 | N: John A. Martin |
2152 | E: jam@acm.org | 2152 | E: jam@acm.org |
2153 | W: http://www.tux.org/~jam/ | 2153 | W: http://www.tux.org/~jam/ |
2154 | P: 1024/04456D53 9D A3 6C 6B 88 80 8A 61 D7 06 22 4F 95 40 CE D2 | 2154 | P: 1024/04456D53 9D A3 6C 6B 88 80 8A 61 D7 06 22 4F 95 40 CE D2 |
2155 | P: 1024/3B986635 5A61 7EE6 9E20 51FB 59FB 2DA5 3E18 DD55 3B98 6635 | 2155 | P: 1024/3B986635 5A61 7EE6 9E20 51FB 59FB 2DA5 3E18 DD55 3B98 6635 |
2156 | D: FSSTND contributor | 2156 | D: FSSTND contributor |
2157 | D: Credit file compilator | 2157 | D: Credit file compilator |
2158 | 2158 | ||
2159 | N: Kevin E. Martin | 2159 | N: Kevin E. Martin |
2160 | E: martin@cs.unc.edu | 2160 | E: martin@cs.unc.edu |
2161 | D: Developed original accelerated X servers included in XFree86 | 2161 | D: Developed original accelerated X servers included in XFree86 |
2162 | D: XF86_Mach64 | 2162 | D: XF86_Mach64 |
2163 | D: XF86_Mach32 | 2163 | D: XF86_Mach32 |
2164 | D: XF86_Mach8 | 2164 | D: XF86_Mach8 |
2165 | D: XF86_8514 | 2165 | D: XF86_8514 |
2166 | D: cfdisk (curses based disk partitioning program) | 2166 | D: cfdisk (curses based disk partitioning program) |
2167 | 2167 | ||
2168 | N: John S. Marvin | 2168 | N: John S. Marvin |
2169 | E: jsm@fc.hp.com | 2169 | E: jsm@fc.hp.com |
2170 | D: PA-RISC port | 2170 | D: PA-RISC port |
2171 | S: Hewlett Packard | 2171 | S: Hewlett Packard |
2172 | S: MS 42 | 2172 | S: MS 42 |
2173 | S: 3404 E. Harmony Road | 2173 | S: 3404 E. Harmony Road |
2174 | S: Fort Collins, CO 80528 | 2174 | S: Fort Collins, CO 80528 |
2175 | 2175 | ||
2176 | N: Torben Mathiasen | 2176 | N: Torben Mathiasen |
2177 | E: torben.mathiasen@compaq.com | 2177 | E: torben.mathiasen@compaq.com |
2178 | E: torben@kernel.dk | 2178 | E: torben@kernel.dk |
2179 | W: http://tlan.kernel.dk | 2179 | W: http://tlan.kernel.dk |
2180 | D: ThunderLAN maintainer | 2180 | D: ThunderLAN maintainer |
2181 | D: ThunderLAN updates and other kernel fixes. | 2181 | D: ThunderLAN updates and other kernel fixes. |
2182 | S: Bremensgade 29, st.th | 2182 | S: Bremensgade 29, st.th |
2183 | S: 2300 Copenhagen S | 2183 | S: 2300 Copenhagen S |
2184 | S: Denmark | 2184 | S: Denmark |
2185 | 2185 | ||
2186 | N: Claudio S. Matsuoka | 2186 | N: Claudio S. Matsuoka |
2187 | E: claudio@conectiva.com | 2187 | E: claudio@conectiva.com |
2188 | E: claudio@helllabs.org | 2188 | E: claudio@helllabs.org |
2189 | W: http://helllabs.org/~claudio | 2189 | W: http://helllabs.org/~claudio |
2190 | D: V4L, OV511 driver hacks | 2190 | D: V4L, OV511 driver hacks |
2191 | S: Conectiva S.A. | 2191 | S: Conectiva S.A. |
2192 | S: R. Tocantins 89 | 2192 | S: R. Tocantins 89 |
2193 | S: 80050-430 Curitiba PR | 2193 | S: 80050-430 Curitiba PR |
2194 | S: Brazil | 2194 | S: Brazil |
2195 | 2195 | ||
2196 | N: Heinz Mauelshagen | 2196 | N: Heinz Mauelshagen |
2197 | E: mge@EZ-Darmstadt.Telekom.de | 2197 | E: mge@EZ-Darmstadt.Telekom.de |
2198 | D: Logical Volume Manager | 2198 | D: Logical Volume Manager |
2199 | S: Bartningstr. 12 | 2199 | S: Bartningstr. 12 |
2200 | S: 64289 Darmstadt | 2200 | S: 64289 Darmstadt |
2201 | S: Germany | 2201 | S: Germany |
2202 | 2202 | ||
2203 | N: Mark W. McClelland | 2203 | N: Mark W. McClelland |
2204 | E: mmcclell@bigfoot.com | 2204 | E: mmcclell@bigfoot.com |
2205 | E: mark@alpha.dyndns.org | 2205 | E: mark@alpha.dyndns.org |
2206 | W: http://alpha.dyndns.org/ov511/ | 2206 | W: http://alpha.dyndns.org/ov511/ |
2207 | P: 1024D/357375CC 317C 58AC 1B39 2AB0 AB96 EB38 0B6F 731F 3573 75CC | 2207 | P: 1024D/357375CC 317C 58AC 1B39 2AB0 AB96 EB38 0B6F 731F 3573 75CC |
2208 | D: OV511 driver | 2208 | D: OV511 driver |
2209 | S: (address available on request) | 2209 | S: (address available on request) |
2210 | S: USA | 2210 | S: USA |
2211 | 2211 | ||
2212 | N: Ian McDonald | 2212 | N: Ian McDonald |
2213 | E: ian.mcdonald@jandi.co.nz | 2213 | E: ian.mcdonald@jandi.co.nz |
2214 | E: imcdnzl@gmail.com | 2214 | E: imcdnzl@gmail.com |
2215 | W: http://wand.net.nz/~iam4 | 2215 | W: http://wand.net.nz/~iam4 |
2216 | W: http://imcdnzl.blogspot.com | 2216 | W: http://imcdnzl.blogspot.com |
2217 | D: DCCP, CCID3 | 2217 | D: DCCP, CCID3 |
2218 | S: Hamilton | 2218 | S: Hamilton |
2219 | S: New Zealand | 2219 | S: New Zealand |
2220 | 2220 | ||
2221 | N: Patrick McHardy | 2221 | N: Patrick McHardy |
2222 | E: kaber@trash.net | 2222 | E: kaber@trash.net |
2223 | P: 1024D/12155E80 B128 7DE6 FF0A C2B2 48BE AB4C C9D4 964E 1215 5E80 | 2223 | P: 1024D/12155E80 B128 7DE6 FF0A C2B2 48BE AB4C C9D4 964E 1215 5E80 |
2224 | D: netfilter: endless number of bugfixes | 2224 | D: netfilter: endless number of bugfixes |
2225 | D: netfilter: CLASSIFY target | 2225 | D: netfilter: CLASSIFY target |
2226 | D: netfilter: addrtype match | 2226 | D: netfilter: addrtype match |
2227 | D: tc: HFSC scheduler | 2227 | D: tc: HFSC scheduler |
2228 | S: Freiburg | 2228 | S: Freiburg |
2229 | S: Germany | 2229 | S: Germany |
2230 | 2230 | ||
2231 | N: Mike McLagan | 2231 | N: Mike McLagan |
2232 | E: mike.mclagan@linux.org | 2232 | E: mike.mclagan@linux.org |
2233 | W: http://www.invlogic.com/~mmclagan | 2233 | W: http://www.invlogic.com/~mmclagan |
2234 | D: DLCI/FRAD drivers for Sangoma SDLAs | 2234 | D: DLCI/FRAD drivers for Sangoma SDLAs |
2235 | S: Innovative Logic Corp | 2235 | S: Innovative Logic Corp |
2236 | S: Post Office Box 1068 | 2236 | S: Post Office Box 1068 |
2237 | S: Laurel, Maryland 20732 | 2237 | S: Laurel, Maryland 20732 |
2238 | S: USA | 2238 | S: USA |
2239 | 2239 | ||
2240 | N: Bradley McLean | 2240 | N: Bradley McLean |
2241 | E: brad@bradpc.gaylord.com | 2241 | E: brad@bradpc.gaylord.com |
2242 | D: Device driver hacker | 2242 | D: Device driver hacker |
2243 | D: General kernel debugger | 2243 | D: General kernel debugger |
2244 | S: 249 Nichols Avenue | 2244 | S: 249 Nichols Avenue |
2245 | S: Syracuse, New York 13206 | 2245 | S: Syracuse, New York 13206 |
2246 | S: USA | 2246 | S: USA |
2247 | 2247 | ||
2248 | N: Kyle McMartin | 2248 | N: Kyle McMartin |
2249 | E: kyle@parisc-linux.org | 2249 | E: kyle@parisc-linux.org |
2250 | D: Linux/PARISC hacker | 2250 | D: Linux/PARISC hacker |
2251 | D: AD1889 sound driver | 2251 | D: AD1889 sound driver |
2252 | S: Ottawa, Canada | 2252 | S: Ottawa, Canada |
2253 | 2253 | ||
2254 | N: Dirk Melchers | 2254 | N: Dirk Melchers |
2255 | E: dirk@merlin.nbg.sub.org | 2255 | E: dirk@merlin.nbg.sub.org |
2256 | D: 8 bit XT hard disk driver for OMTI5520 | 2256 | D: 8 bit XT hard disk driver for OMTI5520 |
2257 | S: Schloessleinsgasse 31 | 2257 | S: Schloessleinsgasse 31 |
2258 | S: D-90453 Nuernberg | 2258 | S: D-90453 Nuernberg |
2259 | S: Germany | 2259 | S: Germany |
2260 | 2260 | ||
2261 | N: Arnaldo Carvalho de Melo | 2261 | N: Arnaldo Carvalho de Melo |
2262 | E: acme@mandriva.com | 2262 | E: acme@mandriva.com |
2263 | E: acme@ghostprotocols.net | 2263 | E: acme@ghostprotocols.net |
2264 | W: http://oops.ghostprotocols.net:81/blog/ | 2264 | W: http://oops.ghostprotocols.net:81/blog/ |
2265 | P: 1024D/9224DF01 D5DF E3BB E3C8 BCBB F8AD 841A B6AB 4681 9224 DF01 | 2265 | P: 1024D/9224DF01 D5DF E3BB E3C8 BCBB F8AD 841A B6AB 4681 9224 DF01 |
2266 | D: IPX, LLC, DCCP, cyc2x, wl3501_cs, net/ hacks | 2266 | D: IPX, LLC, DCCP, cyc2x, wl3501_cs, net/ hacks |
2267 | S: Mandriva | 2267 | S: Mandriva |
2268 | S: R. Tocantins, 89 - Cristo Rei | 2268 | S: R. Tocantins, 89 - Cristo Rei |
2269 | S: 80050-430 - Curitiba - Paranรก | 2269 | S: 80050-430 - Curitiba - Paranรก |
2270 | S: Brazil | 2270 | S: Brazil |
2271 | 2271 | ||
2272 | N: Karsten Merker | 2272 | N: Karsten Merker |
2273 | E: merker@linuxtag.org | 2273 | E: merker@linuxtag.org |
2274 | D: DECstation framebuffer drivers | 2274 | D: DECstation framebuffer drivers |
2275 | S: Germany | 2275 | S: Germany |
2276 | 2276 | ||
2277 | N: Michael Meskes | 2277 | N: Michael Meskes |
2278 | E: meskes@debian.org | 2278 | E: meskes@debian.org |
2279 | P: 1024/04B6E8F5 6C 77 33 CA CC D6 22 03 AB AB 15 A3 AE AD 39 7D | 2279 | P: 1024/04B6E8F5 6C 77 33 CA CC D6 22 03 AB AB 15 A3 AE AD 39 7D |
2280 | D: Kernel hacker. PostgreSQL hacker. Software watchdog daemon. | 2280 | D: Kernel hacker. PostgreSQL hacker. Software watchdog daemon. |
2281 | D: Maintainer of several Debian packages | 2281 | D: Maintainer of several Debian packages |
2282 | S: Th.-Heuss-Str. 61 | 2282 | S: Th.-Heuss-Str. 61 |
2283 | S: D-41812 Erkelenz | 2283 | S: D-41812 Erkelenz |
2284 | S: Germany | 2284 | S: Germany |
2285 | 2285 | ||
2286 | N: Nigel Metheringham | 2286 | N: Nigel Metheringham |
2287 | E: Nigel.Metheringham@ThePLAnet.net | 2287 | E: Nigel.Metheringham@ThePLAnet.net |
2288 | P: 1024/31455639 B7 99 BD B8 00 17 BD 46 C1 15 B8 AB 87 BC 25 FA | 2288 | P: 1024/31455639 B7 99 BD B8 00 17 BD 46 C1 15 B8 AB 87 BC 25 FA |
2289 | D: IP Masquerading work and minor fixes | 2289 | D: IP Masquerading work and minor fixes |
2290 | S: Planet Online | 2290 | S: Planet Online |
2291 | S: The White House, Melbourne Street, LEEDS | 2291 | S: The White House, Melbourne Street, LEEDS |
2292 | S: LS2 7PS, United Kingdom | 2292 | S: LS2 7PS, United Kingdom |
2293 | 2293 | ||
2294 | N: Craig Metz | 2294 | N: Craig Metz |
2295 | E: cmetz@inner.net | 2295 | E: cmetz@inner.net |
2296 | D: Some of PAS 16 mixer & PCM support, inet6-apps | 2296 | D: Some of PAS 16 mixer & PCM support, inet6-apps |
2297 | 2297 | ||
2298 | N: William (Bill) Metzenthen | 2298 | N: William (Bill) Metzenthen |
2299 | E: billm@suburbia.net | 2299 | E: billm@suburbia.net |
2300 | D: Author of the FPU emulator. | 2300 | D: Author of the FPU emulator. |
2301 | D: Minor kernel hacker for other lost causes (Hercules mono, etc). | 2301 | D: Minor kernel hacker for other lost causes (Hercules mono, etc). |
2302 | S: 22 Parker Street | 2302 | S: 22 Parker Street |
2303 | S: Ormond | 2303 | S: Ormond |
2304 | S: Victoria 3163 | 2304 | S: Victoria 3163 |
2305 | S: Australia | 2305 | S: Australia |
2306 | 2306 | ||
2307 | N: Pauline Middelink | 2307 | N: Pauline Middelink |
2308 | E: middelin@polyware.nl | 2308 | E: middelin@polyware.nl |
2309 | D: General low-level bug fixes, /proc fixes, identd support | 2309 | D: General low-level bug fixes, /proc fixes, identd support |
2310 | D: Author of IP masquerading | 2310 | D: Author of IP masquerading |
2311 | D: Zoran ZR36120 Video For Linux driver | 2311 | D: Zoran ZR36120 Video For Linux driver |
2312 | S: Boterkorfhoek 34 | 2312 | S: Boterkorfhoek 34 |
2313 | S: 7546 JA Enschede | 2313 | S: 7546 JA Enschede |
2314 | S: Netherlands | 2314 | S: Netherlands |
2315 | 2315 | ||
2316 | N: David S. Miller | 2316 | N: David S. Miller |
2317 | E: davem@davemloft.net | 2317 | E: davem@davemloft.net |
2318 | D: Sparc and blue box hacker | 2318 | D: Sparc and blue box hacker |
2319 | D: Vger Linux mailing list co-maintainer | 2319 | D: Vger Linux mailing list co-maintainer |
2320 | D: Linux Emacs elf/qmagic support + other libc/gcc things | 2320 | D: Linux Emacs elf/qmagic support + other libc/gcc things |
2321 | D: Yee bore de yee bore! ;-) | 2321 | D: Yee bore de yee bore! ;-) |
2322 | S: 575 Harrison St. #103 | 2322 | S: 575 Harrison St. #103 |
2323 | S: San Francisco, CA 94105 | 2323 | S: San Francisco, CA 94105 |
2324 | S: USA | 2324 | S: USA |
2325 | 2325 | ||
2326 | N: Rick Miller | 2326 | N: Rick Miller |
2327 | E: rdmiller@execpc.com | 2327 | E: rdmiller@execpc.com |
2328 | W: http://www.execpc.com/~rdmiller/ | 2328 | W: http://www.execpc.com/~rdmiller/ |
2329 | D: Original Linux Device Registrar (Major/minor numbers) | 2329 | D: Original Linux Device Registrar (Major/minor numbers) |
2330 | D: au-play, bwBASIC | 2330 | D: au-play, bwBASIC |
2331 | S: S78 W16203 Woods Road | 2331 | S: S78 W16203 Woods Road |
2332 | S: Muskego, Wisconsin 53150 | 2332 | S: Muskego, Wisconsin 53150 |
2333 | S: USA | 2333 | S: USA |
2334 | 2334 | ||
2335 | N: Harald Milz | 2335 | N: Harald Milz |
2336 | E: hm@seneca.linux.de | 2336 | E: hm@seneca.linux.de |
2337 | D: Linux Projects Map, Linux Commercial-HOWTO | 2337 | D: Linux Projects Map, Linux Commercial-HOWTO |
2338 | D: general Linux publicity in Germany, vacation port | 2338 | D: general Linux publicity in Germany, vacation port |
2339 | D: UUCP and CNEWS binary packages for LST | 2339 | D: UUCP and CNEWS binary packages for LST |
2340 | S: Editorial Board iX Mag | 2340 | S: Editorial Board iX Mag |
2341 | S: Helstorfer Str. 7 | 2341 | S: Helstorfer Str. 7 |
2342 | S: D-30625 Hannover | 2342 | S: D-30625 Hannover |
2343 | S: Germany | 2343 | S: Germany |
2344 | 2344 | ||
2345 | N: Corey Minyard | 2345 | N: Corey Minyard |
2346 | E: minyard@wf-rch.cirr.com | 2346 | E: minyard@wf-rch.cirr.com |
2347 | E: minyard@mvista.com | 2347 | E: minyard@mvista.com |
2348 | W: http://home.attbi.com/~minyard | 2348 | W: http://home.attbi.com/~minyard |
2349 | D: Sony CDU31A CDROM Driver | 2349 | D: Sony CDU31A CDROM Driver |
2350 | D: IPMI driver | 2350 | D: IPMI driver |
2351 | D: Various networking fixes long ago | 2351 | D: Various networking fixes long ago |
2352 | D: Original ppc_md work | 2352 | D: Original ppc_md work |
2353 | D: Shared zlib | 2353 | D: Shared zlib |
2354 | S: 7406 Wheat Field Rd | 2354 | S: 7406 Wheat Field Rd |
2355 | S: Garland, Texas 75044 | 2355 | S: Garland, Texas 75044 |
2356 | S: USA | 2356 | S: USA |
2357 | 2357 | ||
2358 | N: Kazunori Miyazawa | 2358 | N: Kazunori Miyazawa |
2359 | E: miyazawa@linux-ipv6.org | 2359 | E: miyazawa@linux-ipv6.org |
2360 | E: Kazunori.Miyazawa@jp.yokogawa.com | 2360 | E: Kazunori.Miyazawa@jp.yokogawa.com |
2361 | E: kazunori@miyazawa.org | 2361 | E: kazunori@miyazawa.org |
2362 | W: http://www.miyazawa.org/~kazunori/ | 2362 | W: http://www.miyazawa.org/~kazunori/ |
2363 | D: IPsec, IPv6 | 2363 | D: IPsec, IPv6 |
2364 | D: USAGI/WIDE Project, Yokogawa Electric Corporation | 2364 | D: USAGI/WIDE Project, Yokogawa Electric Corporation |
2365 | S: 2-20-4-203, Nakacho, | 2365 | S: 2-20-4-203, Nakacho, |
2366 | S: Musashino, Tokyo 180-0006 | 2366 | S: Musashino, Tokyo 180-0006 |
2367 | S: Japan | 2367 | S: Japan |
2368 | 2368 | ||
2369 | N: Patrick Mochel | 2369 | N: Patrick Mochel |
2370 | E: mochel@osdl.org | 2370 | E: mochel@osdl.org |
2371 | E: mochelp@infinity.powertie.org | 2371 | E: mochelp@infinity.powertie.org |
2372 | D: PCI Power Management, ACPI work | 2372 | D: PCI Power Management, ACPI work |
2373 | S: 12725 SW Millikan Way, Suite 400 | 2373 | S: 12725 SW Millikan Way, Suite 400 |
2374 | S: Beaverton, Oregon 97005 | 2374 | S: Beaverton, Oregon 97005 |
2375 | S: USA | 2375 | S: USA |
2376 | 2376 | ||
2377 | N: Eberhard Moenkeberg | 2377 | N: Eberhard Moenkeberg |
2378 | E: emoenke@gwdg.de | 2378 | E: emoenke@gwdg.de |
2379 | D: CDROM driver "sbpcd" (Matsushita/Panasonic/Soundblaster) | 2379 | D: CDROM driver "sbpcd" (Matsushita/Panasonic/Soundblaster) |
2380 | S: Ruhstrathoehe 2 b. | 2380 | S: Ruhstrathoehe 2 b. |
2381 | S: D-37085 Goettingen | 2381 | S: D-37085 Goettingen |
2382 | S: Germany | 2382 | S: Germany |
2383 | 2383 | ||
2384 | N: Thomas Molina | 2384 | N: Thomas Molina |
2385 | E: tmolina@cablespeed.com | 2385 | E: tmolina@cablespeed.com |
2386 | D: bug fixes, documentation, minor hackery | 2386 | D: bug fixes, documentation, minor hackery |
2387 | 2387 | ||
2388 | N: Paul Moore | 2388 | N: Paul Moore |
2389 | E: paul.moore@hp.com | 2389 | E: paul.moore@hp.com |
2390 | D: NetLabel author | 2390 | D: NetLabel author |
2391 | S: Hewlett-Packard | 2391 | S: Hewlett-Packard |
2392 | S: 110 Spit Brook Road | 2392 | S: 110 Spit Brook Road |
2393 | S: Nashua, NH 03062 | 2393 | S: Nashua, NH 03062 |
2394 | 2394 | ||
2395 | N: James Morris | 2395 | N: James Morris |
2396 | E: jmorris@namei.org | 2396 | E: jmorris@namei.org |
2397 | W: http://namei.org/ | 2397 | W: http://namei.org/ |
2398 | D: Netfilter, Linux Security Modules (LSM), SELinux, IPSec, | 2398 | D: Netfilter, Linux Security Modules (LSM), SELinux, IPSec, |
2399 | D: Crypto API, general networking, miscellaneous. | 2399 | D: Crypto API, general networking, miscellaneous. |
2400 | S: PO Box 707 | 2400 | S: PO Box 707 |
2401 | S: Spit Junction NSW 2088 | 2401 | S: Spit Junction NSW 2088 |
2402 | S: Australia | 2402 | S: Australia |
2403 | 2403 | ||
2404 | N: David Mosberger-Tang | 2404 | N: David Mosberger-Tang |
2405 | E: davidm@hpl.hp.com if IA-64 related, else David.Mosberger@acm.org | 2405 | E: davidm@hpl.hp.com if IA-64 related, else David.Mosberger@acm.org |
2406 | D: Linux/Alpha and Linux/ia64 | 2406 | D: Linux/Alpha and Linux/ia64 |
2407 | S: 35706 Runckel Lane | 2407 | S: 35706 Runckel Lane |
2408 | S: Fremont, California 94536 | 2408 | S: Fremont, California 94536 |
2409 | S: USA | 2409 | S: USA |
2410 | 2410 | ||
2411 | N: Sam Mosel | 2411 | N: Sam Mosel |
2412 | E: sam.mosel@computer.org | 2412 | E: sam.mosel@computer.org |
2413 | D: Wacom Intuos USB Support | 2413 | D: Wacom Intuos USB Support |
2414 | S: 22 Seaview St | 2414 | S: 22 Seaview St |
2415 | S: Fullarton 5063 | 2415 | S: Fullarton 5063 |
2416 | S: South Australia | 2416 | S: South Australia |
2417 | 2417 | ||
2418 | N. Wolfgang Muees | 2418 | N. Wolfgang Muees |
2419 | E: wolfgang@iksw-muees.de | 2419 | E: wolfgang@iksw-muees.de |
2420 | D: Auerswald USB driver | 2420 | D: Auerswald USB driver |
2421 | 2421 | ||
2422 | N: Ian A. Murdock | 2422 | N: Ian A. Murdock |
2423 | E: imurdock@gnu.ai.mit.edu | 2423 | E: imurdock@gnu.ai.mit.edu |
2424 | D: Creator of Debian distribution | 2424 | D: Creator of Debian distribution |
2425 | S: 30 White Tail Lane | 2425 | S: 30 White Tail Lane |
2426 | S: Lafayette, Indiana 47905 | 2426 | S: Lafayette, Indiana 47905 |
2427 | S: USA | 2427 | S: USA |
2428 | 2428 | ||
2429 | N: Scott Murray | 2429 | N: Scott Murray |
2430 | E: scottm@somanetworks.com | 2430 | E: scottm@somanetworks.com |
2431 | E: scott@spiteful.org | 2431 | E: scott@spiteful.org |
2432 | D: OPL3-SA2, OPL3-SA3 sound driver | 2432 | D: OPL3-SA2, OPL3-SA3 sound driver |
2433 | D: CompactPCI hotplug core | 2433 | D: CompactPCI hotplug core |
2434 | D: Ziatech ZT5550 and generic CompactPCI hotplug drivers | 2434 | D: Ziatech ZT5550 and generic CompactPCI hotplug drivers |
2435 | S: Toronto, Ontario | 2435 | S: Toronto, Ontario |
2436 | S: Canada | 2436 | S: Canada |
2437 | 2437 | ||
2438 | N: Zwane Mwaikambo | 2438 | N: Zwane Mwaikambo |
2439 | E: zwane@arm.linux.org.uk | 2439 | E: zwane@arm.linux.org.uk |
2440 | D: Various driver hacking | 2440 | D: Various driver hacking |
2441 | D: Lowlevel x86 kernel hacking | 2441 | D: Lowlevel x86 kernel hacking |
2442 | D: General debugging | 2442 | D: General debugging |
2443 | S: (ask for current address) | 2443 | S: (ask for current address) |
2444 | S: Tanzania | 2444 | S: Tanzania |
2445 | 2445 | ||
2446 | N: Trond Myklebust | 2446 | N: Trond Myklebust |
2447 | E: trond.myklebust@fys.uio.no | 2447 | E: trond.myklebust@fys.uio.no |
2448 | D: current NFS client hacker. | 2448 | D: current NFS client hacker. |
2449 | S: Dagaliveien 31e | 2449 | S: Dagaliveien 31e |
2450 | S: N-0391 Oslo | 2450 | S: N-0391 Oslo |
2451 | S: Norway | 2451 | S: Norway |
2452 | 2452 | ||
2453 | N: Johan Myreen | 2453 | N: Johan Myreen |
2454 | E: jem@iki.fi | 2454 | E: jem@iki.fi |
2455 | D: PS/2 mouse driver writer etc. | 2455 | D: PS/2 mouse driver writer etc. |
2456 | S: Dragonvagen 1 A 13 | 2456 | S: Dragonvagen 1 A 13 |
2457 | S: FIN-00330 Helsingfors | 2457 | S: FIN-00330 Helsingfors |
2458 | S: Finland | 2458 | S: Finland |
2459 | 2459 | ||
2460 | N: Matija Nalis | 2460 | N: Matija Nalis |
2461 | E: mnalis@jagor.srce.hr | 2461 | E: mnalis@jagor.srce.hr |
2462 | E: mnalis@voyager.hr | 2462 | E: mnalis@voyager.hr |
2463 | D: Maintainer of the Umsdos file system | 2463 | D: Maintainer of the Umsdos file system |
2464 | S: Listopadska 7 | 2464 | S: Listopadska 7 |
2465 | S: 10000 Zagreb | 2465 | S: 10000 Zagreb |
2466 | S: Croatia | 2466 | S: Croatia |
2467 | 2467 | ||
2468 | N: Jonathan Naylor | 2468 | N: Jonathan Naylor |
2469 | E: g4klx@g4klx.demon.co.uk | 2469 | E: g4klx@g4klx.demon.co.uk |
2470 | E: g4klx@amsat.org | 2470 | E: g4klx@amsat.org |
2471 | W: http://zone.pspt.fi/~jsn/ | 2471 | W: http://zone.pspt.fi/~jsn/ |
2472 | D: AX.25, NET/ROM and ROSE amateur radio protocol suites | 2472 | D: AX.25, NET/ROM and ROSE amateur radio protocol suites |
2473 | D: CCITT X.25 PLP and LAPB. | 2473 | D: CCITT X.25 PLP and LAPB. |
2474 | S: 24 Castle View Drive | 2474 | S: 24 Castle View Drive |
2475 | S: Cromford | 2475 | S: Cromford |
2476 | S: Matlock | 2476 | S: Matlock |
2477 | S: Derbyshire DE4 3RL | 2477 | S: Derbyshire DE4 3RL |
2478 | S: United Kingdom | 2478 | S: United Kingdom |
2479 | 2479 | ||
2480 | N: Ian S. Nelson | 2480 | N: Ian S. Nelson |
2481 | E: ian.nelson@echostar.com | 2481 | E: nelsonis@earthlink.net |
2482 | P: 1024D/00D3D983 3EFD 7B86 B888 D7E2 29B6 9E97 576F 1B97 00D3 D983 | ||
2482 | D: Minor mmap and ide hacks | 2483 | D: Minor mmap and ide hacks |
2483 | S: 1370 Atlantis Ave. | 2484 | S: 1370 Atlantis Ave. |
2484 | S: Lafayette CO, 80026 | 2485 | S: Lafayette CO, 80026 |
2485 | S: USA | 2486 | S: USA |
2486 | 2487 | ||
2487 | N: Russell Nelson | 2488 | N: Russell Nelson |
2488 | E: nelson@crynwr.com | 2489 | E: nelson@crynwr.com |
2489 | W: http://www.crynwr.com/~nelson | 2490 | W: http://www.crynwr.com/~nelson |
2490 | P: 1024/83942741 FF 68 EE 27 A0 5A AA C3 F5 DC 05 62 BD 5B 20 2F | 2491 | P: 1024/83942741 FF 68 EE 27 A0 5A AA C3 F5 DC 05 62 BD 5B 20 2F |
2491 | D: Author of cs89x0, maintainer of kernel changelog through 1.3.3 | 2492 | D: Author of cs89x0, maintainer of kernel changelog through 1.3.3 |
2492 | D: Wrote many packet drivers, from which some Ethernet drivers are derived. | 2493 | D: Wrote many packet drivers, from which some Ethernet drivers are derived. |
2493 | S: 521 Pleasant Valley Road | 2494 | S: 521 Pleasant Valley Road |
2494 | S: Potsdam, New York 13676 | 2495 | S: Potsdam, New York 13676 |
2495 | S: USA | 2496 | S: USA |
2496 | 2497 | ||
2497 | N: Dave Neuer | 2498 | N: Dave Neuer |
2498 | E: dave.neuer@pobox.com | 2499 | E: dave.neuer@pobox.com |
2499 | D: Helped implement support for Compaq's H31xx series iPAQs | 2500 | D: Helped implement support for Compaq's H31xx series iPAQs |
2500 | D: Other mostly minor tweaks & bugfixes | 2501 | D: Other mostly minor tweaks & bugfixes |
2501 | 2502 | ||
2502 | N: Michael Neuffer | 2503 | N: Michael Neuffer |
2503 | E: mike@i-Connect.Net | 2504 | E: mike@i-Connect.Net |
2504 | E: neuffer@goofy.zdv.uni-mainz.de | 2505 | E: neuffer@goofy.zdv.uni-mainz.de |
2505 | W: http://www.i-Connect.Net/~mike/ | 2506 | W: http://www.i-Connect.Net/~mike/ |
2506 | D: Developer and maintainer of the EATA-DMA SCSI driver | 2507 | D: Developer and maintainer of the EATA-DMA SCSI driver |
2507 | D: Co-developer EATA-PIO SCSI driver | 2508 | D: Co-developer EATA-PIO SCSI driver |
2508 | D: /proc/scsi and assorted other snippets | 2509 | D: /proc/scsi and assorted other snippets |
2509 | S: Zum Schiersteiner Grund 2 | 2510 | S: Zum Schiersteiner Grund 2 |
2510 | S: 55127 Mainz | 2511 | S: 55127 Mainz |
2511 | S: Germany | 2512 | S: Germany |
2512 | 2513 | ||
2513 | N: Gustavo Niemeyer | 2514 | N: Gustavo Niemeyer |
2514 | E: niemeyer@conectiva.com | 2515 | E: niemeyer@conectiva.com |
2515 | W: https://moin.conectiva.com.br/GustavoNiemeyer | 2516 | W: https://moin.conectiva.com.br/GustavoNiemeyer |
2516 | D: wl3501 PCMCIA wireless card initial support for wireless extensions in 2.4 | 2517 | D: wl3501 PCMCIA wireless card initial support for wireless extensions in 2.4 |
2517 | S: Conectiva S.A. | 2518 | S: Conectiva S.A. |
2518 | S: R. Tocantins 89 | 2519 | S: R. Tocantins 89 |
2519 | S: 80050-430 Curitiba PR | 2520 | S: 80050-430 Curitiba PR |
2520 | S: Brazil | 2521 | S: Brazil |
2521 | 2522 | ||
2522 | N: David C. Niemi | 2523 | N: David C. Niemi |
2523 | E: niemi@tux.org | 2524 | E: niemi@tux.org |
2524 | W: http://www.tux.org/~niemi/ | 2525 | W: http://www.tux.org/~niemi/ |
2525 | D: Assistant maintainer of Mtools, fdutils, and floppy driver | 2526 | D: Assistant maintainer of Mtools, fdutils, and floppy driver |
2526 | D: Administrator of Tux.Org Linux Server, http://www.tux.org | 2527 | D: Administrator of Tux.Org Linux Server, http://www.tux.org |
2527 | S: 2364 Old Trail Drive | 2528 | S: 2364 Old Trail Drive |
2528 | S: Reston, Virginia 20191 | 2529 | S: Reston, Virginia 20191 |
2529 | S: USA | 2530 | S: USA |
2530 | 2531 | ||
2531 | N: Fredrik Noring | 2532 | N: Fredrik Noring |
2532 | E: noring@nocrew.org | 2533 | E: noring@nocrew.org |
2533 | W: http://www.lysator.liu.se/~noring/ | 2534 | W: http://www.lysator.liu.se/~noring/ |
2534 | D: dsp56k device driver | 2535 | D: dsp56k device driver |
2535 | 2536 | ||
2536 | N: Michael O'Reilly | 2537 | N: Michael O'Reilly |
2537 | E: michael@iinet.com.au | 2538 | E: michael@iinet.com.au |
2538 | E: oreillym@tartarus.uwa.edu.au | 2539 | E: oreillym@tartarus.uwa.edu.au |
2539 | D: Wrote the original dynamic sized disk cache stuff. I think the only | 2540 | D: Wrote the original dynamic sized disk cache stuff. I think the only |
2540 | D: part that remains is the GFP_KERNEL et al #defines. :) | 2541 | D: part that remains is the GFP_KERNEL et al #defines. :) |
2541 | S: 192 Nichsolson Road | 2542 | S: 192 Nichsolson Road |
2542 | S: Subiaco, 6008 | 2543 | S: Subiaco, 6008 |
2543 | S: Perth, Western Australia | 2544 | S: Perth, Western Australia |
2544 | S: Australia | 2545 | S: Australia |
2545 | 2546 | ||
2546 | N: Greg Page | 2547 | N: Greg Page |
2547 | E: gpage@sovereign.org | 2548 | E: gpage@sovereign.org |
2548 | D: IPX development and support | 2549 | D: IPX development and support |
2549 | 2550 | ||
2550 | N: David Parsons | 2551 | N: David Parsons |
2551 | E: orc@pell.chi.il.us | 2552 | E: orc@pell.chi.il.us |
2552 | D: improved memory detection code. | 2553 | D: improved memory detection code. |
2553 | 2554 | ||
2554 | N: Ivan Passos | 2555 | N: Ivan Passos |
2555 | E: ivan@cyclades.com | 2556 | E: ivan@cyclades.com |
2556 | D: Author of the Cyclades-PC300 synchronous card driver | 2557 | D: Author of the Cyclades-PC300 synchronous card driver |
2557 | D: Maintainer of the Cyclom-Y/Cyclades-Z asynchronous card driver | 2558 | D: Maintainer of the Cyclom-Y/Cyclades-Z asynchronous card driver |
2558 | S: Cyclades Corp | 2559 | S: Cyclades Corp |
2559 | S: 41934 Christy St | 2560 | S: 41934 Christy St |
2560 | S: Fremont, CA 94538 | 2561 | S: Fremont, CA 94538 |
2561 | S: USA | 2562 | S: USA |
2562 | 2563 | ||
2563 | N: Mikulas Patocka | 2564 | N: Mikulas Patocka |
2564 | E: mikulas@artax.karlin.mff.cuni.cz | 2565 | E: mikulas@artax.karlin.mff.cuni.cz |
2565 | W: http://artax.karlin.mff.cuni.cz/~mikulas/ | 2566 | W: http://artax.karlin.mff.cuni.cz/~mikulas/ |
2566 | P: 1024/BB11D2D5 A0 F1 28 4A C4 14 1E CF 92 58 7A 8F 69 BC A4 D3 | 2567 | P: 1024/BB11D2D5 A0 F1 28 4A C4 14 1E CF 92 58 7A 8F 69 BC A4 D3 |
2567 | D: Read/write HPFS filesystem | 2568 | D: Read/write HPFS filesystem |
2568 | S: Weissova 8 | 2569 | S: Weissova 8 |
2569 | S: 644 00 Brno | 2570 | S: 644 00 Brno |
2570 | S: Czech Republic | 2571 | S: Czech Republic |
2571 | 2572 | ||
2572 | N: Vojtech Pavlik | 2573 | N: Vojtech Pavlik |
2573 | E: vojtech@suse.cz | 2574 | E: vojtech@suse.cz |
2574 | D: Joystick driver | 2575 | D: Joystick driver |
2575 | D: arcnet-hardware readme | 2576 | D: arcnet-hardware readme |
2576 | D: Minor ARCnet hacking | 2577 | D: Minor ARCnet hacking |
2577 | D: USB (HID, ACM, Printer ...) | 2578 | D: USB (HID, ACM, Printer ...) |
2578 | S: Ucitelska 1576 | 2579 | S: Ucitelska 1576 |
2579 | S: Prague 8 | 2580 | S: Prague 8 |
2580 | S: 182 00 Czech Republic | 2581 | S: 182 00 Czech Republic |
2581 | 2582 | ||
2582 | N: Barak A. Pearlmutter | 2583 | N: Barak A. Pearlmutter |
2583 | E: bap@cs.unm.edu | 2584 | E: bap@cs.unm.edu |
2584 | W: http://www.cs.unm.edu/~bap/ | 2585 | W: http://www.cs.unm.edu/~bap/ |
2585 | P: 512/602D785D 9B A1 83 CD EE CB AD 93 20 C6 4C B7 F5 E9 60 D4 | 2586 | P: 512/602D785D 9B A1 83 CD EE CB AD 93 20 C6 4C B7 F5 E9 60 D4 |
2586 | D: Author of mark-and-sweep GC integrated by Alan Cox | 2587 | D: Author of mark-and-sweep GC integrated by Alan Cox |
2587 | S: Computer Science Department | 2588 | S: Computer Science Department |
2588 | S: FEC 313 | 2589 | S: FEC 313 |
2589 | S: University of New Mexico | 2590 | S: University of New Mexico |
2590 | S: Albuquerque, New Mexico 87131 | 2591 | S: Albuquerque, New Mexico 87131 |
2591 | S: USA | 2592 | S: USA |
2592 | 2593 | ||
2593 | N: Avery Pennarun | 2594 | N: Avery Pennarun |
2594 | E: apenwarr@worldvisions.ca | 2595 | E: apenwarr@worldvisions.ca |
2595 | W: http://www.worldvisions.ca/~apenwarr/ | 2596 | W: http://www.worldvisions.ca/~apenwarr/ |
2596 | D: ARCnet driver | 2597 | D: ARCnet driver |
2597 | D: "make xconfig" improvements | 2598 | D: "make xconfig" improvements |
2598 | D: Various minor hacking | 2599 | D: Various minor hacking |
2599 | S: RR #5, 497 Pole Line Road | 2600 | S: RR #5, 497 Pole Line Road |
2600 | S: Thunder Bay, Ontario | 2601 | S: Thunder Bay, Ontario |
2601 | S: CANADA P7C 5M9 | 2602 | S: CANADA P7C 5M9 |
2602 | 2603 | ||
2603 | N: Yuri Per | 2604 | N: Yuri Per |
2604 | E: yuri@pts.mipt.ru | 2605 | E: yuri@pts.mipt.ru |
2605 | D: Some smbfs fixes | 2606 | D: Some smbfs fixes |
2606 | S: Demonstratsii 8-382 | 2607 | S: Demonstratsii 8-382 |
2607 | S: Tula 300000 | 2608 | S: Tula 300000 |
2608 | S: Russia | 2609 | S: Russia |
2609 | 2610 | ||
2610 | N: Gordon Peters | 2611 | N: Gordon Peters |
2611 | E: GordPeters@smarttech.com | 2612 | E: GordPeters@smarttech.com |
2612 | D: Isochronous receive for IEEE 1394 driver (OHCI module). | 2613 | D: Isochronous receive for IEEE 1394 driver (OHCI module). |
2613 | D: Bugfixes for the aforementioned. | 2614 | D: Bugfixes for the aforementioned. |
2614 | S: Calgary, Alberta | 2615 | S: Calgary, Alberta |
2615 | S: Canada | 2616 | S: Canada |
2616 | 2617 | ||
2617 | N: Johnnie Peters | 2618 | N: Johnnie Peters |
2618 | E: jpeters@phx.mcd.mot.com | 2619 | E: jpeters@phx.mcd.mot.com |
2619 | D: Motorola PowerPC changes for PReP | 2620 | D: Motorola PowerPC changes for PReP |
2620 | S: 2900 S. Diable Way | 2621 | S: 2900 S. Diable Way |
2621 | S: Tempe, Arizona 85282 | 2622 | S: Tempe, Arizona 85282 |
2622 | S: USA | 2623 | S: USA |
2623 | 2624 | ||
2624 | N: Kirk Petersen | 2625 | N: Kirk Petersen |
2625 | E: kirk@speakeasy.org | 2626 | E: kirk@speakeasy.org |
2626 | W: http://www.speakeasy.org/~kirk/ | 2627 | W: http://www.speakeasy.org/~kirk/ |
2627 | D: implemented kmod | 2628 | D: implemented kmod |
2628 | D: modularized BSD Unix domain sockets | 2629 | D: modularized BSD Unix domain sockets |
2629 | 2630 | ||
2630 | N: Martin Kasper Petersen | 2631 | N: Martin Kasper Petersen |
2631 | E: mkp@mkp.net | 2632 | E: mkp@mkp.net |
2632 | D: PA-RISC port | 2633 | D: PA-RISC port |
2633 | D: XFS file system | 2634 | D: XFS file system |
2634 | D: kiobuf based block I/O work | 2635 | D: kiobuf based block I/O work |
2635 | S: 314 Frank St. | 2636 | S: 314 Frank St. |
2636 | S: Ottawa, Ontario | 2637 | S: Ottawa, Ontario |
2637 | S: Canada K2P 0X8 | 2638 | S: Canada K2P 0X8 |
2638 | 2639 | ||
2639 | N: Mikael Pettersson | 2640 | N: Mikael Pettersson |
2640 | E: mikpe@csd.uu.se | 2641 | E: mikpe@csd.uu.se |
2641 | W: http://www.csd.uu.se/~mikpe/ | 2642 | W: http://www.csd.uu.se/~mikpe/ |
2642 | D: Miscellaneous fixes | 2643 | D: Miscellaneous fixes |
2643 | 2644 | ||
2644 | N: Reed H. Petty | 2645 | N: Reed H. Petty |
2645 | E: rhp@draper.net | 2646 | E: rhp@draper.net |
2646 | W: http://www.draper.net | 2647 | W: http://www.draper.net |
2647 | D: Loop device driver extensions | 2648 | D: Loop device driver extensions |
2648 | D: Encryption transfer modules (no export) | 2649 | D: Encryption transfer modules (no export) |
2649 | S: Post Office Box 1815 | 2650 | S: Post Office Box 1815 |
2650 | S: Harrison, Arkansas 72602-1815 | 2651 | S: Harrison, Arkansas 72602-1815 |
2651 | S: USA | 2652 | S: USA |
2652 | 2653 | ||
2653 | N: Kai Petzke | 2654 | N: Kai Petzke |
2654 | E: petzke@teltarif.de | 2655 | E: petzke@teltarif.de |
2655 | W: http://www.teltarif.de/ | 2656 | W: http://www.teltarif.de/ |
2656 | P: 1024/B42868C1 D9 59 B9 98 BB 93 05 38 2E 3E 31 79 C3 65 5D E1 | 2657 | P: 1024/B42868C1 D9 59 B9 98 BB 93 05 38 2E 3E 31 79 C3 65 5D E1 |
2657 | D: Driver for Laser Magnetic Storage CD-ROM | 2658 | D: Driver for Laser Magnetic Storage CD-ROM |
2658 | D: Some kernel bug fixes | 2659 | D: Some kernel bug fixes |
2659 | D: Port of the database Postgres | 2660 | D: Port of the database Postgres |
2660 | D: Book: "Linux verstehen und anwenden" (Hanser-Verlag) | 2661 | D: Book: "Linux verstehen und anwenden" (Hanser-Verlag) |
2661 | S: Triftstra=DFe 55 | 2662 | S: Triftstra=DFe 55 |
2662 | S: 13353 Berlin | 2663 | S: 13353 Berlin |
2663 | S: Germany | 2664 | S: Germany |
2664 | 2665 | ||
2665 | N: Emanuel Pirker | 2666 | N: Emanuel Pirker |
2666 | E: epirker@edu.uni-klu.ac.at | 2667 | E: epirker@edu.uni-klu.ac.at |
2667 | D: AIC5800 IEEE 1394, RAW I/O on 1394 | 2668 | D: AIC5800 IEEE 1394, RAW I/O on 1394 |
2668 | D: Starter of Linux1394 effort | 2669 | D: Starter of Linux1394 effort |
2669 | S: ask per mail for current address | 2670 | S: ask per mail for current address |
2670 | 2671 | ||
2671 | N: Nicolas Pitre | 2672 | N: Nicolas Pitre |
2672 | E: nico@cam.org | 2673 | E: nico@cam.org |
2673 | D: StrongARM SA1100 support integrator & hacker | 2674 | D: StrongARM SA1100 support integrator & hacker |
2674 | D: Xscale PXA architecture | 2675 | D: Xscale PXA architecture |
2675 | D: unified SMC 91C9x/91C11x ethernet driver (smc91x) | 2676 | D: unified SMC 91C9x/91C11x ethernet driver (smc91x) |
2676 | S: Montreal, Quebec, Canada | 2677 | S: Montreal, Quebec, Canada |
2677 | 2678 | ||
2678 | N: Ken Pizzini | 2679 | N: Ken Pizzini |
2679 | E: ken@halcyon.com | 2680 | E: ken@halcyon.com |
2680 | D: CDROM driver "sonycd535" (Sony CDU-535/531) | 2681 | D: CDROM driver "sonycd535" (Sony CDU-535/531) |
2681 | 2682 | ||
2682 | N: Stelian Pop | 2683 | N: Stelian Pop |
2683 | E: stelian@popies.net | 2684 | E: stelian@popies.net |
2684 | P: 1024D/EDBB6147 7B36 0E07 04BC 11DC A7A0 D3F7 7185 9E7A EDBB 6147 | 2685 | P: 1024D/EDBB6147 7B36 0E07 04BC 11DC A7A0 D3F7 7185 9E7A EDBB 6147 |
2685 | D: sonypi, meye drivers, mct_u232 usb serial hacks | 2686 | D: sonypi, meye drivers, mct_u232 usb serial hacks |
2686 | S: Paris, France | 2687 | S: Paris, France |
2687 | 2688 | ||
2688 | N: Pete Popov | 2689 | N: Pete Popov |
2689 | E: pete_popov@yahoo.com | 2690 | E: pete_popov@yahoo.com |
2690 | D: Linux/MIPS AMD/Alchemy Port and mips hacking and debugging | 2691 | D: Linux/MIPS AMD/Alchemy Port and mips hacking and debugging |
2691 | S: San Jose, CA 95134 | 2692 | S: San Jose, CA 95134 |
2692 | S: USA | 2693 | S: USA |
2693 | 2694 | ||
2694 | N: Matt Porter | 2695 | N: Matt Porter |
2695 | E: mporter@kernel.crashing.org | 2696 | E: mporter@kernel.crashing.org |
2696 | D: Motorola PowerPC PReP support | 2697 | D: Motorola PowerPC PReP support |
2697 | D: cPCI PowerPC support | 2698 | D: cPCI PowerPC support |
2698 | D: Embedded PowerPC 4xx/6xx/7xx/74xx support | 2699 | D: Embedded PowerPC 4xx/6xx/7xx/74xx support |
2699 | S: Chandler, Arizona 85249 | 2700 | S: Chandler, Arizona 85249 |
2700 | S: USA | 2701 | S: USA |
2701 | 2702 | ||
2702 | N: Frederic Potter | 2703 | N: Frederic Potter |
2703 | E: fpotter@cirpack.com | 2704 | E: fpotter@cirpack.com |
2704 | D: Some PCI kernel support | 2705 | D: Some PCI kernel support |
2705 | 2706 | ||
2706 | N: Rui Prior | 2707 | N: Rui Prior |
2707 | E: rprior@inescn.pt | 2708 | E: rprior@inescn.pt |
2708 | D: ATM device driver for NICStAR based cards | 2709 | D: ATM device driver for NICStAR based cards |
2709 | 2710 | ||
2710 | N: Stefan Probst | 2711 | N: Stefan Probst |
2711 | E: sp@caldera.de | 2712 | E: sp@caldera.de |
2712 | D: The Linux Support Team Erlangen, 1993-97 | 2713 | D: The Linux Support Team Erlangen, 1993-97 |
2713 | S: Caldera (Deutschland) GmbH | 2714 | S: Caldera (Deutschland) GmbH |
2714 | S: Lazarettstrasse 8 | 2715 | S: Lazarettstrasse 8 |
2715 | S: 91054 Erlangen | 2716 | S: 91054 Erlangen |
2716 | S: Germany | 2717 | S: Germany |
2717 | 2718 | ||
2718 | N: Giuliano Procida | 2719 | N: Giuliano Procida |
2719 | E: myxie@debian.org,gprocida@madge.com | 2720 | E: myxie@debian.org,gprocida@madge.com |
2720 | D: Madge Ambassador driver (Collage 155 Server ATM adapter) | 2721 | D: Madge Ambassador driver (Collage 155 Server ATM adapter) |
2721 | D: Madge Horizon driver (Collage 25 and 155 Client ATM adapters) | 2722 | D: Madge Horizon driver (Collage 25 and 155 Client ATM adapters) |
2722 | P: 1024/93898735 D3 9E F4 F7 6D 8D 2F 3A 38 BA 06 7C 2B 33 43 7D | 2723 | P: 1024/93898735 D3 9E F4 F7 6D 8D 2F 3A 38 BA 06 7C 2B 33 43 7D |
2723 | S: Madge Networks | 2724 | S: Madge Networks |
2724 | S: Framewood Road | 2725 | S: Framewood Road |
2725 | S: Wexham SL3 6PJ | 2726 | S: Wexham SL3 6PJ |
2726 | S: United Kingdom | 2727 | S: United Kingdom |
2727 | 2728 | ||
2728 | N: Daniel Quinlan | 2729 | N: Daniel Quinlan |
2729 | E: quinlan@pathname.com | 2730 | E: quinlan@pathname.com |
2730 | W: http://www.pathname.com/~quinlan/ | 2731 | W: http://www.pathname.com/~quinlan/ |
2731 | D: FSSTND coordinator; FHS editor | 2732 | D: FSSTND coordinator; FHS editor |
2732 | D: random Linux documentation, patches, and hacks | 2733 | D: random Linux documentation, patches, and hacks |
2733 | S: 4390 Albany Drive #41A | 2734 | S: 4390 Albany Drive #41A |
2734 | S: San Jose, California 95129 | 2735 | S: San Jose, California 95129 |
2735 | S: USA | 2736 | S: USA |
2736 | 2737 | ||
2737 | N: Juan Quintela | 2738 | N: Juan Quintela |
2738 | E: quintela@fi.udc.es | 2739 | E: quintela@fi.udc.es |
2739 | D: Memory Management hacking | 2740 | D: Memory Management hacking |
2740 | S: LFCIA | 2741 | S: LFCIA |
2741 | S: Departamento de Computaciรณn | 2742 | S: Departamento de Computaciรณn |
2742 | S: Universidade da Coruรฑa | 2743 | S: Universidade da Coruรฑa |
2743 | S: E-15071 | 2744 | S: E-15071 |
2744 | S: A Coruรฑa | 2745 | S: A Coruรฑa |
2745 | S: Spain | 2746 | S: Spain |
2746 | 2747 | ||
2747 | N: Augusto Cesar Radtke | 2748 | N: Augusto Cesar Radtke |
2748 | E: bishop@sekure.org | 2749 | E: bishop@sekure.org |
2749 | W: http://bishop.sekure.org | 2750 | W: http://bishop.sekure.org |
2750 | D: {copy,get,put}_user calls updates | 2751 | D: {copy,get,put}_user calls updates |
2751 | D: Miscellaneous hacks | 2752 | D: Miscellaneous hacks |
2752 | S: R. Otto Marquardt, 226 - Garcia | 2753 | S: R. Otto Marquardt, 226 - Garcia |
2753 | S: 89020-350 Blumenau - Santa Catarina | 2754 | S: 89020-350 Blumenau - Santa Catarina |
2754 | S: Brazil | 2755 | S: Brazil |
2755 | 2756 | ||
2756 | N: Goutham Rao | 2757 | N: Goutham Rao |
2757 | E: goutham.rao@intel.com | 2758 | E: goutham.rao@intel.com |
2758 | D: Linux/IA-64 | 2759 | D: Linux/IA-64 |
2759 | S: 2200 Mission College Blvd | 2760 | S: 2200 Mission College Blvd |
2760 | S: Santa Clara, CA 95052 | 2761 | S: Santa Clara, CA 95052 |
2761 | S: USA | 2762 | S: USA |
2762 | 2763 | ||
2763 | N: Eric S. Raymond | 2764 | N: Eric S. Raymond |
2764 | E: esr@thyrsus.com | 2765 | E: esr@thyrsus.com |
2765 | W: http://www.tuxedo.org/~esr/ | 2766 | W: http://www.tuxedo.org/~esr/ |
2766 | D: terminfo master file maintainer | 2767 | D: terminfo master file maintainer |
2767 | D: Editor: Installation HOWTO, Distributions HOWTO, XFree86 HOWTO | 2768 | D: Editor: Installation HOWTO, Distributions HOWTO, XFree86 HOWTO |
2768 | D: Author: fetchmail, Emacs VC mode, Emacs GUD mode | 2769 | D: Author: fetchmail, Emacs VC mode, Emacs GUD mode |
2769 | S: 6 Karen Drive | 2770 | S: 6 Karen Drive |
2770 | S: Malvern, Pennsylvania 19355 | 2771 | S: Malvern, Pennsylvania 19355 |
2771 | S: USA | 2772 | S: USA |
2772 | 2773 | ||
2773 | N: Stefan Reinauer | 2774 | N: Stefan Reinauer |
2774 | E: stepan@linux.de | 2775 | E: stepan@linux.de |
2775 | W: http://www.freiburg.linux.de/~stepan/ | 2776 | W: http://www.freiburg.linux.de/~stepan/ |
2776 | D: Modularization of some filesystems | 2777 | D: Modularization of some filesystems |
2777 | D: /proc/sound, minor fixes | 2778 | D: /proc/sound, minor fixes |
2778 | S: Schlossbergring 9 | 2779 | S: Schlossbergring 9 |
2779 | S: 79098 Freiburg | 2780 | S: 79098 Freiburg |
2780 | S: Germany | 2781 | S: Germany |
2781 | 2782 | ||
2782 | N: Joerg Reuter | 2783 | N: Joerg Reuter |
2783 | E: jreuter@yaina.de | 2784 | E: jreuter@yaina.de |
2784 | W: http://yaina.de/jreuter/ | 2785 | W: http://yaina.de/jreuter/ |
2785 | W: http://www.qsl.net/dl1bke/ | 2786 | W: http://www.qsl.net/dl1bke/ |
2786 | D: Generic Z8530 driver, AX.25 DAMA slave implementation | 2787 | D: Generic Z8530 driver, AX.25 DAMA slave implementation |
2787 | D: Several AX.25 hacks | 2788 | D: Several AX.25 hacks |
2788 | 2789 | ||
2789 | N: Francois-Rene Rideau | 2790 | N: Francois-Rene Rideau |
2790 | E: fare@tunes.org | 2791 | E: fare@tunes.org |
2791 | W: http://www.tunes.org/~fare | 2792 | W: http://www.tunes.org/~fare |
2792 | D: petty kernel janitor (byteorder, ufs) | 2793 | D: petty kernel janitor (byteorder, ufs) |
2793 | S: 6, rue Augustin Thierry | 2794 | S: 6, rue Augustin Thierry |
2794 | S: 75019 Paris | 2795 | S: 75019 Paris |
2795 | S: France | 2796 | S: France |
2796 | 2797 | ||
2797 | N: Rik van Riel | 2798 | N: Rik van Riel |
2798 | E: riel@redhat.com | 2799 | E: riel@redhat.com |
2799 | W: http://www.surriel.com/ | 2800 | W: http://www.surriel.com/ |
2800 | D: Linux-MM site, Documentation/sysctl/*, swap/mm readaround | 2801 | D: Linux-MM site, Documentation/sysctl/*, swap/mm readaround |
2801 | D: kswapd fixes, random kernel hacker, rmap VM, | 2802 | D: kswapd fixes, random kernel hacker, rmap VM, |
2802 | D: nl.linux.org administrator, minor scheduler additions | 2803 | D: nl.linux.org administrator, minor scheduler additions |
2803 | S: Red Hat Boston | 2804 | S: Red Hat Boston |
2804 | S: 3 Lan Drive | 2805 | S: 3 Lan Drive |
2805 | S: Westford, MA 01886 | 2806 | S: Westford, MA 01886 |
2806 | S: USA | 2807 | S: USA |
2807 | 2808 | ||
2808 | N: Pekka Riikonen | 2809 | N: Pekka Riikonen |
2809 | E: priikone@poseidon.pspt.fi | 2810 | E: priikone@poseidon.pspt.fi |
2810 | E: priikone@ssh.com | 2811 | E: priikone@ssh.com |
2811 | D: Random kernel hacking and bug fixes | 2812 | D: Random kernel hacking and bug fixes |
2812 | D: International kernel patch project | 2813 | D: International kernel patch project |
2813 | S: Kasarmikatu 11 A4 | 2814 | S: Kasarmikatu 11 A4 |
2814 | S: 70110 Kuopio | 2815 | S: 70110 Kuopio |
2815 | S: Finland | 2816 | S: Finland |
2816 | 2817 | ||
2817 | N: Luca Risolia | 2818 | N: Luca Risolia |
2818 | E: luca.risolia@studio.unibo.it | 2819 | E: luca.risolia@studio.unibo.it |
2819 | P: 1024D/FCE635A4 88E8 F32F 7244 68BA 3958 5D40 99DA 5D2A FCE6 35A4 | 2820 | P: 1024D/FCE635A4 88E8 F32F 7244 68BA 3958 5D40 99DA 5D2A FCE6 35A4 |
2820 | D: V4L driver for W996[87]CF JPEG USB Dual Mode Camera Chips | 2821 | D: V4L driver for W996[87]CF JPEG USB Dual Mode Camera Chips |
2821 | D: V4L2 driver for SN9C10x PC Camera Controllers | 2822 | D: V4L2 driver for SN9C10x PC Camera Controllers |
2822 | D: V4L2 driver for ET61X151 and ET61X251 PC Camera Controllers | 2823 | D: V4L2 driver for ET61X151 and ET61X251 PC Camera Controllers |
2823 | D: V4L2 driver for ZC0301 Image Processor and Control Chip | 2824 | D: V4L2 driver for ZC0301 Image Processor and Control Chip |
2824 | S: Via Liberta' 41/A | 2825 | S: Via Liberta' 41/A |
2825 | S: Osio Sotto, 24046, Bergamo | 2826 | S: Osio Sotto, 24046, Bergamo |
2826 | S: Italy | 2827 | S: Italy |
2827 | 2828 | ||
2828 | N: William E. Roadcap | 2829 | N: William E. Roadcap |
2829 | E: roadcapw@cfw.com | 2830 | E: roadcapw@cfw.com |
2830 | W: http://www.cfw.com/~roadcapw | 2831 | W: http://www.cfw.com/~roadcapw |
2831 | D: Author of menu based configuration tool, Menuconfig. | 2832 | D: Author of menu based configuration tool, Menuconfig. |
2832 | S: 1407 Broad Street | 2833 | S: 1407 Broad Street |
2833 | S: Waynesboro, Virginia 22980 | 2834 | S: Waynesboro, Virginia 22980 |
2834 | S: USA | 2835 | S: USA |
2835 | 2836 | ||
2836 | N: Andrew J. Robinson | 2837 | N: Andrew J. Robinson |
2837 | E: arobinso@nyx.net | 2838 | E: arobinso@nyx.net |
2838 | W: http://www.nyx.net/~arobinso | 2839 | W: http://www.nyx.net/~arobinso |
2839 | D: Hayes ESP serial port driver | 2840 | D: Hayes ESP serial port driver |
2840 | 2841 | ||
2841 | N: Florian La Roche | 2842 | N: Florian La Roche |
2842 | E: rzsfl@rz.uni-sb.de | 2843 | E: rzsfl@rz.uni-sb.de |
2843 | E: flla@stud.uni-sb.de | 2844 | E: flla@stud.uni-sb.de |
2844 | D: Net programs and kernel net hacker | 2845 | D: Net programs and kernel net hacker |
2845 | S: Gaildorfer Str. 27 | 2846 | S: Gaildorfer Str. 27 |
2846 | S: 7000 Stuttgart 50 | 2847 | S: 7000 Stuttgart 50 |
2847 | S: Germany | 2848 | S: Germany |
2848 | 2849 | ||
2849 | N: Christoph Rohland | 2850 | N: Christoph Rohland |
2850 | E: hans-christoph.rohland@sap.com | 2851 | E: hans-christoph.rohland@sap.com |
2851 | E: ch.rohland@gmx.net | 2852 | E: ch.rohland@gmx.net |
2852 | D: shm fs, SYSV semaphores, af_unix | 2853 | D: shm fs, SYSV semaphores, af_unix |
2853 | S: Neue Heimat Str. 8 | 2854 | S: Neue Heimat Str. 8 |
2854 | S: D-68789 St.Leon-Rot | 2855 | S: D-68789 St.Leon-Rot |
2855 | S: Germany | 2856 | S: Germany |
2856 | 2857 | ||
2857 | N: Thiago Berlitz Rondon | 2858 | N: Thiago Berlitz Rondon |
2858 | E: maluco@mileniumnet.com.br | 2859 | E: maluco@mileniumnet.com.br |
2859 | W: http://vivaldi.linuxms.com.br/~maluco | 2860 | W: http://vivaldi.linuxms.com.br/~maluco |
2860 | D: Miscellaneous kernel hacker | 2861 | D: Miscellaneous kernel hacker |
2861 | S: R. Anhanguera, 1487 - Ipiranga | 2862 | S: R. Anhanguera, 1487 - Ipiranga |
2862 | S: 79080-740 - Campo Grande - Mato Grosso do Sul | 2863 | S: 79080-740 - Campo Grande - Mato Grosso do Sul |
2863 | S: Brazil | 2864 | S: Brazil |
2864 | 2865 | ||
2865 | N: Stephen Rothwell | 2866 | N: Stephen Rothwell |
2866 | E: sfr@canb.auug.org.au | 2867 | E: sfr@canb.auug.org.au |
2867 | W: http://www.canb.auug.org.au/~sfr | 2868 | W: http://www.canb.auug.org.au/~sfr |
2868 | P: 1024/BD8C7805 CD A4 9D 01 10 6E 7E 3B 91 88 FA D9 C8 40 AA 02 | 2869 | P: 1024/BD8C7805 CD A4 9D 01 10 6E 7E 3B 91 88 FA D9 C8 40 AA 02 |
2869 | D: Boot/setup/build work for setup > 2K | 2870 | D: Boot/setup/build work for setup > 2K |
2870 | D: Author, APM driver | 2871 | D: Author, APM driver |
2871 | D: Directory notification | 2872 | D: Directory notification |
2872 | S: 66 Maltby Circuit | 2873 | S: 66 Maltby Circuit |
2873 | S: Wanniassa ACT 2903 | 2874 | S: Wanniassa ACT 2903 |
2874 | S: Australia | 2875 | S: Australia |
2875 | 2876 | ||
2876 | N: Gerard Roudier | 2877 | N: Gerard Roudier |
2877 | E: groudier@free.fr | 2878 | E: groudier@free.fr |
2878 | D: Contributed to asynchronous read-ahead improvement | 2879 | D: Contributed to asynchronous read-ahead improvement |
2879 | S: 21 Rue Carnot | 2880 | S: 21 Rue Carnot |
2880 | S: 95170 Deuil La Barre | 2881 | S: 95170 Deuil La Barre |
2881 | S: France | 2882 | S: France |
2882 | 2883 | ||
2883 | N: Sebastien Rougeaux | 2884 | N: Sebastien Rougeaux |
2884 | E: Sebastien.Rougeaux@syseng.anu.edu.au | 2885 | E: Sebastien.Rougeaux@syseng.anu.edu.au |
2885 | D: IEEE 1394 OHCI module | 2886 | D: IEEE 1394 OHCI module |
2886 | S: Research School of Information Science and Engineering | 2887 | S: Research School of Information Science and Engineering |
2887 | S: The Australian National University, ACT 0200 | 2888 | S: The Australian National University, ACT 0200 |
2888 | S: Australia | 2889 | S: Australia |
2889 | 2890 | ||
2890 | N: Aristeu Sergio Rozanski Filho | 2891 | N: Aristeu Sergio Rozanski Filho |
2891 | E: aris@cathedrallabs.org | 2892 | E: aris@cathedrallabs.org |
2892 | D: Support for EtherExpress 10 ISA (i82595) in eepro driver | 2893 | D: Support for EtherExpress 10 ISA (i82595) in eepro driver |
2893 | D: User level driver support for input | 2894 | D: User level driver support for input |
2894 | S: R. Jose Serrato, 130 - Santa Candida | 2895 | S: R. Jose Serrato, 130 - Santa Candida |
2895 | S: 82640-320 - Curitiba - Paranรก | 2896 | S: 82640-320 - Curitiba - Paranรก |
2896 | S: Brazil | 2897 | S: Brazil |
2897 | 2898 | ||
2898 | N: Alessandro Rubini | 2899 | N: Alessandro Rubini |
2899 | E: rubini@ipvvis.unipv.it | 2900 | E: rubini@ipvvis.unipv.it |
2900 | D: the gpm mouse server and kernel support for it | 2901 | D: the gpm mouse server and kernel support for it |
2901 | 2902 | ||
2902 | N: Philipp Rumpf | 2903 | N: Philipp Rumpf |
2903 | E: prumpf@tux.org | 2904 | E: prumpf@tux.org |
2904 | D: random bugfixes | 2905 | D: random bugfixes |
2905 | S: Drausnickstrasse 29 | 2906 | S: Drausnickstrasse 29 |
2906 | S: 91052 Erlangen | 2907 | S: 91052 Erlangen |
2907 | S: Germany | 2908 | S: Germany |
2908 | 2909 | ||
2909 | N: Paul `Rusty' Russell | 2910 | N: Paul `Rusty' Russell |
2910 | E: rusty@rustcorp.com.au | 2911 | E: rusty@rustcorp.com.au |
2911 | W: http://ozlabs.org/~rusty | 2912 | W: http://ozlabs.org/~rusty |
2912 | D: Ruggedly handsome. | 2913 | D: Ruggedly handsome. |
2913 | D: netfilter, ipchains with Michael Neuling. | 2914 | D: netfilter, ipchains with Michael Neuling. |
2914 | S: 52 Moore St | 2915 | S: 52 Moore St |
2915 | S: Turner ACT 2612 | 2916 | S: Turner ACT 2612 |
2916 | S: Australia | 2917 | S: Australia |
2917 | 2918 | ||
2918 | N: Richard Russon (FlatCap) | 2919 | N: Richard Russon (FlatCap) |
2919 | E: kernel@flatcap.org | 2920 | E: kernel@flatcap.org |
2920 | W: http://www.flatcap.org | 2921 | W: http://www.flatcap.org |
2921 | D: NTFS support | 2922 | D: NTFS support |
2922 | D: LDM support (Win2000/XP Logical Disk Manager/Dynamic Disks) | 2923 | D: LDM support (Win2000/XP Logical Disk Manager/Dynamic Disks) |
2923 | S: 50 Swansea Road | 2924 | S: 50 Swansea Road |
2924 | S: Reading | 2925 | S: Reading |
2925 | S: United Kingdom | 2926 | S: United Kingdom |
2926 | 2927 | ||
2927 | N: Bill Ryder | 2928 | N: Bill Ryder |
2928 | E: bryder@sgi.com | 2929 | E: bryder@sgi.com |
2929 | D: FTDI_SIO usb/serial converter driver | 2930 | D: FTDI_SIO usb/serial converter driver |
2930 | W: http://reality.sgi.com/bryder_wellington/ftdi_sio | 2931 | W: http://reality.sgi.com/bryder_wellington/ftdi_sio |
2931 | S: I/3 Walter St | 2932 | S: I/3 Walter St |
2932 | S: Wellington | 2933 | S: Wellington |
2933 | S: New Zealand | 2934 | S: New Zealand |
2934 | 2935 | ||
2935 | N: Sampo Saaristo | 2936 | N: Sampo Saaristo |
2936 | E: sambo@cs.tut.fi | 2937 | E: sambo@cs.tut.fi |
2937 | D: Co-author of Multi-Protocol Over ATM (MPOA) | 2938 | D: Co-author of Multi-Protocol Over ATM (MPOA) |
2938 | S: Tampere University of Technology / Telecom lab | 2939 | S: Tampere University of Technology / Telecom lab |
2939 | S: Hermiankatu 12C | 2940 | S: Hermiankatu 12C |
2940 | S: FIN-33720 Tampere | 2941 | S: FIN-33720 Tampere |
2941 | S: Finland | 2942 | S: Finland |
2942 | 2943 | ||
2943 | N: Thomas Sailer | 2944 | N: Thomas Sailer |
2944 | E: t.sailer@alumni.ethz.ch | 2945 | E: t.sailer@alumni.ethz.ch |
2945 | E: HB9JNX@HB9W.CHE.EU (packet radio) | 2946 | E: HB9JNX@HB9W.CHE.EU (packet radio) |
2946 | D: Baycom driver | 2947 | D: Baycom driver |
2947 | S: Markusstrasse 18 | 2948 | S: Markusstrasse 18 |
2948 | S: 8006 Zuerich | 2949 | S: 8006 Zuerich |
2949 | S: Switzerland | 2950 | S: Switzerland |
2950 | 2951 | ||
2951 | N: Manuel Estrada Sainz | 2952 | N: Manuel Estrada Sainz |
2952 | D: Firmware loader (request_firmware) | 2953 | D: Firmware loader (request_firmware) |
2953 | 2954 | ||
2954 | N: Wayne Salamon | 2955 | N: Wayne Salamon |
2955 | E: wsalamon@tislabs.com | 2956 | E: wsalamon@tislabs.com |
2956 | E: wsalamon@nai.com | 2957 | E: wsalamon@nai.com |
2957 | D: portions of the Linux Security Module (LSM) framework and security modules | 2958 | D: portions of the Linux Security Module (LSM) framework and security modules |
2958 | 2959 | ||
2959 | N: Robert Sanders | 2960 | N: Robert Sanders |
2960 | E: gt8134b@prism.gatech.edu | 2961 | E: gt8134b@prism.gatech.edu |
2961 | D: Dosemu | 2962 | D: Dosemu |
2962 | 2963 | ||
2963 | N: Duncan Sands | 2964 | N: Duncan Sands |
2964 | E: duncan.sands@free.fr | 2965 | E: duncan.sands@free.fr |
2965 | W: http://topo.math.u-psud.fr/~sands | 2966 | W: http://topo.math.u-psud.fr/~sands |
2966 | D: Alcatel SpeedTouch USB driver | 2967 | D: Alcatel SpeedTouch USB driver |
2967 | S: 69 rue Dunois | 2968 | S: 69 rue Dunois |
2968 | S: 75013 Paris | 2969 | S: 75013 Paris |
2969 | S: France | 2970 | S: France |
2970 | 2971 | ||
2971 | N: Hannu Savolainen | 2972 | N: Hannu Savolainen |
2972 | E: hannu@opensound.com | 2973 | E: hannu@opensound.com |
2973 | D: Maintainer of the sound drivers until 2.1.x days. | 2974 | D: Maintainer of the sound drivers until 2.1.x days. |
2974 | D: Original compressed boot image support. | 2975 | D: Original compressed boot image support. |
2975 | S: Valurink. 4A11 | 2976 | S: Valurink. 4A11 |
2976 | S: 03600 Karkkila | 2977 | S: 03600 Karkkila |
2977 | S: Finland | 2978 | S: Finland |
2978 | 2979 | ||
2979 | N: Deepak Saxena | 2980 | N: Deepak Saxena |
2980 | E: dsaxena@plexity.net | 2981 | E: dsaxena@plexity.net |
2981 | D: I2O kernel layer (config, block, core, pci, net). I2O disk support for LILO | 2982 | D: I2O kernel layer (config, block, core, pci, net). I2O disk support for LILO |
2982 | D: XScale(IOP, IXP) porting and other random ARM bits | 2983 | D: XScale(IOP, IXP) porting and other random ARM bits |
2983 | S: Portland, OR | 2984 | S: Portland, OR |
2984 | 2985 | ||
2985 | N: Eric Schenk | 2986 | N: Eric Schenk |
2986 | E: Eric.Schenk@dna.lth.se | 2987 | E: Eric.Schenk@dna.lth.se |
2987 | D: Random kernel debugging. | 2988 | D: Random kernel debugging. |
2988 | D: SYSV Semaphore code rewrite. | 2989 | D: SYSV Semaphore code rewrite. |
2989 | D: Network layer debugging. | 2990 | D: Network layer debugging. |
2990 | D: Dial on demand facility (diald). | 2991 | D: Dial on demand facility (diald). |
2991 | S: Dag Hammerskjolds v. 3E | 2992 | S: Dag Hammerskjolds v. 3E |
2992 | S: S-226 64 LUND | 2993 | S: S-226 64 LUND |
2993 | S: Sweden | 2994 | S: Sweden |
2994 | 2995 | ||
2995 | N: Henning P. Schmiedehausen | 2996 | N: Henning P. Schmiedehausen |
2996 | E: hps@tanstaafl.de | 2997 | E: hps@tanstaafl.de |
2997 | D: added PCI support to the serial driver | 2998 | D: added PCI support to the serial driver |
2998 | S: Buckenhof, Germany | 2999 | S: Buckenhof, Germany |
2999 | 3000 | ||
3000 | N: Michael Schmitz | 3001 | N: Michael Schmitz |
3001 | E: | 3002 | E: |
3002 | D: Macintosh IDE Driver | 3003 | D: Macintosh IDE Driver |
3003 | 3004 | ||
3004 | N: Peter De Schrijver | 3005 | N: Peter De Schrijver |
3005 | E: stud11@cc4.kuleuven.ac.be | 3006 | E: stud11@cc4.kuleuven.ac.be |
3006 | D: Mitsumi CD-ROM driver patches March version | 3007 | D: Mitsumi CD-ROM driver patches March version |
3007 | S: Molenbaan 29 | 3008 | S: Molenbaan 29 |
3008 | S: B2240 Zandhoven | 3009 | S: B2240 Zandhoven |
3009 | S: Belgium | 3010 | S: Belgium |
3010 | 3011 | ||
3011 | N: Martin Schulze | 3012 | N: Martin Schulze |
3012 | E: joey@linux.de | 3013 | E: joey@linux.de |
3013 | W: http://home.pages.de/~joey/ | 3014 | W: http://home.pages.de/~joey/ |
3014 | D: Random Linux Hacker, Linux Promoter | 3015 | D: Random Linux Hacker, Linux Promoter |
3015 | D: CD-List, Books-List, Ex-FAQ | 3016 | D: CD-List, Books-List, Ex-FAQ |
3016 | D: Linux-Support, -Mailbox, -Stammtisch | 3017 | D: Linux-Support, -Mailbox, -Stammtisch |
3017 | D: several improvements to system programs | 3018 | D: several improvements to system programs |
3018 | S: Oldenburg | 3019 | S: Oldenburg |
3019 | S: Germany | 3020 | S: Germany |
3020 | 3021 | ||
3021 | N: Robert Schwebel | 3022 | N: Robert Schwebel |
3022 | E: robert@schwebel.de | 3023 | E: robert@schwebel.de |
3023 | W: http://www.schwebel.de | 3024 | W: http://www.schwebel.de |
3024 | D: Embedded hacker and book author, | 3025 | D: Embedded hacker and book author, |
3025 | D: AMD Elan support for Linux | 3026 | D: AMD Elan support for Linux |
3026 | S: Pengutronix | 3027 | S: Pengutronix |
3027 | S: Braunschweiger Strasse 79 | 3028 | S: Braunschweiger Strasse 79 |
3028 | S: 31134 Hildesheim | 3029 | S: 31134 Hildesheim |
3029 | S: Germany | 3030 | S: Germany |
3030 | 3031 | ||
3031 | N: Darren Senn | 3032 | N: Darren Senn |
3032 | E: sinster@darkwater.com | 3033 | E: sinster@darkwater.com |
3033 | D: Whatever I notice needs doing (so far: itimers, /proc) | 3034 | D: Whatever I notice needs doing (so far: itimers, /proc) |
3034 | S: Post Office Box 64132 | 3035 | S: Post Office Box 64132 |
3035 | S: Sunnyvale, California 94088-4132 | 3036 | S: Sunnyvale, California 94088-4132 |
3036 | S: USA | 3037 | S: USA |
3037 | 3038 | ||
3038 | N: Simon Shapiro | 3039 | N: Simon Shapiro |
3039 | E: shimon@i-Connect.Net | 3040 | E: shimon@i-Connect.Net |
3040 | W: http://www.-i-Connect.Net/~shimon | 3041 | W: http://www.-i-Connect.Net/~shimon |
3041 | D: SCSI debugging | 3042 | D: SCSI debugging |
3042 | D: Maintainer of the Debian Kernel packages | 3043 | D: Maintainer of the Debian Kernel packages |
3043 | S: 14355 SW Allen Blvd., Suite #140 | 3044 | S: 14355 SW Allen Blvd., Suite #140 |
3044 | S: Beaverton, Oregon 97008 | 3045 | S: Beaverton, Oregon 97008 |
3045 | S: USA | 3046 | S: USA |
3046 | 3047 | ||
3047 | N: Mike Shaver | 3048 | N: Mike Shaver |
3048 | E: shaver@hungry.org | 3049 | E: shaver@hungry.org |
3049 | W: http://www.hungry.org/~shaver/ | 3050 | W: http://www.hungry.org/~shaver/ |
3050 | D: MIPS work, /proc/sys/net, misc net hacking | 3051 | D: MIPS work, /proc/sys/net, misc net hacking |
3051 | S: 149 Union St. | 3052 | S: 149 Union St. |
3052 | S: Kingston, Ontario | 3053 | S: Kingston, Ontario |
3053 | S: Canada K7L 2P4 | 3054 | S: Canada K7L 2P4 |
3054 | 3055 | ||
3055 | N: John Shifflett | 3056 | N: John Shifflett |
3056 | E: john@geolog.com | 3057 | E: john@geolog.com |
3057 | E: jshiffle@netcom.com | 3058 | E: jshiffle@netcom.com |
3058 | D: Always IN2000 SCSI driver | 3059 | D: Always IN2000 SCSI driver |
3059 | D: wd33c93 SCSI driver (linux-m68k) | 3060 | D: wd33c93 SCSI driver (linux-m68k) |
3060 | S: San Jose, California | 3061 | S: San Jose, California |
3061 | S: USA | 3062 | S: USA |
3062 | 3063 | ||
3063 | N: Robert Siemer | 3064 | N: Robert Siemer |
3064 | E: Robert.Siemer@gmx.de | 3065 | E: Robert.Siemer@gmx.de |
3065 | P: 2048/C99A4289 2F DC 17 2E 56 62 01 C8 3D F2 AC 09 F2 E5 DD EE | 3066 | P: 2048/C99A4289 2F DC 17 2E 56 62 01 C8 3D F2 AC 09 F2 E5 DD EE |
3066 | D: miroSOUND PCM20 radio RDS driver, ACI rewrite | 3067 | D: miroSOUND PCM20 radio RDS driver, ACI rewrite |
3067 | S: Klosterweg 28 / i309 | 3068 | S: Klosterweg 28 / i309 |
3068 | S: 76131 Karlsruhe | 3069 | S: 76131 Karlsruhe |
3069 | S: Germany | 3070 | S: Germany |
3070 | 3071 | ||
3071 | N: James Simmons | 3072 | N: James Simmons |
3072 | E: jsimmons@infradead.org | 3073 | E: jsimmons@infradead.org |
3073 | E: jsimmons@users.sf.net | 3074 | E: jsimmons@users.sf.net |
3074 | D: Frame buffer device maintainer | 3075 | D: Frame buffer device maintainer |
3075 | D: input layer developement | 3076 | D: input layer developement |
3076 | D: tty/console layer | 3077 | D: tty/console layer |
3077 | D: various mipsel devices | 3078 | D: various mipsel devices |
3078 | S: 115 Carmel Avenue | 3079 | S: 115 Carmel Avenue |
3079 | S: El Cerrito CA 94530 | 3080 | S: El Cerrito CA 94530 |
3080 | S: USA | 3081 | S: USA |
3081 | 3082 | ||
3082 | N: Jaspreet Singh | 3083 | N: Jaspreet Singh |
3083 | E: jaspreet@sangoma.com | 3084 | E: jaspreet@sangoma.com |
3084 | W: www.sangoma.com | 3085 | W: www.sangoma.com |
3085 | D: WANPIPE drivers & API Support for Sangoma S508/FT1 cards | 3086 | D: WANPIPE drivers & API Support for Sangoma S508/FT1 cards |
3086 | S: Sangoma Technologies Inc., | 3087 | S: Sangoma Technologies Inc., |
3087 | S: 1001 Denison Street | 3088 | S: 1001 Denison Street |
3088 | S: Suite 101 | 3089 | S: Suite 101 |
3089 | S: Markham, Ontario L3R 2Z6 | 3090 | S: Markham, Ontario L3R 2Z6 |
3090 | S: Canada | 3091 | S: Canada |
3091 | 3092 | ||
3092 | N: Rick Sladkey | 3093 | N: Rick Sladkey |
3093 | E: jrs@world.std.com | 3094 | E: jrs@world.std.com |
3094 | D: utility hacker: Emacs, NFS server, mount, kmem-ps, UPS debugger, strace, GDB | 3095 | D: utility hacker: Emacs, NFS server, mount, kmem-ps, UPS debugger, strace, GDB |
3095 | D: library hacker: RPC, profil(3), realpath(3), regexp.h | 3096 | D: library hacker: RPC, profil(3), realpath(3), regexp.h |
3096 | D: kernel hacker: unnamed block devs, NFS client, fast select, precision timer | 3097 | D: kernel hacker: unnamed block devs, NFS client, fast select, precision timer |
3097 | S: 24 Avon Place | 3098 | S: 24 Avon Place |
3098 | S: Arlington, Massachusetts 02174 | 3099 | S: Arlington, Massachusetts 02174 |
3099 | S: USA | 3100 | S: USA |
3100 | 3101 | ||
3101 | N: Craig Small | 3102 | N: Craig Small |
3102 | E: csmall@triode.apana.org.au | 3103 | E: csmall@triode.apana.org.au |
3103 | E: vk2xlz@gonzo.vk2xlz.ampr.org (packet radio) | 3104 | E: vk2xlz@gonzo.vk2xlz.ampr.org (packet radio) |
3104 | D: Gracilis PackeTwin device driver | 3105 | D: Gracilis PackeTwin device driver |
3105 | D: RSPF daemon | 3106 | D: RSPF daemon |
3106 | S: 10 Stockalls Place | 3107 | S: 10 Stockalls Place |
3107 | S: Minto, NSW, 2566 | 3108 | S: Minto, NSW, 2566 |
3108 | S: Australia | 3109 | S: Australia |
3109 | 3110 | ||
3110 | N: Stephen Smalley | 3111 | N: Stephen Smalley |
3111 | E: sds@tycho.nsa.gov | 3112 | E: sds@tycho.nsa.gov |
3112 | D: portions of the Linux Security Module (LSM) framework and security modules | 3113 | D: portions of the Linux Security Module (LSM) framework and security modules |
3113 | 3114 | ||
3114 | N: Chris Smith | 3115 | N: Chris Smith |
3115 | E: csmith@convex.com | 3116 | E: csmith@convex.com |
3116 | D: Read only HPFS filesystem | 3117 | D: Read only HPFS filesystem |
3117 | S: Richardson, Texas | 3118 | S: Richardson, Texas |
3118 | S: USA | 3119 | S: USA |
3119 | 3120 | ||
3120 | N: Christopher Smith | 3121 | N: Christopher Smith |
3121 | E: x@xman.org | 3122 | E: x@xman.org |
3122 | D: Tulip net driver hacker | 3123 | D: Tulip net driver hacker |
3123 | 3124 | ||
3124 | N: Mark Smith | 3125 | N: Mark Smith |
3125 | E: mark.smith@comdev.cc | 3126 | E: mark.smith@comdev.cc |
3126 | D: Multicast support in bonding driver | 3127 | D: Multicast support in bonding driver |
3127 | 3128 | ||
3128 | N: Miquel van Smoorenburg | 3129 | N: Miquel van Smoorenburg |
3129 | E: miquels@cistron.nl | 3130 | E: miquels@cistron.nl |
3130 | D: Kernel and net hacker. Sysvinit, minicom. doing Debian stuff. | 3131 | D: Kernel and net hacker. Sysvinit, minicom. doing Debian stuff. |
3131 | S: Cistron Internet Services | 3132 | S: Cistron Internet Services |
3132 | S: PO-Box 297 | 3133 | S: PO-Box 297 |
3133 | S: 2400 AG, Alphen aan den Rijn | 3134 | S: 2400 AG, Alphen aan den Rijn |
3134 | S: The Netherlands | 3135 | S: The Netherlands |
3135 | 3136 | ||
3136 | N: Scott Snyder | 3137 | N: Scott Snyder |
3137 | E: snyder@fnald0.fnal.gov | 3138 | E: snyder@fnald0.fnal.gov |
3138 | D: ATAPI cdrom driver | 3139 | D: ATAPI cdrom driver |
3139 | S: MS 352, Fermilab | 3140 | S: MS 352, Fermilab |
3140 | S: Post Office Box 500 | 3141 | S: Post Office Box 500 |
3141 | S: Batavia, Illinois 60510 | 3142 | S: Batavia, Illinois 60510 |
3142 | S: USA | 3143 | S: USA |
3143 | 3144 | ||
3144 | N: Leo Spiekman | 3145 | N: Leo Spiekman |
3145 | E: leo@netlabs.net | 3146 | E: leo@netlabs.net |
3146 | W: http://www.netlabs.net/hp/leo/ | 3147 | W: http://www.netlabs.net/hp/leo/ |
3147 | D: Optics Storage 8000AT cdrom driver | 3148 | D: Optics Storage 8000AT cdrom driver |
3148 | S: Cliffwood, New Jersey 07721 | 3149 | S: Cliffwood, New Jersey 07721 |
3149 | S: USA | 3150 | S: USA |
3150 | 3151 | ||
3151 | N: Manfred Spraul | 3152 | N: Manfred Spraul |
3152 | E: manfred@colorfullife.com | 3153 | E: manfred@colorfullife.com |
3153 | W: http://www.colorfullife.com/~manfred | 3154 | W: http://www.colorfullife.com/~manfred |
3154 | D: Lots of tiny hacks. Larger improvments to SysV IPC msg, | 3155 | D: Lots of tiny hacks. Larger improvments to SysV IPC msg, |
3155 | D: slab, pipe, select. | 3156 | D: slab, pipe, select. |
3156 | S: 71701 Schwieberdingen | 3157 | S: 71701 Schwieberdingen |
3157 | S: Germany | 3158 | S: Germany |
3158 | 3159 | ||
3159 | N: Andrew Stanley-Jones | 3160 | N: Andrew Stanley-Jones |
3160 | E: asj@lanmedia.com | 3161 | E: asj@lanmedia.com |
3161 | D: LanMedia Corp. Device WAN card device driver | 3162 | D: LanMedia Corp. Device WAN card device driver |
3162 | S: #102, 686 W. Maude Ave | 3163 | S: #102, 686 W. Maude Ave |
3163 | S: Sunyvale, CA 94086 | 3164 | S: Sunyvale, CA 94086 |
3164 | S: USA | 3165 | S: USA |
3165 | 3166 | ||
3166 | N: Michael Still | 3167 | N: Michael Still |
3167 | E: mikal@stillhq.com | 3168 | E: mikal@stillhq.com |
3168 | W: http://www.stillhq.com | 3169 | W: http://www.stillhq.com |
3169 | D: Various janitorial patches | 3170 | D: Various janitorial patches |
3170 | D: mandocs and mandocs_install build targets | 3171 | D: mandocs and mandocs_install build targets |
3171 | S: (Email me and ask) | 3172 | S: (Email me and ask) |
3172 | S: Australia | 3173 | S: Australia |
3173 | 3174 | ||
3174 | N: Henrik Storner | 3175 | N: Henrik Storner |
3175 | E: storner@image.dk | 3176 | E: storner@image.dk |
3176 | W: http://www.image.dk/~storner/ | 3177 | W: http://www.image.dk/~storner/ |
3177 | W: http://www.sslug.dk/ | 3178 | W: http://www.sslug.dk/ |
3178 | D: Configure script: Invented tristate for module-configuration | 3179 | D: Configure script: Invented tristate for module-configuration |
3179 | D: vfat/msdos integration, kerneld docs, Linux promotion | 3180 | D: vfat/msdos integration, kerneld docs, Linux promotion |
3180 | D: Miscellaneous bug-fixes | 3181 | D: Miscellaneous bug-fixes |
3181 | S: Chr. Winthersvej 1 B, st.th. | 3182 | S: Chr. Winthersvej 1 B, st.th. |
3182 | S: DK-1860 Frederiksberg C | 3183 | S: DK-1860 Frederiksberg C |
3183 | S: Denmark | 3184 | S: Denmark |
3184 | 3185 | ||
3185 | N: Drew Sullivan | 3186 | N: Drew Sullivan |
3186 | E: drew@ss.org | 3187 | E: drew@ss.org |
3187 | W: http://www.ss.org/ | 3188 | W: http://www.ss.org/ |
3188 | P: 1024/ACFFA969 5A 9C 42 AB E4 24 82 31 99 56 00 BF D3 2B 25 46 | 3189 | P: 1024/ACFFA969 5A 9C 42 AB E4 24 82 31 99 56 00 BF D3 2B 25 46 |
3189 | D: iBCS2 developer | 3190 | D: iBCS2 developer |
3190 | S: 22 Irvington Cres. | 3191 | S: 22 Irvington Cres. |
3191 | S: Willowdale, Ontario | 3192 | S: Willowdale, Ontario |
3192 | S: Canada M2N 2Z1 | 3193 | S: Canada M2N 2Z1 |
3193 | 3194 | ||
3194 | N: Adam Sulmicki | 3195 | N: Adam Sulmicki |
3195 | E: adam@cfar.umd.edu | 3196 | E: adam@cfar.umd.edu |
3196 | W: http://www.eax.com | 3197 | W: http://www.eax.com |
3197 | D: core networking fixes | 3198 | D: core networking fixes |
3198 | D: patch-kernel enhancements | 3199 | D: patch-kernel enhancements |
3199 | D: misc kernel fixes and updates | 3200 | D: misc kernel fixes and updates |
3200 | 3201 | ||
3201 | N: Adrian Sun | 3202 | N: Adrian Sun |
3202 | E: asun@cobaltnet.com | 3203 | E: asun@cobaltnet.com |
3203 | D: hfs support | 3204 | D: hfs support |
3204 | D: alpha rtc port, random appletalk fixes | 3205 | D: alpha rtc port, random appletalk fixes |
3205 | S: Department of Zoology, University of Washington | 3206 | S: Department of Zoology, University of Washington |
3206 | S: Seattle, WA 98195-1800 | 3207 | S: Seattle, WA 98195-1800 |
3207 | S: USA | 3208 | S: USA |
3208 | 3209 | ||
3209 | N: Eugene Surovegin | 3210 | N: Eugene Surovegin |
3210 | E: ebs@ebshome.net | 3211 | E: ebs@ebshome.net |
3211 | W: http://kernel.ebshome.net/ | 3212 | W: http://kernel.ebshome.net/ |
3212 | P: 1024D/AE5467F1 FF22 39F1 6728 89F6 6E6C 2365 7602 F33D AE54 67F1 | 3213 | P: 1024D/AE5467F1 FF22 39F1 6728 89F6 6E6C 2365 7602 F33D AE54 67F1 |
3213 | D: Embedded PowerPC 4xx: EMAC, I2C, PIC and random hacks/fixes | 3214 | D: Embedded PowerPC 4xx: EMAC, I2C, PIC and random hacks/fixes |
3214 | S: Sunnyvale, California 94085 | 3215 | S: Sunnyvale, California 94085 |
3215 | S: USA | 3216 | S: USA |
3216 | 3217 | ||
3217 | N: Corey Thomas | 3218 | N: Corey Thomas |
3218 | E: corey@world.std.com | 3219 | E: corey@world.std.com |
3219 | W: http://world.std.com/~corey/index.html | 3220 | W: http://world.std.com/~corey/index.html |
3220 | D: Raylink/WebGear wireless LAN device driver (ray_cs) author | 3221 | D: Raylink/WebGear wireless LAN device driver (ray_cs) author |
3221 | S: 145 Howard St. | 3222 | S: 145 Howard St. |
3222 | S: Northborough, MA 01532 | 3223 | S: Northborough, MA 01532 |
3223 | S: USA | 3224 | S: USA |
3224 | 3225 | ||
3225 | N: Tommy Thorn | 3226 | N: Tommy Thorn |
3226 | E: Tommy.Thorn@irisa.fr | 3227 | E: Tommy.Thorn@irisa.fr |
3227 | W: http://www.irisa.fr/prive/thorn/index.html | 3228 | W: http://www.irisa.fr/prive/thorn/index.html |
3228 | P: 512/B4AFC909 BC BF 6D B1 52 26 1E D6 E3 2F A3 24 2A 84 FE 21 | 3229 | P: 512/B4AFC909 BC BF 6D B1 52 26 1E D6 E3 2F A3 24 2A 84 FE 21 |
3229 | D: Device driver hacker (aha1542 & plip) | 3230 | D: Device driver hacker (aha1542 & plip) |
3230 | S: IRISA | 3231 | S: IRISA |
3231 | S: Universit=E9 de Rennes I | 3232 | S: Universit=E9 de Rennes I |
3232 | S: F-35042 Rennes Cedex | 3233 | S: F-35042 Rennes Cedex |
3233 | S: France | 3234 | S: France |
3234 | 3235 | ||
3235 | N: Jon Tombs | 3236 | N: Jon Tombs |
3236 | E: jon@gte.esi.us.es | 3237 | E: jon@gte.esi.us.es |
3237 | W: http://www.esi.us.es/~jon | 3238 | W: http://www.esi.us.es/~jon |
3238 | D: NFS mmap() | 3239 | D: NFS mmap() |
3239 | D: XF86_S3 | 3240 | D: XF86_S3 |
3240 | D: Kernel modules | 3241 | D: Kernel modules |
3241 | D: Parts of various other programs (xfig, open, ...) | 3242 | D: Parts of various other programs (xfig, open, ...) |
3242 | S: C/ Federico Garcia Lorca 1 10-A | 3243 | S: C/ Federico Garcia Lorca 1 10-A |
3243 | S: Sevilla 41005 | 3244 | S: Sevilla 41005 |
3244 | S: Spain | 3245 | S: Spain |
3245 | 3246 | ||
3246 | N: Linus Torvalds | 3247 | N: Linus Torvalds |
3247 | E: torvalds@osdl.org | 3248 | E: torvalds@osdl.org |
3248 | D: Original kernel hacker | 3249 | D: Original kernel hacker |
3249 | S: 12725 SW Millikan Way, Suite 400 | 3250 | S: 12725 SW Millikan Way, Suite 400 |
3250 | S: Beaverton, Oregon 97005 | 3251 | S: Beaverton, Oregon 97005 |
3251 | S: USA | 3252 | S: USA |
3252 | 3253 | ||
3253 | N: Marcelo Tosatti | 3254 | N: Marcelo Tosatti |
3254 | E: marcelo@kvack.org | 3255 | E: marcelo@kvack.org |
3255 | D: v2.4 kernel maintainer | 3256 | D: v2.4 kernel maintainer |
3256 | S: Brazil | 3257 | S: Brazil |
3257 | 3258 | ||
3258 | N: Stefan Traby | 3259 | N: Stefan Traby |
3259 | E: stefan@quant-x.com | 3260 | E: stefan@quant-x.com |
3260 | D: Minor Alpha kernel hacks | 3261 | D: Minor Alpha kernel hacks |
3261 | S: Mitterlasznitzstr. 13 | 3262 | S: Mitterlasznitzstr. 13 |
3262 | S: 8302 Nestelbach | 3263 | S: 8302 Nestelbach |
3263 | S: Austria | 3264 | S: Austria |
3264 | 3265 | ||
3265 | N: Jeff Tranter | 3266 | N: Jeff Tranter |
3266 | E: tranter@pobox.com | 3267 | E: tranter@pobox.com |
3267 | D: Enhancements to Joystick driver | 3268 | D: Enhancements to Joystick driver |
3268 | D: Author of Sound HOWTO and CD-ROM HOWTO | 3269 | D: Author of Sound HOWTO and CD-ROM HOWTO |
3269 | D: Author of several small utilities | 3270 | D: Author of several small utilities |
3270 | D: (bogomips, scope, eject, statserial) | 3271 | D: (bogomips, scope, eject, statserial) |
3271 | S: 1 Laurie Court | 3272 | S: 1 Laurie Court |
3272 | S: Kanata, Ontario | 3273 | S: Kanata, Ontario |
3273 | S: Canada K2L 1S2 | 3274 | S: Canada K2L 1S2 |
3274 | 3275 | ||
3275 | N: Andrew Tridgell | 3276 | N: Andrew Tridgell |
3276 | E: tridge@samba.org | 3277 | E: tridge@samba.org |
3277 | W: http://samba.org/tridge/ | 3278 | W: http://samba.org/tridge/ |
3278 | D: dosemu, networking, samba | 3279 | D: dosemu, networking, samba |
3279 | S: 3 Ballow Crescent | 3280 | S: 3 Ballow Crescent |
3280 | S: MacGregor A.C.T 2615 | 3281 | S: MacGregor A.C.T 2615 |
3281 | S: Australia | 3282 | S: Australia |
3282 | 3283 | ||
3283 | N: Winfried Trรผmper | 3284 | N: Winfried Trรผmper |
3284 | E: winni@xpilot.org | 3285 | E: winni@xpilot.org |
3285 | W: http://www.shop.de/~winni/ | 3286 | W: http://www.shop.de/~winni/ |
3286 | D: German HOWTO, Crash-Kurs Linux (German, 100 comprehensive pages) | 3287 | D: German HOWTO, Crash-Kurs Linux (German, 100 comprehensive pages) |
3287 | D: CD-Writing HOWTO, various mini-HOWTOs | 3288 | D: CD-Writing HOWTO, various mini-HOWTOs |
3288 | D: One-week tutorials on Linux twice a year (free of charge) | 3289 | D: One-week tutorials on Linux twice a year (free of charge) |
3289 | D: Linux-Workshop Kรถln (aka LUG Cologne, Germany), Installfests | 3290 | D: Linux-Workshop Kรถln (aka LUG Cologne, Germany), Installfests |
3290 | S: Tacitusstr. 6 | 3291 | S: Tacitusstr. 6 |
3291 | S: D-50968 Kรถln | 3292 | S: D-50968 Kรถln |
3292 | 3293 | ||
3293 | N: Tsu-Sheng Tsao | 3294 | N: Tsu-Sheng Tsao |
3294 | E: tsusheng@scf.usc.edu | 3295 | E: tsusheng@scf.usc.edu |
3295 | D: IGMP(Internet Group Management Protocol) version 2 | 3296 | D: IGMP(Internet Group Management Protocol) version 2 |
3296 | S: 2F 14 ALY 31 LN 166 SEC 1 SHIH-PEI RD | 3297 | S: 2F 14 ALY 31 LN 166 SEC 1 SHIH-PEI RD |
3297 | S: Taipei | 3298 | S: Taipei |
3298 | S: Taiwan 112 | 3299 | S: Taiwan 112 |
3299 | S: Republic of China | 3300 | S: Republic of China |
3300 | S: 24335 Delta Drive | 3301 | S: 24335 Delta Drive |
3301 | S: Diamond Bar, California 91765 | 3302 | S: Diamond Bar, California 91765 |
3302 | S: USA | 3303 | S: USA |
3303 | 3304 | ||
3304 | N: Theodore Ts'o | 3305 | N: Theodore Ts'o |
3305 | E: tytso@mit.edu | 3306 | E: tytso@mit.edu |
3306 | D: Random Linux hacker | 3307 | D: Random Linux hacker |
3307 | D: Maintainer of tsx-11.mit.edu ftp archive | 3308 | D: Maintainer of tsx-11.mit.edu ftp archive |
3308 | D: Maintainer of c.o.l.* Usenet<->mail gateway | 3309 | D: Maintainer of c.o.l.* Usenet<->mail gateway |
3309 | D: Author of serial driver | 3310 | D: Author of serial driver |
3310 | D: Author of the new e2fsck | 3311 | D: Author of the new e2fsck |
3311 | D: Author of job control and system call restart code | 3312 | D: Author of job control and system call restart code |
3312 | D: Author of ramdisk device driver | 3313 | D: Author of ramdisk device driver |
3313 | D: Author of loopback device driver | 3314 | D: Author of loopback device driver |
3314 | D: Author of /dev/random driver | 3315 | D: Author of /dev/random driver |
3315 | S: MIT Room E40-343 | 3316 | S: MIT Room E40-343 |
3316 | S: 1 Amherst Street | 3317 | S: 1 Amherst Street |
3317 | S: Cambridge, Massachusetts 02139 | 3318 | S: Cambridge, Massachusetts 02139 |
3318 | S: USA | 3319 | S: USA |
3319 | 3320 | ||
3320 | N: Simmule Turner | 3321 | N: Simmule Turner |
3321 | E: sturner@tele-tv.com | 3322 | E: sturner@tele-tv.com |
3322 | D: Added swapping to filesystem | 3323 | D: Added swapping to filesystem |
3323 | S: 4226 Landgreen Street | 3324 | S: 4226 Landgreen Street |
3324 | S: Rockville, Maryland 20853 | 3325 | S: Rockville, Maryland 20853 |
3325 | S: USA | 3326 | S: USA |
3326 | 3327 | ||
3327 | N: Stephen Tweedie | 3328 | N: Stephen Tweedie |
3328 | E: sct@redhat.com | 3329 | E: sct@redhat.com |
3329 | P: 1024/E7A417AD E2 FE A4 20 34 EC ED FC 7D 7E 67 8D E0 31 D1 69 | 3330 | P: 1024/E7A417AD E2 FE A4 20 34 EC ED FC 7D 7E 67 8D E0 31 D1 69 |
3330 | P: 1024D/43BE7544 D2A4 8556 08E6 90E7 076C BA3F 243F 20A4 43BE 7544 | 3331 | P: 1024D/43BE7544 D2A4 8556 08E6 90E7 076C BA3F 243F 20A4 43BE 7544 |
3331 | D: Second extended file system developer | 3332 | D: Second extended file system developer |
3332 | D: General filesystem hacker | 3333 | D: General filesystem hacker |
3333 | D: kswap vm management code | 3334 | D: kswap vm management code |
3334 | S: 44 Campbell Park Crescent | 3335 | S: 44 Campbell Park Crescent |
3335 | S: Edinburgh EH13 0HT | 3336 | S: Edinburgh EH13 0HT |
3336 | S: United Kingdom | 3337 | S: United Kingdom |
3337 | 3338 | ||
3338 | N: Thomas Uhl | 3339 | N: Thomas Uhl |
3339 | E: uhl@sun1.rz.fh-heilbronn.de | 3340 | E: uhl@sun1.rz.fh-heilbronn.de |
3340 | D: Application programmer | 3341 | D: Application programmer |
3341 | D: Linux promoter | 3342 | D: Linux promoter |
3342 | D: Author of a German book on Linux | 3343 | D: Author of a German book on Linux |
3343 | S: Obere Heerbergstrasse 17 | 3344 | S: Obere Heerbergstrasse 17 |
3344 | S: 97078 Wuerzburg | 3345 | S: 97078 Wuerzburg |
3345 | S: Germany | 3346 | S: Germany |
3346 | 3347 | ||
3347 | N: Greg Ungerer | 3348 | N: Greg Ungerer |
3348 | E: gerg@snapgear.com | 3349 | E: gerg@snapgear.com |
3349 | D: uClinux kernel hacker | 3350 | D: uClinux kernel hacker |
3350 | D: Port uClinux to the Motorola ColdFire CPU | 3351 | D: Port uClinux to the Motorola ColdFire CPU |
3351 | D: Author of Stallion multiport serial drivers | 3352 | D: Author of Stallion multiport serial drivers |
3352 | S: SnapGear Inc. | 3353 | S: SnapGear Inc. |
3353 | S: 825 Stanley St | 3354 | S: 825 Stanley St |
3354 | S: Woolloongabba. QLD. 4102 | 3355 | S: Woolloongabba. QLD. 4102 |
3355 | S: Australia | 3356 | S: Australia |
3356 | 3357 | ||
3357 | N: Jeffrey A. Uphoff | 3358 | N: Jeffrey A. Uphoff |
3358 | E: juphoff@transmeta.com | 3359 | E: juphoff@transmeta.com |
3359 | E: jeff.uphoff@linux.org | 3360 | E: jeff.uphoff@linux.org |
3360 | P: 1024/9ED505C5 D7 BB CA AA 10 45 40 1B 16 19 0A C0 38 A0 3E CB | 3361 | P: 1024/9ED505C5 D7 BB CA AA 10 45 40 1B 16 19 0A C0 38 A0 3E CB |
3361 | D: Linux Security/Alert mailing lists' moderator/maintainer. | 3362 | D: Linux Security/Alert mailing lists' moderator/maintainer. |
3362 | D: NSM (rpc.statd) developer. | 3363 | D: NSM (rpc.statd) developer. |
3363 | D: PAM S/Key module developer. | 3364 | D: PAM S/Key module developer. |
3364 | D: 'dip' contributor. | 3365 | D: 'dip' contributor. |
3365 | D: AIPS port, astronomical community support. | 3366 | D: AIPS port, astronomical community support. |
3366 | S: Transmeta Corporation | 3367 | S: Transmeta Corporation |
3367 | S: 2540 Mission College Blvd. | 3368 | S: 2540 Mission College Blvd. |
3368 | S: Santa Clara, CA 95054 | 3369 | S: Santa Clara, CA 95054 |
3369 | S: USA | 3370 | S: USA |
3370 | 3371 | ||
3371 | N: Matthias Urlichs | 3372 | N: Matthias Urlichs |
3372 | E: smurf@smurf.noris.de | 3373 | E: smurf@smurf.noris.de |
3373 | E: smurf@debian.org | 3374 | E: smurf@debian.org |
3374 | E: matthias@urlichs.de | 3375 | E: matthias@urlichs.de |
3375 | D: Consultant, developer, kernel hacker | 3376 | D: Consultant, developer, kernel hacker |
3376 | D: In a previous life, worked on Streams/ISDN/BSD networking code for Linux | 3377 | D: In a previous life, worked on Streams/ISDN/BSD networking code for Linux |
3377 | S: Schleiermacherstrasse 12 | 3378 | S: Schleiermacherstrasse 12 |
3378 | S: 90491 Nuernberg | 3379 | S: 90491 Nuernberg |
3379 | S: Germany | 3380 | S: Germany |
3380 | 3381 | ||
3381 | N: Geert Uytterhoeven | 3382 | N: Geert Uytterhoeven |
3382 | E: geert@linux-m68k.org | 3383 | E: geert@linux-m68k.org |
3383 | W: http://users.telenet.be/geertu/ | 3384 | W: http://users.telenet.be/geertu/ |
3384 | P: 1024/862678A6 C51D 361C 0BD1 4C90 B275 C553 6EEA 11BA 8626 78A6 | 3385 | P: 1024/862678A6 C51D 361C 0BD1 4C90 B275 C553 6EEA 11BA 8626 78A6 |
3385 | D: m68k/Amiga and PPC/CHRP Longtrail coordinator | 3386 | D: m68k/Amiga and PPC/CHRP Longtrail coordinator |
3386 | D: Frame buffer device and XF68_FBDev maintainer | 3387 | D: Frame buffer device and XF68_FBDev maintainer |
3387 | D: m68k IDE maintainer | 3388 | D: m68k IDE maintainer |
3388 | D: Amiga Zorro maintainer | 3389 | D: Amiga Zorro maintainer |
3389 | D: Amiga Buddha and Catweasel chipset IDE | 3390 | D: Amiga Buddha and Catweasel chipset IDE |
3390 | D: Atari Falcon chipset IDE | 3391 | D: Atari Falcon chipset IDE |
3391 | D: Amiga Gayle chipset IDE | 3392 | D: Amiga Gayle chipset IDE |
3392 | D: mipsel NEC DDB Vrc-5074 | 3393 | D: mipsel NEC DDB Vrc-5074 |
3393 | S: Haterbeekstraat 55B | 3394 | S: Haterbeekstraat 55B |
3394 | S: B-3200 Aarschot | 3395 | S: B-3200 Aarschot |
3395 | S: Belgium | 3396 | S: Belgium |
3396 | 3397 | ||
3397 | N: Chris Vance | 3398 | N: Chris Vance |
3398 | E: cvance@tislabs.com | 3399 | E: cvance@tislabs.com |
3399 | E: cvance@nai.com | 3400 | E: cvance@nai.com |
3400 | D: portions of the Linux Security Module (LSM) framework and security modules | 3401 | D: portions of the Linux Security Module (LSM) framework and security modules |
3401 | 3402 | ||
3402 | N: Petr Vandrovec | 3403 | N: Petr Vandrovec |
3403 | E: vandrove@vc.cvut.cz | 3404 | E: vandrove@vc.cvut.cz |
3404 | D: Small contributions to ncpfs | 3405 | D: Small contributions to ncpfs |
3405 | D: Matrox framebuffer driver | 3406 | D: Matrox framebuffer driver |
3406 | S: Chudenicka 8 | 3407 | S: Chudenicka 8 |
3407 | S: 10200 Prague 10, Hostivar | 3408 | S: 10200 Prague 10, Hostivar |
3408 | S: Czech Republic | 3409 | S: Czech Republic |
3409 | 3410 | ||
3410 | N: Thibaut Varene | 3411 | N: Thibaut Varene |
3411 | E: T-Bone@parisc-linux.org | 3412 | E: T-Bone@parisc-linux.org |
3412 | W: http://www.parisc-linux.org/~varenet/ | 3413 | W: http://www.parisc-linux.org/~varenet/ |
3413 | P: 1024D/B7D2F063 E67C 0D43 A75E 12A5 BB1C FA2F 1E32 C3DA B7D2 F063 | 3414 | P: 1024D/B7D2F063 E67C 0D43 A75E 12A5 BB1C FA2F 1E32 C3DA B7D2 F063 |
3414 | D: PA-RISC port minion, PDC and GSCPS2 drivers, debuglocks and other bits | 3415 | D: PA-RISC port minion, PDC and GSCPS2 drivers, debuglocks and other bits |
3415 | D: Some ARM at91rm9200 bits, S1D13XXX FB driver, random patches here and there | 3416 | D: Some ARM at91rm9200 bits, S1D13XXX FB driver, random patches here and there |
3416 | D: AD1889 sound driver | 3417 | D: AD1889 sound driver |
3417 | S: Paris, France | 3418 | S: Paris, France |
3418 | 3419 | ||
3419 | N: Heikki Vatiainen | 3420 | N: Heikki Vatiainen |
3420 | E: hessu@cs.tut.fi | 3421 | E: hessu@cs.tut.fi |
3421 | D: Co-author of Multi-Protocol Over ATM (MPOA), some LANE hacks | 3422 | D: Co-author of Multi-Protocol Over ATM (MPOA), some LANE hacks |
3422 | S: Tampere University of Technology / Telecom lab | 3423 | S: Tampere University of Technology / Telecom lab |
3423 | S: Hermiankatu 12C | 3424 | S: Hermiankatu 12C |
3424 | S: FIN-33720 Tampere | 3425 | S: FIN-33720 Tampere |
3425 | S: Finland | 3426 | S: Finland |
3426 | 3427 | ||
3427 | N: Andrew Veliath | 3428 | N: Andrew Veliath |
3428 | E: andrewtv@usa.net | 3429 | E: andrewtv@usa.net |
3429 | D: Turtle Beach MultiSound sound driver | 3430 | D: Turtle Beach MultiSound sound driver |
3430 | S: USA | 3431 | S: USA |
3431 | 3432 | ||
3432 | N: Dirk Verworner | 3433 | N: Dirk Verworner |
3433 | D: Co-author of German book ``Linux-Kernel-Programmierung'' | 3434 | D: Co-author of German book ``Linux-Kernel-Programmierung'' |
3434 | D: Co-founder of Berlin Linux User Group | 3435 | D: Co-founder of Berlin Linux User Group |
3435 | 3436 | ||
3436 | N: Patrick Volkerding | 3437 | N: Patrick Volkerding |
3437 | E: volkerdi@ftp.cdrom.com | 3438 | E: volkerdi@ftp.cdrom.com |
3438 | D: Produced the Slackware distribution, updated the SVGAlib | 3439 | D: Produced the Slackware distribution, updated the SVGAlib |
3439 | D: patches for ghostscript, worked on color 'ls', etc. | 3440 | D: patches for ghostscript, worked on color 'ls', etc. |
3440 | S: 301 15th Street S. | 3441 | S: 301 15th Street S. |
3441 | S: Moorhead, Minnesota 56560 | 3442 | S: Moorhead, Minnesota 56560 |
3442 | S: USA | 3443 | S: USA |
3443 | 3444 | ||
3444 | N: Jos Vos | 3445 | N: Jos Vos |
3445 | E: jos@xos.nl | 3446 | E: jos@xos.nl |
3446 | W: http://www.xos.nl/ | 3447 | W: http://www.xos.nl/ |
3447 | D: Various IP firewall updates, ipfwadm | 3448 | D: Various IP firewall updates, ipfwadm |
3448 | S: X/OS Experts in Open Systems BV | 3449 | S: X/OS Experts in Open Systems BV |
3449 | S: Kruislaan 419 | 3450 | S: Kruislaan 419 |
3450 | S: 1098 VA Amsterdam | 3451 | S: 1098 VA Amsterdam |
3451 | S: The Netherlands | 3452 | S: The Netherlands |
3452 | 3453 | ||
3453 | N: Jeroen Vreeken | 3454 | N: Jeroen Vreeken |
3454 | E: pe1rxq@amsat.org | 3455 | E: pe1rxq@amsat.org |
3455 | W: http://www.chello.nl/~j.vreeken/ | 3456 | W: http://www.chello.nl/~j.vreeken/ |
3456 | D: SE401 usb webcam driver | 3457 | D: SE401 usb webcam driver |
3457 | D: ZD1201 usb wireless lan driver | 3458 | D: ZD1201 usb wireless lan driver |
3458 | S: Maastrichterweg 63 | 3459 | S: Maastrichterweg 63 |
3459 | S: 5554 GG Valkenswaard | 3460 | S: 5554 GG Valkenswaard |
3460 | S: The Netherlands | 3461 | S: The Netherlands |
3461 | 3462 | ||
3462 | N: Peter Shaobo Wang | 3463 | N: Peter Shaobo Wang |
3463 | E: pwang@mmdcorp.com | 3464 | E: pwang@mmdcorp.com |
3464 | W: http://www.mmdcorp.com/pw/linux | 3465 | W: http://www.mmdcorp.com/pw/linux |
3465 | D: Driver for Interphase ATM (i)Chip SAR adapter card family (x575, x525, x531). | 3466 | D: Driver for Interphase ATM (i)Chip SAR adapter card family (x575, x525, x531). |
3466 | S: 1513 Brewster Dr. | 3467 | S: 1513 Brewster Dr. |
3467 | S: Carrollton, TX 75010 | 3468 | S: Carrollton, TX 75010 |
3468 | S: USA | 3469 | S: USA |
3469 | 3470 | ||
3470 | N: Tim Waugh | 3471 | N: Tim Waugh |
3471 | E: tim@cyberelk.net | 3472 | E: tim@cyberelk.net |
3472 | D: Co-architect of the parallel-port sharing system | 3473 | D: Co-architect of the parallel-port sharing system |
3473 | S: 17 Curling Vale | 3474 | S: 17 Curling Vale |
3474 | S: GUILDFORD | 3475 | S: GUILDFORD |
3475 | S: Surrey | 3476 | S: Surrey |
3476 | S: GU2 7PJ | 3477 | S: GU2 7PJ |
3477 | S: United Kingdom | 3478 | S: United Kingdom |
3478 | 3479 | ||
3479 | N: Juergen Weigert | 3480 | N: Juergen Weigert |
3480 | E: jnweiger@immd4.informatik.uni-erlangen.de | 3481 | E: jnweiger@immd4.informatik.uni-erlangen.de |
3481 | D: The Linux Support Team Erlangen | 3482 | D: The Linux Support Team Erlangen |
3482 | 3483 | ||
3483 | N: David Weinehall | 3484 | N: David Weinehall |
3484 | E: tao@acc.umu.se | 3485 | E: tao@acc.umu.se |
3485 | W: http://www.acc.umu.se/~tao/ | 3486 | W: http://www.acc.umu.se/~tao/ |
3486 | W: http://www.acc.umu.se/~mcalinux/ | 3487 | W: http://www.acc.umu.se/~mcalinux/ |
3487 | D: Fixes for the NE/2-driver | 3488 | D: Fixes for the NE/2-driver |
3488 | D: Miscellaneous MCA-support | 3489 | D: Miscellaneous MCA-support |
3489 | D: Cleanup of the Config-files | 3490 | D: Cleanup of the Config-files |
3490 | S: Axtorpsvagen 40:20 | 3491 | S: Axtorpsvagen 40:20 |
3491 | S: S-903 37 UMEA | 3492 | S: S-903 37 UMEA |
3492 | S: Sweden | 3493 | S: Sweden |
3493 | 3494 | ||
3494 | N: Matt Welsh | 3495 | N: Matt Welsh |
3495 | E: mdw@metalab.unc.edu | 3496 | E: mdw@metalab.unc.edu |
3496 | W: http://www.cs.berkeley.edu/~mdw | 3497 | W: http://www.cs.berkeley.edu/~mdw |
3497 | D: Original Linux Documentation Project coordinator | 3498 | D: Original Linux Documentation Project coordinator |
3498 | D: Author, "Running Linux" (O'Reilly) | 3499 | D: Author, "Running Linux" (O'Reilly) |
3499 | D: Author, "Linux Installation and Getting Started" (LDP) and several HOWTOs | 3500 | D: Author, "Linux Installation and Getting Started" (LDP) and several HOWTOs |
3500 | D: Linuxdoc-SGML formatting system (now SGML-Tools) | 3501 | D: Linuxdoc-SGML formatting system (now SGML-Tools) |
3501 | D: Device drivers for various high-speed network interfaces (Myrinet, ATM) | 3502 | D: Device drivers for various high-speed network interfaces (Myrinet, ATM) |
3502 | D: Keithley DAS1200 device driver | 3503 | D: Keithley DAS1200 device driver |
3503 | D: Original maintainer of sunsite WWW and FTP sites | 3504 | D: Original maintainer of sunsite WWW and FTP sites |
3504 | D: Original moderator of c.o.l.announce and c.o.l.answers | 3505 | D: Original moderator of c.o.l.announce and c.o.l.answers |
3505 | S: Computer Science Division | 3506 | S: Computer Science Division |
3506 | S: UC Berkeley | 3507 | S: UC Berkeley |
3507 | S: Berkeley, CA 94720-1776 | 3508 | S: Berkeley, CA 94720-1776 |
3508 | S: USA | 3509 | S: USA |
3509 | 3510 | ||
3510 | N: Harald Welte | 3511 | N: Harald Welte |
3511 | E: laforge@netfilter.org | 3512 | E: laforge@netfilter.org |
3512 | P: 1024D/30F48BFF DBDE 6912 8831 9A53 879B 9190 5DA5 C655 30F4 8BFF | 3513 | P: 1024D/30F48BFF DBDE 6912 8831 9A53 879B 9190 5DA5 C655 30F4 8BFF |
3513 | W: http://gnumonks.org/users/laforge | 3514 | W: http://gnumonks.org/users/laforge |
3514 | D: netfilter: new nat helper infrastructure | 3515 | D: netfilter: new nat helper infrastructure |
3515 | D: netfilter: ULOG, ECN, DSCP target | 3516 | D: netfilter: ULOG, ECN, DSCP target |
3516 | D: netfilter: TTL match | 3517 | D: netfilter: TTL match |
3517 | D: netfilter: IPv6 mangle table | 3518 | D: netfilter: IPv6 mangle table |
3518 | D: netfilter: various other hacks | 3519 | D: netfilter: various other hacks |
3519 | S: Berlin | 3520 | S: Berlin |
3520 | S: Germany | 3521 | S: Germany |
3521 | 3522 | ||
3522 | N: Bill Wendling | 3523 | N: Bill Wendling |
3523 | E: wendling@ganymede.isdn.uiuc.edu | 3524 | E: wendling@ganymede.isdn.uiuc.edu |
3524 | W: http://www.ncsa.uiuc.edu/~wendling/ | 3525 | W: http://www.ncsa.uiuc.edu/~wendling/ |
3525 | D: Various random hacks. Mostly on poll/select logic. | 3526 | D: Various random hacks. Mostly on poll/select logic. |
3526 | S: 605 E. Springfield Ave. | 3527 | S: 605 E. Springfield Ave. |
3527 | S: Champaign, IL 61820 | 3528 | S: Champaign, IL 61820 |
3528 | S: USA | 3529 | S: USA |
3529 | 3530 | ||
3530 | N: Mike Westall | 3531 | N: Mike Westall |
3531 | D: IBM Turboways 25 ATM Device Driver | 3532 | D: IBM Turboways 25 ATM Device Driver |
3532 | E: westall@cs.clemson.edu | 3533 | E: westall@cs.clemson.edu |
3533 | S: Department of Computer Science | 3534 | S: Department of Computer Science |
3534 | S: Clemson University | 3535 | S: Clemson University |
3535 | S: Clemson SC 29634 USA | 3536 | S: Clemson SC 29634 USA |
3536 | 3537 | ||
3537 | N: Greg Wettstein | 3538 | N: Greg Wettstein |
3538 | E: greg@wind.rmcc.com | 3539 | E: greg@wind.rmcc.com |
3539 | D: Filesystem valid flag for MINIX filesystem. | 3540 | D: Filesystem valid flag for MINIX filesystem. |
3540 | D: Minor kernel debugging. | 3541 | D: Minor kernel debugging. |
3541 | D: Development and maintenance of sysklogd. | 3542 | D: Development and maintenance of sysklogd. |
3542 | D: Monitoring of development kernels for long-term stability. | 3543 | D: Monitoring of development kernels for long-term stability. |
3543 | D: Early implementations of Linux in a commercial environment. | 3544 | D: Early implementations of Linux in a commercial environment. |
3544 | S: Dr. Greg Wettstein, Ph.D. | 3545 | S: Dr. Greg Wettstein, Ph.D. |
3545 | S: Oncology Research Division Computing Facility | 3546 | S: Oncology Research Division Computing Facility |
3546 | S: Roger Maris Cancer Center | 3547 | S: Roger Maris Cancer Center |
3547 | S: 820 4th St. N. | 3548 | S: 820 4th St. N. |
3548 | S: Fargo, North Dakota 58122 | 3549 | S: Fargo, North Dakota 58122 |
3549 | S: USA | 3550 | S: USA |
3550 | 3551 | ||
3551 | N: Steven Whitehouse | 3552 | N: Steven Whitehouse |
3552 | E: SteveW@ACM.org | 3553 | E: SteveW@ACM.org |
3553 | W: http://www.chygwyn.com/~steve | 3554 | W: http://www.chygwyn.com/~steve |
3554 | D: Linux DECnet project: http://www.sucs.swan.ac.uk/~rohan/DECnet/index.html | 3555 | D: Linux DECnet project: http://www.sucs.swan.ac.uk/~rohan/DECnet/index.html |
3555 | D: Minor debugging of other networking protocols. | 3556 | D: Minor debugging of other networking protocols. |
3556 | D: Misc bug fixes and filesystem development | 3557 | D: Misc bug fixes and filesystem development |
3557 | 3558 | ||
3558 | N: Hans-Joachim Widmaier | 3559 | N: Hans-Joachim Widmaier |
3559 | E: hjw@zvw.de | 3560 | E: hjw@zvw.de |
3560 | D: AFFS rewrite | 3561 | D: AFFS rewrite |
3561 | S: Eichenweg 16 | 3562 | S: Eichenweg 16 |
3562 | S: 73650 Winterbach | 3563 | S: 73650 Winterbach |
3563 | S: Germany | 3564 | S: Germany |
3564 | 3565 | ||
3565 | N: Urban Widmark | 3566 | N: Urban Widmark |
3566 | E: urban@svenskatest.se | 3567 | E: urban@svenskatest.se |
3567 | D: via-rhine, misc net driver hacking | 3568 | D: via-rhine, misc net driver hacking |
3568 | 3569 | ||
3569 | N: Marco van Wieringen | 3570 | N: Marco van Wieringen |
3570 | E: mvw@planets.elm.net | 3571 | E: mvw@planets.elm.net |
3571 | D: Author of process accounting and diskquota | 3572 | D: Author of process accounting and diskquota |
3572 | S: Breeburgsingel 12 | 3573 | S: Breeburgsingel 12 |
3573 | S: 2135 CN Hoofddorp | 3574 | S: 2135 CN Hoofddorp |
3574 | S: The Netherlands | 3575 | S: The Netherlands |
3575 | 3576 | ||
3576 | N: Matthew Wilcox | 3577 | N: Matthew Wilcox |
3577 | E: matthew@wil.cx | 3578 | E: matthew@wil.cx |
3578 | W: ftp://ftp.uk.linux.org/pub/linux/people/willy/ | 3579 | W: ftp://ftp.uk.linux.org/pub/linux/people/willy/ |
3579 | D: Linux/PARISC hacker. Filesystem hacker. Random other hacking. Custom | 3580 | D: Linux/PARISC hacker. Filesystem hacker. Random other hacking. Custom |
3580 | D: PPC port hacking. | 3581 | D: PPC port hacking. |
3581 | 3582 | ||
3582 | N: G\"unter Windau | 3583 | N: G\"unter Windau |
3583 | E: gunter@mbfys.kun.nl | 3584 | E: gunter@mbfys.kun.nl |
3584 | D: Some bug fixes in the polling printer driver (lp.c) | 3585 | D: Some bug fixes in the polling printer driver (lp.c) |
3585 | S: University of Nijmegen | 3586 | S: University of Nijmegen |
3586 | S: Geert-Grooteplein Noord 21 | 3587 | S: Geert-Grooteplein Noord 21 |
3587 | S: 6525 EZ Nijmegen | 3588 | S: 6525 EZ Nijmegen |
3588 | S: The Netherlands | 3589 | S: The Netherlands |
3589 | 3590 | ||
3590 | N: Ulrich Windl | 3591 | N: Ulrich Windl |
3591 | E: Ulrich.Windl@rz.uni-regensburg.de | 3592 | E: Ulrich.Windl@rz.uni-regensburg.de |
3592 | P: 1024/E843660D CF D7 43 A1 5A 49 14 25 7C 04 A0 6E 4C 3A AC 6D | 3593 | P: 1024/E843660D CF D7 43 A1 5A 49 14 25 7C 04 A0 6E 4C 3A AC 6D |
3593 | D: Supports NTP on Linux. Added PPS code. Fixed bugs in adjtimex(). | 3594 | D: Supports NTP on Linux. Added PPS code. Fixed bugs in adjtimex(). |
3594 | S: Alte Regensburger Str. 11a | 3595 | S: Alte Regensburger Str. 11a |
3595 | S: 93149 Nittenau | 3596 | S: 93149 Nittenau |
3596 | S: Germany | 3597 | S: Germany |
3597 | 3598 | ||
3598 | N: Lars Wirzenius | 3599 | N: Lars Wirzenius |
3599 | E: liw@iki.fi | 3600 | E: liw@iki.fi |
3600 | D: Linux System Administrator's Guide, author, former maintainer | 3601 | D: Linux System Administrator's Guide, author, former maintainer |
3601 | D: comp.os.linux.announce, former moderator | 3602 | D: comp.os.linux.announce, former moderator |
3602 | D: Linux Documentation Project, co-founder | 3603 | D: Linux Documentation Project, co-founder |
3603 | D: Original sprintf in kernel | 3604 | D: Original sprintf in kernel |
3604 | D: Original kernel README (for version 0.97) | 3605 | D: Original kernel README (for version 0.97) |
3605 | D: Linux News (electronic magazine, now dead), founder and former editor | 3606 | D: Linux News (electronic magazine, now dead), founder and former editor |
3606 | D: Meta-FAQ, originator, former maintainer | 3607 | D: Meta-FAQ, originator, former maintainer |
3607 | D: INFO-SHEET, former maintainer | 3608 | D: INFO-SHEET, former maintainer |
3608 | D: Author of the longest-living linux bug | 3609 | D: Author of the longest-living linux bug |
3609 | 3610 | ||
3610 | N: Jonathan Woithe | 3611 | N: Jonathan Woithe |
3611 | E: jwoithe@physics.adelaide.edu.au | 3612 | E: jwoithe@physics.adelaide.edu.au |
3612 | W: http://www.physics.adelaide.edu.au/~jwoithe | 3613 | W: http://www.physics.adelaide.edu.au/~jwoithe |
3613 | D: ALS-007 sound card extensions to Sound Blaster driver | 3614 | D: ALS-007 sound card extensions to Sound Blaster driver |
3614 | S: 20 Jordan St | 3615 | S: 20 Jordan St |
3615 | S: Valley View, SA 5093 | 3616 | S: Valley View, SA 5093 |
3616 | S: Australia | 3617 | S: Australia |
3617 | 3618 | ||
3618 | N: Clifford Wolf | 3619 | N: Clifford Wolf |
3619 | E: god@clifford.at | 3620 | E: god@clifford.at |
3620 | W: http://www.clifford.at/ | 3621 | W: http://www.clifford.at/ |
3621 | D: Menuconfig/lxdialog improvement | 3622 | D: Menuconfig/lxdialog improvement |
3622 | S: Foehrengasse 16 | 3623 | S: Foehrengasse 16 |
3623 | S: A-2333 Leopoldsdorf b. Wien | 3624 | S: A-2333 Leopoldsdorf b. Wien |
3624 | S: Austria | 3625 | S: Austria |
3625 | 3626 | ||
3626 | N: Roger E. Wolff | 3627 | N: Roger E. Wolff |
3627 | E: R.E.Wolff@BitWizard.nl | 3628 | E: R.E.Wolff@BitWizard.nl |
3628 | D: Written kmalloc/kfree | 3629 | D: Written kmalloc/kfree |
3629 | D: Written Specialix IO8+ driver | 3630 | D: Written Specialix IO8+ driver |
3630 | D: Written Specialix SX driver | 3631 | D: Written Specialix SX driver |
3631 | S: van Bronckhorststraat 12 | 3632 | S: van Bronckhorststraat 12 |
3632 | S: 2612 XV Delft | 3633 | S: 2612 XV Delft |
3633 | S: The Netherlands | 3634 | S: The Netherlands |
3634 | 3635 | ||
3635 | N: David Woodhouse | 3636 | N: David Woodhouse |
3636 | E: dwmw2@infradead.org | 3637 | E: dwmw2@infradead.org |
3637 | D: ARCnet stuff, Applicom board driver, SO_BINDTODEVICE, | 3638 | D: ARCnet stuff, Applicom board driver, SO_BINDTODEVICE, |
3638 | D: some Alpha platform porting from 2.0, Memory Technology Devices, | 3639 | D: some Alpha platform porting from 2.0, Memory Technology Devices, |
3639 | D: Acquire watchdog timer, PC speaker driver maintenance, | 3640 | D: Acquire watchdog timer, PC speaker driver maintenance, |
3640 | D: various other stuff that annoyed me by not working. | 3641 | D: various other stuff that annoyed me by not working. |
3641 | S: c/o Red Hat Engineering | 3642 | S: c/o Red Hat Engineering |
3642 | S: Rustat House | 3643 | S: Rustat House |
3643 | S: 60 Clifton Road | 3644 | S: 60 Clifton Road |
3644 | S: Cambridge. CB1 7EG | 3645 | S: Cambridge. CB1 7EG |
3645 | S: England | 3646 | S: England |
3646 | 3647 | ||
3647 | N: Chris Wright | 3648 | N: Chris Wright |
3648 | E: chrisw@sous-sol.org | 3649 | E: chrisw@sous-sol.org |
3649 | D: hacking on LSM framework and security modules. | 3650 | D: hacking on LSM framework and security modules. |
3650 | S: Portland, OR | 3651 | S: Portland, OR |
3651 | S: USA | 3652 | S: USA |
3652 | 3653 | ||
3653 | N: Michal Wronski | 3654 | N: Michal Wronski |
3654 | E: Michal.Wronski@motorola.com | 3655 | E: Michal.Wronski@motorola.com |
3655 | D: POSIX message queues fs (with K. Benedyczak) | 3656 | D: POSIX message queues fs (with K. Benedyczak) |
3656 | S: Krakow | 3657 | S: Krakow |
3657 | S: Poland | 3658 | S: Poland |
3658 | 3659 | ||
3659 | N: Frank Xia | 3660 | N: Frank Xia |
3660 | E: qx@math.columbia.edu | 3661 | E: qx@math.columbia.edu |
3661 | D: Xiafs filesystem [defunct] | 3662 | D: Xiafs filesystem [defunct] |
3662 | S: 542 West 112th Street, 5N | 3663 | S: 542 West 112th Street, 5N |
3663 | S: New York, New York 10025 | 3664 | S: New York, New York 10025 |
3664 | S: USA | 3665 | S: USA |
3665 | 3666 | ||
3666 | N: Victor Yodaiken | 3667 | N: Victor Yodaiken |
3667 | E: yodaiken@fsmlabs.com | 3668 | E: yodaiken@fsmlabs.com |
3668 | D: RTLinux (RealTime Linux) | 3669 | D: RTLinux (RealTime Linux) |
3669 | S: POB 1822 | 3670 | S: POB 1822 |
3670 | S: Socorro NM, 87801 | 3671 | S: Socorro NM, 87801 |
3671 | S: USA | 3672 | S: USA |
3672 | 3673 | ||
3673 | N: Hiroshi YOKOTA | 3674 | N: Hiroshi YOKOTA |
3674 | E: yokota@netlab.is.tsukuba.ac.jp | 3675 | E: yokota@netlab.is.tsukuba.ac.jp |
3675 | D: Workbit NinjaSCSI-3/32Bi PCMCIA driver | 3676 | D: Workbit NinjaSCSI-3/32Bi PCMCIA driver |
3676 | D: Workbit NinjaSCSI-32Bi/UDE driver | 3677 | D: Workbit NinjaSCSI-32Bi/UDE driver |
3677 | S: Japan | 3678 | S: Japan |
3678 | 3679 | ||
3679 | N: Hideaki YOSHIFUJI | 3680 | N: Hideaki YOSHIFUJI |
3680 | E: hideaki@yoshifuji.org | 3681 | E: hideaki@yoshifuji.org |
3681 | E: yoshfuji@linux-ipv6.org | 3682 | E: yoshfuji@linux-ipv6.org |
3682 | W: http://www.yoshifuji.org/~hideaki/ | 3683 | W: http://www.yoshifuji.org/~hideaki/ |
3683 | P: 1024D/E0620EEA 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA | 3684 | P: 1024D/E0620EEA 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA |
3684 | D: IPv6 and other networking related stuff | 3685 | D: IPv6 and other networking related stuff |
3685 | D: USAGI/WIDE Project, Keio University | 3686 | D: USAGI/WIDE Project, Keio University |
3686 | S: Jeunet Palace Kawasaki #1-201, 10-2, Furukawa-cho, Saiwai-ku | 3687 | S: Jeunet Palace Kawasaki #1-201, 10-2, Furukawa-cho, Saiwai-ku |
3687 | S: Kawasaki, Kanagawa 212-0025 | 3688 | S: Kawasaki, Kanagawa 212-0025 |
3688 | S: Japan | 3689 | S: Japan |
3689 | 3690 | ||
3690 | N: Eric Youngdale | 3691 | N: Eric Youngdale |
3691 | E: eric@andante.org | 3692 | E: eric@andante.org |
3692 | W: http://www.andante.org | 3693 | W: http://www.andante.org |
3693 | D: General kernel hacker | 3694 | D: General kernel hacker |
3694 | D: SCSI iso9660 and ELF | 3695 | D: SCSI iso9660 and ELF |
3695 | S: 6389 Hawk View Lane | 3696 | S: 6389 Hawk View Lane |
3696 | S: Alexandria, Virginia 22312 | 3697 | S: Alexandria, Virginia 22312 |
3697 | S: USA | 3698 | S: USA |
3698 | 3699 | ||
3699 | N: Niibe Yutaka | 3700 | N: Niibe Yutaka |
3700 | E: gniibe@mri.co.jp | 3701 | E: gniibe@mri.co.jp |
3701 | D: PLIP driver | 3702 | D: PLIP driver |
3702 | D: Asynchronous socket I/O in the NET code | 3703 | D: Asynchronous socket I/O in the NET code |
3703 | S: Mitsubishi Research Institute, Inc. | 3704 | S: Mitsubishi Research Institute, Inc. |
3704 | S: ARCO Tower 1-8-1 Shimomeguro Meguro-ku | 3705 | S: ARCO Tower 1-8-1 Shimomeguro Meguro-ku |
3705 | S: Tokyo 153 | 3706 | S: Tokyo 153 |
3706 | S: Japan | 3707 | S: Japan |
3707 | 3708 | ||
3708 | N: James R. Van Zandt | 3709 | N: James R. Van Zandt |
3709 | E: jrv@vanzandt.mv.com | 3710 | E: jrv@vanzandt.mv.com |
3710 | P: 1024/E298966D F0 37 4F FD E5 7E C5 E6 F1 A0 1E 22 6F 46 DA 0C | 3711 | P: 1024/E298966D F0 37 4F FD E5 7E C5 E6 F1 A0 1E 22 6F 46 DA 0C |
3711 | D: Author and maintainer of the Double Talk speech synthesizer driver | 3712 | D: Author and maintainer of the Double Talk speech synthesizer driver |
3712 | S: 27 Spencer Drive | 3713 | S: 27 Spencer Drive |
3713 | S: Nashua, New Hampshire 03062 | 3714 | S: Nashua, New Hampshire 03062 |
3714 | S: USA | 3715 | S: USA |
3715 | 3716 | ||
3716 | N: Orest Zborowski | 3717 | N: Orest Zborowski |
3717 | E: orestz@eskimo.com | 3718 | E: orestz@eskimo.com |
3718 | D: XFree86 and kernel development | 3719 | D: XFree86 and kernel development |
3719 | S: 1507 145th Place SE #B5 | 3720 | S: 1507 145th Place SE #B5 |
3720 | S: Bellevue, Washington 98007 | 3721 | S: Bellevue, Washington 98007 |
3721 | S: USA | 3722 | S: USA |
3722 | 3723 | ||
3723 | N: Richard Zidlicky | 3724 | N: Richard Zidlicky |
3724 | E: rz@linux-m68k.org, rdzidlic@geocities.com | 3725 | E: rz@linux-m68k.org, rdzidlic@geocities.com |
3725 | W: http://www.geocities.com/rdzidlic | 3726 | W: http://www.geocities.com/rdzidlic |
3726 | D: Q40 port - see arch/m68k/q40/README | 3727 | D: Q40 port - see arch/m68k/q40/README |
3727 | D: various m68k hacks | 3728 | D: various m68k hacks |
3728 | S: Germany | 3729 | S: Germany |
3729 | 3730 | ||
3730 | N: Werner Zimmermann | 3731 | N: Werner Zimmermann |
3731 | E: Werner.Zimmermann@fht-esslingen.de | 3732 | E: Werner.Zimmermann@fht-esslingen.de |
3732 | D: CDROM driver "aztcd" (Aztech/Okano/Orchid/Wearnes) | 3733 | D: CDROM driver "aztcd" (Aztech/Okano/Orchid/Wearnes) |
3733 | S: Flandernstrasse 101 | 3734 | S: Flandernstrasse 101 |
3734 | S: D-73732 Esslingen | 3735 | S: D-73732 Esslingen |
3735 | S: Germany | 3736 | S: Germany |
3736 | 3737 | ||
3737 | N: Leonard N. Zubkoff | 3738 | N: Leonard N. Zubkoff |
3738 | W: http://www.dandelion.com/Linux/ | 3739 | W: http://www.dandelion.com/Linux/ |
3739 | D: BusLogic SCSI driver | 3740 | D: BusLogic SCSI driver |
3740 | D: Mylex DAC960 PCI RAID driver | 3741 | D: Mylex DAC960 PCI RAID driver |
3741 | D: Miscellaneous kernel fixes | 3742 | D: Miscellaneous kernel fixes |
3742 | 3743 | ||
3743 | N: Alessandro Zummo | 3744 | N: Alessandro Zummo |
3744 | E: a.zummo@towertech.it | 3745 | E: a.zummo@towertech.it |
3745 | D: CMI8330 support is sb_card.c | 3746 | D: CMI8330 support is sb_card.c |
3746 | D: ISAPnP fixes in sb_card.c | 3747 | D: ISAPnP fixes in sb_card.c |
3747 | D: ZyXEL omni.net lcd plus driver | 3748 | D: ZyXEL omni.net lcd plus driver |
3748 | D: RTC subsystem | 3749 | D: RTC subsystem |
3749 | S: Italy | 3750 | S: Italy |
3750 | 3751 | ||
3751 | N: Marc Zyngier | 3752 | N: Marc Zyngier |
3752 | E: maz@wild-wind.fr.eu.org | 3753 | E: maz@wild-wind.fr.eu.org |
3753 | W: http://www.misterjones.org | 3754 | W: http://www.misterjones.org |
3754 | D: MD driver | 3755 | D: MD driver |
3755 | D: EISA/sysfs subsystem | 3756 | D: EISA/sysfs subsystem |
3756 | S: France | 3757 | S: France |
3757 | 3758 | ||
3758 | 3759 | ||
3759 | # Don't add your name here, unless you really _are_ after Marc | 3760 | # Don't add your name here, unless you really _are_ after Marc |
3760 | # alphabetically. Leonard used to be very proud of being the | 3761 | # alphabetically. Leonard used to be very proud of being the |
3761 | # last entry, and he'll get positively pissed if he can't even | 3762 | # last entry, and he'll get positively pissed if he can't even |
3762 | # be second-to-last. (and this file really _is_ supposed to be | 3763 | # be second-to-last. (and this file really _is_ supposed to be |
3763 | # in alphabetic order) | 3764 | # in alphabetic order) |
3764 | 3765 |
include/linux/module.h
1 | #ifndef _LINUX_MODULE_H | 1 | #ifndef _LINUX_MODULE_H |
2 | #define _LINUX_MODULE_H | 2 | #define _LINUX_MODULE_H |
3 | /* | 3 | /* |
4 | * Dynamic loading of modules into the kernel. | 4 | * Dynamic loading of modules into the kernel. |
5 | * | 5 | * |
6 | * Rewritten by Richard Henderson <rth@tamu.edu> Dec 1996 | 6 | * Rewritten by Richard Henderson <rth@tamu.edu> Dec 1996 |
7 | * Rewritten again by Rusty Russell, 2002 | 7 | * Rewritten again by Rusty Russell, 2002 |
8 | */ | 8 | */ |
9 | #include <linux/sched.h> | 9 | #include <linux/sched.h> |
10 | #include <linux/spinlock.h> | 10 | #include <linux/spinlock.h> |
11 | #include <linux/list.h> | 11 | #include <linux/list.h> |
12 | #include <linux/stat.h> | 12 | #include <linux/stat.h> |
13 | #include <linux/compiler.h> | 13 | #include <linux/compiler.h> |
14 | #include <linux/cache.h> | 14 | #include <linux/cache.h> |
15 | #include <linux/kmod.h> | 15 | #include <linux/kmod.h> |
16 | #include <linux/elf.h> | 16 | #include <linux/elf.h> |
17 | #include <linux/stringify.h> | 17 | #include <linux/stringify.h> |
18 | #include <linux/kobject.h> | 18 | #include <linux/kobject.h> |
19 | #include <linux/moduleparam.h> | 19 | #include <linux/moduleparam.h> |
20 | #include <asm/local.h> | 20 | #include <asm/local.h> |
21 | 21 | ||
22 | #include <asm/module.h> | 22 | #include <asm/module.h> |
23 | 23 | ||
24 | /* Not Yet Implemented */ | 24 | /* Not Yet Implemented */ |
25 | #define MODULE_SUPPORTED_DEVICE(name) | 25 | #define MODULE_SUPPORTED_DEVICE(name) |
26 | 26 | ||
27 | /* v850 toolchain uses a `_' prefix for all user symbols */ | 27 | /* v850 toolchain uses a `_' prefix for all user symbols */ |
28 | #ifndef MODULE_SYMBOL_PREFIX | 28 | #ifndef MODULE_SYMBOL_PREFIX |
29 | #define MODULE_SYMBOL_PREFIX "" | 29 | #define MODULE_SYMBOL_PREFIX "" |
30 | #endif | 30 | #endif |
31 | 31 | ||
32 | #define MODULE_NAME_LEN (64 - sizeof(unsigned long)) | 32 | #define MODULE_NAME_LEN (64 - sizeof(unsigned long)) |
33 | 33 | ||
34 | struct kernel_symbol | 34 | struct kernel_symbol |
35 | { | 35 | { |
36 | unsigned long value; | 36 | unsigned long value; |
37 | const char *name; | 37 | const char *name; |
38 | }; | 38 | }; |
39 | 39 | ||
40 | struct modversion_info | 40 | struct modversion_info |
41 | { | 41 | { |
42 | unsigned long crc; | 42 | unsigned long crc; |
43 | char name[MODULE_NAME_LEN]; | 43 | char name[MODULE_NAME_LEN]; |
44 | }; | 44 | }; |
45 | 45 | ||
46 | struct module; | 46 | struct module; |
47 | 47 | ||
48 | struct module_attribute { | 48 | struct module_attribute { |
49 | struct attribute attr; | 49 | struct attribute attr; |
50 | ssize_t (*show)(struct module_attribute *, struct module *, char *); | 50 | ssize_t (*show)(struct module_attribute *, struct module *, char *); |
51 | ssize_t (*store)(struct module_attribute *, struct module *, | 51 | ssize_t (*store)(struct module_attribute *, struct module *, |
52 | const char *, size_t count); | 52 | const char *, size_t count); |
53 | void (*setup)(struct module *, const char *); | 53 | void (*setup)(struct module *, const char *); |
54 | int (*test)(struct module *); | 54 | int (*test)(struct module *); |
55 | void (*free)(struct module *); | 55 | void (*free)(struct module *); |
56 | }; | 56 | }; |
57 | 57 | ||
58 | struct module_kobject | 58 | struct module_kobject |
59 | { | 59 | { |
60 | struct kobject kobj; | 60 | struct kobject kobj; |
61 | struct module *mod; | 61 | struct module *mod; |
62 | }; | 62 | }; |
63 | 63 | ||
64 | /* These are either module local, or the kernel's dummy ones. */ | 64 | /* These are either module local, or the kernel's dummy ones. */ |
65 | extern int init_module(void); | 65 | extern int init_module(void); |
66 | extern void cleanup_module(void); | 66 | extern void cleanup_module(void); |
67 | 67 | ||
68 | /* Archs provide a method of finding the correct exception table. */ | 68 | /* Archs provide a method of finding the correct exception table. */ |
69 | struct exception_table_entry; | 69 | struct exception_table_entry; |
70 | 70 | ||
71 | const struct exception_table_entry * | 71 | const struct exception_table_entry * |
72 | search_extable(const struct exception_table_entry *first, | 72 | search_extable(const struct exception_table_entry *first, |
73 | const struct exception_table_entry *last, | 73 | const struct exception_table_entry *last, |
74 | unsigned long value); | 74 | unsigned long value); |
75 | void sort_extable(struct exception_table_entry *start, | 75 | void sort_extable(struct exception_table_entry *start, |
76 | struct exception_table_entry *finish); | 76 | struct exception_table_entry *finish); |
77 | void sort_main_extable(void); | 77 | void sort_main_extable(void); |
78 | 78 | ||
79 | extern struct subsystem module_subsys; | 79 | extern struct subsystem module_subsys; |
80 | 80 | ||
81 | #ifdef MODULE | 81 | #ifdef MODULE |
82 | #define MODULE_GENERIC_TABLE(gtype,name) \ | 82 | #define MODULE_GENERIC_TABLE(gtype,name) \ |
83 | extern const struct gtype##_id __mod_##gtype##_table \ | 83 | extern const struct gtype##_id __mod_##gtype##_table \ |
84 | __attribute__ ((unused, alias(__stringify(name)))) | 84 | __attribute__ ((unused, alias(__stringify(name)))) |
85 | 85 | ||
86 | extern struct module __this_module; | 86 | extern struct module __this_module; |
87 | #define THIS_MODULE (&__this_module) | 87 | #define THIS_MODULE (&__this_module) |
88 | #else /* !MODULE */ | 88 | #else /* !MODULE */ |
89 | #define MODULE_GENERIC_TABLE(gtype,name) | 89 | #define MODULE_GENERIC_TABLE(gtype,name) |
90 | #define THIS_MODULE ((struct module *)0) | 90 | #define THIS_MODULE ((struct module *)0) |
91 | #endif | 91 | #endif |
92 | 92 | ||
93 | /* Generic info of form tag = "info" */ | 93 | /* Generic info of form tag = "info" */ |
94 | #define MODULE_INFO(tag, info) __MODULE_INFO(tag, tag, info) | 94 | #define MODULE_INFO(tag, info) __MODULE_INFO(tag, tag, info) |
95 | 95 | ||
96 | /* For userspace: you can also call me... */ | 96 | /* For userspace: you can also call me... */ |
97 | #define MODULE_ALIAS(_alias) MODULE_INFO(alias, _alias) | 97 | #define MODULE_ALIAS(_alias) MODULE_INFO(alias, _alias) |
98 | 98 | ||
99 | /* | 99 | /* |
100 | * The following license idents are currently accepted as indicating free | 100 | * The following license idents are currently accepted as indicating free |
101 | * software modules | 101 | * software modules |
102 | * | 102 | * |
103 | * "GPL" [GNU Public License v2 or later] | 103 | * "GPL" [GNU Public License v2 or later] |
104 | * "GPL v2" [GNU Public License v2] | 104 | * "GPL v2" [GNU Public License v2] |
105 | * "GPL and additional rights" [GNU Public License v2 rights and more] | 105 | * "GPL and additional rights" [GNU Public License v2 rights and more] |
106 | * "Dual BSD/GPL" [GNU Public License v2 | 106 | * "Dual BSD/GPL" [GNU Public License v2 |
107 | * or BSD license choice] | 107 | * or BSD license choice] |
108 | * "Dual MIT/GPL" [GNU Public License v2 | 108 | * "Dual MIT/GPL" [GNU Public License v2 |
109 | * or MIT license choice] | 109 | * or MIT license choice] |
110 | * "Dual MPL/GPL" [GNU Public License v2 | 110 | * "Dual MPL/GPL" [GNU Public License v2 |
111 | * or Mozilla license choice] | 111 | * or Mozilla license choice] |
112 | * | 112 | * |
113 | * The following other idents are available | 113 | * The following other idents are available |
114 | * | 114 | * |
115 | * "Proprietary" [Non free products] | 115 | * "Proprietary" [Non free products] |
116 | * | 116 | * |
117 | * There are dual licensed components, but when running with Linux it is the | 117 | * There are dual licensed components, but when running with Linux it is the |
118 | * GPL that is relevant so this is a non issue. Similarly LGPL linked with GPL | 118 | * GPL that is relevant so this is a non issue. Similarly LGPL linked with GPL |
119 | * is a GPL combined work. | 119 | * is a GPL combined work. |
120 | * | 120 | * |
121 | * This exists for several reasons | 121 | * This exists for several reasons |
122 | * 1. So modinfo can show license info for users wanting to vet their setup | 122 | * 1. So modinfo can show license info for users wanting to vet their setup |
123 | * is free | 123 | * is free |
124 | * 2. So the community can ignore bug reports including proprietary modules | 124 | * 2. So the community can ignore bug reports including proprietary modules |
125 | * 3. So vendors can do likewise based on their own policies | 125 | * 3. So vendors can do likewise based on their own policies |
126 | */ | 126 | */ |
127 | #define MODULE_LICENSE(_license) MODULE_INFO(license, _license) | 127 | #define MODULE_LICENSE(_license) MODULE_INFO(license, _license) |
128 | 128 | ||
129 | /* Author, ideally of form NAME <EMAIL>[, NAME <EMAIL>]*[ and NAME <EMAIL>] */ | 129 | /* Author, ideally of form NAME <EMAIL>[, NAME <EMAIL>]*[ and NAME <EMAIL>] */ |
130 | #define MODULE_AUTHOR(_author) MODULE_INFO(author, _author) | 130 | #define MODULE_AUTHOR(_author) MODULE_INFO(author, _author) |
131 | 131 | ||
132 | /* What your module does. */ | 132 | /* What your module does. */ |
133 | #define MODULE_DESCRIPTION(_description) MODULE_INFO(description, _description) | 133 | #define MODULE_DESCRIPTION(_description) MODULE_INFO(description, _description) |
134 | 134 | ||
135 | /* One for each parameter, describing how to use it. Some files do | 135 | /* One for each parameter, describing how to use it. Some files do |
136 | multiple of these per line, so can't just use MODULE_INFO. */ | 136 | multiple of these per line, so can't just use MODULE_INFO. */ |
137 | #define MODULE_PARM_DESC(_parm, desc) \ | 137 | #define MODULE_PARM_DESC(_parm, desc) \ |
138 | __MODULE_INFO(parm, _parm, #_parm ":" desc) | 138 | __MODULE_INFO(parm, _parm, #_parm ":" desc) |
139 | 139 | ||
140 | #define MODULE_DEVICE_TABLE(type,name) \ | 140 | #define MODULE_DEVICE_TABLE(type,name) \ |
141 | MODULE_GENERIC_TABLE(type##_device,name) | 141 | MODULE_GENERIC_TABLE(type##_device,name) |
142 | 142 | ||
143 | /* Version of form [<epoch>:]<version>[-<extra-version>]. | 143 | /* Version of form [<epoch>:]<version>[-<extra-version>]. |
144 | Or for CVS/RCS ID version, everything but the number is stripped. | 144 | Or for CVS/RCS ID version, everything but the number is stripped. |
145 | <epoch>: A (small) unsigned integer which allows you to start versions | 145 | <epoch>: A (small) unsigned integer which allows you to start versions |
146 | anew. If not mentioned, it's zero. eg. "2:1.0" is after | 146 | anew. If not mentioned, it's zero. eg. "2:1.0" is after |
147 | "1:2.0". | 147 | "1:2.0". |
148 | <version>: The <version> may contain only alphanumerics and the | 148 | <version>: The <version> may contain only alphanumerics and the |
149 | character `.'. Ordered by numeric sort for numeric parts, | 149 | character `.'. Ordered by numeric sort for numeric parts, |
150 | ascii sort for ascii parts (as per RPM or DEB algorithm). | 150 | ascii sort for ascii parts (as per RPM or DEB algorithm). |
151 | <extraversion>: Like <version>, but inserted for local | 151 | <extraversion>: Like <version>, but inserted for local |
152 | customizations, eg "rh3" or "rusty1". | 152 | customizations, eg "rh3" or "rusty1". |
153 | 153 | ||
154 | Using this automatically adds a checksum of the .c files and the | 154 | Using this automatically adds a checksum of the .c files and the |
155 | local headers in "srcversion". | 155 | local headers in "srcversion". |
156 | */ | 156 | */ |
157 | #define MODULE_VERSION(_version) MODULE_INFO(version, _version) | 157 | #define MODULE_VERSION(_version) MODULE_INFO(version, _version) |
158 | 158 | ||
159 | /* Optional firmware file (or files) needed by the module | 159 | /* Optional firmware file (or files) needed by the module |
160 | * format is simply firmware file name. Multiple firmware | 160 | * format is simply firmware file name. Multiple firmware |
161 | * files require multiple MODULE_FIRMWARE() specifiers */ | 161 | * files require multiple MODULE_FIRMWARE() specifiers */ |
162 | #define MODULE_FIRMWARE(_firmware) MODULE_INFO(firmware, _firmware) | 162 | #define MODULE_FIRMWARE(_firmware) MODULE_INFO(firmware, _firmware) |
163 | 163 | ||
164 | /* Given an address, look for it in the exception tables */ | 164 | /* Given an address, look for it in the exception tables */ |
165 | const struct exception_table_entry *search_exception_tables(unsigned long add); | 165 | const struct exception_table_entry *search_exception_tables(unsigned long add); |
166 | 166 | ||
167 | struct notifier_block; | 167 | struct notifier_block; |
168 | 168 | ||
169 | #ifdef CONFIG_MODULES | 169 | #ifdef CONFIG_MODULES |
170 | 170 | ||
171 | /* Get/put a kernel symbol (calls must be symmetric) */ | 171 | /* Get/put a kernel symbol (calls must be symmetric) */ |
172 | void *__symbol_get(const char *symbol); | 172 | void *__symbol_get(const char *symbol); |
173 | void *__symbol_get_gpl(const char *symbol); | 173 | void *__symbol_get_gpl(const char *symbol); |
174 | #define symbol_get(x) ((typeof(&x))(__symbol_get(MODULE_SYMBOL_PREFIX #x))) | 174 | #define symbol_get(x) ((typeof(&x))(__symbol_get(MODULE_SYMBOL_PREFIX #x))) |
175 | 175 | ||
176 | #ifndef __GENKSYMS__ | 176 | #ifndef __GENKSYMS__ |
177 | #ifdef CONFIG_MODVERSIONS | 177 | #ifdef CONFIG_MODVERSIONS |
178 | /* Mark the CRC weak since genksyms apparently decides not to | 178 | /* Mark the CRC weak since genksyms apparently decides not to |
179 | * generate a checksums for some symbols */ | 179 | * generate a checksums for some symbols */ |
180 | #define __CRC_SYMBOL(sym, sec) \ | 180 | #define __CRC_SYMBOL(sym, sec) \ |
181 | extern void *__crc_##sym __attribute__((weak)); \ | 181 | extern void *__crc_##sym __attribute__((weak)); \ |
182 | static const unsigned long __kcrctab_##sym \ | 182 | static const unsigned long __kcrctab_##sym \ |
183 | __attribute_used__ \ | 183 | __attribute_used__ \ |
184 | __attribute__((section("__kcrctab" sec), unused)) \ | 184 | __attribute__((section("__kcrctab" sec), unused)) \ |
185 | = (unsigned long) &__crc_##sym; | 185 | = (unsigned long) &__crc_##sym; |
186 | #else | 186 | #else |
187 | #define __CRC_SYMBOL(sym, sec) | 187 | #define __CRC_SYMBOL(sym, sec) |
188 | #endif | 188 | #endif |
189 | 189 | ||
190 | /* For every exported symbol, place a struct in the __ksymtab section */ | 190 | /* For every exported symbol, place a struct in the __ksymtab section */ |
191 | #define __EXPORT_SYMBOL(sym, sec) \ | 191 | #define __EXPORT_SYMBOL(sym, sec) \ |
192 | extern typeof(sym) sym; \ | 192 | extern typeof(sym) sym; \ |
193 | __CRC_SYMBOL(sym, sec) \ | 193 | __CRC_SYMBOL(sym, sec) \ |
194 | static const char __kstrtab_##sym[] \ | 194 | static const char __kstrtab_##sym[] \ |
195 | __attribute__((section("__ksymtab_strings"))) \ | 195 | __attribute__((section("__ksymtab_strings"))) \ |
196 | = MODULE_SYMBOL_PREFIX #sym; \ | 196 | = MODULE_SYMBOL_PREFIX #sym; \ |
197 | static const struct kernel_symbol __ksymtab_##sym \ | 197 | static const struct kernel_symbol __ksymtab_##sym \ |
198 | __attribute_used__ \ | 198 | __attribute_used__ \ |
199 | __attribute__((section("__ksymtab" sec), unused)) \ | 199 | __attribute__((section("__ksymtab" sec), unused)) \ |
200 | = { (unsigned long)&sym, __kstrtab_##sym } | 200 | = { (unsigned long)&sym, __kstrtab_##sym } |
201 | 201 | ||
202 | #define EXPORT_SYMBOL(sym) \ | 202 | #define EXPORT_SYMBOL(sym) \ |
203 | __EXPORT_SYMBOL(sym, "") | 203 | __EXPORT_SYMBOL(sym, "") |
204 | 204 | ||
205 | #define EXPORT_SYMBOL_GPL(sym) \ | 205 | #define EXPORT_SYMBOL_GPL(sym) \ |
206 | __EXPORT_SYMBOL(sym, "_gpl") | 206 | __EXPORT_SYMBOL(sym, "_gpl") |
207 | 207 | ||
208 | #define EXPORT_SYMBOL_GPL_FUTURE(sym) \ | 208 | #define EXPORT_SYMBOL_GPL_FUTURE(sym) \ |
209 | __EXPORT_SYMBOL(sym, "_gpl_future") | 209 | __EXPORT_SYMBOL(sym, "_gpl_future") |
210 | 210 | ||
211 | 211 | ||
212 | #ifdef CONFIG_UNUSED_SYMBOLS | 212 | #ifdef CONFIG_UNUSED_SYMBOLS |
213 | #define EXPORT_UNUSED_SYMBOL(sym) __EXPORT_SYMBOL(sym, "_unused") | 213 | #define EXPORT_UNUSED_SYMBOL(sym) __EXPORT_SYMBOL(sym, "_unused") |
214 | #define EXPORT_UNUSED_SYMBOL_GPL(sym) __EXPORT_SYMBOL(sym, "_unused_gpl") | 214 | #define EXPORT_UNUSED_SYMBOL_GPL(sym) __EXPORT_SYMBOL(sym, "_unused_gpl") |
215 | #else | 215 | #else |
216 | #define EXPORT_UNUSED_SYMBOL(sym) | 216 | #define EXPORT_UNUSED_SYMBOL(sym) |
217 | #define EXPORT_UNUSED_SYMBOL_GPL(sym) | 217 | #define EXPORT_UNUSED_SYMBOL_GPL(sym) |
218 | #endif | 218 | #endif |
219 | 219 | ||
220 | #endif | 220 | #endif |
221 | 221 | ||
222 | struct module_ref | 222 | struct module_ref |
223 | { | 223 | { |
224 | local_t count; | 224 | local_t count; |
225 | } ____cacheline_aligned; | 225 | } ____cacheline_aligned; |
226 | 226 | ||
227 | enum module_state | 227 | enum module_state |
228 | { | 228 | { |
229 | MODULE_STATE_LIVE, | 229 | MODULE_STATE_LIVE, |
230 | MODULE_STATE_COMING, | 230 | MODULE_STATE_COMING, |
231 | MODULE_STATE_GOING, | 231 | MODULE_STATE_GOING, |
232 | }; | 232 | }; |
233 | 233 | ||
234 | /* Similar stuff for section attributes. */ | 234 | /* Similar stuff for section attributes. */ |
235 | #define MODULE_SECT_NAME_LEN 32 | ||
236 | struct module_sect_attr | 235 | struct module_sect_attr |
237 | { | 236 | { |
238 | struct module_attribute mattr; | 237 | struct module_attribute mattr; |
239 | char name[MODULE_SECT_NAME_LEN]; | 238 | char *name; |
240 | unsigned long address; | 239 | unsigned long address; |
241 | }; | 240 | }; |
242 | 241 | ||
243 | struct module_sect_attrs | 242 | struct module_sect_attrs |
244 | { | 243 | { |
245 | struct attribute_group grp; | 244 | struct attribute_group grp; |
245 | int nsections; | ||
246 | struct module_sect_attr attrs[0]; | 246 | struct module_sect_attr attrs[0]; |
247 | }; | 247 | }; |
248 | 248 | ||
249 | struct module_param_attrs; | 249 | struct module_param_attrs; |
250 | 250 | ||
251 | struct module | 251 | struct module |
252 | { | 252 | { |
253 | enum module_state state; | 253 | enum module_state state; |
254 | 254 | ||
255 | /* Member of list of modules */ | 255 | /* Member of list of modules */ |
256 | struct list_head list; | 256 | struct list_head list; |
257 | 257 | ||
258 | /* Unique handle for this module */ | 258 | /* Unique handle for this module */ |
259 | char name[MODULE_NAME_LEN]; | 259 | char name[MODULE_NAME_LEN]; |
260 | 260 | ||
261 | /* Sysfs stuff. */ | 261 | /* Sysfs stuff. */ |
262 | struct module_kobject mkobj; | 262 | struct module_kobject mkobj; |
263 | struct module_param_attrs *param_attrs; | 263 | struct module_param_attrs *param_attrs; |
264 | struct module_attribute *modinfo_attrs; | 264 | struct module_attribute *modinfo_attrs; |
265 | const char *version; | 265 | const char *version; |
266 | const char *srcversion; | 266 | const char *srcversion; |
267 | 267 | ||
268 | /* Exported symbols */ | 268 | /* Exported symbols */ |
269 | const struct kernel_symbol *syms; | 269 | const struct kernel_symbol *syms; |
270 | unsigned int num_syms; | 270 | unsigned int num_syms; |
271 | const unsigned long *crcs; | 271 | const unsigned long *crcs; |
272 | 272 | ||
273 | /* GPL-only exported symbols. */ | 273 | /* GPL-only exported symbols. */ |
274 | const struct kernel_symbol *gpl_syms; | 274 | const struct kernel_symbol *gpl_syms; |
275 | unsigned int num_gpl_syms; | 275 | unsigned int num_gpl_syms; |
276 | const unsigned long *gpl_crcs; | 276 | const unsigned long *gpl_crcs; |
277 | 277 | ||
278 | /* unused exported symbols. */ | 278 | /* unused exported symbols. */ |
279 | const struct kernel_symbol *unused_syms; | 279 | const struct kernel_symbol *unused_syms; |
280 | unsigned int num_unused_syms; | 280 | unsigned int num_unused_syms; |
281 | const unsigned long *unused_crcs; | 281 | const unsigned long *unused_crcs; |
282 | /* GPL-only, unused exported symbols. */ | 282 | /* GPL-only, unused exported symbols. */ |
283 | const struct kernel_symbol *unused_gpl_syms; | 283 | const struct kernel_symbol *unused_gpl_syms; |
284 | unsigned int num_unused_gpl_syms; | 284 | unsigned int num_unused_gpl_syms; |
285 | const unsigned long *unused_gpl_crcs; | 285 | const unsigned long *unused_gpl_crcs; |
286 | 286 | ||
287 | /* symbols that will be GPL-only in the near future. */ | 287 | /* symbols that will be GPL-only in the near future. */ |
288 | const struct kernel_symbol *gpl_future_syms; | 288 | const struct kernel_symbol *gpl_future_syms; |
289 | unsigned int num_gpl_future_syms; | 289 | unsigned int num_gpl_future_syms; |
290 | const unsigned long *gpl_future_crcs; | 290 | const unsigned long *gpl_future_crcs; |
291 | 291 | ||
292 | /* Exception table */ | 292 | /* Exception table */ |
293 | unsigned int num_exentries; | 293 | unsigned int num_exentries; |
294 | const struct exception_table_entry *extable; | 294 | const struct exception_table_entry *extable; |
295 | 295 | ||
296 | /* Startup function. */ | 296 | /* Startup function. */ |
297 | int (*init)(void); | 297 | int (*init)(void); |
298 | 298 | ||
299 | /* If this is non-NULL, vfree after init() returns */ | 299 | /* If this is non-NULL, vfree after init() returns */ |
300 | void *module_init; | 300 | void *module_init; |
301 | 301 | ||
302 | /* Here is the actual code + data, vfree'd on unload. */ | 302 | /* Here is the actual code + data, vfree'd on unload. */ |
303 | void *module_core; | 303 | void *module_core; |
304 | 304 | ||
305 | /* Here are the sizes of the init and core sections */ | 305 | /* Here are the sizes of the init and core sections */ |
306 | unsigned long init_size, core_size; | 306 | unsigned long init_size, core_size; |
307 | 307 | ||
308 | /* The size of the executable code in each section. */ | 308 | /* The size of the executable code in each section. */ |
309 | unsigned long init_text_size, core_text_size; | 309 | unsigned long init_text_size, core_text_size; |
310 | 310 | ||
311 | /* The handle returned from unwind_add_table. */ | 311 | /* The handle returned from unwind_add_table. */ |
312 | void *unwind_info; | 312 | void *unwind_info; |
313 | 313 | ||
314 | /* Arch-specific module values */ | 314 | /* Arch-specific module values */ |
315 | struct mod_arch_specific arch; | 315 | struct mod_arch_specific arch; |
316 | 316 | ||
317 | /* Am I unsafe to unload? */ | 317 | /* Am I unsafe to unload? */ |
318 | int unsafe; | 318 | int unsafe; |
319 | 319 | ||
320 | /* Am I GPL-compatible */ | 320 | /* Am I GPL-compatible */ |
321 | int license_gplok; | 321 | int license_gplok; |
322 | 322 | ||
323 | #ifdef CONFIG_MODULE_UNLOAD | 323 | #ifdef CONFIG_MODULE_UNLOAD |
324 | /* Reference counts */ | 324 | /* Reference counts */ |
325 | struct module_ref ref[NR_CPUS]; | 325 | struct module_ref ref[NR_CPUS]; |
326 | 326 | ||
327 | /* What modules depend on me? */ | 327 | /* What modules depend on me? */ |
328 | struct list_head modules_which_use_me; | 328 | struct list_head modules_which_use_me; |
329 | 329 | ||
330 | /* Who is waiting for us to be unloaded */ | 330 | /* Who is waiting for us to be unloaded */ |
331 | struct task_struct *waiter; | 331 | struct task_struct *waiter; |
332 | 332 | ||
333 | /* Destruction function. */ | 333 | /* Destruction function. */ |
334 | void (*exit)(void); | 334 | void (*exit)(void); |
335 | #endif | 335 | #endif |
336 | 336 | ||
337 | #ifdef CONFIG_KALLSYMS | 337 | #ifdef CONFIG_KALLSYMS |
338 | /* We keep the symbol and string tables for kallsyms. */ | 338 | /* We keep the symbol and string tables for kallsyms. */ |
339 | Elf_Sym *symtab; | 339 | Elf_Sym *symtab; |
340 | unsigned long num_symtab; | 340 | unsigned long num_symtab; |
341 | char *strtab; | 341 | char *strtab; |
342 | 342 | ||
343 | /* Section attributes */ | 343 | /* Section attributes */ |
344 | struct module_sect_attrs *sect_attrs; | 344 | struct module_sect_attrs *sect_attrs; |
345 | #endif | 345 | #endif |
346 | 346 | ||
347 | /* Per-cpu data. */ | 347 | /* Per-cpu data. */ |
348 | void *percpu; | 348 | void *percpu; |
349 | 349 | ||
350 | /* The command line arguments (may be mangled). People like | 350 | /* The command line arguments (may be mangled). People like |
351 | keeping pointers to this stuff */ | 351 | keeping pointers to this stuff */ |
352 | char *args; | 352 | char *args; |
353 | }; | 353 | }; |
354 | 354 | ||
355 | /* FIXME: It'd be nice to isolate modules during init, too, so they | 355 | /* FIXME: It'd be nice to isolate modules during init, too, so they |
356 | aren't used before they (may) fail. But presently too much code | 356 | aren't used before they (may) fail. But presently too much code |
357 | (IDE & SCSI) require entry into the module during init.*/ | 357 | (IDE & SCSI) require entry into the module during init.*/ |
358 | static inline int module_is_live(struct module *mod) | 358 | static inline int module_is_live(struct module *mod) |
359 | { | 359 | { |
360 | return mod->state != MODULE_STATE_GOING; | 360 | return mod->state != MODULE_STATE_GOING; |
361 | } | 361 | } |
362 | 362 | ||
363 | /* Is this address in a module? (second is with no locks, for oops) */ | 363 | /* Is this address in a module? (second is with no locks, for oops) */ |
364 | struct module *module_text_address(unsigned long addr); | 364 | struct module *module_text_address(unsigned long addr); |
365 | struct module *__module_text_address(unsigned long addr); | 365 | struct module *__module_text_address(unsigned long addr); |
366 | int is_module_address(unsigned long addr); | 366 | int is_module_address(unsigned long addr); |
367 | 367 | ||
368 | /* Returns module and fills in value, defined and namebuf, or NULL if | 368 | /* Returns module and fills in value, defined and namebuf, or NULL if |
369 | symnum out of range. */ | 369 | symnum out of range. */ |
370 | struct module *module_get_kallsym(unsigned int symnum, unsigned long *value, | 370 | struct module *module_get_kallsym(unsigned int symnum, unsigned long *value, |
371 | char *type, char *name, size_t namelen); | 371 | char *type, char *name, size_t namelen); |
372 | 372 | ||
373 | /* Look for this name: can be of form module:name. */ | 373 | /* Look for this name: can be of form module:name. */ |
374 | unsigned long module_kallsyms_lookup_name(const char *name); | 374 | unsigned long module_kallsyms_lookup_name(const char *name); |
375 | 375 | ||
376 | int is_exported(const char *name, const struct module *mod); | 376 | int is_exported(const char *name, const struct module *mod); |
377 | 377 | ||
378 | extern void __module_put_and_exit(struct module *mod, long code) | 378 | extern void __module_put_and_exit(struct module *mod, long code) |
379 | __attribute__((noreturn)); | 379 | __attribute__((noreturn)); |
380 | #define module_put_and_exit(code) __module_put_and_exit(THIS_MODULE, code); | 380 | #define module_put_and_exit(code) __module_put_and_exit(THIS_MODULE, code); |
381 | 381 | ||
382 | #ifdef CONFIG_MODULE_UNLOAD | 382 | #ifdef CONFIG_MODULE_UNLOAD |
383 | unsigned int module_refcount(struct module *mod); | 383 | unsigned int module_refcount(struct module *mod); |
384 | void __symbol_put(const char *symbol); | 384 | void __symbol_put(const char *symbol); |
385 | #define symbol_put(x) __symbol_put(MODULE_SYMBOL_PREFIX #x) | 385 | #define symbol_put(x) __symbol_put(MODULE_SYMBOL_PREFIX #x) |
386 | void symbol_put_addr(void *addr); | 386 | void symbol_put_addr(void *addr); |
387 | 387 | ||
388 | /* Sometimes we know we already have a refcount, and it's easier not | 388 | /* Sometimes we know we already have a refcount, and it's easier not |
389 | to handle the error case (which only happens with rmmod --wait). */ | 389 | to handle the error case (which only happens with rmmod --wait). */ |
390 | static inline void __module_get(struct module *module) | 390 | static inline void __module_get(struct module *module) |
391 | { | 391 | { |
392 | if (module) { | 392 | if (module) { |
393 | BUG_ON(module_refcount(module) == 0); | 393 | BUG_ON(module_refcount(module) == 0); |
394 | local_inc(&module->ref[get_cpu()].count); | 394 | local_inc(&module->ref[get_cpu()].count); |
395 | put_cpu(); | 395 | put_cpu(); |
396 | } | 396 | } |
397 | } | 397 | } |
398 | 398 | ||
399 | static inline int try_module_get(struct module *module) | 399 | static inline int try_module_get(struct module *module) |
400 | { | 400 | { |
401 | int ret = 1; | 401 | int ret = 1; |
402 | 402 | ||
403 | if (module) { | 403 | if (module) { |
404 | unsigned int cpu = get_cpu(); | 404 | unsigned int cpu = get_cpu(); |
405 | if (likely(module_is_live(module))) | 405 | if (likely(module_is_live(module))) |
406 | local_inc(&module->ref[cpu].count); | 406 | local_inc(&module->ref[cpu].count); |
407 | else | 407 | else |
408 | ret = 0; | 408 | ret = 0; |
409 | put_cpu(); | 409 | put_cpu(); |
410 | } | 410 | } |
411 | return ret; | 411 | return ret; |
412 | } | 412 | } |
413 | 413 | ||
414 | static inline void module_put(struct module *module) | 414 | static inline void module_put(struct module *module) |
415 | { | 415 | { |
416 | if (module) { | 416 | if (module) { |
417 | unsigned int cpu = get_cpu(); | 417 | unsigned int cpu = get_cpu(); |
418 | local_dec(&module->ref[cpu].count); | 418 | local_dec(&module->ref[cpu].count); |
419 | /* Maybe they're waiting for us to drop reference? */ | 419 | /* Maybe they're waiting for us to drop reference? */ |
420 | if (unlikely(!module_is_live(module))) | 420 | if (unlikely(!module_is_live(module))) |
421 | wake_up_process(module->waiter); | 421 | wake_up_process(module->waiter); |
422 | put_cpu(); | 422 | put_cpu(); |
423 | } | 423 | } |
424 | } | 424 | } |
425 | 425 | ||
426 | #else /*!CONFIG_MODULE_UNLOAD*/ | 426 | #else /*!CONFIG_MODULE_UNLOAD*/ |
427 | static inline int try_module_get(struct module *module) | 427 | static inline int try_module_get(struct module *module) |
428 | { | 428 | { |
429 | return !module || module_is_live(module); | 429 | return !module || module_is_live(module); |
430 | } | 430 | } |
431 | static inline void module_put(struct module *module) | 431 | static inline void module_put(struct module *module) |
432 | { | 432 | { |
433 | } | 433 | } |
434 | static inline void __module_get(struct module *module) | 434 | static inline void __module_get(struct module *module) |
435 | { | 435 | { |
436 | } | 436 | } |
437 | #define symbol_put(x) do { } while(0) | 437 | #define symbol_put(x) do { } while(0) |
438 | #define symbol_put_addr(p) do { } while(0) | 438 | #define symbol_put_addr(p) do { } while(0) |
439 | 439 | ||
440 | #endif /* CONFIG_MODULE_UNLOAD */ | 440 | #endif /* CONFIG_MODULE_UNLOAD */ |
441 | 441 | ||
442 | /* This is a #define so the string doesn't get put in every .o file */ | 442 | /* This is a #define so the string doesn't get put in every .o file */ |
443 | #define module_name(mod) \ | 443 | #define module_name(mod) \ |
444 | ({ \ | 444 | ({ \ |
445 | struct module *__mod = (mod); \ | 445 | struct module *__mod = (mod); \ |
446 | __mod ? __mod->name : "kernel"; \ | 446 | __mod ? __mod->name : "kernel"; \ |
447 | }) | 447 | }) |
448 | 448 | ||
449 | #define __unsafe(mod) \ | 449 | #define __unsafe(mod) \ |
450 | do { \ | 450 | do { \ |
451 | if (mod && !(mod)->unsafe) { \ | 451 | if (mod && !(mod)->unsafe) { \ |
452 | printk(KERN_WARNING \ | 452 | printk(KERN_WARNING \ |
453 | "Module %s cannot be unloaded due to unsafe usage in" \ | 453 | "Module %s cannot be unloaded due to unsafe usage in" \ |
454 | " %s:%u\n", (mod)->name, __FILE__, __LINE__); \ | 454 | " %s:%u\n", (mod)->name, __FILE__, __LINE__); \ |
455 | (mod)->unsafe = 1; \ | 455 | (mod)->unsafe = 1; \ |
456 | } \ | 456 | } \ |
457 | } while(0) | 457 | } while(0) |
458 | 458 | ||
459 | /* For kallsyms to ask for address resolution. NULL means not found. */ | 459 | /* For kallsyms to ask for address resolution. NULL means not found. */ |
460 | const char *module_address_lookup(unsigned long addr, | 460 | const char *module_address_lookup(unsigned long addr, |
461 | unsigned long *symbolsize, | 461 | unsigned long *symbolsize, |
462 | unsigned long *offset, | 462 | unsigned long *offset, |
463 | char **modname); | 463 | char **modname); |
464 | 464 | ||
465 | /* For extable.c to search modules' exception tables. */ | 465 | /* For extable.c to search modules' exception tables. */ |
466 | const struct exception_table_entry *search_module_extables(unsigned long addr); | 466 | const struct exception_table_entry *search_module_extables(unsigned long addr); |
467 | 467 | ||
468 | int register_module_notifier(struct notifier_block * nb); | 468 | int register_module_notifier(struct notifier_block * nb); |
469 | int unregister_module_notifier(struct notifier_block * nb); | 469 | int unregister_module_notifier(struct notifier_block * nb); |
470 | 470 | ||
471 | extern void print_modules(void); | 471 | extern void print_modules(void); |
472 | 472 | ||
473 | struct device_driver; | 473 | struct device_driver; |
474 | void module_add_driver(struct module *, struct device_driver *); | 474 | void module_add_driver(struct module *, struct device_driver *); |
475 | void module_remove_driver(struct device_driver *); | 475 | void module_remove_driver(struct device_driver *); |
476 | 476 | ||
477 | #else /* !CONFIG_MODULES... */ | 477 | #else /* !CONFIG_MODULES... */ |
478 | #define EXPORT_SYMBOL(sym) | 478 | #define EXPORT_SYMBOL(sym) |
479 | #define EXPORT_SYMBOL_GPL(sym) | 479 | #define EXPORT_SYMBOL_GPL(sym) |
480 | #define EXPORT_SYMBOL_GPL_FUTURE(sym) | 480 | #define EXPORT_SYMBOL_GPL_FUTURE(sym) |
481 | #define EXPORT_UNUSED_SYMBOL(sym) | 481 | #define EXPORT_UNUSED_SYMBOL(sym) |
482 | #define EXPORT_UNUSED_SYMBOL_GPL(sym) | 482 | #define EXPORT_UNUSED_SYMBOL_GPL(sym) |
483 | 483 | ||
484 | /* Given an address, look for it in the exception tables. */ | 484 | /* Given an address, look for it in the exception tables. */ |
485 | static inline const struct exception_table_entry * | 485 | static inline const struct exception_table_entry * |
486 | search_module_extables(unsigned long addr) | 486 | search_module_extables(unsigned long addr) |
487 | { | 487 | { |
488 | return NULL; | 488 | return NULL; |
489 | } | 489 | } |
490 | 490 | ||
491 | /* Is this address in a module? */ | 491 | /* Is this address in a module? */ |
492 | static inline struct module *module_text_address(unsigned long addr) | 492 | static inline struct module *module_text_address(unsigned long addr) |
493 | { | 493 | { |
494 | return NULL; | 494 | return NULL; |
495 | } | 495 | } |
496 | 496 | ||
497 | /* Is this address in a module? (don't take a lock, we're oopsing) */ | 497 | /* Is this address in a module? (don't take a lock, we're oopsing) */ |
498 | static inline struct module *__module_text_address(unsigned long addr) | 498 | static inline struct module *__module_text_address(unsigned long addr) |
499 | { | 499 | { |
500 | return NULL; | 500 | return NULL; |
501 | } | 501 | } |
502 | 502 | ||
503 | static inline int is_module_address(unsigned long addr) | 503 | static inline int is_module_address(unsigned long addr) |
504 | { | 504 | { |
505 | return 0; | 505 | return 0; |
506 | } | 506 | } |
507 | 507 | ||
508 | /* Get/put a kernel symbol (calls should be symmetric) */ | 508 | /* Get/put a kernel symbol (calls should be symmetric) */ |
509 | #define symbol_get(x) ({ extern typeof(x) x __attribute__((weak)); &(x); }) | 509 | #define symbol_get(x) ({ extern typeof(x) x __attribute__((weak)); &(x); }) |
510 | #define symbol_put(x) do { } while(0) | 510 | #define symbol_put(x) do { } while(0) |
511 | #define symbol_put_addr(x) do { } while(0) | 511 | #define symbol_put_addr(x) do { } while(0) |
512 | 512 | ||
513 | static inline void __module_get(struct module *module) | 513 | static inline void __module_get(struct module *module) |
514 | { | 514 | { |
515 | } | 515 | } |
516 | 516 | ||
517 | static inline int try_module_get(struct module *module) | 517 | static inline int try_module_get(struct module *module) |
518 | { | 518 | { |
519 | return 1; | 519 | return 1; |
520 | } | 520 | } |
521 | 521 | ||
522 | static inline void module_put(struct module *module) | 522 | static inline void module_put(struct module *module) |
523 | { | 523 | { |
524 | } | 524 | } |
525 | 525 | ||
526 | #define module_name(mod) "kernel" | 526 | #define module_name(mod) "kernel" |
527 | 527 | ||
528 | #define __unsafe(mod) | 528 | #define __unsafe(mod) |
529 | 529 | ||
530 | /* For kallsyms to ask for address resolution. NULL means not found. */ | 530 | /* For kallsyms to ask for address resolution. NULL means not found. */ |
531 | static inline const char *module_address_lookup(unsigned long addr, | 531 | static inline const char *module_address_lookup(unsigned long addr, |
532 | unsigned long *symbolsize, | 532 | unsigned long *symbolsize, |
533 | unsigned long *offset, | 533 | unsigned long *offset, |
534 | char **modname) | 534 | char **modname) |
535 | { | 535 | { |
536 | return NULL; | 536 | return NULL; |
537 | } | 537 | } |
538 | 538 | ||
539 | static inline struct module *module_get_kallsym(unsigned int symnum, | 539 | static inline struct module *module_get_kallsym(unsigned int symnum, |
540 | unsigned long *value, | 540 | unsigned long *value, |
541 | char *type, char *name, | 541 | char *type, char *name, |
542 | size_t namelen) | 542 | size_t namelen) |
543 | { | 543 | { |
544 | return NULL; | 544 | return NULL; |
545 | } | 545 | } |
546 | 546 | ||
547 | static inline unsigned long module_kallsyms_lookup_name(const char *name) | 547 | static inline unsigned long module_kallsyms_lookup_name(const char *name) |
548 | { | 548 | { |
549 | return 0; | 549 | return 0; |
550 | } | 550 | } |
551 | 551 | ||
552 | static inline int is_exported(const char *name, const struct module *mod) | 552 | static inline int is_exported(const char *name, const struct module *mod) |
553 | { | 553 | { |
554 | return 0; | 554 | return 0; |
555 | } | 555 | } |
556 | 556 | ||
557 | static inline int register_module_notifier(struct notifier_block * nb) | 557 | static inline int register_module_notifier(struct notifier_block * nb) |
558 | { | 558 | { |
559 | /* no events will happen anyway, so this can always succeed */ | 559 | /* no events will happen anyway, so this can always succeed */ |
560 | return 0; | 560 | return 0; |
561 | } | 561 | } |
562 | 562 | ||
563 | static inline int unregister_module_notifier(struct notifier_block * nb) | 563 | static inline int unregister_module_notifier(struct notifier_block * nb) |
564 | { | 564 | { |
565 | return 0; | 565 | return 0; |
566 | } | 566 | } |
567 | 567 | ||
568 | #define module_put_and_exit(code) do_exit(code) | 568 | #define module_put_and_exit(code) do_exit(code) |
569 | 569 | ||
570 | static inline void print_modules(void) | 570 | static inline void print_modules(void) |
571 | { | 571 | { |
572 | } | 572 | } |
573 | 573 | ||
574 | struct device_driver; | 574 | struct device_driver; |
575 | struct module; | 575 | struct module; |
576 | 576 | ||
577 | static inline void module_add_driver(struct module *module, struct device_driver *driver) | 577 | static inline void module_add_driver(struct module *module, struct device_driver *driver) |
578 | { | 578 | { |
579 | } | 579 | } |
580 | 580 | ||
581 | static inline void module_remove_driver(struct device_driver *driver) | 581 | static inline void module_remove_driver(struct device_driver *driver) |
582 | { | 582 | { |
583 | } | 583 | } |
584 | 584 | ||
585 | #endif /* CONFIG_MODULES */ | 585 | #endif /* CONFIG_MODULES */ |
586 | 586 | ||
587 | #define symbol_request(x) try_then_request_module(symbol_get(x), "symbol:" #x) | 587 | #define symbol_request(x) try_then_request_module(symbol_get(x), "symbol:" #x) |
588 | 588 | ||
589 | /* BELOW HERE ALL THESE ARE OBSOLETE AND WILL VANISH */ | 589 | /* BELOW HERE ALL THESE ARE OBSOLETE AND WILL VANISH */ |
590 | 590 | ||
591 | #define __MODULE_STRING(x) __stringify(x) | 591 | #define __MODULE_STRING(x) __stringify(x) |
592 | 592 | ||
593 | #endif /* _LINUX_MODULE_H */ | 593 | #endif /* _LINUX_MODULE_H */ |
kernel/module.c
1 | /* | 1 | /* |
2 | Copyright (C) 2002 Richard Henderson | 2 | Copyright (C) 2002 Richard Henderson |
3 | Copyright (C) 2001 Rusty Russell, 2002 Rusty Russell IBM. | 3 | Copyright (C) 2001 Rusty Russell, 2002 Rusty Russell IBM. |
4 | 4 | ||
5 | This program is free software; you can redistribute it and/or modify | 5 | This program is free software; you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by | 6 | it under the terms of the GNU General Public License as published by |
7 | the Free Software Foundation; either version 2 of the License, or | 7 | the Free Software Foundation; either version 2 of the License, or |
8 | (at your option) any later version. | 8 | (at your option) any later version. |
9 | 9 | ||
10 | This program is distributed in the hope that it will be useful, | 10 | This program is distributed in the hope that it will be useful, |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | GNU General Public License for more details. | 13 | GNU General Public License for more details. |
14 | 14 | ||
15 | You should have received a copy of the GNU General Public License | 15 | You should have received a copy of the GNU General Public License |
16 | along with this program; if not, write to the Free Software | 16 | along with this program; if not, write to the Free Software |
17 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | */ | 18 | */ |
19 | #include <linux/module.h> | 19 | #include <linux/module.h> |
20 | #include <linux/moduleloader.h> | 20 | #include <linux/moduleloader.h> |
21 | #include <linux/init.h> | 21 | #include <linux/init.h> |
22 | #include <linux/kernel.h> | 22 | #include <linux/kernel.h> |
23 | #include <linux/slab.h> | 23 | #include <linux/slab.h> |
24 | #include <linux/vmalloc.h> | 24 | #include <linux/vmalloc.h> |
25 | #include <linux/elf.h> | 25 | #include <linux/elf.h> |
26 | #include <linux/seq_file.h> | 26 | #include <linux/seq_file.h> |
27 | #include <linux/syscalls.h> | 27 | #include <linux/syscalls.h> |
28 | #include <linux/fcntl.h> | 28 | #include <linux/fcntl.h> |
29 | #include <linux/rcupdate.h> | 29 | #include <linux/rcupdate.h> |
30 | #include <linux/capability.h> | 30 | #include <linux/capability.h> |
31 | #include <linux/cpu.h> | 31 | #include <linux/cpu.h> |
32 | #include <linux/moduleparam.h> | 32 | #include <linux/moduleparam.h> |
33 | #include <linux/errno.h> | 33 | #include <linux/errno.h> |
34 | #include <linux/err.h> | 34 | #include <linux/err.h> |
35 | #include <linux/vermagic.h> | 35 | #include <linux/vermagic.h> |
36 | #include <linux/notifier.h> | 36 | #include <linux/notifier.h> |
37 | #include <linux/stop_machine.h> | 37 | #include <linux/stop_machine.h> |
38 | #include <linux/device.h> | 38 | #include <linux/device.h> |
39 | #include <linux/string.h> | 39 | #include <linux/string.h> |
40 | #include <linux/sched.h> | 40 | #include <linux/sched.h> |
41 | #include <linux/mutex.h> | 41 | #include <linux/mutex.h> |
42 | #include <linux/unwind.h> | 42 | #include <linux/unwind.h> |
43 | #include <asm/uaccess.h> | 43 | #include <asm/uaccess.h> |
44 | #include <asm/semaphore.h> | 44 | #include <asm/semaphore.h> |
45 | #include <asm/cacheflush.h> | 45 | #include <asm/cacheflush.h> |
46 | #include <linux/license.h> | 46 | #include <linux/license.h> |
47 | 47 | ||
48 | #if 0 | 48 | #if 0 |
49 | #define DEBUGP printk | 49 | #define DEBUGP printk |
50 | #else | 50 | #else |
51 | #define DEBUGP(fmt , a...) | 51 | #define DEBUGP(fmt , a...) |
52 | #endif | 52 | #endif |
53 | 53 | ||
54 | #ifndef ARCH_SHF_SMALL | 54 | #ifndef ARCH_SHF_SMALL |
55 | #define ARCH_SHF_SMALL 0 | 55 | #define ARCH_SHF_SMALL 0 |
56 | #endif | 56 | #endif |
57 | 57 | ||
58 | /* If this is set, the section belongs in the init part of the module */ | 58 | /* If this is set, the section belongs in the init part of the module */ |
59 | #define INIT_OFFSET_MASK (1UL << (BITS_PER_LONG-1)) | 59 | #define INIT_OFFSET_MASK (1UL << (BITS_PER_LONG-1)) |
60 | 60 | ||
61 | /* Protects module list */ | 61 | /* Protects module list */ |
62 | static DEFINE_SPINLOCK(modlist_lock); | 62 | static DEFINE_SPINLOCK(modlist_lock); |
63 | 63 | ||
64 | /* List of modules, protected by module_mutex AND modlist_lock */ | 64 | /* List of modules, protected by module_mutex AND modlist_lock */ |
65 | static DEFINE_MUTEX(module_mutex); | 65 | static DEFINE_MUTEX(module_mutex); |
66 | static LIST_HEAD(modules); | 66 | static LIST_HEAD(modules); |
67 | 67 | ||
68 | static BLOCKING_NOTIFIER_HEAD(module_notify_list); | 68 | static BLOCKING_NOTIFIER_HEAD(module_notify_list); |
69 | 69 | ||
70 | int register_module_notifier(struct notifier_block * nb) | 70 | int register_module_notifier(struct notifier_block * nb) |
71 | { | 71 | { |
72 | return blocking_notifier_chain_register(&module_notify_list, nb); | 72 | return blocking_notifier_chain_register(&module_notify_list, nb); |
73 | } | 73 | } |
74 | EXPORT_SYMBOL(register_module_notifier); | 74 | EXPORT_SYMBOL(register_module_notifier); |
75 | 75 | ||
76 | int unregister_module_notifier(struct notifier_block * nb) | 76 | int unregister_module_notifier(struct notifier_block * nb) |
77 | { | 77 | { |
78 | return blocking_notifier_chain_unregister(&module_notify_list, nb); | 78 | return blocking_notifier_chain_unregister(&module_notify_list, nb); |
79 | } | 79 | } |
80 | EXPORT_SYMBOL(unregister_module_notifier); | 80 | EXPORT_SYMBOL(unregister_module_notifier); |
81 | 81 | ||
82 | /* We require a truly strong try_module_get() */ | 82 | /* We require a truly strong try_module_get() */ |
83 | static inline int strong_try_module_get(struct module *mod) | 83 | static inline int strong_try_module_get(struct module *mod) |
84 | { | 84 | { |
85 | if (mod && mod->state == MODULE_STATE_COMING) | 85 | if (mod && mod->state == MODULE_STATE_COMING) |
86 | return 0; | 86 | return 0; |
87 | return try_module_get(mod); | 87 | return try_module_get(mod); |
88 | } | 88 | } |
89 | 89 | ||
90 | /* A thread that wants to hold a reference to a module only while it | 90 | /* A thread that wants to hold a reference to a module only while it |
91 | * is running can call ths to safely exit. | 91 | * is running can call ths to safely exit. |
92 | * nfsd and lockd use this. | 92 | * nfsd and lockd use this. |
93 | */ | 93 | */ |
94 | void __module_put_and_exit(struct module *mod, long code) | 94 | void __module_put_and_exit(struct module *mod, long code) |
95 | { | 95 | { |
96 | module_put(mod); | 96 | module_put(mod); |
97 | do_exit(code); | 97 | do_exit(code); |
98 | } | 98 | } |
99 | EXPORT_SYMBOL(__module_put_and_exit); | 99 | EXPORT_SYMBOL(__module_put_and_exit); |
100 | 100 | ||
101 | /* Find a module section: 0 means not found. */ | 101 | /* Find a module section: 0 means not found. */ |
102 | static unsigned int find_sec(Elf_Ehdr *hdr, | 102 | static unsigned int find_sec(Elf_Ehdr *hdr, |
103 | Elf_Shdr *sechdrs, | 103 | Elf_Shdr *sechdrs, |
104 | const char *secstrings, | 104 | const char *secstrings, |
105 | const char *name) | 105 | const char *name) |
106 | { | 106 | { |
107 | unsigned int i; | 107 | unsigned int i; |
108 | 108 | ||
109 | for (i = 1; i < hdr->e_shnum; i++) | 109 | for (i = 1; i < hdr->e_shnum; i++) |
110 | /* Alloc bit cleared means "ignore it." */ | 110 | /* Alloc bit cleared means "ignore it." */ |
111 | if ((sechdrs[i].sh_flags & SHF_ALLOC) | 111 | if ((sechdrs[i].sh_flags & SHF_ALLOC) |
112 | && strcmp(secstrings+sechdrs[i].sh_name, name) == 0) | 112 | && strcmp(secstrings+sechdrs[i].sh_name, name) == 0) |
113 | return i; | 113 | return i; |
114 | return 0; | 114 | return 0; |
115 | } | 115 | } |
116 | 116 | ||
117 | /* Provided by the linker */ | 117 | /* Provided by the linker */ |
118 | extern const struct kernel_symbol __start___ksymtab[]; | 118 | extern const struct kernel_symbol __start___ksymtab[]; |
119 | extern const struct kernel_symbol __stop___ksymtab[]; | 119 | extern const struct kernel_symbol __stop___ksymtab[]; |
120 | extern const struct kernel_symbol __start___ksymtab_gpl[]; | 120 | extern const struct kernel_symbol __start___ksymtab_gpl[]; |
121 | extern const struct kernel_symbol __stop___ksymtab_gpl[]; | 121 | extern const struct kernel_symbol __stop___ksymtab_gpl[]; |
122 | extern const struct kernel_symbol __start___ksymtab_gpl_future[]; | 122 | extern const struct kernel_symbol __start___ksymtab_gpl_future[]; |
123 | extern const struct kernel_symbol __stop___ksymtab_gpl_future[]; | 123 | extern const struct kernel_symbol __stop___ksymtab_gpl_future[]; |
124 | extern const struct kernel_symbol __start___ksymtab_unused[]; | 124 | extern const struct kernel_symbol __start___ksymtab_unused[]; |
125 | extern const struct kernel_symbol __stop___ksymtab_unused[]; | 125 | extern const struct kernel_symbol __stop___ksymtab_unused[]; |
126 | extern const struct kernel_symbol __start___ksymtab_unused_gpl[]; | 126 | extern const struct kernel_symbol __start___ksymtab_unused_gpl[]; |
127 | extern const struct kernel_symbol __stop___ksymtab_unused_gpl[]; | 127 | extern const struct kernel_symbol __stop___ksymtab_unused_gpl[]; |
128 | extern const struct kernel_symbol __start___ksymtab_gpl_future[]; | 128 | extern const struct kernel_symbol __start___ksymtab_gpl_future[]; |
129 | extern const struct kernel_symbol __stop___ksymtab_gpl_future[]; | 129 | extern const struct kernel_symbol __stop___ksymtab_gpl_future[]; |
130 | extern const unsigned long __start___kcrctab[]; | 130 | extern const unsigned long __start___kcrctab[]; |
131 | extern const unsigned long __start___kcrctab_gpl[]; | 131 | extern const unsigned long __start___kcrctab_gpl[]; |
132 | extern const unsigned long __start___kcrctab_gpl_future[]; | 132 | extern const unsigned long __start___kcrctab_gpl_future[]; |
133 | extern const unsigned long __start___kcrctab_unused[]; | 133 | extern const unsigned long __start___kcrctab_unused[]; |
134 | extern const unsigned long __start___kcrctab_unused_gpl[]; | 134 | extern const unsigned long __start___kcrctab_unused_gpl[]; |
135 | 135 | ||
136 | #ifndef CONFIG_MODVERSIONS | 136 | #ifndef CONFIG_MODVERSIONS |
137 | #define symversion(base, idx) NULL | 137 | #define symversion(base, idx) NULL |
138 | #else | 138 | #else |
139 | #define symversion(base, idx) ((base != NULL) ? ((base) + (idx)) : NULL) | 139 | #define symversion(base, idx) ((base != NULL) ? ((base) + (idx)) : NULL) |
140 | #endif | 140 | #endif |
141 | 141 | ||
142 | /* lookup symbol in given range of kernel_symbols */ | 142 | /* lookup symbol in given range of kernel_symbols */ |
143 | static const struct kernel_symbol *lookup_symbol(const char *name, | 143 | static const struct kernel_symbol *lookup_symbol(const char *name, |
144 | const struct kernel_symbol *start, | 144 | const struct kernel_symbol *start, |
145 | const struct kernel_symbol *stop) | 145 | const struct kernel_symbol *stop) |
146 | { | 146 | { |
147 | const struct kernel_symbol *ks = start; | 147 | const struct kernel_symbol *ks = start; |
148 | for (; ks < stop; ks++) | 148 | for (; ks < stop; ks++) |
149 | if (strcmp(ks->name, name) == 0) | 149 | if (strcmp(ks->name, name) == 0) |
150 | return ks; | 150 | return ks; |
151 | return NULL; | 151 | return NULL; |
152 | } | 152 | } |
153 | 153 | ||
154 | static void printk_unused_warning(const char *name) | 154 | static void printk_unused_warning(const char *name) |
155 | { | 155 | { |
156 | printk(KERN_WARNING "Symbol %s is marked as UNUSED, " | 156 | printk(KERN_WARNING "Symbol %s is marked as UNUSED, " |
157 | "however this module is using it.\n", name); | 157 | "however this module is using it.\n", name); |
158 | printk(KERN_WARNING "This symbol will go away in the future.\n"); | 158 | printk(KERN_WARNING "This symbol will go away in the future.\n"); |
159 | printk(KERN_WARNING "Please evalute if this is the right api to use, " | 159 | printk(KERN_WARNING "Please evalute if this is the right api to use, " |
160 | "and if it really is, submit a report the linux kernel " | 160 | "and if it really is, submit a report the linux kernel " |
161 | "mailinglist together with submitting your code for " | 161 | "mailinglist together with submitting your code for " |
162 | "inclusion.\n"); | 162 | "inclusion.\n"); |
163 | } | 163 | } |
164 | 164 | ||
165 | /* Find a symbol, return value, crc and module which owns it */ | 165 | /* Find a symbol, return value, crc and module which owns it */ |
166 | static unsigned long __find_symbol(const char *name, | 166 | static unsigned long __find_symbol(const char *name, |
167 | struct module **owner, | 167 | struct module **owner, |
168 | const unsigned long **crc, | 168 | const unsigned long **crc, |
169 | int gplok) | 169 | int gplok) |
170 | { | 170 | { |
171 | struct module *mod; | 171 | struct module *mod; |
172 | const struct kernel_symbol *ks; | 172 | const struct kernel_symbol *ks; |
173 | 173 | ||
174 | /* Core kernel first. */ | 174 | /* Core kernel first. */ |
175 | *owner = NULL; | 175 | *owner = NULL; |
176 | ks = lookup_symbol(name, __start___ksymtab, __stop___ksymtab); | 176 | ks = lookup_symbol(name, __start___ksymtab, __stop___ksymtab); |
177 | if (ks) { | 177 | if (ks) { |
178 | *crc = symversion(__start___kcrctab, (ks - __start___ksymtab)); | 178 | *crc = symversion(__start___kcrctab, (ks - __start___ksymtab)); |
179 | return ks->value; | 179 | return ks->value; |
180 | } | 180 | } |
181 | if (gplok) { | 181 | if (gplok) { |
182 | ks = lookup_symbol(name, __start___ksymtab_gpl, | 182 | ks = lookup_symbol(name, __start___ksymtab_gpl, |
183 | __stop___ksymtab_gpl); | 183 | __stop___ksymtab_gpl); |
184 | if (ks) { | 184 | if (ks) { |
185 | *crc = symversion(__start___kcrctab_gpl, | 185 | *crc = symversion(__start___kcrctab_gpl, |
186 | (ks - __start___ksymtab_gpl)); | 186 | (ks - __start___ksymtab_gpl)); |
187 | return ks->value; | 187 | return ks->value; |
188 | } | 188 | } |
189 | } | 189 | } |
190 | ks = lookup_symbol(name, __start___ksymtab_gpl_future, | 190 | ks = lookup_symbol(name, __start___ksymtab_gpl_future, |
191 | __stop___ksymtab_gpl_future); | 191 | __stop___ksymtab_gpl_future); |
192 | if (ks) { | 192 | if (ks) { |
193 | if (!gplok) { | 193 | if (!gplok) { |
194 | printk(KERN_WARNING "Symbol %s is being used " | 194 | printk(KERN_WARNING "Symbol %s is being used " |
195 | "by a non-GPL module, which will not " | 195 | "by a non-GPL module, which will not " |
196 | "be allowed in the future\n", name); | 196 | "be allowed in the future\n", name); |
197 | printk(KERN_WARNING "Please see the file " | 197 | printk(KERN_WARNING "Please see the file " |
198 | "Documentation/feature-removal-schedule.txt " | 198 | "Documentation/feature-removal-schedule.txt " |
199 | "in the kernel source tree for more " | 199 | "in the kernel source tree for more " |
200 | "details.\n"); | 200 | "details.\n"); |
201 | } | 201 | } |
202 | *crc = symversion(__start___kcrctab_gpl_future, | 202 | *crc = symversion(__start___kcrctab_gpl_future, |
203 | (ks - __start___ksymtab_gpl_future)); | 203 | (ks - __start___ksymtab_gpl_future)); |
204 | return ks->value; | 204 | return ks->value; |
205 | } | 205 | } |
206 | 206 | ||
207 | ks = lookup_symbol(name, __start___ksymtab_unused, | 207 | ks = lookup_symbol(name, __start___ksymtab_unused, |
208 | __stop___ksymtab_unused); | 208 | __stop___ksymtab_unused); |
209 | if (ks) { | 209 | if (ks) { |
210 | printk_unused_warning(name); | 210 | printk_unused_warning(name); |
211 | *crc = symversion(__start___kcrctab_unused, | 211 | *crc = symversion(__start___kcrctab_unused, |
212 | (ks - __start___ksymtab_unused)); | 212 | (ks - __start___ksymtab_unused)); |
213 | return ks->value; | 213 | return ks->value; |
214 | } | 214 | } |
215 | 215 | ||
216 | if (gplok) | 216 | if (gplok) |
217 | ks = lookup_symbol(name, __start___ksymtab_unused_gpl, | 217 | ks = lookup_symbol(name, __start___ksymtab_unused_gpl, |
218 | __stop___ksymtab_unused_gpl); | 218 | __stop___ksymtab_unused_gpl); |
219 | if (ks) { | 219 | if (ks) { |
220 | printk_unused_warning(name); | 220 | printk_unused_warning(name); |
221 | *crc = symversion(__start___kcrctab_unused_gpl, | 221 | *crc = symversion(__start___kcrctab_unused_gpl, |
222 | (ks - __start___ksymtab_unused_gpl)); | 222 | (ks - __start___ksymtab_unused_gpl)); |
223 | return ks->value; | 223 | return ks->value; |
224 | } | 224 | } |
225 | 225 | ||
226 | /* Now try modules. */ | 226 | /* Now try modules. */ |
227 | list_for_each_entry(mod, &modules, list) { | 227 | list_for_each_entry(mod, &modules, list) { |
228 | *owner = mod; | 228 | *owner = mod; |
229 | ks = lookup_symbol(name, mod->syms, mod->syms + mod->num_syms); | 229 | ks = lookup_symbol(name, mod->syms, mod->syms + mod->num_syms); |
230 | if (ks) { | 230 | if (ks) { |
231 | *crc = symversion(mod->crcs, (ks - mod->syms)); | 231 | *crc = symversion(mod->crcs, (ks - mod->syms)); |
232 | return ks->value; | 232 | return ks->value; |
233 | } | 233 | } |
234 | 234 | ||
235 | if (gplok) { | 235 | if (gplok) { |
236 | ks = lookup_symbol(name, mod->gpl_syms, | 236 | ks = lookup_symbol(name, mod->gpl_syms, |
237 | mod->gpl_syms + mod->num_gpl_syms); | 237 | mod->gpl_syms + mod->num_gpl_syms); |
238 | if (ks) { | 238 | if (ks) { |
239 | *crc = symversion(mod->gpl_crcs, | 239 | *crc = symversion(mod->gpl_crcs, |
240 | (ks - mod->gpl_syms)); | 240 | (ks - mod->gpl_syms)); |
241 | return ks->value; | 241 | return ks->value; |
242 | } | 242 | } |
243 | } | 243 | } |
244 | ks = lookup_symbol(name, mod->unused_syms, mod->unused_syms + mod->num_unused_syms); | 244 | ks = lookup_symbol(name, mod->unused_syms, mod->unused_syms + mod->num_unused_syms); |
245 | if (ks) { | 245 | if (ks) { |
246 | printk_unused_warning(name); | 246 | printk_unused_warning(name); |
247 | *crc = symversion(mod->unused_crcs, (ks - mod->unused_syms)); | 247 | *crc = symversion(mod->unused_crcs, (ks - mod->unused_syms)); |
248 | return ks->value; | 248 | return ks->value; |
249 | } | 249 | } |
250 | 250 | ||
251 | if (gplok) { | 251 | if (gplok) { |
252 | ks = lookup_symbol(name, mod->unused_gpl_syms, | 252 | ks = lookup_symbol(name, mod->unused_gpl_syms, |
253 | mod->unused_gpl_syms + mod->num_unused_gpl_syms); | 253 | mod->unused_gpl_syms + mod->num_unused_gpl_syms); |
254 | if (ks) { | 254 | if (ks) { |
255 | printk_unused_warning(name); | 255 | printk_unused_warning(name); |
256 | *crc = symversion(mod->unused_gpl_crcs, | 256 | *crc = symversion(mod->unused_gpl_crcs, |
257 | (ks - mod->unused_gpl_syms)); | 257 | (ks - mod->unused_gpl_syms)); |
258 | return ks->value; | 258 | return ks->value; |
259 | } | 259 | } |
260 | } | 260 | } |
261 | ks = lookup_symbol(name, mod->gpl_future_syms, | 261 | ks = lookup_symbol(name, mod->gpl_future_syms, |
262 | (mod->gpl_future_syms + | 262 | (mod->gpl_future_syms + |
263 | mod->num_gpl_future_syms)); | 263 | mod->num_gpl_future_syms)); |
264 | if (ks) { | 264 | if (ks) { |
265 | if (!gplok) { | 265 | if (!gplok) { |
266 | printk(KERN_WARNING "Symbol %s is being used " | 266 | printk(KERN_WARNING "Symbol %s is being used " |
267 | "by a non-GPL module, which will not " | 267 | "by a non-GPL module, which will not " |
268 | "be allowed in the future\n", name); | 268 | "be allowed in the future\n", name); |
269 | printk(KERN_WARNING "Please see the file " | 269 | printk(KERN_WARNING "Please see the file " |
270 | "Documentation/feature-removal-schedule.txt " | 270 | "Documentation/feature-removal-schedule.txt " |
271 | "in the kernel source tree for more " | 271 | "in the kernel source tree for more " |
272 | "details.\n"); | 272 | "details.\n"); |
273 | } | 273 | } |
274 | *crc = symversion(mod->gpl_future_crcs, | 274 | *crc = symversion(mod->gpl_future_crcs, |
275 | (ks - mod->gpl_future_syms)); | 275 | (ks - mod->gpl_future_syms)); |
276 | return ks->value; | 276 | return ks->value; |
277 | } | 277 | } |
278 | } | 278 | } |
279 | DEBUGP("Failed to find symbol %s\n", name); | 279 | DEBUGP("Failed to find symbol %s\n", name); |
280 | return 0; | 280 | return 0; |
281 | } | 281 | } |
282 | 282 | ||
283 | /* Search for module by name: must hold module_mutex. */ | 283 | /* Search for module by name: must hold module_mutex. */ |
284 | static struct module *find_module(const char *name) | 284 | static struct module *find_module(const char *name) |
285 | { | 285 | { |
286 | struct module *mod; | 286 | struct module *mod; |
287 | 287 | ||
288 | list_for_each_entry(mod, &modules, list) { | 288 | list_for_each_entry(mod, &modules, list) { |
289 | if (strcmp(mod->name, name) == 0) | 289 | if (strcmp(mod->name, name) == 0) |
290 | return mod; | 290 | return mod; |
291 | } | 291 | } |
292 | return NULL; | 292 | return NULL; |
293 | } | 293 | } |
294 | 294 | ||
295 | #ifdef CONFIG_SMP | 295 | #ifdef CONFIG_SMP |
296 | /* Number of blocks used and allocated. */ | 296 | /* Number of blocks used and allocated. */ |
297 | static unsigned int pcpu_num_used, pcpu_num_allocated; | 297 | static unsigned int pcpu_num_used, pcpu_num_allocated; |
298 | /* Size of each block. -ve means used. */ | 298 | /* Size of each block. -ve means used. */ |
299 | static int *pcpu_size; | 299 | static int *pcpu_size; |
300 | 300 | ||
301 | static int split_block(unsigned int i, unsigned short size) | 301 | static int split_block(unsigned int i, unsigned short size) |
302 | { | 302 | { |
303 | /* Reallocation required? */ | 303 | /* Reallocation required? */ |
304 | if (pcpu_num_used + 1 > pcpu_num_allocated) { | 304 | if (pcpu_num_used + 1 > pcpu_num_allocated) { |
305 | int *new = kmalloc(sizeof(new[0]) * pcpu_num_allocated*2, | 305 | int *new = kmalloc(sizeof(new[0]) * pcpu_num_allocated*2, |
306 | GFP_KERNEL); | 306 | GFP_KERNEL); |
307 | if (!new) | 307 | if (!new) |
308 | return 0; | 308 | return 0; |
309 | 309 | ||
310 | memcpy(new, pcpu_size, sizeof(new[0])*pcpu_num_allocated); | 310 | memcpy(new, pcpu_size, sizeof(new[0])*pcpu_num_allocated); |
311 | pcpu_num_allocated *= 2; | 311 | pcpu_num_allocated *= 2; |
312 | kfree(pcpu_size); | 312 | kfree(pcpu_size); |
313 | pcpu_size = new; | 313 | pcpu_size = new; |
314 | } | 314 | } |
315 | 315 | ||
316 | /* Insert a new subblock */ | 316 | /* Insert a new subblock */ |
317 | memmove(&pcpu_size[i+1], &pcpu_size[i], | 317 | memmove(&pcpu_size[i+1], &pcpu_size[i], |
318 | sizeof(pcpu_size[0]) * (pcpu_num_used - i)); | 318 | sizeof(pcpu_size[0]) * (pcpu_num_used - i)); |
319 | pcpu_num_used++; | 319 | pcpu_num_used++; |
320 | 320 | ||
321 | pcpu_size[i+1] -= size; | 321 | pcpu_size[i+1] -= size; |
322 | pcpu_size[i] = size; | 322 | pcpu_size[i] = size; |
323 | return 1; | 323 | return 1; |
324 | } | 324 | } |
325 | 325 | ||
326 | static inline unsigned int block_size(int val) | 326 | static inline unsigned int block_size(int val) |
327 | { | 327 | { |
328 | if (val < 0) | 328 | if (val < 0) |
329 | return -val; | 329 | return -val; |
330 | return val; | 330 | return val; |
331 | } | 331 | } |
332 | 332 | ||
333 | /* Created by linker magic */ | 333 | /* Created by linker magic */ |
334 | extern char __per_cpu_start[], __per_cpu_end[]; | 334 | extern char __per_cpu_start[], __per_cpu_end[]; |
335 | 335 | ||
336 | static void *percpu_modalloc(unsigned long size, unsigned long align, | 336 | static void *percpu_modalloc(unsigned long size, unsigned long align, |
337 | const char *name) | 337 | const char *name) |
338 | { | 338 | { |
339 | unsigned long extra; | 339 | unsigned long extra; |
340 | unsigned int i; | 340 | unsigned int i; |
341 | void *ptr; | 341 | void *ptr; |
342 | 342 | ||
343 | if (align > SMP_CACHE_BYTES) { | 343 | if (align > SMP_CACHE_BYTES) { |
344 | printk(KERN_WARNING "%s: per-cpu alignment %li > %i\n", | 344 | printk(KERN_WARNING "%s: per-cpu alignment %li > %i\n", |
345 | name, align, SMP_CACHE_BYTES); | 345 | name, align, SMP_CACHE_BYTES); |
346 | align = SMP_CACHE_BYTES; | 346 | align = SMP_CACHE_BYTES; |
347 | } | 347 | } |
348 | 348 | ||
349 | ptr = __per_cpu_start; | 349 | ptr = __per_cpu_start; |
350 | for (i = 0; i < pcpu_num_used; ptr += block_size(pcpu_size[i]), i++) { | 350 | for (i = 0; i < pcpu_num_used; ptr += block_size(pcpu_size[i]), i++) { |
351 | /* Extra for alignment requirement. */ | 351 | /* Extra for alignment requirement. */ |
352 | extra = ALIGN((unsigned long)ptr, align) - (unsigned long)ptr; | 352 | extra = ALIGN((unsigned long)ptr, align) - (unsigned long)ptr; |
353 | BUG_ON(i == 0 && extra != 0); | 353 | BUG_ON(i == 0 && extra != 0); |
354 | 354 | ||
355 | if (pcpu_size[i] < 0 || pcpu_size[i] < extra + size) | 355 | if (pcpu_size[i] < 0 || pcpu_size[i] < extra + size) |
356 | continue; | 356 | continue; |
357 | 357 | ||
358 | /* Transfer extra to previous block. */ | 358 | /* Transfer extra to previous block. */ |
359 | if (pcpu_size[i-1] < 0) | 359 | if (pcpu_size[i-1] < 0) |
360 | pcpu_size[i-1] -= extra; | 360 | pcpu_size[i-1] -= extra; |
361 | else | 361 | else |
362 | pcpu_size[i-1] += extra; | 362 | pcpu_size[i-1] += extra; |
363 | pcpu_size[i] -= extra; | 363 | pcpu_size[i] -= extra; |
364 | ptr += extra; | 364 | ptr += extra; |
365 | 365 | ||
366 | /* Split block if warranted */ | 366 | /* Split block if warranted */ |
367 | if (pcpu_size[i] - size > sizeof(unsigned long)) | 367 | if (pcpu_size[i] - size > sizeof(unsigned long)) |
368 | if (!split_block(i, size)) | 368 | if (!split_block(i, size)) |
369 | return NULL; | 369 | return NULL; |
370 | 370 | ||
371 | /* Mark allocated */ | 371 | /* Mark allocated */ |
372 | pcpu_size[i] = -pcpu_size[i]; | 372 | pcpu_size[i] = -pcpu_size[i]; |
373 | return ptr; | 373 | return ptr; |
374 | } | 374 | } |
375 | 375 | ||
376 | printk(KERN_WARNING "Could not allocate %lu bytes percpu data\n", | 376 | printk(KERN_WARNING "Could not allocate %lu bytes percpu data\n", |
377 | size); | 377 | size); |
378 | return NULL; | 378 | return NULL; |
379 | } | 379 | } |
380 | 380 | ||
381 | static void percpu_modfree(void *freeme) | 381 | static void percpu_modfree(void *freeme) |
382 | { | 382 | { |
383 | unsigned int i; | 383 | unsigned int i; |
384 | void *ptr = __per_cpu_start + block_size(pcpu_size[0]); | 384 | void *ptr = __per_cpu_start + block_size(pcpu_size[0]); |
385 | 385 | ||
386 | /* First entry is core kernel percpu data. */ | 386 | /* First entry is core kernel percpu data. */ |
387 | for (i = 1; i < pcpu_num_used; ptr += block_size(pcpu_size[i]), i++) { | 387 | for (i = 1; i < pcpu_num_used; ptr += block_size(pcpu_size[i]), i++) { |
388 | if (ptr == freeme) { | 388 | if (ptr == freeme) { |
389 | pcpu_size[i] = -pcpu_size[i]; | 389 | pcpu_size[i] = -pcpu_size[i]; |
390 | goto free; | 390 | goto free; |
391 | } | 391 | } |
392 | } | 392 | } |
393 | BUG(); | 393 | BUG(); |
394 | 394 | ||
395 | free: | 395 | free: |
396 | /* Merge with previous? */ | 396 | /* Merge with previous? */ |
397 | if (pcpu_size[i-1] >= 0) { | 397 | if (pcpu_size[i-1] >= 0) { |
398 | pcpu_size[i-1] += pcpu_size[i]; | 398 | pcpu_size[i-1] += pcpu_size[i]; |
399 | pcpu_num_used--; | 399 | pcpu_num_used--; |
400 | memmove(&pcpu_size[i], &pcpu_size[i+1], | 400 | memmove(&pcpu_size[i], &pcpu_size[i+1], |
401 | (pcpu_num_used - i) * sizeof(pcpu_size[0])); | 401 | (pcpu_num_used - i) * sizeof(pcpu_size[0])); |
402 | i--; | 402 | i--; |
403 | } | 403 | } |
404 | /* Merge with next? */ | 404 | /* Merge with next? */ |
405 | if (i+1 < pcpu_num_used && pcpu_size[i+1] >= 0) { | 405 | if (i+1 < pcpu_num_used && pcpu_size[i+1] >= 0) { |
406 | pcpu_size[i] += pcpu_size[i+1]; | 406 | pcpu_size[i] += pcpu_size[i+1]; |
407 | pcpu_num_used--; | 407 | pcpu_num_used--; |
408 | memmove(&pcpu_size[i+1], &pcpu_size[i+2], | 408 | memmove(&pcpu_size[i+1], &pcpu_size[i+2], |
409 | (pcpu_num_used - (i+1)) * sizeof(pcpu_size[0])); | 409 | (pcpu_num_used - (i+1)) * sizeof(pcpu_size[0])); |
410 | } | 410 | } |
411 | } | 411 | } |
412 | 412 | ||
413 | static unsigned int find_pcpusec(Elf_Ehdr *hdr, | 413 | static unsigned int find_pcpusec(Elf_Ehdr *hdr, |
414 | Elf_Shdr *sechdrs, | 414 | Elf_Shdr *sechdrs, |
415 | const char *secstrings) | 415 | const char *secstrings) |
416 | { | 416 | { |
417 | return find_sec(hdr, sechdrs, secstrings, ".data.percpu"); | 417 | return find_sec(hdr, sechdrs, secstrings, ".data.percpu"); |
418 | } | 418 | } |
419 | 419 | ||
420 | static int percpu_modinit(void) | 420 | static int percpu_modinit(void) |
421 | { | 421 | { |
422 | pcpu_num_used = 2; | 422 | pcpu_num_used = 2; |
423 | pcpu_num_allocated = 2; | 423 | pcpu_num_allocated = 2; |
424 | pcpu_size = kmalloc(sizeof(pcpu_size[0]) * pcpu_num_allocated, | 424 | pcpu_size = kmalloc(sizeof(pcpu_size[0]) * pcpu_num_allocated, |
425 | GFP_KERNEL); | 425 | GFP_KERNEL); |
426 | /* Static in-kernel percpu data (used). */ | 426 | /* Static in-kernel percpu data (used). */ |
427 | pcpu_size[0] = -ALIGN(__per_cpu_end-__per_cpu_start, SMP_CACHE_BYTES); | 427 | pcpu_size[0] = -ALIGN(__per_cpu_end-__per_cpu_start, SMP_CACHE_BYTES); |
428 | /* Free room. */ | 428 | /* Free room. */ |
429 | pcpu_size[1] = PERCPU_ENOUGH_ROOM + pcpu_size[0]; | 429 | pcpu_size[1] = PERCPU_ENOUGH_ROOM + pcpu_size[0]; |
430 | if (pcpu_size[1] < 0) { | 430 | if (pcpu_size[1] < 0) { |
431 | printk(KERN_ERR "No per-cpu room for modules.\n"); | 431 | printk(KERN_ERR "No per-cpu room for modules.\n"); |
432 | pcpu_num_used = 1; | 432 | pcpu_num_used = 1; |
433 | } | 433 | } |
434 | 434 | ||
435 | return 0; | 435 | return 0; |
436 | } | 436 | } |
437 | __initcall(percpu_modinit); | 437 | __initcall(percpu_modinit); |
438 | #else /* ... !CONFIG_SMP */ | 438 | #else /* ... !CONFIG_SMP */ |
439 | static inline void *percpu_modalloc(unsigned long size, unsigned long align, | 439 | static inline void *percpu_modalloc(unsigned long size, unsigned long align, |
440 | const char *name) | 440 | const char *name) |
441 | { | 441 | { |
442 | return NULL; | 442 | return NULL; |
443 | } | 443 | } |
444 | static inline void percpu_modfree(void *pcpuptr) | 444 | static inline void percpu_modfree(void *pcpuptr) |
445 | { | 445 | { |
446 | BUG(); | 446 | BUG(); |
447 | } | 447 | } |
448 | static inline unsigned int find_pcpusec(Elf_Ehdr *hdr, | 448 | static inline unsigned int find_pcpusec(Elf_Ehdr *hdr, |
449 | Elf_Shdr *sechdrs, | 449 | Elf_Shdr *sechdrs, |
450 | const char *secstrings) | 450 | const char *secstrings) |
451 | { | 451 | { |
452 | return 0; | 452 | return 0; |
453 | } | 453 | } |
454 | static inline void percpu_modcopy(void *pcpudst, const void *src, | 454 | static inline void percpu_modcopy(void *pcpudst, const void *src, |
455 | unsigned long size) | 455 | unsigned long size) |
456 | { | 456 | { |
457 | /* pcpusec should be 0, and size of that section should be 0. */ | 457 | /* pcpusec should be 0, and size of that section should be 0. */ |
458 | BUG_ON(size != 0); | 458 | BUG_ON(size != 0); |
459 | } | 459 | } |
460 | #endif /* CONFIG_SMP */ | 460 | #endif /* CONFIG_SMP */ |
461 | 461 | ||
462 | #define MODINFO_ATTR(field) \ | 462 | #define MODINFO_ATTR(field) \ |
463 | static void setup_modinfo_##field(struct module *mod, const char *s) \ | 463 | static void setup_modinfo_##field(struct module *mod, const char *s) \ |
464 | { \ | 464 | { \ |
465 | mod->field = kstrdup(s, GFP_KERNEL); \ | 465 | mod->field = kstrdup(s, GFP_KERNEL); \ |
466 | } \ | 466 | } \ |
467 | static ssize_t show_modinfo_##field(struct module_attribute *mattr, \ | 467 | static ssize_t show_modinfo_##field(struct module_attribute *mattr, \ |
468 | struct module *mod, char *buffer) \ | 468 | struct module *mod, char *buffer) \ |
469 | { \ | 469 | { \ |
470 | return sprintf(buffer, "%s\n", mod->field); \ | 470 | return sprintf(buffer, "%s\n", mod->field); \ |
471 | } \ | 471 | } \ |
472 | static int modinfo_##field##_exists(struct module *mod) \ | 472 | static int modinfo_##field##_exists(struct module *mod) \ |
473 | { \ | 473 | { \ |
474 | return mod->field != NULL; \ | 474 | return mod->field != NULL; \ |
475 | } \ | 475 | } \ |
476 | static void free_modinfo_##field(struct module *mod) \ | 476 | static void free_modinfo_##field(struct module *mod) \ |
477 | { \ | 477 | { \ |
478 | kfree(mod->field); \ | 478 | kfree(mod->field); \ |
479 | mod->field = NULL; \ | 479 | mod->field = NULL; \ |
480 | } \ | 480 | } \ |
481 | static struct module_attribute modinfo_##field = { \ | 481 | static struct module_attribute modinfo_##field = { \ |
482 | .attr = { .name = __stringify(field), .mode = 0444, \ | 482 | .attr = { .name = __stringify(field), .mode = 0444, \ |
483 | .owner = THIS_MODULE }, \ | 483 | .owner = THIS_MODULE }, \ |
484 | .show = show_modinfo_##field, \ | 484 | .show = show_modinfo_##field, \ |
485 | .setup = setup_modinfo_##field, \ | 485 | .setup = setup_modinfo_##field, \ |
486 | .test = modinfo_##field##_exists, \ | 486 | .test = modinfo_##field##_exists, \ |
487 | .free = free_modinfo_##field, \ | 487 | .free = free_modinfo_##field, \ |
488 | }; | 488 | }; |
489 | 489 | ||
490 | MODINFO_ATTR(version); | 490 | MODINFO_ATTR(version); |
491 | MODINFO_ATTR(srcversion); | 491 | MODINFO_ATTR(srcversion); |
492 | 492 | ||
493 | #ifdef CONFIG_MODULE_UNLOAD | 493 | #ifdef CONFIG_MODULE_UNLOAD |
494 | /* Init the unload section of the module. */ | 494 | /* Init the unload section of the module. */ |
495 | static void module_unload_init(struct module *mod) | 495 | static void module_unload_init(struct module *mod) |
496 | { | 496 | { |
497 | unsigned int i; | 497 | unsigned int i; |
498 | 498 | ||
499 | INIT_LIST_HEAD(&mod->modules_which_use_me); | 499 | INIT_LIST_HEAD(&mod->modules_which_use_me); |
500 | for (i = 0; i < NR_CPUS; i++) | 500 | for (i = 0; i < NR_CPUS; i++) |
501 | local_set(&mod->ref[i].count, 0); | 501 | local_set(&mod->ref[i].count, 0); |
502 | /* Hold reference count during initialization. */ | 502 | /* Hold reference count during initialization. */ |
503 | local_set(&mod->ref[raw_smp_processor_id()].count, 1); | 503 | local_set(&mod->ref[raw_smp_processor_id()].count, 1); |
504 | /* Backwards compatibility macros put refcount during init. */ | 504 | /* Backwards compatibility macros put refcount during init. */ |
505 | mod->waiter = current; | 505 | mod->waiter = current; |
506 | } | 506 | } |
507 | 507 | ||
508 | /* modules using other modules */ | 508 | /* modules using other modules */ |
509 | struct module_use | 509 | struct module_use |
510 | { | 510 | { |
511 | struct list_head list; | 511 | struct list_head list; |
512 | struct module *module_which_uses; | 512 | struct module *module_which_uses; |
513 | }; | 513 | }; |
514 | 514 | ||
515 | /* Does a already use b? */ | 515 | /* Does a already use b? */ |
516 | static int already_uses(struct module *a, struct module *b) | 516 | static int already_uses(struct module *a, struct module *b) |
517 | { | 517 | { |
518 | struct module_use *use; | 518 | struct module_use *use; |
519 | 519 | ||
520 | list_for_each_entry(use, &b->modules_which_use_me, list) { | 520 | list_for_each_entry(use, &b->modules_which_use_me, list) { |
521 | if (use->module_which_uses == a) { | 521 | if (use->module_which_uses == a) { |
522 | DEBUGP("%s uses %s!\n", a->name, b->name); | 522 | DEBUGP("%s uses %s!\n", a->name, b->name); |
523 | return 1; | 523 | return 1; |
524 | } | 524 | } |
525 | } | 525 | } |
526 | DEBUGP("%s does not use %s!\n", a->name, b->name); | 526 | DEBUGP("%s does not use %s!\n", a->name, b->name); |
527 | return 0; | 527 | return 0; |
528 | } | 528 | } |
529 | 529 | ||
530 | /* Module a uses b */ | 530 | /* Module a uses b */ |
531 | static int use_module(struct module *a, struct module *b) | 531 | static int use_module(struct module *a, struct module *b) |
532 | { | 532 | { |
533 | struct module_use *use; | 533 | struct module_use *use; |
534 | if (b == NULL || already_uses(a, b)) return 1; | 534 | if (b == NULL || already_uses(a, b)) return 1; |
535 | 535 | ||
536 | if (!strong_try_module_get(b)) | 536 | if (!strong_try_module_get(b)) |
537 | return 0; | 537 | return 0; |
538 | 538 | ||
539 | DEBUGP("Allocating new usage for %s.\n", a->name); | 539 | DEBUGP("Allocating new usage for %s.\n", a->name); |
540 | use = kmalloc(sizeof(*use), GFP_ATOMIC); | 540 | use = kmalloc(sizeof(*use), GFP_ATOMIC); |
541 | if (!use) { | 541 | if (!use) { |
542 | printk("%s: out of memory loading\n", a->name); | 542 | printk("%s: out of memory loading\n", a->name); |
543 | module_put(b); | 543 | module_put(b); |
544 | return 0; | 544 | return 0; |
545 | } | 545 | } |
546 | 546 | ||
547 | use->module_which_uses = a; | 547 | use->module_which_uses = a; |
548 | list_add(&use->list, &b->modules_which_use_me); | 548 | list_add(&use->list, &b->modules_which_use_me); |
549 | return 1; | 549 | return 1; |
550 | } | 550 | } |
551 | 551 | ||
552 | /* Clear the unload stuff of the module. */ | 552 | /* Clear the unload stuff of the module. */ |
553 | static void module_unload_free(struct module *mod) | 553 | static void module_unload_free(struct module *mod) |
554 | { | 554 | { |
555 | struct module *i; | 555 | struct module *i; |
556 | 556 | ||
557 | list_for_each_entry(i, &modules, list) { | 557 | list_for_each_entry(i, &modules, list) { |
558 | struct module_use *use; | 558 | struct module_use *use; |
559 | 559 | ||
560 | list_for_each_entry(use, &i->modules_which_use_me, list) { | 560 | list_for_each_entry(use, &i->modules_which_use_me, list) { |
561 | if (use->module_which_uses == mod) { | 561 | if (use->module_which_uses == mod) { |
562 | DEBUGP("%s unusing %s\n", mod->name, i->name); | 562 | DEBUGP("%s unusing %s\n", mod->name, i->name); |
563 | module_put(i); | 563 | module_put(i); |
564 | list_del(&use->list); | 564 | list_del(&use->list); |
565 | kfree(use); | 565 | kfree(use); |
566 | /* There can be at most one match. */ | 566 | /* There can be at most one match. */ |
567 | break; | 567 | break; |
568 | } | 568 | } |
569 | } | 569 | } |
570 | } | 570 | } |
571 | } | 571 | } |
572 | 572 | ||
573 | #ifdef CONFIG_MODULE_FORCE_UNLOAD | 573 | #ifdef CONFIG_MODULE_FORCE_UNLOAD |
574 | static inline int try_force_unload(unsigned int flags) | 574 | static inline int try_force_unload(unsigned int flags) |
575 | { | 575 | { |
576 | int ret = (flags & O_TRUNC); | 576 | int ret = (flags & O_TRUNC); |
577 | if (ret) | 577 | if (ret) |
578 | add_taint(TAINT_FORCED_RMMOD); | 578 | add_taint(TAINT_FORCED_RMMOD); |
579 | return ret; | 579 | return ret; |
580 | } | 580 | } |
581 | #else | 581 | #else |
582 | static inline int try_force_unload(unsigned int flags) | 582 | static inline int try_force_unload(unsigned int flags) |
583 | { | 583 | { |
584 | return 0; | 584 | return 0; |
585 | } | 585 | } |
586 | #endif /* CONFIG_MODULE_FORCE_UNLOAD */ | 586 | #endif /* CONFIG_MODULE_FORCE_UNLOAD */ |
587 | 587 | ||
588 | struct stopref | 588 | struct stopref |
589 | { | 589 | { |
590 | struct module *mod; | 590 | struct module *mod; |
591 | int flags; | 591 | int flags; |
592 | int *forced; | 592 | int *forced; |
593 | }; | 593 | }; |
594 | 594 | ||
595 | /* Whole machine is stopped with interrupts off when this runs. */ | 595 | /* Whole machine is stopped with interrupts off when this runs. */ |
596 | static int __try_stop_module(void *_sref) | 596 | static int __try_stop_module(void *_sref) |
597 | { | 597 | { |
598 | struct stopref *sref = _sref; | 598 | struct stopref *sref = _sref; |
599 | 599 | ||
600 | /* If it's not unused, quit unless we are told to block. */ | 600 | /* If it's not unused, quit unless we are told to block. */ |
601 | if ((sref->flags & O_NONBLOCK) && module_refcount(sref->mod) != 0) { | 601 | if ((sref->flags & O_NONBLOCK) && module_refcount(sref->mod) != 0) { |
602 | if (!(*sref->forced = try_force_unload(sref->flags))) | 602 | if (!(*sref->forced = try_force_unload(sref->flags))) |
603 | return -EWOULDBLOCK; | 603 | return -EWOULDBLOCK; |
604 | } | 604 | } |
605 | 605 | ||
606 | /* Mark it as dying. */ | 606 | /* Mark it as dying. */ |
607 | sref->mod->state = MODULE_STATE_GOING; | 607 | sref->mod->state = MODULE_STATE_GOING; |
608 | return 0; | 608 | return 0; |
609 | } | 609 | } |
610 | 610 | ||
611 | static int try_stop_module(struct module *mod, int flags, int *forced) | 611 | static int try_stop_module(struct module *mod, int flags, int *forced) |
612 | { | 612 | { |
613 | struct stopref sref = { mod, flags, forced }; | 613 | struct stopref sref = { mod, flags, forced }; |
614 | 614 | ||
615 | return stop_machine_run(__try_stop_module, &sref, NR_CPUS); | 615 | return stop_machine_run(__try_stop_module, &sref, NR_CPUS); |
616 | } | 616 | } |
617 | 617 | ||
618 | unsigned int module_refcount(struct module *mod) | 618 | unsigned int module_refcount(struct module *mod) |
619 | { | 619 | { |
620 | unsigned int i, total = 0; | 620 | unsigned int i, total = 0; |
621 | 621 | ||
622 | for (i = 0; i < NR_CPUS; i++) | 622 | for (i = 0; i < NR_CPUS; i++) |
623 | total += local_read(&mod->ref[i].count); | 623 | total += local_read(&mod->ref[i].count); |
624 | return total; | 624 | return total; |
625 | } | 625 | } |
626 | EXPORT_SYMBOL(module_refcount); | 626 | EXPORT_SYMBOL(module_refcount); |
627 | 627 | ||
628 | /* This exists whether we can unload or not */ | 628 | /* This exists whether we can unload or not */ |
629 | static void free_module(struct module *mod); | 629 | static void free_module(struct module *mod); |
630 | 630 | ||
631 | static void wait_for_zero_refcount(struct module *mod) | 631 | static void wait_for_zero_refcount(struct module *mod) |
632 | { | 632 | { |
633 | /* Since we might sleep for some time, drop the semaphore first */ | 633 | /* Since we might sleep for some time, drop the semaphore first */ |
634 | mutex_unlock(&module_mutex); | 634 | mutex_unlock(&module_mutex); |
635 | for (;;) { | 635 | for (;;) { |
636 | DEBUGP("Looking at refcount...\n"); | 636 | DEBUGP("Looking at refcount...\n"); |
637 | set_current_state(TASK_UNINTERRUPTIBLE); | 637 | set_current_state(TASK_UNINTERRUPTIBLE); |
638 | if (module_refcount(mod) == 0) | 638 | if (module_refcount(mod) == 0) |
639 | break; | 639 | break; |
640 | schedule(); | 640 | schedule(); |
641 | } | 641 | } |
642 | current->state = TASK_RUNNING; | 642 | current->state = TASK_RUNNING; |
643 | mutex_lock(&module_mutex); | 643 | mutex_lock(&module_mutex); |
644 | } | 644 | } |
645 | 645 | ||
646 | asmlinkage long | 646 | asmlinkage long |
647 | sys_delete_module(const char __user *name_user, unsigned int flags) | 647 | sys_delete_module(const char __user *name_user, unsigned int flags) |
648 | { | 648 | { |
649 | struct module *mod; | 649 | struct module *mod; |
650 | char name[MODULE_NAME_LEN]; | 650 | char name[MODULE_NAME_LEN]; |
651 | int ret, forced = 0; | 651 | int ret, forced = 0; |
652 | 652 | ||
653 | if (!capable(CAP_SYS_MODULE)) | 653 | if (!capable(CAP_SYS_MODULE)) |
654 | return -EPERM; | 654 | return -EPERM; |
655 | 655 | ||
656 | if (strncpy_from_user(name, name_user, MODULE_NAME_LEN-1) < 0) | 656 | if (strncpy_from_user(name, name_user, MODULE_NAME_LEN-1) < 0) |
657 | return -EFAULT; | 657 | return -EFAULT; |
658 | name[MODULE_NAME_LEN-1] = '\0'; | 658 | name[MODULE_NAME_LEN-1] = '\0'; |
659 | 659 | ||
660 | if (mutex_lock_interruptible(&module_mutex) != 0) | 660 | if (mutex_lock_interruptible(&module_mutex) != 0) |
661 | return -EINTR; | 661 | return -EINTR; |
662 | 662 | ||
663 | mod = find_module(name); | 663 | mod = find_module(name); |
664 | if (!mod) { | 664 | if (!mod) { |
665 | ret = -ENOENT; | 665 | ret = -ENOENT; |
666 | goto out; | 666 | goto out; |
667 | } | 667 | } |
668 | 668 | ||
669 | if (!list_empty(&mod->modules_which_use_me)) { | 669 | if (!list_empty(&mod->modules_which_use_me)) { |
670 | /* Other modules depend on us: get rid of them first. */ | 670 | /* Other modules depend on us: get rid of them first. */ |
671 | ret = -EWOULDBLOCK; | 671 | ret = -EWOULDBLOCK; |
672 | goto out; | 672 | goto out; |
673 | } | 673 | } |
674 | 674 | ||
675 | /* Doing init or already dying? */ | 675 | /* Doing init or already dying? */ |
676 | if (mod->state != MODULE_STATE_LIVE) { | 676 | if (mod->state != MODULE_STATE_LIVE) { |
677 | /* FIXME: if (force), slam module count and wake up | 677 | /* FIXME: if (force), slam module count and wake up |
678 | waiter --RR */ | 678 | waiter --RR */ |
679 | DEBUGP("%s already dying\n", mod->name); | 679 | DEBUGP("%s already dying\n", mod->name); |
680 | ret = -EBUSY; | 680 | ret = -EBUSY; |
681 | goto out; | 681 | goto out; |
682 | } | 682 | } |
683 | 683 | ||
684 | /* If it has an init func, it must have an exit func to unload */ | 684 | /* If it has an init func, it must have an exit func to unload */ |
685 | if ((mod->init != NULL && mod->exit == NULL) | 685 | if ((mod->init != NULL && mod->exit == NULL) |
686 | || mod->unsafe) { | 686 | || mod->unsafe) { |
687 | forced = try_force_unload(flags); | 687 | forced = try_force_unload(flags); |
688 | if (!forced) { | 688 | if (!forced) { |
689 | /* This module can't be removed */ | 689 | /* This module can't be removed */ |
690 | ret = -EBUSY; | 690 | ret = -EBUSY; |
691 | goto out; | 691 | goto out; |
692 | } | 692 | } |
693 | } | 693 | } |
694 | 694 | ||
695 | /* Set this up before setting mod->state */ | 695 | /* Set this up before setting mod->state */ |
696 | mod->waiter = current; | 696 | mod->waiter = current; |
697 | 697 | ||
698 | /* Stop the machine so refcounts can't move and disable module. */ | 698 | /* Stop the machine so refcounts can't move and disable module. */ |
699 | ret = try_stop_module(mod, flags, &forced); | 699 | ret = try_stop_module(mod, flags, &forced); |
700 | if (ret != 0) | 700 | if (ret != 0) |
701 | goto out; | 701 | goto out; |
702 | 702 | ||
703 | /* Never wait if forced. */ | 703 | /* Never wait if forced. */ |
704 | if (!forced && module_refcount(mod) != 0) | 704 | if (!forced && module_refcount(mod) != 0) |
705 | wait_for_zero_refcount(mod); | 705 | wait_for_zero_refcount(mod); |
706 | 706 | ||
707 | /* Final destruction now noone is using it. */ | 707 | /* Final destruction now noone is using it. */ |
708 | if (mod->exit != NULL) { | 708 | if (mod->exit != NULL) { |
709 | mutex_unlock(&module_mutex); | 709 | mutex_unlock(&module_mutex); |
710 | mod->exit(); | 710 | mod->exit(); |
711 | mutex_lock(&module_mutex); | 711 | mutex_lock(&module_mutex); |
712 | } | 712 | } |
713 | free_module(mod); | 713 | free_module(mod); |
714 | 714 | ||
715 | out: | 715 | out: |
716 | mutex_unlock(&module_mutex); | 716 | mutex_unlock(&module_mutex); |
717 | return ret; | 717 | return ret; |
718 | } | 718 | } |
719 | 719 | ||
720 | static void print_unload_info(struct seq_file *m, struct module *mod) | 720 | static void print_unload_info(struct seq_file *m, struct module *mod) |
721 | { | 721 | { |
722 | struct module_use *use; | 722 | struct module_use *use; |
723 | int printed_something = 0; | 723 | int printed_something = 0; |
724 | 724 | ||
725 | seq_printf(m, " %u ", module_refcount(mod)); | 725 | seq_printf(m, " %u ", module_refcount(mod)); |
726 | 726 | ||
727 | /* Always include a trailing , so userspace can differentiate | 727 | /* Always include a trailing , so userspace can differentiate |
728 | between this and the old multi-field proc format. */ | 728 | between this and the old multi-field proc format. */ |
729 | list_for_each_entry(use, &mod->modules_which_use_me, list) { | 729 | list_for_each_entry(use, &mod->modules_which_use_me, list) { |
730 | printed_something = 1; | 730 | printed_something = 1; |
731 | seq_printf(m, "%s,", use->module_which_uses->name); | 731 | seq_printf(m, "%s,", use->module_which_uses->name); |
732 | } | 732 | } |
733 | 733 | ||
734 | if (mod->unsafe) { | 734 | if (mod->unsafe) { |
735 | printed_something = 1; | 735 | printed_something = 1; |
736 | seq_printf(m, "[unsafe],"); | 736 | seq_printf(m, "[unsafe],"); |
737 | } | 737 | } |
738 | 738 | ||
739 | if (mod->init != NULL && mod->exit == NULL) { | 739 | if (mod->init != NULL && mod->exit == NULL) { |
740 | printed_something = 1; | 740 | printed_something = 1; |
741 | seq_printf(m, "[permanent],"); | 741 | seq_printf(m, "[permanent],"); |
742 | } | 742 | } |
743 | 743 | ||
744 | if (!printed_something) | 744 | if (!printed_something) |
745 | seq_printf(m, "-"); | 745 | seq_printf(m, "-"); |
746 | } | 746 | } |
747 | 747 | ||
748 | void __symbol_put(const char *symbol) | 748 | void __symbol_put(const char *symbol) |
749 | { | 749 | { |
750 | struct module *owner; | 750 | struct module *owner; |
751 | unsigned long flags; | 751 | unsigned long flags; |
752 | const unsigned long *crc; | 752 | const unsigned long *crc; |
753 | 753 | ||
754 | spin_lock_irqsave(&modlist_lock, flags); | 754 | spin_lock_irqsave(&modlist_lock, flags); |
755 | if (!__find_symbol(symbol, &owner, &crc, 1)) | 755 | if (!__find_symbol(symbol, &owner, &crc, 1)) |
756 | BUG(); | 756 | BUG(); |
757 | module_put(owner); | 757 | module_put(owner); |
758 | spin_unlock_irqrestore(&modlist_lock, flags); | 758 | spin_unlock_irqrestore(&modlist_lock, flags); |
759 | } | 759 | } |
760 | EXPORT_SYMBOL(__symbol_put); | 760 | EXPORT_SYMBOL(__symbol_put); |
761 | 761 | ||
762 | void symbol_put_addr(void *addr) | 762 | void symbol_put_addr(void *addr) |
763 | { | 763 | { |
764 | struct module *modaddr; | 764 | struct module *modaddr; |
765 | 765 | ||
766 | if (core_kernel_text((unsigned long)addr)) | 766 | if (core_kernel_text((unsigned long)addr)) |
767 | return; | 767 | return; |
768 | 768 | ||
769 | if (!(modaddr = module_text_address((unsigned long)addr))) | 769 | if (!(modaddr = module_text_address((unsigned long)addr))) |
770 | BUG(); | 770 | BUG(); |
771 | module_put(modaddr); | 771 | module_put(modaddr); |
772 | } | 772 | } |
773 | EXPORT_SYMBOL_GPL(symbol_put_addr); | 773 | EXPORT_SYMBOL_GPL(symbol_put_addr); |
774 | 774 | ||
775 | static ssize_t show_refcnt(struct module_attribute *mattr, | 775 | static ssize_t show_refcnt(struct module_attribute *mattr, |
776 | struct module *mod, char *buffer) | 776 | struct module *mod, char *buffer) |
777 | { | 777 | { |
778 | /* sysfs holds a reference */ | 778 | /* sysfs holds a reference */ |
779 | return sprintf(buffer, "%u\n", module_refcount(mod)-1); | 779 | return sprintf(buffer, "%u\n", module_refcount(mod)-1); |
780 | } | 780 | } |
781 | 781 | ||
782 | static struct module_attribute refcnt = { | 782 | static struct module_attribute refcnt = { |
783 | .attr = { .name = "refcnt", .mode = 0444, .owner = THIS_MODULE }, | 783 | .attr = { .name = "refcnt", .mode = 0444, .owner = THIS_MODULE }, |
784 | .show = show_refcnt, | 784 | .show = show_refcnt, |
785 | }; | 785 | }; |
786 | 786 | ||
787 | #else /* !CONFIG_MODULE_UNLOAD */ | 787 | #else /* !CONFIG_MODULE_UNLOAD */ |
788 | static void print_unload_info(struct seq_file *m, struct module *mod) | 788 | static void print_unload_info(struct seq_file *m, struct module *mod) |
789 | { | 789 | { |
790 | /* We don't know the usage count, or what modules are using. */ | 790 | /* We don't know the usage count, or what modules are using. */ |
791 | seq_printf(m, " - -"); | 791 | seq_printf(m, " - -"); |
792 | } | 792 | } |
793 | 793 | ||
794 | static inline void module_unload_free(struct module *mod) | 794 | static inline void module_unload_free(struct module *mod) |
795 | { | 795 | { |
796 | } | 796 | } |
797 | 797 | ||
798 | static inline int use_module(struct module *a, struct module *b) | 798 | static inline int use_module(struct module *a, struct module *b) |
799 | { | 799 | { |
800 | return strong_try_module_get(b); | 800 | return strong_try_module_get(b); |
801 | } | 801 | } |
802 | 802 | ||
803 | static inline void module_unload_init(struct module *mod) | 803 | static inline void module_unload_init(struct module *mod) |
804 | { | 804 | { |
805 | } | 805 | } |
806 | #endif /* CONFIG_MODULE_UNLOAD */ | 806 | #endif /* CONFIG_MODULE_UNLOAD */ |
807 | 807 | ||
808 | static struct module_attribute *modinfo_attrs[] = { | 808 | static struct module_attribute *modinfo_attrs[] = { |
809 | &modinfo_version, | 809 | &modinfo_version, |
810 | &modinfo_srcversion, | 810 | &modinfo_srcversion, |
811 | #ifdef CONFIG_MODULE_UNLOAD | 811 | #ifdef CONFIG_MODULE_UNLOAD |
812 | &refcnt, | 812 | &refcnt, |
813 | #endif | 813 | #endif |
814 | NULL, | 814 | NULL, |
815 | }; | 815 | }; |
816 | 816 | ||
817 | static const char vermagic[] = VERMAGIC_STRING; | 817 | static const char vermagic[] = VERMAGIC_STRING; |
818 | 818 | ||
819 | #ifdef CONFIG_MODVERSIONS | 819 | #ifdef CONFIG_MODVERSIONS |
820 | static int check_version(Elf_Shdr *sechdrs, | 820 | static int check_version(Elf_Shdr *sechdrs, |
821 | unsigned int versindex, | 821 | unsigned int versindex, |
822 | const char *symname, | 822 | const char *symname, |
823 | struct module *mod, | 823 | struct module *mod, |
824 | const unsigned long *crc) | 824 | const unsigned long *crc) |
825 | { | 825 | { |
826 | unsigned int i, num_versions; | 826 | unsigned int i, num_versions; |
827 | struct modversion_info *versions; | 827 | struct modversion_info *versions; |
828 | 828 | ||
829 | /* Exporting module didn't supply crcs? OK, we're already tainted. */ | 829 | /* Exporting module didn't supply crcs? OK, we're already tainted. */ |
830 | if (!crc) | 830 | if (!crc) |
831 | return 1; | 831 | return 1; |
832 | 832 | ||
833 | versions = (void *) sechdrs[versindex].sh_addr; | 833 | versions = (void *) sechdrs[versindex].sh_addr; |
834 | num_versions = sechdrs[versindex].sh_size | 834 | num_versions = sechdrs[versindex].sh_size |
835 | / sizeof(struct modversion_info); | 835 | / sizeof(struct modversion_info); |
836 | 836 | ||
837 | for (i = 0; i < num_versions; i++) { | 837 | for (i = 0; i < num_versions; i++) { |
838 | if (strcmp(versions[i].name, symname) != 0) | 838 | if (strcmp(versions[i].name, symname) != 0) |
839 | continue; | 839 | continue; |
840 | 840 | ||
841 | if (versions[i].crc == *crc) | 841 | if (versions[i].crc == *crc) |
842 | return 1; | 842 | return 1; |
843 | printk("%s: disagrees about version of symbol %s\n", | 843 | printk("%s: disagrees about version of symbol %s\n", |
844 | mod->name, symname); | 844 | mod->name, symname); |
845 | DEBUGP("Found checksum %lX vs module %lX\n", | 845 | DEBUGP("Found checksum %lX vs module %lX\n", |
846 | *crc, versions[i].crc); | 846 | *crc, versions[i].crc); |
847 | return 0; | 847 | return 0; |
848 | } | 848 | } |
849 | /* Not in module's version table. OK, but that taints the kernel. */ | 849 | /* Not in module's version table. OK, but that taints the kernel. */ |
850 | if (!(tainted & TAINT_FORCED_MODULE)) { | 850 | if (!(tainted & TAINT_FORCED_MODULE)) { |
851 | printk("%s: no version for \"%s\" found: kernel tainted.\n", | 851 | printk("%s: no version for \"%s\" found: kernel tainted.\n", |
852 | mod->name, symname); | 852 | mod->name, symname); |
853 | add_taint(TAINT_FORCED_MODULE); | 853 | add_taint(TAINT_FORCED_MODULE); |
854 | } | 854 | } |
855 | return 1; | 855 | return 1; |
856 | } | 856 | } |
857 | 857 | ||
858 | static inline int check_modstruct_version(Elf_Shdr *sechdrs, | 858 | static inline int check_modstruct_version(Elf_Shdr *sechdrs, |
859 | unsigned int versindex, | 859 | unsigned int versindex, |
860 | struct module *mod) | 860 | struct module *mod) |
861 | { | 861 | { |
862 | const unsigned long *crc; | 862 | const unsigned long *crc; |
863 | struct module *owner; | 863 | struct module *owner; |
864 | 864 | ||
865 | if (!__find_symbol("struct_module", &owner, &crc, 1)) | 865 | if (!__find_symbol("struct_module", &owner, &crc, 1)) |
866 | BUG(); | 866 | BUG(); |
867 | return check_version(sechdrs, versindex, "struct_module", mod, | 867 | return check_version(sechdrs, versindex, "struct_module", mod, |
868 | crc); | 868 | crc); |
869 | } | 869 | } |
870 | 870 | ||
871 | /* First part is kernel version, which we ignore. */ | 871 | /* First part is kernel version, which we ignore. */ |
872 | static inline int same_magic(const char *amagic, const char *bmagic) | 872 | static inline int same_magic(const char *amagic, const char *bmagic) |
873 | { | 873 | { |
874 | amagic += strcspn(amagic, " "); | 874 | amagic += strcspn(amagic, " "); |
875 | bmagic += strcspn(bmagic, " "); | 875 | bmagic += strcspn(bmagic, " "); |
876 | return strcmp(amagic, bmagic) == 0; | 876 | return strcmp(amagic, bmagic) == 0; |
877 | } | 877 | } |
878 | #else | 878 | #else |
879 | static inline int check_version(Elf_Shdr *sechdrs, | 879 | static inline int check_version(Elf_Shdr *sechdrs, |
880 | unsigned int versindex, | 880 | unsigned int versindex, |
881 | const char *symname, | 881 | const char *symname, |
882 | struct module *mod, | 882 | struct module *mod, |
883 | const unsigned long *crc) | 883 | const unsigned long *crc) |
884 | { | 884 | { |
885 | return 1; | 885 | return 1; |
886 | } | 886 | } |
887 | 887 | ||
888 | static inline int check_modstruct_version(Elf_Shdr *sechdrs, | 888 | static inline int check_modstruct_version(Elf_Shdr *sechdrs, |
889 | unsigned int versindex, | 889 | unsigned int versindex, |
890 | struct module *mod) | 890 | struct module *mod) |
891 | { | 891 | { |
892 | return 1; | 892 | return 1; |
893 | } | 893 | } |
894 | 894 | ||
895 | static inline int same_magic(const char *amagic, const char *bmagic) | 895 | static inline int same_magic(const char *amagic, const char *bmagic) |
896 | { | 896 | { |
897 | return strcmp(amagic, bmagic) == 0; | 897 | return strcmp(amagic, bmagic) == 0; |
898 | } | 898 | } |
899 | #endif /* CONFIG_MODVERSIONS */ | 899 | #endif /* CONFIG_MODVERSIONS */ |
900 | 900 | ||
901 | /* Resolve a symbol for this module. I.e. if we find one, record usage. | 901 | /* Resolve a symbol for this module. I.e. if we find one, record usage. |
902 | Must be holding module_mutex. */ | 902 | Must be holding module_mutex. */ |
903 | static unsigned long resolve_symbol(Elf_Shdr *sechdrs, | 903 | static unsigned long resolve_symbol(Elf_Shdr *sechdrs, |
904 | unsigned int versindex, | 904 | unsigned int versindex, |
905 | const char *name, | 905 | const char *name, |
906 | struct module *mod) | 906 | struct module *mod) |
907 | { | 907 | { |
908 | struct module *owner; | 908 | struct module *owner; |
909 | unsigned long ret; | 909 | unsigned long ret; |
910 | const unsigned long *crc; | 910 | const unsigned long *crc; |
911 | 911 | ||
912 | ret = __find_symbol(name, &owner, &crc, mod->license_gplok); | 912 | ret = __find_symbol(name, &owner, &crc, mod->license_gplok); |
913 | if (ret) { | 913 | if (ret) { |
914 | /* use_module can fail due to OOM, or module unloading */ | 914 | /* use_module can fail due to OOM, or module unloading */ |
915 | if (!check_version(sechdrs, versindex, name, mod, crc) || | 915 | if (!check_version(sechdrs, versindex, name, mod, crc) || |
916 | !use_module(mod, owner)) | 916 | !use_module(mod, owner)) |
917 | ret = 0; | 917 | ret = 0; |
918 | } | 918 | } |
919 | return ret; | 919 | return ret; |
920 | } | 920 | } |
921 | 921 | ||
922 | 922 | ||
923 | /* | 923 | /* |
924 | * /sys/module/foo/sections stuff | 924 | * /sys/module/foo/sections stuff |
925 | * J. Corbet <corbet@lwn.net> | 925 | * J. Corbet <corbet@lwn.net> |
926 | */ | 926 | */ |
927 | #ifdef CONFIG_KALLSYMS | 927 | #ifdef CONFIG_KALLSYMS |
928 | static ssize_t module_sect_show(struct module_attribute *mattr, | 928 | static ssize_t module_sect_show(struct module_attribute *mattr, |
929 | struct module *mod, char *buf) | 929 | struct module *mod, char *buf) |
930 | { | 930 | { |
931 | struct module_sect_attr *sattr = | 931 | struct module_sect_attr *sattr = |
932 | container_of(mattr, struct module_sect_attr, mattr); | 932 | container_of(mattr, struct module_sect_attr, mattr); |
933 | return sprintf(buf, "0x%lx\n", sattr->address); | 933 | return sprintf(buf, "0x%lx\n", sattr->address); |
934 | } | 934 | } |
935 | 935 | ||
936 | static void free_sect_attrs(struct module_sect_attrs *sect_attrs) | ||
937 | { | ||
938 | int section; | ||
939 | |||
940 | for (section = 0; section < sect_attrs->nsections; section++) | ||
941 | kfree(sect_attrs->attrs[section].name); | ||
942 | kfree(sect_attrs); | ||
943 | } | ||
944 | |||
936 | static void add_sect_attrs(struct module *mod, unsigned int nsect, | 945 | static void add_sect_attrs(struct module *mod, unsigned int nsect, |
937 | char *secstrings, Elf_Shdr *sechdrs) | 946 | char *secstrings, Elf_Shdr *sechdrs) |
938 | { | 947 | { |
939 | unsigned int nloaded = 0, i, size[2]; | 948 | unsigned int nloaded = 0, i, size[2]; |
940 | struct module_sect_attrs *sect_attrs; | 949 | struct module_sect_attrs *sect_attrs; |
941 | struct module_sect_attr *sattr; | 950 | struct module_sect_attr *sattr; |
942 | struct attribute **gattr; | 951 | struct attribute **gattr; |
943 | 952 | ||
944 | /* Count loaded sections and allocate structures */ | 953 | /* Count loaded sections and allocate structures */ |
945 | for (i = 0; i < nsect; i++) | 954 | for (i = 0; i < nsect; i++) |
946 | if (sechdrs[i].sh_flags & SHF_ALLOC) | 955 | if (sechdrs[i].sh_flags & SHF_ALLOC) |
947 | nloaded++; | 956 | nloaded++; |
948 | size[0] = ALIGN(sizeof(*sect_attrs) | 957 | size[0] = ALIGN(sizeof(*sect_attrs) |
949 | + nloaded * sizeof(sect_attrs->attrs[0]), | 958 | + nloaded * sizeof(sect_attrs->attrs[0]), |
950 | sizeof(sect_attrs->grp.attrs[0])); | 959 | sizeof(sect_attrs->grp.attrs[0])); |
951 | size[1] = (nloaded + 1) * sizeof(sect_attrs->grp.attrs[0]); | 960 | size[1] = (nloaded + 1) * sizeof(sect_attrs->grp.attrs[0]); |
952 | if (! (sect_attrs = kmalloc(size[0] + size[1], GFP_KERNEL))) | 961 | sect_attrs = kzalloc(size[0] + size[1], GFP_KERNEL); |
962 | if (sect_attrs == NULL) | ||
953 | return; | 963 | return; |
954 | 964 | ||
955 | /* Setup section attributes. */ | 965 | /* Setup section attributes. */ |
956 | sect_attrs->grp.name = "sections"; | 966 | sect_attrs->grp.name = "sections"; |
957 | sect_attrs->grp.attrs = (void *)sect_attrs + size[0]; | 967 | sect_attrs->grp.attrs = (void *)sect_attrs + size[0]; |
958 | 968 | ||
969 | sect_attrs->nsections = 0; | ||
959 | sattr = §_attrs->attrs[0]; | 970 | sattr = §_attrs->attrs[0]; |
960 | gattr = §_attrs->grp.attrs[0]; | 971 | gattr = §_attrs->grp.attrs[0]; |
961 | for (i = 0; i < nsect; i++) { | 972 | for (i = 0; i < nsect; i++) { |
962 | if (! (sechdrs[i].sh_flags & SHF_ALLOC)) | 973 | if (! (sechdrs[i].sh_flags & SHF_ALLOC)) |
963 | continue; | 974 | continue; |
964 | sattr->address = sechdrs[i].sh_addr; | 975 | sattr->address = sechdrs[i].sh_addr; |
965 | strlcpy(sattr->name, secstrings + sechdrs[i].sh_name, | 976 | sattr->name = kstrdup(secstrings + sechdrs[i].sh_name, |
966 | MODULE_SECT_NAME_LEN); | 977 | GFP_KERNEL); |
978 | if (sattr->name == NULL) | ||
979 | goto out; | ||
980 | sect_attrs->nsections++; | ||
967 | sattr->mattr.show = module_sect_show; | 981 | sattr->mattr.show = module_sect_show; |
968 | sattr->mattr.store = NULL; | 982 | sattr->mattr.store = NULL; |
969 | sattr->mattr.attr.name = sattr->name; | 983 | sattr->mattr.attr.name = sattr->name; |
970 | sattr->mattr.attr.owner = mod; | 984 | sattr->mattr.attr.owner = mod; |
971 | sattr->mattr.attr.mode = S_IRUGO; | 985 | sattr->mattr.attr.mode = S_IRUGO; |
972 | *(gattr++) = &(sattr++)->mattr.attr; | 986 | *(gattr++) = &(sattr++)->mattr.attr; |
973 | } | 987 | } |
974 | *gattr = NULL; | 988 | *gattr = NULL; |
975 | 989 | ||
976 | if (sysfs_create_group(&mod->mkobj.kobj, §_attrs->grp)) | 990 | if (sysfs_create_group(&mod->mkobj.kobj, §_attrs->grp)) |
977 | goto out; | 991 | goto out; |
978 | 992 | ||
979 | mod->sect_attrs = sect_attrs; | 993 | mod->sect_attrs = sect_attrs; |
980 | return; | 994 | return; |
981 | out: | 995 | out: |
982 | kfree(sect_attrs); | 996 | free_sect_attrs(sect_attrs); |
983 | } | 997 | } |
984 | 998 | ||
985 | static void remove_sect_attrs(struct module *mod) | 999 | static void remove_sect_attrs(struct module *mod) |
986 | { | 1000 | { |
987 | if (mod->sect_attrs) { | 1001 | if (mod->sect_attrs) { |
988 | sysfs_remove_group(&mod->mkobj.kobj, | 1002 | sysfs_remove_group(&mod->mkobj.kobj, |
989 | &mod->sect_attrs->grp); | 1003 | &mod->sect_attrs->grp); |
990 | /* We are positive that no one is using any sect attrs | 1004 | /* We are positive that no one is using any sect attrs |
991 | * at this point. Deallocate immediately. */ | 1005 | * at this point. Deallocate immediately. */ |
992 | kfree(mod->sect_attrs); | 1006 | free_sect_attrs(mod->sect_attrs); |
993 | mod->sect_attrs = NULL; | 1007 | mod->sect_attrs = NULL; |
994 | } | 1008 | } |
995 | } | 1009 | } |
996 | 1010 | ||
997 | |||
998 | #else | 1011 | #else |
1012 | |||
999 | static inline void add_sect_attrs(struct module *mod, unsigned int nsect, | 1013 | static inline void add_sect_attrs(struct module *mod, unsigned int nsect, |
1000 | char *sectstrings, Elf_Shdr *sechdrs) | 1014 | char *sectstrings, Elf_Shdr *sechdrs) |
1001 | { | 1015 | { |
1002 | } | 1016 | } |
1003 | 1017 | ||
1004 | static inline void remove_sect_attrs(struct module *mod) | 1018 | static inline void remove_sect_attrs(struct module *mod) |
1005 | { | 1019 | { |
1006 | } | 1020 | } |
1007 | #endif /* CONFIG_KALLSYMS */ | 1021 | #endif /* CONFIG_KALLSYMS */ |
1008 | 1022 | ||
1009 | static int module_add_modinfo_attrs(struct module *mod) | 1023 | static int module_add_modinfo_attrs(struct module *mod) |
1010 | { | 1024 | { |
1011 | struct module_attribute *attr; | 1025 | struct module_attribute *attr; |
1012 | struct module_attribute *temp_attr; | 1026 | struct module_attribute *temp_attr; |
1013 | int error = 0; | 1027 | int error = 0; |
1014 | int i; | 1028 | int i; |
1015 | 1029 | ||
1016 | mod->modinfo_attrs = kzalloc((sizeof(struct module_attribute) * | 1030 | mod->modinfo_attrs = kzalloc((sizeof(struct module_attribute) * |
1017 | (ARRAY_SIZE(modinfo_attrs) + 1)), | 1031 | (ARRAY_SIZE(modinfo_attrs) + 1)), |
1018 | GFP_KERNEL); | 1032 | GFP_KERNEL); |
1019 | if (!mod->modinfo_attrs) | 1033 | if (!mod->modinfo_attrs) |
1020 | return -ENOMEM; | 1034 | return -ENOMEM; |
1021 | 1035 | ||
1022 | temp_attr = mod->modinfo_attrs; | 1036 | temp_attr = mod->modinfo_attrs; |
1023 | for (i = 0; (attr = modinfo_attrs[i]) && !error; i++) { | 1037 | for (i = 0; (attr = modinfo_attrs[i]) && !error; i++) { |
1024 | if (!attr->test || | 1038 | if (!attr->test || |
1025 | (attr->test && attr->test(mod))) { | 1039 | (attr->test && attr->test(mod))) { |
1026 | memcpy(temp_attr, attr, sizeof(*temp_attr)); | 1040 | memcpy(temp_attr, attr, sizeof(*temp_attr)); |
1027 | temp_attr->attr.owner = mod; | 1041 | temp_attr->attr.owner = mod; |
1028 | error = sysfs_create_file(&mod->mkobj.kobj,&temp_attr->attr); | 1042 | error = sysfs_create_file(&mod->mkobj.kobj,&temp_attr->attr); |
1029 | ++temp_attr; | 1043 | ++temp_attr; |
1030 | } | 1044 | } |
1031 | } | 1045 | } |
1032 | return error; | 1046 | return error; |
1033 | } | 1047 | } |
1034 | 1048 | ||
1035 | static void module_remove_modinfo_attrs(struct module *mod) | 1049 | static void module_remove_modinfo_attrs(struct module *mod) |
1036 | { | 1050 | { |
1037 | struct module_attribute *attr; | 1051 | struct module_attribute *attr; |
1038 | int i; | 1052 | int i; |
1039 | 1053 | ||
1040 | for (i = 0; (attr = &mod->modinfo_attrs[i]); i++) { | 1054 | for (i = 0; (attr = &mod->modinfo_attrs[i]); i++) { |
1041 | /* pick a field to test for end of list */ | 1055 | /* pick a field to test for end of list */ |
1042 | if (!attr->attr.name) | 1056 | if (!attr->attr.name) |
1043 | break; | 1057 | break; |
1044 | sysfs_remove_file(&mod->mkobj.kobj,&attr->attr); | 1058 | sysfs_remove_file(&mod->mkobj.kobj,&attr->attr); |
1045 | if (attr->free) | 1059 | if (attr->free) |
1046 | attr->free(mod); | 1060 | attr->free(mod); |
1047 | } | 1061 | } |
1048 | kfree(mod->modinfo_attrs); | 1062 | kfree(mod->modinfo_attrs); |
1049 | } | 1063 | } |
1050 | 1064 | ||
1051 | static int mod_sysfs_setup(struct module *mod, | 1065 | static int mod_sysfs_setup(struct module *mod, |
1052 | struct kernel_param *kparam, | 1066 | struct kernel_param *kparam, |
1053 | unsigned int num_params) | 1067 | unsigned int num_params) |
1054 | { | 1068 | { |
1055 | int err; | 1069 | int err; |
1056 | 1070 | ||
1057 | if (!module_subsys.kset.subsys) { | 1071 | if (!module_subsys.kset.subsys) { |
1058 | printk(KERN_ERR "%s: module_subsys not initialized\n", | 1072 | printk(KERN_ERR "%s: module_subsys not initialized\n", |
1059 | mod->name); | 1073 | mod->name); |
1060 | err = -EINVAL; | 1074 | err = -EINVAL; |
1061 | goto out; | 1075 | goto out; |
1062 | } | 1076 | } |
1063 | memset(&mod->mkobj.kobj, 0, sizeof(mod->mkobj.kobj)); | 1077 | memset(&mod->mkobj.kobj, 0, sizeof(mod->mkobj.kobj)); |
1064 | err = kobject_set_name(&mod->mkobj.kobj, "%s", mod->name); | 1078 | err = kobject_set_name(&mod->mkobj.kobj, "%s", mod->name); |
1065 | if (err) | 1079 | if (err) |
1066 | goto out; | 1080 | goto out; |
1067 | kobj_set_kset_s(&mod->mkobj, module_subsys); | 1081 | kobj_set_kset_s(&mod->mkobj, module_subsys); |
1068 | mod->mkobj.mod = mod; | 1082 | mod->mkobj.mod = mod; |
1069 | err = kobject_register(&mod->mkobj.kobj); | 1083 | err = kobject_register(&mod->mkobj.kobj); |
1070 | if (err) | 1084 | if (err) |
1071 | goto out; | 1085 | goto out; |
1072 | 1086 | ||
1073 | err = module_param_sysfs_setup(mod, kparam, num_params); | 1087 | err = module_param_sysfs_setup(mod, kparam, num_params); |
1074 | if (err) | 1088 | if (err) |
1075 | goto out_unreg; | 1089 | goto out_unreg; |
1076 | 1090 | ||
1077 | err = module_add_modinfo_attrs(mod); | 1091 | err = module_add_modinfo_attrs(mod); |
1078 | if (err) | 1092 | if (err) |
1079 | goto out_unreg; | 1093 | goto out_unreg; |
1080 | 1094 | ||
1081 | return 0; | 1095 | return 0; |
1082 | 1096 | ||
1083 | out_unreg: | 1097 | out_unreg: |
1084 | kobject_unregister(&mod->mkobj.kobj); | 1098 | kobject_unregister(&mod->mkobj.kobj); |
1085 | out: | 1099 | out: |
1086 | return err; | 1100 | return err; |
1087 | } | 1101 | } |
1088 | 1102 | ||
1089 | static void mod_kobject_remove(struct module *mod) | 1103 | static void mod_kobject_remove(struct module *mod) |
1090 | { | 1104 | { |
1091 | module_remove_modinfo_attrs(mod); | 1105 | module_remove_modinfo_attrs(mod); |
1092 | module_param_sysfs_remove(mod); | 1106 | module_param_sysfs_remove(mod); |
1093 | 1107 | ||
1094 | kobject_unregister(&mod->mkobj.kobj); | 1108 | kobject_unregister(&mod->mkobj.kobj); |
1095 | } | 1109 | } |
1096 | 1110 | ||
1097 | /* | 1111 | /* |
1098 | * unlink the module with the whole machine is stopped with interrupts off | 1112 | * unlink the module with the whole machine is stopped with interrupts off |
1099 | * - this defends against kallsyms not taking locks | 1113 | * - this defends against kallsyms not taking locks |
1100 | */ | 1114 | */ |
1101 | static int __unlink_module(void *_mod) | 1115 | static int __unlink_module(void *_mod) |
1102 | { | 1116 | { |
1103 | struct module *mod = _mod; | 1117 | struct module *mod = _mod; |
1104 | list_del(&mod->list); | 1118 | list_del(&mod->list); |
1105 | return 0; | 1119 | return 0; |
1106 | } | 1120 | } |
1107 | 1121 | ||
1108 | /* Free a module, remove from lists, etc (must hold module mutex). */ | 1122 | /* Free a module, remove from lists, etc (must hold module mutex). */ |
1109 | static void free_module(struct module *mod) | 1123 | static void free_module(struct module *mod) |
1110 | { | 1124 | { |
1111 | /* Delete from various lists */ | 1125 | /* Delete from various lists */ |
1112 | stop_machine_run(__unlink_module, mod, NR_CPUS); | 1126 | stop_machine_run(__unlink_module, mod, NR_CPUS); |
1113 | remove_sect_attrs(mod); | 1127 | remove_sect_attrs(mod); |
1114 | mod_kobject_remove(mod); | 1128 | mod_kobject_remove(mod); |
1115 | 1129 | ||
1116 | unwind_remove_table(mod->unwind_info, 0); | 1130 | unwind_remove_table(mod->unwind_info, 0); |
1117 | 1131 | ||
1118 | /* Arch-specific cleanup. */ | 1132 | /* Arch-specific cleanup. */ |
1119 | module_arch_cleanup(mod); | 1133 | module_arch_cleanup(mod); |
1120 | 1134 | ||
1121 | /* Module unload stuff */ | 1135 | /* Module unload stuff */ |
1122 | module_unload_free(mod); | 1136 | module_unload_free(mod); |
1123 | 1137 | ||
1124 | /* This may be NULL, but that's OK */ | 1138 | /* This may be NULL, but that's OK */ |
1125 | module_free(mod, mod->module_init); | 1139 | module_free(mod, mod->module_init); |
1126 | kfree(mod->args); | 1140 | kfree(mod->args); |
1127 | if (mod->percpu) | 1141 | if (mod->percpu) |
1128 | percpu_modfree(mod->percpu); | 1142 | percpu_modfree(mod->percpu); |
1129 | 1143 | ||
1130 | /* Free lock-classes: */ | 1144 | /* Free lock-classes: */ |
1131 | lockdep_free_key_range(mod->module_core, mod->core_size); | 1145 | lockdep_free_key_range(mod->module_core, mod->core_size); |
1132 | 1146 | ||
1133 | /* Finally, free the core (containing the module structure) */ | 1147 | /* Finally, free the core (containing the module structure) */ |
1134 | module_free(mod, mod->module_core); | 1148 | module_free(mod, mod->module_core); |
1135 | } | 1149 | } |
1136 | 1150 | ||
1137 | void *__symbol_get(const char *symbol) | 1151 | void *__symbol_get(const char *symbol) |
1138 | { | 1152 | { |
1139 | struct module *owner; | 1153 | struct module *owner; |
1140 | unsigned long value, flags; | 1154 | unsigned long value, flags; |
1141 | const unsigned long *crc; | 1155 | const unsigned long *crc; |
1142 | 1156 | ||
1143 | spin_lock_irqsave(&modlist_lock, flags); | 1157 | spin_lock_irqsave(&modlist_lock, flags); |
1144 | value = __find_symbol(symbol, &owner, &crc, 1); | 1158 | value = __find_symbol(symbol, &owner, &crc, 1); |
1145 | if (value && !strong_try_module_get(owner)) | 1159 | if (value && !strong_try_module_get(owner)) |
1146 | value = 0; | 1160 | value = 0; |
1147 | spin_unlock_irqrestore(&modlist_lock, flags); | 1161 | spin_unlock_irqrestore(&modlist_lock, flags); |
1148 | 1162 | ||
1149 | return (void *)value; | 1163 | return (void *)value; |
1150 | } | 1164 | } |
1151 | EXPORT_SYMBOL_GPL(__symbol_get); | 1165 | EXPORT_SYMBOL_GPL(__symbol_get); |
1152 | 1166 | ||
1153 | /* | 1167 | /* |
1154 | * Ensure that an exported symbol [global namespace] does not already exist | 1168 | * Ensure that an exported symbol [global namespace] does not already exist |
1155 | * in the Kernel or in some other modules exported symbol table. | 1169 | * in the Kernel or in some other modules exported symbol table. |
1156 | */ | 1170 | */ |
1157 | static int verify_export_symbols(struct module *mod) | 1171 | static int verify_export_symbols(struct module *mod) |
1158 | { | 1172 | { |
1159 | const char *name = NULL; | 1173 | const char *name = NULL; |
1160 | unsigned long i, ret = 0; | 1174 | unsigned long i, ret = 0; |
1161 | struct module *owner; | 1175 | struct module *owner; |
1162 | const unsigned long *crc; | 1176 | const unsigned long *crc; |
1163 | 1177 | ||
1164 | for (i = 0; i < mod->num_syms; i++) | 1178 | for (i = 0; i < mod->num_syms; i++) |
1165 | if (__find_symbol(mod->syms[i].name, &owner, &crc, 1)) { | 1179 | if (__find_symbol(mod->syms[i].name, &owner, &crc, 1)) { |
1166 | name = mod->syms[i].name; | 1180 | name = mod->syms[i].name; |
1167 | ret = -ENOEXEC; | 1181 | ret = -ENOEXEC; |
1168 | goto dup; | 1182 | goto dup; |
1169 | } | 1183 | } |
1170 | 1184 | ||
1171 | for (i = 0; i < mod->num_gpl_syms; i++) | 1185 | for (i = 0; i < mod->num_gpl_syms; i++) |
1172 | if (__find_symbol(mod->gpl_syms[i].name, &owner, &crc, 1)) { | 1186 | if (__find_symbol(mod->gpl_syms[i].name, &owner, &crc, 1)) { |
1173 | name = mod->gpl_syms[i].name; | 1187 | name = mod->gpl_syms[i].name; |
1174 | ret = -ENOEXEC; | 1188 | ret = -ENOEXEC; |
1175 | goto dup; | 1189 | goto dup; |
1176 | } | 1190 | } |
1177 | 1191 | ||
1178 | dup: | 1192 | dup: |
1179 | if (ret) | 1193 | if (ret) |
1180 | printk(KERN_ERR "%s: exports duplicate symbol %s (owned by %s)\n", | 1194 | printk(KERN_ERR "%s: exports duplicate symbol %s (owned by %s)\n", |
1181 | mod->name, name, module_name(owner)); | 1195 | mod->name, name, module_name(owner)); |
1182 | 1196 | ||
1183 | return ret; | 1197 | return ret; |
1184 | } | 1198 | } |
1185 | 1199 | ||
1186 | /* Change all symbols so that sh_value encodes the pointer directly. */ | 1200 | /* Change all symbols so that sh_value encodes the pointer directly. */ |
1187 | static int simplify_symbols(Elf_Shdr *sechdrs, | 1201 | static int simplify_symbols(Elf_Shdr *sechdrs, |
1188 | unsigned int symindex, | 1202 | unsigned int symindex, |
1189 | const char *strtab, | 1203 | const char *strtab, |
1190 | unsigned int versindex, | 1204 | unsigned int versindex, |
1191 | unsigned int pcpuindex, | 1205 | unsigned int pcpuindex, |
1192 | struct module *mod) | 1206 | struct module *mod) |
1193 | { | 1207 | { |
1194 | Elf_Sym *sym = (void *)sechdrs[symindex].sh_addr; | 1208 | Elf_Sym *sym = (void *)sechdrs[symindex].sh_addr; |
1195 | unsigned long secbase; | 1209 | unsigned long secbase; |
1196 | unsigned int i, n = sechdrs[symindex].sh_size / sizeof(Elf_Sym); | 1210 | unsigned int i, n = sechdrs[symindex].sh_size / sizeof(Elf_Sym); |
1197 | int ret = 0; | 1211 | int ret = 0; |
1198 | 1212 | ||
1199 | for (i = 1; i < n; i++) { | 1213 | for (i = 1; i < n; i++) { |
1200 | switch (sym[i].st_shndx) { | 1214 | switch (sym[i].st_shndx) { |
1201 | case SHN_COMMON: | 1215 | case SHN_COMMON: |
1202 | /* We compiled with -fno-common. These are not | 1216 | /* We compiled with -fno-common. These are not |
1203 | supposed to happen. */ | 1217 | supposed to happen. */ |
1204 | DEBUGP("Common symbol: %s\n", strtab + sym[i].st_name); | 1218 | DEBUGP("Common symbol: %s\n", strtab + sym[i].st_name); |
1205 | printk("%s: please compile with -fno-common\n", | 1219 | printk("%s: please compile with -fno-common\n", |
1206 | mod->name); | 1220 | mod->name); |
1207 | ret = -ENOEXEC; | 1221 | ret = -ENOEXEC; |
1208 | break; | 1222 | break; |
1209 | 1223 | ||
1210 | case SHN_ABS: | 1224 | case SHN_ABS: |
1211 | /* Don't need to do anything */ | 1225 | /* Don't need to do anything */ |
1212 | DEBUGP("Absolute symbol: 0x%08lx\n", | 1226 | DEBUGP("Absolute symbol: 0x%08lx\n", |
1213 | (long)sym[i].st_value); | 1227 | (long)sym[i].st_value); |
1214 | break; | 1228 | break; |
1215 | 1229 | ||
1216 | case SHN_UNDEF: | 1230 | case SHN_UNDEF: |
1217 | sym[i].st_value | 1231 | sym[i].st_value |
1218 | = resolve_symbol(sechdrs, versindex, | 1232 | = resolve_symbol(sechdrs, versindex, |
1219 | strtab + sym[i].st_name, mod); | 1233 | strtab + sym[i].st_name, mod); |
1220 | 1234 | ||
1221 | /* Ok if resolved. */ | 1235 | /* Ok if resolved. */ |
1222 | if (sym[i].st_value != 0) | 1236 | if (sym[i].st_value != 0) |
1223 | break; | 1237 | break; |
1224 | /* Ok if weak. */ | 1238 | /* Ok if weak. */ |
1225 | if (ELF_ST_BIND(sym[i].st_info) == STB_WEAK) | 1239 | if (ELF_ST_BIND(sym[i].st_info) == STB_WEAK) |
1226 | break; | 1240 | break; |
1227 | 1241 | ||
1228 | printk(KERN_WARNING "%s: Unknown symbol %s\n", | 1242 | printk(KERN_WARNING "%s: Unknown symbol %s\n", |
1229 | mod->name, strtab + sym[i].st_name); | 1243 | mod->name, strtab + sym[i].st_name); |
1230 | ret = -ENOENT; | 1244 | ret = -ENOENT; |
1231 | break; | 1245 | break; |
1232 | 1246 | ||
1233 | default: | 1247 | default: |
1234 | /* Divert to percpu allocation if a percpu var. */ | 1248 | /* Divert to percpu allocation if a percpu var. */ |
1235 | if (sym[i].st_shndx == pcpuindex) | 1249 | if (sym[i].st_shndx == pcpuindex) |
1236 | secbase = (unsigned long)mod->percpu; | 1250 | secbase = (unsigned long)mod->percpu; |
1237 | else | 1251 | else |
1238 | secbase = sechdrs[sym[i].st_shndx].sh_addr; | 1252 | secbase = sechdrs[sym[i].st_shndx].sh_addr; |
1239 | sym[i].st_value += secbase; | 1253 | sym[i].st_value += secbase; |
1240 | break; | 1254 | break; |
1241 | } | 1255 | } |
1242 | } | 1256 | } |
1243 | 1257 | ||
1244 | return ret; | 1258 | return ret; |
1245 | } | 1259 | } |
1246 | 1260 | ||
1247 | /* Update size with this section: return offset. */ | 1261 | /* Update size with this section: return offset. */ |
1248 | static long get_offset(unsigned long *size, Elf_Shdr *sechdr) | 1262 | static long get_offset(unsigned long *size, Elf_Shdr *sechdr) |
1249 | { | 1263 | { |
1250 | long ret; | 1264 | long ret; |
1251 | 1265 | ||
1252 | ret = ALIGN(*size, sechdr->sh_addralign ?: 1); | 1266 | ret = ALIGN(*size, sechdr->sh_addralign ?: 1); |
1253 | *size = ret + sechdr->sh_size; | 1267 | *size = ret + sechdr->sh_size; |
1254 | return ret; | 1268 | return ret; |
1255 | } | 1269 | } |
1256 | 1270 | ||
1257 | /* Lay out the SHF_ALLOC sections in a way not dissimilar to how ld | 1271 | /* Lay out the SHF_ALLOC sections in a way not dissimilar to how ld |
1258 | might -- code, read-only data, read-write data, small data. Tally | 1272 | might -- code, read-only data, read-write data, small data. Tally |
1259 | sizes, and place the offsets into sh_entsize fields: high bit means it | 1273 | sizes, and place the offsets into sh_entsize fields: high bit means it |
1260 | belongs in init. */ | 1274 | belongs in init. */ |
1261 | static void layout_sections(struct module *mod, | 1275 | static void layout_sections(struct module *mod, |
1262 | const Elf_Ehdr *hdr, | 1276 | const Elf_Ehdr *hdr, |
1263 | Elf_Shdr *sechdrs, | 1277 | Elf_Shdr *sechdrs, |
1264 | const char *secstrings) | 1278 | const char *secstrings) |
1265 | { | 1279 | { |
1266 | static unsigned long const masks[][2] = { | 1280 | static unsigned long const masks[][2] = { |
1267 | /* NOTE: all executable code must be the first section | 1281 | /* NOTE: all executable code must be the first section |
1268 | * in this array; otherwise modify the text_size | 1282 | * in this array; otherwise modify the text_size |
1269 | * finder in the two loops below */ | 1283 | * finder in the two loops below */ |
1270 | { SHF_EXECINSTR | SHF_ALLOC, ARCH_SHF_SMALL }, | 1284 | { SHF_EXECINSTR | SHF_ALLOC, ARCH_SHF_SMALL }, |
1271 | { SHF_ALLOC, SHF_WRITE | ARCH_SHF_SMALL }, | 1285 | { SHF_ALLOC, SHF_WRITE | ARCH_SHF_SMALL }, |
1272 | { SHF_WRITE | SHF_ALLOC, ARCH_SHF_SMALL }, | 1286 | { SHF_WRITE | SHF_ALLOC, ARCH_SHF_SMALL }, |
1273 | { ARCH_SHF_SMALL | SHF_ALLOC, 0 } | 1287 | { ARCH_SHF_SMALL | SHF_ALLOC, 0 } |
1274 | }; | 1288 | }; |
1275 | unsigned int m, i; | 1289 | unsigned int m, i; |
1276 | 1290 | ||
1277 | for (i = 0; i < hdr->e_shnum; i++) | 1291 | for (i = 0; i < hdr->e_shnum; i++) |
1278 | sechdrs[i].sh_entsize = ~0UL; | 1292 | sechdrs[i].sh_entsize = ~0UL; |
1279 | 1293 | ||
1280 | DEBUGP("Core section allocation order:\n"); | 1294 | DEBUGP("Core section allocation order:\n"); |
1281 | for (m = 0; m < ARRAY_SIZE(masks); ++m) { | 1295 | for (m = 0; m < ARRAY_SIZE(masks); ++m) { |
1282 | for (i = 0; i < hdr->e_shnum; ++i) { | 1296 | for (i = 0; i < hdr->e_shnum; ++i) { |
1283 | Elf_Shdr *s = &sechdrs[i]; | 1297 | Elf_Shdr *s = &sechdrs[i]; |
1284 | 1298 | ||
1285 | if ((s->sh_flags & masks[m][0]) != masks[m][0] | 1299 | if ((s->sh_flags & masks[m][0]) != masks[m][0] |
1286 | || (s->sh_flags & masks[m][1]) | 1300 | || (s->sh_flags & masks[m][1]) |
1287 | || s->sh_entsize != ~0UL | 1301 | || s->sh_entsize != ~0UL |
1288 | || strncmp(secstrings + s->sh_name, | 1302 | || strncmp(secstrings + s->sh_name, |
1289 | ".init", 5) == 0) | 1303 | ".init", 5) == 0) |
1290 | continue; | 1304 | continue; |
1291 | s->sh_entsize = get_offset(&mod->core_size, s); | 1305 | s->sh_entsize = get_offset(&mod->core_size, s); |
1292 | DEBUGP("\t%s\n", secstrings + s->sh_name); | 1306 | DEBUGP("\t%s\n", secstrings + s->sh_name); |
1293 | } | 1307 | } |
1294 | if (m == 0) | 1308 | if (m == 0) |
1295 | mod->core_text_size = mod->core_size; | 1309 | mod->core_text_size = mod->core_size; |
1296 | } | 1310 | } |
1297 | 1311 | ||
1298 | DEBUGP("Init section allocation order:\n"); | 1312 | DEBUGP("Init section allocation order:\n"); |
1299 | for (m = 0; m < ARRAY_SIZE(masks); ++m) { | 1313 | for (m = 0; m < ARRAY_SIZE(masks); ++m) { |
1300 | for (i = 0; i < hdr->e_shnum; ++i) { | 1314 | for (i = 0; i < hdr->e_shnum; ++i) { |
1301 | Elf_Shdr *s = &sechdrs[i]; | 1315 | Elf_Shdr *s = &sechdrs[i]; |
1302 | 1316 | ||
1303 | if ((s->sh_flags & masks[m][0]) != masks[m][0] | 1317 | if ((s->sh_flags & masks[m][0]) != masks[m][0] |
1304 | || (s->sh_flags & masks[m][1]) | 1318 | || (s->sh_flags & masks[m][1]) |
1305 | || s->sh_entsize != ~0UL | 1319 | || s->sh_entsize != ~0UL |
1306 | || strncmp(secstrings + s->sh_name, | 1320 | || strncmp(secstrings + s->sh_name, |
1307 | ".init", 5) != 0) | 1321 | ".init", 5) != 0) |
1308 | continue; | 1322 | continue; |
1309 | s->sh_entsize = (get_offset(&mod->init_size, s) | 1323 | s->sh_entsize = (get_offset(&mod->init_size, s) |
1310 | | INIT_OFFSET_MASK); | 1324 | | INIT_OFFSET_MASK); |
1311 | DEBUGP("\t%s\n", secstrings + s->sh_name); | 1325 | DEBUGP("\t%s\n", secstrings + s->sh_name); |
1312 | } | 1326 | } |
1313 | if (m == 0) | 1327 | if (m == 0) |
1314 | mod->init_text_size = mod->init_size; | 1328 | mod->init_text_size = mod->init_size; |
1315 | } | 1329 | } |
1316 | } | 1330 | } |
1317 | 1331 | ||
1318 | static void set_license(struct module *mod, const char *license) | 1332 | static void set_license(struct module *mod, const char *license) |
1319 | { | 1333 | { |
1320 | if (!license) | 1334 | if (!license) |
1321 | license = "unspecified"; | 1335 | license = "unspecified"; |
1322 | 1336 | ||
1323 | mod->license_gplok = license_is_gpl_compatible(license); | 1337 | mod->license_gplok = license_is_gpl_compatible(license); |
1324 | if (!mod->license_gplok && !(tainted & TAINT_PROPRIETARY_MODULE)) { | 1338 | if (!mod->license_gplok && !(tainted & TAINT_PROPRIETARY_MODULE)) { |
1325 | printk(KERN_WARNING "%s: module license '%s' taints kernel.\n", | 1339 | printk(KERN_WARNING "%s: module license '%s' taints kernel.\n", |
1326 | mod->name, license); | 1340 | mod->name, license); |
1327 | add_taint(TAINT_PROPRIETARY_MODULE); | 1341 | add_taint(TAINT_PROPRIETARY_MODULE); |
1328 | } | 1342 | } |
1329 | } | 1343 | } |
1330 | 1344 | ||
1331 | /* Parse tag=value strings from .modinfo section */ | 1345 | /* Parse tag=value strings from .modinfo section */ |
1332 | static char *next_string(char *string, unsigned long *secsize) | 1346 | static char *next_string(char *string, unsigned long *secsize) |
1333 | { | 1347 | { |
1334 | /* Skip non-zero chars */ | 1348 | /* Skip non-zero chars */ |
1335 | while (string[0]) { | 1349 | while (string[0]) { |
1336 | string++; | 1350 | string++; |
1337 | if ((*secsize)-- <= 1) | 1351 | if ((*secsize)-- <= 1) |
1338 | return NULL; | 1352 | return NULL; |
1339 | } | 1353 | } |
1340 | 1354 | ||
1341 | /* Skip any zero padding. */ | 1355 | /* Skip any zero padding. */ |
1342 | while (!string[0]) { | 1356 | while (!string[0]) { |
1343 | string++; | 1357 | string++; |
1344 | if ((*secsize)-- <= 1) | 1358 | if ((*secsize)-- <= 1) |
1345 | return NULL; | 1359 | return NULL; |
1346 | } | 1360 | } |
1347 | return string; | 1361 | return string; |
1348 | } | 1362 | } |
1349 | 1363 | ||
1350 | static char *get_modinfo(Elf_Shdr *sechdrs, | 1364 | static char *get_modinfo(Elf_Shdr *sechdrs, |
1351 | unsigned int info, | 1365 | unsigned int info, |
1352 | const char *tag) | 1366 | const char *tag) |
1353 | { | 1367 | { |
1354 | char *p; | 1368 | char *p; |
1355 | unsigned int taglen = strlen(tag); | 1369 | unsigned int taglen = strlen(tag); |
1356 | unsigned long size = sechdrs[info].sh_size; | 1370 | unsigned long size = sechdrs[info].sh_size; |
1357 | 1371 | ||
1358 | for (p = (char *)sechdrs[info].sh_addr; p; p = next_string(p, &size)) { | 1372 | for (p = (char *)sechdrs[info].sh_addr; p; p = next_string(p, &size)) { |
1359 | if (strncmp(p, tag, taglen) == 0 && p[taglen] == '=') | 1373 | if (strncmp(p, tag, taglen) == 0 && p[taglen] == '=') |
1360 | return p + taglen + 1; | 1374 | return p + taglen + 1; |
1361 | } | 1375 | } |
1362 | return NULL; | 1376 | return NULL; |
1363 | } | 1377 | } |
1364 | 1378 | ||
1365 | static void setup_modinfo(struct module *mod, Elf_Shdr *sechdrs, | 1379 | static void setup_modinfo(struct module *mod, Elf_Shdr *sechdrs, |
1366 | unsigned int infoindex) | 1380 | unsigned int infoindex) |
1367 | { | 1381 | { |
1368 | struct module_attribute *attr; | 1382 | struct module_attribute *attr; |
1369 | int i; | 1383 | int i; |
1370 | 1384 | ||
1371 | for (i = 0; (attr = modinfo_attrs[i]); i++) { | 1385 | for (i = 0; (attr = modinfo_attrs[i]); i++) { |
1372 | if (attr->setup) | 1386 | if (attr->setup) |
1373 | attr->setup(mod, | 1387 | attr->setup(mod, |
1374 | get_modinfo(sechdrs, | 1388 | get_modinfo(sechdrs, |
1375 | infoindex, | 1389 | infoindex, |
1376 | attr->attr.name)); | 1390 | attr->attr.name)); |
1377 | } | 1391 | } |
1378 | } | 1392 | } |
1379 | 1393 | ||
1380 | #ifdef CONFIG_KALLSYMS | 1394 | #ifdef CONFIG_KALLSYMS |
1381 | int is_exported(const char *name, const struct module *mod) | 1395 | int is_exported(const char *name, const struct module *mod) |
1382 | { | 1396 | { |
1383 | if (!mod && lookup_symbol(name, __start___ksymtab, __stop___ksymtab)) | 1397 | if (!mod && lookup_symbol(name, __start___ksymtab, __stop___ksymtab)) |
1384 | return 1; | 1398 | return 1; |
1385 | else | 1399 | else |
1386 | if (mod && lookup_symbol(name, mod->syms, mod->syms + mod->num_syms)) | 1400 | if (mod && lookup_symbol(name, mod->syms, mod->syms + mod->num_syms)) |
1387 | return 1; | 1401 | return 1; |
1388 | else | 1402 | else |
1389 | return 0; | 1403 | return 0; |
1390 | } | 1404 | } |
1391 | 1405 | ||
1392 | /* As per nm */ | 1406 | /* As per nm */ |
1393 | static char elf_type(const Elf_Sym *sym, | 1407 | static char elf_type(const Elf_Sym *sym, |
1394 | Elf_Shdr *sechdrs, | 1408 | Elf_Shdr *sechdrs, |
1395 | const char *secstrings, | 1409 | const char *secstrings, |
1396 | struct module *mod) | 1410 | struct module *mod) |
1397 | { | 1411 | { |
1398 | if (ELF_ST_BIND(sym->st_info) == STB_WEAK) { | 1412 | if (ELF_ST_BIND(sym->st_info) == STB_WEAK) { |
1399 | if (ELF_ST_TYPE(sym->st_info) == STT_OBJECT) | 1413 | if (ELF_ST_TYPE(sym->st_info) == STT_OBJECT) |
1400 | return 'v'; | 1414 | return 'v'; |
1401 | else | 1415 | else |
1402 | return 'w'; | 1416 | return 'w'; |
1403 | } | 1417 | } |
1404 | if (sym->st_shndx == SHN_UNDEF) | 1418 | if (sym->st_shndx == SHN_UNDEF) |
1405 | return 'U'; | 1419 | return 'U'; |
1406 | if (sym->st_shndx == SHN_ABS) | 1420 | if (sym->st_shndx == SHN_ABS) |
1407 | return 'a'; | 1421 | return 'a'; |
1408 | if (sym->st_shndx >= SHN_LORESERVE) | 1422 | if (sym->st_shndx >= SHN_LORESERVE) |
1409 | return '?'; | 1423 | return '?'; |
1410 | if (sechdrs[sym->st_shndx].sh_flags & SHF_EXECINSTR) | 1424 | if (sechdrs[sym->st_shndx].sh_flags & SHF_EXECINSTR) |
1411 | return 't'; | 1425 | return 't'; |
1412 | if (sechdrs[sym->st_shndx].sh_flags & SHF_ALLOC | 1426 | if (sechdrs[sym->st_shndx].sh_flags & SHF_ALLOC |
1413 | && sechdrs[sym->st_shndx].sh_type != SHT_NOBITS) { | 1427 | && sechdrs[sym->st_shndx].sh_type != SHT_NOBITS) { |
1414 | if (!(sechdrs[sym->st_shndx].sh_flags & SHF_WRITE)) | 1428 | if (!(sechdrs[sym->st_shndx].sh_flags & SHF_WRITE)) |
1415 | return 'r'; | 1429 | return 'r'; |
1416 | else if (sechdrs[sym->st_shndx].sh_flags & ARCH_SHF_SMALL) | 1430 | else if (sechdrs[sym->st_shndx].sh_flags & ARCH_SHF_SMALL) |
1417 | return 'g'; | 1431 | return 'g'; |
1418 | else | 1432 | else |
1419 | return 'd'; | 1433 | return 'd'; |
1420 | } | 1434 | } |
1421 | if (sechdrs[sym->st_shndx].sh_type == SHT_NOBITS) { | 1435 | if (sechdrs[sym->st_shndx].sh_type == SHT_NOBITS) { |
1422 | if (sechdrs[sym->st_shndx].sh_flags & ARCH_SHF_SMALL) | 1436 | if (sechdrs[sym->st_shndx].sh_flags & ARCH_SHF_SMALL) |
1423 | return 's'; | 1437 | return 's'; |
1424 | else | 1438 | else |
1425 | return 'b'; | 1439 | return 'b'; |
1426 | } | 1440 | } |
1427 | if (strncmp(secstrings + sechdrs[sym->st_shndx].sh_name, | 1441 | if (strncmp(secstrings + sechdrs[sym->st_shndx].sh_name, |
1428 | ".debug", strlen(".debug")) == 0) | 1442 | ".debug", strlen(".debug")) == 0) |
1429 | return 'n'; | 1443 | return 'n'; |
1430 | return '?'; | 1444 | return '?'; |
1431 | } | 1445 | } |
1432 | 1446 | ||
1433 | static void add_kallsyms(struct module *mod, | 1447 | static void add_kallsyms(struct module *mod, |
1434 | Elf_Shdr *sechdrs, | 1448 | Elf_Shdr *sechdrs, |
1435 | unsigned int symindex, | 1449 | unsigned int symindex, |
1436 | unsigned int strindex, | 1450 | unsigned int strindex, |
1437 | const char *secstrings) | 1451 | const char *secstrings) |
1438 | { | 1452 | { |
1439 | unsigned int i; | 1453 | unsigned int i; |
1440 | 1454 | ||
1441 | mod->symtab = (void *)sechdrs[symindex].sh_addr; | 1455 | mod->symtab = (void *)sechdrs[symindex].sh_addr; |
1442 | mod->num_symtab = sechdrs[symindex].sh_size / sizeof(Elf_Sym); | 1456 | mod->num_symtab = sechdrs[symindex].sh_size / sizeof(Elf_Sym); |
1443 | mod->strtab = (void *)sechdrs[strindex].sh_addr; | 1457 | mod->strtab = (void *)sechdrs[strindex].sh_addr; |
1444 | 1458 | ||
1445 | /* Set types up while we still have access to sections. */ | 1459 | /* Set types up while we still have access to sections. */ |
1446 | for (i = 0; i < mod->num_symtab; i++) | 1460 | for (i = 0; i < mod->num_symtab; i++) |
1447 | mod->symtab[i].st_info | 1461 | mod->symtab[i].st_info |
1448 | = elf_type(&mod->symtab[i], sechdrs, secstrings, mod); | 1462 | = elf_type(&mod->symtab[i], sechdrs, secstrings, mod); |
1449 | } | 1463 | } |
1450 | #else | 1464 | #else |
1451 | static inline void add_kallsyms(struct module *mod, | 1465 | static inline void add_kallsyms(struct module *mod, |
1452 | Elf_Shdr *sechdrs, | 1466 | Elf_Shdr *sechdrs, |
1453 | unsigned int symindex, | 1467 | unsigned int symindex, |
1454 | unsigned int strindex, | 1468 | unsigned int strindex, |
1455 | const char *secstrings) | 1469 | const char *secstrings) |
1456 | { | 1470 | { |
1457 | } | 1471 | } |
1458 | #endif /* CONFIG_KALLSYMS */ | 1472 | #endif /* CONFIG_KALLSYMS */ |
1459 | 1473 | ||
1460 | /* Allocate and load the module: note that size of section 0 is always | 1474 | /* Allocate and load the module: note that size of section 0 is always |
1461 | zero, and we rely on this for optional sections. */ | 1475 | zero, and we rely on this for optional sections. */ |
1462 | static struct module *load_module(void __user *umod, | 1476 | static struct module *load_module(void __user *umod, |
1463 | unsigned long len, | 1477 | unsigned long len, |
1464 | const char __user *uargs) | 1478 | const char __user *uargs) |
1465 | { | 1479 | { |
1466 | Elf_Ehdr *hdr; | 1480 | Elf_Ehdr *hdr; |
1467 | Elf_Shdr *sechdrs; | 1481 | Elf_Shdr *sechdrs; |
1468 | char *secstrings, *args, *modmagic, *strtab = NULL; | 1482 | char *secstrings, *args, *modmagic, *strtab = NULL; |
1469 | unsigned int i; | 1483 | unsigned int i; |
1470 | unsigned int symindex = 0; | 1484 | unsigned int symindex = 0; |
1471 | unsigned int strindex = 0; | 1485 | unsigned int strindex = 0; |
1472 | unsigned int setupindex; | 1486 | unsigned int setupindex; |
1473 | unsigned int exindex; | 1487 | unsigned int exindex; |
1474 | unsigned int exportindex; | 1488 | unsigned int exportindex; |
1475 | unsigned int modindex; | 1489 | unsigned int modindex; |
1476 | unsigned int obsparmindex; | 1490 | unsigned int obsparmindex; |
1477 | unsigned int infoindex; | 1491 | unsigned int infoindex; |
1478 | unsigned int gplindex; | 1492 | unsigned int gplindex; |
1479 | unsigned int crcindex; | 1493 | unsigned int crcindex; |
1480 | unsigned int gplcrcindex; | 1494 | unsigned int gplcrcindex; |
1481 | unsigned int versindex; | 1495 | unsigned int versindex; |
1482 | unsigned int pcpuindex; | 1496 | unsigned int pcpuindex; |
1483 | unsigned int gplfutureindex; | 1497 | unsigned int gplfutureindex; |
1484 | unsigned int gplfuturecrcindex; | 1498 | unsigned int gplfuturecrcindex; |
1485 | unsigned int unwindex = 0; | 1499 | unsigned int unwindex = 0; |
1486 | unsigned int unusedindex; | 1500 | unsigned int unusedindex; |
1487 | unsigned int unusedcrcindex; | 1501 | unsigned int unusedcrcindex; |
1488 | unsigned int unusedgplindex; | 1502 | unsigned int unusedgplindex; |
1489 | unsigned int unusedgplcrcindex; | 1503 | unsigned int unusedgplcrcindex; |
1490 | struct module *mod; | 1504 | struct module *mod; |
1491 | long err = 0; | 1505 | long err = 0; |
1492 | void *percpu = NULL, *ptr = NULL; /* Stops spurious gcc warning */ | 1506 | void *percpu = NULL, *ptr = NULL; /* Stops spurious gcc warning */ |
1493 | struct exception_table_entry *extable; | 1507 | struct exception_table_entry *extable; |
1494 | mm_segment_t old_fs; | 1508 | mm_segment_t old_fs; |
1495 | 1509 | ||
1496 | DEBUGP("load_module: umod=%p, len=%lu, uargs=%p\n", | 1510 | DEBUGP("load_module: umod=%p, len=%lu, uargs=%p\n", |
1497 | umod, len, uargs); | 1511 | umod, len, uargs); |
1498 | if (len < sizeof(*hdr)) | 1512 | if (len < sizeof(*hdr)) |
1499 | return ERR_PTR(-ENOEXEC); | 1513 | return ERR_PTR(-ENOEXEC); |
1500 | 1514 | ||
1501 | /* Suck in entire file: we'll want most of it. */ | 1515 | /* Suck in entire file: we'll want most of it. */ |
1502 | /* vmalloc barfs on "unusual" numbers. Check here */ | 1516 | /* vmalloc barfs on "unusual" numbers. Check here */ |
1503 | if (len > 64 * 1024 * 1024 || (hdr = vmalloc(len)) == NULL) | 1517 | if (len > 64 * 1024 * 1024 || (hdr = vmalloc(len)) == NULL) |
1504 | return ERR_PTR(-ENOMEM); | 1518 | return ERR_PTR(-ENOMEM); |
1505 | if (copy_from_user(hdr, umod, len) != 0) { | 1519 | if (copy_from_user(hdr, umod, len) != 0) { |
1506 | err = -EFAULT; | 1520 | err = -EFAULT; |
1507 | goto free_hdr; | 1521 | goto free_hdr; |
1508 | } | 1522 | } |
1509 | 1523 | ||
1510 | /* Sanity checks against insmoding binaries or wrong arch, | 1524 | /* Sanity checks against insmoding binaries or wrong arch, |
1511 | weird elf version */ | 1525 | weird elf version */ |
1512 | if (memcmp(hdr->e_ident, ELFMAG, 4) != 0 | 1526 | if (memcmp(hdr->e_ident, ELFMAG, 4) != 0 |
1513 | || hdr->e_type != ET_REL | 1527 | || hdr->e_type != ET_REL |
1514 | || !elf_check_arch(hdr) | 1528 | || !elf_check_arch(hdr) |
1515 | || hdr->e_shentsize != sizeof(*sechdrs)) { | 1529 | || hdr->e_shentsize != sizeof(*sechdrs)) { |
1516 | err = -ENOEXEC; | 1530 | err = -ENOEXEC; |
1517 | goto free_hdr; | 1531 | goto free_hdr; |
1518 | } | 1532 | } |
1519 | 1533 | ||
1520 | if (len < hdr->e_shoff + hdr->e_shnum * sizeof(Elf_Shdr)) | 1534 | if (len < hdr->e_shoff + hdr->e_shnum * sizeof(Elf_Shdr)) |
1521 | goto truncated; | 1535 | goto truncated; |
1522 | 1536 | ||
1523 | /* Convenience variables */ | 1537 | /* Convenience variables */ |
1524 | sechdrs = (void *)hdr + hdr->e_shoff; | 1538 | sechdrs = (void *)hdr + hdr->e_shoff; |
1525 | secstrings = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; | 1539 | secstrings = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; |
1526 | sechdrs[0].sh_addr = 0; | 1540 | sechdrs[0].sh_addr = 0; |
1527 | 1541 | ||
1528 | for (i = 1; i < hdr->e_shnum; i++) { | 1542 | for (i = 1; i < hdr->e_shnum; i++) { |
1529 | if (sechdrs[i].sh_type != SHT_NOBITS | 1543 | if (sechdrs[i].sh_type != SHT_NOBITS |
1530 | && len < sechdrs[i].sh_offset + sechdrs[i].sh_size) | 1544 | && len < sechdrs[i].sh_offset + sechdrs[i].sh_size) |
1531 | goto truncated; | 1545 | goto truncated; |
1532 | 1546 | ||
1533 | /* Mark all sections sh_addr with their address in the | 1547 | /* Mark all sections sh_addr with their address in the |
1534 | temporary image. */ | 1548 | temporary image. */ |
1535 | sechdrs[i].sh_addr = (size_t)hdr + sechdrs[i].sh_offset; | 1549 | sechdrs[i].sh_addr = (size_t)hdr + sechdrs[i].sh_offset; |
1536 | 1550 | ||
1537 | /* Internal symbols and strings. */ | 1551 | /* Internal symbols and strings. */ |
1538 | if (sechdrs[i].sh_type == SHT_SYMTAB) { | 1552 | if (sechdrs[i].sh_type == SHT_SYMTAB) { |
1539 | symindex = i; | 1553 | symindex = i; |
1540 | strindex = sechdrs[i].sh_link; | 1554 | strindex = sechdrs[i].sh_link; |
1541 | strtab = (char *)hdr + sechdrs[strindex].sh_offset; | 1555 | strtab = (char *)hdr + sechdrs[strindex].sh_offset; |
1542 | } | 1556 | } |
1543 | #ifndef CONFIG_MODULE_UNLOAD | 1557 | #ifndef CONFIG_MODULE_UNLOAD |
1544 | /* Don't load .exit sections */ | 1558 | /* Don't load .exit sections */ |
1545 | if (strncmp(secstrings+sechdrs[i].sh_name, ".exit", 5) == 0) | 1559 | if (strncmp(secstrings+sechdrs[i].sh_name, ".exit", 5) == 0) |
1546 | sechdrs[i].sh_flags &= ~(unsigned long)SHF_ALLOC; | 1560 | sechdrs[i].sh_flags &= ~(unsigned long)SHF_ALLOC; |
1547 | #endif | 1561 | #endif |
1548 | } | 1562 | } |
1549 | 1563 | ||
1550 | modindex = find_sec(hdr, sechdrs, secstrings, | 1564 | modindex = find_sec(hdr, sechdrs, secstrings, |
1551 | ".gnu.linkonce.this_module"); | 1565 | ".gnu.linkonce.this_module"); |
1552 | if (!modindex) { | 1566 | if (!modindex) { |
1553 | printk(KERN_WARNING "No module found in object\n"); | 1567 | printk(KERN_WARNING "No module found in object\n"); |
1554 | err = -ENOEXEC; | 1568 | err = -ENOEXEC; |
1555 | goto free_hdr; | 1569 | goto free_hdr; |
1556 | } | 1570 | } |
1557 | mod = (void *)sechdrs[modindex].sh_addr; | 1571 | mod = (void *)sechdrs[modindex].sh_addr; |
1558 | 1572 | ||
1559 | if (symindex == 0) { | 1573 | if (symindex == 0) { |
1560 | printk(KERN_WARNING "%s: module has no symbols (stripped?)\n", | 1574 | printk(KERN_WARNING "%s: module has no symbols (stripped?)\n", |
1561 | mod->name); | 1575 | mod->name); |
1562 | err = -ENOEXEC; | 1576 | err = -ENOEXEC; |
1563 | goto free_hdr; | 1577 | goto free_hdr; |
1564 | } | 1578 | } |
1565 | 1579 | ||
1566 | /* Optional sections */ | 1580 | /* Optional sections */ |
1567 | exportindex = find_sec(hdr, sechdrs, secstrings, "__ksymtab"); | 1581 | exportindex = find_sec(hdr, sechdrs, secstrings, "__ksymtab"); |
1568 | gplindex = find_sec(hdr, sechdrs, secstrings, "__ksymtab_gpl"); | 1582 | gplindex = find_sec(hdr, sechdrs, secstrings, "__ksymtab_gpl"); |
1569 | gplfutureindex = find_sec(hdr, sechdrs, secstrings, "__ksymtab_gpl_future"); | 1583 | gplfutureindex = find_sec(hdr, sechdrs, secstrings, "__ksymtab_gpl_future"); |
1570 | unusedindex = find_sec(hdr, sechdrs, secstrings, "__ksymtab_unused"); | 1584 | unusedindex = find_sec(hdr, sechdrs, secstrings, "__ksymtab_unused"); |
1571 | unusedgplindex = find_sec(hdr, sechdrs, secstrings, "__ksymtab_unused_gpl"); | 1585 | unusedgplindex = find_sec(hdr, sechdrs, secstrings, "__ksymtab_unused_gpl"); |
1572 | crcindex = find_sec(hdr, sechdrs, secstrings, "__kcrctab"); | 1586 | crcindex = find_sec(hdr, sechdrs, secstrings, "__kcrctab"); |
1573 | gplcrcindex = find_sec(hdr, sechdrs, secstrings, "__kcrctab_gpl"); | 1587 | gplcrcindex = find_sec(hdr, sechdrs, secstrings, "__kcrctab_gpl"); |
1574 | gplfuturecrcindex = find_sec(hdr, sechdrs, secstrings, "__kcrctab_gpl_future"); | 1588 | gplfuturecrcindex = find_sec(hdr, sechdrs, secstrings, "__kcrctab_gpl_future"); |
1575 | unusedcrcindex = find_sec(hdr, sechdrs, secstrings, "__kcrctab_unused"); | 1589 | unusedcrcindex = find_sec(hdr, sechdrs, secstrings, "__kcrctab_unused"); |
1576 | unusedgplcrcindex = find_sec(hdr, sechdrs, secstrings, "__kcrctab_unused_gpl"); | 1590 | unusedgplcrcindex = find_sec(hdr, sechdrs, secstrings, "__kcrctab_unused_gpl"); |
1577 | setupindex = find_sec(hdr, sechdrs, secstrings, "__param"); | 1591 | setupindex = find_sec(hdr, sechdrs, secstrings, "__param"); |
1578 | exindex = find_sec(hdr, sechdrs, secstrings, "__ex_table"); | 1592 | exindex = find_sec(hdr, sechdrs, secstrings, "__ex_table"); |
1579 | obsparmindex = find_sec(hdr, sechdrs, secstrings, "__obsparm"); | 1593 | obsparmindex = find_sec(hdr, sechdrs, secstrings, "__obsparm"); |
1580 | versindex = find_sec(hdr, sechdrs, secstrings, "__versions"); | 1594 | versindex = find_sec(hdr, sechdrs, secstrings, "__versions"); |
1581 | infoindex = find_sec(hdr, sechdrs, secstrings, ".modinfo"); | 1595 | infoindex = find_sec(hdr, sechdrs, secstrings, ".modinfo"); |
1582 | pcpuindex = find_pcpusec(hdr, sechdrs, secstrings); | 1596 | pcpuindex = find_pcpusec(hdr, sechdrs, secstrings); |
1583 | #ifdef ARCH_UNWIND_SECTION_NAME | 1597 | #ifdef ARCH_UNWIND_SECTION_NAME |
1584 | unwindex = find_sec(hdr, sechdrs, secstrings, ARCH_UNWIND_SECTION_NAME); | 1598 | unwindex = find_sec(hdr, sechdrs, secstrings, ARCH_UNWIND_SECTION_NAME); |
1585 | #endif | 1599 | #endif |
1586 | 1600 | ||
1587 | /* Don't keep modinfo section */ | 1601 | /* Don't keep modinfo section */ |
1588 | sechdrs[infoindex].sh_flags &= ~(unsigned long)SHF_ALLOC; | 1602 | sechdrs[infoindex].sh_flags &= ~(unsigned long)SHF_ALLOC; |
1589 | #ifdef CONFIG_KALLSYMS | 1603 | #ifdef CONFIG_KALLSYMS |
1590 | /* Keep symbol and string tables for decoding later. */ | 1604 | /* Keep symbol and string tables for decoding later. */ |
1591 | sechdrs[symindex].sh_flags |= SHF_ALLOC; | 1605 | sechdrs[symindex].sh_flags |= SHF_ALLOC; |
1592 | sechdrs[strindex].sh_flags |= SHF_ALLOC; | 1606 | sechdrs[strindex].sh_flags |= SHF_ALLOC; |
1593 | #endif | 1607 | #endif |
1594 | if (unwindex) | 1608 | if (unwindex) |
1595 | sechdrs[unwindex].sh_flags |= SHF_ALLOC; | 1609 | sechdrs[unwindex].sh_flags |= SHF_ALLOC; |
1596 | 1610 | ||
1597 | /* Check module struct version now, before we try to use module. */ | 1611 | /* Check module struct version now, before we try to use module. */ |
1598 | if (!check_modstruct_version(sechdrs, versindex, mod)) { | 1612 | if (!check_modstruct_version(sechdrs, versindex, mod)) { |
1599 | err = -ENOEXEC; | 1613 | err = -ENOEXEC; |
1600 | goto free_hdr; | 1614 | goto free_hdr; |
1601 | } | 1615 | } |
1602 | 1616 | ||
1603 | modmagic = get_modinfo(sechdrs, infoindex, "vermagic"); | 1617 | modmagic = get_modinfo(sechdrs, infoindex, "vermagic"); |
1604 | /* This is allowed: modprobe --force will invalidate it. */ | 1618 | /* This is allowed: modprobe --force will invalidate it. */ |
1605 | if (!modmagic) { | 1619 | if (!modmagic) { |
1606 | add_taint(TAINT_FORCED_MODULE); | 1620 | add_taint(TAINT_FORCED_MODULE); |
1607 | printk(KERN_WARNING "%s: no version magic, tainting kernel.\n", | 1621 | printk(KERN_WARNING "%s: no version magic, tainting kernel.\n", |
1608 | mod->name); | 1622 | mod->name); |
1609 | } else if (!same_magic(modmagic, vermagic)) { | 1623 | } else if (!same_magic(modmagic, vermagic)) { |
1610 | printk(KERN_ERR "%s: version magic '%s' should be '%s'\n", | 1624 | printk(KERN_ERR "%s: version magic '%s' should be '%s'\n", |
1611 | mod->name, modmagic, vermagic); | 1625 | mod->name, modmagic, vermagic); |
1612 | err = -ENOEXEC; | 1626 | err = -ENOEXEC; |
1613 | goto free_hdr; | 1627 | goto free_hdr; |
1614 | } | 1628 | } |
1615 | 1629 | ||
1616 | /* Now copy in args */ | 1630 | /* Now copy in args */ |
1617 | args = strndup_user(uargs, ~0UL >> 1); | 1631 | args = strndup_user(uargs, ~0UL >> 1); |
1618 | if (IS_ERR(args)) { | 1632 | if (IS_ERR(args)) { |
1619 | err = PTR_ERR(args); | 1633 | err = PTR_ERR(args); |
1620 | goto free_hdr; | 1634 | goto free_hdr; |
1621 | } | 1635 | } |
1622 | 1636 | ||
1623 | if (find_module(mod->name)) { | 1637 | if (find_module(mod->name)) { |
1624 | err = -EEXIST; | 1638 | err = -EEXIST; |
1625 | goto free_mod; | 1639 | goto free_mod; |
1626 | } | 1640 | } |
1627 | 1641 | ||
1628 | mod->state = MODULE_STATE_COMING; | 1642 | mod->state = MODULE_STATE_COMING; |
1629 | 1643 | ||
1630 | /* Allow arches to frob section contents and sizes. */ | 1644 | /* Allow arches to frob section contents and sizes. */ |
1631 | err = module_frob_arch_sections(hdr, sechdrs, secstrings, mod); | 1645 | err = module_frob_arch_sections(hdr, sechdrs, secstrings, mod); |
1632 | if (err < 0) | 1646 | if (err < 0) |
1633 | goto free_mod; | 1647 | goto free_mod; |
1634 | 1648 | ||
1635 | if (pcpuindex) { | 1649 | if (pcpuindex) { |
1636 | /* We have a special allocation for this section. */ | 1650 | /* We have a special allocation for this section. */ |
1637 | percpu = percpu_modalloc(sechdrs[pcpuindex].sh_size, | 1651 | percpu = percpu_modalloc(sechdrs[pcpuindex].sh_size, |
1638 | sechdrs[pcpuindex].sh_addralign, | 1652 | sechdrs[pcpuindex].sh_addralign, |
1639 | mod->name); | 1653 | mod->name); |
1640 | if (!percpu) { | 1654 | if (!percpu) { |
1641 | err = -ENOMEM; | 1655 | err = -ENOMEM; |
1642 | goto free_mod; | 1656 | goto free_mod; |
1643 | } | 1657 | } |
1644 | sechdrs[pcpuindex].sh_flags &= ~(unsigned long)SHF_ALLOC; | 1658 | sechdrs[pcpuindex].sh_flags &= ~(unsigned long)SHF_ALLOC; |
1645 | mod->percpu = percpu; | 1659 | mod->percpu = percpu; |
1646 | } | 1660 | } |
1647 | 1661 | ||
1648 | /* Determine total sizes, and put offsets in sh_entsize. For now | 1662 | /* Determine total sizes, and put offsets in sh_entsize. For now |
1649 | this is done generically; there doesn't appear to be any | 1663 | this is done generically; there doesn't appear to be any |
1650 | special cases for the architectures. */ | 1664 | special cases for the architectures. */ |
1651 | layout_sections(mod, hdr, sechdrs, secstrings); | 1665 | layout_sections(mod, hdr, sechdrs, secstrings); |
1652 | 1666 | ||
1653 | /* Do the allocs. */ | 1667 | /* Do the allocs. */ |
1654 | ptr = module_alloc(mod->core_size); | 1668 | ptr = module_alloc(mod->core_size); |
1655 | if (!ptr) { | 1669 | if (!ptr) { |
1656 | err = -ENOMEM; | 1670 | err = -ENOMEM; |
1657 | goto free_percpu; | 1671 | goto free_percpu; |
1658 | } | 1672 | } |
1659 | memset(ptr, 0, mod->core_size); | 1673 | memset(ptr, 0, mod->core_size); |
1660 | mod->module_core = ptr; | 1674 | mod->module_core = ptr; |
1661 | 1675 | ||
1662 | ptr = module_alloc(mod->init_size); | 1676 | ptr = module_alloc(mod->init_size); |
1663 | if (!ptr && mod->init_size) { | 1677 | if (!ptr && mod->init_size) { |
1664 | err = -ENOMEM; | 1678 | err = -ENOMEM; |
1665 | goto free_core; | 1679 | goto free_core; |
1666 | } | 1680 | } |
1667 | memset(ptr, 0, mod->init_size); | 1681 | memset(ptr, 0, mod->init_size); |
1668 | mod->module_init = ptr; | 1682 | mod->module_init = ptr; |
1669 | 1683 | ||
1670 | /* Transfer each section which specifies SHF_ALLOC */ | 1684 | /* Transfer each section which specifies SHF_ALLOC */ |
1671 | DEBUGP("final section addresses:\n"); | 1685 | DEBUGP("final section addresses:\n"); |
1672 | for (i = 0; i < hdr->e_shnum; i++) { | 1686 | for (i = 0; i < hdr->e_shnum; i++) { |
1673 | void *dest; | 1687 | void *dest; |
1674 | 1688 | ||
1675 | if (!(sechdrs[i].sh_flags & SHF_ALLOC)) | 1689 | if (!(sechdrs[i].sh_flags & SHF_ALLOC)) |
1676 | continue; | 1690 | continue; |
1677 | 1691 | ||
1678 | if (sechdrs[i].sh_entsize & INIT_OFFSET_MASK) | 1692 | if (sechdrs[i].sh_entsize & INIT_OFFSET_MASK) |
1679 | dest = mod->module_init | 1693 | dest = mod->module_init |
1680 | + (sechdrs[i].sh_entsize & ~INIT_OFFSET_MASK); | 1694 | + (sechdrs[i].sh_entsize & ~INIT_OFFSET_MASK); |
1681 | else | 1695 | else |
1682 | dest = mod->module_core + sechdrs[i].sh_entsize; | 1696 | dest = mod->module_core + sechdrs[i].sh_entsize; |
1683 | 1697 | ||
1684 | if (sechdrs[i].sh_type != SHT_NOBITS) | 1698 | if (sechdrs[i].sh_type != SHT_NOBITS) |
1685 | memcpy(dest, (void *)sechdrs[i].sh_addr, | 1699 | memcpy(dest, (void *)sechdrs[i].sh_addr, |
1686 | sechdrs[i].sh_size); | 1700 | sechdrs[i].sh_size); |
1687 | /* Update sh_addr to point to copy in image. */ | 1701 | /* Update sh_addr to point to copy in image. */ |
1688 | sechdrs[i].sh_addr = (unsigned long)dest; | 1702 | sechdrs[i].sh_addr = (unsigned long)dest; |
1689 | DEBUGP("\t0x%lx %s\n", sechdrs[i].sh_addr, secstrings + sechdrs[i].sh_name); | 1703 | DEBUGP("\t0x%lx %s\n", sechdrs[i].sh_addr, secstrings + sechdrs[i].sh_name); |
1690 | } | 1704 | } |
1691 | /* Module has been moved. */ | 1705 | /* Module has been moved. */ |
1692 | mod = (void *)sechdrs[modindex].sh_addr; | 1706 | mod = (void *)sechdrs[modindex].sh_addr; |
1693 | 1707 | ||
1694 | /* Now we've moved module, initialize linked lists, etc. */ | 1708 | /* Now we've moved module, initialize linked lists, etc. */ |
1695 | module_unload_init(mod); | 1709 | module_unload_init(mod); |
1696 | 1710 | ||
1697 | /* Set up license info based on the info section */ | 1711 | /* Set up license info based on the info section */ |
1698 | set_license(mod, get_modinfo(sechdrs, infoindex, "license")); | 1712 | set_license(mod, get_modinfo(sechdrs, infoindex, "license")); |
1699 | 1713 | ||
1700 | if (strcmp(mod->name, "ndiswrapper") == 0) | 1714 | if (strcmp(mod->name, "ndiswrapper") == 0) |
1701 | add_taint(TAINT_PROPRIETARY_MODULE); | 1715 | add_taint(TAINT_PROPRIETARY_MODULE); |
1702 | if (strcmp(mod->name, "driverloader") == 0) | 1716 | if (strcmp(mod->name, "driverloader") == 0) |
1703 | add_taint(TAINT_PROPRIETARY_MODULE); | 1717 | add_taint(TAINT_PROPRIETARY_MODULE); |
1704 | 1718 | ||
1705 | /* Set up MODINFO_ATTR fields */ | 1719 | /* Set up MODINFO_ATTR fields */ |
1706 | setup_modinfo(mod, sechdrs, infoindex); | 1720 | setup_modinfo(mod, sechdrs, infoindex); |
1707 | 1721 | ||
1708 | /* Fix up syms, so that st_value is a pointer to location. */ | 1722 | /* Fix up syms, so that st_value is a pointer to location. */ |
1709 | err = simplify_symbols(sechdrs, symindex, strtab, versindex, pcpuindex, | 1723 | err = simplify_symbols(sechdrs, symindex, strtab, versindex, pcpuindex, |
1710 | mod); | 1724 | mod); |
1711 | if (err < 0) | 1725 | if (err < 0) |
1712 | goto cleanup; | 1726 | goto cleanup; |
1713 | 1727 | ||
1714 | /* Set up EXPORTed & EXPORT_GPLed symbols (section 0 is 0 length) */ | 1728 | /* Set up EXPORTed & EXPORT_GPLed symbols (section 0 is 0 length) */ |
1715 | mod->num_syms = sechdrs[exportindex].sh_size / sizeof(*mod->syms); | 1729 | mod->num_syms = sechdrs[exportindex].sh_size / sizeof(*mod->syms); |
1716 | mod->syms = (void *)sechdrs[exportindex].sh_addr; | 1730 | mod->syms = (void *)sechdrs[exportindex].sh_addr; |
1717 | if (crcindex) | 1731 | if (crcindex) |
1718 | mod->crcs = (void *)sechdrs[crcindex].sh_addr; | 1732 | mod->crcs = (void *)sechdrs[crcindex].sh_addr; |
1719 | mod->num_gpl_syms = sechdrs[gplindex].sh_size / sizeof(*mod->gpl_syms); | 1733 | mod->num_gpl_syms = sechdrs[gplindex].sh_size / sizeof(*mod->gpl_syms); |
1720 | mod->gpl_syms = (void *)sechdrs[gplindex].sh_addr; | 1734 | mod->gpl_syms = (void *)sechdrs[gplindex].sh_addr; |
1721 | if (gplcrcindex) | 1735 | if (gplcrcindex) |
1722 | mod->gpl_crcs = (void *)sechdrs[gplcrcindex].sh_addr; | 1736 | mod->gpl_crcs = (void *)sechdrs[gplcrcindex].sh_addr; |
1723 | mod->num_gpl_future_syms = sechdrs[gplfutureindex].sh_size / | 1737 | mod->num_gpl_future_syms = sechdrs[gplfutureindex].sh_size / |
1724 | sizeof(*mod->gpl_future_syms); | 1738 | sizeof(*mod->gpl_future_syms); |
1725 | mod->num_unused_syms = sechdrs[unusedindex].sh_size / | 1739 | mod->num_unused_syms = sechdrs[unusedindex].sh_size / |
1726 | sizeof(*mod->unused_syms); | 1740 | sizeof(*mod->unused_syms); |
1727 | mod->num_unused_gpl_syms = sechdrs[unusedgplindex].sh_size / | 1741 | mod->num_unused_gpl_syms = sechdrs[unusedgplindex].sh_size / |
1728 | sizeof(*mod->unused_gpl_syms); | 1742 | sizeof(*mod->unused_gpl_syms); |
1729 | mod->gpl_future_syms = (void *)sechdrs[gplfutureindex].sh_addr; | 1743 | mod->gpl_future_syms = (void *)sechdrs[gplfutureindex].sh_addr; |
1730 | if (gplfuturecrcindex) | 1744 | if (gplfuturecrcindex) |
1731 | mod->gpl_future_crcs = (void *)sechdrs[gplfuturecrcindex].sh_addr; | 1745 | mod->gpl_future_crcs = (void *)sechdrs[gplfuturecrcindex].sh_addr; |
1732 | 1746 | ||
1733 | mod->unused_syms = (void *)sechdrs[unusedindex].sh_addr; | 1747 | mod->unused_syms = (void *)sechdrs[unusedindex].sh_addr; |
1734 | if (unusedcrcindex) | 1748 | if (unusedcrcindex) |
1735 | mod->unused_crcs = (void *)sechdrs[unusedcrcindex].sh_addr; | 1749 | mod->unused_crcs = (void *)sechdrs[unusedcrcindex].sh_addr; |
1736 | mod->unused_gpl_syms = (void *)sechdrs[unusedgplindex].sh_addr; | 1750 | mod->unused_gpl_syms = (void *)sechdrs[unusedgplindex].sh_addr; |
1737 | if (unusedgplcrcindex) | 1751 | if (unusedgplcrcindex) |
1738 | mod->unused_crcs = (void *)sechdrs[unusedgplcrcindex].sh_addr; | 1752 | mod->unused_crcs = (void *)sechdrs[unusedgplcrcindex].sh_addr; |
1739 | 1753 | ||
1740 | #ifdef CONFIG_MODVERSIONS | 1754 | #ifdef CONFIG_MODVERSIONS |
1741 | if ((mod->num_syms && !crcindex) || | 1755 | if ((mod->num_syms && !crcindex) || |
1742 | (mod->num_gpl_syms && !gplcrcindex) || | 1756 | (mod->num_gpl_syms && !gplcrcindex) || |
1743 | (mod->num_gpl_future_syms && !gplfuturecrcindex) || | 1757 | (mod->num_gpl_future_syms && !gplfuturecrcindex) || |
1744 | (mod->num_unused_syms && !unusedcrcindex) || | 1758 | (mod->num_unused_syms && !unusedcrcindex) || |
1745 | (mod->num_unused_gpl_syms && !unusedgplcrcindex)) { | 1759 | (mod->num_unused_gpl_syms && !unusedgplcrcindex)) { |
1746 | printk(KERN_WARNING "%s: No versions for exported symbols." | 1760 | printk(KERN_WARNING "%s: No versions for exported symbols." |
1747 | " Tainting kernel.\n", mod->name); | 1761 | " Tainting kernel.\n", mod->name); |
1748 | add_taint(TAINT_FORCED_MODULE); | 1762 | add_taint(TAINT_FORCED_MODULE); |
1749 | } | 1763 | } |
1750 | #endif | 1764 | #endif |
1751 | 1765 | ||
1752 | /* Now do relocations. */ | 1766 | /* Now do relocations. */ |
1753 | for (i = 1; i < hdr->e_shnum; i++) { | 1767 | for (i = 1; i < hdr->e_shnum; i++) { |
1754 | const char *strtab = (char *)sechdrs[strindex].sh_addr; | 1768 | const char *strtab = (char *)sechdrs[strindex].sh_addr; |
1755 | unsigned int info = sechdrs[i].sh_info; | 1769 | unsigned int info = sechdrs[i].sh_info; |
1756 | 1770 | ||
1757 | /* Not a valid relocation section? */ | 1771 | /* Not a valid relocation section? */ |
1758 | if (info >= hdr->e_shnum) | 1772 | if (info >= hdr->e_shnum) |
1759 | continue; | 1773 | continue; |
1760 | 1774 | ||
1761 | /* Don't bother with non-allocated sections */ | 1775 | /* Don't bother with non-allocated sections */ |
1762 | if (!(sechdrs[info].sh_flags & SHF_ALLOC)) | 1776 | if (!(sechdrs[info].sh_flags & SHF_ALLOC)) |
1763 | continue; | 1777 | continue; |
1764 | 1778 | ||
1765 | if (sechdrs[i].sh_type == SHT_REL) | 1779 | if (sechdrs[i].sh_type == SHT_REL) |
1766 | err = apply_relocate(sechdrs, strtab, symindex, i,mod); | 1780 | err = apply_relocate(sechdrs, strtab, symindex, i,mod); |
1767 | else if (sechdrs[i].sh_type == SHT_RELA) | 1781 | else if (sechdrs[i].sh_type == SHT_RELA) |
1768 | err = apply_relocate_add(sechdrs, strtab, symindex, i, | 1782 | err = apply_relocate_add(sechdrs, strtab, symindex, i, |
1769 | mod); | 1783 | mod); |
1770 | if (err < 0) | 1784 | if (err < 0) |
1771 | goto cleanup; | 1785 | goto cleanup; |
1772 | } | 1786 | } |
1773 | 1787 | ||
1774 | /* Find duplicate symbols */ | 1788 | /* Find duplicate symbols */ |
1775 | err = verify_export_symbols(mod); | 1789 | err = verify_export_symbols(mod); |
1776 | 1790 | ||
1777 | if (err < 0) | 1791 | if (err < 0) |
1778 | goto cleanup; | 1792 | goto cleanup; |
1779 | 1793 | ||
1780 | /* Set up and sort exception table */ | 1794 | /* Set up and sort exception table */ |
1781 | mod->num_exentries = sechdrs[exindex].sh_size / sizeof(*mod->extable); | 1795 | mod->num_exentries = sechdrs[exindex].sh_size / sizeof(*mod->extable); |
1782 | mod->extable = extable = (void *)sechdrs[exindex].sh_addr; | 1796 | mod->extable = extable = (void *)sechdrs[exindex].sh_addr; |
1783 | sort_extable(extable, extable + mod->num_exentries); | 1797 | sort_extable(extable, extable + mod->num_exentries); |
1784 | 1798 | ||
1785 | /* Finally, copy percpu area over. */ | 1799 | /* Finally, copy percpu area over. */ |
1786 | percpu_modcopy(mod->percpu, (void *)sechdrs[pcpuindex].sh_addr, | 1800 | percpu_modcopy(mod->percpu, (void *)sechdrs[pcpuindex].sh_addr, |
1787 | sechdrs[pcpuindex].sh_size); | 1801 | sechdrs[pcpuindex].sh_size); |
1788 | 1802 | ||
1789 | add_kallsyms(mod, sechdrs, symindex, strindex, secstrings); | 1803 | add_kallsyms(mod, sechdrs, symindex, strindex, secstrings); |
1790 | 1804 | ||
1791 | err = module_finalize(hdr, sechdrs, mod); | 1805 | err = module_finalize(hdr, sechdrs, mod); |
1792 | if (err < 0) | 1806 | if (err < 0) |
1793 | goto cleanup; | 1807 | goto cleanup; |
1794 | 1808 | ||
1795 | /* flush the icache in correct context */ | 1809 | /* flush the icache in correct context */ |
1796 | old_fs = get_fs(); | 1810 | old_fs = get_fs(); |
1797 | set_fs(KERNEL_DS); | 1811 | set_fs(KERNEL_DS); |
1798 | 1812 | ||
1799 | /* | 1813 | /* |
1800 | * Flush the instruction cache, since we've played with text. | 1814 | * Flush the instruction cache, since we've played with text. |
1801 | * Do it before processing of module parameters, so the module | 1815 | * Do it before processing of module parameters, so the module |
1802 | * can provide parameter accessor functions of its own. | 1816 | * can provide parameter accessor functions of its own. |
1803 | */ | 1817 | */ |
1804 | if (mod->module_init) | 1818 | if (mod->module_init) |
1805 | flush_icache_range((unsigned long)mod->module_init, | 1819 | flush_icache_range((unsigned long)mod->module_init, |
1806 | (unsigned long)mod->module_init | 1820 | (unsigned long)mod->module_init |
1807 | + mod->init_size); | 1821 | + mod->init_size); |
1808 | flush_icache_range((unsigned long)mod->module_core, | 1822 | flush_icache_range((unsigned long)mod->module_core, |
1809 | (unsigned long)mod->module_core + mod->core_size); | 1823 | (unsigned long)mod->module_core + mod->core_size); |
1810 | 1824 | ||
1811 | set_fs(old_fs); | 1825 | set_fs(old_fs); |
1812 | 1826 | ||
1813 | mod->args = args; | 1827 | mod->args = args; |
1814 | if (obsparmindex) | 1828 | if (obsparmindex) |
1815 | printk(KERN_WARNING "%s: Ignoring obsolete parameters\n", | 1829 | printk(KERN_WARNING "%s: Ignoring obsolete parameters\n", |
1816 | mod->name); | 1830 | mod->name); |
1817 | 1831 | ||
1818 | /* Size of section 0 is 0, so this works well if no params */ | 1832 | /* Size of section 0 is 0, so this works well if no params */ |
1819 | err = parse_args(mod->name, mod->args, | 1833 | err = parse_args(mod->name, mod->args, |
1820 | (struct kernel_param *) | 1834 | (struct kernel_param *) |
1821 | sechdrs[setupindex].sh_addr, | 1835 | sechdrs[setupindex].sh_addr, |
1822 | sechdrs[setupindex].sh_size | 1836 | sechdrs[setupindex].sh_size |
1823 | / sizeof(struct kernel_param), | 1837 | / sizeof(struct kernel_param), |
1824 | NULL); | 1838 | NULL); |
1825 | if (err < 0) | 1839 | if (err < 0) |
1826 | goto arch_cleanup; | 1840 | goto arch_cleanup; |
1827 | 1841 | ||
1828 | err = mod_sysfs_setup(mod, | 1842 | err = mod_sysfs_setup(mod, |
1829 | (struct kernel_param *) | 1843 | (struct kernel_param *) |
1830 | sechdrs[setupindex].sh_addr, | 1844 | sechdrs[setupindex].sh_addr, |
1831 | sechdrs[setupindex].sh_size | 1845 | sechdrs[setupindex].sh_size |
1832 | / sizeof(struct kernel_param)); | 1846 | / sizeof(struct kernel_param)); |
1833 | if (err < 0) | 1847 | if (err < 0) |
1834 | goto arch_cleanup; | 1848 | goto arch_cleanup; |
1835 | add_sect_attrs(mod, hdr->e_shnum, secstrings, sechdrs); | 1849 | add_sect_attrs(mod, hdr->e_shnum, secstrings, sechdrs); |
1836 | 1850 | ||
1837 | /* Size of section 0 is 0, so this works well if no unwind info. */ | 1851 | /* Size of section 0 is 0, so this works well if no unwind info. */ |
1838 | mod->unwind_info = unwind_add_table(mod, | 1852 | mod->unwind_info = unwind_add_table(mod, |
1839 | (void *)sechdrs[unwindex].sh_addr, | 1853 | (void *)sechdrs[unwindex].sh_addr, |
1840 | sechdrs[unwindex].sh_size); | 1854 | sechdrs[unwindex].sh_size); |
1841 | 1855 | ||
1842 | /* Get rid of temporary copy */ | 1856 | /* Get rid of temporary copy */ |
1843 | vfree(hdr); | 1857 | vfree(hdr); |
1844 | 1858 | ||
1845 | /* Done! */ | 1859 | /* Done! */ |
1846 | return mod; | 1860 | return mod; |
1847 | 1861 | ||
1848 | arch_cleanup: | 1862 | arch_cleanup: |
1849 | module_arch_cleanup(mod); | 1863 | module_arch_cleanup(mod); |
1850 | cleanup: | 1864 | cleanup: |
1851 | module_unload_free(mod); | 1865 | module_unload_free(mod); |
1852 | module_free(mod, mod->module_init); | 1866 | module_free(mod, mod->module_init); |
1853 | free_core: | 1867 | free_core: |
1854 | module_free(mod, mod->module_core); | 1868 | module_free(mod, mod->module_core); |
1855 | free_percpu: | 1869 | free_percpu: |
1856 | if (percpu) | 1870 | if (percpu) |
1857 | percpu_modfree(percpu); | 1871 | percpu_modfree(percpu); |
1858 | free_mod: | 1872 | free_mod: |
1859 | kfree(args); | 1873 | kfree(args); |
1860 | free_hdr: | 1874 | free_hdr: |
1861 | vfree(hdr); | 1875 | vfree(hdr); |
1862 | return ERR_PTR(err); | 1876 | return ERR_PTR(err); |
1863 | 1877 | ||
1864 | truncated: | 1878 | truncated: |
1865 | printk(KERN_ERR "Module len %lu truncated\n", len); | 1879 | printk(KERN_ERR "Module len %lu truncated\n", len); |
1866 | err = -ENOEXEC; | 1880 | err = -ENOEXEC; |
1867 | goto free_hdr; | 1881 | goto free_hdr; |
1868 | } | 1882 | } |
1869 | 1883 | ||
1870 | /* | 1884 | /* |
1871 | * link the module with the whole machine is stopped with interrupts off | 1885 | * link the module with the whole machine is stopped with interrupts off |
1872 | * - this defends against kallsyms not taking locks | 1886 | * - this defends against kallsyms not taking locks |
1873 | */ | 1887 | */ |
1874 | static int __link_module(void *_mod) | 1888 | static int __link_module(void *_mod) |
1875 | { | 1889 | { |
1876 | struct module *mod = _mod; | 1890 | struct module *mod = _mod; |
1877 | list_add(&mod->list, &modules); | 1891 | list_add(&mod->list, &modules); |
1878 | return 0; | 1892 | return 0; |
1879 | } | 1893 | } |
1880 | 1894 | ||
1881 | /* This is where the real work happens */ | 1895 | /* This is where the real work happens */ |
1882 | asmlinkage long | 1896 | asmlinkage long |
1883 | sys_init_module(void __user *umod, | 1897 | sys_init_module(void __user *umod, |
1884 | unsigned long len, | 1898 | unsigned long len, |
1885 | const char __user *uargs) | 1899 | const char __user *uargs) |
1886 | { | 1900 | { |
1887 | struct module *mod; | 1901 | struct module *mod; |
1888 | int ret = 0; | 1902 | int ret = 0; |
1889 | 1903 | ||
1890 | /* Must have permission */ | 1904 | /* Must have permission */ |
1891 | if (!capable(CAP_SYS_MODULE)) | 1905 | if (!capable(CAP_SYS_MODULE)) |
1892 | return -EPERM; | 1906 | return -EPERM; |
1893 | 1907 | ||
1894 | /* Only one module load at a time, please */ | 1908 | /* Only one module load at a time, please */ |
1895 | if (mutex_lock_interruptible(&module_mutex) != 0) | 1909 | if (mutex_lock_interruptible(&module_mutex) != 0) |
1896 | return -EINTR; | 1910 | return -EINTR; |
1897 | 1911 | ||
1898 | /* Do all the hard work */ | 1912 | /* Do all the hard work */ |
1899 | mod = load_module(umod, len, uargs); | 1913 | mod = load_module(umod, len, uargs); |
1900 | if (IS_ERR(mod)) { | 1914 | if (IS_ERR(mod)) { |
1901 | mutex_unlock(&module_mutex); | 1915 | mutex_unlock(&module_mutex); |
1902 | return PTR_ERR(mod); | 1916 | return PTR_ERR(mod); |
1903 | } | 1917 | } |
1904 | 1918 | ||
1905 | /* Now sew it into the lists. They won't access us, since | 1919 | /* Now sew it into the lists. They won't access us, since |
1906 | strong_try_module_get() will fail. */ | 1920 | strong_try_module_get() will fail. */ |
1907 | stop_machine_run(__link_module, mod, NR_CPUS); | 1921 | stop_machine_run(__link_module, mod, NR_CPUS); |
1908 | 1922 | ||
1909 | /* Drop lock so they can recurse */ | 1923 | /* Drop lock so they can recurse */ |
1910 | mutex_unlock(&module_mutex); | 1924 | mutex_unlock(&module_mutex); |
1911 | 1925 | ||
1912 | blocking_notifier_call_chain(&module_notify_list, | 1926 | blocking_notifier_call_chain(&module_notify_list, |
1913 | MODULE_STATE_COMING, mod); | 1927 | MODULE_STATE_COMING, mod); |
1914 | 1928 | ||
1915 | /* Start the module */ | 1929 | /* Start the module */ |
1916 | if (mod->init != NULL) | 1930 | if (mod->init != NULL) |
1917 | ret = mod->init(); | 1931 | ret = mod->init(); |
1918 | if (ret < 0) { | 1932 | if (ret < 0) { |
1919 | /* Init routine failed: abort. Try to protect us from | 1933 | /* Init routine failed: abort. Try to protect us from |
1920 | buggy refcounters. */ | 1934 | buggy refcounters. */ |
1921 | mod->state = MODULE_STATE_GOING; | 1935 | mod->state = MODULE_STATE_GOING; |
1922 | synchronize_sched(); | 1936 | synchronize_sched(); |
1923 | if (mod->unsafe) | 1937 | if (mod->unsafe) |
1924 | printk(KERN_ERR "%s: module is now stuck!\n", | 1938 | printk(KERN_ERR "%s: module is now stuck!\n", |
1925 | mod->name); | 1939 | mod->name); |
1926 | else { | 1940 | else { |
1927 | module_put(mod); | 1941 | module_put(mod); |
1928 | mutex_lock(&module_mutex); | 1942 | mutex_lock(&module_mutex); |
1929 | free_module(mod); | 1943 | free_module(mod); |
1930 | mutex_unlock(&module_mutex); | 1944 | mutex_unlock(&module_mutex); |
1931 | } | 1945 | } |
1932 | return ret; | 1946 | return ret; |
1933 | } | 1947 | } |
1934 | 1948 | ||
1935 | /* Now it's a first class citizen! */ | 1949 | /* Now it's a first class citizen! */ |
1936 | mutex_lock(&module_mutex); | 1950 | mutex_lock(&module_mutex); |
1937 | mod->state = MODULE_STATE_LIVE; | 1951 | mod->state = MODULE_STATE_LIVE; |
1938 | /* Drop initial reference. */ | 1952 | /* Drop initial reference. */ |
1939 | module_put(mod); | 1953 | module_put(mod); |
1940 | unwind_remove_table(mod->unwind_info, 1); | 1954 | unwind_remove_table(mod->unwind_info, 1); |
1941 | module_free(mod, mod->module_init); | 1955 | module_free(mod, mod->module_init); |
1942 | mod->module_init = NULL; | 1956 | mod->module_init = NULL; |
1943 | mod->init_size = 0; | 1957 | mod->init_size = 0; |
1944 | mod->init_text_size = 0; | 1958 | mod->init_text_size = 0; |
1945 | mutex_unlock(&module_mutex); | 1959 | mutex_unlock(&module_mutex); |
1946 | 1960 | ||
1947 | return 0; | 1961 | return 0; |
1948 | } | 1962 | } |
1949 | 1963 | ||
1950 | static inline int within(unsigned long addr, void *start, unsigned long size) | 1964 | static inline int within(unsigned long addr, void *start, unsigned long size) |
1951 | { | 1965 | { |
1952 | return ((void *)addr >= start && (void *)addr < start + size); | 1966 | return ((void *)addr >= start && (void *)addr < start + size); |
1953 | } | 1967 | } |
1954 | 1968 | ||
1955 | #ifdef CONFIG_KALLSYMS | 1969 | #ifdef CONFIG_KALLSYMS |
1956 | /* | 1970 | /* |
1957 | * This ignores the intensely annoying "mapping symbols" found | 1971 | * This ignores the intensely annoying "mapping symbols" found |
1958 | * in ARM ELF files: $a, $t and $d. | 1972 | * in ARM ELF files: $a, $t and $d. |
1959 | */ | 1973 | */ |
1960 | static inline int is_arm_mapping_symbol(const char *str) | 1974 | static inline int is_arm_mapping_symbol(const char *str) |
1961 | { | 1975 | { |
1962 | return str[0] == '$' && strchr("atd", str[1]) | 1976 | return str[0] == '$' && strchr("atd", str[1]) |
1963 | && (str[2] == '\0' || str[2] == '.'); | 1977 | && (str[2] == '\0' || str[2] == '.'); |
1964 | } | 1978 | } |
1965 | 1979 | ||
1966 | static const char *get_ksymbol(struct module *mod, | 1980 | static const char *get_ksymbol(struct module *mod, |
1967 | unsigned long addr, | 1981 | unsigned long addr, |
1968 | unsigned long *size, | 1982 | unsigned long *size, |
1969 | unsigned long *offset) | 1983 | unsigned long *offset) |
1970 | { | 1984 | { |
1971 | unsigned int i, best = 0; | 1985 | unsigned int i, best = 0; |
1972 | unsigned long nextval; | 1986 | unsigned long nextval; |
1973 | 1987 | ||
1974 | /* At worse, next value is at end of module */ | 1988 | /* At worse, next value is at end of module */ |
1975 | if (within(addr, mod->module_init, mod->init_size)) | 1989 | if (within(addr, mod->module_init, mod->init_size)) |
1976 | nextval = (unsigned long)mod->module_init+mod->init_text_size; | 1990 | nextval = (unsigned long)mod->module_init+mod->init_text_size; |
1977 | else | 1991 | else |
1978 | nextval = (unsigned long)mod->module_core+mod->core_text_size; | 1992 | nextval = (unsigned long)mod->module_core+mod->core_text_size; |
1979 | 1993 | ||
1980 | /* Scan for closest preceeding symbol, and next symbol. (ELF | 1994 | /* Scan for closest preceeding symbol, and next symbol. (ELF |
1981 | starts real symbols at 1). */ | 1995 | starts real symbols at 1). */ |
1982 | for (i = 1; i < mod->num_symtab; i++) { | 1996 | for (i = 1; i < mod->num_symtab; i++) { |
1983 | if (mod->symtab[i].st_shndx == SHN_UNDEF) | 1997 | if (mod->symtab[i].st_shndx == SHN_UNDEF) |
1984 | continue; | 1998 | continue; |
1985 | 1999 | ||
1986 | /* We ignore unnamed symbols: they're uninformative | 2000 | /* We ignore unnamed symbols: they're uninformative |
1987 | * and inserted at a whim. */ | 2001 | * and inserted at a whim. */ |
1988 | if (mod->symtab[i].st_value <= addr | 2002 | if (mod->symtab[i].st_value <= addr |
1989 | && mod->symtab[i].st_value > mod->symtab[best].st_value | 2003 | && mod->symtab[i].st_value > mod->symtab[best].st_value |
1990 | && *(mod->strtab + mod->symtab[i].st_name) != '\0' | 2004 | && *(mod->strtab + mod->symtab[i].st_name) != '\0' |
1991 | && !is_arm_mapping_symbol(mod->strtab + mod->symtab[i].st_name)) | 2005 | && !is_arm_mapping_symbol(mod->strtab + mod->symtab[i].st_name)) |
1992 | best = i; | 2006 | best = i; |
1993 | if (mod->symtab[i].st_value > addr | 2007 | if (mod->symtab[i].st_value > addr |
1994 | && mod->symtab[i].st_value < nextval | 2008 | && mod->symtab[i].st_value < nextval |
1995 | && *(mod->strtab + mod->symtab[i].st_name) != '\0' | 2009 | && *(mod->strtab + mod->symtab[i].st_name) != '\0' |
1996 | && !is_arm_mapping_symbol(mod->strtab + mod->symtab[i].st_name)) | 2010 | && !is_arm_mapping_symbol(mod->strtab + mod->symtab[i].st_name)) |
1997 | nextval = mod->symtab[i].st_value; | 2011 | nextval = mod->symtab[i].st_value; |
1998 | } | 2012 | } |
1999 | 2013 | ||
2000 | if (!best) | 2014 | if (!best) |
2001 | return NULL; | 2015 | return NULL; |
2002 | 2016 | ||
2003 | *size = nextval - mod->symtab[best].st_value; | 2017 | *size = nextval - mod->symtab[best].st_value; |
2004 | *offset = addr - mod->symtab[best].st_value; | 2018 | *offset = addr - mod->symtab[best].st_value; |
2005 | return mod->strtab + mod->symtab[best].st_name; | 2019 | return mod->strtab + mod->symtab[best].st_name; |
2006 | } | 2020 | } |
2007 | 2021 | ||
2008 | /* For kallsyms to ask for address resolution. NULL means not found. | 2022 | /* For kallsyms to ask for address resolution. NULL means not found. |
2009 | We don't lock, as this is used for oops resolution and races are a | 2023 | We don't lock, as this is used for oops resolution and races are a |
2010 | lesser concern. */ | 2024 | lesser concern. */ |
2011 | const char *module_address_lookup(unsigned long addr, | 2025 | const char *module_address_lookup(unsigned long addr, |
2012 | unsigned long *size, | 2026 | unsigned long *size, |
2013 | unsigned long *offset, | 2027 | unsigned long *offset, |
2014 | char **modname) | 2028 | char **modname) |
2015 | { | 2029 | { |
2016 | struct module *mod; | 2030 | struct module *mod; |
2017 | 2031 | ||
2018 | list_for_each_entry(mod, &modules, list) { | 2032 | list_for_each_entry(mod, &modules, list) { |
2019 | if (within(addr, mod->module_init, mod->init_size) | 2033 | if (within(addr, mod->module_init, mod->init_size) |
2020 | || within(addr, mod->module_core, mod->core_size)) { | 2034 | || within(addr, mod->module_core, mod->core_size)) { |
2021 | *modname = mod->name; | 2035 | *modname = mod->name; |
2022 | return get_ksymbol(mod, addr, size, offset); | 2036 | return get_ksymbol(mod, addr, size, offset); |
2023 | } | 2037 | } |
2024 | } | 2038 | } |
2025 | return NULL; | 2039 | return NULL; |
2026 | } | 2040 | } |
2027 | 2041 | ||
2028 | struct module *module_get_kallsym(unsigned int symnum, unsigned long *value, | 2042 | struct module *module_get_kallsym(unsigned int symnum, unsigned long *value, |
2029 | char *type, char *name, size_t namelen) | 2043 | char *type, char *name, size_t namelen) |
2030 | { | 2044 | { |
2031 | struct module *mod; | 2045 | struct module *mod; |
2032 | 2046 | ||
2033 | mutex_lock(&module_mutex); | 2047 | mutex_lock(&module_mutex); |
2034 | list_for_each_entry(mod, &modules, list) { | 2048 | list_for_each_entry(mod, &modules, list) { |
2035 | if (symnum < mod->num_symtab) { | 2049 | if (symnum < mod->num_symtab) { |
2036 | *value = mod->symtab[symnum].st_value; | 2050 | *value = mod->symtab[symnum].st_value; |
2037 | *type = mod->symtab[symnum].st_info; | 2051 | *type = mod->symtab[symnum].st_info; |
2038 | strlcpy(name, mod->strtab + mod->symtab[symnum].st_name, | 2052 | strlcpy(name, mod->strtab + mod->symtab[symnum].st_name, |
2039 | namelen); | 2053 | namelen); |
2040 | mutex_unlock(&module_mutex); | 2054 | mutex_unlock(&module_mutex); |
2041 | return mod; | 2055 | return mod; |
2042 | } | 2056 | } |
2043 | symnum -= mod->num_symtab; | 2057 | symnum -= mod->num_symtab; |
2044 | } | 2058 | } |
2045 | mutex_unlock(&module_mutex); | 2059 | mutex_unlock(&module_mutex); |
2046 | return NULL; | 2060 | return NULL; |
2047 | } | 2061 | } |
2048 | 2062 | ||
2049 | static unsigned long mod_find_symname(struct module *mod, const char *name) | 2063 | static unsigned long mod_find_symname(struct module *mod, const char *name) |
2050 | { | 2064 | { |
2051 | unsigned int i; | 2065 | unsigned int i; |
2052 | 2066 | ||
2053 | for (i = 0; i < mod->num_symtab; i++) | 2067 | for (i = 0; i < mod->num_symtab; i++) |
2054 | if (strcmp(name, mod->strtab+mod->symtab[i].st_name) == 0 && | 2068 | if (strcmp(name, mod->strtab+mod->symtab[i].st_name) == 0 && |
2055 | mod->symtab[i].st_info != 'U') | 2069 | mod->symtab[i].st_info != 'U') |
2056 | return mod->symtab[i].st_value; | 2070 | return mod->symtab[i].st_value; |
2057 | return 0; | 2071 | return 0; |
2058 | } | 2072 | } |
2059 | 2073 | ||
2060 | /* Look for this name: can be of form module:name. */ | 2074 | /* Look for this name: can be of form module:name. */ |
2061 | unsigned long module_kallsyms_lookup_name(const char *name) | 2075 | unsigned long module_kallsyms_lookup_name(const char *name) |
2062 | { | 2076 | { |
2063 | struct module *mod; | 2077 | struct module *mod; |
2064 | char *colon; | 2078 | char *colon; |
2065 | unsigned long ret = 0; | 2079 | unsigned long ret = 0; |
2066 | 2080 | ||
2067 | /* Don't lock: we're in enough trouble already. */ | 2081 | /* Don't lock: we're in enough trouble already. */ |
2068 | if ((colon = strchr(name, ':')) != NULL) { | 2082 | if ((colon = strchr(name, ':')) != NULL) { |
2069 | *colon = '\0'; | 2083 | *colon = '\0'; |
2070 | if ((mod = find_module(name)) != NULL) | 2084 | if ((mod = find_module(name)) != NULL) |
2071 | ret = mod_find_symname(mod, colon+1); | 2085 | ret = mod_find_symname(mod, colon+1); |
2072 | *colon = ':'; | 2086 | *colon = ':'; |
2073 | } else { | 2087 | } else { |
2074 | list_for_each_entry(mod, &modules, list) | 2088 | list_for_each_entry(mod, &modules, list) |
2075 | if ((ret = mod_find_symname(mod, name)) != 0) | 2089 | if ((ret = mod_find_symname(mod, name)) != 0) |
2076 | break; | 2090 | break; |
2077 | } | 2091 | } |
2078 | return ret; | 2092 | return ret; |
2079 | } | 2093 | } |
2080 | #endif /* CONFIG_KALLSYMS */ | 2094 | #endif /* CONFIG_KALLSYMS */ |
2081 | 2095 | ||
2082 | /* Called by the /proc file system to return a list of modules. */ | 2096 | /* Called by the /proc file system to return a list of modules. */ |
2083 | static void *m_start(struct seq_file *m, loff_t *pos) | 2097 | static void *m_start(struct seq_file *m, loff_t *pos) |
2084 | { | 2098 | { |
2085 | struct list_head *i; | 2099 | struct list_head *i; |
2086 | loff_t n = 0; | 2100 | loff_t n = 0; |
2087 | 2101 | ||
2088 | mutex_lock(&module_mutex); | 2102 | mutex_lock(&module_mutex); |
2089 | list_for_each(i, &modules) { | 2103 | list_for_each(i, &modules) { |
2090 | if (n++ == *pos) | 2104 | if (n++ == *pos) |
2091 | break; | 2105 | break; |
2092 | } | 2106 | } |
2093 | if (i == &modules) | 2107 | if (i == &modules) |
2094 | return NULL; | 2108 | return NULL; |
2095 | return i; | 2109 | return i; |
2096 | } | 2110 | } |
2097 | 2111 | ||
2098 | static void *m_next(struct seq_file *m, void *p, loff_t *pos) | 2112 | static void *m_next(struct seq_file *m, void *p, loff_t *pos) |
2099 | { | 2113 | { |
2100 | struct list_head *i = p; | 2114 | struct list_head *i = p; |
2101 | (*pos)++; | 2115 | (*pos)++; |
2102 | if (i->next == &modules) | 2116 | if (i->next == &modules) |
2103 | return NULL; | 2117 | return NULL; |
2104 | return i->next; | 2118 | return i->next; |
2105 | } | 2119 | } |
2106 | 2120 | ||
2107 | static void m_stop(struct seq_file *m, void *p) | 2121 | static void m_stop(struct seq_file *m, void *p) |
2108 | { | 2122 | { |
2109 | mutex_unlock(&module_mutex); | 2123 | mutex_unlock(&module_mutex); |
2110 | } | 2124 | } |
2111 | 2125 | ||
2112 | static int m_show(struct seq_file *m, void *p) | 2126 | static int m_show(struct seq_file *m, void *p) |
2113 | { | 2127 | { |
2114 | struct module *mod = list_entry(p, struct module, list); | 2128 | struct module *mod = list_entry(p, struct module, list); |
2115 | seq_printf(m, "%s %lu", | 2129 | seq_printf(m, "%s %lu", |
2116 | mod->name, mod->init_size + mod->core_size); | 2130 | mod->name, mod->init_size + mod->core_size); |
2117 | print_unload_info(m, mod); | 2131 | print_unload_info(m, mod); |
2118 | 2132 | ||
2119 | /* Informative for users. */ | 2133 | /* Informative for users. */ |
2120 | seq_printf(m, " %s", | 2134 | seq_printf(m, " %s", |
2121 | mod->state == MODULE_STATE_GOING ? "Unloading": | 2135 | mod->state == MODULE_STATE_GOING ? "Unloading": |
2122 | mod->state == MODULE_STATE_COMING ? "Loading": | 2136 | mod->state == MODULE_STATE_COMING ? "Loading": |
2123 | "Live"); | 2137 | "Live"); |
2124 | /* Used by oprofile and other similar tools. */ | 2138 | /* Used by oprofile and other similar tools. */ |
2125 | seq_printf(m, " 0x%p", mod->module_core); | 2139 | seq_printf(m, " 0x%p", mod->module_core); |
2126 | 2140 | ||
2127 | seq_printf(m, "\n"); | 2141 | seq_printf(m, "\n"); |
2128 | return 0; | 2142 | return 0; |
2129 | } | 2143 | } |
2130 | 2144 | ||
2131 | /* Format: modulename size refcount deps address | 2145 | /* Format: modulename size refcount deps address |
2132 | 2146 | ||
2133 | Where refcount is a number or -, and deps is a comma-separated list | 2147 | Where refcount is a number or -, and deps is a comma-separated list |
2134 | of depends or -. | 2148 | of depends or -. |
2135 | */ | 2149 | */ |
2136 | struct seq_operations modules_op = { | 2150 | struct seq_operations modules_op = { |
2137 | .start = m_start, | 2151 | .start = m_start, |
2138 | .next = m_next, | 2152 | .next = m_next, |
2139 | .stop = m_stop, | 2153 | .stop = m_stop, |
2140 | .show = m_show | 2154 | .show = m_show |
2141 | }; | 2155 | }; |
2142 | 2156 | ||
2143 | /* Given an address, look for it in the module exception tables. */ | 2157 | /* Given an address, look for it in the module exception tables. */ |
2144 | const struct exception_table_entry *search_module_extables(unsigned long addr) | 2158 | const struct exception_table_entry *search_module_extables(unsigned long addr) |
2145 | { | 2159 | { |
2146 | unsigned long flags; | 2160 | unsigned long flags; |
2147 | const struct exception_table_entry *e = NULL; | 2161 | const struct exception_table_entry *e = NULL; |
2148 | struct module *mod; | 2162 | struct module *mod; |
2149 | 2163 | ||
2150 | spin_lock_irqsave(&modlist_lock, flags); | 2164 | spin_lock_irqsave(&modlist_lock, flags); |
2151 | list_for_each_entry(mod, &modules, list) { | 2165 | list_for_each_entry(mod, &modules, list) { |
2152 | if (mod->num_exentries == 0) | 2166 | if (mod->num_exentries == 0) |
2153 | continue; | 2167 | continue; |
2154 | 2168 | ||
2155 | e = search_extable(mod->extable, | 2169 | e = search_extable(mod->extable, |
2156 | mod->extable + mod->num_exentries - 1, | 2170 | mod->extable + mod->num_exentries - 1, |
2157 | addr); | 2171 | addr); |
2158 | if (e) | 2172 | if (e) |
2159 | break; | 2173 | break; |
2160 | } | 2174 | } |
2161 | spin_unlock_irqrestore(&modlist_lock, flags); | 2175 | spin_unlock_irqrestore(&modlist_lock, flags); |
2162 | 2176 | ||
2163 | /* Now, if we found one, we are running inside it now, hence | 2177 | /* Now, if we found one, we are running inside it now, hence |
2164 | we cannot unload the module, hence no refcnt needed. */ | 2178 | we cannot unload the module, hence no refcnt needed. */ |
2165 | return e; | 2179 | return e; |
2166 | } | 2180 | } |
2167 | 2181 | ||
2168 | /* | 2182 | /* |
2169 | * Is this a valid module address? | 2183 | * Is this a valid module address? |
2170 | */ | 2184 | */ |
2171 | int is_module_address(unsigned long addr) | 2185 | int is_module_address(unsigned long addr) |
2172 | { | 2186 | { |
2173 | unsigned long flags; | 2187 | unsigned long flags; |
2174 | struct module *mod; | 2188 | struct module *mod; |
2175 | 2189 | ||
2176 | spin_lock_irqsave(&modlist_lock, flags); | 2190 | spin_lock_irqsave(&modlist_lock, flags); |
2177 | 2191 | ||
2178 | list_for_each_entry(mod, &modules, list) { | 2192 | list_for_each_entry(mod, &modules, list) { |
2179 | if (within(addr, mod->module_core, mod->core_size)) { | 2193 | if (within(addr, mod->module_core, mod->core_size)) { |
2180 | spin_unlock_irqrestore(&modlist_lock, flags); | 2194 | spin_unlock_irqrestore(&modlist_lock, flags); |
2181 | return 1; | 2195 | return 1; |
2182 | } | 2196 | } |
2183 | } | 2197 | } |
2184 | 2198 | ||
2185 | spin_unlock_irqrestore(&modlist_lock, flags); | 2199 | spin_unlock_irqrestore(&modlist_lock, flags); |
2186 | 2200 | ||
2187 | return 0; | 2201 | return 0; |
2188 | } | 2202 | } |
2189 | 2203 | ||
2190 | 2204 | ||
2191 | /* Is this a valid kernel address? We don't grab the lock: we are oopsing. */ | 2205 | /* Is this a valid kernel address? We don't grab the lock: we are oopsing. */ |
2192 | struct module *__module_text_address(unsigned long addr) | 2206 | struct module *__module_text_address(unsigned long addr) |
2193 | { | 2207 | { |
2194 | struct module *mod; | 2208 | struct module *mod; |
2195 | 2209 | ||
2196 | list_for_each_entry(mod, &modules, list) | 2210 | list_for_each_entry(mod, &modules, list) |
2197 | if (within(addr, mod->module_init, mod->init_text_size) | 2211 | if (within(addr, mod->module_init, mod->init_text_size) |
2198 | || within(addr, mod->module_core, mod->core_text_size)) | 2212 | || within(addr, mod->module_core, mod->core_text_size)) |
2199 | return mod; | 2213 | return mod; |
2200 | return NULL; | 2214 | return NULL; |
2201 | } | 2215 | } |
2202 | 2216 | ||
2203 | struct module *module_text_address(unsigned long addr) | 2217 | struct module *module_text_address(unsigned long addr) |
2204 | { | 2218 | { |
2205 | struct module *mod; | 2219 | struct module *mod; |
2206 | unsigned long flags; | 2220 | unsigned long flags; |
2207 | 2221 | ||
2208 | spin_lock_irqsave(&modlist_lock, flags); | 2222 | spin_lock_irqsave(&modlist_lock, flags); |
2209 | mod = __module_text_address(addr); | 2223 | mod = __module_text_address(addr); |
2210 | spin_unlock_irqrestore(&modlist_lock, flags); | 2224 | spin_unlock_irqrestore(&modlist_lock, flags); |
2211 | 2225 | ||
2212 | return mod; | 2226 | return mod; |
2213 | } | 2227 | } |
2214 | 2228 | ||
2215 | /* Don't grab lock, we're oopsing. */ | 2229 | /* Don't grab lock, we're oopsing. */ |
2216 | void print_modules(void) | 2230 | void print_modules(void) |
2217 | { | 2231 | { |
2218 | struct module *mod; | 2232 | struct module *mod; |
2219 | 2233 | ||
2220 | printk("Modules linked in:"); | 2234 | printk("Modules linked in:"); |
2221 | list_for_each_entry(mod, &modules, list) | 2235 | list_for_each_entry(mod, &modules, list) |
2222 | printk(" %s", mod->name); | 2236 | printk(" %s", mod->name); |
2223 | printk("\n"); | 2237 | printk("\n"); |
2224 | } | 2238 | } |
2225 | 2239 | ||
2226 | void module_add_driver(struct module *mod, struct device_driver *drv) | 2240 | void module_add_driver(struct module *mod, struct device_driver *drv) |
2227 | { | 2241 | { |
2228 | if (!mod || !drv) | 2242 | if (!mod || !drv) |
2229 | return; | 2243 | return; |
2230 | 2244 | ||
2231 | /* Don't check return code; this call is idempotent */ | 2245 | /* Don't check return code; this call is idempotent */ |
2232 | sysfs_create_link(&drv->kobj, &mod->mkobj.kobj, "module"); | 2246 | sysfs_create_link(&drv->kobj, &mod->mkobj.kobj, "module"); |
2233 | } | 2247 | } |
2234 | EXPORT_SYMBOL(module_add_driver); | 2248 | EXPORT_SYMBOL(module_add_driver); |
2235 | 2249 | ||
2236 | void module_remove_driver(struct device_driver *drv) | 2250 | void module_remove_driver(struct device_driver *drv) |
2237 | { | 2251 | { |
2238 | if (!drv) | 2252 | if (!drv) |
2239 | return; | 2253 | return; |
2240 | sysfs_remove_link(&drv->kobj, "module"); | 2254 | sysfs_remove_link(&drv->kobj, "module"); |
2241 | } | 2255 | } |
2242 | EXPORT_SYMBOL(module_remove_driver); | 2256 | EXPORT_SYMBOL(module_remove_driver); |
2243 | 2257 | ||
2244 | #ifdef CONFIG_MODVERSIONS | 2258 | #ifdef CONFIG_MODVERSIONS |
2245 | /* Generate the signature for struct module here, too, for modversions. */ | 2259 | /* Generate the signature for struct module here, too, for modversions. */ |
2246 | void struct_module(struct module *mod) { return; } | 2260 | void struct_module(struct module *mod) { return; } |
2247 | EXPORT_SYMBOL(struct_module); | 2261 | EXPORT_SYMBOL(struct_module); |
2248 | #endif | 2262 | #endif |