Browse Source

Plan 9 from Bell Labs 2003-06-20

David du Colombier 21 years ago
parent
commit
f7737f7742

+ 12 - 11
dist/replica/plan9.db

@@ -15,6 +15,7 @@
 386/9pccpu.gz - 664 sys sys 1040006341 504177
 386/9pcdisk - 775 sys sys 1053200974 2004660
 386/9pcdisk.gz - 664 sys sys 1040006345 703136
+386/9pxeload - 775 sys sys 1056073259 180364
 386/_9pcdisk.gz - 664 sys sys 1039764191 695837
 386/bin - 20000000775 sys sys 1018897690 0
 386/bin/8a - 775 sys sys 1045537931 113390
@@ -295,9 +296,9 @@
 386/bin/mtime - 775 sys sys 1045538032 57878
 386/bin/mv - 775 sys sys 1045538032 64996
 386/bin/ndb - 20000000775 sys sys 985743147 0
-386/bin/ndb/cs - 775 sys sys 1049377481 143599
+386/bin/ndb/cs - 775 sys sys 1056041639 143631
 386/bin/ndb/csquery - 775 sys sys 1039758577 60136
-386/bin/ndb/dns - 775 sys sys 1050868854 211598
+386/bin/ndb/dns - 775 sys sys 1056041636 216829
 386/bin/ndb/dnsdebug - 775 sys sys 1050868855 186511
 386/bin/ndb/dnsquery - 775 sys sys 1039758578 62442
 386/bin/ndb/dnstcp - 775 sys sys 1050868856 185296
@@ -372,7 +373,7 @@
 386/bin/srvold9p - 775 sys sys 1045538056 130539
 386/bin/ssh - 775 sys sys 1053200935 209848
 386/bin/sshnet - 775 sys sys 1053200937 283860
-386/bin/stats - 775 sys sys 1053200939 187939
+386/bin/stats - 775 sys sys 1056035466 188475
 386/bin/strings - 775 sys sys 1039758593 60879
 386/bin/strip - 775 sys sys 1045538058 60829
 386/bin/sum - 775 sys sys 1039758593 40355
@@ -4845,7 +4846,7 @@ sys/man/7/map - 664 sys sys 1032632790 13549
 sys/man/7/scat - 664 sys sys 970069855 8904
 sys/man/8 - 20000000775 sys sys 1018384448 0
 sys/man/8/0intro - 664 sys sys 944959679 247
-sys/man/8/9load - 664 sys sys 1015024984 8340
+sys/man/8/9load - 664 sys sys 1056073409 8555
 sys/man/8/9pcon - 664 sys sys 1018973955 2226
 sys/man/8/INDEX - 664 sys sys 1045538129 2512
 sys/man/8/INDEX.html - 664 sys sys 1026847121 7728
@@ -4896,7 +4897,7 @@ sys/man/8/securenet - 664 sys sys 954305552 3160
 sys/man/8/send - 664 sys sys 1045501634 2168
 sys/man/8/smtp - 664 sys sys 1049408388 4111
 sys/man/8/snoopy - 664 sys sys 1034009982 3714
-sys/man/8/stats - 664 sys sys 1045059512 4042
+sys/man/8/stats - 664 sys sys 1056073417 4179
 sys/man/8/stub - 664 sys sys 1044830500 943
 sys/man/8/swap - 664 sys sys 944959679 880
 sys/man/8/timesync - 664 sys sys 1022590210 1629
@@ -6133,7 +6134,7 @@ sys/src/boot/pc/cga.c - 664 sys sys 1015007948 1362
 sys/src/boot/pc/clock.c - 664 sys sys 1015007948 5648
 sys/src/boot/pc/conf.c - 664 sys sys 1032215915 10126
 sys/src/boot/pc/console.c - 664 sys sys 1021579983 3420
-sys/src/boot/pc/dat.h - 664 sys sys 1032215922 3412
+sys/src/boot/pc/dat.h - 664 sys sys 1056073257 3432
 sys/src/boot/pc/devfloppy.c - 664 sys sys 1032215913 15505
 sys/src/boot/pc/devfloppy.h - 664 sys sys 1032409559 4081
 sys/src/boot/pc/devi82365.c - 664 sys sys 1019533020 23202
@@ -6145,7 +6146,7 @@ sys/src/boot/pc/dosboot.c - 664 sys sys 1032215912 11014
 sys/src/boot/pc/dosfs.h - 664 sys sys 1032215924 1467
 sys/src/boot/pc/eoffs - 664 sys sys 1015007950 0
 sys/src/boot/pc/error.h - 664 sys sys 1015007950 3081
-sys/src/boot/pc/ether.c - 664 sys sys 1019533020 4408
+sys/src/boot/pc/ether.c - 664 sys sys 1056073258 4670
 sys/src/boot/pc/ether2000.c - 664 sys sys 1015007950 2609
 sys/src/boot/pc/ether2114x.c - 664 sys sys 1015007950 34538
 sys/src/boot/pc/ether589.c - 664 sys sys 1015007950 4628
@@ -6170,13 +6171,13 @@ sys/src/boot/pc/ip.h - 664 sys sys 1015007952 2434
 sys/src/boot/pc/kbd.c - 664 sys sys 1015007952 10188
 sys/src/boot/pc/kfs.h - 664 sys sys 1032215924 861
 sys/src/boot/pc/kfsboot.c - 664 sys sys 1032215914 4788
-sys/src/boot/pc/l.s - 664 sys sys 1021579984 12963
+sys/src/boot/pc/l.s - 664 sys sys 1056073258 12963
 sys/src/boot/pc/lib.h - 664 sys sys 1015007952 3485
-sys/src/boot/pc/load.c - 664 sys sys 1032215917 7884
+sys/src/boot/pc/load.c - 664 sys sys 1056073257 7908
 sys/src/boot/pc/mbr.s - 664 sys sys 1015007953 6234
 sys/src/boot/pc/mem.h - 664 sys sys 1015007953 3407
 sys/src/boot/pc/memory.c - 664 sys sys 1019533021 10272
-sys/src/boot/pc/mkfile - 664 sys sys 1032409572 2809
+sys/src/boot/pc/mkfile - 664 sys sys 1056073256 2926
 sys/src/boot/pc/noether.c - 664 sys sys 1018553453 300
 sys/src/boot/pc/part.c - 664 sys sys 1032215918 7505
 sys/src/boot/pc/pbs.s - 664 sys sys 1017854325 8279
@@ -9981,7 +9982,7 @@ sys/src/cmd/ssh/ssh.h - 664 sys sys 1048179595 6054
 sys/src/cmd/ssh/sshnet.c - 664 sys sys 1046655072 17660
 sys/src/cmd/ssh/sshserve.c - 664 sys sys 1048639835 5784
 sys/src/cmd/ssh/util.c - 664 sys sys 1048644598 4478
-sys/src/cmd/stats.c - 664 sys sys 1055699395 27161
+sys/src/cmd/stats.c - 664 sys sys 1056035464 27570
 sys/src/cmd/strings.c - 664 sys sys 944961364 1216
 sys/src/cmd/strip.c - 664 sys sys 1014926661 3306
 sys/src/cmd/sum.c - 664 sys sys 1014926615 5548

+ 12 - 0
dist/replica/plan9.log

@@ -12323,3 +12323,15 @@
 1055954727 1 c sys/src/9/port/devcons.c - 664 sys sys 1055954715 21969
 1055954727 2 a sys/src/9/port/mkrootall - 775 sys sys 1055954696 386
 1055954727 3 a sys/src/9/port/mkrootc - 775 sys sys 1055954695 717
+1056036772 0 c 386/bin/stats - 775 sys sys 1056035466 188475
+1056036772 1 c sys/src/cmd/stats.c - 664 sys sys 1056035464 27570
+1056042175 0 c 386/bin/ndb/cs - 775 sys sys 1056041639 143631
+1056042175 1 c 386/bin/ndb/dns - 775 sys sys 1056041636 216829
+1056074484 0 a 386/9pxeload - 775 sys sys 1056073259 180364
+1056074484 1 c sys/man/8/9load - 664 sys sys 1056073409 8555
+1056074484 2 c sys/man/8/stats - 664 sys sys 1056073417 4179
+1056074484 3 c sys/src/boot/pc/dat.h - 664 sys sys 1056073257 3432
+1056074484 4 c sys/src/boot/pc/ether.c - 664 sys sys 1056073258 4670
+1056074484 5 c sys/src/boot/pc/l.s - 664 sys sys 1056073258 12963
+1056074484 6 c sys/src/boot/pc/load.c - 664 sys sys 1056073257 7908
+1056074484 7 c sys/src/boot/pc/mkfile - 664 sys sys 1056073256 2926

+ 14 - 4
sys/man/8/9load

@@ -1,6 +1,6 @@
 .TH 9LOAD 8
 .SH NAME
-9load, ld \- PC bootstrap program
+9load, ld, 9pxeload \- PC bootstrap program
 .SH SYNOPSIS
 .I "(Under MS-DOS)
 .br
@@ -122,20 +122,30 @@ usually
 .BR 0x80100020 .
 After loading, control is passed to the entry location.
 .PP
+Finally,
+.I 9pxeload
+is a version of
+.I 9load
+that can be booted using the PXE download
+found on some ethernet card BIOSs.
+.PP
 In summary,
-Plan 9 can be booted on a PC two different ways:
+Plan 9 can be booted on a PC three different ways:
 either by booting MS-DOS and using
 .I ld
 to start
 .I 9load
 in the appropriate directory,
-or by booting directly from a Plan 9 boot floppy or disk
+by booting directly from a Plan 9 boot floppy or disk
 partition
 prepared using
 .B format
 to install the appropriate files and bootstrap sectors
 (see
-.IR prep (8)).
+.IR prep (8)),
+or by using a PXE capable BIOS to boot
+.I 9pxeload
+directly over the ethernet.
 .PP
 The
 .IR bootfile ,

+ 5 - 0
sys/man/8/stats

@@ -53,6 +53,11 @@ number of page faults per second.
 .B "i intr
 number of interrupts per second.
 .TP
+.B "I idle
+system load, % time in idle, and % time in interrupts.
+The last two are averaged over all processors on a
+multiprocessor.
+.TP
 .B "l load
 (default) system load average.
 The load is computed as a running average of

+ 3 - 2
sys/src/boot/pc/dat.h

@@ -199,5 +199,6 @@ struct Boot {
 };
 
 extern int	debug;
-extern Apminfo apm;
-extern char *defaultpartition;
+extern Apminfo	apm;
+extern char	*defaultpartition;
+extern int	iniread;

+ 28 - 19
sys/src/boot/pc/ether.c

@@ -24,27 +24,27 @@ extern int ether83815reset(Ether*);
 struct {
 	char	*type;
 	int	(*reset)(Ether*);
+	int	noprobe;
 } ethercards[] = {
-	{ "21140", ether2114xreset, },
-	{ "2114x", ether2114xreset, },
-	{ "i82557", i82557reset, },
-	{ "elnk3", elnk3reset, },
-	{ "3C509", elnk3reset, },
-	{ "3C575", elnk3reset, },
-	{ "3C589", ether589reset, },
-	{ "3C562", ether589reset, },
-	{ "589E", ether589reset, },
-	{ "NE2000", ne2000reset, },
-	{ "WD8003", wd8003reset, },
-	{ "EC2T", ec2treset, },
-	{ "AMD79C970", amd79c970reset, },
-	{ "RTL8139", rtl8139pnp, },
-	{ "83815", ether83815reset, },
+	{ "21140", ether2114xreset, 0, },
+	{ "2114x", ether2114xreset, 0, },
+	{ "i82557", i82557reset, 0, },
+	{ "elnk3", elnk3reset, 0, },
+	{ "3C509", elnk3reset, 0, },
+	{ "3C575", elnk3reset, 0, },
+	{ "3C589", ether589reset, 1, },
+	{ "3C562", ether589reset, 1, },
+	{ "589E", ether589reset, 1, },
+	{ "NE2000", ne2000reset, 1, },
+	{ "WD8003", wd8003reset, 1, },
+	{ "EC2T", ec2treset, 0, },
+	{ "AMD79C970", amd79c970reset, 0, },
+	{ "RTL8139", rtl8139pnp, 0, },
+	{ "83815", ether83815reset, 0, },
 
 	{ 0, }
 };
 
-
 static void xetherdetach(void);
 
 int
@@ -58,18 +58,27 @@ etherinit(void)
 	for(ctlrno = 0; ctlrno < MaxEther; ctlrno++){
 		ctlr = &ether[ctlrno];
 		memset(ctlr, 0, sizeof(Ether));
-		if(isaconfig("ether", ctlrno, ctlr) == 0)
+		if(iniread && isaconfig("ether", ctlrno, ctlr) == 0)
 			continue;
 
 		for(n = 0; ethercards[n].type; n++){
-			if(cistrcmp(ethercards[n].type, ctlr->type))
+			if(!iniread){
+				if(ethercards[n].noprobe)
+					continue;
+				memset(ctlr, 0, sizeof(Ether));
+				strcpy(ctlr->type, ethercards[n].type);
+			}
+			else if(cistrcmp(ethercards[n].type, ctlr->type))
 				continue;
 			ctlr->ctlrno = ctlrno;
 
 			x = splhi();
 			if((*ethercards[n].reset)(ctlr)){
 				splx(x);
-				break;
+				if(iniread)
+					break;
+				else
+					continue;
 			}
 
 			ctlr->state = 1;

+ 1 - 1
sys/src/boot/pc/l.s

@@ -1,7 +1,7 @@
 #include "x16.h"
 #include "mem.h"
 
-#define PDB		0x08000		/* temporary page tables (24KB) */
+#define PDB		0x90000		/* temporary page tables (24KB) */
 
 #define NoScreenBlank	1
 /*#define ResetDiscs	1*/

+ 2 - 1
sys/src/boot/pc/load.c

@@ -105,6 +105,7 @@ char **ini;
 
 int scsi0port;
 char *defaultpartition;
+int iniread;
 
 static Medium*
 parse(char *line, char **file)
@@ -258,7 +259,7 @@ main(void)
 			continue;
 		if((mp = probe(tp->type, Fini, Dany)) && (mp->flag & Fini)){
 			print("using %s!%s!%s\n", mp->name, mp->part, mp->ini);
-			dotini(mp->inifs);
+			iniread = !dotini(mp->inifs);
 			break;
 		}
 	}

+ 5 - 0
sys/src/boot/pc/mkfile

@@ -4,6 +4,7 @@ BIN=/386
 
 TARG=\
 	9load\
+	9pxeload\
 	9loadlite\
 	9loaddebug\
 	9loadlitedebug\
@@ -86,6 +87,10 @@ all:V:	$TARG
 	$LD -o $target -H3 -T0x80010000 -l $prereq -lflate -lc
 	ls -l $target
 
+9pxeload:	l.$O $CORE $LOAD $ETHER
+	$LD -o $target -H3 -T0x80007C00 -l $prereq -lflate -lc
+	ls -l $target
+
 9loaddebug:	l.$O $CORE $LOAD $ETHER
 	$LD -o $target -T0x80010000 -l $prereq -lflate -lc
 	ls -l $target

+ 82 - 65
sys/src/cmd/stats.c

@@ -6,7 +6,7 @@
 #include <draw.h>
 #include <event.h>
 
-#define	MAXNUM	8	/* maximum number of numbers on data line */
+#define	MAXNUM	10	/* maximum number of numbers on data line */
 
 typedef struct Graph		Graph;
 typedef struct Machine	Machine;
@@ -18,8 +18,8 @@ struct Graph
 	int		*data;
 	int		ndata;
 	char		*label;
-	void		(*newvalue)(Machine*, long*, long*, int);
-	void		(*update)(Graph*, long, long);
+	void		(*newvalue)(Machine*, ulong*, ulong*, int);
+	void		(*update)(Graph*, ulong, ulong);
 	Machine	*mach;
 	int		overflow;
 	Image	*overtmp;
@@ -42,6 +42,7 @@ enum
 	TLBpurge,
 	Load,
 	Idle,
+	InIntr,
 	/* /net/ether0/0/stats */
 	In		= 0,
 	Out,
@@ -60,14 +61,14 @@ struct Machine
 	int		bitsybatfd;
 	int		disable;
 
-	long		devswap[4];
-	long		devsysstat[9];
-	long		prevsysstat[9];
+	ulong		devswap[4];
+	ulong		devsysstat[10];
+	ulong		prevsysstat[10];
 	int		nproc;
-	long		netetherstats[8];
-	long		prevetherstats[8];
-	long		batterystats[2];
-	long		netetherifstats[2];
+	ulong		netetherstats[8];
+	ulong		prevetherstats[8];
+	ulong		batterystats[2];
+	ulong		netetherifstats[2];
 
 	char		buf[1024];
 	char		*bufp;
@@ -95,81 +96,85 @@ enum
 
 enum Menu2
 {
+	Mbattery,
 	Mcontext,
 	Mether,
 	Methererr,
 	Metherin,
 	Metherout,
 	Mfault,
+	Midle,
+	Minintr,
 	Mintr,
 	Mload,
-	Midle,
 	Mmem,
 	Mswap,
 	Msyscall,
 	Mtlbmiss,
 	Mtlbpurge,
-	Mbattery,
 	Msignal,
 	Nmenu2,
 };
 
 char	*menu2str[Nmenu2+1] = {
+	"add  battery ",
 	"add  context ",
 	"add  ether   ",
 	"add  ethererr",
 	"add  etherin ",
 	"add  etherout",
 	"add  fault   ",
+	"add  idle    ",
+	"add  inintr  ",
 	"add  intr    ",
 	"add  load    ",
-	"add  idle    ",
 	"add  mem     ",
 	"add  swap    ",
 	"add  syscall ",
 	"add  tlbmiss ",
 	"add  tlbpurge",
-	"add  battery ",
 	"add  802.11b ",
 	nil,
 };
 
 
-void	contextval(Machine*, long*, long*, int),
-	etherval(Machine*, long*, long*, int),
-	ethererrval(Machine*, long*, long*, int),
-	etherinval(Machine*, long*, long*, int),
-	etheroutval(Machine*, long*, long*, int),
-	faultval(Machine*, long*, long*, int),
-	intrval(Machine*, long*, long*, int),
-	loadval(Machine*, long*, long*, int),
-	idleval(Machine*, long*, long*, int),
-	memval(Machine*, long*, long*, int),
-	swapval(Machine*, long*, long*, int),
-	syscallval(Machine*, long*, long*, int),
-	tlbmissval(Machine*, long*, long*, int),
-	tlbpurgeval(Machine*, long*, long*, int),
-	batteryval(Machine*, long*, long*, int),
-	signalval(Machine*, long*, long*, int);
+void	contextval(Machine*, ulong*, ulong*, int),
+	etherval(Machine*, ulong*, ulong*, int),
+	ethererrval(Machine*, ulong*, ulong*, int),
+	etherinval(Machine*, ulong*, ulong*, int),
+	etheroutval(Machine*, ulong*, ulong*, int),
+	faultval(Machine*, ulong*, ulong*, int),
+	intrval(Machine*, ulong*, ulong*, int),
+	inintrval(Machine*, ulong*, ulong*, int),
+	loadval(Machine*, ulong*, ulong*, int),
+	idleval(Machine*, ulong*, ulong*, int),
+	memval(Machine*, ulong*, ulong*, int),
+	swapval(Machine*, ulong*, ulong*, int),
+	syscallval(Machine*, ulong*, ulong*, int),
+	tlbmissval(Machine*, ulong*, ulong*, int),
+	tlbpurgeval(Machine*, ulong*, ulong*, int),
+	batteryval(Machine*, ulong*, ulong*, int),
+	signalval(Machine*, ulong*, ulong*, int);
 
 Menu	menu2 = {menu2str, nil};
 int		present[Nmenu2];
-void		(*newvaluefn[Nmenu2])(Machine*, long*, long*, int init) = {
+void		(*newvaluefn[Nmenu2])(Machine*, ulong*, ulong*, int init) = {
+	batteryval,
 	contextval,
 	etherval,
 	ethererrval,
 	etherinval,
 	etheroutval,
 	faultval,
+	idleval,
+	inintrval,
 	intrval,
 	loadval,
-	idleval,
 	memval,
 	swapval,
 	syscallval,
 	tlbmissval,
 	tlbpurgeval,
-	batteryval,
 	signalval,
 };
 
@@ -178,7 +183,7 @@ Graph	*graph;
 Machine	*mach;
 Font		*mediumfont;
 char		*mysysname;
-char		argchars[] = "8bceEfimlnpstw";
+char		argchars[] = "8bceEfiImlnpstw";
 int		pids[NPROC];
 int 		parity;	/* toggled to avoid patterns in textured background */
 int		nmach;
@@ -319,7 +324,7 @@ paritypt(int x)
 }
 
 Point
-datapoint(Graph *g, int x, long v, long vmax)
+datapoint(Graph *g, int x, ulong v, ulong vmax)
 {
 	Point p;
 	double y;
@@ -349,7 +354,7 @@ datapoint(Graph *g, int x, long v, long vmax)
 }
 
 void
-drawdatum(Graph *g, int x, long prev, long v, long vmax)
+drawdatum(Graph *g, int x, ulong prev, ulong v, ulong vmax)
 {
 	int c;
 	Point p, q;
@@ -383,7 +388,7 @@ redraw(Graph *g, int vmax)
 }
 
 void
-update1(Graph *g, long v, long vmax)
+update1(Graph *g, ulong v, ulong vmax)
 {
 	char buf[32];
 	int overflow;
@@ -409,7 +414,7 @@ update1(Graph *g, long v, long vmax)
 
 /* read one line of text from buffer and process integers */
 int
-readnums(Machine *m, int n, long *a, int spanlines)
+readnums(Machine *m, int n, ulong *a, int spanlines)
 {
 	int i;
 	char *p, *ep;
@@ -426,7 +431,7 @@ readnums(Machine *m, int n, long *a, int spanlines)
 			p++;
 		if(p == ep)
 			break;
-		a[i] = strtol(p, &p, 10);
+		a[i] = strtoul(p, &p, 10);
 	}
 	if(ep < m->ebufp)
 		ep++;
@@ -573,7 +578,7 @@ void
 initmach(Machine *m, char *name)
 {
 	int n, fd;
-	long a[MAXNUM];
+	ulong a[MAXNUM];
 	char *p, mpt[256], buf[256];
 
 	p = strchr(name, '!');
@@ -668,7 +673,7 @@ int
 needstat(int init)
 {
 	return init | present[Mcontext]  | present[Mfault] | present[Mintr] | present[Mload] | present[Midle] |
-		present[Msyscall] | present[Mtlbmiss] | present[Mtlbpurge];
+		present[Minintr] | present[Msyscall] | present[Mtlbmiss] | present[Mtlbpurge];
 }
 
 
@@ -694,7 +699,7 @@ void
 readmach(Machine *m, int init)
 {
 	int n, i;
-	long a[8];
+	ulong a[8];
 	char buf[32];
 
 	if(m->remote && (m->disable || setjmp(catchalarm))){
@@ -741,21 +746,21 @@ readmach(Machine *m, int init)
 }
 
 void
-memval(Machine *m, long *v, long *vmax, int)
+memval(Machine *m, ulong *v, ulong *vmax, int)
 {
 	*v = m->devswap[Mem];
 	*vmax = m->devswap[Maxmem];
 }
 
 void
-swapval(Machine *m, long *v, long *vmax, int)
+swapval(Machine *m, ulong *v, ulong *vmax, int)
 {
 	*v = m->devswap[Swap];
 	*vmax = m->devswap[Maxswap];
 }
 
 void
-contextval(Machine *m, long *v, long *vmax, int init)
+contextval(Machine *m, ulong *v, ulong *vmax, int init)
 {
 	*v = m->devsysstat[Context]-m->prevsysstat[Context];
 	*vmax = 1000*m->nproc;
@@ -764,7 +769,7 @@ contextval(Machine *m, long *v, long *vmax, int init)
 }
 
 void
-intrval(Machine *m, long *v, long *vmax, int init)
+intrval(Machine *m, ulong *v, ulong *vmax, int init)
 {
 	*v = m->devsysstat[Interrupt]-m->prevsysstat[Interrupt];
 	*vmax = 1000*m->nproc;
@@ -773,7 +778,7 @@ intrval(Machine *m, long *v, long *vmax, int init)
 }
 
 void
-syscallval(Machine *m, long *v, long *vmax, int init)
+syscallval(Machine *m, ulong *v, ulong *vmax, int init)
 {
 	*v = m->devsysstat[Syscall]-m->prevsysstat[Syscall];
 	*vmax = 1000*m->nproc;
@@ -782,7 +787,7 @@ syscallval(Machine *m, long *v, long *vmax, int init)
 }
 
 void
-faultval(Machine *m, long *v, long *vmax, int init)
+faultval(Machine *m, ulong *v, ulong *vmax, int init)
 {
 	*v = m->devsysstat[Fault]-m->prevsysstat[Fault];
 	*vmax = 1000*m->nproc;
@@ -791,7 +796,7 @@ faultval(Machine *m, long *v, long *vmax, int init)
 }
 
 void
-tlbmissval(Machine *m, long *v, long *vmax, int init)
+tlbmissval(Machine *m, ulong *v, ulong *vmax, int init)
 {
 	*v = m->devsysstat[TLBfault]-m->prevsysstat[TLBfault];
 	*vmax = 10*m->nproc;
@@ -800,7 +805,7 @@ tlbmissval(Machine *m, long *v, long *vmax, int init)
 }
 
 void
-tlbpurgeval(Machine *m, long *v, long *vmax, int init)
+tlbpurgeval(Machine *m, ulong *v, ulong *vmax, int init)
 {
 	*v = m->devsysstat[TLBpurge]-m->prevsysstat[TLBpurge];
 	*vmax = 10*m->nproc;
@@ -809,7 +814,7 @@ tlbpurgeval(Machine *m, long *v, long *vmax, int init)
 }
 
 void
-loadval(Machine *m, long *v, long *vmax, int init)
+loadval(Machine *m, ulong *v, ulong *vmax, int init)
 {
 	*v = m->devsysstat[Load];
 	*vmax = 1000*m->nproc;
@@ -818,14 +823,21 @@ loadval(Machine *m, long *v, long *vmax, int init)
 }
 
 void
-idleval(Machine *m, long *v, long *vmax, int)
+idleval(Machine *m, ulong *v, ulong *vmax, int)
 {
-	*v = m->devsysstat[Idle];
+	*v = m->devsysstat[Idle]/m->nproc;
 	*vmax = 100;
 }
 
 void
-etherval(Machine *m, long *v, long *vmax, int init)
+inintrval(Machine *m, ulong *v, ulong *vmax, int)
+{
+	*v = m->devsysstat[InIntr]/m->nproc;
+	*vmax = 100;
+}
+
+void
+etherval(Machine *m, ulong *v, ulong *vmax, int init)
 {
 	*v = m->netetherstats[In]-m->prevetherstats[In] + m->netetherstats[Out]-m->prevetherstats[Out];
 	*vmax = 1000*m->nproc;
@@ -834,7 +846,7 @@ etherval(Machine *m, long *v, long *vmax, int init)
 }
 
 void
-etherinval(Machine *m, long *v, long *vmax, int init)
+etherinval(Machine *m, ulong *v, ulong *vmax, int init)
 {
 	*v = m->netetherstats[In]-m->prevetherstats[In];
 	*vmax = 1000*m->nproc;
@@ -843,7 +855,7 @@ etherinval(Machine *m, long *v, long *vmax, int init)
 }
 
 void
-etheroutval(Machine *m, long *v, long *vmax, int init)
+etheroutval(Machine *m, ulong *v, ulong *vmax, int init)
 {
 	*v = m->netetherstats[Out]-m->prevetherstats[Out];
 	*vmax = 1000*m->nproc;
@@ -852,7 +864,7 @@ etheroutval(Machine *m, long *v, long *vmax, int init)
 }
 
 void
-ethererrval(Machine *m, long *v, long *vmax, int init)
+ethererrval(Machine *m, ulong *v, ulong *vmax, int init)
 {
 	int i;
 
@@ -865,7 +877,7 @@ ethererrval(Machine *m, long *v, long *vmax, int init)
 }
 
 void
-batteryval(Machine *m, long *v, long *vmax, int)
+batteryval(Machine *m, ulong *v, ulong *vmax, int)
 {
 	*v = m->batterystats[0];
 	if(m->bitsybatfd >= 0)
@@ -875,9 +887,9 @@ batteryval(Machine *m, long *v, long *vmax, int)
 }
 
 void
-signalval(Machine *m, long *v, long *vmax, int)
+signalval(Machine *m, ulong *v, ulong *vmax, int)
 {
-	long l;
+	ulong l;
 
 	*vmax = 1000;
 	l = m->netetherifstats[0];
@@ -983,7 +995,7 @@ void
 labelstrs(Graph *g, char strs[Nlab][Lablen], int *np)
 {
 	int j;
-	long v, vmax;
+	ulong v, vmax;
 
 	g->newvalue(g->mach, &v, &vmax, 1);
 	if(logscale){
@@ -1022,7 +1034,7 @@ resize(void)
 	int i, j, k, n, startx, starty, x, y, dx, dy, ly, ondata, maxx, wid, nlab;
 	Graph *g;
 	Rectangle machr, r;
-	long v, vmax;
+	ulong v, vmax;
 	char buf[128], labs[Nlab][Lablen];
 
 	draw(screen, screen->r, display->white, nil, ZP);
@@ -1096,9 +1108,9 @@ resize(void)
 			/* allocate data */
 			ondata = g->ndata;
 			g->ndata = Dx(machr)+1;	/* may be too many if label will be drawn here; so what? */
-			g->data = erealloc(g->data, g->ndata*sizeof(long));
+			g->data = erealloc(g->data, g->ndata*sizeof(ulong));
 			if(g->ndata > ondata)
-				memset(g->data+ondata, 0, (g->ndata-ondata)*sizeof(long));
+				memset(g->data+ondata, 0, (g->ndata-ondata)*sizeof(ulong));
 			/* set geometry */
 			g->r = machr;
 			g->r.min.y = y;
@@ -1187,7 +1199,7 @@ main(int argc, char *argv[])
 {
 	int i, j;
 	char *s;
-	long v, vmax, nargs;
+	ulong v, vmax, nargs;
 	char args[100];
 	int sleeptime = 1000;
 
@@ -1267,6 +1279,11 @@ main(int argc, char *argv[])
 	case 'i':
 		addgraph(Mintr);
 		break;
+	case 'I':
+		addgraph(Mload);
+		addgraph(Midle);
+		addgraph(Minintr);
+		break;
 	case 'l':
 		addgraph(Mload);
 		break;