aboutsummaryrefslogtreecommitdiffstats
path: root/arch/mips/kernel/irixelf.c
blob: 881f125eecb466c34a1730eb922ae0df22242352 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
/*
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 *
 * irixelf.c: Code to load IRIX ELF executables conforming to the MIPS ABI.
 *            Based off of work by Eric Youngdale.
 *
 * Copyright (C) 1993 - 1994 Eric Youngdale <ericy@cais.com>
 * Copyright (C) 1996 - 2004 David S. Miller <dm@engr.sgi.com>
 * Copyright (C) 2004 - 2005 Steven J. Hill <sjhill@realitydiluted.com>
 */
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/stat.h>
#include <linux/sched.h>
#include <linux/mm.h>
#include <linux/mman.h>
#include <linux/a.out.h>
#include <linux/errno.h>
#include <linux/init.h>
#include <linux/signal.h>
#include <linux/binfmts.h>
#include <linux/string.h>
#include <linux/file.h>
#include <linux/fcntl.h>
#include <linux/ptrace.h>
#include <linux/slab.h>
#include <linux/shm.h>
#include <linux/personality.h>
#include <linux/elfcore.h>
#include <linux/smp_lock.h>

#include <asm/mipsregs.h>
#include <asm/namei.h>
#include <asm/prctl.h>
#include <asm/uaccess.h>

#define DLINFO_ITEMS 12

#include <linux/elf.h>

#undef DEBUG

static int load_irix_binary(struct linux_binprm * bprm, struct pt_regs * regs);
static int load_irix_library(struct file *);
static int irix_core_dump(long signr, struct pt_regs * regs,
                          struct file *file);

static struct linux_binfmt irix_format = {
	NULL, THIS_MODULE, load_irix_binary, load_irix_library,
	irix_core_dump, PAGE_SIZE
};

#ifndef elf_addr_t
#define elf_addr_t unsigned long
#endif

#ifdef DEBUG
/* Debugging routines. */
static char *get_elf_p_type(Elf32_Word p_type)
{
	int i = (int) p_type;

	switch(i) {
	case PT_NULL: return("PT_NULL"); break;
	case PT_LOAD: return("PT_LOAD"); break;
	case PT_DYNAMIC: return("PT_DYNAMIC"); break;
	case PT_INTERP: return("PT_INTERP"); break;
	case PT_NOTE: return("PT_NOTE"); break;
	case PT_SHLIB: return("PT_SHLIB"); break;
	case PT_PHDR: return("PT_PHDR"); break;
	case PT_LOPROC: return("PT_LOPROC/REGINFO"); break;
	case PT_HIPROC: return("PT_HIPROC"); break;
	default: return("PT_BOGUS"); break;
	}
}

static void print_elfhdr(struct elfhdr *ehp)
{
	int i;

	printk("ELFHDR: e_ident<");
	for(i = 0; i < (EI_NIDENT - 1); i++) printk("%x ", ehp->e_ident[i]);
	printk("%x>\n", ehp->e_ident[i]);
	printk("        e_type[%04x] e_machine[%04x] e_version[%08lx]\n",
	       (unsigned short) ehp->e_type, (unsigned short) ehp->e_machine,
	       (unsigned long) ehp->e_version);
	printk("        e_entry[%08lx] e_phoff[%08lx] e_shoff[%08lx] "
	       "e_flags[%08lx]\n",
	       (unsigned long) ehp->e_entry, (unsigned long) ehp->e_phoff,
	       (unsigned long) ehp->e_shoff, (unsigned long) ehp->e_flags);
	printk("        e_ehsize[%04x] e_phentsize[%04x] e_phnum[%04x]\n",
	       (unsigned short) ehp->e_ehsize, (unsigned short) ehp->e_phentsize,
	       (unsigned short) ehp->e_phnum);
	printk("        e_shentsize[%04x] e_shnum[%04x] e_shstrndx[%04x]\n",
	       (unsigned short) ehp->e_shentsize, (unsigned short) ehp->e_shnum,
	       (unsigned short) ehp->e_shstrndx);
}

static void print_phdr(int i, struct elf_phdr *ep)
{
	printk("PHDR[%d]: p_type[%s] p_offset[%08lx] p_vaddr[%08lx] "
	       "p_paddr[%08lx]\n", i, get_elf_p_type(ep->p_type),
	       (unsigned long) ep->p_offset, (unsigned long) ep->p_vaddr,
	       (unsigned long) ep->p_paddr);
	printk("         p_filesz[%08lx] p_memsz[%08lx] p_flags[%08lx] "
	       "p_align[%08lx]\n", (unsigned long) ep->p_filesz,
	       (unsigned long) ep->p_memsz, (unsigned long) ep->p_flags,
	       (unsigned long) ep->p_align);
}

static void dump_phdrs(struct elf_phdr *ep, int pnum)
{
	int i;

	for(i = 0; i < pnum; i++, ep++) {
		if((ep->p_type == PT_LOAD) ||
		   (ep->p_type == PT_INTERP) ||
		   (ep->p_type == PT_PHDR))
			print_phdr(i, ep);
	}
}
#endif /* DEBUG */

static void set_brk(unsigned long start, unsigned long end)
{
	start = PAGE_ALIGN(start);
	end = PAGE_ALIGN(end);
	if (end <= start)
		return;
	down_write(&current->mm->mmap_sem);
	do_brk(start, end - start);
	up_write(&current->mm->mmap_sem);
}


/* We need to explicitly zero any fractional pages
 * after the data section (i.e. bss).  This would
 * contain the junk from the file that should not
 * be in memory.
 */
static void padzero(unsigned long elf_bss)
{
	unsigned long nbyte;

	nbyte = elf_bss & (PAGE_SIZE-1);
	if (nbyte) {
		nbyte = PAGE_SIZE - nbyte;
		clear_user((void *) elf_bss, nbyte);
	}
}

static unsigned long * create_irix_tables(char * p, int argc, int envc,
	struct elfhdr * exec, unsigned int load_addr,
	unsigned int interp_load_addr, struct pt_regs *regs,
	struct elf_phdr *ephdr)
{
	elf_addr_t *argv;
	elf_addr_t *envp;
	elf_addr_t *sp, *csp;

#ifdef DEBUG
	printk("create_irix_tables: p[%p] argc[%d] envc[%d] "
	       "load_addr[%08x] interp_load_addr[%08x]\n",
	       p, argc, envc, load_addr, interp_load_addr);
#endif
	sp = (elf_addr_t *) (~15UL & (unsigned long) p);
	csp = sp;
	csp -= exec ? DLINFO_ITEMS*2 : 2;
	csp -= envc+1;
	csp -= argc+1;
	csp -= 1;		/* argc itself */
	if ((unsigned long)csp & 15UL) {
		sp -= (16UL - ((unsigned long)csp & 15UL)) / sizeof(*sp);
	}

	/*
	 * Put the ELF interpreter info on the stack
	 */
#define NEW_AUX_ENT(nr, id, val) \
	  __put_user ((id), sp+(nr*2)); \
	  __put_user ((val), sp+(nr*2+1)); \

	sp -= 2;
	NEW_AUX_ENT(0, AT_NULL, 0);

	if(exec) {
		sp -= 11*2;

		NEW_AUX_ENT (0, AT_PHDR, load_addr + exec->e_phoff);
		NEW_AUX_ENT (1, AT_PHENT, sizeof (struct elf_phdr));
		NEW_AUX_ENT (2, AT_PHNUM, exec->e_phnum);
		NEW_AUX_ENT (3, AT_PAGESZ, ELF_EXEC_PAGESIZE);
		NEW_AUX_ENT (4, AT_BASE, interp_load_addr);
		NEW_AUX_ENT (5, AT_FLAGS, 0);
		NEW_AUX_ENT (6, AT_ENTRY, (elf_addr_t) exec->e_entry);
		NEW_AUX_ENT (7, AT_UID, (elf_addr_t) current->uid);
		NEW_AUX_ENT (8, AT_EUID, (elf_addr_t) current->euid);
		NEW_AUX_ENT (9, AT_GID, (elf_addr_t) current->gid);
		NEW_AUX_ENT (10, AT_EGID, (elf_addr_t) current->egid);
	}
#undef NEW_AUX_ENT

	sp -= envc+1;
	envp = sp;
	sp -= argc+1;
	argv = sp;

	__put_user((elf_addr_t)argc,--sp);
	current->mm->arg_start = (unsigned long) p;
	while (argc-->0) {
		__put_user((unsigned long)p,argv++);
		p += strlen_user(p);
	}
	__put_user((unsigned long) NULL, argv);
	current->mm->arg_end = current->mm->env_start = (unsigned long) p;
	while (envc-->0) {
		__put_user((unsigned long)p,envp++);
		p += strlen_user(p);
	}
	__put_user((unsigned long) NULL, envp);
	current->mm->env_end = (unsigned long) p;
	return sp;
}


/* This is much more generalized than the library routine read function,
 * so we keep this separate.  Technically the library read function
 * is only provided so that we can read a.out libraries that have
 * an ELF header.
 */
static unsigned int load_irix_interp(struct elfhdr * interp_elf_ex,
				     struct file * interpreter,
				     unsigned int *interp_load_addr)
{
	struct elf_phdr *elf_phdata  =  NULL;
	struct elf_phdr *eppnt;
	unsigned int len;
	unsigned int load_addr;
	int elf_bss;
	int retval;
	unsigned int last_bss;
	int error;
	int i;
	unsigned int k;

	elf_bss = 0;
	last_bss = 0;
	error = load_addr = 0;

#ifdef DEBUG
	print_elfhdr(interp_elf_ex);
#endif

	/* First of all, some simple consistency checks */
	if ((interp_elf_ex->e_type != ET_EXEC &&
	     interp_elf_ex->e_type != ET_DYN) ||
	     !interpreter->f_op->mmap) {
		printk("IRIX interp has bad e_type %d\n", interp_elf_ex->e_type);
		return 0xffffffff;
	}

	/* Now read in all of the header information */
	if(sizeof(struct elf_phdr) * interp_elf_ex->e_phnum > PAGE_SIZE) {
	    printk("IRIX interp header bigger than a page (%d)\n",
		   (sizeof(struct elf_phdr) * interp_elf_ex->e_phnum));
	    return 0xffffffff;
	}

	elf_phdata = kmalloc(sizeof(struct elf_phdr) * interp_elf_ex->e_phnum,
			     GFP_KERNEL);

	if(!elf_phdata) {
          printk("Cannot kmalloc phdata for IRIX interp.\n");
	  return 0xffffffff;
	}

	/* If the size of this structure has changed, then punt, since
	 * we will be doing the wrong thing.
	 */
	if(interp_elf_ex->e_phentsize != 32) {
		printk("IRIX interp e_phentsize == %d != 32 ",
		       interp_elf_ex->e_phentsize);
		kfree(elf_phdata);
		return 0xffffffff;
	}

	retval = kernel_read(interpreter, interp_elf_ex->e_phoff,
			   (char *) elf_phdata,
			   sizeof(struct elf_phdr) * interp_elf_ex->e_phnum);

#ifdef DEBUG
	dump_phdrs(elf_phdata, interp_elf_ex->e_phnum);
#endif

	eppnt = elf_phdata;
	for(i=0; i<interp_elf_ex->e_phnum; i++, eppnt++) {
	  if(eppnt->p_type == PT_LOAD) {
	    int elf_type = MAP_PRIVATE | MAP_DENYWRITE;
	    int elf_prot = 0;
	    unsigned long vaddr = 0;
	    if (eppnt->p_flags & PF_R) elf_prot =  PROT_READ;
	    if (eppnt->p_flags & PF_W) elf_prot |= PROT_WRITE;
	    if (eppnt->p_flags & PF_X) elf_prot |= PROT_EXEC;
	    elf_type |= MAP_FIXED;
	    vaddr = eppnt->p_vaddr;

	    pr_debug("INTERP do_mmap(%p, %08lx, %08lx, %08lx, %08lx, %08lx) ",
		   interpreter, vaddr,
		   (unsigned long) (eppnt->p_filesz + (eppnt->p_vaddr & 0xfff)),
		   (unsigned long) elf_prot, (unsigned long) elf_type,
		   (unsigned long) (eppnt->p_offset & 0xfffff000));
	    down_write(&current->mm->mmap_sem);
	    error = do_mmap(interpreter, vaddr,
			    eppnt->p_filesz + (eppnt->p_vaddr & 0xfff),
			    elf_prot, elf_type,
			    eppnt->p_offset & 0xfffff000);
	    up_write(&current->mm->mmap_sem);

	    if(error < 0 && error > -1024) {
		    printk("Aieee IRIX interp mmap error=%d\n", error);
		    break;  /* Real error */
	    }
	    pr_debug("error=%08lx ", (unsigned long) error);
	    if(!load_addr && interp_elf_ex->e_type == ET_DYN) {
	      load_addr = error;
              pr_debug("load_addr = error ");
	    }

	    /* Find the end of the file  mapping for this phdr, and keep
	     * track of the largest address we see for this.
	     */
	    k = eppnt->p_vaddr + eppnt->p_filesz;
	    if(k > elf_bss) elf_bss = k;

	    /* Do the same thing for the memory mapping - between
	     * elf_bss and last_bss is the bss section.
	     */
	    k = eppnt->p_memsz + eppnt->p_vaddr;
	    if(k > last_bss) last_bss = k;
	    pr_debug("\n");
	  }
	}

	/* Now use mmap to map the library into memory. */
	if(error < 0 && error > -1024) {
		pr_debug("got error %d\n", error);
		kfree(elf_phdata);
		return 0xffffffff;
	}

	/* Now fill out the bss section.  First pad the last page up
	 * to the page boundary, and then perform a mmap to make sure
	 * that there are zero-mapped pages up to and including the
	 * last bss page.
	 */
	pr_debug("padzero(%08lx) ", (unsigned long) (elf_bss));
	padzero(elf_bss);
	len = (elf_bss + 0xfff) & 0xfffff000; /* What we have mapped so far */

	pr_debug("last_bss[%08lx] len[%08lx]\n", (unsigned long) last_bss,
	         (unsigned long) len);

	/* Map the last of the bss segment */
	if (last_bss > len) {
		down_write(&current->mm->mmap_sem);
		do_brk(len, (last_bss - len));
		up_write(&current->mm->mmap_sem);
	}
	kfree(elf_phdata);

	*interp_load_addr = load_addr;
	return ((unsigned int) interp_elf_ex->e_entry);
}

/* Check sanity of IRIX elf executable header. */
static int verify_binary(struct elfhdr *ehp, struct linux_binprm *bprm)
{
	if (memcmp(ehp->e_ident, ELFMAG, SELFMAG) != 0)
		return -ENOEXEC;

	/* First of all, some simple consistency checks */
	if((ehp->e_type != ET_EXEC && ehp->e_type != ET_DYN) ||
	    !bprm->file->f_op->mmap) {
		return -ENOEXEC;
	}

	/* XXX Don't support N32 or 64bit binaries yet because they can
	 * XXX and do execute 64 bit instructions and expect all registers
	 * XXX to be 64 bit as well.  We need to make the kernel save
	 * XXX all registers as 64bits on cpu's capable of this at
	 * XXX exception time plus frob the XTLB exception vector.
	 */
	if((ehp->e_flags & EF_MIPS_ABI2))
		return -ENOEXEC;

	return 0;
}

/*
 * This is where the detailed check is performed. Irix binaries
 * use interpreters with 'libc.so' in the name, so this function
 * can differentiate between Linux and Irix binaries.
 */
static inline int look_for_irix_interpreter(char **name,
					    struct file **interpreter,
					    struct elfhdr *interp_elf_ex,
					    struct elf_phdr *epp,
					    struct linux_binprm *bprm, int pnum)
{
	int i;
	int retval = -EINVAL;
	struct file *file = NULL;

	*name = NULL;
	for(i = 0; i < pnum; i++, epp++) {
		if (epp->p_type != PT_INTERP)
			continue;

		/* It is illegal to have two interpreters for one executable. */
		if (*name != NULL)
			goto out;

		*name = (char *) kmalloc((epp->p_filesz +
					  strlen(IRIX_EMUL)),
					 GFP_KERNEL);
		if (!*name)
			return -ENOMEM;

		strcpy(*name, IRIX_EMUL);
		retval = kernel_read(bprm->file, epp->p_offset, (*name + 16),
		                     epp->p_filesz);
		if (retval < 0)
			goto out;

		file = open_exec(*name);
		if (IS_ERR(file)) {
			retval = PTR_ERR(file);
			goto out;
		}
		retval = kernel_read(file, 0, bprm->buf, 128);
		if (retval < 0)
			goto dput_and_out;

		*interp_elf_ex = *(struct elfhdr *) bprm->buf;
	}
	*interpreter = file;
	return 0;

dput_and_out:
	fput(file);
out:
	kfree(*name);
	return retval;
}

static inline int verify_irix_interpreter(struct elfhdr *ihp)
{
	if (memcmp(ihp->e_ident, ELFMAG, SELFMAG) != 0)
		return -ELIBBAD;
	return 0;
}

#define EXEC_MAP_FLAGS (MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE)

static inline void map_executable(struct file *fp, struct elf_phdr *epp, int pnum,
				  unsigned int *estack, unsigned int *laddr,
				  unsigned int *scode, unsigned int *ebss,
				  unsigned int *ecode, unsigned int *edata,
				  unsigned int *ebrk)
{
	unsigned int tmp;
	int i, prot;

	for(i = 0; i < pnum; i++, epp++) {
		if(epp->p_type != PT_LOAD)
			continue;

		/* Map it. */
		prot  = (epp->p_flags & PF_R) ? PROT_READ : 0;
		prot |= (epp->p_flags & PF_W) ? PROT_WRITE : 0;
		prot |= (epp->p_flags & PF_X) ? PROT_EXEC : 0;
	        down_write(&current->mm->mmap_sem);
		(void) do_mmap(fp, (epp->p_vaddr & 0xfffff000),
			       (epp->p_filesz + (epp->p_vaddr & 0xfff)),
			       prot, EXEC_MAP_FLAGS,
			       (epp->p_offset & 0xfffff000));
	        up_write(&current->mm->mmap_sem);

		/* Fixup location tracking vars. */
		if((epp->p_vaddr & 0xfffff000) < *estack)
			*estack = (epp->p_vaddr & 0xfffff000);
		if(!*laddr)
			*laddr = epp->p_vaddr - epp->p_offset;
		if(epp->p_vaddr < *scode)
			*scode = epp->p_vaddr;

		tmp = epp->p_vaddr + epp->p_filesz;
		if(tmp > *ebss)
			*ebss = tmp;
		if((epp->p_flags & PF_X) && *ecode < tmp)
			*ecode = tmp;
		if(*edata < tmp)
			*edata = tmp;

		tmp = epp->p_vaddr + epp->p_memsz;
		if(tmp > *ebrk)
			*ebrk = tmp;
	}

}

static inline int map_interpreter(struct elf_phdr *epp, struct elfhdr *ihp,
				  struct file *interp, unsigned int *iladdr,
				  int pnum, mm_segment_t old_fs,
				  unsigned int *eentry)
{
	int i;

	*eentry = 0xffffffff;
	for(i = 0; i < pnum; i++, epp++) {
		if(epp->p_type != PT_INTERP)
			continue;

		/* We should have fielded this error elsewhere... */
		if(*eentry != 0xffffffff)
			return -1;

		set_fs(old_fs);
		*eentry = load_irix_interp(ihp, interp, iladdr);
		old_fs = get_fs();
		set_fs(get_ds());

		fput(interp);

		if (*eentry == 0xffffffff)
			return -1;
	}
	return 0;
}

/*
 * IRIX maps a page at 0x200000 that holds information about the
 * process and the system, here we map the page and fill the
 * structure
 */
static void irix_map_prda_page(void)
{
	unsigned long v;
	struct prda *pp;

	down_write(&current->mm->mmap_sem);
	v =  do_brk (PRDA_ADDRESS, PAGE_SIZE);
	up_write(&current->mm->mmap_sem);

	if (v < 0)
		return;

	pp = (struct prda *) v;
	pp->prda_sys.t_pid  = current->pid;
	pp->prda_sys.t_prid = read_c0_prid();
	pp->prda_sys.t_rpid = current->pid;

	/* We leave the rest set to zero */
}



/* These are the functions used to load ELF style executables and shared
 * libraries.  There is no binary dependent code anywhere else.
 */
static int load_irix_binary(struct linux_binprm * bprm, struct pt_regs * regs)
{
	struct elfhdr elf_ex, interp_elf_ex;
	struct file *interpreter;
	struct elf_phdr *elf_phdata, *elf_ihdr, *elf_ephdr;
	unsigned int load_addr, elf_bss, elf_brk;
	unsigned int elf_entry, interp_load_addr = 0;
	unsigned int start_code, end_code, end_data, elf_stack;
	int retval, has_interp, has_ephdr, size, i;
	char *elf_interpreter;
	mm_segment_t old_fs;

	load_addr = 0;
	has_interp = has_ephdr = 0;
	elf_ihdr = elf_ephdr = NULL;
	elf_ex = *((struct elfhdr *) bprm->buf);
	retval = -ENOEXEC;

	if (verify_binary(&elf_ex, bprm))
		goto out;

	/*
	 * Telling -o32 static binaries from Linux and Irix apart from each
	 * other is difficult. There are 2 differences to be noted for static
	 * binaries from the 2 operating systems:
	 *
	 *    1) Irix binaries have their .text section before their .init
	 *       section. Linux binaries are just the opposite.
	 *
	 *    2) Irix binaries usually have <= 12 sections and Linux
	 *       binaries have > 20.
	 *
	 * We will use Method #2 since Method #1 would require us to read in
	 * the section headers which is way too much overhead. This appears
	 * to work for everything we have ran into so far. If anyone has a
	 * better method to tell the binaries apart, I'm listening.
	 */
	if (elf_ex.e_shnum > 20)
		goto out;

#ifdef DEBUG
	print_elfhdr(&elf_ex);
#endif

	/* Now read in all of the header information */
	size = elf_ex.e_phentsize * elf_ex.e_phnum;
	if (size > 65536)
		goto out;
	elf_phdata = kmalloc(size, GFP_KERNEL);
	if (elf_phdata == NULL) {
		retval = -ENOMEM;
		goto out;
	}

	retval = kernel_read(bprm->file, elf_ex.e_phoff, (char *)elf_phdata, size);
	if (retval < 0)
		goto out_free_ph;

#ifdef DEBUG
	dump_phdrs(elf_phdata, elf_ex.e_phnum);
#endif

	/* Set some things for later. */
	for(i = 0; i < elf_ex.e_phnum; i++) {
		switch(elf_phdata[i].p_type) {
		case PT_INTERP:
			has_interp = 1;
			elf_ihdr = &elf_phdata[i];
			break;
		case PT_PHDR:
			has_ephdr = 1;
			elf_ephdr = &elf_phdata[i];
			break;
		};
	}

	pr_debug("\n");

	elf_bss = 0;
	elf_brk = 0;

	elf_stack = 0xffffffff;
	elf_interpreter = NULL;
	start_code = 0xffffffff;
	end_code = 0;
	end_data = 0;

	/*
	 * If we get a return value, we change the value to be ENOEXEC
	 * so that we can exit gracefully and the main binary format
	 * search loop in 'fs/exec.c' will move onto the next handler
	 * which should be the normal ELF binary handler.
	 */
	retval = look_for_irix_interpreter(&elf_interpreter, &interpreter,
					   &interp_elf_ex, elf_phdata, bprm,
					   elf_ex.e_phnum);
	if (retval) {
		retval = -ENOEXEC;
		goto out_free_file;
	}

	if (elf_interpreter) {
		retval = verify_irix_interpreter(&interp_elf_ex);
		if(retval)
			goto out_free_interp;
	}

	/* OK, we are done with that, now set up the arg stuff,
	 * and then start this sucker up.
	 */
	retval = -E2BIG;
	if (!bprm->sh_bang && !bprm->p)
		goto out_free_interp;

	/* Flush all traces of the currently running executable */
	retval = flush_old_exec(bprm);
	if (retval)
		goto out_free_dentry;

	/* OK, This is the point of no return */
	current->mm->end_data = 0;
	current->mm->end_code = 0;
	current->mm->mmap = NULL;
	current->flags &= ~PF_FORKNOEXEC;
	elf_entry = (unsigned int) elf_ex.e_entry;

	/* Do this so that we can load the interpreter, if need be.  We will
	 * change some of these later.
	 */
	set_mm_counter(current->mm, rss, 0);
	setup_arg_pages(bprm, STACK_TOP, EXSTACK_DEFAULT);
	current->mm->start_stack = bprm->p;

	/* At this point, we assume that the image should be loaded at
	 * fixed address, not at a variable address.
	 */
	old_fs = get_fs();
	set_fs(get_ds());

	map_executable(bprm->file, elf_phdata, elf_ex.e_phnum, &elf_stack,
	               &load_addr, &start_code, &elf_bss, &end_code,
	               &end_data, &elf_brk);

	if(elf_interpreter) {
		retval = map_interpreter(elf_phdata, &interp_elf_ex,
					 interpreter, &interp_load_addr,
					 elf_ex.e_phnum, old_fs, &elf_entry);
		kfree(elf_interpreter);
		if(retval) {
			set_fs(old_fs);
			printk("Unable to load IRIX ELF interpreter\n");
			send_sig(SIGSEGV, current, 0);
			retval = 0;
			goto out_free_file;
		}
	}

	set_fs(old_fs);

	kfree(elf_phdata);
	set_personality(PER_IRIX32);
	set_binfmt(&irix_format);
	compute_creds(bprm);
	current->flags &= ~PF_FORKNOEXEC;
	bprm->p = (unsigned long)
	  create_irix_tables((char *)bprm->p, bprm->argc, bprm->envc,
			(elf_interpreter ? &elf_ex : NULL),
			load_addr, interp_load_addr, regs, elf_ephdr);
	current->mm->start_brk = current->mm->brk = elf_brk;
	current->mm->end_code = end_code;
	current->mm->start_code = start_code;
	current->mm->end_data = end_data;
	current->mm->start_stack = bprm->p;

	/* Calling set_brk effectively mmaps the pages that we need for the
	 * bss and break sections.
	 */
	set_brk(elf_bss, elf_brk);

	/*
	 * IRIX maps a page at 0x200000 which holds some system
	 * information.  Programs depend on this.
	 */
	irix_map_prda_page();

	padzero(elf_bss);

	pr_debug("(start_brk) %lx\n" , (long) current->mm->start_brk);
	pr_debug("(end_code) %lx\n" , (long) current->mm->end_code);
	pr_debug("(start_code) %lx\n" , (long) current->mm->start_code);
	pr_debug("(end_data) %lx\n" , (long) current->mm->end_data);
	pr_debug("(start_stack) %lx\n" , (long) current->mm->start_stack);
	pr_debug("(brk) %lx\n" , (long) current->mm->brk);

#if 0 /* XXX No fucking way dude... */
	/* Why this, you ask???  Well SVr4 maps page 0 as read-only,
	 * and some applications "depend" upon this behavior.
	 * Since we do not have the power to recompile these, we
	 * emulate the SVr4 behavior.  Sigh.
	 */
	down_write(&current->mm->mmap_sem);
	(void) do_mmap(NULL, 0, 4096, PROT_READ | PROT_EXEC,
		       MAP_FIXED | MAP_PRIVATE, 0);
	up_write(&current->mm->mmap_sem);
#endif

	start_thread(regs, elf_entry, bprm->p);
	if (current->ptrace & PT_PTRACED)
		send_sig(SIGTRAP, current, 0);
	return 0;
out:
	return retval;

out_free_dentry:
	allow_write_access(interpreter);
	fput(interpreter);
out_free_interp:
	kfree(elf_interpreter);
out_free_file:
out_free_ph:
	kfree (elf_phdata);
	goto out;
}

/* This is really simpleminded and specialized - we are loading an
 * a.out library that is given an ELF header.
 */
static int load_irix_library(struct file *file)
{
	struct elfhdr elf_ex;
	struct elf_phdr *elf_phdata  =  NULL;
	unsigned int len = 0;
	int elf_bss = 0;
	int retval;
	unsigned int bss;
	int error;
	int i,j, k;

	error = kernel_read(file, 0, (char *) &elf_ex, sizeof(elf_ex));
	if (error != sizeof(elf_ex))
		return -ENOEXEC;

	if (memcmp(elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
		return -ENOEXEC;

	/* First of all, some simple consistency checks. */
	if(elf_ex.e_type != ET_EXEC || elf_ex.e_phnum > 2 ||
	   !file->f_op->mmap)
		return -ENOEXEC;

	/* Now read in all of the header information. */
	if(sizeof(struct elf_phdr) * elf_ex.e_phnum > PAGE_SIZE)
		return -ENOEXEC;

	elf_phdata = kmalloc(sizeof(struct elf_phdr) * elf_ex.e_phnum, GFP_KERNEL);
	if (elf_phdata == NULL)
		return -ENOMEM;

	retval = kernel_read(file, elf_ex.e_phoff, (char *) elf_phdata,
			   sizeof(struct elf_phdr) * elf_ex.e_phnum);

	j = 0;
	for(i=0; i<elf_ex.e_phnum; i++)
		if((elf_phdata + i)->p_type == PT_LOAD) j++;

	if(j != 1)  {
		kfree(elf_phdata);
		return -ENOEXEC;
	}

	while(elf_phdata->p_type != PT_LOAD) elf_phdata++;

	/* Now use mmap to map the library into memory. */
	down_write(&current->mm->mmap_sem);
	error = do_mmap(file,
			elf_phdata->p_vaddr & 0xfffff000,
			elf_phdata->p_filesz + (elf_phdata->p_vaddr & 0xfff),
			PROT_READ | PROT_WRITE | PROT_EXEC,
			MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE,
			elf_phdata->p_offset & 0xfffff000);
	up_write(&current->mm->mmap_sem);

	k = elf_phdata->p_vaddr + elf_phdata->p_filesz;
	if (k > elf_bss) elf_bss = k;

	if (error != (elf_phdata->p_vaddr & 0xfffff000)) {
		kfree(elf_phdata);
		return error;
	}

	padzero(elf_bss);

	len = (elf_phdata->p_filesz + elf_phdata->p_vaddr+ 0xfff) & 0xfffff000;
	bss = elf_phdata->p_memsz + elf_phdata->p_vaddr;
	if (bss > len) {
	  down_write(&current->mm->mmap_sem);
	  do_brk(len, bss-len);
	  up_write(&current->mm->mmap_sem);
	}
	kfree(elf_phdata);
	return 0;
}

/* Called through irix_syssgi() to map an elf image given an FD,
 * a phdr ptr USER_PHDRP in userspace, and a count CNT telling how many
 * phdrs there are in the USER_PHDRP array.  We return the vaddr the
 * first phdr was successfully mapped to.
 */
unsigned long irix_mapelf(int fd, struct elf_phdr *user_phdrp, int cnt)
{
	unsigned long type, vaddr, filesz, offset, flags;
	struct elf_phdr *hp;
	struct file *filp;
	int i, retval;

	pr_debug("irix_mapelf: fd[%d] user_phdrp[%p] cnt[%d]\n",
	         fd, user_phdrp, cnt);

	/* First get the verification out of the way. */
	hp = user_phdrp;
	if (!access_ok(VERIFY_READ, hp, (sizeof(struct elf_phdr) * cnt))) {
		pr_debug("irix_mapelf: bad pointer to ELF PHDR!\n");

		return -EFAULT;
	}

#ifdef DEBUG
	dump_phdrs(user_phdrp, cnt);
#endif

	for (i = 0; i < cnt; i++, hp++) {
		if (__get_user(type, &hp->p_type))
			return -EFAULT;
		if (type != PT_LOAD) {
			printk("irix_mapelf: One section is not PT_LOAD!\n");
			return -ENOEXEC;
		}
	}

	filp = fget(fd);
	if (!filp)
		return -EACCES;
	if(!filp->f_op) {
		printk("irix_mapelf: Bogon filp!\n");
		fput(filp);
		return -EACCES;
	}

	hp = user_phdrp;
	for(i = 0; i < cnt; i++, hp++) {
		int prot;

		retval = __get_user(vaddr, &hp->p_vaddr);
		retval |= __get_user(filesz, &hp->p_filesz);
		retval |= __get_user(offset, &hp->p_offset);
		retval |= __get_user(flags, &hp->p_flags);
		if (retval)
			return retval;

		prot  = (flags & PF_R) ? PROT_READ : 0;
		prot |= (flags & PF_W) ? PROT_WRITE : 0;
		prot |= (flags & PF_X) ? PROT_EXEC : 0;

		down_write(&current->mm->mmap_sem);
		retval = do_mmap(filp, (vaddr & 0xfffff000),
				 (filesz + (vaddr & 0xfff)),
				 prot, (MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE),
				 (offset & 0xfffff000));
		up_write(&current->mm->mmap_sem);

		if (retval != (vaddr & 0xfffff000)) {
			printk("irix_mapelf: do_mmap fails with %d!\n", retval);
			fput(filp);
			return retval;
		}
	}

	pr_debug("irix_mapelf: Success, returning %08lx\n",
		 (unsigned long) user_phdrp->p_vaddr);

	fput(filp);

	if (__get_user(vaddr, &user_phdrp->p_vaddr))
		return -EFAULT;

	return vaddr;
}

/*
 * ELF core dumper
 *
 * Modelled on fs/exec.c:aout_core_dump()
 * Jeremy Fitzhardinge <jeremy@sw.oz.au>
 */

/* These are the only things you should do on a core-file: use only these
 * functions to write out all the necessary info.
 */
static int dump_write(struct file *file, const void *addr, int nr)
{
	return file->f_op->write(file, (const char *) addr, nr, &file->f_pos) == nr;
}

static int dump_seek(struct file *file, off_t off)
{
	if (file->f_op->llseek) {
		if (file->f_op->llseek(file, off, 0) != off)
			return 0;
	} else
		file->f_pos = off;
	return 1;
}

/* Decide whether a segment is worth dumping; default is yes to be
 * sure (missing info is worse than too much; etc).
 * Personally I'd include everything, and use the coredump limit...
 *
 * I think we should skip something. But I am not sure how. H.J.
 */
static inline int maydump(struct vm_area_struct *vma)
{
	if (!(vma->vm_flags & (VM_READ|VM_WRITE|VM_EXEC)))
		return 0;
#if 1
	if (vma->vm_flags & (VM_WRITE|VM_GROWSUP|VM_GROWSDOWN))
		return 1;
	if (vma->vm_flags & (VM_READ|VM_EXEC|VM_EXECUTABLE|VM_SHARED))
		return 0;
#endif
	return 1;
}

#define roundup(x, y)  ((((x)+((y)-1))/(y))*(y))

/* An ELF note in memory. */
struct memelfnote
{
	const char *name;
	int type;
	unsigned int datasz;
	void *data;
};

static int notesize(struct memelfnote *en)
{
	int sz;

	sz = sizeof(struct elf_note);
	sz += roundup(strlen(en->name), 4);
	sz += roundup(en->datasz, 4);

	return sz;
}

/* #define DEBUG */

#define DUMP_WRITE(addr, nr)	\
	if (!dump_write(file, (addr), (nr))) \
		goto end_coredump;
#define DUMP_SEEK(off)	\
	if (!dump_seek(file, (off))) \
		goto end_coredump;

static int writenote(struct memelfnote *men, struct file *file)
{
	struct elf_note en;

	en.n_namesz = strlen(men->name);
	en.n_descsz = men->datasz;
	en.n_type = men->type;

	DUMP_WRITE(&en, sizeof(en));
	DUMP_WRITE(men->name, en.n_namesz);
	/* XXX - cast from long long to long to avoid need for libgcc.a */
	DUMP_SEEK(roundup((unsigned long)file->f_pos, 4));	/* XXX */
	DUMP_WRITE(men->data, men->datasz);
	DUMP_SEEK(roundup((unsigned long)file->f_pos, 4));	/* XXX */

	return 1;

end_coredump:
	return 0;
}
#undef DUMP_WRITE
#undef DUMP_SEEK

#define DUMP_WRITE(addr, nr)	\
	if (!dump_write(file, (addr), (nr))) \
		goto end_coredump;
#define DUMP_SEEK(off)	\
	if (!dump_seek(file, (off))) \
		goto end_coredump;

/* Actual dumper.
 *
 * This is a two-pass process; first we find the offsets of the bits,
 * and then they are actually written out.  If we run out of core limit
 * we just truncate.
 */
static int irix_core_dump(long signr, struct pt_regs * regs, struct file *file)
{
	int has_dumped = 0;
	mm_segment_t fs;
	int segs;
	int i;
	size_t size;
	struct vm_area_struct *vma;
	struct elfhdr elf;
	off_t offset = 0, dataoff;
	int limit = current->signal->rlim[RLIMIT_CORE].rlim_cur;
	int numnote = 4;
	struct memelfnote notes[4];
	struct elf_prstatus prstatus;	/* NT_PRSTATUS */
	elf_fpregset_t fpu;		/* NT_PRFPREG */
	struct elf_prpsinfo psinfo;	/* NT_PRPSINFO */

	/* Count what's needed to dump, up to the limit of coredump size. */
	segs = 0;
	size = 0;
	for (vma = current->mm->mmap; vma != NULL; vma = vma->vm_next) {
		if (maydump(vma))
		{
			int sz = vma->vm_end-vma->vm_start;

			if (size+sz >= limit)
				break;
			else
				size += sz;
		}

		segs++;
	}
#ifdef DEBUG
	printk("irix_core_dump: %d segs taking %d bytes\n", segs, size);
#endif

	/* Set up header. */
	memcpy(elf.e_ident, ELFMAG, SELFMAG);
	elf.e_ident[EI_CLASS] = ELFCLASS32;
	elf.e_ident[EI_DATA] = ELFDATA2LSB;
	elf.e_ident[EI_VERSION] = EV_CURRENT;
	elf.e_ident[EI_OSABI] = ELF_OSABI;
	memset(elf.e_ident+EI_PAD, 0, EI_NIDENT-EI_PAD);

	elf.e_type = ET_CORE;
	elf.e_machine = ELF_ARCH;
	elf.e_version = EV_CURRENT;
	elf.e_entry = 0;
	elf.e_phoff = sizeof(elf);
	elf.e_shoff = 0;
	elf.e_flags = 0;
	elf.e_ehsize = sizeof(elf);
	elf.e_phentsize = sizeof(struct elf_phdr);
	elf.e_phnum = segs+1;		/* Include notes. */
	elf.e_shentsize = 0;
	elf.e_shnum = 0;
	elf.e_shstrndx = 0;

	fs = get_fs();
	set_fs(KERNEL_DS);

	has_dumped = 1;
	current->flags |= PF_DUMPCORE;

	DUMP_WRITE(&elf, sizeof(elf));
	offset += sizeof(elf);				/* Elf header. */
	offset += (segs+1) * sizeof(struct elf_phdr);	/* Program headers. */

	/* Set up the notes in similar form to SVR4 core dumps made
	 * with info from their /proc.
	 */
	memset(&psinfo, 0, sizeof(psinfo));
	memset(&prstatus, 0, sizeof(prstatus));

	notes[0].name = "CORE";
	notes[0].type = NT_PRSTATUS;
	notes[0].datasz = sizeof(prstatus);
	notes[0].data = &prstatus;
	prstatus.pr_info.si_signo = prstatus.pr_cursig = signr;
	prstatus.pr_sigpend = current->pending.signal.sig[0];
	prstatus.pr_sighold = current->blocked.sig[0];
	psinfo.pr_pid = prstatus.pr_pid = current->pid;
	psinfo.pr_ppid = prstatus.pr_ppid = current->parent->pid;
	psinfo.pr_pgrp = prstatus.pr_pgrp = process_group(current);
	psinfo.pr_sid = prstatus.pr_sid = current->signal->session;
	if (current->pid == current->tgid) {
		/*
		 * This is the record for the group leader.  Add in the
		 * cumulative times of previous dead threads.  This total
		 * won't include the time of each live thread whose state
		 * is included in the core dump.  The final total reported
		 * to our parent process when it calls wait4 will include
		 * those sums as well as the little bit more time it takes
		 * this and each other thread to finish dying after the
		 * core dump synchronization phase.
		 */
		jiffies_to_timeval(current->utime + current->signal->utime,
		                   &prstatus.pr_utime);
		jiffies_to_timeval(current->stime + current->signal->stime,
		                   &prstatus.pr_stime);
	} else {
		jiffies_to_timeval(current->utime, &prstatus.pr_utime);
		jiffies_to_timeval(current->stime, &prstatus.pr_stime);
	}
	jiffies_to_timeval(current->signal->cutime, &prstatus.pr_cutime);
	jiffies_to_timeval(current->signal->cstime, &prstatus.pr_cstime);

	if (sizeof(elf_gregset_t) != sizeof(struct pt_regs)) {
		printk("sizeof(elf_gregset_t) (%d) != sizeof(struct pt_regs) "
		       "(%d)\n", sizeof(elf_gregset_t), sizeof(struct pt_regs));
	} else {
		*(struct pt_regs *)&prstatus.pr_reg = *regs;
	}

	notes[1].name = "CORE";
	notes[1].type = NT_PRPSINFO;
	notes[1].datasz = sizeof(psinfo);
	notes[1].data = &psinfo;
	i = current->state ? ffz(~current->state) + 1 : 0;
	psinfo.pr_state = i;
	psinfo.pr_sname = (i < 0 || i > 5) ? '.' : "RSDZTD"[i];
	psinfo.pr_zomb = psinfo.pr_sname == 'Z';
	psinfo.pr_nice = task_nice(current);
	psinfo.pr_flag = current->flags;
	psinfo.pr_uid = current->uid;
	psinfo.pr_gid = current->gid;
	{
		int i, len;

		set_fs(fs);

		len = current->mm->arg_end - current->mm->arg_start;
		len = len >= ELF_PRARGSZ ? ELF_PRARGSZ : len;
		(void *) copy_from_user(&psinfo.pr_psargs,
			       (const char *)current->mm->arg_start, len);
		for (i = 0; i < len; i++)
			if (psinfo.pr_psargs[i] == 0)
				psinfo.pr_psargs[i] = ' ';
		psinfo.pr_psargs[len] = 0;

		set_fs(KERNEL_DS);
	}
	strlcpy(psinfo.pr_fname, current->comm, sizeof(psinfo.pr_fname));

	notes[2].name = "CORE";
	notes[2].type = NT_TASKSTRUCT;
	notes[2].datasz = sizeof(*current);
	notes[2].data = current;

	/* Try to dump the FPU. */
	prstatus.pr_fpvalid = dump_fpu (regs, &fpu);
	if (!prstatus.pr_fpvalid) {
		numnote--;
	} else {
		notes[3].name = "CORE";
		notes[3].type = NT_PRFPREG;
		notes[3].datasz = sizeof(fpu);
		notes[3].data = &fpu;
	}

	/* Write notes phdr entry. */
	{
		struct elf_phdr phdr;
		int sz = 0;

		for(i = 0; i < numnote; i++)
			sz += notesize(&notes[i]);

		phdr.p_type = PT_NOTE;
		phdr.p_offset = offset;
		phdr.p_vaddr = 0;
		phdr.p_paddr = 0;
		phdr.p_filesz = sz;
		phdr.p_memsz = 0;
		phdr.p_flags = 0;
		phdr.p_align = 0;

		offset += phdr.p_filesz;
		DUMP_WRITE(&phdr, sizeof(phdr));
	}

	/* Page-align dumped data. */
	dataoff = offset = roundup(offset, PAGE_SIZE);

	/* Write program headers for segments dump. */
	for(vma = current->mm->mmap, i = 0;
		i < segs && vma != NULL; vma = vma->vm_next) {
		struct elf_phdr phdr;
		size_t sz;

		i++;

		sz = vma->vm_end - vma->vm_start;

		phdr.p_type = PT_LOAD;
		phdr.p_offset = offset;
		phdr.p_vaddr = vma->vm_start;
		phdr.p_paddr = 0;
		phdr.p_filesz = maydump(vma) ? sz : 0;
		phdr.p_memsz = sz;
		offset += phdr.p_filesz;
		phdr.p_flags = vma->vm_flags & VM_READ ? PF_R : 0;
		if (vma->vm_flags & VM_WRITE)
			phdr.p_flags |= PF_W;
		if (vma->vm_flags & VM_EXEC)
			phdr.p_flags |= PF_X;
		phdr.p_align = PAGE_SIZE;

		DUMP_WRITE(&phdr, sizeof(phdr));
	}

	for(i = 0; i < numnote; i++)
		if (!writenote(&notes[i], file))
			goto end_coredump;

	set_fs(fs);

	DUMP_SEEK(dataoff);

	for(i = 0, vma = current->mm->mmap;
	    i < segs && vma != NULL;
	    vma = vma->vm_next) {
		unsigned long addr = vma->vm_start;
		unsigned long len = vma->vm_end - vma->vm_start;

		if (!maydump(vma))
			continue;
		i++;
#ifdef DEBUG
		printk("elf_core_dump: writing %08lx %lx\n", addr, len);
#endif
		DUMP_WRITE((void *)addr, len);
	}

	if ((off_t) file->f_pos != offset) {
		/* Sanity check. */
		printk("elf_core_dump: file->f_pos (%ld) != offset (%ld)\n",
		       (off_t) file->f_pos, offset);
	}

end_coredump:
	set_fs(fs);
	return has_dumped;
}

static int __init init_irix_binfmt(void)
{
	extern int init_inventory(void);
	extern asmlinkage unsigned long sys_call_table;
	extern asmlinkage unsigned long sys_call_table_irix5;

	init_inventory();

	/*
	 * Copy the IRIX5 syscall table (8000 bytes) into the main syscall
	 * table. The IRIX5 calls are located by an offset of 8000 bytes
	 * from the beginning of the main table.
	 */
	memcpy((void *) ((unsigned long) &sys_call_table + 8000),
		&sys_call_table_irix5, 8000);

	return register_binfmt(&irix_format);
}

static void __exit exit_irix_binfmt(void)
{
	/*
	 * Remove the Irix ELF loader.
	 */
	unregister_binfmt(&irix_format);
}

module_init(init_irix_binfmt)
module_exit(exit_irix_binfmt)
h Dr. S: San Jose, CA 95110 S: USA N: Martin Mares E: mj@ucw.cz W: http://www.ucw.cz/~mj/ D: BIOS video mode handling code D: MOXA C-218 serial board driver D: Network autoconfiguration D: PCI subsystem D: Random kernel hacking S: Kankovskeho 1241 S: 182 00 Praha 8 S: Czech Republic N: John A. Martin E: jam@acm.org W: http://www.tux.org/~jam/ P: 1024/04456D53 9D A3 6C 6B 88 80 8A 61 D7 06 22 4F 95 40 CE D2 P: 1024/3B986635 5A61 7EE6 9E20 51FB 59FB 2DA5 3E18 DD55 3B98 6635 D: FSSTND contributor D: Credit file compilator N: Kevin E. Martin E: martin@cs.unc.edu D: Developed original accelerated X servers included in XFree86 D: XF86_Mach64 D: XF86_Mach32 D: XF86_Mach8 D: XF86_8514 D: cfdisk (curses based disk partitioning program) N: John S. Marvin E: jsm@fc.hp.com D: PA-RISC port S: Hewlett Packard S: MS 42 S: 3404 E. Harmony Road S: Fort Collins, CO 80528 S: USA N: Torben Mathiasen E: torben.mathiasen@compaq.com E: torben@kernel.dk W: http://tlan.kernel.dk D: ThunderLAN maintainer D: ThunderLAN updates and other kernel fixes. S: Bremensgade 29, st.th S: 2300 Copenhagen S S: Denmark N: Claudio S. Matsuoka E: cmatsuoka@gmail.com E: claudio@mandriva.com W: http://helllabs.org/~claudio D: V4L, OV511 and HDA-codec hacks S: Conectiva S.A. S: Souza Naves 1250 S: 80050-040 Curitiba PR S: Brazil N: Heinz Mauelshagen E: mge@EZ-Darmstadt.Telekom.de D: Logical Volume Manager S: Bartningstr. 12 S: 64289 Darmstadt S: Germany N: Mark W. McClelland E: mmcclell@bigfoot.com E: mark@alpha.dyndns.org W: http://alpha.dyndns.org/ov511/ P: 1024D/357375CC 317C 58AC 1B39 2AB0 AB96 EB38 0B6F 731F 3573 75CC D: OV511 driver S: (address available on request) S: USA N: Ian McDonald E: ian.mcdonald@jandi.co.nz E: imcdnzl@gmail.com W: http://wand.net.nz/~iam4 W: http://imcdnzl.blogspot.com D: DCCP, CCID3 S: Hamilton S: New Zealand N: Patrick McHardy E: kaber@trash.net P: 1024D/12155E80 B128 7DE6 FF0A C2B2 48BE AB4C C9D4 964E 1215 5E80 D: netfilter: endless number of bugfixes D: netfilter: CLASSIFY target D: netfilter: addrtype match D: tc: HFSC scheduler S: Freiburg S: Germany N: Paul E. McKenney E: paulmck@us.ibm.com W: http://www.rdrop.com/users/paulmck/ D: RCU and variants D: rcutorture module N: Mike McLagan E: mike.mclagan@linux.org W: http://www.invlogic.com/~mmclagan D: DLCI/FRAD drivers for Sangoma SDLAs S: Innovative Logic Corp S: Post Office Box 1068 S: Laurel, Maryland 20732 S: USA N: Bradley McLean E: brad@bradpc.gaylord.com D: Device driver hacker D: General kernel debugger S: 249 Nichols Avenue S: Syracuse, New York 13206 S: USA N: Kyle McMartin E: kyle@parisc-linux.org D: Linux/PARISC hacker D: AD1889 sound driver S: Ottawa, Canada N: Dirk Melchers E: dirk@merlin.nbg.sub.org D: 8 bit XT hard disk driver for OMTI5520 S: Schloessleinsgasse 31 S: D-90453 Nuernberg S: Germany N: Arnaldo Carvalho de Melo E: acme@ghostprotocols.net E: arnaldo.melo@gmail.com E: acme@redhat.com W: http://oops.ghostprotocols.net:81/blog/ P: 1024D/9224DF01 D5DF E3BB E3C8 BCBB F8AD 841A B6AB 4681 9224 DF01 D: IPX, LLC, DCCP, cyc2x, wl3501_cs, net/ hacks S: Brazil N: Karsten Merker E: merker@linuxtag.org D: DECstation framebuffer drivers S: Germany N: Michael Meskes E: meskes@debian.org P: 1024/04B6E8F5 6C 77 33 CA CC D6 22 03 AB AB 15 A3 AE AD 39 7D D: Kernel hacker. PostgreSQL hacker. Software watchdog daemon. D: Maintainer of several Debian packages S: Th.-Heuss-Str. 61 S: D-41812 Erkelenz S: Germany N: Nigel Metheringham E: Nigel.Metheringham@ThePLAnet.net P: 1024/31455639 B7 99 BD B8 00 17 BD 46 C1 15 B8 AB 87 BC 25 FA D: IP Masquerading work and minor fixes S: Planet Online S: The White House, Melbourne Street, LEEDS S: LS2 7PS, United Kingdom N: Craig Metz E: cmetz@inner.net D: Some of PAS 16 mixer & PCM support, inet6-apps N: William (Bill) Metzenthen E: billm@suburbia.net D: Author of the FPU emulator. D: Minor kernel hacker for other lost causes (Hercules mono, etc). S: 22 Parker Street S: Ormond S: Victoria 3163 S: Australia N: Pauline Middelink E: middelin@polyware.nl D: General low-level bug fixes, /proc fixes, identd support D: Author of IP masquerading D: Zoran ZR36120 Video For Linux driver S: Boterkorfhoek 34 S: 7546 JA Enschede S: Netherlands N: David S. Miller E: davem@davemloft.net D: Sparc and blue box hacker D: Vger Linux mailing list co-maintainer D: Linux Emacs elf/qmagic support + other libc/gcc things D: Yee bore de yee bore! ;-) S: 575 Harrison St. #103 S: San Francisco, CA 94105 S: USA N: Rick Miller E: rdmiller@execpc.com W: http://www.execpc.com/~rdmiller/ D: Original Linux Device Registrar (Major/minor numbers) D: au-play, bwBASIC S: S78 W16203 Woods Road S: Muskego, Wisconsin 53150 S: USA N: Harald Milz E: hm@seneca.linux.de D: Linux Projects Map, Linux Commercial-HOWTO D: general Linux publicity in Germany, vacation port D: UUCP and CNEWS binary packages for LST S: Editorial Board iX Mag S: Helstorfer Str. 7 S: D-30625 Hannover S: Germany N: Corey Minyard E: minyard@wf-rch.cirr.com E: minyard@mvista.com W: http://home.attbi.com/~minyard D: Sony CDU31A CDROM Driver D: IPMI driver D: Various networking fixes long ago D: Original ppc_md work D: Shared zlib S: 7406 Wheat Field Rd S: Garland, Texas 75044 S: USA N: Kazunori Miyazawa E: miyazawa@linux-ipv6.org E: Kazunori.Miyazawa@jp.yokogawa.com E: kazunori@miyazawa.org W: http://www.miyazawa.org/~kazunori/ D: IPsec, IPv6 D: USAGI/WIDE Project, Yokogawa Electric Corporation S: 2-20-4-203, Nakacho, S: Musashino, Tokyo 180-0006 S: Japan N: Patrick Mochel E: mochel@osdl.org E: mochelp@infinity.powertie.org D: PCI Power Management, ACPI work S: 12725 SW Millikan Way, Suite 400 S: Beaverton, Oregon 97005 S: USA N: Eberhard Mönkeberg E: emoenke@gwdg.de D: CDROM driver "sbpcd" (Matsushita/Panasonic/Soundblaster) S: Ruhstrathöhe 2 b. S: D-37085 Göttingen S: Germany N: Thomas Molina E: tmolina@cablespeed.com D: bug fixes, documentation, minor hackery N: Paul Moore E: paul.moore@hp.com D: NetLabel author S: Hewlett-Packard S: 110 Spit Brook Road S: Nashua, NH 03062 N: James Morris E: jmorris@namei.org W: http://namei.org/ D: Netfilter, Linux Security Modules (LSM), SELinux, IPSec, D: Crypto API, general networking, miscellaneous. S: PO Box 707 S: Spit Junction NSW 2088 S: Australia N: David Mosberger-Tang E: davidm@hpl.hp.com if IA-64 related, else David.Mosberger@acm.org D: Linux/Alpha and Linux/ia64 S: 35706 Runckel Lane S: Fremont, California 94536 S: USA N: Sam Mosel E: sam.mosel@computer.org D: Wacom Intuos USB Support S: 22 Seaview St S: Fullarton 5063 S: South Australia N: Wolfgang Muees E: wolfgang@iksw-muees.de D: Auerswald USB driver N: Paul Mundt E: paul.mundt@gmail.com D: SuperH maintainer N: Ian A. Murdock E: imurdock@gnu.ai.mit.edu D: Creator of Debian distribution S: 30 White Tail Lane S: Lafayette, Indiana 47905 S: USA N: Scott Murray E: scottm@somanetworks.com E: scott@spiteful.org D: OPL3-SA2, OPL3-SA3 sound driver D: CompactPCI hotplug core D: Ziatech ZT5550 and generic CompactPCI hotplug drivers S: Toronto, Ontario S: Canada N: Zwane Mwaikambo E: zwanem@gmail.com D: Various driver hacking D: Lowlevel x86 kernel hacking D: General debugging S: (ask for current address) S: Tanzania N: Trond Myklebust E: trond.myklebust@fys.uio.no D: current NFS client hacker. S: Dagaliveien 31e S: N-0391 Oslo S: Norway N: Johan Myreen E: jem@iki.fi D: PS/2 mouse driver writer etc. S: Dragonvagen 1 A 13 S: FIN-00330 Helsingfors S: Finland N: Matija Nalis E: mnalis@jagor.srce.hr E: mnalis@voyager.hr D: Maintainer of the Umsdos file system S: Listopadska 7 S: 10000 Zagreb S: Croatia N: Jonathan Naylor E: g4klx@g4klx.demon.co.uk E: g4klx@amsat.org W: http://zone.pspt.fi/~jsn/ D: AX.25, NET/ROM and ROSE amateur radio protocol suites D: CCITT X.25 PLP and LAPB. S: 24 Castle View Drive S: Cromford S: Matlock S: Derbyshire DE4 3RL S: United Kingdom N: Ian S. Nelson E: nelsonis@earthlink.net P: 1024D/00D3D983 3EFD 7B86 B888 D7E2 29B6 9E97 576F 1B97 00D3 D983 D: Minor mmap and ide hacks S: 1370 Atlantis Ave. S: Lafayette CO, 80026 S: USA N: Russell Nelson E: nelson@crynwr.com W: http://www.crynwr.com/~nelson P: 1024/83942741 FF 68 EE 27 A0 5A AA C3 F5 DC 05 62 BD 5B 20 2F D: Author of cs89x0, maintainer of kernel changelog through 1.3.3 D: Wrote many packet drivers, from which some Ethernet drivers are derived. S: 521 Pleasant Valley Road S: Potsdam, New York 13676 S: USA N: Dave Neuer E: dave.neuer@pobox.com D: Helped implement support for Compaq's H31xx series iPAQs D: Other mostly minor tweaks & bugfixes N: Michael Neuffer E: mike@i-Connect.Net E: neuffer@goofy.zdv.uni-mainz.de W: http://www.i-Connect.Net/~mike/ D: Developer and maintainer of the EATA-DMA SCSI driver D: Co-developer EATA-PIO SCSI driver D: /proc/scsi and assorted other snippets S: Zum Schiersteiner Grund 2 S: 55127 Mainz S: Germany N: Gustavo Niemeyer E: niemeyer@conectiva.com W: https://moin.conectiva.com.br/GustavoNiemeyer D: wl3501 PCMCIA wireless card initial support for wireless extensions in 2.4 S: Conectiva S.A. S: R. Tocantins 89 S: 80050-430 Curitiba PR S: Brazil N: David C. Niemi E: niemi@tux.org W: http://www.tux.org/~niemi/ D: Assistant maintainer of Mtools, fdutils, and floppy driver D: Administrator of Tux.Org Linux Server, http://www.tux.org S: 2364 Old Trail Drive S: Reston, Virginia 20191 S: USA N: Fredrik Noring E: noring@nocrew.org W: http://www.lysator.liu.se/~noring/ D: dsp56k device driver N: Michael O'Reilly E: michael@iinet.com.au E: oreillym@tartarus.uwa.edu.au D: Wrote the original dynamic sized disk cache stuff. I think the only D: part that remains is the GFP_KERNEL et al #defines. :) S: 192 Nichsolson Road S: Subiaco, 6008 S: Perth, Western Australia S: Australia N: Miguel Ojeda Sandonis E: miguel.ojeda.sandonis@gmail.com W: http://miguelojeda.es W: http://jair.lab.fi.uva.es/~migojed/ D: Author of the ks0108, cfag12864b and cfag12864bfb auxiliary display drivers. D: Maintainer of the auxiliary display drivers tree (drivers/auxdisplay/*) S: C/ Mieses 20, 9-B S: Valladolid 47009 S: Spain N: Gadi Oxman E: gadio@netvision.net.il D: Original author and maintainer of IDE/ATAPI floppy/tape drivers N: Greg Page E: gpage@sovereign.org D: IPX development and support N: Venkatesh Pallipadi (Venki) D: x86/HPET N: David Parsons E: orc@pell.chi.il.us D: improved memory detection code. N: Ivan Passos E: ivan@cyclades.com D: Author of the Cyclades-PC300 synchronous card driver D: Maintainer of the Cyclom-Y/Cyclades-Z asynchronous card driver S: Cyclades Corp S: 41934 Christy St S: Fremont, CA 94538 S: USA N: Mikulas Patocka E: mikulas@artax.karlin.mff.cuni.cz W: http://artax.karlin.mff.cuni.cz/~mikulas/ P: 1024/BB11D2D5 A0 F1 28 4A C4 14 1E CF 92 58 7A 8F 69 BC A4 D3 D: Read/write HPFS filesystem S: Weissova 8 S: 644 00 Brno S: Czech Republic N: Vojtech Pavlik E: vojtech@suse.cz D: Joystick driver D: arcnet-hardware readme D: Minor ARCnet hacking D: USB (HID, ACM, Printer ...) S: Ucitelska 1576 S: Prague 8 S: 182 00 Czech Republic N: Rick Payne D: RFC2385 Support for TCP N: Barak A. Pearlmutter E: bap@cs.unm.edu W: http://www.cs.unm.edu/~bap/ P: 512/602D785D 9B A1 83 CD EE CB AD 93 20 C6 4C B7 F5 E9 60 D4 D: Author of mark-and-sweep GC integrated by Alan Cox S: Computer Science Department S: FEC 313 S: University of New Mexico S: Albuquerque, New Mexico 87131 S: USA N: Avery Pennarun E: apenwarr@worldvisions.ca W: http://www.worldvisions.ca/~apenwarr/ D: ARCnet driver D: "make xconfig" improvements D: Various minor hacking S: RR #5, 497 Pole Line Road S: Thunder Bay, Ontario S: CANADA P7C 5M9 N: Inaky Perez-Gonzalez E: inaky.perez-gonzalez@intel.com E: linux-wimax@intel.com E: inakypg@yahoo.com D: WiMAX stack D: Intel Wireless WiMAX Connection 2400 driver N: Yuri Per E: yuri@pts.mipt.ru D: Some smbfs fixes S: Demonstratsii 8-382 S: Tula 300000 S: Russia N: Inaky Perez-Gonzalez E: inaky.perez-gonzalez@intel.com D: UWB stack, HWA-RC driver and HWA-HC drivers D: Wireless USB additions to the USB stack D: WiMedia Link Protocol bits and pieces N: Gordon Peters E: GordPeters@smarttech.com D: Isochronous receive for IEEE 1394 driver (OHCI module). D: Bugfixes for the aforementioned. S: Calgary, Alberta S: Canada N: Johnnie Peters E: jpeters@phx.mcd.mot.com D: Motorola PowerPC changes for PReP S: 2900 S. Diable Way S: Tempe, Arizona 85282 S: USA N: Kirk Petersen E: kirk@speakeasy.org W: http://www.speakeasy.org/~kirk/ D: implemented kmod D: modularized BSD Unix domain sockets N: Martin Kasper Petersen E: mkp@mkp.net D: PA-RISC port D: XFS file system D: kiobuf based block I/O work S: 314 Frank St. S: Ottawa, Ontario S: Canada K2P 0X8 N: Mikael Pettersson E: mikpelinux@gmail.com D: Miscellaneous fixes N: Reed H. Petty E: rhp@draper.net W: http://www.draper.net D: Loop device driver extensions D: Encryption transfer modules (no export) S: Post Office Box 1815 S: Harrison, Arkansas 72602-1815 S: USA N: Kai Petzke E: petzke@teltarif.de W: http://www.teltarif.de/ P: 1024/B42868C1 D9 59 B9 98 BB 93 05 38 2E 3E 31 79 C3 65 5D E1 D: Driver for Laser Magnetic Storage CD-ROM D: Some kernel bug fixes D: Port of the database Postgres D: Book: "Linux verstehen und anwenden" (Hanser-Verlag) S: Triftstra=DFe 55 S: 13353 Berlin S: Germany N: Emanuel Pirker E: epirker@edu.uni-klu.ac.at D: AIC5800 IEEE 1394, RAW I/O on 1394 D: Starter of Linux1394 effort S: ask per mail for current address N: Nicolas Pitre E: nico@fluxnic.net D: StrongARM SA1100 support integrator & hacker D: Xscale PXA architecture D: unified SMC 91C9x/91C11x ethernet driver (smc91x) S: Montreal, Quebec, Canada N: Ken Pizzini E: ken@halcyon.com D: CDROM driver "sonycd535" (Sony CDU-535/531) N: Stelian Pop E: stelian@popies.net P: 1024D/EDBB6147 7B36 0E07 04BC 11DC A7A0 D3F7 7185 9E7A EDBB 6147 D: random kernel hacks S: Paimpont, France N: Pete Popov E: pete_popov@yahoo.com D: Linux/MIPS AMD/Alchemy Port and mips hacking and debugging S: San Jose, CA 95134 S: USA N: Matt Porter E: mporter@kernel.crashing.org D: Motorola PowerPC PReP support D: cPCI PowerPC support D: Embedded PowerPC 4xx/6xx/7xx/74xx support S: Chandler, Arizona 85249 S: USA N: Frederic Potter E: fpotter@cirpack.com D: Some PCI kernel support N: Rui Prior E: rprior@inescn.pt D: ATM device driver for NICStAR based cards N: Stefan Probst E: sp@caldera.de D: The Linux Support Team Erlangen, 1993-97 S: Caldera (Deutschland) GmbH S: Lazarettstrasse 8 S: 91054 Erlangen S: Germany N: Giuliano Procida E: myxie@debian.org,gprocida@madge.com D: Madge Ambassador driver (Collage 155 Server ATM adapter) D: Madge Horizon driver (Collage 25 and 155 Client ATM adapters) P: 1024/93898735 D3 9E F4 F7 6D 8D 2F 3A 38 BA 06 7C 2B 33 43 7D S: Madge Networks S: Framewood Road S: Wexham SL3 6PJ S: United Kingdom N: Richard Purdie E: rpurdie@rpsys.net D: Backlight subsystem maintainer S: United Kingdom N: Daniel Quinlan E: quinlan@pathname.com W: http://www.pathname.com/~quinlan/ D: FSSTND coordinator; FHS editor D: random Linux documentation, patches, and hacks S: 4390 Albany Drive #41A S: San Jose, California 95129 S: USA N: Juan Quintela E: quintela@fi.udc.es D: Memory Management hacking S: LFCIA S: Departamento de Computación S: Universidade da Coruña S: E-15071 S: A Coruña S: Spain N: Augusto Cesar Radtke E: bishop@sekure.org W: http://bishop.sekure.org D: {copy,get,put}_user calls updates D: Miscellaneous hacks S: R. Otto Marquardt, 226 - Garcia S: 89020-350 Blumenau - Santa Catarina S: Brazil N: Goutham Rao E: goutham.rao@intel.com D: Linux/IA-64 S: 2200 Mission College Blvd S: Santa Clara, CA 95052 S: USA N: Eric S. Raymond E: esr@thyrsus.com W: http://www.tuxedo.org/~esr/ D: terminfo master file maintainer D: Editor: Installation HOWTO, Distributions HOWTO, XFree86 HOWTO D: Author: fetchmail, Emacs VC mode, Emacs GUD mode S: 6 Karen Drive S: Malvern, Pennsylvania 19355 S: USA N: Stefan Reinauer E: stepan@linux.de W: http://www.freiburg.linux.de/~stepan/ D: Modularization of some filesystems D: /proc/sound, minor fixes S: Schlossbergring 9 S: 79098 Freiburg S: Germany N: Thomas Renninger E: trenn@suse.de D: cpupowerutils S: SUSE Linux GmbH S: Germany N: Joerg Reuter E: jreuter@yaina.de W: http://yaina.de/jreuter/ W: http://www.qsl.net/dl1bke/ D: Generic Z8530 driver, AX.25 DAMA slave implementation D: Several AX.25 hacks N: Francois-Rene Rideau E: fare@tunes.org W: http://www.tunes.org/~fare D: petty kernel janitor (byteorder, ufs) S: 6, rue Augustin Thierry S: 75019 Paris S: France N: Rik van Riel E: riel@redhat.com W: http://www.surriel.com/ D: Linux-MM site, Documentation/sysctl/*, swap/mm readaround D: kswapd fixes, random kernel hacker, rmap VM, D: nl.linux.org administrator, minor scheduler additions S: Red Hat Boston S: 3 Lan Drive S: Westford, MA 01886 S: USA N: Pekka Riikonen E: priikone@poseidon.pspt.fi E: priikone@ssh.com D: Random kernel hacking and bug fixes D: International kernel patch project S: Kasarmikatu 11 A4 S: 70110 Kuopio S: Finland N: Tobias Ringström E: tori@unhappy.mine.nu D: Davicom DM9102(A)/DM9132/DM9801 fast ethernet driver N: Luca Risolia E: luca.risolia@studio.unibo.it P: 1024D/FCE635A4 88E8 F32F 7244 68BA 3958 5D40 99DA 5D2A FCE6 35A4 D: V4L driver for W996[87]CF JPEG USB Dual Mode Camera Chips D: V4L2 driver for SN9C10x PC Camera Controllers D: V4L2 driver for ET61X151 and ET61X251 PC Camera Controllers D: V4L2 driver for ZC0301 Image Processor and Control Chip S: Via Liberta' 41/A S: Osio Sotto, 24046, Bergamo S: Italy N: William E. Roadcap E: roadcapw@cfw.com W: http://www.cfw.com/~roadcapw D: Author of menu based configuration tool, Menuconfig. S: 1407 Broad Street S: Waynesboro, Virginia 22980 S: USA N: Andrew J. Robinson E: arobinso@nyx.net W: http://www.nyx.net/~arobinso D: Hayes ESP serial port driver N: Florian La Roche E: rzsfl@rz.uni-sb.de E: flla@stud.uni-sb.de D: Net programs and kernel net hacker S: Gaildorfer Str. 27 S: 7000 Stuttgart 50 S: Germany N: Christoph Rohland E: hans-christoph.rohland@sap.com E: ch.rohland@gmx.net D: shm fs, SYSV semaphores, af_unix S: Neue Heimat Str. 8 S: D-68789 St.Leon-Rot S: Germany N: Thiago Berlitz Rondon E: maluco@mileniumnet.com.br W: http://vivaldi.linuxms.com.br/~maluco D: Miscellaneous kernel hacker S: R. Anhanguera, 1487 - Ipiranga S: 79080-740 - Campo Grande - Mato Grosso do Sul S: Brazil N: Stephen Rothwell E: sfr@canb.auug.org.au W: http://www.canb.auug.org.au/~sfr P: 1024/BD8C7805 CD A4 9D 01 10 6E 7E 3B 91 88 FA D9 C8 40 AA 02 D: Boot/setup/build work for setup > 2K D: Author, APM driver D: Directory notification S: 66 Maltby Circuit S: Wanniassa ACT 2903 S: Australia N: Gerard Roudier E: groudier@free.fr D: Contributed to asynchronous read-ahead improvement S: 21 Rue Carnot S: 95170 Deuil La Barre S: France N: Sebastien Rougeaux E: Sebastien.Rougeaux@syseng.anu.edu.au D: IEEE 1394 OHCI module S: Research School of Information Science and Engineering S: The Australian National University, ACT 0200 S: Australia N: Aristeu Sergio Rozanski Filho E: aris@cathedrallabs.org D: Support for EtherExpress 10 ISA (i82595) in eepro driver D: User level driver support for input S: R. Jose Serrato, 130 - Santa Candida S: 82640-320 - Curitiba - Paraná S: Brazil N: Alessandro Rubini E: rubini@ipvvis.unipv.it D: the gpm mouse server and kernel support for it N: Philipp Rumpf E: prumpf@tux.org D: random bugfixes S: Drausnickstrasse 29 S: 91052 Erlangen S: Germany N: Paul `Rusty' Russell E: rusty@rustcorp.com.au W: http://ozlabs.org/~rusty D: Ruggedly handsome. D: netfilter, ipchains with Michael Neuling. S: 52 Moore St S: Turner ACT 2612 S: Australia N: Richard Russon (FlatCap) E: kernel@flatcap.org W: http://www.flatcap.org D: NTFS support D: LDM support (Win2000/XP Logical Disk Manager/Dynamic Disks) S: 50 Swansea Road S: Reading S: United Kingdom N: Bill Ryder E: bryder@sgi.com D: FTDI_SIO usb/serial converter driver W: http://reality.sgi.com/bryder_wellington/ftdi_sio S: I/3 Walter St S: Wellington S: New Zealand N: Sampo Saaristo E: sambo@cs.tut.fi D: Co-author of Multi-Protocol Over ATM (MPOA) S: Tampere University of Technology / Telecom lab S: Hermiankatu 12C S: FIN-33720 Tampere S: Finland N: Thomas Sailer E: t.sailer@alumni.ethz.ch E: HB9JNX@HB9W.CHE.EU (packet radio) D: Baycom driver S: Markusstrasse 18 S: 8006 Zuerich S: Switzerland N: Manuel Estrada Sainz D: Firmware loader (request_firmware) N: Wayne Salamon E: wsalamon@tislabs.com E: wsalamon@nai.com D: portions of the Linux Security Module (LSM) framework and security modules N: Robert Sanders E: gt8134b@prism.gatech.edu D: Dosemu N: Duncan Sands E: duncan.sands@free.fr W: http://topo.math.u-psud.fr/~sands D: Alcatel SpeedTouch USB driver S: 69 rue Dunois S: 75013 Paris S: France N: Dipankar Sarma E: dipankar@in.ibm.com D: RCU N: Yoshinori Sato E: ysato@users.sourceforge.jp D: uClinux for Renesas H8/300 (H8300) D: http://uclinux-h8.sourceforge.jp/ N: Hannu Savolainen E: hannu@opensound.com D: Maintainer of the sound drivers until 2.1.x days. D: Original compressed boot image support. S: Valurink. 4A11 S: 03600 Karkkila S: Finland N: Deepak Saxena E: dsaxena@plexity.net D: I2O kernel layer (config, block, core, pci, net). I2O disk support for LILO D: XScale(IOP, IXP) porting and other random ARM bits S: Portland, OR N: Eric Schenk E: Eric.Schenk@dna.lth.se D: Random kernel debugging. D: SYSV Semaphore code rewrite. D: Network layer debugging. D: Dial on demand facility (diald). S: Dag Hammerskjolds v. 3E S: S-226 64 LUND S: Sweden N: Henning P. Schmiedehausen E: hps@tanstaafl.de D: added PCI support to the serial driver S: Buckenhof, Germany N: Michael Schmitz E: D: Macintosh IDE Driver N: Peter De Schrijver E: stud11@cc4.kuleuven.ac.be D: Mitsumi CD-ROM driver patches March version S: Molenbaan 29 S: B2240 Zandhoven S: Belgium N: Martin Schulze E: joey@linux.de W: http://home.pages.de/~joey/ D: Random Linux Hacker, Linux Promoter D: CD-List, Books-List, Ex-FAQ D: Linux-Support, -Mailbox, -Stammtisch D: several improvements to system programs S: Oldenburg S: Germany N: Robert Schwebel E: robert@schwebel.de W: http://www.schwebel.de D: Embedded hacker and book author, D: AMD Elan support for Linux S: Pengutronix S: Braunschweiger Strasse 79 S: 31134 Hildesheim S: Germany N: Darren Senn E: sinster@darkwater.com D: Whatever I notice needs doing (so far: itimers, /proc) S: Post Office Box 64132 S: Sunnyvale, California 94088-4132 S: USA N: Stas Sergeev E: stsp@users.sourceforge.net D: PCM PC-Speaker driver D: misc fixes S: Russia N: Simon Shapiro E: shimon@i-Connect.Net W: http://www.-i-Connect.Net/~shimon D: SCSI debugging D: Maintainer of the Debian Kernel packages S: 14355 SW Allen Blvd., Suite #140 S: Beaverton, Oregon 97008 S: USA N: Mike Shaver E: shaver@hungry.org W: http://www.hungry.org/~shaver/ D: MIPS work, /proc/sys/net, misc net hacking S: 149 Union St. S: Kingston, Ontario S: Canada K7L 2P4 N: John Shifflett E: john@geolog.com E: jshiffle@netcom.com D: Always IN2000 SCSI driver D: wd33c93 SCSI driver (linux-m68k) S: San Jose, California S: USA N: Robert Siemer E: Robert.Siemer@gmx.de P: 2048/C99A4289 2F DC 17 2E 56 62 01 C8 3D F2 AC 09 F2 E5 DD EE D: miroSOUND PCM20 radio RDS driver, ACI rewrite S: Klosterweg 28 / i309 S: 76131 Karlsruhe S: Germany N: James Simmons E: jsimmons@infradead.org E: jsimmons@users.sf.net D: Frame buffer device maintainer D: input layer development D: tty/console layer D: various mipsel devices S: 115 Carmel Avenue S: El Cerrito CA 94530 S: USA N: Jaspreet Singh E: jaspreet@sangoma.com W: www.sangoma.com D: WANPIPE drivers & API Support for Sangoma S508/FT1 cards S: Sangoma Technologies Inc., S: 1001 Denison Street S: Suite 101 S: Markham, Ontario L3R 2Z6 S: Canada N: Rick Sladkey E: jrs@world.std.com D: utility hacker: Emacs, NFS server, mount, kmem-ps, UPS debugger, strace, GDB D: library hacker: RPC, profil(3), realpath(3), regexp.h D: kernel hacker: unnamed block devs, NFS client, fast select, precision timer S: 24 Avon Place S: Arlington, Massachusetts 02174 S: USA N: Craig Small E: csmall@triode.apana.org.au E: vk2xlz@gonzo.vk2xlz.ampr.org (packet radio) D: Gracilis PackeTwin device driver D: RSPF daemon S: 10 Stockalls Place S: Minto, NSW, 2566 S: Australia N: Stephen Smalley E: sds@tycho.nsa.gov D: portions of the Linux Security Module (LSM) framework and security modules N: Chris Smith E: csmith@convex.com D: Read only HPFS filesystem S: Richardson, Texas S: USA N: Christopher Smith E: x@xman.org D: Tulip net driver hacker N: Mark Smith E: mark.smith@comdev.cc D: Multicast support in bonding driver N: Miquel van Smoorenburg E: miquels@cistron.nl D: Kernel and net hacker. Sysvinit, minicom. doing Debian stuff. S: Cistron Internet Services S: PO-Box 297 S: 2400 AG, Alphen aan den Rijn S: The Netherlands N: Scott Snyder E: snyder@fnald0.fnal.gov D: ATAPI cdrom driver S: MS 352, Fermilab S: Post Office Box 500 S: Batavia, Illinois 60510 S: USA N: Leo Spiekman E: leo@netlabs.net W: http://www.netlabs.net/hp/leo/ D: Optics Storage 8000AT cdrom driver S: Cliffwood, New Jersey 07721 S: USA N: Manfred Spraul E: manfred@colorfullife.com W: http://www.colorfullife.com/~manfred D: Lots of tiny hacks. Larger improvements to SysV IPC msg, D: slab, pipe, select. S: 71701 Schwieberdingen S: Germany N: Andrew Stanley-Jones E: asj@lanmedia.com D: LanMedia Corp. Device WAN card device driver S: #102, 686 W. Maude Ave S: Sunyvale, CA 94086 S: USA N: Michael Still E: mikal@stillhq.com W: http://www.stillhq.com D: Various janitorial patches D: mandocs and mandocs_install build targets S: (Email me and ask) S: Australia N: Henrik Storner E: storner@image.dk W: http://www.image.dk/~storner/ W: http://www.sslug.dk/ D: Configure script: Invented tristate for module-configuration D: vfat/msdos integration, kerneld docs, Linux promotion D: Miscellaneous bug-fixes S: Chr. Winthersvej 1 B, st.th. S: DK-1860 Frederiksberg C S: Denmark N: Drew Sullivan E: drew@ss.org W: http://www.ss.org/ P: 1024/ACFFA969 5A 9C 42 AB E4 24 82 31 99 56 00 BF D3 2B 25 46 D: iBCS2 developer S: 22 Irvington Cres. S: Willowdale, Ontario S: Canada M2N 2Z1 N: Adam Sulmicki E: adam@cfar.umd.edu W: http://www.eax.com D: core networking fixes D: patch-kernel enhancements D: misc kernel fixes and updates N: Adrian Sun E: asun@cobaltnet.com D: hfs support D: alpha rtc port, random appletalk fixes S: Department of Zoology, University of Washington S: Seattle, WA 98195-1800 S: USA N: Eugene Surovegin E: ebs@ebshome.net W: http://kernel.ebshome.net/ P: 1024D/AE5467F1 FF22 39F1 6728 89F6 6E6C 2365 7602 F33D AE54 67F1 D: Embedded PowerPC 4xx: EMAC, I2C, PIC and random hacks/fixes S: Sunnyvale, California 94085 S: USA N: Corey Thomas E: corey@world.std.com W: http://world.std.com/~corey/index.html D: Raylink/WebGear wireless LAN device driver (ray_cs) author S: 145 Howard St. S: Northborough, MA 01532 S: USA N: Tommy Thorn E: Tommy.Thorn@irisa.fr W: http://www.irisa.fr/prive/thorn/index.html P: 512/B4AFC909 BC BF 6D B1 52 26 1E D6 E3 2F A3 24 2A 84 FE 21 D: Device driver hacker (aha1542 & plip) S: IRISA S: Universit=E9 de Rennes I S: F-35042 Rennes Cedex S: France N: Urs Thuermann E: urs.thuermann@volkswagen.de W: http://www.volkswagen.de D: Controller Area Network (network layer core) S: Brieffach 1776 S: 38436 Wolfsburg S: Germany N: Jon Tombs E: jon@gte.esi.us.es W: http://www.esi.us.es/~jon D: NFS mmap() D: XF86_S3 D: Kernel modules D: Parts of various other programs (xfig, open, ...) S: C/ Federico Garcia Lorca 1 10-A S: Sevilla 41005 S: Spain N: Linus Torvalds E: torvalds@linux-foundation.org D: Original kernel hacker S: Portland, Oregon 97005 S: USA N: Marcelo Tosatti E: marcelo@kvack.org D: v2.4 kernel maintainer S: Brazil N: Stefan Traby E: stefan@quant-x.com D: Minor Alpha kernel hacks S: Mitterlasznitzstr. 13 S: 8302 Nestelbach S: Austria N: Jeff Tranter E: tranter@pobox.com D: Enhancements to Joystick driver D: Author of Sound HOWTO and CD-ROM HOWTO D: Author of several small utilities D: (bogomips, scope, eject, statserial) S: 1 Laurie Court S: Kanata, Ontario S: Canada K2L 1S2 N: Andrew Tridgell E: tridge@samba.org W: http://samba.org/tridge/ D: dosemu, networking, samba S: 3 Ballow Crescent S: MacGregor A.C.T 2615 S: Australia N: Josh Triplett E: josh@joshtriplett.org P: 4096R/8AFF873D 758E 5042 E397 4BA3 3A9C 1E67 0ED9 A3DF 8AFF 873D D: RCU and rcutorture D: lock annotations, finding and fixing lock bugs D: kernel tinification N: Winfried Trümper E: winni@xpilot.org W: http://www.shop.de/~winni/ D: German HOWTO, Crash-Kurs Linux (German, 100 comprehensive pages) D: CD-Writing HOWTO, various mini-HOWTOs D: One-week tutorials on Linux twice a year (free of charge) D: Linux-Workshop Köln (aka LUG Cologne, Germany), Installfests S: Tacitusstr. 6 S: D-50968 Köln N: Tsu-Sheng Tsao E: tsusheng@scf.usc.edu D: IGMP(Internet Group Management Protocol) version 2 S: 2F 14 ALY 31 LN 166 SEC 1 SHIH-PEI RD S: Taipei S: Taiwan 112 S: Republic of China S: 24335 Delta Drive S: Diamond Bar, California 91765 S: USA N: Theodore Ts'o E: tytso@mit.edu D: Random Linux hacker D: Maintainer of tsx-11.mit.edu ftp archive D: Maintainer of c.o.l.* Usenet<->mail gateway D: Author of serial driver D: Author of the new e2fsck D: Author of job control and system call restart code D: Author of ramdisk device driver D: Author of loopback device driver D: Author of /dev/random driver S: MIT Room E40-343 S: 1 Amherst Street S: Cambridge, Massachusetts 02139 S: USA N: Simmule Turner E: sturner@tele-tv.com D: Added swapping to filesystem S: 4226 Landgreen Street S: Rockville, Maryland 20853 S: USA N: Stephen Tweedie E: sct@redhat.com P: 1024/E7A417AD E2 FE A4 20 34 EC ED FC 7D 7E 67 8D E0 31 D1 69 P: 1024D/43BE7544 D2A4 8556 08E6 90E7 076C BA3F 243F 20A4 43BE 7544 D: Second extended file system developer D: General filesystem hacker D: kswap vm management code S: 44 Campbell Park Crescent S: Edinburgh EH13 0HT S: United Kingdom N: Thomas Uhl E: uhl@sun1.rz.fh-heilbronn.de D: Application programmer D: Linux promoter D: Author of a German book on Linux S: Obere Heerbergstrasse 17 S: 97078 Wuerzburg S: Germany N: Greg Ungerer E: gerg@snapgear.com D: uClinux kernel hacker D: Port uClinux to the Motorola ColdFire CPU D: Author of Stallion multiport serial drivers S: SnapGear Inc. S: 825 Stanley St S: Woolloongabba. QLD. 4102 S: Australia N: Jeffrey A. Uphoff E: juphoff@transmeta.com E: jeff.uphoff@linux.org P: 1024/9ED505C5 D7 BB CA AA 10 45 40 1B 16 19 0A C0 38 A0 3E CB D: Linux Security/Alert mailing lists' moderator/maintainer. D: NSM (rpc.statd) developer. D: PAM S/Key module developer. D: 'dip' contributor. D: AIPS port, astronomical community support. S: Transmeta Corporation S: 2540 Mission College Blvd. S: Santa Clara, CA 95054 S: USA N: Matthias Urlichs E: smurf@smurf.noris.de E: smurf@debian.org E: matthias@urlichs.de D: Consultant, developer, kernel hacker D: In a previous life, worked on Streams/ISDN/BSD networking code for Linux S: Schleiermacherstrasse 12 S: 90491 Nuernberg S: Germany N: Geert Uytterhoeven E: geert@linux-m68k.org W: http://users.telenet.be/geertu/ P: 1024/862678A6 C51D 361C 0BD1 4C90 B275 C553 6EEA 11BA 8626 78A6 D: m68k/Amiga and PPC/CHRP Longtrail coordinator D: Frame buffer device and XF68_FBDev maintainer D: m68k IDE maintainer D: Amiga Zorro maintainer D: Amiga Buddha and Catweasel chipset IDE D: Atari Falcon chipset IDE D: Amiga Gayle chipset IDE D: mipsel NEC DDB Vrc-5074 S: Haterbeekstraat 55B S: B-3200 Aarschot S: Belgium N: Chris Vance E: cvance@tislabs.com E: cvance@nai.com D: portions of the Linux Security Module (LSM) framework and security modules N: Petr Vandrovec E: petr@vandrovec.name D: Small contributions to ncpfs D: Matrox framebuffer driver S: 21513 Conradia Ct S: Cupertino, CA 95014 S: USA N: Thibaut Varene E: T-Bone@parisc-linux.org W: http://www.parisc-linux.org/~varenet/ P: 1024D/B7D2F063 E67C 0D43 A75E 12A5 BB1C FA2F 1E32 C3DA B7D2 F063 D: PA-RISC port minion, PDC and GSCPS2 drivers, debuglocks and other bits D: Some ARM at91rm9200 bits, S1D13XXX FB driver, random patches here and there D: AD1889 sound driver S: Paris, France N: Heikki Vatiainen E: hessu@cs.tut.fi D: Co-author of Multi-Protocol Over ATM (MPOA), some LANE hacks S: Tampere University of Technology / Telecom lab S: Hermiankatu 12C S: FIN-33720 Tampere S: Finland N: Andrew Veliath E: andrewtv@usa.net D: Turtle Beach MultiSound sound driver S: USA N: Dirk Verworner D: Co-author of German book ``Linux-Kernel-Programmierung'' D: Co-founder of Berlin Linux User Group N: Riku Voipio E: riku.voipio@iki.fi D: Author of PCA9532 LED and Fintek f75375s hwmon driver D: Some random ARM board patches S: Finland N: Patrick Volkerding E: volkerdi@ftp.cdrom.com D: Produced the Slackware distribution, updated the SVGAlib D: patches for ghostscript, worked on color 'ls', etc. S: 301 15th Street S. S: Moorhead, Minnesota 56560 S: USA N: Jos Vos E: jos@xos.nl W: http://www.xos.nl/ D: Various IP firewall updates, ipfwadm S: X/OS Experts in Open Systems BV S: Kruislaan 419 S: 1098 VA Amsterdam S: The Netherlands N: Jeroen Vreeken E: pe1rxq@amsat.org W: http://www.chello.nl/~j.vreeken/ D: SE401 usb webcam driver D: ZD1201 usb wireless lan driver S: Maastrichterweg 63 S: 5554 GG Valkenswaard S: The Netherlands N: Mark Wallis E: mwallis@serialmonkey.com W: http://mark.serialmonkey.com D: Ralink rt2x00 WLAN driver S: Newcastle, Australia N: Peter Shaobo Wang E: pwang@mmdcorp.com W: http://www.mmdcorp.com/pw/linux D: Driver for Interphase ATM (i)Chip SAR adapter card family (x575, x525, x531). S: 1513 Brewster Dr. S: Carrollton, TX 75010 S: USA N: Tim Waugh E: tim@cyberelk.net D: Co-architect of the parallel-port sharing system S: 17 Curling Vale S: GUILDFORD S: Surrey S: GU2 7PJ S: United Kingdom N: Juergen Weigert E: jnweiger@immd4.informatik.uni-erlangen.de D: The Linux Support Team Erlangen N: David Weinehall E: tao@acc.umu.se P: 1024D/DC47CA16 7ACE 0FB0 7A74 F994 9B36 E1D1 D14E 8526 DC47 CA16 W: http://www.acc.umu.se/~tao/ D: v2.0 kernel maintainer D: Fixes for the NE/2-driver D: Miscellaneous MCA-support D: Cleanup of the Config-files N: Matt Welsh E: mdw@metalab.unc.edu W: http://www.cs.berkeley.edu/~mdw D: Original Linux Documentation Project coordinator D: Author, "Running Linux" (O'Reilly) D: Author, "Linux Installation and Getting Started" (LDP) and several HOWTOs D: Linuxdoc-SGML formatting system (now SGML-Tools) D: Device drivers for various high-speed network interfaces (Myrinet, ATM) D: Keithley DAS1200 device driver D: Original maintainer of sunsite WWW and FTP sites D: Original moderator of c.o.l.announce and c.o.l.answers S: Computer Science Division S: UC Berkeley S: Berkeley, CA 94720-1776 S: USA N: Harald Welte E: laforge@netfilter.org P: 1024D/30F48BFF DBDE 6912 8831 9A53 879B 9190 5DA5 C655 30F4 8BFF W: http://gnumonks.org/users/laforge D: netfilter: new nat helper infrastructure D: netfilter: ULOG, ECN, DSCP target D: netfilter: TTL match D: netfilter: IPv6 mangle table D: netfilter: various other hacks S: Berlin S: Germany N: Bill Wendling E: wendling@ganymede.isdn.uiuc.edu W: http://www.ncsa.uiuc.edu/~wendling/ D: Various random hacks. Mostly on poll/select logic. S: 605 E. Springfield Ave. S: Champaign, IL 61820 S: USA N: Mike Westall D: IBM Turboways 25 ATM Device Driver E: westall@cs.clemson.edu S: Department of Computer Science S: Clemson University S: Clemson SC 29634 USA N: Greg Wettstein E: greg@wind.rmcc.com D: Filesystem valid flag for MINIX filesystem. D: Minor kernel debugging. D: Development and maintenance of sysklogd. D: Monitoring of development kernels for long-term stability. D: Early implementations of Linux in a commercial environment. S: Dr. Greg Wettstein, Ph.D. S: Oncology Research Division Computing Facility S: Roger Maris Cancer Center S: 820 4th St. N. S: Fargo, North Dakota 58122 S: USA N: Steven Whitehouse E: steve@chygwyn.com W: http://www.chygwyn.com/~steve D: Linux DECnet project D: Minor debugging of other networking protocols. D: Misc bug fixes and GFS2 filesystem development N: Hans-Joachim Widmaier E: hjw@zvw.de D: AFFS rewrite S: Eichenweg 16 S: 73650 Winterbach S: Germany N: Urban Widmark E: urban@svenskatest.se D: via-rhine, misc net driver hacking N: Marco van Wieringen E: mvw@planets.elm.net D: Author of process accounting and diskquota S: Breeburgsingel 12 S: 2135 CN Hoofddorp S: The Netherlands N: Matthew Wilcox E: matthew@wil.cx W: ftp://ftp.uk.linux.org/pub/linux/people/willy/ D: Linux/PARISC hacker. Filesystem hacker. Random other hacking. Custom D: PPC port hacking. N: G\"unter Windau E: gunter@mbfys.kun.nl D: Some bug fixes in the polling printer driver (lp.c) S: University of Nijmegen S: Geert-Grooteplein Noord 21 S: 6525 EZ Nijmegen S: The Netherlands N: Ulrich Windl E: Ulrich.Windl@rz.uni-regensburg.de P: 1024/E843660D CF D7 43 A1 5A 49 14 25 7C 04 A0 6E 4C 3A AC 6D D: Supports NTP on Linux. Added PPS code. Fixed bugs in adjtimex(). S: Alte Regensburger Str. 11a S: 93149 Nittenau S: Germany N: Gertjan van Wingerde E: gwingerde@gmail.com D: Ralink rt2x00 WLAN driver D: Minix V2 file-system D: Misc fixes S: Geessinkweg 177 S: 7544 TX Enschede S: The Netherlands N: Lars Wirzenius E: liw@iki.fi D: Linux System Administrator's Guide, author, former maintainer D: comp.os.linux.announce, former moderator D: Linux Documentation Project, co-founder D: Original sprintf in kernel D: Original kernel README (for version 0.97) D: Linux News (electronic magazine, now dead), founder and former editor D: Meta-FAQ, originator, former maintainer D: INFO-SHEET, former maintainer D: Author of the longest-living linux bug N: Jonathan Woithe E: jwoithe@just42.net W: http:/www.just42.net/jwoithe D: ALS-007 sound card extensions to Sound Blaster driver S: 20 Jordan St S: Valley View, SA 5093 S: Australia N: Clifford Wolf E: god@clifford.at W: http://www.clifford.at/ D: Menuconfig/lxdialog improvement S: Foehrengasse 16 S: A-2333 Leopoldsdorf b. Wien S: Austria N: Roger E. Wolff E: R.E.Wolff@BitWizard.nl D: Written kmalloc/kfree D: Written Specialix IO8+ driver D: Written Specialix SX driver S: van Bronckhorststraat 12 S: 2612 XV Delft S: The Netherlands N: Thomas Woller D: CS461x Cirrus Logic sound driver N: David Woodhouse E: dwmw2@infradead.org D: JFFS2 file system, Memory Technology Device subsystem, D: various other stuff that annoyed me by not working. S: c/o Intel Corporation S: Pipers Way S: Swindon. SN3 1RJ S: England N: Chris Wright E: chrisw@sous-sol.org D: hacking on LSM framework and security modules. S: Portland, OR S: USA N: Michal Wronski E: michal.wronski@gmail.com D: POSIX message queues fs (with K. Benedyczak) S: Krakow S: Poland N: Frank Xia E: qx@math.columbia.edu D: Xiafs filesystem [defunct] S: 542 West 112th Street, 5N S: New York, New York 10025 S: USA N: Li Yang E: leoli@freescale.com D: Freescale Highspeed USB device driver D: Freescale QE SoC support and Ethernet driver S: B-1206 Jingmao Guojigongyu S: 16 Baliqiao Nanjie, Beijing 101100 S: People's Repulic of China N: Victor Yodaiken E: yodaiken@fsmlabs.com D: RTLinux (RealTime Linux) S: POB 1822 S: Socorro NM, 87801 S: USA N: Hiroshi YOKOTA E: yokota@netlab.is.tsukuba.ac.jp D: Workbit NinjaSCSI-3/32Bi PCMCIA driver D: Workbit NinjaSCSI-32Bi/UDE driver S: Japan N: Hideaki YOSHIFUJI E: hideaki@yoshifuji.org E: yoshfuji@linux-ipv6.org W: http://www.yoshifuji.org/~hideaki/ P: 1024D/E0620EEA 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA D: IPv6 and other networking related stuff D: USAGI/WIDE Project, Keio University S: Jeunet Palace Kawasaki #1-201, 10-2, Furukawa-cho, Saiwai-ku S: Kawasaki, Kanagawa 212-0025 S: Japan N: Eric Youngdale E: eric@andante.org W: http://www.andante.org D: General kernel hacker D: SCSI iso9660 and ELF S: 6389 Hawk View Lane S: Alexandria, Virginia 22312 S: USA N: Niibe Yutaka E: gniibe@mri.co.jp D: PLIP driver D: Asynchronous socket I/O in the NET code S: Mitsubishi Research Institute, Inc. S: ARCO Tower 1-8-1 Shimomeguro Meguro-ku S: Tokyo 153 S: Japan N: James R. Van Zandt E: jrv@vanzandt.mv.com P: 1024/E298966D F0 37 4F FD E5 7E C5 E6 F1 A0 1E 22 6F 46 DA 0C D: Author and maintainer of the Double Talk speech synthesizer driver S: 27 Spencer Drive S: Nashua, New Hampshire 03062 S: USA N: Orest Zborowski E: orestz@eskimo.com D: XFree86 and kernel development S: 1507 145th Place SE #B5 S: Bellevue, Washington 98007 S: USA N: Richard Zidlicky E: rz@linux-m68k.org, rdzidlic@geocities.com W: http://www.geocities.com/rdzidlic D: Q40 port - see arch/m68k/q40/README D: various m68k hacks S: Germany N: Werner Zimmermann E: Werner.Zimmermann@fht-esslingen.de D: CDROM driver "aztcd" (Aztech/Okano/Orchid/Wearnes) S: Flandernstrasse 101 S: D-73732 Esslingen S: Germany N: Roman Zippel E: zippel@linux-m68k.org D: AFFS and HFS filesystems, m68k maintainer, new kernel configuration in 2.5 N: Leonard N. Zubkoff W: http://www.dandelion.com/Linux/ D: BusLogic SCSI driver D: Mylex DAC960 PCI RAID driver D: Miscellaneous kernel fixes N: Alessandro Zummo E: a.zummo@towertech.it D: CMI8330 support is sb_card.c D: ISAPnP fixes in sb_card.c D: ZyXEL omni.net lcd plus driver D: RTC subsystem S: Italy N: Marc Zyngier E: maz@wild-wind.fr.eu.org W: http://www.misterjones.org D: MD driver D: EISA/sysfs subsystem S: France # Don't add your name here, unless you really _are_ after Marc # alphabetically. Leonard used to be very proud of being the # last entry, and he'll get positively pissed if he can't even # be second-to-last. (and this file really _is_ supposed to be # in alphabetic order)