Browse Source

Plan 9 from Bell Labs 2007-07-05

David du Colombier 17 years ago
parent
commit
62a2b7d6bb

+ 8 - 9
dist/replica/_plan9.db

@@ -7677,7 +7677,7 @@ sys/man/4/dossrv - 664 sys sys 1168307403 4334
 sys/man/4/execnet - 664 sys sys 1019866708 1069
 sys/man/4/exportfs - 664 sys sys 1145881912 4655
 sys/man/4/ext2srv - 664 sys sys 1055692986 2409
-sys/man/4/factotum - 664 sys sys 1131294573 14841
+sys/man/4/factotum - 664 sys sys 1183529524 14841
 sys/man/4/fossil - 664 sys sys 1165622806 9590
 sys/man/4/fs - 664 sys sys 1019058716 3387
 sys/man/4/ftpfs - 664 sys sys 1112563349 4410
@@ -7777,7 +7777,7 @@ sys/man/8/INDEX.html - 664 sys sys 1183240488 8619
 sys/man/8/aan - 664 sys sys 1045501064 1670
 sys/man/8/aliasmail - 664 sys sys 1170818958 1350
 sys/man/8/apm - 664 sys sys 1017679308 1811
-sys/man/8/auth - 664 sys sys 1181325518 4586
+sys/man/8/auth - 664 sys sys 1183580530 4981
 sys/man/8/boot - 664 sys sys 1165623055 8357
 sys/man/8/booting - 664 sys sys 1015024984 4136
 sys/man/8/cpurc - 664 sys sys 1174792133 1541
@@ -9243,8 +9243,7 @@ sys/src/cmd/5a/lex.c - 664 sys sys 1089299175 11260
 sys/src/cmd/5a/mkfile - 664 sys sys 944960723 215
 sys/src/cmd/5c - 20000000775 sys sys 1039727541 0
 sys/src/cmd/5c/5.out.h - 664 sys sys 1089299174 2566
-sys/src/cmd/5c/bits.c - 664 sys sys 944960723 1370
-sys/src/cmd/5c/cgen.c - 664 sys sys 1143241856 19666
+sys/src/cmd/5c/cgen.c - 664 sys sys 1183570553 19784
 sys/src/cmd/5c/enam.c - 664 sys sys 1089299175 849
 sys/src/cmd/5c/gc.h - 664 sys sys 1143759353 6146
 sys/src/cmd/5c/list.c - 664 sys sys 1067720726 5290
@@ -9255,20 +9254,20 @@ sys/src/cmd/5c/peep.c - 664 sys sys 1143759351 24458
 sys/src/cmd/5c/reg.c - 664 sys sys 1089299174 19492
 sys/src/cmd/5c/sgen.c - 664 sys sys 1143241856 3066
 sys/src/cmd/5c/swt.c - 664 sys sys 1143384790 11028
-sys/src/cmd/5c/txt.c - 664 sys sys 1168702343 19030
+sys/src/cmd/5c/txt.c - 664 sys sys 1183570604 19423
 sys/src/cmd/5i - 20000000775 sys sys 1039727542 0
-sys/src/cmd/5i/5i.c - 664 sys sys 1124229121 4415
-sys/src/cmd/5i/arm.h - 664 sys sys 1124229121 3901
+sys/src/cmd/5i/5i.c - 664 sys sys 1183602564 4529
+sys/src/cmd/5i/arm.h - 664 sys sys 1183570672 3929
 sys/src/cmd/5i/bpt.c - 664 sys sys 969510413 2193
 sys/src/cmd/5i/cmd.c - 664 sys sys 969510414 8887
 sys/src/cmd/5i/float.c - 664 sys sys 969510414 2663
 sys/src/cmd/5i/icache.c - 664 sys sys 969510414 161
-sys/src/cmd/5i/mem.c - 664 sys sys 969510414 4100
+sys/src/cmd/5i/mem.c - 664 sys sys 1183570672 4322
 sys/src/cmd/5i/mkfile - 664 sys sys 1124229121 265
 sys/src/cmd/5i/run.c - 664 sys sys 1014924773 18578
 sys/src/cmd/5i/stats.c - 664 sys sys 1067739537 3943
 sys/src/cmd/5i/symbols.c - 664 sys sys 1121977746 1724
-sys/src/cmd/5i/syscall.c - 664 sys sys 1166822289 13691
+sys/src/cmd/5i/syscall.c - 664 sys sys 1183602564 13461
 sys/src/cmd/5l - 20000000775 sys sys 1045503939 0
 sys/src/cmd/5l/asm.c - 664 sys sys 1089299173 32633
 sys/src/cmd/5l/compat.c - 664 sys sys 946759353 465

+ 8 - 9
dist/replica/plan9.db

@@ -7677,7 +7677,7 @@ sys/man/4/dossrv - 664 sys sys 1168307403 4334
 sys/man/4/execnet - 664 sys sys 1019866708 1069
 sys/man/4/exportfs - 664 sys sys 1145881912 4655
 sys/man/4/ext2srv - 664 sys sys 1055692986 2409
-sys/man/4/factotum - 664 sys sys 1131294573 14841
+sys/man/4/factotum - 664 sys sys 1183529524 14841
 sys/man/4/fossil - 664 sys sys 1165622806 9590
 sys/man/4/fs - 664 sys sys 1019058716 3387
 sys/man/4/ftpfs - 664 sys sys 1112563349 4410
@@ -7777,7 +7777,7 @@ sys/man/8/INDEX.html - 664 sys sys 1183240488 8619
 sys/man/8/aan - 664 sys sys 1045501064 1670
 sys/man/8/aliasmail - 664 sys sys 1170818958 1350
 sys/man/8/apm - 664 sys sys 1017679308 1811
-sys/man/8/auth - 664 sys sys 1181325518 4586
+sys/man/8/auth - 664 sys sys 1183580530 4981
 sys/man/8/boot - 664 sys sys 1165623055 8357
 sys/man/8/booting - 664 sys sys 1015024984 4136
 sys/man/8/cpurc - 664 sys sys 1174792133 1541
@@ -9243,8 +9243,7 @@ sys/src/cmd/5a/lex.c - 664 sys sys 1089299175 11260
 sys/src/cmd/5a/mkfile - 664 sys sys 944960723 215
 sys/src/cmd/5c - 20000000775 sys sys 1039727541 0
 sys/src/cmd/5c/5.out.h - 664 sys sys 1089299174 2566
-sys/src/cmd/5c/bits.c - 664 sys sys 944960723 1370
-sys/src/cmd/5c/cgen.c - 664 sys sys 1143241856 19666
+sys/src/cmd/5c/cgen.c - 664 sys sys 1183570553 19784
 sys/src/cmd/5c/enam.c - 664 sys sys 1089299175 849
 sys/src/cmd/5c/gc.h - 664 sys sys 1143759353 6146
 sys/src/cmd/5c/list.c - 664 sys sys 1067720726 5290
@@ -9255,20 +9254,20 @@ sys/src/cmd/5c/peep.c - 664 sys sys 1143759351 24458
 sys/src/cmd/5c/reg.c - 664 sys sys 1089299174 19492
 sys/src/cmd/5c/sgen.c - 664 sys sys 1143241856 3066
 sys/src/cmd/5c/swt.c - 664 sys sys 1143384790 11028
-sys/src/cmd/5c/txt.c - 664 sys sys 1168702343 19030
+sys/src/cmd/5c/txt.c - 664 sys sys 1183570604 19423
 sys/src/cmd/5i - 20000000775 sys sys 1039727542 0
-sys/src/cmd/5i/5i.c - 664 sys sys 1124229121 4415
-sys/src/cmd/5i/arm.h - 664 sys sys 1124229121 3901
+sys/src/cmd/5i/5i.c - 664 sys sys 1183602564 4529
+sys/src/cmd/5i/arm.h - 664 sys sys 1183570672 3929
 sys/src/cmd/5i/bpt.c - 664 sys sys 969510413 2193
 sys/src/cmd/5i/cmd.c - 664 sys sys 969510414 8887
 sys/src/cmd/5i/float.c - 664 sys sys 969510414 2663
 sys/src/cmd/5i/icache.c - 664 sys sys 969510414 161
-sys/src/cmd/5i/mem.c - 664 sys sys 969510414 4100
+sys/src/cmd/5i/mem.c - 664 sys sys 1183570672 4322
 sys/src/cmd/5i/mkfile - 664 sys sys 1124229121 265
 sys/src/cmd/5i/run.c - 664 sys sys 1014924773 18578
 sys/src/cmd/5i/stats.c - 664 sys sys 1067739537 3943
 sys/src/cmd/5i/symbols.c - 664 sys sys 1121977746 1724
-sys/src/cmd/5i/syscall.c - 664 sys sys 1166822289 13691
+sys/src/cmd/5i/syscall.c - 664 sys sys 1183602564 13461
 sys/src/cmd/5l - 20000000775 sys sys 1045503939 0
 sys/src/cmd/5l/asm.c - 664 sys sys 1089299173 32633
 sys/src/cmd/5l/compat.c - 664 sys sys 946759353 465

+ 11 - 0
dist/replica/plan9.log

@@ -49431,3 +49431,14 @@
 1183492823 3 c 386/bin/ndb/dns - 775 sys sys 1183492676 289937
 1183492823 4 c 386/bin/ndb/dnsdebug - 775 sys sys 1183492677 264870
 1183492823 5 c 386/bin/ndb/dnstcp - 775 sys sys 1183492678 263313
+1183530623 0 c sys/man/4/factotum - 664 sys sys 1183529524 14841
+1183572047 0 c sys/src/cmd/5c/cgen.c - 664 sys sys 1183570553 19784
+1183572047 1 c sys/src/cmd/5c/txt.c - 664 sys sys 1183570604 19423
+1183572047 2 c sys/src/cmd/5i/5i.c - 664 sys sys 1183570672 4731
+1183572047 3 c sys/src/cmd/5i/arm.h - 664 sys sys 1183570672 3929
+1183572047 4 c sys/src/cmd/5i/mem.c - 664 sys sys 1183570672 4322
+1183572047 5 c sys/src/cmd/5i/syscall.c - 664 sys sys 1183570672 13613
+1183581045 0 c sys/man/8/auth - 664 sys sys 1183580530 4981
+1183602639 0 c sys/src/cmd/5i/5i.c - 664 sys sys 1183602564 4529
+1183602639 1 c sys/src/cmd/5i/syscall.c - 664 sys sys 1183602564 13461
+1183604445 0 d sys/src/cmd/5c/bits.c - 664 sys sys 944960723 0

+ 1 - 1
sys/man/4/factotum

@@ -182,7 +182,7 @@ don't look for a secstore.
 .B \-S
 indicates that the agent is running on a
 CPU server.  On starting, it will attempt to get a
-.B 9psk1
+.B p9sk1
 key from NVRAM using
 .B readnvram
 (see

+ 31 - 1
sys/man/8/auth

@@ -1,6 +1,6 @@
 .TH AUTH 8
 .SH NAME
-changeuser, convkeys, convkeys2, printnetkey, status, enable, disable, authsrv, guard.srv, wrkey, login, none \- maintain authentication databases
+changeuser, convkeys, convkeys2, printnetkey, status, enable, disable, authsrv, guard.srv, wrkey, login, newns, none \- maintain or query authentication databases
 .SH SYNOPSIS
 .B auth/changeuser
 .RB [ -np ]
@@ -35,6 +35,17 @@ changeuser, convkeys, convkeys2, printnetkey, status, enable, disable, authsrv,
 .B auth/login
 .I user
 .PP
+.B auth/newns
+[
+.B -ad
+] [
+.B -n
+.I namespace
+]
+.I command
+.I arg
+\&...
+.PP
 .B auth/none
 [
 .B -n
@@ -190,6 +201,25 @@ under the new id and
 .IR rc (1)
 under the new id.
 .PP
+.I Newns
+sets up a new namespace from
+.I namespace
+(default
+.BR /lib/namespace )
+and
+.IR exec s
+its arguments.
+If there are no arguments, it
+.IR exec s
+.BR /bin/rc .
+Under
+.BR -a ,
+.I newns
+adds to the current namespace instead of constructing a new one.
+The
+.BR -d
+option enables debugging output.
+.PP
 .I None
 sets up a new namespace from
 .I namespace

+ 36 - 48
sys/src/ape/lib/ap/arm/memmove.s

@@ -40,8 +40,10 @@ _b32loop:
 	CMP	R(TMP), R(TE)
 	BLS	_b4tail
 
-	MOVM.DB.W (R(FROM)), [R4-R11]
-	MOVM.DB.W [R4-R11], (R(TE))
+	MOVM.DB.W (R(FROM)), [R4-R7]
+	MOVM.DB.W [R4-R7], (R(TE))
+	MOVM.DB.W (R(FROM)), [R4-R7]
+	MOVM.DB.W [R4-R7], (R(TE))
 	B	_b32loop
 
 _b4tail:				/* do remaining words if possible */
@@ -83,8 +85,10 @@ _f32loop:
 	CMP	R(TMP), R(TS)
 	BHS	_f4tail
 
-	MOVM.IA.W (R(FROM)), [R4-R11] 
-	MOVM.IA.W [R4-R11], (R(TS))
+	MOVM.IA.W (R(FROM)), [R4-R7] 
+	MOVM.IA.W [R4-R7], (R(TS))
+	MOVM.IA.W (R(FROM)), [R4-R7] 
+	MOVM.IA.W [R4-R7], (R(TS))
 	B	_f32loop
 
 _f4tail:
@@ -111,16 +115,12 @@ _return:
 
 RSHIFT = 4
 LSHIFT = 5
-OFFSET = 6
+OFFSET = 11
 
-BR0 = 7
-BW0 = 8
-BR1 = 8
-BW1 = 9
-BR2 = 9
-BW2 = 10
-BR3 = 10
-BW3 = 11
+BR0 = 6
+BW0 = 7
+BR1 = 7
+BW1 = 8
 
 _bunaligned:
 	CMP	$2, R(TMP)		/* is R(TMP) < 2 ? */
@@ -137,45 +137,39 @@ _bunaligned:
 	MOVW.GT	$8, R(LSHIFT)
 	MOVW.GT	$3, R(OFFSET)
 
-	ADD	$16, R(TS), R(TMP)	/* do 16-byte chunks if possible */
+	ADD	$8, R(TS), R(TMP)	/* do 8-byte chunks if possible */
 	CMP	R(TMP), R(TE)
 	BLS	_b1tail
 
-	AND	$~0x03, R(FROM)		/* align source */
+	BIC	$3, R(FROM)		/* align source */
 	MOVW	(R(FROM)), R(BR0)	/* prime first block register */
 
-_bu16loop:
+_bu8loop:
 	CMP	R(TMP), R(TE)
 	BLS	_bu1tail
 
-	MOVW	R(BR0)<<R(LSHIFT), R(BW3)
-	MOVM.DB.W (R(FROM)), [R(BR0)-R(BR3)]
-	ORR	R(BR3)>>R(RSHIFT), R(BW3)
-
-	MOVW	R(BR3)<<R(LSHIFT), R(BW2)
-	ORR	R(BR2)>>R(RSHIFT), R(BW2)
-
-	MOVW	R(BR2)<<R(LSHIFT), R(BW1)
+	MOVW	R(BR0)<<R(LSHIFT), R(BW1)
+	MOVM.DB.W (R(FROM)), [R(BR0)-R(BR1)]
 	ORR	R(BR1)>>R(RSHIFT), R(BW1)
 
 	MOVW	R(BR1)<<R(LSHIFT), R(BW0)
 	ORR	R(BR0)>>R(RSHIFT), R(BW0)
 
-	MOVM.DB.W [R(BW0)-R(BW3)], (R(TE))
-	B	_bu16loop
+	MOVM.DB.W [R(BW0)-R(BW1)], (R(TE))
+	B	_bu8loop
 
 _bu1tail:
 	ADD	R(OFFSET), R(FROM)
 	B	_b1tail
 
-FW0 = 7
-FR0 = 8
-FW1 = 8
-FR1 = 9
-FW2 = 9
-FR2 = 10
-FW3 = 10
-FR3 = 11
+RSHIFT = 4
+LSHIFT = 5
+OFFSET = 11
+
+FW0 = 6
+FR0 = 7
+FW1 = 7
+FR1 = 8
 
 _funaligned:
 	CMP	$2, R(TMP)
@@ -192,32 +186,26 @@ _funaligned:
 	MOVW.GT	$8, R(LSHIFT)
 	MOVW.GT	$1, R(OFFSET)
 
-	SUB	$16, R(TE), R(TMP)	/* do 16-byte chunks if possible */
+	SUB	$8, R(TE), R(TMP)	/* do 8-byte chunks if possible */
 	CMP	R(TMP), R(TS)
 	BHS	_f1tail
 
-	AND	$~0x03, R(FROM)		/* align source */
-	MOVW.P	4(R(FROM)), R(FR3)	/* prime last block register, implicit write back */
+	BIC	$3, R(FROM)		/* align source */
+	MOVW.P	4(R(FROM)), R(FR1)	/* prime last block register, implicit write back */
 
-_fu16loop:
+_fu8loop:
 	CMP	R(TMP), R(TS)
 	BHS	_fu1tail
 
-	MOVW	R(FR3)>>R(RSHIFT), R(FW0)
-	MOVM.IA.W (R(FROM)), [R(FR0)-R(FR3)]
+	MOVW	R(FR1)>>R(RSHIFT), R(FW0)
+	MOVM.IA.W (R(FROM)), [R(FR0)-R(FR1)]
 	ORR	R(FR0)<<R(LSHIFT), R(FW0)
 
 	MOVW	R(FR0)>>R(RSHIFT), R(FW1)
 	ORR	R(FR1)<<R(LSHIFT), R(FW1)
 
-	MOVW	R(FR1)>>R(RSHIFT), R(FW2)
-	ORR	R(FR2)<<R(LSHIFT), R(FW2)
-
-	MOVW	R(FR2)>>R(RSHIFT), R(FW3)
-	ORR	R(FR3)<<R(LSHIFT), R(FW3)
-
-	MOVM.IA.W [R(FW0)-R(FW3)], (R(TS))
-	B	_fu16loop
+	MOVM.IA.W [R(FW0)-R(FW1)], (R(TS))
+	B	_fu8loop
 
 _fu1tail:
 	SUB	R(OFFSET), R(FROM)

+ 4 - 8
sys/src/ape/lib/ap/arm/memset.s

@@ -25,24 +25,20 @@ _4align:				/* align on 4 */
 	B	_4align
 
 _4aligned:
-	SUB	$31, R(TOE), R(TMP)	/* do 32-byte chunks if possible */
+	SUB	$15, R(TOE), R(TMP)	/* do 16-byte chunks if possible */
 	CMP	R(TMP), R(TO)
 	BHS	_4tail
 
 	MOVW	R4, R5			/* replicate */
 	MOVW	R4, R6
 	MOVW	R4, R7
-	MOVW	R4, R8
-	MOVW	R4, R9
-	MOVW	R4, R10
-	MOVW	R4, R11
 
-_f32loop:
+_f16loop:
 	CMP	R(TMP), R(TO)
 	BHS	_4tail
 
-	MOVM.IA.W [R4-R11], (R(TO))
-	B	_f32loop
+	MOVM.IA.W [R4-R7], (R(TO))
+	B	_f16loop
 
 _4tail:
 	SUB	$3, R(TOE), R(TMP)	/* do remaining words if possible */

+ 5 - 5
sys/src/ape/lib/ap/arm/strcmp.s

@@ -22,31 +22,31 @@ _aligned:				/* is s2 now aligned? */
 
 _aloop:
 	MOVW.P	4(R1), R5		/* 4 at a time */
-	MOVW.P	4(R2), R9
+	MOVW.P	4(R2), R7
 
 	AND	R5, R3, R4
-	AND	R9, R3, R8
+	AND	R7, R3, R8
 	SUB.S	R8, R4, R0
 	BNE	_return
 	CMP	$0, R4
 	BEQ	_return
 
 	AND	R5>>8, R3, R4
-	AND	R9>>8, R3, R8
+	AND	R7>>8, R3, R8
 	SUB.S	R8, R4, R0
 	BNE	_return
 	CMP	$0, R4
 	BEQ	_return
 
 	AND	R5>>16, R3, R4
-	AND	R9>>16, R3, R8
+	AND	R7>>16, R3, R8
 	SUB.S	R8, R4, R0
 	BNE	_return
 	CMP	$0, R4
 	BEQ	_return
 
 	AND	R5>>24, R3, R4
-	AND	R9>>24, R3, R8
+	AND	R7>>24, R3, R8
 	SUB.S	R8, R4, R0
 	BNE	_return
 	CMP	$0, R4

+ 5 - 5
sys/src/ape/lib/ap/arm/vlop.s

@@ -1,11 +1,11 @@
 TEXT	_mulv(SB), $0
-	MOVW	4(FP),R9	/* l0 */
-	MOVW	8(FP),R10	/* h0 */
+	MOVW	4(FP),R8	/* l0 */
+	MOVW	8(FP),R11	/* h0 */
 	MOVW	12(FP),R4	/* l1 */
 	MOVW	16(FP),R5	/* h1 */
-	MULLU	R9,R4,(R6, R7)	/* l0*l1 */
-	MUL	R9,R5,R5	/* l0*h1 */
-	MUL	R10,R4,R4	/* h0*l1 */
+	MULLU	R8,R4,(R6, R7)	/* l0*l1 */
+	MUL	R8,R5,R5	/* l0*h1 */
+	MUL	R11,R4,R4	/* h0*l1 */
 	ADD	R4,R6
 	ADD	R5,R6
 	MOVW	R6,4(R0)

+ 0 - 127
sys/src/cmd/5c/bits.c

@@ -1,127 +0,0 @@
-#define	EXTERN
-#include "gc.h"
-
-/*
-Bits
-bor(Bits a, Bits b)
-{
-	Bits c;
-	int i;
-
-	for(i=0; i<BITS; i++)
-		c.b[i] = a.b[i] | b.b[i];
-	return c;
-}
-*/
-
-/*
-Bits
-band(Bits a, Bits b)
-{
-	Bits c;
-	int i;
-
-	for(i=0; i<BITS; i++)
-		c.b[i] = a.b[i] & b.b[i];
-	return c;
-}
-*/
-
-/*
-Bits
-bnot(Bits a)
-{
-	Bits c;
-	int i;
-
-	for(i=0; i<BITS; i++)
-		c.b[i] = ~a.b[i];
-	return c;
-}
-*/
-
-int
-bany(Bits *a)
-{
-	int i;
-
-	for(i=0; i<BITS; i++)
-		if(a->b[i])
-			return 1;
-	return 0;
-}
-
-/*
-int
-beq(Bits a, Bits b)
-{
-	int i;
-
-	for(i=0; i<BITS; i++)
-		if(a.b[i] != b.b[i])
-			return 0;
-	return 1;
-}
-*/
-
-int
-bnum(Bits a)
-{
-	int i;
-	long b;
-
-	for(i=0; i<BITS; i++)
-		if(b = a.b[i])
-			return 32*i + bitno(b);
-	diag(Z, "bad in bnum");
-	return 0;
-}
-
-Bits
-blsh(unsigned n)
-{
-	Bits c;
-
-	c = zbits;
-	c.b[n/32] = 1L << (n%32);
-	return c;
-}
-
-/*
-int
-bset(Bits a, unsigned n)
-{
-	int i;
-
-	if(a.b[n/32] & (1L << (n%32)))
-		return 1;
-	return 0;
-}
-*/
-
-int
-Bconv(va_list *arg, Fconv *fp)
-{
-	char str[STRINGSZ], ss[STRINGSZ], *s;
-	Bits bits;
-	int i;
-
-	str[0] = 0;
-	bits = va_arg(*arg, Bits);
-	while(bany(&bits)) {
-		i = bnum(bits);
-		if(str[0])
-			strcat(str, " ");
-		if(var[i].sym == S) {
-			sprint(ss, "$%ld", var[i].offset);
-			s = ss;
-		} else
-			s = var[i].sym->name;
-		if(strlen(str) + strlen(s) + 1 >= STRINGSZ)
-			break;
-		strcat(str, s);
-		bits.b[i/32] &= ~(1L << (i%32));
-	}
-	strconv(str, fp);
-	return 0;
-}

+ 4 - 0
sys/src/cmd/5c/cgen.c

@@ -1071,6 +1071,10 @@ copy:
 		}
 		regalloc(&nod3, &regnode, Z);
 		regalloc(&nod4, &regnode, Z);
+		if(nod3.reg > nod4.reg){
+			/* code below assumes nod3 loaded first */
+			Node t = nod3; nod3 = nod4; nod4 = t;
+		}
 		nod0 = *nodconst((1<<nod3.reg)|(1<<nod4.reg));
 		if(w == 2 && nod1.xoffset == 0)
 			gmovm(&nod1, &nod0, 0);

+ 23 - 5
sys/src/cmd/5c/txt.c

@@ -1,5 +1,7 @@
 #include "gc.h"
 
+static	char	resvreg[nelem(reg)];
+
 void
 ginit(void)
 {
@@ -80,6 +82,16 @@ ginit(void)
 	com64init();
 
 	memset(reg, 0, sizeof(reg));
+	/* don't allocate */
+	reg[REGTMP] = 1;
+	reg[REGSB] = 1;
+	reg[REGSP] = 1;
+	reg[REGLINK] = 1;
+	reg[REGPC] = 1;
+	/* keep two external registers */
+	reg[REGEXT] = 1;
+	reg[REGEXT-1] = 1;
+	memmove(resvreg, reg, sizeof(reg));
 }
 
 void
@@ -89,10 +101,10 @@ gclean(void)
 	Sym *s;
 
 	for(i=0; i<NREG; i++)
-		if(reg[i])
+		if(reg[i] && !resvreg[i])
 			diag(Z, "reg %d left allocated", i);
 	for(i=NREG; i<NREG+NFREG; i++)
-		if(reg[i])
+		if(reg[i] && !resvreg[i])
 			diag(Z, "freg %d left allocated", i-NREG);
 	while(mnstring)
 		outstring("", 1L);
@@ -283,7 +295,7 @@ regalloc(Node *n, Node *tn, Node *o)
 		for(i=REGRET+1; i<NREG; i++) {
 			if(j >= NREG)
 				j = REGRET+1;
-			if(reg[j] == 0) {
+			if(reg[j] == 0 && resvreg[j] == 0) {
 				i = j;
 				goto out;
 			}
@@ -319,7 +331,7 @@ err:
 	return;
 out:
 	reg[i]++;
-/* 	lasti++;	*** StrongARM does register forwarding */	
+	lasti++;
 	if(lasti >= 5)
 		lasti = 0;
 	nodreg(n, tn, i);
@@ -1184,9 +1196,12 @@ exreg(Type *t)
 	long o;
 
 	if(typechlp[t->etype]) {
-		if(exregoffset <= REGEXT-4)
+		if(exregoffset <= REGEXT-2)
 			return 0;
 		o = exregoffset;
+		if(reg[o] && !resvreg[o])
+			return 0;
+		resvreg[o] = reg[o] = 1;
 		exregoffset--;
 		return o;
 	}
@@ -1194,6 +1209,9 @@ exreg(Type *t)
 		if(exfregoffset <= NFREG-1)
 			return 0;
 		o = exfregoffset + NREG;
+		if(reg[o] && !resvreg[o])
+			return 0;
+		resvreg[o] = reg[o] = 1;
 		exfregoffset--;
 		return o;
 	}

+ 7 - 3
sys/src/cmd/5i/5i.c

@@ -4,6 +4,8 @@
 #include <mach.h>
 #include "arm.h"
 
+#include <tos.h>
+
 char*	file = "5.out";
 int	datasize;
 ulong	textbase;
@@ -138,12 +140,13 @@ void
 initstk(int argc, char *argv[])
 {
 	ulong size;
-	ulong sp, ap;
+	ulong sp, ap, tos;
 	int i;
 	char *p;
 
 	initmap();
-	sp = STACKTOP - 4;
+	tos = STACKTOP - sizeof(Tos)*2;	/* we'll assume twice the host's is big enough */
+	sp = tos;
 
 	/* Build exec stack */
 	size = strlen(file)+1+BY2WD+BY2WD+BY2WD;	
@@ -151,7 +154,8 @@ initstk(int argc, char *argv[])
 		size += strlen(argv[i])+BY2WD+1;
 
 	sp -= size;
-	sp &= ~3;
+	sp &= ~7;
+	reg.r[0] = tos;
 	reg.r[13] = sp;
 	reg.r[1] = STACKTOP-4;	/* Plan 9 profiling clock */
 

+ 2 - 1
sys/src/cmd/5i/arm.h

@@ -160,6 +160,7 @@ ulong		getmem_2(ulong);
 ulong		getmem_4(ulong);
 uchar		getmem_b(ulong);
 ushort		getmem_h(ulong);
+uvlong		getmem_v(ulong);
 ulong		getmem_w(ulong);
 ulong		ifetch(ulong);
 void		inithdr(int);
@@ -181,8 +182,8 @@ void		printsource(long);
 void		procinit(int);
 void		putmem_b(ulong, uchar);
 void		putmem_h(ulong, ushort);
+void		putmem_v(ulong, uvlong);
 void		putmem_w(ulong, ulong);
-void		randseed(long, long);
 void		reset(void);
 void		run(void);
 void		segsum(void);

+ 13 - 0
sys/src/cmd/5i/mem.c

@@ -109,6 +109,12 @@ getmem_b(ulong addr)
 	return va[0];
 }
 
+uvlong
+getmem_v(ulong addr)
+{
+	return ((uvlong)getmem_w(addr+4) << 32) | getmem_w(addr);
+}
+
 void
 putmem_h(ulong addr, ushort data)
 {
@@ -161,6 +167,13 @@ putmem_b(ulong addr, uchar data)
 		brkchk(addr, Write);
 }
 
+void
+putmem_v(ulong addr, uvlong data)
+{
+	putmem_w(addr, data);	/* two stages, to catch brkchk */
+	putmem_w(addr+4, data>>32);
+}
+
 char *
 memio(char *mb, ulong mem, int size, int dir)
 {

+ 12 - 28
sys/src/cmd/5i/syscall.c

@@ -300,14 +300,7 @@ sys_read(void)
 void
 syspread(void)
 {
-	union {
-		vlong v;
-		ulong u[2];
-	} o;
-
-	o.u[0] = getmem_w(reg.r[13]+16);
-	o.u[1] = getmem_w(reg.r[13]+20);
-	sysread(o.v);
+	sysread(getmem_v(reg.r[13]+16));
 }
 
 void
@@ -316,24 +309,20 @@ sysseek(void)
 	int fd;
 	ulong mode;
 	ulong retp;
-	union {
-		vlong v;
-		ulong u[2];
-	} o;
+	vlong v;
 
 	retp = getmem_w(reg.r[13]+4);
 	fd = getmem_w(reg.r[13]+8);
-	o.u[0] = getmem_w(reg.r[13]+12);
-	o.u[1] = getmem_w(reg.r[13]+16);
+	v = getmem_v(reg.r[13]+16);
 	mode = getmem_w(reg.r[13]+20);
 	if(sysdbg)
-		itrace("seek(%d, %lld, %d)", fd, o.v, mode);
+		itrace("seek(%d, %lld, %d)", fd, v, mode);
 
-	o.v = seek(fd, o.v, mode);
-	if(o.v < 0)
+	v = seek(fd, v, mode);
+	if(v < 0)
 		errstr(errbuf, sizeof errbuf);	
 
-	memio((char*)o.u, retp, sizeof(vlong), MemWrite);
+	putmem_v(retp, v);
 }
 
 void
@@ -505,14 +494,7 @@ sys_write(void)
 void
 syspwrite(void)
 {
-	union {
-		vlong v;
-		ulong u[2];
-	} o;
-
-	o.u[0] = getmem_w(reg.r[13]+16);
-	o.u[1] = getmem_w(reg.r[13]+20);
-	syswrite(o.v);
+	syswrite(getmem_v(reg.r[13]+16));
 }
 
 void
@@ -811,9 +793,11 @@ Ssyscall(ulong)
 	int call;
 
 	call = reg.r[REGARG];
-	if(call < 0 || call > PWRITE || systab[call] == nil) {
-		Bprint(bioout, "bad system call\n");
+	if(call < 0 || call >= nelem(systab) || systab[call] == nil) {
+		Bprint(bioout, "bad system call %d (%#ux)\n", call, call);
 		dumpreg();
+		Bflush(bioout);
+		return;
 	}
 
 	if(trace)

+ 3 - 2
sys/src/libc/arm/main9p.s

@@ -14,8 +14,9 @@ TEXT	_mainp(SB), 1, $(16 + NPRIVATES*4)
 	MOVW	R1, _nprivates(SB)
 
 	BL	_profmain(SB)
-	MOVW	__prof+4(SB), R(arg)
-	MOVW	R(arg), __prof+0(SB)
+	MOVW	_tos(SB), R1
+	MOVW	4(R1), R0
+	MOVW	R0, 0(R1)
 
 	MOVW	$inargv+0(FP), R(arg)
 	MOVW	R(arg), 8(R(sp))

+ 36 - 48
sys/src/libc/arm/memmove.s

@@ -40,8 +40,10 @@ _b32loop:
 	CMP	R(TMP), R(TE)
 	BLS	_b4tail
 
-	MOVM.DB.W (R(FROM)), [R4-R11]
-	MOVM.DB.W [R4-R11], (R(TE))
+	MOVM.DB.W (R(FROM)), [R4-R7]
+	MOVM.DB.W [R4-R7], (R(TE))
+	MOVM.DB.W (R(FROM)), [R4-R7]
+	MOVM.DB.W [R4-R7], (R(TE))
 	B	_b32loop
 
 _b4tail:				/* do remaining words if possible */
@@ -83,8 +85,10 @@ _f32loop:
 	CMP	R(TMP), R(TS)
 	BHS	_f4tail
 
-	MOVM.IA.W (R(FROM)), [R4-R11] 
-	MOVM.IA.W [R4-R11], (R(TS))
+	MOVM.IA.W (R(FROM)), [R4-R7] 
+	MOVM.IA.W [R4-R7], (R(TS))
+	MOVM.IA.W (R(FROM)), [R4-R7] 
+	MOVM.IA.W [R4-R7], (R(TS))
 	B	_f32loop
 
 _f4tail:
@@ -111,16 +115,12 @@ _return:
 
 RSHIFT = 4
 LSHIFT = 5
-OFFSET = 6
+OFFSET = 11
 
-BR0 = 7
-BW0 = 8
-BR1 = 8
-BW1 = 9
-BR2 = 9
-BW2 = 10
-BR3 = 10
-BW3 = 11
+BR0 = 6
+BW0 = 7
+BR1 = 7
+BW1 = 8
 
 _bunaligned:
 	CMP	$2, R(TMP)		/* is R(TMP) < 2 ? */
@@ -137,45 +137,39 @@ _bunaligned:
 	MOVW.GT	$8, R(LSHIFT)
 	MOVW.GT	$3, R(OFFSET)
 
-	ADD	$16, R(TS), R(TMP)	/* do 16-byte chunks if possible */
+	ADD	$8, R(TS), R(TMP)	/* do 8-byte chunks if possible */
 	CMP	R(TMP), R(TE)
 	BLS	_b1tail
 
-	AND	$~0x03, R(FROM)		/* align source */
+	BIC	$3, R(FROM)		/* align source */
 	MOVW	(R(FROM)), R(BR0)	/* prime first block register */
 
-_bu16loop:
+_bu8loop:
 	CMP	R(TMP), R(TE)
 	BLS	_bu1tail
 
-	MOVW	R(BR0)<<R(LSHIFT), R(BW3)
-	MOVM.DB.W (R(FROM)), [R(BR0)-R(BR3)]
-	ORR	R(BR3)>>R(RSHIFT), R(BW3)
-
-	MOVW	R(BR3)<<R(LSHIFT), R(BW2)
-	ORR	R(BR2)>>R(RSHIFT), R(BW2)
-
-	MOVW	R(BR2)<<R(LSHIFT), R(BW1)
+	MOVW	R(BR0)<<R(LSHIFT), R(BW1)
+	MOVM.DB.W (R(FROM)), [R(BR0)-R(BR1)]
 	ORR	R(BR1)>>R(RSHIFT), R(BW1)
 
 	MOVW	R(BR1)<<R(LSHIFT), R(BW0)
 	ORR	R(BR0)>>R(RSHIFT), R(BW0)
 
-	MOVM.DB.W [R(BW0)-R(BW3)], (R(TE))
-	B	_bu16loop
+	MOVM.DB.W [R(BW0)-R(BW1)], (R(TE))
+	B	_bu8loop
 
 _bu1tail:
 	ADD	R(OFFSET), R(FROM)
 	B	_b1tail
 
-FW0 = 7
-FR0 = 8
-FW1 = 8
-FR1 = 9
-FW2 = 9
-FR2 = 10
-FW3 = 10
-FR3 = 11
+RSHIFT = 4
+LSHIFT = 5
+OFFSET = 11
+
+FW0 = 6
+FR0 = 7
+FW1 = 7
+FR1 = 8
 
 _funaligned:
 	CMP	$2, R(TMP)
@@ -192,32 +186,26 @@ _funaligned:
 	MOVW.GT	$8, R(LSHIFT)
 	MOVW.GT	$1, R(OFFSET)
 
-	SUB	$16, R(TE), R(TMP)	/* do 16-byte chunks if possible */
+	SUB	$8, R(TE), R(TMP)	/* do 8-byte chunks if possible */
 	CMP	R(TMP), R(TS)
 	BHS	_f1tail
 
-	AND	$~0x03, R(FROM)		/* align source */
-	MOVW.P	4(R(FROM)), R(FR3)	/* prime last block register, implicit write back */
+	BIC	$3, R(FROM)		/* align source */
+	MOVW.P	4(R(FROM)), R(FR1)	/* prime last block register, implicit write back */
 
-_fu16loop:
+_fu8loop:
 	CMP	R(TMP), R(TS)
 	BHS	_fu1tail
 
-	MOVW	R(FR3)>>R(RSHIFT), R(FW0)
-	MOVM.IA.W (R(FROM)), [R(FR0)-R(FR3)]
+	MOVW	R(FR1)>>R(RSHIFT), R(FW0)
+	MOVM.IA.W (R(FROM)), [R(FR0)-R(FR1)]
 	ORR	R(FR0)<<R(LSHIFT), R(FW0)
 
 	MOVW	R(FR0)>>R(RSHIFT), R(FW1)
 	ORR	R(FR1)<<R(LSHIFT), R(FW1)
 
-	MOVW	R(FR1)>>R(RSHIFT), R(FW2)
-	ORR	R(FR2)<<R(LSHIFT), R(FW2)
-
-	MOVW	R(FR2)>>R(RSHIFT), R(FW3)
-	ORR	R(FR3)<<R(LSHIFT), R(FW3)
-
-	MOVM.IA.W [R(FW0)-R(FW3)], (R(TS))
-	B	_fu16loop
+	MOVM.IA.W [R(FW0)-R(FW1)], (R(TS))
+	B	_fu8loop
 
 _fu1tail:
 	SUB	R(OFFSET), R(FROM)

+ 4 - 8
sys/src/libc/arm/memset.s

@@ -25,24 +25,20 @@ _4align:				/* align on 4 */
 	B	_4align
 
 _4aligned:
-	SUB	$31, R(TOE), R(TMP)	/* do 32-byte chunks if possible */
+	SUB	$15, R(TOE), R(TMP)	/* do 16-byte chunks if possible */
 	CMP	R(TMP), R(TO)
 	BHS	_4tail
 
 	MOVW	R4, R5			/* replicate */
 	MOVW	R4, R6
 	MOVW	R4, R7
-	MOVW	R4, R8
-	MOVW	R4, R9
-	MOVW	R4, R10
-	MOVW	R4, R11
 
-_f32loop:
+_f16loop:
 	CMP	R(TMP), R(TO)
 	BHS	_4tail
 
-	MOVM.IA.W [R4-R11], (R(TO))
-	B	_f32loop
+	MOVM.IA.W [R4-R7], (R(TO))
+	B	_f16loop
 
 _4tail:
 	SUB	$3, R(TOE), R(TMP)	/* do remaining words if possible */

+ 1 - 1
sys/src/libc/arm/mkfile

@@ -5,7 +5,7 @@ LIB=/$objtype/lib/libc.a
 SFILES=\
 	argv0.s\
 	div.s\
-	getcallerpc.$O\
+	getcallerpc.s\
 	getfcr.s\
 	main9.s\
 	main9p.s\

+ 5 - 5
sys/src/libc/arm/strcmp.s

@@ -22,31 +22,31 @@ _aligned:				/* is s2 now aligned? */
 
 _aloop:
 	MOVW.P	4(R1), R5		/* 4 at a time */
-	MOVW.P	4(R2), R9
+	MOVW.P	4(R2), R7
 
 	AND	R5, R3, R4
-	AND	R9, R3, R8
+	AND	R7, R3, R8
 	SUB.S	R8, R4, R0
 	BNE	_return
 	CMP	$0, R4
 	BEQ	_return
 
 	AND	R5>>8, R3, R4
-	AND	R9>>8, R3, R8
+	AND	R7>>8, R3, R8
 	SUB.S	R8, R4, R0
 	BNE	_return
 	CMP	$0, R4
 	BEQ	_return
 
 	AND	R5>>16, R3, R4
-	AND	R9>>16, R3, R8
+	AND	R7>>16, R3, R8
 	SUB.S	R8, R4, R0
 	BNE	_return
 	CMP	$0, R4
 	BEQ	_return
 
 	AND	R5>>24, R3, R4
-	AND	R9>>24, R3, R8
+	AND	R7>>24, R3, R8
 	SUB.S	R8, R4, R0
 	BNE	_return
 	CMP	$0, R4

+ 5 - 5
sys/src/libc/arm/vlop.s

@@ -1,11 +1,11 @@
 TEXT	_mulv(SB), $0
-	MOVW	4(FP),R9	/* l0 */
-	MOVW	8(FP),R10	/* h0 */
+	MOVW	4(FP),R8	/* l0 */
+	MOVW	8(FP),R11	/* h0 */
 	MOVW	12(FP),R4	/* l1 */
 	MOVW	16(FP),R5	/* h1 */
-	MULLU	R9,R4,(R6, R7)	/* l0*l1 */
-	MUL	R9,R5,R5	/* l0*h1 */
-	MUL	R10,R4,R4	/* h0*l1 */
+	MULLU	R8,R4,(R6, R7)	/* l0*l1 */
+	MUL	R8,R5,R5	/* l0*h1 */
+	MUL	R11,R4,R4	/* h0*l1 */
 	ADD	R4,R6
 	ADD	R5,R6
 	MOVW	R6,4(R0)

+ 0 - 3
sys/src/libc/arm/vlrt.c

@@ -46,7 +46,6 @@ _subv(Vlong *r, Vlong a, Vlong b)
 
 #pragma profile on
 
-
 void
 _d2v(Vlong *y, double d)
 {
@@ -140,7 +139,6 @@ dodiv(Vlong num, Vlong den, Vlong *q, Vlong *r)
 	numlo = num.lo;
 	denhi = den.hi;
 	denlo = den.lo;
-
 	/*
 	 * get a divide by zero
 	 */
@@ -195,7 +193,6 @@ dodiv(Vlong num, Vlong den, Vlong *q, Vlong *r)
 void
 _divvu(Vlong *q, Vlong n, Vlong d)
 {
-
 	if(n.hi == 0 && d.hi == 0) {
 		q->hi = 0;
 		q->lo = n.lo / d.lo;