Browse Source

Plan 9 from Bell Labs 2005-04-26

David du Colombier 19 years ago
parent
commit
2cd808b559

+ 71 - 0
amd64/include/u.h

@@ -0,0 +1,71 @@
+#define nil		((void*)0)
+typedef	unsigned short	ushort;
+typedef	unsigned char	uchar;
+typedef unsigned long	ulong;
+typedef unsigned int	uint;
+typedef   signed char	schar;
+typedef	long long	vlong;
+typedef	unsigned long long uvlong;
+typedef uvlong		uintptr;
+typedef	ushort		Rune;
+typedef union FPdbleword FPdbleword;
+typedef uvlong		jmp_buf[2];
+#define	JMPBUFSP	0
+#define	JMPBUFPC	1
+#define	JMPBUFDPC	0
+typedef unsigned int	mpdigit;	/* for /sys/include/mp.h */
+typedef unsigned char	u8int;
+typedef unsigned short	u16int;
+typedef unsigned int	u32int;
+typedef unsigned long long u64int;
+
+/* MXCSR */
+/* fcr */
+#define	FPFTZ	(1<<15)	/* amd64 */
+#define	FPINEX	(1<<12)
+#define	FPUNFL	(1<<11)
+#define	FPOVFL	(1<<10)
+#define	FPZDIV	(1<<9)
+#define	FPDNRM	(1<<8)	/* amd64 */
+#define	FPINVAL	(1<<7)
+#define	FPDAZ	(1<<6)	/* amd64 */
+#define	FPRNR	(0<<13)
+#define	FPRZ	(3<<13)
+#define	FPRPINF	(2<<13)
+#define	FPRNINF	(1<<13)
+#define	FPRMASK	(3<<13)
+#define	FPPEXT	0
+#define	FPPSGL	0
+#define	FPPDBL	0
+#define	FPPMASK	0
+/* fsr */
+#define	FPAINEX	(1<<5)
+#define	FPAUNFL	(1<<4)
+#define	FPAOVFL	(1<<3)
+#define	FPAZDIV	(1<<2)
+#define	FPADNRM	(1<<1)	/* not in plan 9 */
+#define	FPAINVAL	(1<<0)
+union FPdbleword
+{
+	double	x;
+	struct {	/* little endian */
+		uint lo;
+		uint hi;
+	};
+};
+
+typedef	char*	va_list;
+#define va_start(list, start) list =\
+	(sizeof(start) < 8?\
+		(char*)((vlong*)&(start)+1):\
+		(char*)(&(start)+1))
+#define va_end(list)\
+	USED(list)
+#define va_arg(list, mode)\
+	((sizeof(mode) == 1)?\
+		((mode*)(list += 8))[-8]:\
+	(sizeof(mode) == 2)?\
+		((mode*)(list += 8))[-4]:\
+	(sizeof(mode) == 4)?\
+		((mode*)(list += 8))[-2]:\
+		((mode*)(list += sizeof(mode)))[-1])

+ 30 - 0
amd64/include/ureg.h

@@ -0,0 +1,30 @@
+struct Ureg {
+	u64int	ax;
+	u64int	bx;
+	u64int	cx;
+	u64int	dx;
+	u64int	si;
+	u64int	di;
+	u64int	bp;
+	u64int	r8;
+	u64int	r9;
+	u64int	r10;
+	u64int	r11;
+	u64int	r12;
+	u64int	r13;
+	u64int	r14;
+	u64int	r15;
+
+	u16int	ds;
+	u16int	es;
+	u16int	fs;
+	u16int	gs;
+
+	u64int	type;
+	u64int	error;		/* error code (or zero) */
+	u64int	ip;		/* pc */
+	u64int	cs;		/* old context */
+	u64int	flags;		/* old flags */
+	u64int	sp;		/* sp */
+	u64int	ss;		/* old stack segment */
+};

+ 6 - 0
amd64/mkfile

@@ -0,0 +1,6 @@
+</sys/src/mkfile.proto
+
+CC=6c
+LD=6l
+O=6
+AS=6a

+ 65 - 26
dist/replica/_plan9.db

@@ -147,7 +147,7 @@
 386/bin/aux/tr2post - 775 sys sys 1104121987 176578
 386/bin/aux/tr2post - 775 sys sys 1104121987 176578
 386/bin/aux/trampoline - 775 sys sys 1104121988 83293
 386/bin/aux/trampoline - 775 sys sys 1104121988 83293
 386/bin/aux/typepasswd - 775 sys sys 1104121988 69503
 386/bin/aux/typepasswd - 775 sys sys 1104121988 69503
-386/bin/aux/vga - 775 sys sys 1109563697 301643
+386/bin/aux/vga - 775 sys sys 1114453635 309981
 386/bin/aux/vmmousepoll - 775 sys sys 1032480572 41434
 386/bin/aux/vmmousepoll - 775 sys sys 1032480572 41434
 386/bin/aux/vmware - 775 sys sys 1049428256 453
 386/bin/aux/vmware - 775 sys sys 1049428256 453
 386/bin/aux/vmwarefs - 775 sys sys 1095563640 99117
 386/bin/aux/vmwarefs - 775 sys sys 1095563640 99117
@@ -549,7 +549,7 @@
 386/lib/libhttpd.a - 664 sys sys 1108268398 99488
 386/lib/libhttpd.a - 664 sys sys 1108268398 99488
 386/lib/libip.a - 664 sys sys 1108268398 35602
 386/lib/libip.a - 664 sys sys 1108268398 35602
 386/lib/libl.a - 664 sys sys 1108268398 5384
 386/lib/libl.a - 664 sys sys 1108268398 5384
-386/lib/libmach.a - 664 sys sys 1114225969 658810
+386/lib/libmach.a - 664 sys sys 1114459829 834000
 386/lib/libmemdraw.a - 664 sys sys 1110946101 283198
 386/lib/libmemdraw.a - 664 sys sys 1110946101 283198
 386/lib/libmemlayer.a - 664 sys sys 1108699740 47360
 386/lib/libmemlayer.a - 664 sys sys 1108699740 47360
 386/lib/libmp.a - 664 sys sys 1108268401 79532
 386/lib/libmp.a - 664 sys sys 1108268401 79532
@@ -832,6 +832,13 @@ alpha/include/ureg.h - 664 sys sys 944946362 644
 alpha/lib - 20000000775 sys sys 947992106 0
 alpha/lib - 20000000775 sys sys 947992106 0
 alpha/lib/ape - 20000000775 sys sys 947992106 0
 alpha/lib/ape - 20000000775 sys sys 947992106 0
 alpha/mkfile - 664 sys sys 948141303 46
 alpha/mkfile - 664 sys sys 948141303 46
+amd64 - 20000000775 sys sys 1114458599 0
+amd64/bin - 20000000775 sys sys 1114458475 0
+amd64/include - 20000000775 sys sys 1114458660 0
+amd64/include/u.h - 644 sys sys 1114458660 1658
+amd64/include/ureg.h - 644 sys sys 1114458660 454
+amd64/lib - 20000000775 sys sys 1114458490 0
+amd64/mkfile - 644 sys sys 1114458599 46
 arm - 20000000775 sys sys 947991045 0
 arm - 20000000775 sys sys 947991045 0
 arm/bin - 20000000775 sys sys 1018321186 0
 arm/bin - 20000000775 sys sys 1018321186 0
 arm/bin/ape - 20000000775 sys sys 985644327 0
 arm/bin/ape - 20000000775 sys sys 985644327 0
@@ -870,7 +877,7 @@ dist/replica - 20000000775 sys sys 1019277119 0
 dist/replica/cd - 664 sys sys 1019527959 390
 dist/replica/cd - 664 sys sys 1019527959 390
 dist/replica/kfs - 664 sys sys 1019527929 237
 dist/replica/kfs - 664 sys sys 1019527929 237
 dist/replica/network - 775 sys sys 1071079179 996
 dist/replica/network - 775 sys sys 1071079179 996
-dist/replica/plan9.proto - 664 sys sys 1112361655 2500
+dist/replica/plan9.proto - 664 sys sys 1114460221 2560
 env - 20000000775 sys sys 1015094872 0
 env - 20000000775 sys sys 1015094872 0
 fd - 20000000775 sys sys 947958544 0
 fd - 20000000775 sys sys 947958544 0
 lib - 20000000775 sys sys 958504315 0
 lib - 20000000775 sys sys 958504315 0
@@ -3654,6 +3661,13 @@ sparc/include/ureg.h - 664 sys sys 944946363 599
 sparc/lib - 20000000775 sys sys 947992106 0
 sparc/lib - 20000000775 sys sys 947992106 0
 sparc/lib/ape - 20000000775 sys sys 947992106 0
 sparc/lib/ape - 20000000775 sys sys 947992106 0
 sparc/mkfile - 664 sys sys 948141304 52
 sparc/mkfile - 664 sys sys 948141304 52
+sparc64 - 20000000775 sys sys 1114458667 0
+sparc64/bin - 20000000775 sys sys 1114458528 0
+sparc64/include - 20000000775 sys sys 1114458675 0
+sparc64/include/u.h - 644 sys sys 1114458675 1423
+sparc64/include/ureg.h - 644 sys sys 1114458675 719
+sparc64/lib - 20000000775 sys sys 1114458535 0
+sparc64/mkfile - 644 sys sys 1114458667 46
 sys - 20000000775 sys sys 952648870 0
 sys - 20000000775 sys sys 952648870 0
 sys/doc - 20000000775 sys sys 1018471272 0
 sys/doc - 20000000775 sys sys 1018471272 0
 sys/doc/-.2669382.gif - 664 sys sys 1019969850 2078
 sys/doc/-.2669382.gif - 664 sys sys 1019969850 2078
@@ -4117,7 +4131,7 @@ sys/lib/dist/pc/inst/stopppp - 775 sys sys 1018469719 250
 sys/lib/dist/pc/inst/textonly - 775 sys sys 1112361039 182
 sys/lib/dist/pc/inst/textonly - 775 sys sys 1112361039 182
 sys/lib/dist/pc/inst/watchfd - 775 sys sys 1112361039 361
 sys/lib/dist/pc/inst/watchfd - 775 sys sys 1112361039 361
 sys/lib/dist/pc/inst/xxx - 775 sys sys 1018469719 160
 sys/lib/dist/pc/inst/xxx - 775 sys sys 1018469719 160
-sys/lib/dist/pc/mkfile - 664 sys sys 1114364348 2045
+sys/lib/dist/pc/mkfile - 664 sys sys 1114446424 2148
 sys/lib/dist/pc/plan9.ini - 664 sys sys 1020361168 512
 sys/lib/dist/pc/plan9.ini - 664 sys sys 1020361168 512
 sys/lib/dist/pc/plan9.ini.blank - 664 sys sys 1018469720 512
 sys/lib/dist/pc/plan9.ini.blank - 664 sys sys 1018469720 512
 sys/lib/dist/pc/plan9.ini.cd - 664 sys sys 1092148201 357
 sys/lib/dist/pc/plan9.ini.cd - 664 sys sys 1092148201 357
@@ -5643,7 +5657,7 @@ sys/man/8/udpecho - 664 sys sys 954305553 303
 sys/man/8/update - 664 sys sys 961259288 2336
 sys/man/8/update - 664 sys sys 961259288 2336
 sys/man/8/venti - 664 sys sys 1069101926 5422
 sys/man/8/venti - 664 sys sys 1069101926 5422
 sys/man/8/ventiaux - 664 sys sys 1063855987 10487
 sys/man/8/ventiaux - 664 sys sys 1063855987 10487
-sys/man/8/vga - 664 sys sys 959698505 3557
+sys/man/8/vga - 664 sys sys 1114454069 3936
 sys/man/fonts - 664 sys sys 944959700 218
 sys/man/fonts - 664 sys sys 944959700 218
 sys/man/index.html - 664 sys sys 1019918444 1859
 sys/man/index.html - 664 sys sys 1019918444 1859
 sys/man/mkfile - 664 sys sys 1018974173 2264
 sys/man/mkfile - 664 sys sys 1018974173 2264
@@ -6976,7 +6990,7 @@ sys/src/boot/pc/apm.c - 664 sys sys 1015007947 289
 sys/src/boot/pc/bcom.c - 664 sys sys 1032215919 6421
 sys/src/boot/pc/bcom.c - 664 sys sys 1032215919 6421
 sys/src/boot/pc/boot.c - 664 sys sys 1109364490 8418
 sys/src/boot/pc/boot.c - 664 sys sys 1109364490 8418
 sys/src/boot/pc/bootld.c - 664 sys sys 1015007948 1801
 sys/src/boot/pc/bootld.c - 664 sys sys 1015007948 1801
-sys/src/boot/pc/bootp.c - 664 sys sys 1107882190 12147
+sys/src/boot/pc/bootp.c - 664 sys sys 1114464742 12374
 sys/src/boot/pc/cga.c - 664 sys sys 1015007948 1362
 sys/src/boot/pc/cga.c - 664 sys sys 1015007948 1362
 sys/src/boot/pc/clock.c - 664 sys sys 1103641772 6425
 sys/src/boot/pc/clock.c - 664 sys sys 1103641772 6425
 sys/src/boot/pc/conf.c - 664 sys sys 1094674484 10217
 sys/src/boot/pc/conf.c - 664 sys sys 1094674484 10217
@@ -7030,7 +7044,7 @@ sys/src/boot/pc/mem.h - 664 sys sys 1103641771 3371
 sys/src/boot/pc/memory.c - 664 sys sys 1019533021 10272
 sys/src/boot/pc/memory.c - 664 sys sys 1019533021 10272
 sys/src/boot/pc/mkfile - 664 sys sys 1103641863 3105
 sys/src/boot/pc/mkfile - 664 sys sys 1103641863 3105
 sys/src/boot/pc/noether.c - 664 sys sys 1094674488 358
 sys/src/boot/pc/noether.c - 664 sys sys 1094674488 358
-sys/src/boot/pc/part.c - 664 sys sys 1032215918 7505
+sys/src/boot/pc/part.c - 664 sys sys 1114427970 7509
 sys/src/boot/pc/pbs.s - 664 sys sys 1017854325 8279
 sys/src/boot/pc/pbs.s - 664 sys sys 1017854325 8279
 sys/src/boot/pc/pbsdisk - 775 sys sys 1017854325 509
 sys/src/boot/pc/pbsdisk - 775 sys sys 1017854325 509
 sys/src/boot/pc/pbsdisk.s - 664 sys sys 1017854325 6371
 sys/src/boot/pc/pbsdisk.s - 664 sys sys 1017854325 6371
@@ -7060,7 +7074,7 @@ sys/src/cmd/1c - 20000000775 sys sys 945321342 0
 sys/src/cmd/1c/bits.c - 664 sys sys 944961353 1370
 sys/src/cmd/1c/bits.c - 664 sys sys 944961353 1370
 sys/src/cmd/1c/cgen.c - 664 sys sys 1089299179 28257
 sys/src/cmd/1c/cgen.c - 664 sys sys 1089299179 28257
 sys/src/cmd/1c/enam.c - 664 sys sys 1089299179 4239
 sys/src/cmd/1c/enam.c - 664 sys sys 1089299179 4239
-sys/src/cmd/1c/gc.h - 664 sys sys 1089299178 6006
+sys/src/cmd/1c/gc.h - 664 sys sys 1114449033 6008
 sys/src/cmd/1c/list.c - 664 sys sys 1014926630 4507
 sys/src/cmd/1c/list.c - 664 sys sys 1014926630 4507
 sys/src/cmd/1c/mkfile - 664 sys sys 944961353 264
 sys/src/cmd/1c/mkfile - 664 sys sys 944961353 264
 sys/src/cmd/1c/mul.c - 664 sys sys 944961353 2599
 sys/src/cmd/1c/mul.c - 664 sys sys 944961353 2599
@@ -7091,7 +7105,7 @@ sys/src/cmd/2c/2.out.h - 664 sys sys 1089299176 5075
 sys/src/cmd/2c/bits.c - 664 sys sys 944960717 1370
 sys/src/cmd/2c/bits.c - 664 sys sys 944960717 1370
 sys/src/cmd/2c/cgen.c - 664 sys sys 1089299176 28451
 sys/src/cmd/2c/cgen.c - 664 sys sys 1089299176 28451
 sys/src/cmd/2c/enam.c - 664 sys sys 1089299176 4239
 sys/src/cmd/2c/enam.c - 664 sys sys 1089299176 4239
-sys/src/cmd/2c/gc.h - 664 sys sys 1014924675 6203
+sys/src/cmd/2c/gc.h - 664 sys sys 1114449040 6205
 sys/src/cmd/2c/list.c - 664 sys sys 1089299176 5521
 sys/src/cmd/2c/list.c - 664 sys sys 1089299176 5521
 sys/src/cmd/2c/mkfile - 664 sys sys 944960717 258
 sys/src/cmd/2c/mkfile - 664 sys sys 944960717 258
 sys/src/cmd/2c/mul.c - 664 sys sys 944960717 2599
 sys/src/cmd/2c/mul.c - 664 sys sys 944960717 2599
@@ -7591,8 +7605,8 @@ sys/src/cmd/aux/vga/clgd542x.c - 664 sys sys 1014925007 6916
 sys/src/cmd/aux/vga/clgd546x.c - 664 sys sys 1014925007 7996
 sys/src/cmd/aux/vga/clgd546x.c - 664 sys sys 1014925007 7996
 sys/src/cmd/aux/vga/ct65540.c - 664 sys sys 1014925007 5355
 sys/src/cmd/aux/vga/ct65540.c - 664 sys sys 1014925007 5355
 sys/src/cmd/aux/vga/cyber938x.c - 664 sys sys 1087406072 6543
 sys/src/cmd/aux/vga/cyber938x.c - 664 sys sys 1087406072 6543
-sys/src/cmd/aux/vga/data.c - 664 sys sys 1019498850 2200
-sys/src/cmd/aux/vga/db.c - 664 sys sys 1081201695 9430
+sys/src/cmd/aux/vga/data.c - 664 sys sys 1114453579 2249
+sys/src/cmd/aux/vga/db.c - 664 sys sys 1114453625 9568
 sys/src/cmd/aux/vga/error.c - 664 sys sys 1014925008 745
 sys/src/cmd/aux/vga/error.c - 664 sys sys 1014925008 745
 sys/src/cmd/aux/vga/et4000.c - 664 sys sys 1014925008 6720
 sys/src/cmd/aux/vga/et4000.c - 664 sys sys 1014925008 6720
 sys/src/cmd/aux/vga/et4000hwgc.c - 664 sys sys 1014925008 552
 sys/src/cmd/aux/vga/et4000hwgc.c - 664 sys sys 1014925008 552
@@ -7606,10 +7620,10 @@ sys/src/cmd/aux/vga/io.c - 664 sys sys 1014925009 6222
 sys/src/cmd/aux/vga/mach32.c - 664 sys sys 1014925009 6004
 sys/src/cmd/aux/vga/mach32.c - 664 sys sys 1014925009 6004
 sys/src/cmd/aux/vga/mach64.c - 664 sys sys 1014925009 8279
 sys/src/cmd/aux/vga/mach64.c - 664 sys sys 1014925009 8279
 sys/src/cmd/aux/vga/mach64xx.c - 664 sys sys 1097900455 30266
 sys/src/cmd/aux/vga/mach64xx.c - 664 sys sys 1097900455 30266
-sys/src/cmd/aux/vga/main.c - 664 sys sys 1014925010 8154
+sys/src/cmd/aux/vga/main.c - 664 sys sys 1114453579 9442
 sys/src/cmd/aux/vga/mga2164w.c - 664 sys sys 1014925010 13196
 sys/src/cmd/aux/vga/mga2164w.c - 664 sys sys 1014925010 13196
 sys/src/cmd/aux/vga/mga4xx.c - 664 sys sys 1014925010 35895
 sys/src/cmd/aux/vga/mga4xx.c - 664 sys sys 1014925010 35895
-sys/src/cmd/aux/vga/mkfile - 664 sys sys 1048636613 905
+sys/src/cmd/aux/vga/mkfile - 664 sys sys 1114453579 915
 sys/src/cmd/aux/vga/neomagic.c - 664 sys sys 1104430499 8975
 sys/src/cmd/aux/vga/neomagic.c - 664 sys sys 1104430499 8975
 sys/src/cmd/aux/vga/notes.txt - 664 sys sys 1028334647 14376
 sys/src/cmd/aux/vga/notes.txt - 664 sys sys 1028334647 14376
 sys/src/cmd/aux/vga/nvidia.c - 664 sys sys 1109511456 23718
 sys/src/cmd/aux/vga/nvidia.c - 664 sys sys 1109511456 23718
@@ -7634,8 +7648,9 @@ sys/src/cmd/aux/vga/tvp3025.c - 664 sys sys 1014925013 1960
 sys/src/cmd/aux/vga/tvp3025clock.c - 664 sys sys 1014925013 1511
 sys/src/cmd/aux/vga/tvp3025clock.c - 664 sys sys 1014925013 1511
 sys/src/cmd/aux/vga/tvp3026.c - 664 sys sys 1014925013 3580
 sys/src/cmd/aux/vga/tvp3026.c - 664 sys sys 1014925013 3580
 sys/src/cmd/aux/vga/tvp3026clock.c - 664 sys sys 1014925013 1960
 sys/src/cmd/aux/vga/tvp3026clock.c - 664 sys sys 1014925013 1960
+sys/src/cmd/aux/vga/vesa.c - 664 sys sys 1114453579 9357
 sys/src/cmd/aux/vga/vga.c - 664 sys sys 1014925013 9305
 sys/src/cmd/aux/vga/vga.c - 664 sys sys 1014925013 9305
-sys/src/cmd/aux/vga/vga.h - 664 sys sys 1025416295 10154
+sys/src/cmd/aux/vga/vga.h - 664 sys sys 1114453579 10336
 sys/src/cmd/aux/vga/virge.c - 664 sys sys 1090439328 18587
 sys/src/cmd/aux/vga/virge.c - 664 sys sys 1090439328 18587
 sys/src/cmd/aux/vga/vision864.c - 664 sys sys 1014925014 2325
 sys/src/cmd/aux/vga/vision864.c - 664 sys sys 1014925014 2325
 sys/src/cmd/aux/vga/vision964.c - 664 sys sys 1014925014 3426
 sys/src/cmd/aux/vga/vision964.c - 664 sys sys 1014925014 3426
@@ -12525,44 +12540,53 @@ sys/src/liblex/reject.c - 664 sys sys 944961728 1000
 sys/src/liblex/yyless.c - 664 sys sys 944961728 403
 sys/src/liblex/yyless.c - 664 sys sys 944961728 403
 sys/src/liblex/yywrap.c - 664 sys sys 944961728 85
 sys/src/liblex/yywrap.c - 664 sys sys 944961728 85
 sys/src/libmach - 20000000775 sys sys 969559166 0
 sys/src/libmach - 20000000775 sys sys 969559166 0
-sys/src/libmach/0.c - 664 sys sys 1021927268 4042
+sys/src/libmach/0.c - 664 sys sys 1114459829 4037
+sys/src/libmach/0c - 20000000775 sys sys 1114459438 0
+sys/src/libmach/0c/README - 644 sys sys 1114459609 73
+sys/src/libmach/0c/ureg.h - 644 sys sys 1114459438 886
 sys/src/libmach/2.c - 664 sys sys 964540513 2034
 sys/src/libmach/2.c - 664 sys sys 964540513 2034
 sys/src/libmach/2db.c - 664 sys sys 1014929543 61245
 sys/src/libmach/2db.c - 664 sys sys 1014929543 61245
 sys/src/libmach/2obj.c - 664 sys sys 1091732624 2335
 sys/src/libmach/2obj.c - 664 sys sys 1091732624 2335
 sys/src/libmach/5.c - 664 sys sys 984710422 1513
 sys/src/libmach/5.c - 664 sys sys 984710422 1513
 sys/src/libmach/5db.c - 664 sys sys 1114218476 21530
 sys/src/libmach/5db.c - 664 sys sys 1114218476 21530
 sys/src/libmach/5obj.c - 664 sys sys 1091732625 2209
 sys/src/libmach/5obj.c - 664 sys sys 1091732625 2209
+sys/src/libmach/6.c - 644 sys sys 1114459868 3366
+sys/src/libmach/6c - 20000000775 sys sys 1114459480 0
+sys/src/libmach/6c/6.out.h - 644 sys sys 1114459480 7984
+sys/src/libmach/6obj.c - 644 sys sys 1114459831 2382
 sys/src/libmach/7.c - 664 sys sys 964540515 3267
 sys/src/libmach/7.c - 664 sys sys 964540515 3267
 sys/src/libmach/7db.c - 664 sys sys 1014929543 17320
 sys/src/libmach/7db.c - 664 sys sys 1014929543 17320
 sys/src/libmach/7obj.c - 664 sys sys 1091732676 2367
 sys/src/libmach/7obj.c - 664 sys sys 1091732676 2367
 sys/src/libmach/8.c - 664 sys sys 964540515 2020
 sys/src/libmach/8.c - 664 sys sys 964540515 2020
-sys/src/libmach/8db.c - 664 sys sys 1088653064 39144
+sys/src/libmach/8db.c - 664 sys sys 1114459831 50189
 sys/src/libmach/8obj.c - 664 sys sys 1091732625 2200
 sys/src/libmach/8obj.c - 664 sys sys 1091732625 2200
 sys/src/libmach/access.c - 664 sys sys 1068478065 4309
 sys/src/libmach/access.c - 664 sys sys 1068478065 4309
-sys/src/libmach/elf.h - 664 sys sys 1107634043 2262
-sys/src/libmach/executable.c - 664 sys sys 1107963442 13918
+sys/src/libmach/elf.h - 664 sys sys 1114459895 2323
+sys/src/libmach/executable.c - 664 sys sys 1114459829 15179
 sys/src/libmach/k.c - 664 sys sys 964540516 3330
 sys/src/libmach/k.c - 664 sys sys 964540516 3330
 sys/src/libmach/kdb.c - 664 sys sys 1014929544 21143
 sys/src/libmach/kdb.c - 664 sys sys 1014929544 21143
 sys/src/libmach/kobj.c - 664 sys sys 1091732625 2217
 sys/src/libmach/kobj.c - 664 sys sys 1091732625 2217
 sys/src/libmach/machdata.c - 664 sys sys 964540516 8814
 sys/src/libmach/machdata.c - 664 sys sys 964540516 8814
 sys/src/libmach/map.c - 664 sys sys 964540517 3053
 sys/src/libmach/map.c - 664 sys sys 964540517 3053
-sys/src/libmach/mkfile - 664 sys sys 1089313991 439
-sys/src/libmach/obj.c - 664 sys sys 1089313993 5760
+sys/src/libmach/mkfile - 664 sys sys 1114459827 467
+sys/src/libmach/obj.c - 664 sys sys 1114459829 5918
 sys/src/libmach/obj.h - 664 sys sys 964540517 603
 sys/src/libmach/obj.h - 664 sys sys 964540517 603
 sys/src/libmach/q.c - 664 sys sys 1091732625 3590
 sys/src/libmach/q.c - 664 sys sys 1091732625 3590
-sys/src/libmach/qdb.c - 664 sys sys 1014929544 27188
+sys/src/libmach/qdb.c - 664 sys sys 1114459830 27490
 sys/src/libmach/qobj.c - 664 sys sys 1091732625 2310
 sys/src/libmach/qobj.c - 664 sys sys 1091732625 2310
-sys/src/libmach/setmach.c - 664 sys sys 1089313993 2682
+sys/src/libmach/setmach.c - 664 sys sys 1114459829 2913
 sys/src/libmach/swap.c - 664 sys sys 964540518 1026
 sys/src/libmach/swap.c - 664 sys sys 964540518 1026
 sys/src/libmach/sym.c - 664 sys sys 1106409575 26581
 sys/src/libmach/sym.c - 664 sys sys 1106409575 26581
+sys/src/libmach/u.c - 644 sys sys 1114459829 3396
+sys/src/libmach/uc - 20000000775 sys sys 1114459488 0
+sys/src/libmach/uc/README - 644 sys sys 1114459488 73
+sys/src/libmach/uc/u.out.h - 644 sys sys 1114459488 3137
+sys/src/libmach/udb.c - 644 sys sys 1114459830 21893
+sys/src/libmach/uobj.c - 644 sys sys 1114459831 2219
 sys/src/libmach/v.c - 664 sys sys 964540518 3403
 sys/src/libmach/v.c - 664 sys sys 964540518 3403
 sys/src/libmach/vcodas.c - 664 sys sys 1014929545 10253
 sys/src/libmach/vcodas.c - 664 sys sys 1014929545 10253
 sys/src/libmach/vdb.c - 664 sys sys 1014929545 22248
 sys/src/libmach/vdb.c - 664 sys sys 1014929545 22248
 sys/src/libmach/vobj.c - 664 sys sys 1091732625 2206
 sys/src/libmach/vobj.c - 664 sys sys 1091732625 2206
-sys/src/libmach/xc - 20000000775 sys sys 964540563 0
-sys/src/libmach/xc/README - 664 sys sys 950326252 73
-sys/src/libmach/xc/mips2ureg.h - 664 sys sys 964540563 886
-sys/src/libmach/xc/x.out.h - 664 sys sys 950325899 3232
 sys/src/libmemdraw - 20000000775 sys sys 985020762 0
 sys/src/libmemdraw - 20000000775 sys sys 985020762 0
 sys/src/libmemdraw/alloc.c - 664 sys sys 1046640198 3234
 sys/src/libmemdraw/alloc.c - 664 sys sys 1046640198 3234
 sys/src/libmemdraw/alpha.hoc - 664 sys sys 944961741 220
 sys/src/libmemdraw/alpha.hoc - 664 sys sys 944961741 220
@@ -12949,3 +12973,18 @@ usr/glenda/lib/profile - 664 glenda glenda 1105128663 890
 usr/glenda/readme.acme - 664 glenda glenda 1019860628 4753
 usr/glenda/readme.acme - 664 glenda glenda 1019860628 4753
 usr/glenda/readme.rio - 664 glenda glenda 1019860628 6370
 usr/glenda/readme.rio - 664 glenda glenda 1019860628 6370
 usr/glenda/tmp - 20000000775 glenda glenda 1018802620 0
 usr/glenda/tmp - 20000000775 glenda glenda 1018802620 0
+386/bin/acid - 775 sys sys 1114484867 389719
+386/bin/ar - 775 sys sys 1114484868 110847
+386/bin/db - 775 sys sys 1114484869 336153
+386/bin/snap - 775 sys sys 1114484871 303547
+386/bin/snapfs - 775 sys sys 1114484872 372401
+386/bin/file - 775 sys sys 1114484869 118706
+386/bin/kprof - 775 sys sys 1114484870 102284
+386/bin/ktrace - 775 sys sys 1114484870 116436
+386/bin/nm - 775 sys sys 1114484870 121630
+386/bin/prof - 775 sys sys 1114484870 106950
+386/bin/size - 775 sys sys 1114484871 76817
+386/bin/aux/ms2 - 775 sys sys 1114484868 84166
+386/bin/aux/vga - 775 sys sys 1114484868 309981
+386/bin/tprof - 775 sys sys 1114484873 289115
+386/lib/libmach.a - 664 sys sys 1114484874 755168

+ 63 - 39
dist/replica/plan9.db

@@ -19,7 +19,7 @@
 386/bin/8l - 775 sys sys 1107835553 115728
 386/bin/8l - 775 sys sys 1107835553 115728
 386/bin/9660srv - 775 sys sys 1113794389 103976
 386/bin/9660srv - 775 sys sys 1113794389 103976
 386/bin/aan - 775 sys sys 1108354539 130710
 386/bin/aan - 775 sys sys 1108354539 130710
-386/bin/acid - 775 sys sys 1114225965 357187
+386/bin/acid - 775 sys sys 1114484867 389719
 386/bin/acme - 775 sys sys 1111637282 428512
 386/bin/acme - 775 sys sys 1111637282 428512
 386/bin/ape - 20000000775 sys sys 1016944144 0
 386/bin/ape - 20000000775 sys sys 1016944144 0
 386/bin/ape/basename - 775 sys sys 1087442501 132681
 386/bin/ape/basename - 775 sys sys 1087442501 132681
@@ -38,7 +38,7 @@
 386/bin/ape/tar - 775 sys sys 1104121958 61903
 386/bin/ape/tar - 775 sys sys 1104121958 61903
 386/bin/ape/uname - 775 sys sys 1087442505 132510
 386/bin/ape/uname - 775 sys sys 1087442505 132510
 386/bin/aquarela - 775 sys sys 1064598027 319170
 386/bin/aquarela - 775 sys sys 1064598027 319170
-386/bin/ar - 775 sys sys 1104121958 107438
+386/bin/ar - 775 sys sys 1114484868 110847
 386/bin/archfs - 775 sys sys 1108354542 140779
 386/bin/archfs - 775 sys sys 1108354542 140779
 386/bin/ascii - 775 sys sys 1104121959 64668
 386/bin/ascii - 775 sys sys 1104121959 64668
 386/bin/astro - 775 sys sys 1104121959 138803
 386/bin/astro - 775 sys sys 1104121959 138803
@@ -117,7 +117,7 @@
 386/bin/aux/mklatinkbd - 775 sys sys 1104121979 64179
 386/bin/aux/mklatinkbd - 775 sys sys 1104121979 64179
 386/bin/aux/mnihongo - 775 sys sys 1106799170 138512
 386/bin/aux/mnihongo - 775 sys sys 1106799170 138512
 386/bin/aux/mouse - 775 sys sys 1104121979 44026
 386/bin/aux/mouse - 775 sys sys 1104121979 44026
-386/bin/aux/ms2 - 775 sys sys 1108008332 81689
+386/bin/aux/ms2 - 775 sys sys 1114484868 84166
 386/bin/aux/msexceltables - 775 sys sys 1106453225 80995
 386/bin/aux/msexceltables - 775 sys sys 1106453225 80995
 386/bin/aux/mswordstrings - 775 sys sys 1104121980 65317
 386/bin/aux/mswordstrings - 775 sys sys 1104121980 65317
 386/bin/aux/na - 775 sys sys 1113794390 154186
 386/bin/aux/na - 775 sys sys 1113794390 154186
@@ -147,7 +147,7 @@
 386/bin/aux/tr2post - 775 sys sys 1104121987 176578
 386/bin/aux/tr2post - 775 sys sys 1104121987 176578
 386/bin/aux/trampoline - 775 sys sys 1104121988 83293
 386/bin/aux/trampoline - 775 sys sys 1104121988 83293
 386/bin/aux/typepasswd - 775 sys sys 1104121988 69503
 386/bin/aux/typepasswd - 775 sys sys 1104121988 69503
-386/bin/aux/vga - 775 sys sys 1109563697 301643
+386/bin/aux/vga - 775 sys sys 1114484868 309981
 386/bin/aux/vmmousepoll - 775 sys sys 1032480572 41434
 386/bin/aux/vmmousepoll - 775 sys sys 1032480572 41434
 386/bin/aux/vmware - 775 sys sys 1049428256 453
 386/bin/aux/vmware - 775 sys sys 1049428256 453
 386/bin/aux/vmwarefs - 775 sys sys 1095563640 99117
 386/bin/aux/vmwarefs - 775 sys sys 1095563640 99117
@@ -187,7 +187,7 @@
 386/bin/cpu - 775 sys sys 1108354550 137694
 386/bin/cpu - 775 sys sys 1108354550 137694
 386/bin/crop - 775 sys sys 1104121998 115763
 386/bin/crop - 775 sys sys 1104121998 115763
 386/bin/date - 775 sys sys 1104121998 43261
 386/bin/date - 775 sys sys 1104121998 43261
-386/bin/db - 775 sys sys 1114225965 303621
+386/bin/db - 775 sys sys 1114484869 336153
 386/bin/dc - 775 sys sys 1104121999 99028
 386/bin/dc - 775 sys sys 1104121999 99028
 386/bin/dd - 775 sys sys 1104121999 45347
 386/bin/dd - 775 sys sys 1104121999 45347
 386/bin/deroff - 775 sys sys 1104122000 74244
 386/bin/deroff - 775 sys sys 1104122000 74244
@@ -224,7 +224,7 @@
 386/bin/faces - 775 sys sys 1106799174 192579
 386/bin/faces - 775 sys sys 1106799174 192579
 386/bin/factor - 775 sys sys 1104122008 61475
 386/bin/factor - 775 sys sys 1104122008 61475
 386/bin/fcp - 775 sys sys 1110859785 82162
 386/bin/fcp - 775 sys sys 1110859785 82162
-386/bin/file - 775 sys sys 1113361802 112820
+386/bin/file - 775 sys sys 1114484869 118706
 386/bin/fmt - 775 sys sys 1104122009 65301
 386/bin/fmt - 775 sys sys 1104122009 65301
 386/bin/fortune - 775 sys sys 1104122009 67136
 386/bin/fortune - 775 sys sys 1104122009 67136
 386/bin/fossil - 20000000775 sys sys 1042005470 0
 386/bin/fossil - 20000000775 sys sys 1042005470 0
@@ -308,8 +308,8 @@
 386/bin/join - 775 sys sys 1113794393 114091
 386/bin/join - 775 sys sys 1113794393 114091
 386/bin/jpg - 775 sys sys 1108960009 174528
 386/bin/jpg - 775 sys sys 1108960009 174528
 386/bin/kbmap - 775 sys sys 1106799176 142498
 386/bin/kbmap - 775 sys sys 1106799176 142498
-386/bin/kprof - 775 sys sys 1108960009 99723
-386/bin/ktrace - 775 sys sys 1108960009 113674
+386/bin/kprof - 775 sys sys 1114484870 102284
+386/bin/ktrace - 775 sys sys 1114484870 116436
 386/bin/lens - 775 sys sys 1104122032 124095
 386/bin/lens - 775 sys sys 1104122032 124095
 386/bin/lex - 775 sys sys 1104122033 98664
 386/bin/lex - 775 sys sys 1104122033 98664
 386/bin/lnfs - 775 sys sys 1108354557 99449
 386/bin/lnfs - 775 sys sys 1108354557 99449
@@ -342,7 +342,7 @@
 386/bin/netstat - 775 sys sys 1104122040 84385
 386/bin/netstat - 775 sys sys 1104122040 84385
 386/bin/news - 775 sys sys 1104122041 71653
 386/bin/news - 775 sys sys 1104122041 71653
 386/bin/nfs - 775 sys sys 1108354559 315389
 386/bin/nfs - 775 sys sys 1108354559 315389
-386/bin/nm - 775 sys sys 1108960010 115737
+386/bin/nm - 775 sys sys 1114484870 121630
 386/bin/nntpfs - 775 sys sys 1108354560 160898
 386/bin/nntpfs - 775 sys sys 1108354560 160898
 386/bin/ns - 775 sys sys 1104122042 65260
 386/bin/ns - 775 sys sys 1104122042 65260
 386/bin/p - 775 sys sys 1108268390 64990
 386/bin/p - 775 sys sys 1108268390 64990
@@ -360,7 +360,7 @@
 386/bin/ppm - 775 sys sys 1108960012 149347
 386/bin/ppm - 775 sys sys 1108960012 149347
 386/bin/pr - 775 sys sys 1104122046 77408
 386/bin/pr - 775 sys sys 1104122046 77408
 386/bin/primes - 775 sys sys 1104122046 38793
 386/bin/primes - 775 sys sys 1104122046 38793
-386/bin/prof - 775 sys sys 1108960012 104466
+386/bin/prof - 775 sys sys 1114484870 106950
 386/bin/proof - 775 sys sys 1106799178 177605
 386/bin/proof - 775 sys sys 1106799178 177605
 386/bin/ps - 775 sys sys 1104122047 65805
 386/bin/ps - 775 sys sys 1104122047 65805
 386/bin/pwd - 775 sys sys 1104122047 36897
 386/bin/pwd - 775 sys sys 1104122047 36897
@@ -389,10 +389,10 @@
 386/bin/sed - 775 sys sys 1104122054 89523
 386/bin/sed - 775 sys sys 1104122054 89523
 386/bin/seq - 775 sys sys 1104122054 38206
 386/bin/seq - 775 sys sys 1104122054 38206
 386/bin/sha1sum - 775 sys sys 1104122054 61133
 386/bin/sha1sum - 775 sys sys 1104122054 61133
-386/bin/size - 775 sys sys 1108008334 74340
+386/bin/size - 775 sys sys 1114484871 76817
 386/bin/sleep - 775 sys sys 1085077097 3413
 386/bin/sleep - 775 sys sys 1085077097 3413
-386/bin/snap - 775 sys sys 1114225966 271015
-386/bin/snapfs - 775 sys sys 1114225967 339869
+386/bin/snap - 775 sys sys 1114484871 303547
+386/bin/snapfs - 775 sys sys 1114484872 372401
 386/bin/sniffer - 775 sys sys 1038443185 99028
 386/bin/sniffer - 775 sys sys 1038443185 99028
 386/bin/snoopy - 775 sys sys 1108354563 157546
 386/bin/snoopy - 775 sys sys 1108354563 157546
 386/bin/sort - 775 sys sys 1104122056 82285
 386/bin/sort - 775 sys sys 1104122056 82285
@@ -425,7 +425,7 @@
 386/bin/topng - 775 sys sys 1108872012 138083
 386/bin/topng - 775 sys sys 1108872012 138083
 386/bin/toppm - 775 sys sys 1104122065 164905
 386/bin/toppm - 775 sys sys 1104122065 164905
 386/bin/touch - 775 sys sys 1104122066 63763
 386/bin/touch - 775 sys sys 1104122066 63763
-386/bin/tprof - 775 sys sys 1114225968 256583
+386/bin/tprof - 775 sys sys 1114484873 289115
 386/bin/tr - 775 sys sys 1104122066 61851
 386/bin/tr - 775 sys sys 1104122066 61851
 386/bin/trace - 775 sys sys 1106799181 180728
 386/bin/trace - 775 sys sys 1106799181 180728
 386/bin/troff - 775 sys sys 1094040114 357714
 386/bin/troff - 775 sys sys 1094040114 357714
@@ -549,7 +549,7 @@
 386/lib/libhttpd.a - 664 sys sys 1108268398 99488
 386/lib/libhttpd.a - 664 sys sys 1108268398 99488
 386/lib/libip.a - 664 sys sys 1108268398 35602
 386/lib/libip.a - 664 sys sys 1108268398 35602
 386/lib/libl.a - 664 sys sys 1108268398 5384
 386/lib/libl.a - 664 sys sys 1108268398 5384
-386/lib/libmach.a - 664 sys sys 1114225969 658810
+386/lib/libmach.a - 664 sys sys 1114484874 755168
 386/lib/libmemdraw.a - 664 sys sys 1110946101 283198
 386/lib/libmemdraw.a - 664 sys sys 1110946101 283198
 386/lib/libmemlayer.a - 664 sys sys 1108699740 47360
 386/lib/libmemlayer.a - 664 sys sys 1108699740 47360
 386/lib/libmp.a - 664 sys sys 1108268401 79532
 386/lib/libmp.a - 664 sys sys 1108268401 79532
@@ -832,6 +832,13 @@ alpha/include/ureg.h - 664 sys sys 944946362 644
 alpha/lib - 20000000775 sys sys 947992106 0
 alpha/lib - 20000000775 sys sys 947992106 0
 alpha/lib/ape - 20000000775 sys sys 947992106 0
 alpha/lib/ape - 20000000775 sys sys 947992106 0
 alpha/mkfile - 664 sys sys 948141303 46
 alpha/mkfile - 664 sys sys 948141303 46
+amd64 - 20000000775 sys sys 1114458599 0
+amd64/bin - 20000000775 sys sys 1114458475 0
+amd64/include - 20000000775 sys sys 1114458660 0
+amd64/include/u.h - 644 sys sys 1114458660 1658
+amd64/include/ureg.h - 644 sys sys 1114458660 454
+amd64/lib - 20000000775 sys sys 1114458490 0
+amd64/mkfile - 644 sys sys 1114458599 46
 arm - 20000000775 sys sys 947991045 0
 arm - 20000000775 sys sys 947991045 0
 arm/bin - 20000000775 sys sys 1018321186 0
 arm/bin - 20000000775 sys sys 1018321186 0
 arm/bin/ape - 20000000775 sys sys 985644327 0
 arm/bin/ape - 20000000775 sys sys 985644327 0
@@ -870,7 +877,7 @@ dist/replica - 20000000775 sys sys 1019277119 0
 dist/replica/cd - 664 sys sys 1019527959 390
 dist/replica/cd - 664 sys sys 1019527959 390
 dist/replica/kfs - 664 sys sys 1019527929 237
 dist/replica/kfs - 664 sys sys 1019527929 237
 dist/replica/network - 775 sys sys 1071079179 996
 dist/replica/network - 775 sys sys 1071079179 996
-dist/replica/plan9.proto - 664 sys sys 1112361655 2500
+dist/replica/plan9.proto - 664 sys sys 1114460221 2560
 env - 20000000775 sys sys 1015094872 0
 env - 20000000775 sys sys 1015094872 0
 fd - 20000000775 sys sys 947958544 0
 fd - 20000000775 sys sys 947958544 0
 lib - 20000000775 sys sys 958504315 0
 lib - 20000000775 sys sys 958504315 0
@@ -3654,6 +3661,13 @@ sparc/include/ureg.h - 664 sys sys 944946363 599
 sparc/lib - 20000000775 sys sys 947992106 0
 sparc/lib - 20000000775 sys sys 947992106 0
 sparc/lib/ape - 20000000775 sys sys 947992106 0
 sparc/lib/ape - 20000000775 sys sys 947992106 0
 sparc/mkfile - 664 sys sys 948141304 52
 sparc/mkfile - 664 sys sys 948141304 52
+sparc64 - 20000000775 sys sys 1114458667 0
+sparc64/bin - 20000000775 sys sys 1114458528 0
+sparc64/include - 20000000775 sys sys 1114458675 0
+sparc64/include/u.h - 644 sys sys 1114458675 1423
+sparc64/include/ureg.h - 644 sys sys 1114458675 719
+sparc64/lib - 20000000775 sys sys 1114458535 0
+sparc64/mkfile - 644 sys sys 1114458667 46
 sys - 20000000775 sys sys 952648870 0
 sys - 20000000775 sys sys 952648870 0
 sys/doc - 20000000775 sys sys 1018471272 0
 sys/doc - 20000000775 sys sys 1018471272 0
 sys/doc/-.2669382.gif - 664 sys sys 1019969850 2078
 sys/doc/-.2669382.gif - 664 sys sys 1019969850 2078
@@ -4117,7 +4131,7 @@ sys/lib/dist/pc/inst/stopppp - 775 sys sys 1018469719 250
 sys/lib/dist/pc/inst/textonly - 775 sys sys 1112361039 182
 sys/lib/dist/pc/inst/textonly - 775 sys sys 1112361039 182
 sys/lib/dist/pc/inst/watchfd - 775 sys sys 1112361039 361
 sys/lib/dist/pc/inst/watchfd - 775 sys sys 1112361039 361
 sys/lib/dist/pc/inst/xxx - 775 sys sys 1018469719 160
 sys/lib/dist/pc/inst/xxx - 775 sys sys 1018469719 160
-sys/lib/dist/pc/mkfile - 664 sys sys 1114364348 2045
+sys/lib/dist/pc/mkfile - 664 sys sys 1114446424 2148
 sys/lib/dist/pc/plan9.ini - 664 sys sys 1020361168 512
 sys/lib/dist/pc/plan9.ini - 664 sys sys 1020361168 512
 sys/lib/dist/pc/plan9.ini.blank - 664 sys sys 1018469720 512
 sys/lib/dist/pc/plan9.ini.blank - 664 sys sys 1018469720 512
 sys/lib/dist/pc/plan9.ini.cd - 664 sys sys 1092148201 357
 sys/lib/dist/pc/plan9.ini.cd - 664 sys sys 1092148201 357
@@ -5643,7 +5657,7 @@ sys/man/8/udpecho - 664 sys sys 954305553 303
 sys/man/8/update - 664 sys sys 961259288 2336
 sys/man/8/update - 664 sys sys 961259288 2336
 sys/man/8/venti - 664 sys sys 1069101926 5422
 sys/man/8/venti - 664 sys sys 1069101926 5422
 sys/man/8/ventiaux - 664 sys sys 1063855987 10487
 sys/man/8/ventiaux - 664 sys sys 1063855987 10487
-sys/man/8/vga - 664 sys sys 959698505 3557
+sys/man/8/vga - 664 sys sys 1114454069 3936
 sys/man/fonts - 664 sys sys 944959700 218
 sys/man/fonts - 664 sys sys 944959700 218
 sys/man/index.html - 664 sys sys 1019918444 1859
 sys/man/index.html - 664 sys sys 1019918444 1859
 sys/man/mkfile - 664 sys sys 1018974173 2264
 sys/man/mkfile - 664 sys sys 1018974173 2264
@@ -6976,7 +6990,7 @@ sys/src/boot/pc/apm.c - 664 sys sys 1015007947 289
 sys/src/boot/pc/bcom.c - 664 sys sys 1032215919 6421
 sys/src/boot/pc/bcom.c - 664 sys sys 1032215919 6421
 sys/src/boot/pc/boot.c - 664 sys sys 1109364490 8418
 sys/src/boot/pc/boot.c - 664 sys sys 1109364490 8418
 sys/src/boot/pc/bootld.c - 664 sys sys 1015007948 1801
 sys/src/boot/pc/bootld.c - 664 sys sys 1015007948 1801
-sys/src/boot/pc/bootp.c - 664 sys sys 1107882190 12147
+sys/src/boot/pc/bootp.c - 664 sys sys 1114464742 12374
 sys/src/boot/pc/cga.c - 664 sys sys 1015007948 1362
 sys/src/boot/pc/cga.c - 664 sys sys 1015007948 1362
 sys/src/boot/pc/clock.c - 664 sys sys 1103641772 6425
 sys/src/boot/pc/clock.c - 664 sys sys 1103641772 6425
 sys/src/boot/pc/conf.c - 664 sys sys 1094674484 10217
 sys/src/boot/pc/conf.c - 664 sys sys 1094674484 10217
@@ -7030,7 +7044,7 @@ sys/src/boot/pc/mem.h - 664 sys sys 1103641771 3371
 sys/src/boot/pc/memory.c - 664 sys sys 1019533021 10272
 sys/src/boot/pc/memory.c - 664 sys sys 1019533021 10272
 sys/src/boot/pc/mkfile - 664 sys sys 1103641863 3105
 sys/src/boot/pc/mkfile - 664 sys sys 1103641863 3105
 sys/src/boot/pc/noether.c - 664 sys sys 1094674488 358
 sys/src/boot/pc/noether.c - 664 sys sys 1094674488 358
-sys/src/boot/pc/part.c - 664 sys sys 1032215918 7505
+sys/src/boot/pc/part.c - 664 sys sys 1114427970 7509
 sys/src/boot/pc/pbs.s - 664 sys sys 1017854325 8279
 sys/src/boot/pc/pbs.s - 664 sys sys 1017854325 8279
 sys/src/boot/pc/pbsdisk - 775 sys sys 1017854325 509
 sys/src/boot/pc/pbsdisk - 775 sys sys 1017854325 509
 sys/src/boot/pc/pbsdisk.s - 664 sys sys 1017854325 6371
 sys/src/boot/pc/pbsdisk.s - 664 sys sys 1017854325 6371
@@ -7060,7 +7074,7 @@ sys/src/cmd/1c - 20000000775 sys sys 945321342 0
 sys/src/cmd/1c/bits.c - 664 sys sys 944961353 1370
 sys/src/cmd/1c/bits.c - 664 sys sys 944961353 1370
 sys/src/cmd/1c/cgen.c - 664 sys sys 1089299179 28257
 sys/src/cmd/1c/cgen.c - 664 sys sys 1089299179 28257
 sys/src/cmd/1c/enam.c - 664 sys sys 1089299179 4239
 sys/src/cmd/1c/enam.c - 664 sys sys 1089299179 4239
-sys/src/cmd/1c/gc.h - 664 sys sys 1089299178 6006
+sys/src/cmd/1c/gc.h - 664 sys sys 1114449033 6008
 sys/src/cmd/1c/list.c - 664 sys sys 1014926630 4507
 sys/src/cmd/1c/list.c - 664 sys sys 1014926630 4507
 sys/src/cmd/1c/mkfile - 664 sys sys 944961353 264
 sys/src/cmd/1c/mkfile - 664 sys sys 944961353 264
 sys/src/cmd/1c/mul.c - 664 sys sys 944961353 2599
 sys/src/cmd/1c/mul.c - 664 sys sys 944961353 2599
@@ -7091,7 +7105,7 @@ sys/src/cmd/2c/2.out.h - 664 sys sys 1089299176 5075
 sys/src/cmd/2c/bits.c - 664 sys sys 944960717 1370
 sys/src/cmd/2c/bits.c - 664 sys sys 944960717 1370
 sys/src/cmd/2c/cgen.c - 664 sys sys 1089299176 28451
 sys/src/cmd/2c/cgen.c - 664 sys sys 1089299176 28451
 sys/src/cmd/2c/enam.c - 664 sys sys 1089299176 4239
 sys/src/cmd/2c/enam.c - 664 sys sys 1089299176 4239
-sys/src/cmd/2c/gc.h - 664 sys sys 1014924675 6203
+sys/src/cmd/2c/gc.h - 664 sys sys 1114449040 6205
 sys/src/cmd/2c/list.c - 664 sys sys 1089299176 5521
 sys/src/cmd/2c/list.c - 664 sys sys 1089299176 5521
 sys/src/cmd/2c/mkfile - 664 sys sys 944960717 258
 sys/src/cmd/2c/mkfile - 664 sys sys 944960717 258
 sys/src/cmd/2c/mul.c - 664 sys sys 944960717 2599
 sys/src/cmd/2c/mul.c - 664 sys sys 944960717 2599
@@ -7591,8 +7605,8 @@ sys/src/cmd/aux/vga/clgd542x.c - 664 sys sys 1014925007 6916
 sys/src/cmd/aux/vga/clgd546x.c - 664 sys sys 1014925007 7996
 sys/src/cmd/aux/vga/clgd546x.c - 664 sys sys 1014925007 7996
 sys/src/cmd/aux/vga/ct65540.c - 664 sys sys 1014925007 5355
 sys/src/cmd/aux/vga/ct65540.c - 664 sys sys 1014925007 5355
 sys/src/cmd/aux/vga/cyber938x.c - 664 sys sys 1087406072 6543
 sys/src/cmd/aux/vga/cyber938x.c - 664 sys sys 1087406072 6543
-sys/src/cmd/aux/vga/data.c - 664 sys sys 1019498850 2200
-sys/src/cmd/aux/vga/db.c - 664 sys sys 1081201695 9430
+sys/src/cmd/aux/vga/data.c - 664 sys sys 1114453579 2249
+sys/src/cmd/aux/vga/db.c - 664 sys sys 1114453625 9568
 sys/src/cmd/aux/vga/error.c - 664 sys sys 1014925008 745
 sys/src/cmd/aux/vga/error.c - 664 sys sys 1014925008 745
 sys/src/cmd/aux/vga/et4000.c - 664 sys sys 1014925008 6720
 sys/src/cmd/aux/vga/et4000.c - 664 sys sys 1014925008 6720
 sys/src/cmd/aux/vga/et4000hwgc.c - 664 sys sys 1014925008 552
 sys/src/cmd/aux/vga/et4000hwgc.c - 664 sys sys 1014925008 552
@@ -7606,10 +7620,10 @@ sys/src/cmd/aux/vga/io.c - 664 sys sys 1014925009 6222
 sys/src/cmd/aux/vga/mach32.c - 664 sys sys 1014925009 6004
 sys/src/cmd/aux/vga/mach32.c - 664 sys sys 1014925009 6004
 sys/src/cmd/aux/vga/mach64.c - 664 sys sys 1014925009 8279
 sys/src/cmd/aux/vga/mach64.c - 664 sys sys 1014925009 8279
 sys/src/cmd/aux/vga/mach64xx.c - 664 sys sys 1097900455 30266
 sys/src/cmd/aux/vga/mach64xx.c - 664 sys sys 1097900455 30266
-sys/src/cmd/aux/vga/main.c - 664 sys sys 1014925010 8154
+sys/src/cmd/aux/vga/main.c - 664 sys sys 1114453579 9442
 sys/src/cmd/aux/vga/mga2164w.c - 664 sys sys 1014925010 13196
 sys/src/cmd/aux/vga/mga2164w.c - 664 sys sys 1014925010 13196
 sys/src/cmd/aux/vga/mga4xx.c - 664 sys sys 1014925010 35895
 sys/src/cmd/aux/vga/mga4xx.c - 664 sys sys 1014925010 35895
-sys/src/cmd/aux/vga/mkfile - 664 sys sys 1048636613 905
+sys/src/cmd/aux/vga/mkfile - 664 sys sys 1114453579 915
 sys/src/cmd/aux/vga/neomagic.c - 664 sys sys 1104430499 8975
 sys/src/cmd/aux/vga/neomagic.c - 664 sys sys 1104430499 8975
 sys/src/cmd/aux/vga/notes.txt - 664 sys sys 1028334647 14376
 sys/src/cmd/aux/vga/notes.txt - 664 sys sys 1028334647 14376
 sys/src/cmd/aux/vga/nvidia.c - 664 sys sys 1109511456 23718
 sys/src/cmd/aux/vga/nvidia.c - 664 sys sys 1109511456 23718
@@ -7634,8 +7648,9 @@ sys/src/cmd/aux/vga/tvp3025.c - 664 sys sys 1014925013 1960
 sys/src/cmd/aux/vga/tvp3025clock.c - 664 sys sys 1014925013 1511
 sys/src/cmd/aux/vga/tvp3025clock.c - 664 sys sys 1014925013 1511
 sys/src/cmd/aux/vga/tvp3026.c - 664 sys sys 1014925013 3580
 sys/src/cmd/aux/vga/tvp3026.c - 664 sys sys 1014925013 3580
 sys/src/cmd/aux/vga/tvp3026clock.c - 664 sys sys 1014925013 1960
 sys/src/cmd/aux/vga/tvp3026clock.c - 664 sys sys 1014925013 1960
+sys/src/cmd/aux/vga/vesa.c - 664 sys sys 1114453579 9357
 sys/src/cmd/aux/vga/vga.c - 664 sys sys 1014925013 9305
 sys/src/cmd/aux/vga/vga.c - 664 sys sys 1014925013 9305
-sys/src/cmd/aux/vga/vga.h - 664 sys sys 1025416295 10154
+sys/src/cmd/aux/vga/vga.h - 664 sys sys 1114453579 10336
 sys/src/cmd/aux/vga/virge.c - 664 sys sys 1090439328 18587
 sys/src/cmd/aux/vga/virge.c - 664 sys sys 1090439328 18587
 sys/src/cmd/aux/vga/vision864.c - 664 sys sys 1014925014 2325
 sys/src/cmd/aux/vga/vision864.c - 664 sys sys 1014925014 2325
 sys/src/cmd/aux/vga/vision964.c - 664 sys sys 1014925014 3426
 sys/src/cmd/aux/vga/vision964.c - 664 sys sys 1014925014 3426
@@ -12525,44 +12540,53 @@ sys/src/liblex/reject.c - 664 sys sys 944961728 1000
 sys/src/liblex/yyless.c - 664 sys sys 944961728 403
 sys/src/liblex/yyless.c - 664 sys sys 944961728 403
 sys/src/liblex/yywrap.c - 664 sys sys 944961728 85
 sys/src/liblex/yywrap.c - 664 sys sys 944961728 85
 sys/src/libmach - 20000000775 sys sys 969559166 0
 sys/src/libmach - 20000000775 sys sys 969559166 0
-sys/src/libmach/0.c - 664 sys sys 1021927268 4042
+sys/src/libmach/0.c - 664 sys sys 1114459829 4037
+sys/src/libmach/0c - 20000000775 sys sys 1114459438 0
+sys/src/libmach/0c/README - 644 sys sys 1114459609 73
+sys/src/libmach/0c/ureg.h - 644 sys sys 1114459438 886
 sys/src/libmach/2.c - 664 sys sys 964540513 2034
 sys/src/libmach/2.c - 664 sys sys 964540513 2034
 sys/src/libmach/2db.c - 664 sys sys 1014929543 61245
 sys/src/libmach/2db.c - 664 sys sys 1014929543 61245
 sys/src/libmach/2obj.c - 664 sys sys 1091732624 2335
 sys/src/libmach/2obj.c - 664 sys sys 1091732624 2335
 sys/src/libmach/5.c - 664 sys sys 984710422 1513
 sys/src/libmach/5.c - 664 sys sys 984710422 1513
 sys/src/libmach/5db.c - 664 sys sys 1114218476 21530
 sys/src/libmach/5db.c - 664 sys sys 1114218476 21530
 sys/src/libmach/5obj.c - 664 sys sys 1091732625 2209
 sys/src/libmach/5obj.c - 664 sys sys 1091732625 2209
+sys/src/libmach/6.c - 644 sys sys 1114459868 3366
+sys/src/libmach/6c - 20000000775 sys sys 1114459480 0
+sys/src/libmach/6c/6.out.h - 644 sys sys 1114459480 7984
+sys/src/libmach/6obj.c - 644 sys sys 1114459831 2382
 sys/src/libmach/7.c - 664 sys sys 964540515 3267
 sys/src/libmach/7.c - 664 sys sys 964540515 3267
 sys/src/libmach/7db.c - 664 sys sys 1014929543 17320
 sys/src/libmach/7db.c - 664 sys sys 1014929543 17320
 sys/src/libmach/7obj.c - 664 sys sys 1091732676 2367
 sys/src/libmach/7obj.c - 664 sys sys 1091732676 2367
 sys/src/libmach/8.c - 664 sys sys 964540515 2020
 sys/src/libmach/8.c - 664 sys sys 964540515 2020
-sys/src/libmach/8db.c - 664 sys sys 1088653064 39144
+sys/src/libmach/8db.c - 664 sys sys 1114459831 50189
 sys/src/libmach/8obj.c - 664 sys sys 1091732625 2200
 sys/src/libmach/8obj.c - 664 sys sys 1091732625 2200
 sys/src/libmach/access.c - 664 sys sys 1068478065 4309
 sys/src/libmach/access.c - 664 sys sys 1068478065 4309
-sys/src/libmach/elf.h - 664 sys sys 1107634043 2262
-sys/src/libmach/executable.c - 664 sys sys 1107963442 13918
+sys/src/libmach/elf.h - 664 sys sys 1114459895 2323
+sys/src/libmach/executable.c - 664 sys sys 1114459829 15179
 sys/src/libmach/k.c - 664 sys sys 964540516 3330
 sys/src/libmach/k.c - 664 sys sys 964540516 3330
 sys/src/libmach/kdb.c - 664 sys sys 1014929544 21143
 sys/src/libmach/kdb.c - 664 sys sys 1014929544 21143
 sys/src/libmach/kobj.c - 664 sys sys 1091732625 2217
 sys/src/libmach/kobj.c - 664 sys sys 1091732625 2217
 sys/src/libmach/machdata.c - 664 sys sys 964540516 8814
 sys/src/libmach/machdata.c - 664 sys sys 964540516 8814
 sys/src/libmach/map.c - 664 sys sys 964540517 3053
 sys/src/libmach/map.c - 664 sys sys 964540517 3053
-sys/src/libmach/mkfile - 664 sys sys 1089313991 439
-sys/src/libmach/obj.c - 664 sys sys 1089313993 5760
+sys/src/libmach/mkfile - 664 sys sys 1114459827 467
+sys/src/libmach/obj.c - 664 sys sys 1114459829 5918
 sys/src/libmach/obj.h - 664 sys sys 964540517 603
 sys/src/libmach/obj.h - 664 sys sys 964540517 603
 sys/src/libmach/q.c - 664 sys sys 1091732625 3590
 sys/src/libmach/q.c - 664 sys sys 1091732625 3590
-sys/src/libmach/qdb.c - 664 sys sys 1014929544 27188
+sys/src/libmach/qdb.c - 664 sys sys 1114459830 27490
 sys/src/libmach/qobj.c - 664 sys sys 1091732625 2310
 sys/src/libmach/qobj.c - 664 sys sys 1091732625 2310
-sys/src/libmach/setmach.c - 664 sys sys 1089313993 2682
+sys/src/libmach/setmach.c - 664 sys sys 1114459829 2913
 sys/src/libmach/swap.c - 664 sys sys 964540518 1026
 sys/src/libmach/swap.c - 664 sys sys 964540518 1026
 sys/src/libmach/sym.c - 664 sys sys 1106409575 26581
 sys/src/libmach/sym.c - 664 sys sys 1106409575 26581
+sys/src/libmach/u.c - 644 sys sys 1114459829 3396
+sys/src/libmach/uc - 20000000775 sys sys 1114459488 0
+sys/src/libmach/uc/README - 644 sys sys 1114459488 73
+sys/src/libmach/uc/u.out.h - 644 sys sys 1114459488 3137
+sys/src/libmach/udb.c - 644 sys sys 1114459830 21893
+sys/src/libmach/uobj.c - 644 sys sys 1114459831 2219
 sys/src/libmach/v.c - 664 sys sys 964540518 3403
 sys/src/libmach/v.c - 664 sys sys 964540518 3403
 sys/src/libmach/vcodas.c - 664 sys sys 1014929545 10253
 sys/src/libmach/vcodas.c - 664 sys sys 1014929545 10253
 sys/src/libmach/vdb.c - 664 sys sys 1014929545 22248
 sys/src/libmach/vdb.c - 664 sys sys 1014929545 22248
 sys/src/libmach/vobj.c - 664 sys sys 1091732625 2206
 sys/src/libmach/vobj.c - 664 sys sys 1091732625 2206
-sys/src/libmach/xc - 20000000775 sys sys 964540563 0
-sys/src/libmach/xc/README - 664 sys sys 950326252 73
-sys/src/libmach/xc/mips2ureg.h - 664 sys sys 964540563 886
-sys/src/libmach/xc/x.out.h - 664 sys sys 950325899 3232
 sys/src/libmemdraw - 20000000775 sys sys 985020762 0
 sys/src/libmemdraw - 20000000775 sys sys 985020762 0
 sys/src/libmemdraw/alloc.c - 664 sys sys 1046640198 3234
 sys/src/libmemdraw/alloc.c - 664 sys sys 1046640198 3234
 sys/src/libmemdraw/alpha.hoc - 664 sys sys 944961741 220
 sys/src/libmemdraw/alpha.hoc - 664 sys sys 944961741 220

+ 69 - 0
dist/replica/plan9.log

@@ -14740,3 +14740,72 @@
 1114365697 0 c sys/lib/dist/cmd/bargraph.c - 664 sys sys 1114364700 5871
 1114365697 0 c sys/lib/dist/cmd/bargraph.c - 664 sys sys 1114364700 5871
 1114365697 1 c sys/lib/dist/pc/glenda/lib/profile - 664 sys sys 1114364353 359
 1114365697 1 c sys/lib/dist/pc/glenda/lib/profile - 664 sys sys 1114364353 359
 1114365697 2 c sys/lib/dist/pc/mkfile - 664 sys sys 1114364348 2045
 1114365697 2 c sys/lib/dist/pc/mkfile - 664 sys sys 1114364348 2045
+1114428709 0 c sys/src/boot/pc/part.c - 664 sys sys 1114427970 7509
+1114446713 0 c sys/lib/dist/pc/mkfile - 664 sys sys 1114446424 2148
+1114450314 0 c sys/src/cmd/2c/gc.h - 664 sys sys 1114449040 6205
+1114450314 1 c sys/src/cmd/1c/gc.h - 664 sys sys 1114449033 6008
+1114453915 0 c 386/bin/aux/vga - 775 sys sys 1114453635 309981
+1114453915 1 c sys/src/cmd/aux/vga/data.c - 664 sys sys 1114453579 2249
+1114453915 2 c sys/src/cmd/aux/vga/db.c - 664 sys sys 1114453625 9568
+1114453915 3 c sys/src/cmd/aux/vga/main.c - 664 sys sys 1114453579 9442
+1114453915 4 c sys/src/cmd/aux/vga/mkfile - 664 sys sys 1114453579 915
+1114453915 5 a sys/src/cmd/aux/vga/vesa.c - 664 sys sys 1114453579 9357
+1114453915 6 c sys/src/cmd/aux/vga/vga.h - 664 sys sys 1114453579 10336
+1114455715 0 c sys/man/8/vga - 664 sys sys 1114454069 3936
+1114461115 0 c 386/lib/libmach.a - 664 sys sys 1114459829 834000
+1114461115 1 a amd64 - 20000000775 sys sys 1114458599 0
+1114461115 2 a amd64/bin - 20000000775 sys sys 1114458475 0
+1114461115 3 a amd64/include - 20000000775 sys sys 1114458660 0
+1114461115 4 a amd64/include/u.h - 644 sys sys 1114458660 1658
+1114461115 5 a amd64/include/ureg.h - 644 sys sys 1114458660 454
+1114461115 6 a amd64/lib - 20000000775 sys sys 1114458490 0
+1114461115 7 a amd64/mkfile - 644 sys sys 1114458599 46
+1114461115 8 a sparc64 - 20000000775 sys sys 1114458667 0
+1114461115 9 a sparc64/bin - 20000000775 sys sys 1114458528 0
+1114461115 10 a sparc64/include - 20000000775 sys sys 1114458675 0
+1114461115 11 a sparc64/include/u.h - 644 sys sys 1114458675 1423
+1114461115 12 a sparc64/include/ureg.h - 644 sys sys 1114458675 719
+1114461115 13 a sparc64/lib - 20000000775 sys sys 1114458535 0
+1114461115 14 a sparc64/mkfile - 644 sys sys 1114458667 46
+1114461115 15 c sys/src/libmach/0.c - 664 sys sys 1114459829 4037
+1114461115 16 a sys/src/libmach/0c - 20000000775 sys sys 1114459438 0
+1114461115 17 a sys/src/libmach/0c/README - 644 sys sys 1114459609 73
+1114461115 18 a sys/src/libmach/0c/ureg.h - 644 sys sys 1114459438 886
+1114461115 19 a sys/src/libmach/6.c - 644 sys sys 1114459868 3366
+1114461115 20 a sys/src/libmach/6c - 20000000775 sys sys 1114459480 0
+1114461115 21 a sys/src/libmach/6c/6.out.h - 644 sys sys 1114459480 7984
+1114461115 22 a sys/src/libmach/6obj.c - 644 sys sys 1114459831 2382
+1114461115 23 c sys/src/libmach/8db.c - 664 sys sys 1114459831 50189
+1114461115 24 c sys/src/libmach/elf.h - 664 sys sys 1114459895 2323
+1114461115 25 c sys/src/libmach/executable.c - 664 sys sys 1114459829 15179
+1114461115 26 c sys/src/libmach/mkfile - 664 sys sys 1114459827 467
+1114461115 27 c sys/src/libmach/obj.c - 664 sys sys 1114459829 5918
+1114461115 28 c sys/src/libmach/qdb.c - 664 sys sys 1114459830 27490
+1114461115 29 c sys/src/libmach/setmach.c - 664 sys sys 1114459829 2913
+1114461115 30 a sys/src/libmach/u.c - 644 sys sys 1114459829 3396
+1114461115 31 a sys/src/libmach/uc - 20000000775 sys sys 1114459488 0
+1114461115 32 a sys/src/libmach/uc/README - 644 sys sys 1114459488 73
+1114461115 33 a sys/src/libmach/uc/u.out.h - 644 sys sys 1114459488 3137
+1114461115 34 a sys/src/libmach/udb.c - 644 sys sys 1114459830 21893
+1114461115 35 a sys/src/libmach/uobj.c - 644 sys sys 1114459831 2219
+1114461115 36 c dist/replica/plan9.proto - 664 sys sys 1114460221 2560
+1114461115 37 d sys/src/libmach/xc/x.out.h - 664 sys sys 950325899 0
+1114461115 38 d sys/src/libmach/xc/mips2ureg.h - 664 sys sys 964540563 0
+1114461115 39 d sys/src/libmach/xc/README - 664 sys sys 950326252 0
+1114461115 40 d sys/src/libmach/xc - 20000000775 sys sys 964540563 0
+1114464716 0 c sys/src/boot/pc/bootp.c - 664 sys sys 1114464742 12374
+1114486320 0 c 386/bin/acid - 775 sys sys 1114484867 389719
+1114486320 1 c 386/bin/ar - 775 sys sys 1114484868 110847
+1114486320 2 c 386/bin/db - 775 sys sys 1114484869 336153
+1114486320 3 c 386/bin/snap - 775 sys sys 1114484871 303547
+1114486320 4 c 386/bin/snapfs - 775 sys sys 1114484872 372401
+1114486320 5 c 386/bin/file - 775 sys sys 1114484869 118706
+1114486320 6 c 386/bin/kprof - 775 sys sys 1114484870 102284
+1114486320 7 c 386/bin/ktrace - 775 sys sys 1114484870 116436
+1114486320 8 c 386/bin/nm - 775 sys sys 1114484870 121630
+1114486320 9 c 386/bin/prof - 775 sys sys 1114484870 106950
+1114486320 10 c 386/bin/size - 775 sys sys 1114484871 76817
+1114486320 11 c 386/bin/aux/ms2 - 775 sys sys 1114484868 84166
+1114486320 12 c 386/bin/aux/vga - 775 sys sys 1114484868 309981
+1114486320 13 c 386/bin/tprof - 775 sys sys 1114484873 289115
+1114486320 14 c 386/lib/libmach.a - 664 sys sys 1114484874 755168

+ 4 - 0
dist/replica/plan9.proto

@@ -34,6 +34,8 @@ usr	- sys sys
 	+	- sys sys
 	+	- sys sys
 alpha	- sys sys
 alpha	- sys sys
 	+	- sys sys
 	+	- sys sys
+amd64	- sys sys
+	+	- sys sys
 arm	- sys sys
 arm	- sys sys
 	+	- sys sys
 	+	- sys sys
 mips	- sys sys
 mips	- sys sys
@@ -42,6 +44,8 @@ power	- sys sys
 	+	- sys sys
 	+	- sys sys
 sparc	- sys sys
 sparc	- sys sys
 	+	- sys sys
 	+	- sys sys
+sparc64	- sys sys
+	+	- sys sys
 
 
 # everything else is owned by sys
 # everything else is owned by sys
 acme	- sys sys
 acme	- sys sys

+ 0 - 152
dist/replica/plan9x.proto

@@ -1,152 +0,0 @@
-# files like NOTICE
-*	- sys sys
-
-# adm owns adm
-adm	- adm adm
-	+	- adm adm
-
-# upas owns mail
-mail	- upas upas
-	box	- upas upas
-		glenda	- glenda glenda
-			L.mbox	l666 glenda glenda
-			mbox	a662 glenda glenda
-	faxoutqueue	d777 upas upas
-	faxqueue	d777 upas upas
-		*	- upas upas
-	fs	- upas upas
-	lib	- upas upas
-		+	- upas upas
-	queue	d777 upas upas
-	tmp	d777 upas upas
-
-# glenda owns her home directory
-usr	- sys sys
-	glenda	- glenda glenda
-		+	- glenda glenda
-
-# architectures owned by sys
-386	- sys sys
-	+	- sys sys
-68000	- sys sys
-	+	- sys sys
-68020	- sys sys
-	+	- sys sys
-alpha	- sys sys
-	+	- sys sys
-arm	- sys sys
-	+	- sys sys
-mips	- sys sys
-	+	- sys sys
-power	- sys sys
-	+	- sys sys
-sparc	- sys sys
-	+	- sys sys
-
-# everything else is owned by sys
-acme	- sys sys
-	+	- sys sys
-cron	d777 sys sys
-	upas	- upas sys
-		+	- upas sys
-fd	- sys sys
-	+	- sys sys
-env	- sys sys
-	+	- sys sys
-lib	- sys sys
-	+	- sys sys
-lp	- sys sys
-	log	d777 sys sys
-	prob	d777 sys sys
-	queue	d777 sys sys
-	tmp	d777 sys sys
-mnt	- sys sys
-	+	- sys sys
-n	- sys sys
-	+	- sys sys
-rc	- sys sys
-	+	- sys sys
-sys	- sys sys
-	doc	- sys sys
-		+	- sys sys
-	games	- sys sys
-		+	- sys sys
-	include	- sys sys
-		+	- sys sys
-	lib	- sys sys
-		*	- sys sys
-		acid	- sys sys
-			+	- sys sys
-		antiword	- sys sys
-			+	- sys sys
-		astar	- sys sys
-			+	- sys sys
-		dist	- sys sys
-			+	- sys sys
-		fax	- sys sys
-			+	- sys sys
-		ghostscript	- sys sys
-			+	- sys sys
-		lex	- sys sys
-			+	- sys sys
-		lp	- sys sys
-			bin	- sys sys
-				+	- sys sys
-			daemon	- sys sys
-				+	- sys sys
-			kill	- sys sys
-				+	- sys sys
-			log	d777 sys sys
-			perm	- sys sys
-				+	- sys sys
-			process	- sys sys
-				+	- sys sys
-			sched	- sys sys
-				+	- sys sys
-			spooler	- sys sys
-				+	- sys sys
-			stat	- sys sys
-				+	- sys sys
-			tmp	d777 sys sys
-			*	- sys sys
-		man	- sys sys
-			+	- sys sys
-		plumb	- sys sys
-			+	- sys sys
-		postscript	- sys sys
-			+	- sys sys
-		scribble	- sys sys
-			+	- sys sys
-		ssh	- sys sys
-			+	- sys sys
-		sysconfig	- sys sys
-			+	- sys sys
-		texmf	- sys sys
-			+	- sys sys
-		tls	- sys sys
-			+	- sys sys
-		tmac	- sys sys
-			+	- sys sys
-		troff	- sys sys
-			+	- sys sys
-		wiki	- sys sys
-			+	- sys sys
-	log	- sys sys
-		*	a666 sys sys 
-		httpd	- sys sys
-			*	666 sys sys
-	man	- sys sys
-		+	- sys sys
-	src	- sys sys
-		+	- sys sys
-tmp	- sys sys
-	+	- sys sys
-
-# distribution metadata
-dist	- sys sys
-	replica	- sys sys
-		kfs	- sys sys
-		cd	- sys sys
-		network	- sys sys
-		plan9.proto	- sys sys
-

+ 63 - 0
sparc64/include/u.h

@@ -0,0 +1,63 @@
+#define nil		((void*)0)
+typedef	unsigned short	ushort;
+typedef	unsigned char	uchar;
+typedef	unsigned long	ulong;
+typedef	unsigned int	uint;
+typedef	signed char	schar;
+typedef	long long	vlong;
+typedef	unsigned long long uvlong;
+typedef	ushort		Rune;
+typedef 	union FPdbleword FPdbleword;
+typedef long	jmp_buf[2];
+#define	JMPBUFSP	0
+#define	JMPBUFPC	1
+#define	JMPBUFDPC	(-8)
+typedef unsigned int	mpdigit;	/* for /sys/include/mp.h */
+typedef unsigned char u8int;
+typedef unsigned short u16int;
+typedef unsigned int	u32int;
+typedef unsigned long long u64int;
+
+/* FCR */
+#define	FPINEX	(1<<23)
+#define	FPOVFL	(1<<26)
+#define	FPUNFL	(1<<25)
+#define	FPZDIV	(1<<24)
+#define	FPRNR	(0<<30)
+#define	FPRZ	(1<<30)
+#define	FPINVAL	(1<<27)
+#define	FPRPINF	(2<<30)
+#define	FPRNINF	(3<<30)
+#define	FPRMASK	(3<<30)
+#define	FPPEXT	0
+#define	FPPSGL	0
+#define	FPPDBL	0
+#define	FPPMASK	0
+/* FSR */
+#define	FPAINEX	(1<<5)
+#define	FPAZDIV	(1<<6)
+#define	FPAUNFL	(1<<7)
+#define	FPAOVFL	(1<<8)
+#define	FPAINVAL	(1<<9)
+union FPdbleword
+{
+	double	x;
+	struct {	/* big endian */
+		ulong hi;
+		ulong lo;
+	};
+};
+
+typedef	char*	va_list;
+#define va_start(list, start) list =\
+	(sizeof(start) < 4?\
+		(char*)((int*)&(start)+1):\
+		(char*)(&(start)+1))
+#define va_end(list)\
+	USED(list)
+#define va_arg(list, mode)\
+	((sizeof(mode) == 1)?\
+		((mode*)(list += 4))[-1]:\
+	(sizeof(mode) == 2)?\
+		((mode*)(list += 4))[-1]:\
+		((mode*)(list += sizeof(mode)))[-1])

+ 51 - 0
sparc64/include/ureg.h

@@ -0,0 +1,51 @@
+
+/*
+ * sparc64 registers.
+ * Currently just 32-bit registers (also somewhat compatible with
+ * the sparc32 ureg).
+ */
+struct Ureg
+{
+	ulong	r0;			/* unnecessary; just for symmetry */
+	union{
+		ulong	sp;		/* r1 */
+		ulong	usp;		/* r1 */
+		ulong	r1;
+	};
+	ulong	r2;
+	ulong	r3;
+	ulong	r4;
+	ulong	r5;
+	ulong	r6;
+	ulong	r7;
+	ulong	r8;
+	ulong	r9;
+	ulong	r10;
+	ulong	r11;
+	ulong	r12;
+	ulong	r13;
+	ulong	r14;
+	ulong	r15;
+	ulong	r16;
+	ulong	r17;
+	ulong	r18;
+	ulong	r19;
+	ulong	r20;
+	ulong	r21;
+	ulong	r22;
+	ulong	r23;
+	ulong	r24;
+	ulong	r25;
+	ulong	r26;
+	ulong	r27;
+	ulong	r28;
+	ulong	r29;
+	ulong	r30;
+	ulong	r31;
+	ulong	y;
+	ulong	tt;
+	ulong	pstate;
+	ulong	npc;
+	ulong	pc;
+	ulong	pad;	/* so structure is double word aligned */
+};

+ 6 - 0
sparc64/mkfile

@@ -0,0 +1,6 @@
+</sys/src/mkfile.proto
+
+CC=uc
+LD=ul
+O=u
+AS=ua

+ 4 - 1
sys/lib/dist/pc/mkfile

@@ -58,7 +58,10 @@ ndisk: 9load /sys/src/9/pc/9pcflop.gz plan9.ini /lib/vgadb
 		9load /sys/src/9/pc/9pcflop.gz plan9.ini /lib/vgadb
 		9load /sys/src/9/pc/9pcflop.gz plan9.ini /lib/vgadb
 	ls -l ndisk
 	ls -l ndisk
 
 
-cddisk:D: 9load /sys/src/9/pc/9pcflop.gz plan9.ini.cd /lib/vgadb /sys/src/9/pc/9pccd.gz
+# cannot list both 9pcflop.gz and 9pccd.gz because they cannot be built 
+# in parallel.  stupid mk
+cddisk:D: 9load /sys/src/9/pc/9pcflop.gz plan9.ini.cd /lib/vgadb
+	mk /sys/src/9/pc/9pccd.gz
 	rfork n
 	rfork n
 	bind plan9.ini.cd plan9.ini
 	bind plan9.ini.cd plan9.ini
 	dd -if /dev/zero -of cddisk -bs 1024 -count 2880 >[2]/dev/null
 	dd -if /dev/zero -of cddisk -bs 1024 -count 2880 >[2]/dev/null

+ 25 - 0
sys/man/8/vga

@@ -132,6 +132,31 @@ screen of the given size.
 The physical screen will pan to follow the mouse.
 The physical screen will pan to follow the mouse.
 This is useful on displays with small screens,
 This is useful on displays with small screens,
 such as laptops, but can be confusing.
 such as laptops, but can be confusing.
+.PP
+Using the monitor name
+.B vesa
+instructs
+.I vga
+to use VESA BIOS calls to configure the display.
+There are no entries for the
+.B vesa
+monitor in 
+.IR vgadb .
+For a list of available VESA modes, use
+.IP
+.EX
+aux/vga -m vesa -p
+.EE
+.PP
+Loading the special mode
+.BR text :
+.IP
+.EX
+aux/vga -l text
+.EE
+.PP
+switches out of graphics mode back into text mode.
+It uses the VESA BIOS.
 .SH EXAMPLES
 .SH EXAMPLES
 Change the display resolution:
 Change the display resolution:
 .IP
 .IP

+ 10 - 1
sys/src/boot/pc/bootp.c

@@ -367,7 +367,16 @@ tftpopen(int ctlrno, Netaddr *a, char *name, Tftp *tftp)
 				nak(ctlrno, a, 1, "block error", 0);
 				nak(ctlrno, a, 1, "block error", 0);
 				return -1;
 				return -1;
 			}
 			}
-			return rlen-sizeof(tftp->header);
+			rlen -= sizeof(tftp->header);
+			if(rlen < Segsize){
+				/* ACK now, in case we don't later */
+				buf[0] = 0;
+				buf[1] = Tftp_ACK;
+				buf[2] = tftpblockno>>8;
+				buf[3] = tftpblockno;
+				udpsend(ctlrno, a, buf, sizeof(tftp->header));
+			}
+			return rlen;
 		}
 		}
 	}
 	}
 
 

+ 1 - 1
sys/src/boot/pc/part.c

@@ -183,7 +183,7 @@ mbrpart(SDunit *unit)
 	for(i=0; i<4; i++, dp++) {
 	for(i=0; i<4; i++, dp++) {
 		if(trace)
 		if(trace)
 			print("dp %d...", dp->type);
 			print("dp %d...", dp->type);
-		start = mbroffset+GLONG(dp->start);
+		start = mbroffset/512+GLONG(dp->start);
 		end = start+GLONG(dp->len);
 		end = start+GLONG(dp->len);
 
 
 		if(dp->type == PLAN9) {
 		if(dp->type == PLAN9) {

+ 1 - 1
sys/src/cmd/1c/gc.h

@@ -14,7 +14,7 @@
 #define	SZ_VLONG	8
 #define	SZ_VLONG	8
 #define	SZ_DOUBLE	8
 #define	SZ_DOUBLE	8
 
 
-#define	ALLOP	92
+#define	ALLOP	OEND
 #define	NRGN	300
 #define	NRGN	300
 #define	FNX	100
 #define	FNX	100
 #define	INDEXED	9
 #define	INDEXED	9

+ 1 - 1
sys/src/cmd/2c/gc.h

@@ -14,7 +14,7 @@
 #define	SZ_VLONG	8
 #define	SZ_VLONG	8
 #define	SZ_DOUBLE	8
 #define	SZ_DOUBLE	8
 
 
-#define	ALLOP	92
+#define	ALLOP	OEND
 #define	NRGN	300
 #define	NRGN	300
 #define	FNX	100
 #define	FNX	100
 #define	INDEXED	9
 #define	INDEXED	9

+ 2 - 0
sys/src/cmd/aux/vga/data.c

@@ -59,6 +59,7 @@ Ctlr* ctlrs[] = {
 	&s3clock,				/* clock */
 	&s3clock,				/* clock */
 	&s3hwgc,				/* hwgc */
 	&s3hwgc,				/* hwgc */
 	&sc15025,				/* ramdac */
 	&sc15025,				/* ramdac */
+	&softhwgc,				/* hwgc */
 	&stg1702,				/* ramdac */
 	&stg1702,				/* ramdac */
 	&t2r4,					/* ctlr */
 	&t2r4,					/* ctlr */
 	&t2r4hwgc,				/* hwgc */
 	&t2r4hwgc,				/* hwgc */
@@ -72,6 +73,7 @@ Ctlr* ctlrs[] = {
 	&tvp3026,				/* ramdac */
 	&tvp3026,				/* ramdac */
 	&tvp3026clock,				/* clock */
 	&tvp3026clock,				/* clock */
 	&tvp3026hwgc,				/* hwgc */
 	&tvp3026hwgc,				/* hwgc */
+	&vesa,					/* ctlr */
 	&virge,					/* ctlr */
 	&virge,					/* ctlr */
 	&vision864,				/* ctlr */
 	&vision864,				/* ctlr */
 	&vision964,				/* ctlr */
 	&vision964,				/* ctlr */

+ 11 - 6
sys/src/cmd/aux/vga/db.c

@@ -74,7 +74,7 @@ addctlr(Vga* vga, char* val)
 		return *ctlr;	
 		return *ctlr;	
 	}
 	}
 
 
-	error("dbctlr: unknown controller \"%s\" ctlr\n", val);
+	fprint(2, "dbctlr: unknown controller \"%s\" ctlr\n", val);
 	return 0;
 	return 0;
 }
 }
 
 
@@ -158,20 +158,25 @@ dbpci(Vga *vga, Ndbtuple *tuple)
 static void
 static void
 save(Vga *vga, Ndbtuple *tuple)
 save(Vga *vga, Ndbtuple *tuple)
 {
 {
+	Ctlr *c;
 	Ndbtuple *t;
 	Ndbtuple *t;
 
 
 	for(t = tuple->entry; t; t = t->entry){
 	for(t = tuple->entry; t; t = t->entry){
-		if(strcmp(t->attr, "ctlr") == 0)
+		if(strcmp(t->attr, "ctlr") == 0){
 			vga->ctlr = addctlr(vga, t->val);
 			vga->ctlr = addctlr(vga, t->val);
-		else if(strcmp(t->attr, "ramdac") == 0)
+			if(strcmp(t->val, "vesa") == 0)
+				vga->vesa = vga->ctlr;
+		}else if(strcmp(t->attr, "ramdac") == 0)
 			vga->ramdac = addctlr(vga, t->val);
 			vga->ramdac = addctlr(vga, t->val);
 		else if(strcmp(t->attr, "clock") == 0)
 		else if(strcmp(t->attr, "clock") == 0)
 			vga->clock = addctlr(vga, t->val);
 			vga->clock = addctlr(vga, t->val);
 		else if(strcmp(t->attr, "hwgc") == 0)
 		else if(strcmp(t->attr, "hwgc") == 0)
 			vga->hwgc = addctlr(vga, t->val);
 			vga->hwgc = addctlr(vga, t->val);
-		else if(strcmp(t->attr, "link") == 0)
-			addctlr(vga, t->val);
-		else if(strcmp(t->attr, "linear") == 0)
+		else if(strcmp(t->attr, "link") == 0){
+			c = addctlr(vga, t->val);
+			if(strcmp(t->val, "vesa") == 0)
+				vga->vesa = c;
+		}else if(strcmp(t->attr, "linear") == 0)
 			vga->linear = strtol(t->val, 0, 0);
 			vga->linear = strtol(t->val, 0, 0);
 		else if(strcmp(t->attr, "membw") == 0)
 		else if(strcmp(t->attr, "membw") == 0)
 			vga->membw = strtol(t->val, 0, 0)*1000000;
 			vga->membw = strtol(t->val, 0, 0)*1000000;

+ 81 - 21
sys/src/cmd/aux/vga/main.c

@@ -98,6 +98,7 @@ static void
 linear(Vga* vga)
 linear(Vga* vga)
 {
 {
 	char buf[256];
 	char buf[256];
+	char *p;
 
 
 	/*
 	/*
 	 * Set up for linear addressing: try to allocate the
 	 * Set up for linear addressing: try to allocate the
@@ -109,11 +110,28 @@ linear(Vga* vga)
 		return;
 		return;
 	}
 	}
 	if(vga->ctlr->flag & Ulinear){
 	if(vga->ctlr->flag & Ulinear){
-		sprint(buf, "0x%lux 0x%lux", vga->apz ? vga->apz : vga->vmz, vga->vma);
-		vgactlw("linear", buf);
+		/*
+		 * If there's already an aperture don't bother trying
+		 * to set up a new one.
+		 */
 		vgactlr("addr", buf);
 		vgactlr("addr", buf);
+		if(atoi(buf)==0 && (buf[0]!='p' || buf[1]!=' ' || atoi(buf+2)==0)){
+			sprint(buf, "0x%lux 0x%lux", vga->apz ? vga->apz : vga->vmz, vga->vma);
+			vgactlw("linear", buf);
+			vgactlr("addr", buf);
+		}
 		trace("linear->addr %s\n", buf);
 		trace("linear->addr %s\n", buf);
-		vga->vmb = strtoul(buf, 0, 0);
+		/*
+		 * old: addr 0x12345678
+		 * new: addr p 0x12345678 v 0x82345678 size 0x123
+		 */
+		if(buf[0]=='p' && buf[1]==' '){
+			vga->vmb = strtoul(buf+2, 0, 0);
+			p = strstr(buf, "size");
+			if(p)
+				vga->apz = strtoul(p+4, 0, 0);
+		}else
+			vga->vmb = strtoul(buf, 0, 0);
 	}
 	}
 	else
 	else
 		vgactlw("linear", "0");
 		vgactlw("linear", "0");
@@ -133,7 +151,8 @@ chanstr[32+1] = {
 void
 void
 main(int argc, char** argv)
 main(int argc, char** argv)
 {
 {
-	char *bios, buf[256], sizeb[256], *p, *vsize, *psize, *type;
+	char *bios, buf[256], sizeb[256], *p, *vsize, *psize;
+	char *type, *vtype;
 	int virtual, len;
 	int virtual, len;
 	Ctlr *ctlr;
 	Ctlr *ctlr;
 	Vga *vga;
 	Vga *vga;
@@ -220,6 +239,12 @@ main(int argc, char** argv)
 		error(usage, argv0);
 		error(usage, argv0);
 	}
 	}
 
 
+	if(lflag && strcmp(vsize, "text") == 0){
+		vesatextmode();
+		vgactlw("textmode", "");
+		exits(0);
+	}
+
 	vga = alloc(sizeof(Vga));
 	vga = alloc(sizeof(Vga));
 	if(bios){
 	if(bios){
 		if((vga->offset = strtol(bios, &p, 0)) == 0 || *p++ != '=')
 		if((vga->offset = strtol(bios, &p, 0)) == 0 || *p++ != '=')
@@ -234,8 +259,10 @@ main(int argc, char** argv)
 	 * Try to identify the VGA card and grab
 	 * Try to identify the VGA card and grab
 	 * registers. Print them out if requested.
 	 * registers. Print them out if requested.
 	 */
 	 */
-	if(dbctlr(dbname, vga) == 0 || vga->ctlr == 0){
-		Bprint(&stdout, "%s: controller not in %s\n", argv0, dbname);
+	if(strcmp(type, "vesa") == 0
+		|| dbctlr(dbname, vga) == 0 || vga->ctlr == 0)
+	if(dbvesa(vga) == 0 || vga->ctlr == 0){
+		Bprint(&stdout, "%s: controller not in %s, not vesa\n", argv0, dbname);
 		dumpbios(256);
 		dumpbios(256);
 		type = "vga";
 		type = "vga";
 		vsize = psize = "640x480x1";
 		vsize = psize = "640x480x1";
@@ -265,8 +292,14 @@ main(int argc, char** argv)
 		else
 		else
 			strcpy(monitordb, dbname);
 			strcpy(monitordb, dbname);
 
 
-		if((vga->mode = dbmode(monitordb, type, psize)) == 0)
+		if(vga->vesa){
+			strcpy(monitordb, "vesa bios");
+			vga->mode = dbvesamode(psize);
+		}else
+			vga->mode = dbmode(monitordb, type, psize);
+		if(vga->mode == 0)
 			error("main: %s@%s not in %s\n", type, psize, monitordb);
 			error("main: %s@%s not in %s\n", type, psize, monitordb);
+
 		if(virtual){
 		if(virtual){
 			if((p = strchr(vsize, 'x')) == nil)
 			if((p = strchr(vsize, 'x')) == nil)
 				error("bad virtual size %s\n", vsize);
 				error("bad virtual size %s\n", vsize);
@@ -324,6 +357,10 @@ main(int argc, char** argv)
 			(*ctlr->options)(vga, ctlr);
 			(*ctlr->options)(vga, ctlr);
 		}
 		}
 
 
+		/*
+		 * skip init for vesa - vesa will do the registers for us
+		 */
+		if(!vga->vesa)
 		for(ctlr = vga->link; ctlr; ctlr = ctlr->link){
 		for(ctlr = vga->link; ctlr; ctlr = ctlr->link){
 			if(ctlr->init == 0)
 			if(ctlr->init == 0)
 				continue;
 				continue;
@@ -348,21 +385,38 @@ main(int argc, char** argv)
 					vga->ctlr->name, vga->vmz);
 					vga->ctlr->name, vga->vmz);
 
 
 			if(vga->ctlr->type)
 			if(vga->ctlr->type)
-				vgactlw("type", vga->ctlr->type);
+				vtype = vga->ctlr->type;
 			else if(p = strchr(vga->ctlr->name, '-')){
 			else if(p = strchr(vga->ctlr->name, '-')){
 				strncpy(buf, vga->ctlr->name, p - vga->ctlr->name);
 				strncpy(buf, vga->ctlr->name, p - vga->ctlr->name);
 				buf[p - vga->ctlr->name] = 0;
 				buf[p - vga->ctlr->name] = 0;
-				vgactlw("type", buf);
+				vtype = buf;
 			}
 			}
 			else
 			else
-				vgactlw("type", vga->ctlr->name);
-	
+				vtype = vga->ctlr->name;
+			vgactlw("type", vtype);
+
+			/*
+			 * VESA must be set up before linear.
+			 * Set type to vesa for linear.
+			 */
+			if(vga->vesa){
+				vgactlw("type", vesa.name);
+				vesa.load(vga, vga->vesa);
+			}
+
 			/*
 			/*
 			 * The new draw device needs linear mode set
 			 * The new draw device needs linear mode set
 			 * before size.
 			 * before size.
 			 */
 			 */
 			linear(vga);
 			linear(vga);
 
 
+			/*
+			 * Linear is over so switch to other driver for
+			 * acceleration.
+			 */
+			if(vga->vesa)
+				vgactlw("type", vtype);
+
 			sprint(buf, "%ludx%ludx%d %s",
 			sprint(buf, "%ludx%ludx%d %s",
 				vga->virtx, vga->virty,
 				vga->virtx, vga->virty,
 				vga->mode->z, vga->mode->chan);
 				vga->mode->z, vga->mode->chan);
@@ -376,19 +430,25 @@ main(int argc, char** argv)
 				vgactlw("size", buf);
 				vgactlw("size", buf);
 
 
 			/*
 			/*
-			 * Turn off the display during the load.
+			 * No fiddling with registers if VESA set 
+			 * things up already.  Sorry.
 			 */
 			 */
-			sequencer(vga, 0);
-
-			for(ctlr = vga->link; ctlr; ctlr = ctlr->link){
-				if(ctlr->load == 0)
-					continue;
-				trace("%s->load\n", ctlr->name);
-				(*ctlr->load)(vga, ctlr);
+			if(!vga->vesa){
+				/*
+				 * Turn off the display during the load.
+				 */
+				sequencer(vga, 0);
+	
+				for(ctlr = vga->link; ctlr; ctlr = ctlr->link){
+					if(ctlr->load == 0 || ctlr == &vesa)
+						continue;
+					trace("%s->load\n", ctlr->name);
+					(*ctlr->load)(vga, ctlr);
+				}
+	
+				sequencer(vga, 1);
 			}
 			}
 
 
-			sequencer(vga, 1);
-
 			vgactlw("drawinit", "");
 			vgactlw("drawinit", "");
 
 
 			if(vga->hwgc == 0 || cflag)
 			if(vga->hwgc == 0 || cflag)

+ 1 - 0
sys/src/cmd/aux/vga/mkfile

@@ -51,6 +51,7 @@ OFILES=\
 	tvp3025clock.$O\
 	tvp3025clock.$O\
 	tvp3026.$O\
 	tvp3026.$O\
 	tvp3026clock.$O\
 	tvp3026clock.$O\
+	vesa.$O\
 	vga.$O\
 	vga.$O\
 	virge.$O\
 	virge.$O\
 	vision864.$O\
 	vision864.$O\

+ 512 - 0
sys/src/cmd/aux/vga/vesa.c

@@ -0,0 +1,512 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include </386/include/ureg.h>
+typedef struct Ureg Ureg;
+
+#include "pci.h"
+#include "vga.h"
+
+typedef struct Vbe Vbe;
+typedef struct Vmode Vmode;
+
+enum
+{
+	MemSize = 1024*1024,
+	PageSize = 4096,
+	RealModeBuf = 0x9000,
+};
+
+struct Vbe
+{
+	int	rmfd;	/* /dev/realmode */
+	int	memfd;	/* /dev/realmem */
+	uchar	*mem;	/* copy of memory; 1MB */
+	uchar	*isvalid;	/* 1byte per 4kB in mem */
+	uchar	*buf;
+	uchar	*modebuf;
+};
+
+struct Vmode
+{
+	char	name[32];
+	char	chan[32];
+	int	id;
+	int	attr;	/* flags */
+	int	bpl;
+	int	dx, dy;
+	int	depth;
+	char	*model;
+	int	r, g, b, x;
+	int	ro, go, bo, xo;
+	int	directcolor;	/* flags */
+	ulong	paddr;
+};
+
+
+#define WORD(p) ((p)[0] | ((p)[1]<<8))
+#define LONG(p) ((p)[0] | ((p)[1]<<8) | ((p)[2]<<16) | ((p)[3]<<24))
+#define PWORD(p, v) (p)[0] = (v); (p)[1] = (v)>>8
+#define PLONG(p, v) (p)[0] = (v); (p)[1] = (v)>>8; (p)[2] = (v)>>16; (p)[3] = (v)>>24
+
+static Vbe *vbe;
+
+Vbe *mkvbe(void);
+int vbecheck(Vbe*);
+uchar *vbemodes(Vbe*);
+int vbemodeinfo(Vbe*, int, Vmode*);
+int vbegetmode(Vbe*);
+int vbesetmode(Vbe*, int);
+void vbeprintinfo(Vbe*);
+void vbeprintmodeinfo(Vbe*, int);
+int vbesnarf(Vbe*, Vga*);
+
+int
+dbvesa(Vga* vga)
+{
+	vbe = mkvbe();
+	if(vbe == nil){
+		fprint(2, "mkvbe: %r\n");
+		return 0;
+	}
+	if(vbecheck(vbe) < 0){
+		fprint(2, "dbvesa: %r\n");
+		return 0;
+	}
+	vga->link = alloc(sizeof(Ctlr));
+	*vga->link = vesa;
+	vga->vesa = vga->link;
+	vga->ctlr = vga->link;
+
+	vga->link->link = alloc(sizeof(Ctlr));
+	*vga->link->link = softhwgc;
+	vga->hwgc = vga->link->link;
+
+	return 1;
+}
+
+Mode*
+dbvesamode(char *mode)
+{
+	uchar *p, *ep;
+	Vmode vm;
+	Mode *m;
+
+	if(vbe == nil)
+		return nil;
+
+	p = vbemodes(vbe);
+	if(p == nil)
+		return nil;
+	for(ep=p+1024; (p[0]!=0xFF || p[1]!=0xFF) && p<ep; p+=2){
+		if(vbemodeinfo(vbe, WORD(p), &vm) < 0)
+			continue;
+		if(strcmp(vm.name, mode) == 0)
+			goto havemode;
+	}
+	werrstr("no such vesa mode");
+	return nil;
+
+havemode:
+	m = alloc(sizeof(Mode));
+	strcpy(m->type, "vesa");
+	strcpy(m->size, vm.name);
+	strcpy(m->chan, vm.chan);
+	m->frequency = 100;
+	m->x = vm.dx;
+	m->y = vm.dy;
+	m->z = vm.depth;
+	m->ht = m->x;
+	m->shb = m->x;
+	m->ehb = m->x;
+	m->shs = m->x;
+	m->ehs = m->x;
+	m->vt = m->y;
+	m->vrs = m->y;
+	m->vre = m->y;
+
+	m->attr = alloc(sizeof(Attr));
+	m->attr->attr = "id";
+	m->attr->val = alloc(32);
+	sprint(m->attr->val, "0x%x", vm.id);
+	return m;
+}
+
+static void
+snarf(Vga* vga, Ctlr* ctlr)
+{
+	if(!vbe)
+		vbe = mkvbe();
+	if(vbe)
+		vga->vesa = ctlr;
+	vbesnarf(vbe, vga);
+	vga->linear = 1;
+	ctlr->flag |= Hlinear|Ulinear;
+}
+
+static void
+load(Vga* vga, Ctlr* ctlr)
+{
+	if(vbe == nil)
+		error("no vesa bios");
+	if(vbesetmode(vbe, atoi(dbattr(vga->mode->attr, "id"))) < 0){
+		ctlr->flag |= Ferror;
+		fprint(2, "vbesetmode: %r\n");
+	}
+}
+
+static void
+dump(Vga*, Ctlr*)
+{
+	uchar *p, *ep;
+
+	if(!vbe){
+		Bprint(&stdout, "no vesa bios\n");
+		return;
+	}
+
+	vbeprintinfo(vbe);
+	p = vbemodes(vbe);
+	if(p){
+		for(ep=p+1024; (p[0]!=0xFF || p[1]!=0xFF) && p<ep; p+=2)
+			vbeprintmodeinfo(vbe, WORD(p));
+	}
+}
+
+Ctlr vesa = {
+	"vesa",			/* name */
+	snarf,				/* snarf */
+	0,			/* options */
+	0,				/* init */
+	load,				/* load */
+	dump,				/* dump */
+};
+
+Ctlr softhwgc = {
+	"soft",
+};
+
+/*
+ * VESA bios extension
+ */
+
+typedef struct Flag Flag;
+struct Flag {
+	int bit;
+	char *desc;
+};
+
+static Flag capabilityflag[] = {
+	0x01, "8-bit-dac",
+	0x02, "not-vga",
+	0x04, "ramdac-needs-blank",
+	0x08, "stereoscopic",
+	0x10, "stereo-evc",
+	0
+};
+
+static Flag modeattributesflags[] = {
+	1<<0, "supported",
+	1<<2, "tty",
+	1<<3, "color",
+	1<<4, "graphics",
+	1<<5, "not-vga",
+	1<<6, "no-windowed-vga",
+	1<<7, "linear",
+	1<<8, "double-scan",
+	1<<9, "interlace",
+	1<<10, "triple-buffer",
+	1<<11, "stereoscopic",
+	1<<12, "dual-start-addr",
+	0
+};
+
+static Flag winattributesflags[] = {
+	1<<0, "relocatable",
+	1<<1, "readable",
+	1<<2, "writeable",
+	0
+};
+
+static Flag directcolorflags[] = {
+	1<<0, "programmable-color-ramp",
+	1<<1, "x-usable",
+	0
+};
+
+static char *modelstr[] = {
+	"text", "cga", "hercules", "planar", "packed", "non-chain4", "direct", "YUV"
+};
+
+static void
+printflags(Flag *f, int b)
+{
+	int i;
+
+	for(i=0; f[i].bit; i++)
+		if(f[i].bit & b)
+			Bprint(&stdout, " %s", f[i].desc);
+	Bprint(&stdout, "\n");
+}
+
+Vbe*
+mkvbe(void)
+{
+	Vbe *vbe;
+
+	vbe = alloc(sizeof(Vbe));
+	if((vbe->rmfd = open("/dev/realmode", ORDWR)) < 0)
+		return nil;
+	if((vbe->memfd = open("/dev/realmodemem", ORDWR)) < 0)
+		return nil;
+	vbe->mem = alloc(MemSize);
+	vbe->isvalid = alloc(MemSize/PageSize);
+	vbe->buf = alloc(PageSize);
+	vbe->modebuf = alloc(PageSize);
+	return vbe;
+}
+
+static void
+loadpage(Vbe *vbe, int p)
+{
+	if(p >= MemSize/PageSize || vbe->isvalid[p])
+		return;
+	if(pread(vbe->memfd, vbe->mem+p*PageSize, PageSize, p*PageSize) != PageSize)
+		error("read /dev/realmodemem: %r\n");
+	vbe->isvalid[p] = 1;
+}
+
+static void*
+unfarptr(Vbe *vbe, uchar *p)
+{
+	int seg, off;
+
+	seg = WORD(p+2);
+	off = WORD(p);
+	if(seg==0 && off==0)
+		return nil;
+	off += seg;
+	if(off >= MemSize)
+		return nil;
+	loadpage(vbe, off/PageSize);
+	loadpage(vbe, off/PageSize+1);	/* just in case */
+	return vbe->mem+off;
+}
+
+uchar*
+vbesetup(Vbe *vbe, Ureg *u, int ax)
+{
+	memset(vbe->buf, 0, PageSize);
+	memset(u, 0, sizeof *u);
+	u->ax = ax;
+	u->es = (RealModeBuf>>4)&0xF000;
+	u->di = RealModeBuf&0xFFFF;
+	return vbe->buf;
+}
+
+int
+vbecall(Vbe *vbe, Ureg *u)
+{
+	u->trap = 0x10;
+	if(pwrite(vbe->memfd, vbe->buf, PageSize, RealModeBuf) != PageSize)
+		error("write /dev/realmodemem: %r\n");
+	if(pwrite(vbe->rmfd, u, sizeof *u, 0) != sizeof *u)
+		error("write /dev/realmode: %r\n");
+	if(pread(vbe->rmfd, u, sizeof *u, 0) != sizeof *u)
+		error("read /dev/realmode: %r\n");
+	if(pread(vbe->memfd, vbe->buf, PageSize, RealModeBuf) != PageSize)
+		error("read /dev/realmodemem: %r\n");
+	if((u->ax&0xFFFF) != 0x004F){
+		werrstr("VBE error %#.4lux", u->ax&0xFFFF);
+		return -1;
+	}
+	memset(vbe->isvalid, 0, MemSize/PageSize);
+	return 0;
+}
+
+int
+vbecheck(Vbe *vbe)
+{
+	uchar *p;
+	Ureg u;
+
+	p = vbesetup(vbe, &u, 0x4F00);
+	strcpy((char*)p, "VBE2");
+	if(vbecall(vbe, &u) < 0)
+		return -1;
+	if(memcmp(p, "VESA", 4) != 0 || p[5] < 2)
+		return -1;
+	return 0;
+}
+
+int
+vbesnarf(Vbe *vbe, Vga *vga)
+{
+	uchar *p;
+	Ureg u;
+
+	p = vbesetup(vbe, &u, 0x4F00);
+	strcpy((char*)p, "VBE2");
+	if(vbecall(vbe, &u) < 0)
+		return -1;
+	if(memcmp(p, "VESA", 4) != 0 || p[5] < 2)
+		return -1;
+	vga->apz = WORD(p+18)*0x10000UL;
+	return 0;
+}
+
+void
+vbeprintinfo(Vbe *vbe)
+{
+	uchar *p;
+	Ureg u;
+
+	p = vbesetup(vbe, &u, 0x4F00);
+	strcpy((char*)p, "VBE2");
+	if(vbecall(vbe, &u) < 0)
+		return;
+
+	printitem("vesa", "sig");
+	Bprint(&stdout, "%.4s %d.%d\n", (char*)p, p[5], p[4]);
+	if(p[5] < 2)
+		return;
+
+	printitem("vesa", "oem");
+	Bprint(&stdout, "%s %d.%d\n", unfarptr(vbe, p+6), p[21], p[20]);
+	printitem("vesa", "vendor");
+	Bprint(&stdout, "%s\n", unfarptr(vbe, p+22));
+	printitem("vesa", "product");
+	Bprint(&stdout, "%s\n", unfarptr(vbe, p+26));
+	printitem("vesa", "rev");
+	Bprint(&stdout, "%s\n", unfarptr(vbe, p+30));
+
+	printitem("vesa", "cap");
+	printflags(capabilityflag, p[10]);
+
+	printitem("vesa", "mem");
+	Bprint(&stdout, "%lud\n", WORD(p+18)*0x10000UL);
+}
+
+uchar*
+vbemodes(Vbe *vbe)
+{
+	uchar *p;
+	Ureg u;
+
+	p = vbesetup(vbe, &u, 0x4F00);
+	strcpy((char*)p, "VBE2");
+	if(vbecall(vbe, &u) < 0)
+		return nil;
+	memmove(vbe->modebuf, unfarptr(vbe, p+14), 1024);
+	return vbe->modebuf;
+}
+
+int
+vbemodeinfo(Vbe *vbe, int id, Vmode *m)
+{
+	uchar *p;
+	Ureg u;
+
+	p = vbesetup(vbe, &u, 0x4F01);
+	u.cx = id;
+	if(vbecall(vbe, &u) < 0)
+		return -1;
+
+	m->id = id;
+	m->attr = WORD(p);
+	m->bpl = WORD(p+16);
+	m->dx = WORD(p+18);
+	m->dy = WORD(p+20);
+	m->depth = p[25];
+	m->model = p[27] < nelem(modelstr) ? modelstr[p[27]] : "unknown";
+	m->r = p[31];
+	m->g = p[33];
+	m->b = p[35];
+	m->x = p[37];
+	m->ro = p[32];
+	m->go = p[34];
+	m->bo = p[36];
+	m->xo = p[38];
+	m->directcolor = p[39];
+	m->paddr = LONG(p+40);
+	snprint(m->name, sizeof m->name, "%dx%dx%d",
+		m->dx, m->dy, m->depth);
+	if(m->depth <= 8)
+		snprint(m->chan, sizeof m->chan, "m%d", m->depth);
+	else if(m->xo)
+		snprint(m->chan, sizeof m->chan, "x%dr%dg%db%d", m->x, m->r, m->g, m->b);
+	else
+		snprint(m->chan, sizeof m->chan, "r%dg%db%d", m->r, m->g, m->b);
+	return 0;
+}
+
+void
+vbeprintmodeinfo(Vbe *vbe, int id)
+{
+	Vmode m;
+
+	if(vbemodeinfo(vbe, id, &m) < 0)
+		return;
+	printitem("vesa", "mode");
+	Bprint(&stdout, "0x%ux %s %s %s\n",
+		m.id, m.name, m.chan, m.model);
+}
+
+int
+vbegetmode(Vbe *vbe)
+{
+	Ureg u;
+
+	vbesetup(vbe, &u, 0x4F03);
+	if(vbecall(vbe, &u) < 0)
+		return 0;
+	return u.bx;
+}
+
+int
+vbesetmode(Vbe *vbe, int id)
+{
+	uchar *p;
+	Ureg u;
+
+	p = vbesetup(vbe, &u, 0x4F02);
+	if(id != 3)
+		id |= 3<<14;	/* graphics: use linear, do not clear */
+	u.bx = id;
+	USED(p);
+	/*
+	 * can set mode specifics (ht hss hse vt vss vse 0 clockhz refreshhz):
+	 *
+		u.bx |= 1<<11;
+		n = atoi(argv[2]); PWORD(p, n); p+=2;
+		n = atoi(argv[3]); PWORD(p, n); p+=2;
+		n = atoi(argv[4]); PWORD(p, n); p+=2;
+		n = atoi(argv[5]); PWORD(p, n); p+=2;
+		n = atoi(argv[6]); PWORD(p, n); p+=2;
+		n = atoi(argv[7]); PWORD(p, n); p+=2;
+		*p++ = atoi(argv[8]);
+		n = atoi(argv[9]); PLONG(p, n); p += 4;
+		n = atoi(argv[10]); PWORD(p, n); p += 2;
+		if(p != vbe.buf+19){
+			fprint(2, "prog error\n");
+			return;
+		}
+	 *
+	 */
+	return vbecall(vbe, &u);
+}
+
+void
+vesatextmode(void)
+{
+	if(vbe == nil){
+		vbe = mkvbe();
+		if(!vbe)
+			error("mkvbe: %r\n");
+	}
+	if(vbecheck(vbe) < 0)
+		error("vbecheck: %r\n");
+	if(vbesetmode(vbe, 3) < 0)
+		error("vbesetmode: %r\n");
+}
+

+ 8 - 0
sys/src/cmd/aux/vga/vga.h

@@ -184,6 +184,7 @@ typedef struct Vga {
 	Ctlr*	ramdac;
 	Ctlr*	ramdac;
 	Ctlr*	clock;
 	Ctlr*	clock;
 	Ctlr*	hwgc;
 	Ctlr*	hwgc;
+	Ctlr* vesa;
 	Ctlr*	link;
 	Ctlr*	link;
 	int	linear;
 	int	linear;
 	Attr*	attr;
 	Attr*	attr;
@@ -412,6 +413,13 @@ extern void vgao(long, uchar);
 extern void vgaxo(long, uchar, uchar);
 extern void vgaxo(long, uchar, uchar);
 extern Ctlr generic;
 extern Ctlr generic;
 
 
+/* vesa.c */
+extern Ctlr vesa;
+extern Ctlr softhwgc;	/* has to go somewhere */
+extern int dbvesa(Vga*);
+extern Mode *dbvesamode(char*);
+extern void vesatextmode(void);
+
 /* virge.c */
 /* virge.c */
 extern Ctlr virge;
 extern Ctlr virge;
 
 

+ 1 - 1
sys/src/libmach/0.c

@@ -3,7 +3,7 @@
  */
  */
 #include <u.h>
 #include <u.h>
 #include <bio.h>
 #include <bio.h>
-#include "xc/mips2ureg.h"
+#include "0c/ureg.h"
 #include <mach.h>
 #include <mach.h>
 
 
 #define	FPREGBYTES	4
 #define	FPREGBYTES	4

+ 0 - 0
sys/src/libmach/xc/README → sys/src/libmach/0c/README


+ 0 - 0
sys/src/libmach/xc/mips2ureg.h → sys/src/libmach/0c/ureg.h


+ 117 - 0
sys/src/libmach/6.c

@@ -0,0 +1,117 @@
+/*
+ * amd64 definition
+ */
+#include <u.h>
+#include <bio.h>
+#include "/amd64/include/ureg.h"
+#include <mach.h>
+
+#define	REGOFF(x)	(uvlong)(&((struct Ureg *) 0)->x)
+
+#define PC		REGOFF(ip)
+#define SP		REGOFF(sp)
+#define	AX		REGOFF(ax)
+
+#define	REGSIZE		sizeof(struct Ureg)
+#define FP_CTLS(x)	(REGSIZE+2*(x))
+#define FP_CTL(x)	(REGSIZE+4*(x))
+#define FP_REG(x)	(FP_CTL(8)+16*(x))
+#define XM_REG(x)	(FP_CTL(8)+8*16+16*(x))
+
+#define	FPREGSIZE	512	/* TO DO? currently only 0x1A0 used */
+
+Reglist amd64reglist[] = {
+	{"AX",		REGOFF(ax),	RINT, 'Y'},
+	{"BX",		REGOFF(bx),	RINT, 'Y'},
+	{"CX",		REGOFF(cx),	RINT, 'Y'},
+	{"DX",		REGOFF(dx),	RINT, 'Y'},
+	{"SI",		REGOFF(si),	RINT, 'Y'},
+	{"DI",		REGOFF(di),	RINT, 'X'},
+	{"BP",		REGOFF(bp),	RINT, 'Y'},
+	{"R8",		REGOFF(r8),	RINT, 'Y'},
+	{"R9",		REGOFF(r9),	RINT, 'Y'},
+	{"R10",		REGOFF(r10),	RINT, 'Y'},
+	{"R11",		REGOFF(r11),	RINT, 'Y'},
+	{"R12",		REGOFF(r12),	RINT, 'Y'},
+	{"R13",		REGOFF(r13),	RINT, 'Y'},
+	{"R14",		REGOFF(r14),	RINT, 'Y'},
+	{"R15",		REGOFF(r15),	RINT, 'Y'},
+	{"DS",		REGOFF(ds),	RINT, 'x'},
+	{"ES",		REGOFF(es),	RINT, 'x'},
+	{"FS",		REGOFF(fs),	RINT, 'x'},
+	{"GS",		REGOFF(gs),	RINT, 'x'},
+	{"TYPE",	REGOFF(type), 	RINT, 'Y'},
+	{"ERROR",	REGOFF(error),	RINT, 'Y'},
+	{"PC",		PC,		RINT, 'Y'},
+	{"CS",		REGOFF(cs),	RINT, 'Y'},
+	{"FLAGS",	REGOFF(flags),	RINT, 'Y'},
+	{"SP",		SP,		RINT, 'Y'},
+	{"SS",		REGOFF(ss),	RINT, 'Y'},
+
+	{"FCW",		FP_CTLS(0),	RFLT, 'x'},
+	{"FSW",		FP_CTLS(1),	RFLT, 'x'},
+	{"FTW",		FP_CTLS(2),	RFLT, 'x'},
+	{"FOP",		FP_CTLS(3),	RFLT, 'x'},
+	{"FPC",		FP_CTL(2),	RFLT, 'Y'},
+	{"RDP",		FP_CTL(4),	RFLT, 'Y'},
+	{"MXCSR",	FP_CTL(6),	RFLT, 'X'},
+	{"MXCSRMSK",	FP_CTL(7),	RFLT, 'X'},
+	{"M0",		FP_REG(0),	RFLT, 'F'},	/* assumes double */
+	{"M1",		FP_REG(1),	RFLT, 'F'},
+	{"M2",		FP_REG(2),	RFLT, 'F'},
+	{"M3",		FP_REG(3),	RFLT, 'F'},
+	{"M4",		FP_REG(4),	RFLT, 'F'},
+	{"M5",		FP_REG(5),	RFLT, 'F'},
+	{"M6",		FP_REG(6),	RFLT, 'F'},
+	{"M7",		FP_REG(7),	RFLT, 'F'},
+	{"X0",		XM_REG(0),	RFLT, 'F'},	/* assumes double */
+	{"X1",		XM_REG(1),	RFLT, 'F'},
+	{"X2",		XM_REG(2),	RFLT, 'F'},
+	{"X3",		XM_REG(3),	RFLT, 'F'},
+	{"X4",		XM_REG(4),	RFLT, 'F'},
+	{"X5",		XM_REG(5),	RFLT, 'F'},
+	{"X6",		XM_REG(6),	RFLT, 'F'},
+	{"X7",		XM_REG(7),	RFLT, 'F'},
+	{"X8",		XM_REG(8),	RFLT, 'F'},
+	{"X9",		XM_REG(9),	RFLT, 'F'},
+	{"X10",		XM_REG(10),	RFLT, 'F'},
+	{"X11",		XM_REG(11),	RFLT, 'F'},
+	{"X12",		XM_REG(12),	RFLT, 'F'},
+	{"X13",		XM_REG(13),	RFLT, 'F'},
+	{"X14",		XM_REG(14),	RFLT, 'F'},
+	{"X15",		XM_REG(15),	RFLT, 'F'},
+	{"X16",		XM_REG(16),	RFLT, 'F'},
+/*
+	{"F0",		FP_REG(7),	RFLT, '3'},
+	{"F1",		FP_REG(6),	RFLT, '3'},
+	{"F2",		FP_REG(5),	RFLT, '3'},
+	{"F3",		FP_REG(4),	RFLT, '3'},
+	{"F4",		FP_REG(3),	RFLT, '3'},
+	{"F5",		FP_REG(2),	RFLT, '3'},
+	{"F6",		FP_REG(1),	RFLT, '3'},
+	{"F7",		FP_REG(0),	RFLT, '3'},
+*/
+	{  0 }
+};
+
+Mach mamd64=
+{
+	"amd64",
+	MI386,		/* machine type */	/* TO DO */
+	amd64reglist,	/* register list */
+	REGSIZE,	/* size of registers in bytes */
+	FPREGSIZE,	/* size of fp registers in bytes */
+	"PC",		/* name of PC */
+	"SP",		/* name of SP */
+	0,		/* link register */
+	"setSB",	/* static base register name (bogus anyways) */
+	0,		/* static base register value */
+	0x1000,		/* page size */
+	0x80100000,	/* kernel base */	/* TO DO: uvlong or vlong */
+	0,		/* kernel text mask */
+	1,		/* quantization of pc */
+	8,		/* szaddr */
+	4,		/* szreg */
+	4,		/* szfloat */
+	8,		/* szdouble */
+};

+ 820 - 0
sys/src/libmach/6c/6.out.h

@@ -0,0 +1,820 @@
+#define	NSYM	50
+#define	NSNAME	8
+#define NOPROF	(1<<0)
+#define DUPOK	(1<<1)
+
+/*
+ *	amd64
+ */
+
+enum	as
+{
+	AXXX,
+	AAAA,
+	AAAD,
+	AAAM,
+	AAAS,
+	AADCB,
+	AADCL,
+	AADCW,
+	AADDB,
+	AADDL,
+	AADDW,
+	AADJSP,
+	AANDB,
+	AANDL,
+	AANDW,
+	AARPL,
+	ABOUNDL,
+	ABOUNDW,
+	ABSFL,
+	ABSFW,
+	ABSRL,
+	ABSRW,
+	ABTL,
+	ABTW,
+	ABTCL,
+	ABTCW,
+	ABTRL,
+	ABTRW,
+	ABTSL,
+	ABTSW,
+	ABYTE,
+	ACALL,
+	ACLC,
+	ACLD,
+	ACLI,
+	ACLTS,
+	ACMC,
+	ACMPB,
+	ACMPL,
+	ACMPW,
+	ACMPSB,
+	ACMPSL,
+	ACMPSW,
+	ADAA,
+	ADAS,
+	ADATA,
+	ADECB,
+	ADECL,
+	ADECQ,
+	ADECW,
+	ADIVB,
+	ADIVL,
+	ADIVW,
+	AENTER,
+	AGLOBL,
+	AGOK,
+	AHISTORY,
+	AHLT,
+	AIDIVB,
+	AIDIVL,
+	AIDIVW,
+	AIMULB,
+	AIMULL,
+	AIMULW,
+	AINB,
+	AINL,
+	AINW,
+	AINCB,
+	AINCL,
+	AINCQ,
+	AINCW,
+	AINSB,
+	AINSL,
+	AINSW,
+	AINT,
+	AINTO,
+	AIRETL,
+	AIRETW,
+	AJCC,
+	AJCS,
+	AJCXZ,
+	AJEQ,
+	AJGE,
+	AJGT,
+	AJHI,
+	AJLE,
+	AJLS,
+	AJLT,
+	AJMI,
+	AJMP,
+	AJNE,
+	AJOC,
+	AJOS,
+	AJPC,
+	AJPL,
+	AJPS,
+	ALAHF,
+	ALARL,
+	ALARW,
+	ALEAL,
+	ALEAW,
+	ALEAVEL,
+	ALEAVEW,
+	ALOCK,
+	ALODSB,
+	ALODSL,
+	ALODSW,
+	ALONG,
+	ALOOP,
+	ALOOPEQ,
+	ALOOPNE,
+	ALSLL,
+	ALSLW,
+	AMOVB,
+	AMOVL,
+	AMOVW,
+	AMOVBLSX,
+	AMOVBLZX,
+	AMOVBQSX,
+	AMOVBQZX,
+	AMOVBWSX,
+	AMOVBWZX,
+	AMOVWLSX,
+	AMOVWLZX,
+	AMOVWQSX,
+	AMOVWQZX,
+	AMOVSB,
+	AMOVSL,
+	AMOVSW,
+	AMULB,
+	AMULL,
+	AMULW,
+	ANAME,
+	ANEGB,
+	ANEGL,
+	ANEGW,
+	ANOP,
+	ANOTB,
+	ANOTL,
+	ANOTW,
+	AORB,
+	AORL,
+	AORW,
+	AOUTB,
+	AOUTL,
+	AOUTW,
+	AOUTSB,
+	AOUTSL,
+	AOUTSW,
+	APOPAL,
+	APOPAW,
+	APOPFL,
+	APOPFW,
+	APOPL,
+	APOPW,
+	APUSHAL,
+	APUSHAW,
+	APUSHFL,
+	APUSHFW,
+	APUSHL,
+	APUSHW,
+	ARCLB,
+	ARCLL,
+	ARCLW,
+	ARCRB,
+	ARCRL,
+	ARCRW,
+	AREP,
+	AREPN,
+	ARET,
+	AROLB,
+	AROLL,
+	AROLW,
+	ARORB,
+	ARORL,
+	ARORW,
+	ASAHF,
+	ASALB,
+	ASALL,
+	ASALW,
+	ASARB,
+	ASARL,
+	ASARW,
+	ASBBB,
+	ASBBL,
+	ASBBW,
+	ASCASB,
+	ASCASL,
+	ASCASW,
+	ASETCC,
+	ASETCS,
+	ASETEQ,
+	ASETGE,
+	ASETGT,
+	ASETHI,
+	ASETLE,
+	ASETLS,
+	ASETLT,
+	ASETMI,
+	ASETNE,
+	ASETOC,
+	ASETOS,
+	ASETPC,
+	ASETPL,
+	ASETPS,
+	ACDQ,
+	ACWD,
+	ASHLB,
+	ASHLL,
+	ASHLW,
+	ASHRB,
+	ASHRL,
+	ASHRW,
+	ASTC,
+	ASTD,
+	ASTI,
+	ASTOSB,
+	ASTOSL,
+	ASTOSW,
+	ASUBB,
+	ASUBL,
+	ASUBW,
+	ASYSCALL,
+	ATESTB,
+	ATESTL,
+	ATESTW,
+	ATEXT,
+	AVERR,
+	AVERW,
+	AWAIT,
+	AWORD,
+	AXCHGB,
+	AXCHGL,
+	AXCHGW,
+	AXLAT,
+	AXORB,
+	AXORL,
+	AXORW,
+
+	AFMOVB,
+	AFMOVBP,
+	AFMOVD,
+	AFMOVDP,
+	AFMOVF,
+	AFMOVFP,
+	AFMOVL,
+	AFMOVLP,
+	AFMOVV,
+	AFMOVVP,
+	AFMOVW,
+	AFMOVWP,
+	AFMOVX,
+	AFMOVXP,
+
+	AFCOMB,
+	AFCOMBP,
+	AFCOMD,
+	AFCOMDP,
+	AFCOMDPP,
+	AFCOMF,
+	AFCOMFP,
+	AFCOML,
+	AFCOMLP,
+	AFCOMW,
+	AFCOMWP,
+	AFUCOM,
+	AFUCOMP,
+	AFUCOMPP,
+
+	AFADDDP,
+	AFADDW,
+	AFADDL,
+	AFADDF,
+	AFADDD,
+
+	AFMULDP,
+	AFMULW,
+	AFMULL,
+	AFMULF,
+	AFMULD,
+
+	AFSUBDP,
+	AFSUBW,
+	AFSUBL,
+	AFSUBF,
+	AFSUBD,
+
+	AFSUBRDP,
+	AFSUBRW,
+	AFSUBRL,
+	AFSUBRF,
+	AFSUBRD,
+
+	AFDIVDP,
+	AFDIVW,
+	AFDIVL,
+	AFDIVF,
+	AFDIVD,
+
+	AFDIVRDP,
+	AFDIVRW,
+	AFDIVRL,
+	AFDIVRF,
+	AFDIVRD,
+
+	AFXCHD,
+	AFFREE,
+
+	AFLDCW,
+	AFLDENV,
+	AFRSTOR,
+	AFSAVE,
+	AFSTCW,
+	AFSTENV,
+	AFSTSW,
+
+	AF2XM1,
+	AFABS,
+	AFCHS,
+	AFCLEX,
+	AFCOS,
+	AFDECSTP,
+	AFINCSTP,
+	AFINIT,
+	AFLD1,
+	AFLDL2E,
+	AFLDL2T,
+	AFLDLG2,
+	AFLDLN2,
+	AFLDPI,
+	AFLDZ,
+	AFNOP,
+	AFPATAN,
+	AFPREM,
+	AFPREM1,
+	AFPTAN,
+	AFRNDINT,
+	AFSCALE,
+	AFSIN,
+	AFSINCOS,
+	AFSQRT,
+	AFTST,
+	AFXAM,
+	AFXTRACT,
+	AFYL2X,
+	AFYL2XP1,
+
+	AEND,
+
+	ADYNT,
+	AINIT,
+
+	ASIGNAME,
+
+	/* extra 32-bit operations */
+	ACMPXCHGB,
+	ACMPXCHGL,
+	ACMPXCHGW,
+	ACMPXCHG8B,
+	ACPUID,
+	AINVD,
+	AINVLPG,
+	ALFENCE,
+	AMFENCE,
+	AMOVNTIL,
+	ARDMSR,
+	ARDPMC,
+	ARDTSC,
+	ARSM,
+	ASFENCE,
+	ASYSRET,
+	AWBINVD,
+	AWRMSR,
+	AXADDB,
+	AXADDL,
+	AXADDW,
+
+	/* conditional move */
+	ACMOVLCC,
+	ACMOVLCS,
+	ACMOVLEQ,
+	ACMOVLGE,
+	ACMOVLGT,
+	ACMOVLHI,
+	ACMOVLLE,
+	ACMOVLLS,
+	ACMOVLLT,
+	ACMOVLMI,
+	ACMOVLNE,
+	ACMOVLOC,
+	ACMOVLOS,
+	ACMOVLPC,
+	ACMOVLPL,
+	ACMOVLPS,
+	ACMOVQCC,
+	ACMOVQCS,
+	ACMOVQEQ,
+	ACMOVQGE,
+	ACMOVQGT,
+	ACMOVQHI,
+	ACMOVQLE,
+	ACMOVQLS,
+	ACMOVQLT,
+	ACMOVQMI,
+	ACMOVQNE,
+	ACMOVQOC,
+	ACMOVQOS,
+	ACMOVQPC,
+	ACMOVQPL,
+	ACMOVQPS,
+	ACMOVWCC,
+	ACMOVWCS,
+	ACMOVWEQ,
+	ACMOVWGE,
+	ACMOVWGT,
+	ACMOVWHI,
+	ACMOVWLE,
+	ACMOVWLS,
+	ACMOVWLT,
+	ACMOVWMI,
+	ACMOVWNE,
+	ACMOVWOC,
+	ACMOVWOS,
+	ACMOVWPC,
+	ACMOVWPL,
+	ACMOVWPS,
+
+	/* 64-bit */
+	AADCQ,
+	AADDQ,
+	AANDQ,
+	ABSFQ,
+	ABSRQ,
+	ABTCQ,
+	ABTQ,
+	ABTRQ,
+	ABTSQ,
+	ACMPQ,
+	ACMPSQ,
+	ACMPXCHGQ,
+	ACQO,
+	ADIVQ,
+	AIDIVQ,
+	AIMULQ,
+	AIRETQ,
+	ALEAQ,
+	ALEAVEQ,
+	ALODSQ,
+	AMOVQ,
+	AMOVLQSX,
+	AMOVLQZX,
+	AMOVNTIQ,
+	AMOVSQ,
+	AMULQ,
+	ANEGQ,
+	ANOTQ,
+	AORQ,
+	APOPFQ,
+	APOPQ,
+	APUSHFQ,
+	APUSHQ,
+	ARCLQ,
+	ARCRQ,
+	AROLQ,
+	ARORQ,
+	AQUAD,
+	ASALQ,
+	ASARQ,
+	ASBBQ,
+	ASCASQ,
+	ASHLQ,
+	ASHRQ,
+	ASTOSQ,
+	ASUBQ,
+	ATESTQ,
+	AXADDQ,
+	AXCHGQ,
+	AXORQ,
+
+	/* media */
+	AADDPD,
+	AADDPS,
+	AADDSD,
+	AADDSS,
+	AANDNPD,
+	AANDNPS,
+	AANDPD,
+	AANDPS,
+	ACMPPD,
+	ACMPPS,
+	ACMPSD,
+	ACMPSS,
+	ACOMISD,
+	ACOMISS,
+	ACVTPD2PL,
+	ACVTPD2PS,
+	ACVTPL2PD,
+	ACVTPL2PS,
+	ACVTPS2PD,
+	ACVTPS2PL,
+	ACVTSD2SL,
+	ACVTSD2SQ,
+	ACVTSD2SS,
+	ACVTSL2SD,
+	ACVTSL2SS,
+	ACVTSQ2SD,
+	ACVTSQ2SS,
+	ACVTSS2SD,
+	ACVTSS2SL,
+	ACVTSS2SQ,
+	ACVTTPD2PL,
+	ACVTTPS2PL,
+	ACVTTSD2SL,
+	ACVTTSD2SQ,
+	ACVTTSS2SL,
+	ACVTTSS2SQ,
+	ADIVPD,
+	ADIVPS,
+	ADIVSD,
+	ADIVSS,
+	AEMMS,
+	AFXRSTOR,
+	AFXRSTOR64,
+	AFXSAVE,
+	AFXSAVE64,
+	ALDMXCSR,
+	AMASKMOVOU,
+	AMASKMOVQ,
+	AMAXPD,
+	AMAXPS,
+	AMAXSD,
+	AMAXSS,
+	AMINPD,
+	AMINPS,
+	AMINSD,
+	AMINSS,
+	AMOVAPD,
+	AMOVAPS,
+	AMOVOU,
+	AMOVHLPS,
+	AMOVHPD,
+	AMOVHPS,
+	AMOVLHPS,
+	AMOVLPD,
+	AMOVLPS,
+	AMOVMSKPD,
+	AMOVMSKPS,
+	AMOVNTO,
+	AMOVNTPD,
+	AMOVNTPS,
+	AMOVNTQ,
+	AMOVO,
+	AMOVQOZX,
+	AMOVSD,
+	AMOVSS,
+	AMOVUPD,
+	AMOVUPS,
+	AMULPD,
+	AMULPS,
+	AMULSD,
+	AMULSS,
+	AORPD,
+	AORPS,
+	APACKSSLW,
+	APACKSSWB,
+	APACKUSWB,
+	APADDB,
+	APADDL,
+	APADDQ,
+	APADDSB,
+	APADDSW,
+	APADDUSB,
+	APADDUSW,
+	APADDW,
+	APANDB,
+	APANDL,
+	APANDSB,
+	APANDSW,
+	APANDUSB,
+	APANDUSW,
+	APANDW,
+	APAND,
+	APANDN,
+	APAVGB,
+	APAVGW,
+	APCMPEQB,
+	APCMPEQL,
+	APCMPEQW,
+	APCMPGTB,
+	APCMPGTL,
+	APCMPGTW,
+	APEXTRW,
+	APFACC,
+	APFADD,
+	APFCMPEQ,
+	APFCMPGE,
+	APFCMPGT,
+	APFMAX,
+	APFMIN,
+	APFMUL,
+	APFNACC,
+	APFPNACC,
+	APFRCP,
+	APFRCPIT1,
+	APFRCPI2T,
+	APFRSQIT1,
+	APFRSQRT,
+	APFSUB,
+	APFSUBR,
+	APINSRW,
+	APMADDWL,
+	APMAXSW,
+	APMAXUB,
+	APMINSW,
+	APMINUB,
+	APMOVMSKB,
+	APMULHRW,
+	APMULHUW,
+	APMULHW,
+	APMULLW,
+	APMULULQ,
+	APOR,
+	APSADBW,
+	APSHUFHW,
+	APSHUFL,
+	APSHUFLW,
+	APSHUFW,
+	APSLLO,
+	APSLLL,
+	APSLLQ,
+	APSLLW,
+	APSRAL,
+	APSRAW,
+	APSRLO,
+	APSRLL,
+	APSRLQ,
+	APSRLW,
+	APSUBB,
+	APSUBL,
+	APSUBQ,
+	APSUBSB,
+	APSUBSW,
+	APSUBUSB,
+	APSUBUSW,
+	APSUBW,
+	APSWAPL,
+	APUNPCKHBW,
+	APUNPCKHLQ,
+	APUNPCKHQDQ,
+	APUNPCKHWL,
+	APUNPCKLBW,
+	APUNPCKLLQ,
+	APUNPCKLQDQ,
+	APUNPCKLWL,
+	APXOR,
+	ARCPPS,
+	ARCPSS,
+	ARSQRTPS,
+	ARSQRTSS,
+	ASHUFPD,
+	ASHUFPS,
+	ASQRTPD,
+	ASQRTPS,
+	ASQRTSD,
+	ASQRTSS,
+	ASTMXCSR,
+	ASUBPD,
+	ASUBPS,
+	ASUBSD,
+	ASUBSS,
+	AUCOMISD,
+	AUCOMISS,
+	AUNPCKHPD,
+	AUNPCKHPS,
+	AUNPCKLPD,
+	AUNPCKLPS,
+	AXORPD,
+	AXORPS,
+
+	APF2IW,
+	APF2IL,
+	API2FW,
+	API2FL,
+	ARETFW,
+	ARETFL,
+	ARETFQ,
+	ASWAPGS,
+
+	AMODE,
+
+	ALAST
+};
+
+enum
+{
+
+	D_AL		= 0,
+	D_CL,
+	D_DL,
+	D_BL,
+	D_SPB,
+	D_BPB,
+	D_SIB,
+	D_DIB,
+	D_R8B,
+	D_R9B,
+	D_R10B,
+	D_R11B,
+	D_R12B,
+	D_R13B,
+	D_R14B,
+	D_R15B,
+
+	D_AX		= 16,
+	D_CX,
+	D_DX,
+	D_BX,
+	D_SP,
+	D_BP,
+	D_SI,
+	D_DI,
+	D_R8,
+	D_R9,
+	D_R10,
+	D_R11,
+	D_R12,
+	D_R13,
+	D_R14,
+	D_R15,
+
+	D_AH		= 32,
+	D_CH,
+	D_DH,
+	D_BH,
+
+	D_F0		= 36,
+
+	D_M0		= 44,
+
+	D_X0		= 52,
+
+	D_CS		= 68,
+	D_SS,
+	D_DS,
+	D_ES,
+	D_FS,
+	D_GS,
+
+	D_GDTR,		/* global descriptor table register */
+	D_IDTR,		/* interrupt descriptor table register */
+	D_LDTR,		/* local descriptor table register */
+	D_MSW,		/* machine status word */
+	D_TASK,		/* task register */
+
+	D_CR		= 79,
+	D_DR		= 95,
+	D_TR		= 103,
+
+	D_NONE		= 111,
+
+	D_BRANCH	= 112,
+	D_EXTERN	= 113,
+	D_STATIC		= 114,
+	D_AUTO		= 115,
+	D_PARAM		= 116,
+	D_CONST		= 117,
+	D_FCONST	= 118,
+	D_SCONST	= 119,
+	D_ADDR		= 120,
+
+	D_FILE,
+	D_FILE1,
+
+	D_INDIR,	/* additive */
+
+	T_TYPE		= 1<<0,
+	T_INDEX		= 1<<1,
+	T_OFFSET	= 1<<2,
+	T_FCONST	= 1<<3,
+	T_SYM		= 1<<4,
+	T_SCONST	= 1<<5,
+	T_64	= 1<<6,
+
+	REGARG		= D_BP,	/* MIGHT CHANGE */
+	REGRET		= D_AX,
+	FREGRET		= D_X0,
+	REGSP		= D_SP,
+	REGTMP		= D_DI,
+	REGEXT		= D_R15,	/* compiler allocates external registers R15 down */
+	FREGMIN		= D_X0+5,	/* first register variable */
+	FREGEXT		= D_X0+7	/* first external register */
+};
+
+/*
+ * this is the ranlib header
+ */
+#define	SYMDEF	"__.SYMDEF"
+
+/*
+ * this is the simulated IEEE floating point
+ */
+typedef	struct	ieee	Ieee;
+struct	ieee
+{
+	long	l;	/* contains ls-man	0xffffffff */
+	long	h;	/* contains sign	0x80000000
+				    exp		0x7ff00000
+				    ms-man	0x000fffff */
+};

+ 143 - 0
sys/src/libmach/6obj.c

@@ -0,0 +1,143 @@
+/*
+ * 6obj.c - identify and parse an amd64 object file
+ */
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include "6c/6.out.h"
+#include "obj.h"
+
+typedef struct Addr	Addr;
+struct Addr
+{
+	char	sym;
+	char	flags;
+};
+static	Addr	addr(Biobuf*);
+static	char	type2char(int);
+static	void	skip(Biobuf*, int);
+
+int
+_is6(char *t)
+{
+	uchar *s = (uchar*)t;
+
+	return  s[0] == (ANAME&0xff)			/* aslo = ANAME */
+		&& s[1] == ((ANAME>>8)&0xff)
+		&& s[2] == D_FILE			/* type */
+		&& s[3] == 1				/* sym */
+		&& s[4] == '<';				/* name of file */
+}
+
+int
+_read6(Biobuf *bp, Prog* p)
+{
+	int as, n, c;
+	Addr a;
+
+	as = Bgetc(bp);		/* as(low) */
+	if(as < 0)
+		return 0;
+	c = Bgetc(bp);		/* as(high) */
+	if(c < 0)
+		return 0;
+	as |= ((c & 0xff) << 8);
+	p->kind = aNone;
+	if(as == ANAME || as == ASIGNAME){
+		if(as == ASIGNAME)
+			skip(bp, 4);	/* signature */
+		p->kind = aName;
+		p->type = type2char(Bgetc(bp));		/* type */
+		p->sym = Bgetc(bp);			/* sym */
+		n = 0;
+		for(;;) {
+			as = Bgetc(bp);
+			if(as < 0)
+				return 0;
+			n++;
+			if(as == 0)
+				break;
+		}
+		p->id = malloc(n);
+		if(p->id == 0)
+			return 0;
+		Bseek(bp, -n, 1);
+		if(Bread(bp, p->id, n) != n)
+			return 0;
+		return 1;
+	}
+	if(as == ATEXT)
+		p->kind = aText;
+	if(as == AGLOBL)
+		p->kind = aData;
+	skip(bp, 4);		/* lineno(4) */
+	a = addr(bp);
+	addr(bp);
+	if(!(a.flags & T_SYM))
+		p->kind = aNone;
+	p->sym = a.sym;
+	return 1;
+}
+
+static Addr
+addr(Biobuf *bp)
+{
+	Addr a;
+	int t;
+	long l;
+	vlong off;
+
+	off = 0;
+	a.sym = -1;
+	a.flags = Bgetc(bp);			/* flags */
+	if(a.flags & T_INDEX)
+		skip(bp, 2);
+	if(a.flags & T_OFFSET){
+		l = Bgetc(bp);
+		l |= Bgetc(bp) << 8;
+		l |= Bgetc(bp) << 16;
+		l |= Bgetc(bp) << 24;
+		off = l;
+		if(a.flags & T_64){
+			l = Bgetc(bp);
+			l |= Bgetc(bp) << 8;
+			l |= Bgetc(bp) << 16;
+			l |= Bgetc(bp) << 24;
+			off = ((vlong)l << 32) | (off & 0xFFFFFFFF);
+		}
+		if(off < 0)
+			off = -off;
+	}
+	if(a.flags & T_SYM)
+		a.sym = Bgetc(bp);
+	if(a.flags & T_FCONST)
+		skip(bp, 8);
+	else
+	if(a.flags & T_SCONST)
+		skip(bp, NSNAME);
+	if(a.flags & T_TYPE) {
+		t = Bgetc(bp);
+		if(a.sym > 0 && (t==D_PARAM || t==D_AUTO))
+			_offset(a.sym, off);
+	}
+	return a;
+}
+
+static char
+type2char(int t)
+{
+	switch(t){
+	case D_EXTERN:		return 'U';
+	case D_STATIC:		return 'b';
+	case D_AUTO:		return 'a';
+	case D_PARAM:		return 'p';
+	default:		return UNKNOWN;
+	}
+}
+
+static void
+skip(Biobuf *bp, int n)
+{
+	while (n-- > 0)
+		Bgetc(bp);
+}

+ 475 - 49
sys/src/libmach/8db.c

@@ -5,6 +5,7 @@
 
 
 /*
 /*
  * i386-specific debugger interface
  * i386-specific debugger interface
+ * also amd64 extensions
  */
  */
 
 
 static	char	*i386excep(Map*, Rgetter);
 static	char	*i386excep(Map*, Rgetter);
@@ -35,6 +36,9 @@ static char *excname[] =
 [13]	"general protection violation",
 [13]	"general protection violation",
 [14]	"page fault",
 [14]	"page fault",
 [16]	"math coprocessor error",
 [16]	"math coprocessor error",
+[17]	"alignment check",
+[18]	"machine check",
+[19]	"floating-point exception",
 [24]	"clock",
 [24]	"clock",
 [25]	"keyboard",
 [25]	"keyboard",
 [27]	"modem status",
 [27]	"modem status",
@@ -166,17 +170,22 @@ struct	Instr
 	char	*prefix;	/* instr prefix */
 	char	*prefix;	/* instr prefix */
 	char	*segment;	/* segment override */
 	char	*segment;	/* segment override */
 	uchar	jumptype;	/* set to the operand type for jump/ret/call */
 	uchar	jumptype;	/* set to the operand type for jump/ret/call */
-	char	osize;		/* 'W' or 'L' */
-	char	asize;		/* address size 'W' or 'L' */
+	uchar	amd64;
+	uchar	rex;	/* REX prefix (or zero) */
+	char	osize;		/* 'W' or 'L' (or 'Q' on amd64) */
+	char	asize;		/* address size 'W' or 'L' (or 'Q' or amd64) */
 	uchar	mod;		/* bits 6-7 of mod r/m field */
 	uchar	mod;		/* bits 6-7 of mod r/m field */
 	uchar	reg;		/* bits 3-5 of mod r/m field */
 	uchar	reg;		/* bits 3-5 of mod r/m field */
 	char	ss;		/* bits 6-7 of SIB */
 	char	ss;		/* bits 6-7 of SIB */
 	char	index;		/* bits 3-5 of SIB */
 	char	index;		/* bits 3-5 of SIB */
 	char	base;		/* bits 0-2 of SIB */
 	char	base;		/* bits 0-2 of SIB */
+	char	rip;	/* RIP-relative in amd64 mode */
+	uchar	opre;	/* f2/f3 could introduce media */
 	short	seg;		/* segment of far address */
 	short	seg;		/* segment of far address */
 	ulong	disp;		/* displacement */
 	ulong	disp;		/* displacement */
 	ulong 	imm;		/* immediate */
 	ulong 	imm;		/* immediate */
 	ulong 	imm2;		/* second immediate operand */
 	ulong 	imm2;		/* second immediate operand */
+	uvlong	imm64;	/* big immediate */
 	char	*curr;		/* fill level in output buffer */
 	char	*curr;		/* fill level in output buffer */
 	char	*end;		/* end of output buffer */
 	char	*end;		/* end of output buffer */
 	char	*err;		/* error message */
 	char	*err;		/* error message */
@@ -192,7 +201,26 @@ enum{
 	BP,
 	BP,
 	SI,
 	SI,
 	DI,
 	DI,
+
+	/* amd64 */
+	R8,
+	R9,
+	R10,
+	R11,
+	R12,
+	R13,
+	R14,
+	R15
+};
+
+	/* amd64 rex extension byte */
+enum{
+	REXW	= 1<<3,	/* =1, 64-bit operand size */
+	REXR		= 1<<2,	/* extend modrm reg */
+	REXX		= 1<<1,	/* extend sib index */
+	REXB		= 1<<0	/* extend modrm r/m, sib base, or opcode reg */
 };
 };
+	
 	/* Operand Format codes */
 	/* Operand Format codes */
 /*
 /*
 %A	-	address size register modifier (!asize -> 'E')
 %A	-	address size register modifier (!asize -> 'E')
@@ -202,7 +230,7 @@ enum{
 %O	-	Operand size register modifier (!osize -> 'E')
 %O	-	Operand size register modifier (!osize -> 'E')
 %T	-	Test register TR6/TR7
 %T	-	Test register TR6/TR7
 %S	-	size code ('W' or 'L')
 %S	-	size code ('W' or 'L')
-%X	-	Weird opcode: OSIZE == 'W' => "CBW"; else => "CWDE"
+%W	-	Weird opcode: OSIZE == 'W' => "CBW"; else => "CWDE"
 %d	-	displacement 16-32 bits
 %d	-	displacement 16-32 bits
 %e	-	effective address - Mod R/M value
 %e	-	effective address - Mod R/M value
 %f	-	floating point register F0-F7 - from Mod R/M register
 %f	-	floating point register F0-F7 - from Mod R/M register
@@ -210,7 +238,7 @@ enum{
 %i	-	immediate operand 8-32 bits
 %i	-	immediate operand 8-32 bits
 %p	-	PC-relative - signed displacement in immediate field
 %p	-	PC-relative - signed displacement in immediate field
 %r	-	Reg from Mod R/M
 %r	-	Reg from Mod R/M
-%x	-	Weird opcode: OSIZE == 'W' => "CWD"; else => "CDQ"
+%w	-	Weird opcode: OSIZE == 'W' => "CWD"; else => "CDQ"
 */
 */
 
 
 typedef struct Optable Optable;
 typedef struct Optable Optable;
@@ -227,6 +255,7 @@ enum {
 	Iw,			/* 16-bit immediate -> imm */
 	Iw,			/* 16-bit immediate -> imm */
 	Iw2,			/* 16-bit immediate -> imm2 */
 	Iw2,			/* 16-bit immediate -> imm2 */
 	Iwd,			/* Operand-sized immediate (no sign extension)*/
 	Iwd,			/* Operand-sized immediate (no sign extension)*/
+	Iwdq,		/* Operand-sized immediate, possibly 64 bits */
 	Awd,			/* Address offset */
 	Awd,			/* Address offset */
 	Iwds,			/* Operand-sized immediate (sign extended) */
 	Iwds,			/* Operand-sized immediate (sign extended) */
 	RM,			/* Word or long R/M field with register (/r) */
 	RM,			/* Word or long R/M field with register (/r) */
@@ -244,7 +273,9 @@ enum {
 	OA,			/* literal 0x0a byte */
 	OA,			/* literal 0x0a byte */
 	PTR,			/* Seg:Displacement addr (ptr16:16 or ptr16:32) */
 	PTR,			/* Seg:Displacement addr (ptr16:16 or ptr16:32) */
 	AUX,			/* Multi-byte op code - Auxiliary table */
 	AUX,			/* Multi-byte op code - Auxiliary table */
+	AUXMM,		/* multi-byte op code - auxiliary table chosen by prefix */
 	PRE,			/* Instr Prefix */
 	PRE,			/* Instr Prefix */
+	OPRE,		/* Instr Prefix or media op extension */
 	SEG,			/* Segment Prefix */
 	SEG,			/* Segment Prefix */
 	OPOVER,			/* Operand size override */
 	OPOVER,			/* Operand size override */
 	ADDOVER,		/* Address size override */
 	ADDOVER,		/* Address size override */
@@ -268,8 +299,27 @@ static Optable optab0F01[8]=
 [0x03]	0,0,		"MOVL	%e,IDTR",
 [0x03]	0,0,		"MOVL	%e,IDTR",
 [0x04]	0,0,		"MOVW	MSW,%e",	/* word */
 [0x04]	0,0,		"MOVW	MSW,%e",	/* word */
 [0x06]	0,0,		"MOVW	%e,MSW",	/* word */
 [0x06]	0,0,		"MOVW	%e,MSW",	/* word */
+[0x07]	0,0,		"INVLPG	%e",	/* TO DO: distinguish SWAPGS? */
 };
 };
 
 
+/* 0F71 */
+/* 0F72 */
+/* 0F73 */
+
+static Optable optab0FAE[8]=
+{
+[0x00]	0,0,		"FXSAVE	%e",
+[0x01]	0,0,		"FXRSTOR	%e",
+[0x02]	0,0,		"LDMXCSR	%e",
+[0x03]	0,0,		"STMXCSR	%e",
+[0x05]	0,0,		"LFENCE",
+[0x06]	0,0,		"MFENCE",
+[0x07]	0,0,		"SFENCE",
+};
+
+/* 0F18 */
+/* 0F0D */
+
 static Optable optab0FBA[8]=
 static Optable optab0FBA[8]=
 {
 {
 [0x04]	Ib,0,		"BT%S	%i,%e",
 [0x04]	Ib,0,		"BT%S	%i,%e",
@@ -278,6 +328,121 @@ static Optable optab0FBA[8]=
 [0x07]	Ib,0,		"BTC%S	%i,%e",
 [0x07]	Ib,0,		"BTC%S	%i,%e",
 };
 };
 
 
+static Optable optab0F0F[256]=
+{
+[0x0c]	0,0,	"PI2FW	%m,%M",
+[0x0d]	0,0,	"PI2L	%m,%M",
+[0x1c]	0,0,	"PF2IW	%m,%M",
+[0x1d]	0,0,	"PF2IL	%m,%M",
+[0x8a]	0,0,	"PFNACC	%m,%M",
+[0x8e]	0,0,	"PFPNACC	%m,%M",
+[0x90]	0,0,	"PFCMPGE	%m,%M",
+[0x94]	0,0,	"PFMIN	%m,%M",
+[0x96]	0,0,	"PFRCP	%m,%M",
+[0x97]	0,0,	"PFRSQRT	%m,%M",
+[0x9a]	0,0,	"PFSUB	%m,%M",
+[0x9e]	0,0,	"PFADD	%m,%M",
+[0xa0]	0,0,	"PFCMPGT	%m,%M",
+[0xa4]	0,0,	"PFMAX	%m,%M",
+[0xa6]	0,0,	"PFRCPIT1	%m,%M",
+[0xa7]	0,0,	"PFRSQIT1	%m,%M",
+[0xaa]	0,0,	"PFSUBR	%m,%M",
+[0xae]	0,0,	"PFACC	%m,%M",
+[0xb0]	0,0,	"PFCMPEQ	%m,%M",
+[0xb4]	0,0,	"PFMUL	%m,%M",
+[0xb6]	0,0,	"PFRCPI2T	%m,%M",
+[0xb7]	0,0,	"PMULHRW	%m,%M",
+[0xbb]	0,0,	"PSWAPL	%m,%M",
+};
+
+static Optable optab0FC7[8]=
+{
+[0x01]	0,0,		"CMPXCHG8B	%e",
+};
+
+static Optable optab660F71[8]=
+{
+[0x02]	Ib,0,		"PSRLW	%i,%X",
+[0x04]	Ib,0,		"PSRAW	%i,%X",
+[0x06]	Ib,0,		"PSLLW	%i,%X",
+};
+
+static Optable optab660F72[8]=
+{
+[0x02]	Ib,0,		"PSRLL	%i,%X",
+[0x04]	Ib,0,		"PSRAL	%i,%X",
+[0x06]	Ib,0,		"PSLLL	%i,%X",
+};
+
+static Optable optab660F73[8]=
+{
+[0x02]	Ib,0,		"PSRLQ	%i,%X",
+[0x03]	Ib,0,		"PSRLO	%i,%X",
+[0x06]	Ib,0,		"PSLLQ	%i,%X",
+[0x07]	Ib,0,		"PSLLO	%i,%X",
+};
+
+static Optable optab660F[256]=
+{
+[0x2B]	RM,0,		"MOVNTPD	%x,%e",
+[0x2E]	RM,0,	"UCOMISD	%x,%X",
+[0x2F]	RM,0,	"COMISD	%x,%X",
+[0x5A]	RM,0,		"CVTPD2PS	%x,%X",
+[0x5B]	RM,0,		"CVTPS2PL	%x,%X",
+[0x6A]	RM,0,		"PUNPCKHLQ %x,%X",
+[0x6B]	RM,0,		"PACKSSLW %x,%X",
+[0x6C]	RM,0,		"PUNPCKLQDQ %x,%X",
+[0x6D]	RM,0,		"PUNPCKHQDQ %x,%X",
+[0x6E]	RM,0,		"MOV%S	%e,%X",
+[0x6F]	RM,0,		"MOVO	%x,%X",	/* MOVDQA */
+[0x70]	RM,Ib,		"PSHUFL	%i,%x,%X",
+[0x71]	RMOP,0,		optab660F71,
+[0x72]	RMOP,0,		optab660F72,
+[0x73]	RMOP,0,		optab660F73,
+[0x7E]	RM,0,		"MOV%S	%X,%e",
+[0x7F]	RM,0,		"MOVO	%X,%x",
+[0xC4]	RM,Ib,		"PINSRW	%i,%e,%X",
+[0xC5]	RMR,Ib,		"PEXTRW	%i,%X,%e",
+[0xD4]	RM,0,		"PADDQ	%x,%X",
+[0xD5]	RM,0,		"PMULLW	%x,%X",
+[0xD6]	RM,0,		"MOVQ	%X,%x",
+[0xE6]	RM,0,		"CVTTPD2PL	%x,%X",
+[0xE7]	RM,0,		"MOVNTO	%X,%e",
+[0xF7]	RM,0,		"MASKMOVOU	%x,%X",
+};
+
+static Optable optabF20F[256]=
+{
+[0x10]	RM,0,	"MOVSD	%x,%X",
+[0x11]	RM,0,	"MOVSD	%X,%x",
+[0x2A]	RM,0,		"CVTS%S2SD	%e,%X",
+[0x2C]	RM,0,		"CVTTSD2S%S	%x,%r",
+[0x2D]	RM,0,		"CVTSD2S%S	%x,%r",
+[0x5A]	RM,0,		"CVTSD2SS	%x,%X",
+[0x6F]	RM,0,		"MOVOU	%x,%X",
+[0x70]	RM,Ib,		"PSHUFLW	%i,%x,%X",
+[0x7F]	RM,0,		"MOVOU	%X,%x",
+[0xD6]	RM,0,		"MOVQOZX	%M,%X",
+[0xE6]	RM,0,		"CVTPD2PL	%x,%X",
+};
+
+static Optable optabF30F[256]=
+{
+[0x10]	RM,0,	"MOVSS	%x,%X",
+[0x11]	RM,0,	"MOVSS	%X,%x",
+[0x2A]	RM,0,		"CVTS%S2SS	%e,%X",
+[0x2C]	RM,0,		"CVTTSS2S%S	%x,%r",
+[0x2D]	RM,0,		"CVTSS2S%S	%x,%r",
+[0x5A]	RM,0,		"CVTSS2SD	%x,%X",
+[0x5B]	RM,0,		"CVTTPS2PL	%x,%X",
+[0x6F]	RM,0,		"MOVOU	%x,%X",
+[0x70]	RM,Ib,		"PSHUFHW	%i,%x,%X",
+[0x7E]	RM,0,		"MOVQOZX	%x,%X",
+[0x7F]	RM,0,		"MOVOU	%X,%x",
+[0xD6]	RM,0,		"MOVQOZX	%m*,%X",
+[0xE6]	RM,0,		"CVTPL2PD	%x,%X",
+};
+
 static Optable optab0F[256]=
 static Optable optab0F[256]=
 {
 {
 [0x00]	RMOP,0,		optab0F00,
 [0x00]	RMOP,0,		optab0F00,
@@ -285,17 +450,36 @@ static Optable optab0F[256]=
 [0x02]	RM,0,		"LAR	%e,%r",
 [0x02]	RM,0,		"LAR	%e,%r",
 [0x03]	RM,0,		"LSL	%e,%r",
 [0x03]	RM,0,		"LSL	%e,%r",
 [0x06]	0,0,		"CLTS",
 [0x06]	0,0,		"CLTS",
+[0x07]	0,0,		"SYSRET",
 [0x08]	0,0,		"INVD",
 [0x08]	0,0,		"INVD",
 [0x09]	0,0,		"WBINVD",
 [0x09]	0,0,		"WBINVD",
+[0x0F]	RM,AUX,	optab0F0F,	/* 3DNow! */
+[0x10]	RM,0,	"MOVU%s	%x,%X",
+[0x11]	RM,0,	"MOVU%s	%X,%x",
+[0x12]	RM,0,	"MOV[H]L%s	%x,%X",	/* TO DO: H if source is XMM */
+[0x13]	RM,0,	"MOVL%s	%X,%e",
+[0x14]	RM,0,	"UNPCKL%s	%x,%X",
+[0x15]	RM,0,	"UNPCKH%s	%x,%X",
+[0x16]	RM,0,	"MOV[L]H%s	%x,%X",	/* TO DO: L if source is XMM */
+[0x17]	RM,0,	"MOVH%s	%X,%x",
 [0x20]	RMR,0,		"MOVL	%C,%e",
 [0x20]	RMR,0,		"MOVL	%C,%e",
 [0x21]	RMR,0,		"MOVL	%D,%e",
 [0x21]	RMR,0,		"MOVL	%D,%e",
 [0x22]	RMR,0,		"MOVL	%e,%C",
 [0x22]	RMR,0,		"MOVL	%e,%C",
 [0x23]	RMR,0,		"MOVL	%e,%D",
 [0x23]	RMR,0,		"MOVL	%e,%D",
 [0x24]	RMR,0,		"MOVL	%T,%e",
 [0x24]	RMR,0,		"MOVL	%T,%e",
 [0x26]	RMR,0,		"MOVL	%e,%T",
 [0x26]	RMR,0,		"MOVL	%e,%T",
+[0x28]	RM,0,	"MOVA%s	%x,%X",
+[0x29]	RM,0,	"MOVA%s	%X,%x",
+[0x2A]	RM,0,	"CVTPL2%s	%m*,%X",
+[0x2B]	RM,0,	"MOVNT%s	%X,%e",
+[0x2C]	RM,0,	"CVTT%s2PL	%x,%M",
+[0x2D]	RM,0,	"CVT%s2PL	%x,%M",
+[0x2E]	RM,0,	"UCOMISS	%x,%X",
+[0x2F]	RM,0,	"COMISS	%x,%X",
 [0x30]	0,0,		"WRMSR",
 [0x30]	0,0,		"WRMSR",
 [0x31]	0,0,		"RDTSC",
 [0x31]	0,0,		"RDTSC",
 [0x32]	0,0,		"RDMSR",
 [0x32]	0,0,		"RDMSR",
+[0x33]	0,0,		"RDPMC",
 [0x42]	RM,0,		"CMOVC	%e,%r",		/* CF */
 [0x42]	RM,0,		"CMOVC	%e,%r",		/* CF */
 [0x43]	RM,0,		"CMOVNC	%e,%r",		/* ¬ CF */
 [0x43]	RM,0,		"CMOVNC	%e,%r",		/* ¬ CF */
 [0x44]	RM,0,		"CMOVZ	%e,%r",		/* ZF */
 [0x44]	RM,0,		"CMOVZ	%e,%r",		/* ZF */
@@ -310,6 +494,94 @@ static Optable optab0F[256]=
 [0x4D]	RM,0,		"CMOVGE	%e,%r",		/* GE ≡ ZF ∨ SF */
 [0x4D]	RM,0,		"CMOVGE	%e,%r",		/* GE ≡ ZF ∨ SF */
 [0x4E]	RM,0,		"CMOVLE	%e,%r",		/* LE ≡ ZF ∨ LT */
 [0x4E]	RM,0,		"CMOVLE	%e,%r",		/* LE ≡ ZF ∨ LT */
 [0x4F]	RM,0,		"CMOVGT	%e,%r",		/* GT ≡ ¬ZF ∧ GE */
 [0x4F]	RM,0,		"CMOVGT	%e,%r",		/* GT ≡ ¬ZF ∧ GE */
+[0x50]	RM,0,		"MOVMSK%s	%X,%r",	/* TO DO: check */
+[0x51]	RM,0,		"SQRT%s	%x,%X",
+[0x52]	RM,0,		"RSQRT%s	%x,%X",
+[0x53]	RM,0,		"RCP%s	%x,%X",
+[0x54]	RM,0,		"AND%s	%x,%X",
+[0x55]	RM,0,		"ANDN%s	%x,%X",
+[0x56]	RM,0,		"OR%s	%x,%X",	/* TO DO: S/D */
+[0x57]	RM,0,		"XOR%s	%x,%X",	/* S/D */
+[0x58]	RM,0,		"ADD%s	%x,%X",	/* S/P S/D */
+[0x59]	RM,0,		"MUL%s	%x,%X",
+[0x5A]	RM,0,		"CVTPS2PD	%x,%X",
+[0x5B]	RM,0,		"CVTPL2PS	%x,%X",
+[0x5C]	RM,0,		"SUB%s	%x,%X",
+[0x5D]	RM,0,		"MIN%s	%x,%X",
+[0x5E]	RM,0,		"DIV%s	%x,%X",	/* TO DO: S/P S/D */
+[0x5F]	RM,0,		"MAX%s	%x,%X",
+[0x60]	RM,0,		"PUNPCKLBW %m,%M",
+[0x61]	RM,0,		"PUNPCKLWL %m,%M",
+[0x62]	RM,0,		"PUNPCKLLQ %m,%M",
+[0x63]	RM,0,		"PACKSSWB %m,%M",
+[0x64]	RM,0,		"PCMPGTB %m,%M",
+[0x65]	RM,0,		"PCMPGTW %m,%M",
+[0x66]	RM,0,		"PCMPGTL %m,%M",
+[0x67]	RM,0,		"PACKUSWB %m,%M",
+[0x68]	RM,0,		"PUNPCKHBW %m,%M",
+[0x69]	RM,0,		"PUNPCKHWL %m,%M",
+[0x6A]	RM,0,		"PUNPCKHLQ %m,%M",
+[0x6B]	RM,0,		"PACKSSLW %m,%M",
+[0x6E]	RM,0,		"MOV%S %e,%M",
+[0x6F]	RM,0,		"MOVQ %m,%M",
+[0x70]	RM,Ib,		"PSHUFW	%i,%m,%M",
+[0x74]	RM,0,		"PCMPEQB %m,%M",
+[0x75]	RM,0,		"PCMPEQW %m,%M",
+[0x76]	RM,0,		"PCMPEQL %m,%M",
+[0x7E]	RM,0,		"MOV%S %M,%e",
+[0x7F]	RM,0,		"MOVQ %M,%m",
+[0xAE]	RMOP,0,		optab0FAE,
+[0xAA]	0,0,			"RSM",
+[0xB0]	RM,0,		"CMPXCHGB	%r,%e",
+[0xB1]	RM,0,		"CMPXCHG%S	%r,%e",
+[0xC0]	RMB,0,		"XADDB	%r,%e",
+[0xC1]	RM,0,		"XADD%S	%r,%e",
+[0xC2]	RM,Ib,		"CMP%s	%i,%x,%X",
+[0xC3]	RM,0,		"MOVNTI%S	%r,%e",
+[0xC6]	RM,Ib,		"SHUF%s	%i,%x,%X",
+[0xD1]	RM,0,		"PSRLW %m,%M",
+[0xD2]	RM,0,		"PSRLL %m,%M",
+[0xD3]	RM,0,		"PSRLQ %m,%M",
+[0xD5]	RM,0,		"PMULLW %m,%M",
+[0xD6]	RM,0,		"MOVQOZX	%m*,%X",
+[0xD7]	RM,0,		"PMOVMSKB %m,%r",
+[0xD8]	RM,0,		"PSUBUSB %m,%M",
+[0xD9]	RM,0,		"PSUBUSW %m,%M",
+[0xDA]	RM,0,		"PMINUB %m,%M",
+[0xDB]	RM,0,		"PAND %m,%M",
+[0xDC]	RM,0,		"PADDUSB %m,%M",
+[0xDD]	RM,0,		"PADDUSW %m,%M",
+[0xDE]	RM,0,		"PMAXUB %m,%M",
+[0xDF]	RM,0,		"PANDN %m,%M",
+[0xE0]	RM,0,		"PAVGB %m,%M",
+[0xE1]	RM,0,		"PSRAW %m,%M",
+[0xE2]	RM,0,		"PSRAL %m,%M",
+[0xE3]	RM,0,		"PAVGW %m,%M",
+[0xE4]	RM,0,		"PMULHUW %m,%M",
+[0xE5]	RM,0,		"PMULHW %m,%M",
+[0xE7]	RM,0,		"MOVNTQ	%M,%e",
+[0xE8]	RM,0,		"PSUBSB %m,%M",
+[0xE9]	RM,0,		"PSUBSW %m,%M",
+[0xEA]	RM,0,		"PMINSW %m,%M",
+[0xEB]	RM,0,		"POR %m,%M",
+[0xEC]	RM,0,		"PADDSB %m,%M",
+[0xED]	RM,0,		"PADDSW %m,%M",
+[0xEE]	RM,0,		"PMAXSW %m,%M",
+[0xEF]	RM,0,		"PXOR %m,%M",
+[0xF1]	RM,0,		"PSLLW %m,%M",
+[0xF2]	RM,0,		"PSLLL %m,%M",
+[0xF3]	RM,0,		"PSLLQ %m,%M",
+[0xF4]	RM,0,		"PMULULQ	%m,%M",
+[0xF5]	RM,0,		"PMADDWL %m,%M",
+[0xF6]	RM,0,		"PSADBW %m,%M",
+[0xF7]	RMR,0,		"MASKMOVQ	%m,%M",
+[0xF8]	RM,0,		"PSUBB %m,%M",
+[0xF9]	RM,0,		"PSUBW %m,%M",
+[0xFA]	RM,0,		"PSUBL %m,%M",
+[0xFC]	RM,0,		"PADDB %m,%M",
+[0xFD]	RM,0,		"PADDW %m,%M",
+[0xFE]	RM,0,		"PADDL %m,%M",
+
 [0x80]	Iwds,0,		"JOS	%p",
 [0x80]	Iwds,0,		"JOS	%p",
 [0x81]	Iwds,0,		"JOC	%p",
 [0x81]	Iwds,0,		"JOC	%p",
 [0x82]	Iwds,0,		"JCS	%p",
 [0x82]	Iwds,0,		"JCS	%p",
@@ -366,6 +638,7 @@ static Optable optab0F[256]=
 [0xbd]	RM,0,		"BSR%S	%e,%r",
 [0xbd]	RM,0,		"BSR%S	%e,%r",
 [0xbe]	RMB,0,		"MOVBSX	%e,%R",
 [0xbe]	RMB,0,		"MOVBSX	%e,%R",
 [0xbf]	RM,0,		"MOVWSX	%e,%R",
 [0xbf]	RM,0,		"MOVWSX	%e,%R",
+[0xc7]	RMOP,0,		optab0FC7,
 };
 };
 
 
 static Optable optab80[8]=
 static Optable optab80[8]=
@@ -679,7 +952,7 @@ static Optable optabFF[8] =
 [0x06]	0,0,		"PUSHL	%e",
 [0x06]	0,0,		"PUSHL	%e",
 };
 };
 
 
-static Optable optable[256] =
+static Optable optable[256+1] =
 {
 {
 [0x00]	RMB,0,		"ADDB	%r,%e",
 [0x00]	RMB,0,		"ADDB	%r,%e",
 [0x01]	RM,0,		"ADD%S	%r,%e",
 [0x01]	RM,0,		"ADD%S	%r,%e",
@@ -696,7 +969,7 @@ static Optable optable[256] =
 [0x0c]	Ib,0,		"ORB	%i,AL",
 [0x0c]	Ib,0,		"ORB	%i,AL",
 [0x0d]	Iwd,0,		"OR%S	%i,%OAX",
 [0x0d]	Iwd,0,		"OR%S	%i,%OAX",
 [0x0e]	0,0,		"PUSHL	CS",
 [0x0e]	0,0,		"PUSHL	CS",
-[0x0f]	AUX,0,		optab0F,
+[0x0f]	AUXMM,0,		optab0F,
 [0x10]	RMB,0,		"ADCB	%r,%e",
 [0x10]	RMB,0,		"ADCB	%r,%e",
 [0x11]	RM,0,		"ADC%S	%r,%e",
 [0x11]	RM,0,		"ADC%S	%r,%e",
 [0x12]	RMB,0,		"ADCB	%e,%r",
 [0x12]	RMB,0,		"ADCB	%e,%r",
@@ -832,8 +1105,8 @@ static Optable optable[256] =
 [0x95]	0,0,		"XCHG	%OBP,%OAX",
 [0x95]	0,0,		"XCHG	%OBP,%OAX",
 [0x96]	0,0,		"XCHG	%OSI,%OAX",
 [0x96]	0,0,		"XCHG	%OSI,%OAX",
 [0x97]	0,0,		"XCHG	%ODI,%OAX",
 [0x97]	0,0,		"XCHG	%ODI,%OAX",
-[0x98]	0,0,		"%X",			/* miserable CBW or CWDE */
-[0x99]	0,0,		"%x",			/* idiotic CWD or CDQ */
+[0x98]	0,0,		"%W",			/* miserable CBW or CWDE */
+[0x99]	0,0,		"%w",			/* idiotic CWD or CDQ */
 [0x9a]	PTR,0,		"CALL%S	%d",
 [0x9a]	PTR,0,		"CALL%S	%d",
 [0x9b]	0,0,		"WAIT",
 [0x9b]	0,0,		"WAIT",
 [0x9c]	0,0,		"PUSHF",
 [0x9c]	0,0,		"PUSHF",
@@ -864,14 +1137,14 @@ static Optable optable[256] =
 [0xb5]	Ib,0,		"MOVB	%i,CH",
 [0xb5]	Ib,0,		"MOVB	%i,CH",
 [0xb6]	Ib,0,		"MOVB	%i,DH",
 [0xb6]	Ib,0,		"MOVB	%i,DH",
 [0xb7]	Ib,0,		"MOVB	%i,BH",
 [0xb7]	Ib,0,		"MOVB	%i,BH",
-[0xb8]	Iwd,0,		"MOV%S	%i,%OAX",
-[0xb9]	Iwd,0,		"MOV%S	%i,%OCX",
-[0xba]	Iwd,0,		"MOV%S	%i,%ODX",
-[0xbb]	Iwd,0,		"MOV%S	%i,%OBX",
-[0xbc]	Iwd,0,		"MOV%S	%i,%OSP",
-[0xbd]	Iwd,0,		"MOV%S	%i,%OBP",
-[0xbe]	Iwd,0,		"MOV%S	%i,%OSI",
-[0xbf]	Iwd,0,		"MOV%S	%i,%ODI",
+[0xb8]	Iwdq,0,		"MOV%S	%i,%OAX",
+[0xb9]	Iwdq,0,		"MOV%S	%i,%OCX",
+[0xba]	Iwdq,0,		"MOV%S	%i,%ODX",
+[0xbb]	Iwdq,0,		"MOV%S	%i,%OBX",
+[0xbc]	Iwdq,0,		"MOV%S	%i,%OSP",
+[0xbd]	Iwdq,0,		"MOV%S	%i,%OBP",
+[0xbe]	Iwdq,0,		"MOV%S	%i,%OSI",
+[0xbf]	Iwdq,0,		"MOV%S	%i,%ODI",
 [0xc0]	RMOPB,0,	optabC0,
 [0xc0]	RMOPB,0,	optabC0,
 [0xc1]	RMOP,0,		optabC1,
 [0xc1]	RMOP,0,		optabC1,
 [0xc2]	Iw,0,		"RET	%i",
 [0xc2]	Iw,0,		"RET	%i",
@@ -920,8 +1193,8 @@ static Optable optable[256] =
 [0xee]	0,0,		"OUTB	AL,DX",
 [0xee]	0,0,		"OUTB	AL,DX",
 [0xef]	0,0,		"OUT%S	%OAX,DX",
 [0xef]	0,0,		"OUT%S	%OAX,DX",
 [0xf0]	PRE,0,		"LOCK",
 [0xf0]	PRE,0,		"LOCK",
-[0xf2]	PRE,0,		"REPNE",
-[0xf3]	PRE,0,		"REP",
+[0xf2]	OPRE,0,		"REPNE",
+[0xf3]	OPRE,0,		"REP",
 [0xf4]	0,0,		"HALT",
 [0xf4]	0,0,		"HALT",
 [0xf5]	0,0,		"CMC",
 [0xf5]	0,0,		"CMC",
 [0xf6]	RMOPB,0,	optabF6,
 [0xf6]	RMOPB,0,	optabF6,
@@ -934,6 +1207,7 @@ static Optable optable[256] =
 [0xfd]	0,0,		"STD",
 [0xfd]	0,0,		"STD",
 [0xfe]	RMOPB,0,	optabFE,
 [0xfe]	RMOPB,0,	optabFE,
 [0xff]	RMOP,0,		optabFF,
 [0xff]	RMOP,0,		optabFF,
+[0x100]	RM,0,		"MOVLQSX	%r,%e",
 };
 };
 
 
 /*
 /*
@@ -992,8 +1266,27 @@ igetl(Map *map, Instr *ip, ulong *lp)
 	return 1;
 	return 1;
 }
 }
 
 
+/*
+ *  get 8 bytes of the instruction
+ */
+static int
+igetq(Map *map, Instr *ip, vlong *qp)
+{
+	ulong	l;
+	uvlong q;
+
+	if (igetl(map, ip, &l) < 0)
+		return -1;
+	q = l;
+	if (igetl(map, ip, &l) < 0)
+		return -1;
+	q |= ((uvlong)l<<32);
+	*qp = q;
+	return 1;
+}
+
 static int
 static int
-getdisp(Map *map, Instr *ip, int mod, int rm, int code)
+getdisp(Map *map, Instr *ip, int mod, int rm, int code, int pcrel)
 {
 {
 	uchar c;
 	uchar c;
 	ushort s;
 	ushort s;
@@ -1011,6 +1304,8 @@ getdisp(Map *map, Instr *ip, int mod, int rm, int code)
 		if (ip->asize == 'E') {
 		if (ip->asize == 'E') {
 			if (igetl(map, ip, &ip->disp) < 0)
 			if (igetl(map, ip, &ip->disp) < 0)
 				return -1;
 				return -1;
+			if (mod == 0)
+				ip->rip = pcrel;
 		} else {
 		} else {
 			if (igets(map, ip, &s) < 0)
 			if (igets(map, ip, &s) < 0)
 				return -1;
 				return -1;
@@ -1035,11 +1330,11 @@ modrm(Map *map, Instr *ip, uchar c)
 	ip->mod = mod;
 	ip->mod = mod;
 	ip->base = rm;
 	ip->base = rm;
 	ip->reg = (c>>3)&7;
 	ip->reg = (c>>3)&7;
+	ip->rip = 0;
 	if (mod == 3)			/* register */
 	if (mod == 3)			/* register */
 		return 1;
 		return 1;
 	if (ip->asize == 0) {		/* 16-bit mode */
 	if (ip->asize == 0) {		/* 16-bit mode */
-		switch(rm)
-		{
+		switch(rm) {
 		case 0:
 		case 0:
 			ip->base = BX; ip->index = SI;
 			ip->base = BX; ip->index = SI;
 			break;
 			break;
@@ -1067,7 +1362,7 @@ modrm(Map *map, Instr *ip, uchar c)
 		default:
 		default:
 			break;
 			break;
 		}
 		}
-		return getdisp(map, ip, mod, rm, 6);
+		return getdisp(map, ip, mod, rm, 6, 0);
 	}
 	}
 	if (rm == 4) {	/* scummy sib byte */
 	if (rm == 4) {	/* scummy sib byte */
 		if (igetc(map, ip, &c) < 0)
 		if (igetc(map, ip, &c) < 0)
@@ -1077,21 +1372,22 @@ modrm(Map *map, Instr *ip, uchar c)
 		if (ip->index == 4)
 		if (ip->index == 4)
 			ip->index = -1;
 			ip->index = -1;
 		ip->base = c&0x07;
 		ip->base = c&0x07;
-		return getdisp(map, ip, mod, ip->base, 5);
+		return getdisp(map, ip, mod, ip->base, 5, 0);
 	}
 	}
-	return getdisp(map, ip, mod, rm, 5);
+	return getdisp(map, ip, mod, rm, 5, ip->amd64);
 }
 }
 
 
 static Optable *
 static Optable *
 mkinstr(Map *map, Instr *ip, ulong pc)
 mkinstr(Map *map, Instr *ip, ulong pc)
 {
 {
-	int i, n;
+	int i, n, norex;
 	uchar c;
 	uchar c;
 	ushort s;
 	ushort s;
 	Optable *op, *obase;
 	Optable *op, *obase;
 	char buf[128];
 	char buf[128];
 
 
 	memset(ip, 0, sizeof(*ip));
 	memset(ip, 0, sizeof(*ip));
+	norex = 1;
 	ip->base = -1;
 	ip->base = -1;
 	ip->index = -1;
 	ip->index = -1;
 	if(asstype == AI8086)
 	if(asstype == AI8086)
@@ -1099,13 +1395,27 @@ mkinstr(Map *map, Instr *ip, ulong pc)
 	else {
 	else {
 		ip->osize = 'L';
 		ip->osize = 'L';
 		ip->asize = 'E';
 		ip->asize = 'E';
+		ip->amd64 = asstype != AI386;
+		norex = 0;
 	}
 	}
 	ip->addr = pc;
 	ip->addr = pc;
 	if (igetc(map, ip, &c) < 0)
 	if (igetc(map, ip, &c) < 0)
 		return 0;
 		return 0;
 	obase = optable;
 	obase = optable;
 newop:
 newop:
+	if(ip->amd64 && !norex){
+		if(c >= 0x40 && c <= 0x4f) {
+			ip->rex = c;
+			if(igetc(map, ip, &c) < 0)
+				return 0;
+		}
+		if(c == 0x63){
+			op = &obase[0x100];	/* MOVLQSX */
+			goto hack;
+		}
+	}
 	op = &obase[c];
 	op = &obase[c];
+hack:
 	if (op->proto == 0) {
 	if (op->proto == 0) {
 badop:
 badop:
 		n = snprint(buf, sizeof(buf), "opcode: ??");
 		n = snprint(buf, sizeof(buf), "opcode: ??");
@@ -1116,8 +1426,7 @@ badop:
 		return 0;
 		return 0;
 	}
 	}
 	for(i = 0; i < 2 && op->operand[i]; i++) {
 	for(i = 0; i < 2 && op->operand[i]; i++) {
-		switch(op->operand[i])
-		{
+		switch(op->operand[i]) {
 		case Ib:	/* 8-bit immediate - (no sign extension)*/
 		case Ib:	/* 8-bit immediate - (no sign extension)*/
 			if (igetc(map, ip, &c) < 0)
 			if (igetc(map, ip, &c) < 0)
 				return 0;
 				return 0;
@@ -1154,10 +1463,31 @@ badop:
 				return 0;
 				return 0;
 			ip->imm2 = s&0xffff;
 			ip->imm2 = s&0xffff;
 			break;
 			break;
-		case Iwd:	/* Operand-sized immediate (no sign extension)*/
+		case Iwd:	/* Operand-sized immediate (no sign extension unless 64 bits)*/
+			if (ip->osize == 'L') {
+				if (igetl(map, ip, &ip->imm) < 0)
+					return 0;
+				ip->imm64 = ip->imm;
+				if(ip->rex&REXW && (ip->imm & (1<<31)) != 0)
+					ip->imm64 |= (vlong)~0 << 32;
+			} else {
+				if (igets(map, ip, &s)< 0)
+					return 0;
+				ip->imm = s&0xffff;
+				ip->imm64 = ip->imm;
+			}
+			break;
+		case Iwdq:	/* Operand-sized immediate, possibly big */
 			if (ip->osize == 'L') {
 			if (ip->osize == 'L') {
 				if (igetl(map, ip, &ip->imm) < 0)
 				if (igetl(map, ip, &ip->imm) < 0)
 					return 0;
 					return 0;
+				ip->imm64 = ip->imm;
+				if (ip->rex & REXW) {
+					ulong l;
+					if (igetl(map, ip, &l) < 0)
+						return 0;
+					ip->imm64 |= (uvlong)l << 32;
+				}
 			} else {
 			} else {
 				if (igets(map, ip, &s)< 0)
 				if (igets(map, ip, &s)< 0)
 					return 0;
 					return 0;
@@ -1168,6 +1498,7 @@ badop:
 			if (ip->asize == 'E') {
 			if (ip->asize == 'E') {
 				if (igetl(map, ip, &ip->imm) < 0)
 				if (igetl(map, ip, &ip->imm) < 0)
 					return 0;
 					return 0;
+				/* TO DO: REX */
 			} else {
 			} else {
 				if (igets(map, ip, &s)< 0)
 				if (igets(map, ip, &s)< 0)
 					return 0;
 					return 0;
@@ -1287,15 +1618,35 @@ badop:
 				return 0;
 				return 0;
 			ip->jumptype = PTR;
 			ip->jumptype = PTR;
 			break;
 			break;
+		case AUXMM:	/* Multi-byte op code; prefix determines table selection */
+			if (igetc(map, ip, &c) < 0)
+				return 0;
+			obase = (Optable*)op->proto;
+			switch (ip->opre) {
+			case 0x66:	op = optab660F; break;
+			case 0xF2:	op = optabF20F; break;
+			case 0xF3:	op = optabF30F; break;
+			default:	op = nil; break;
+			}
+			if(op != nil && op[c].proto != nil)
+				obase = op;
+			norex = 1;	/* no more rex prefixes */
+			/* otherwise the optab entry captures it */
+			goto newop;
 		case AUX:	/* Multi-byte op code - Auxiliary table */
 		case AUX:	/* Multi-byte op code - Auxiliary table */
 			obase = (Optable*)op->proto;
 			obase = (Optable*)op->proto;
 			if (igetc(map, ip, &c) < 0)
 			if (igetc(map, ip, &c) < 0)
 				return 0;
 				return 0;
 			goto newop;
 			goto newop;
+		case OPRE:	/* Instr Prefix or media op */
+			ip->opre = c;
+			/* fall through */
 		case PRE:	/* Instr Prefix */
 		case PRE:	/* Instr Prefix */
 			ip->prefix = (char*)op->proto;
 			ip->prefix = (char*)op->proto;
 			if (igetc(map, ip, &c) < 0)
 			if (igetc(map, ip, &c) < 0)
 				return 0;
 				return 0;
+			if (ip->opre && c == 0x0F)
+				ip->prefix = 0;
 			goto newop;
 			goto newop;
 		case SEG:	/* Segment Prefix */
 		case SEG:	/* Segment Prefix */
 			ip->segment = (char*)op->proto;
 			ip->segment = (char*)op->proto;
@@ -1303,9 +1654,14 @@ badop:
 				return 0;
 				return 0;
 			goto newop;
 			goto newop;
 		case OPOVER:	/* Operand size override */
 		case OPOVER:	/* Operand size override */
+			ip->opre = c;
 			ip->osize = 'W';
 			ip->osize = 'W';
 			if (igetc(map, ip, &c) < 0)
 			if (igetc(map, ip, &c) < 0)
 				return 0;
 				return 0;
+			if (c == 0x0F)
+				ip->osize = 'L';
+			else if (ip->amd64 && (c&0xF0) == 0x40)
+				ip->osize = 'Q';
 			goto newop;
 			goto newop;
 		case ADDOVER:	/* Address size override */
 		case ADDOVER:	/* Address size override */
 			ip->asize = 0;
 			ip->asize = 0;
@@ -1353,9 +1709,21 @@ static char *reg[] =  {
 [BP]	"BP",
 [BP]	"BP",
 [SI]	"SI",
 [SI]	"SI",
 [DI]	"DI",
 [DI]	"DI",
+
+	/* amd64 */
+[R8]	"R8",
+[R9]	"R9",
+[R10]	"R10",
+[R11]	"R11",
+[R12]	"R12",
+[R13]	"R13",
+[R14]	"R14",
+[R15]	"R15",
 };
 };
 
 
 static char *breg[] = { "AL", "CL", "DL", "BL", "AH", "CH", "DH", "BH" };
 static char *breg[] = { "AL", "CL", "DL", "BL", "AH", "CH", "DH", "BH" };
+static char *breg64[] = { "AL", "CL", "DL", "BL", "SPB", "BPB", "SIB", "DIB",
+	"R8B", "R9B", "R10B", "R11B", "R12B", "R13B", "R14B", "R15B" };
 static char *sreg[] = { "ES", "CS", "SS", "DS", "FS", "GS" };
 static char *sreg[] = { "ES", "CS", "SS", "DS", "FS", "GS" };
 
 
 static void
 static void
@@ -1446,12 +1814,12 @@ issymref(Instr *ip, Symbol *s, long w, long val)
 }
 }
 
 
 static void
 static void
-immediate(Instr *ip, long val)
+immediate(Instr *ip, vlong val)
 {
 {
 	Symbol s;
 	Symbol s;
 	long w;
 	long w;
 
 
-	if (findsym(val, CANY, &s)) {
+	if (findsym((long)val, CANY, &s)) {	/* TO DO */
 		w = val - s.value;
 		w = val - s.value;
 		if (w < 0)
 		if (w < 0)
 			w = -w;
 			w = -w;
@@ -1474,7 +1842,10 @@ immediate(Instr *ip, long val)
 		}
 		}
 */
 */
 	}
 	}
-	bprint(ip, "%lux", val);
+	if((ip->rex & REXW) == 0)
+		bprint(ip, "%lux", (long)val);
+	else
+		bprint(ip, "%llux", val);
 }
 }
 
 
 static void
 static void
@@ -1482,7 +1853,9 @@ pea(Instr *ip)
 {
 {
 	if (ip->mod == 3) {
 	if (ip->mod == 3) {
 		if (ip->osize == 'B')
 		if (ip->osize == 'B')
-			bprint(ip, breg[ip->base]);
+			bprint(ip, (ip->rex & REXB? breg64: breg)[ip->base]);
+		else if(ip->rex & REXB)
+			bprint(ip, "%s%s", ANAME(ip), reg[ip->base+8]);
 		else
 		else
 			bprint(ip, "%s%s", ANAME(ip), reg[ip->base]);
 			bprint(ip, "%s%s", ANAME(ip), reg[ip->base]);
 		return;
 		return;
@@ -1496,23 +1869,26 @@ pea(Instr *ip)
 			immediate(ip, ip->disp);
 			immediate(ip, ip->disp);
 		else {
 		else {
 			bprint(ip, "%lux", ip->disp);
 			bprint(ip, "%lux", ip->disp);
-			bprint(ip,"(%s%s)", ANAME(ip), reg[ip->base]);
+			bprint(ip,"(%s%s)", ANAME(ip), reg[ip->rex&REXB? ip->base+8: ip->base]);
 		}
 		}
 	}
 	}
 	if (ip->index >= 0)
 	if (ip->index >= 0)
-		bprint(ip,"(%s%s*%d)", ANAME(ip), reg[ip->index], 1<<ip->ss);
+		bprint(ip,"(%s%s*%d)", ANAME(ip), reg[ip->rex&REXX? ip->index+8: ip->index], 1<<ip->ss);
 }
 }
 
 
 static void
 static void
 prinstr(Instr *ip, char *fmt)
 prinstr(Instr *ip, char *fmt)
 {
 {
+	vlong v;
+
 	if (ip->prefix)
 	if (ip->prefix)
 		bprint(ip, "%s ", ip->prefix);
 		bprint(ip, "%s ", ip->prefix);
 	for (; *fmt && ip->curr < ip->end; fmt++) {
 	for (; *fmt && ip->curr < ip->end; fmt++) {
-		if (*fmt != '%')
+		if (*fmt != '%'){
 			*ip->curr++ = *fmt;
 			*ip->curr++ = *fmt;
-		else switch(*++fmt)
-		{
+			continue;
+		}
+		switch(*++fmt){
 		case '%':
 		case '%':
 			*ip->curr++ = '%';
 			*ip->curr++ = '%';
 			break;
 			break;
@@ -1537,13 +1913,29 @@ prinstr(Instr *ip, char *fmt)
 			break;
 			break;
 		case 'i':
 		case 'i':
 			bprint(ip, "$");
 			bprint(ip, "$");
-			immediate(ip,ip->imm);
+			v = ip->imm;
+			if(ip->rex & REXW)
+				v = ip->imm64;
+			immediate(ip, v);
 			break;
 			break;
 		case 'R':
 		case 'R':
-			bprint(ip, "%s%s", ONAME(ip), reg[ip->reg]);
+			bprint(ip, "%s%s", ONAME(ip), reg[ip->rex&REXR? ip->reg+8: ip->reg]);
 			break;
 			break;
 		case 'S':
 		case 'S':
-			bprint(ip, "%c", ip->osize);
+			if(ip->osize == 'Q' || ip->osize == 'L' && ip->rex & REXW)
+				bprint(ip, "Q");
+			else
+				bprint(ip, "%c", ip->osize);
+			break;
+		case 's':
+			if(ip->opre == 0 || ip->opre == 0x66)
+				bprint(ip, "P");
+			else
+				bprint(ip, "S");
+			if(ip->opre == 0xf2 || ip->opre == 0x66)
+				bprint(ip, "D");
+			else
+				bprint(ip, "S");
 			break;
 			break;
 		case 'T':
 		case 'T':
 			if (ip->reg == 6 || ip->reg == 7)
 			if (ip->reg == 6 || ip->reg == 7)
@@ -1551,8 +1943,10 @@ prinstr(Instr *ip, char *fmt)
 			else
 			else
 				bprint(ip, "???");
 				bprint(ip, "???");
 			break;
 			break;
-		case 'X':
-			if (ip->osize == 'L')
+		case 'W':
+			if (ip->osize == 'Q' || ip->osize == 'L' && ip->rex & REXW)
+				bprint(ip, "CDQE");
+			else if (ip->osize == 'L')
 				bprint(ip,"CWDE");
 				bprint(ip,"CWDE");
 			else
 			else
 				bprint(ip, "CBW");
 				bprint(ip, "CBW");
@@ -1560,6 +1954,20 @@ prinstr(Instr *ip, char *fmt)
 		case 'd':
 		case 'd':
 			bprint(ip,"%lux:%lux",ip->seg,ip->disp);
 			bprint(ip,"%lux:%lux",ip->seg,ip->disp);
 			break;
 			break;
+		case 'm':
+			if (ip->mod == 3 && ip->osize != 'B') {
+				if(fmt[1] != '*'){
+					if(ip->opre != 0) {
+						bprint(ip, "X%d", ip->rex&REXB? ip->base+8: ip->base);
+						break;
+					}
+				} else
+					fmt++;
+				bprint(ip, "M%d", ip->base);
+				break;
+			}
+			pea(ip);
+			break;
 		case 'e':
 		case 'e':
 			pea(ip);
 			pea(ip);
 			break;
 			break;
@@ -1577,16 +1985,34 @@ prinstr(Instr *ip, char *fmt)
 			break;
 			break;
 		case 'r':
 		case 'r':
 			if (ip->osize == 'B')
 			if (ip->osize == 'B')
-				bprint(ip,"%s",breg[ip->reg]);
+				bprint(ip,"%s", (ip->rex? breg64: breg)[ip->rex&REXR? ip->reg+8: ip->reg]);
 			else
 			else
-				bprint(ip, reg[ip->reg]);
+				bprint(ip, reg[ip->rex&REXR? ip->reg+8: ip->reg]);
 			break;
 			break;
-		case 'x':
-			if (ip->osize == 'L')
+		case 'w':
+			if (ip->osize == 'Q' || ip->rex & REXW)
+				bprint(ip, "CQO");
+			else if (ip->osize == 'L')
 				bprint(ip,"CDQ");
 				bprint(ip,"CDQ");
 			else
 			else
 				bprint(ip, "CWD");
 				bprint(ip, "CWD");
 			break;
 			break;
+		case 'M':
+			if(ip->opre != 0)
+				bprint(ip, "X%d", ip->rex&REXR? ip->reg+8: ip->reg);
+			else
+				bprint(ip, "M%d", ip->reg);
+			break;
+		case 'x':
+			if (ip->mod == 3 && ip->osize != 'B') {
+				bprint(ip, "X%d", ip->rex&REXB? ip->base+8: ip->base);
+				break;
+			}
+			pea(ip);
+			break;
+		case 'X':
+			bprint(ip, "X%d", ip->rex&REXR? ip->reg+8: ip->reg);
+			break;
 		default:
 		default:
 			bprint(ip, "%%%c", *fmt);
 			bprint(ip, "%%%c", *fmt);
 			break;
 			break;
@@ -1678,18 +2104,18 @@ i386foll(Map *map, ulong pc, Rgetter rget, ulong *foll)
 	case JUMP:		/* JUMP or CALL EA */
 	case JUMP:		/* JUMP or CALL EA */
 
 
 		if(i.mod == 3) {
 		if(i.mod == 3) {
-			foll[0] = (*rget)(map, reg[i.base]);
+			foll[0] = (*rget)(map, reg[i.rex&REXB? i.base+8: i.base]);
 			return 1;
 			return 1;
 		}
 		}
 			/* calculate the effective address */
 			/* calculate the effective address */
 		addr = i.disp;
 		addr = i.disp;
 		if (i.base >= 0) {
 		if (i.base >= 0) {
-			if (get4(map, (*rget)(map, reg[i.base]), (long*)&l) < 0)
+			if (get4(map, (*rget)(map, reg[i.rex&REXB? i.base+8: i.base]), (long*)&l) < 0)
 				return -1;
 				return -1;
 			addr += l;
 			addr += l;
 		}
 		}
 		if (i.index >= 0) {
 		if (i.index >= 0) {
-			if (get4(map, (*rget)(map, reg[i.index]), (long*)&l) < 0)
+			if (get4(map, (*rget)(map, reg[i.rex&REXX? i.index+8: i.index]), (long*)&l) < 0)
 				return -1;
 				return -1;
 			addr += l*(1<<i.ss);
 			addr += l*(1<<i.ss);
 		}
 		}

+ 2 - 0
sys/src/libmach/elf.h

@@ -80,6 +80,8 @@ enum {
 	MIPS = 8,		/* Mips R2000 */
 	MIPS = 8,		/* Mips R2000 */
 	S370 = 9,		/* Amdhal	*/
 	S370 = 9,		/* Amdhal	*/
 	POWER = 20,		/* PowerPC */
 	POWER = 20,		/* PowerPC */
+	SPARC64 = 18,		/* Sun SPARC v9 */
+	AMD64 = 62,		/* Amd64 */
 
 
 	NO_VERSION = 0,		/* version, ident[VERSION] */
 	NO_VERSION = 0,		/* version, ident[VERSION] */
 	CURRENT = 1,
 	CURRENT = 1,

+ 53 - 4
sys/src/libmach/executable.c

@@ -57,8 +57,10 @@ extern	Mach	mmips;
 extern	Mach	mmips2le;
 extern	Mach	mmips2le;
 extern	Mach	mmips2be;
 extern	Mach	mmips2be;
 extern	Mach	msparc;
 extern	Mach	msparc;
+extern	Mach	msparc64;
 extern	Mach	m68020;
 extern	Mach	m68020;
 extern	Mach	mi386;
 extern	Mach	mi386;
+extern	Mach	mamd64;
 extern	Mach	marm;
 extern	Mach	marm;
 extern	Mach	mpower;
 extern	Mach	mpower;
 extern	Mach	malpha;
 extern	Mach	malpha;
@@ -121,6 +123,14 @@ ExecTable exectab[] =
 		sizeof(struct sparcexec),
 		sizeof(struct sparcexec),
 		beswal,
 		beswal,
 		sparcboot },
 		sparcboot },
+	{ U_MAGIC,			/* Sparc64 u.out */
+		"sparc64 plan 9 executable",
+		"sparc64 plan 9 dlm",
+		FSPARC64,
+		&msparc64,
+		sizeof(Exec),
+		beswal,
+		adotout },
 	{ A_MAGIC,			/* 68020 2.out & boot image */
 	{ A_MAGIC,			/* 68020 2.out & boot image */
 		"68020 plan 9 executable",
 		"68020 plan 9 executable",
 		"68020 plan 9 dlm",
 		"68020 plan 9 dlm",
@@ -145,6 +155,14 @@ ExecTable exectab[] =
 		sizeof(Exec),
 		sizeof(Exec),
 		beswal,
 		beswal,
 		common },
 		common },
+	{ S_MAGIC,			/* amd64 6.out & boot image */
+		"amd64 plan 9 executable",
+		"amd64 plan 9 dlm",
+		FAMD64,
+		&mamd64,
+		sizeof(Exec),
+		beswal,
+		common },
 	{ Q_MAGIC,			/* PowerPC q.out & boot image */
 	{ Q_MAGIC,			/* PowerPC q.out & boot image */
 		"power plan 9 executable",
 		"power plan 9 executable",
 		"power plan 9 dlm",
 		"power plan 9 dlm",
@@ -154,7 +172,7 @@ ExecTable exectab[] =
 		beswal,
 		beswal,
 		common },
 		common },
 	{ ELF_MAG,			/* any elf32 */
 	{ ELF_MAG,			/* any elf32 */
-		"Elf executable",
+		"elf executable",
 		nil,
 		nil,
 		FNONE,
 		FNONE,
 		&mi386,
 		&mi386,
@@ -162,15 +180,15 @@ ExecTable exectab[] =
 		noswal,
 		noswal,
 		elfdotout },
 		elfdotout },
 	{ E_MAGIC,			/* Arm 5.out */
 	{ E_MAGIC,			/* Arm 5.out */
-		"Arm plan 9 executable",
-		"Arm plan 9 dlm",
+		"arm plan 9 executable",
+		"arm plan 9 dlm",
 		FARM,
 		FARM,
 		&marm,
 		&marm,
 		sizeof(Exec),
 		sizeof(Exec),
 		beswal,
 		beswal,
 		common },
 		common },
 	{ (143<<16)|0413,		/* (Free|Net)BSD Arm */
 	{ (143<<16)|0413,		/* (Free|Net)BSD Arm */
-		"Arm *BSD executable",
+		"arm *bsd executable",
 		nil,
 		nil,
 		FARM,
 		FARM,
 		&marm,
 		&marm,
@@ -506,10 +524,18 @@ elfdotout(int fd, Fhdr *fp, ExecHdr *hp)
 		mach = &mmips;
 		mach = &mmips;
 		fp->type = FMIPS;
 		fp->type = FMIPS;
 		break;
 		break;
+	case SPARC64:
+		mach = &msparc64;
+		fp->type = FSPARC64;
+		break;
 	case POWER:
 	case POWER:
 		mach = &mpower;
 		mach = &mpower;
 		fp->type = FPOWER;
 		fp->type = FPOWER;
 		break;
 		break;
+	case AMD64:
+		mach = &mamd64;
+		fp->type = FAMD64;
+		break;
 	default:
 	default:
 		return 0;
 		return 0;
 	}
 	}
@@ -542,6 +568,29 @@ elfdotout(int fd, Fhdr *fp, ExecHdr *hp)
 			is = i;
 			is = i;
 	}
 	}
 	if(it == -1 || id == -1) {
 	if(it == -1 || id == -1) {
+		/* 
+		 * The SPARC64 boot image is something of an ELF hack.
+		 * Text+Data+BSS are represented by ph[0].  Symbols
+		 * are represented by ph[1]:
+		 *
+		 *		filesz, memsz, vaddr, paddr, off
+		 * ph[0] : txtsz+datsz, txtsz+datsz+bsssz, txtaddr-KZERO, datasize,  txtoff
+		 * ph[1] : symsz, lcsz, 0, 0, symoff
+		 */
+		if(ep->machine == SPARC64 && ep->phnum == 2) {
+			ulong txtaddr, txtsz, dataddr, bsssz;
+
+			txtaddr = ph[0].vaddr | 0x80000000;
+			txtsz = ph[0].filesz - ph[0].paddr;
+			dataddr = txtaddr + txtsz;
+			bsssz = ph[0].memsz - ph[0].filesz;
+			settext(fp, ep->elfentry | 0x80000000, txtaddr, txtsz, ph[0].offset);
+			setdata(fp, dataddr, ph[0].paddr, ph[0].offset + txtsz, bsssz);
+			setsym(fp, ph[1].filesz, 0, ph[1].memsz, ph[1].offset);
+			free(ph);
+			return 1;
+		}
+
 		werrstr("No TEXT or DATA sections");
 		werrstr("No TEXT or DATA sections");
 		free(ph);
 		free(ph);
 		return 0;
 		return 0;

+ 8 - 3
sys/src/libmach/mkfile

@@ -11,25 +11,30 @@ FILES=executable\
 	setmach\
 	setmach\
 	v\
 	v\
 	k\
 	k\
+	u\
 	q\
 	q\
 	0\
 	0\
 	2\
 	2\
-	8\
 	5\
 	5\
+	6\
 	7\
 	7\
+	8\
 	vdb\
 	vdb\
 	kdb\
 	kdb\
+	udb\
 	qdb\
 	qdb\
 	2db\
 	2db\
-	8db\
 	5db\
 	5db\
 	7db\
 	7db\
+	8db\
 	vobj\
 	vobj\
 	kobj\
 	kobj\
+	uobj\
 	2obj\
 	2obj\
-	8obj\
 	5obj\
 	5obj\
+	6obj\
 	7obj\
 	7obj\
+	8obj\
 	qobj\
 	qobj\
 	vcodas\
 	vcodas\
 
 

+ 7 - 1
sys/src/libmach/obj.c

@@ -22,18 +22,22 @@ enum
 
 
 int	_is2(char*),		/* in [$OS].c */
 int	_is2(char*),		/* in [$OS].c */
 	_is5(char*),
 	_is5(char*),
+	_is6(char*),
 	_is7(char*),
 	_is7(char*),
 	_is8(char*),
 	_is8(char*),
 	_isk(char*),
 	_isk(char*),
 	_isq(char*),
 	_isq(char*),
 	_isv(char*),
 	_isv(char*),
+	_isu(char*),
 	_read2(Biobuf*, Prog*),
 	_read2(Biobuf*, Prog*),
 	_read5(Biobuf*, Prog*),
 	_read5(Biobuf*, Prog*),
+	_read6(Biobuf*, Prog*),
 	_read7(Biobuf*, Prog*),
 	_read7(Biobuf*, Prog*),
 	_read8(Biobuf*, Prog*),
 	_read8(Biobuf*, Prog*),
 	_readk(Biobuf*, Prog*),
 	_readk(Biobuf*, Prog*),
 	_readq(Biobuf*, Prog*),
 	_readq(Biobuf*, Prog*),
-	_readv(Biobuf*, Prog*);
+	_readv(Biobuf*, Prog*),
+	_readu(Biobuf*, Prog*);
 
 
 typedef struct Obj	Obj;
 typedef struct Obj	Obj;
 typedef struct Symtab	Symtab;
 typedef struct Symtab	Symtab;
@@ -48,12 +52,14 @@ struct	Obj		/* functions to handle each intermediate (.$O) file */
 static Obj	obj[] =
 static Obj	obj[] =
 {			/* functions to identify and parse each type of obj */
 {			/* functions to identify and parse each type of obj */
 	[Obj68020]	"68020 .2",	_is2, _read2,
 	[Obj68020]	"68020 .2",	_is2, _read2,
+	[ObjAmd64]	"amd64 .6",	_is6,	_read6,
 	[ObjArm]	"arm .5",	_is5, _read5,
 	[ObjArm]	"arm .5",	_is5, _read5,
 	[ObjAlpha]	"alpha .7",	_is7, _read7,
 	[ObjAlpha]	"alpha .7",	_is7, _read7,
 	[Obj386]	"386 .8",	_is8, _read8,
 	[Obj386]	"386 .8",	_is8, _read8,
 	[ObjSparc]	"sparc .k",	_isk, _readk,
 	[ObjSparc]	"sparc .k",	_isk, _readk,
 	[ObjPower]	"power .q",	_isq, _readq,
 	[ObjPower]	"power .q",	_isq, _readq,
 	[ObjMips]	"mips .v",	_isv, _readv,
 	[ObjMips]	"mips .v",	_isv, _readv,
+	[ObjSparc64]	"sparc64 .u", _isu, _readu,
 	[Maxobjtype]	0, 0
 	[Maxobjtype]	0, 0
 };
 };
 
 

+ 18 - 7
sys/src/libmach/qdb.c

@@ -5,7 +5,7 @@
 
 
 /*
 /*
  * PowerPC-specific debugger interface
  * PowerPC-specific debugger interface
- *	forsyth@plan9.cs.york.ac.uk
+ *	forsyth@terzarima.net
  */
  */
 
 
 static	char	*powerexcep(Map*, Rgetter);
 static	char	*powerexcep(Map*, Rgetter);
@@ -584,7 +584,7 @@ sub(Opcode *o, Instr *i)
 }
 }
 
 
 static void
 static void
-div(Opcode *o, Instr *i)
+qdiv(Opcode *o, Instr *i)
 {
 {
 	format(o->mnemonic, i, 0);
 	format(o->mnemonic, i, 0);
 	if(i->op == 31)
 	if(i->op == 31)
@@ -728,11 +728,13 @@ static Opcode opcodes[] = {
 	{31,	278,	ALL,	"DCBT",		dcb,	0},
 	{31,	278,	ALL,	"DCBT",		dcb,	0},
 	{31,	246,	ALL,	"DCBTST",	dcb,	0},
 	{31,	246,	ALL,	"DCBTST",	dcb,	0},
 	{31,	1014,	ALL,	"DCBZ",		dcb,	0},
 	{31,	1014,	ALL,	"DCBZ",		dcb,	0},
+	{31,	454,	ALL,	"DCCCI",	dcb,	0},
+	{31,	966,	ALL,	"ICCCI",	dcb,	0},
 
 
-	{31,	331,	OEM,	"DIV%V%C",	div,	ir3},	/* POWER */
-	{31,	363,	OEM,	"DIVS%V%C",	div,	ir3},	/* POWER */
-	{31,	491,	OEM,	"DIVW%V%C",	div,	ir3},
-	{31,	459,	OEM,	"DIVWU%V%C",	div,	ir3},
+	{31,	331,	OEM,	"DIV%V%C",	qdiv,	ir3},	/* POWER */
+	{31,	363,	OEM,	"DIVS%V%C",	qdiv,	ir3},	/* POWER */
+	{31,	491,	OEM,	"DIVW%V%C",	qdiv,	ir3},
+	{31,	459,	OEM,	"DIVWU%V%C",	qdiv,	ir3},
 
 
 	{31,	264,	OEM,	"DOZ%V%C",	gencc,	ir3r},	/* POWER */
 	{31,	264,	OEM,	"DOZ%V%C",	gencc,	ir3r},	/* POWER */
 	{9,	0,	0,	"DOZ",		gen,	ir2i},	/* POWER */
 	{9,	0,	0,	"DOZ",		gen,	ir2i},	/* POWER */
@@ -820,6 +822,8 @@ static Opcode opcodes[] = {
 	{31,	339,	ALL,	"MOVW",		gen,	"%P,R%d"},
 	{31,	339,	ALL,	"MOVW",		gen,	"%P,R%d"},
 	{31,	595,	ALL,	"MOVW",		gen,	"SEG(%a),R%d"},
 	{31,	595,	ALL,	"MOVW",		gen,	"SEG(%a),R%d"},
 	{31,	659,	ALL,	"MOVW",		gen,	"SEG(R%b),R%d"},
 	{31,	659,	ALL,	"MOVW",		gen,	"SEG(R%b),R%d"},
+	{31,	323,	ALL,	"MOVW",		gen, "DCR(%Q),R%d"},
+	{31,	451,	ALL,	"MOVW",		gen,	"R%s,DCR(%Q)"},
 	{31,	144,	ALL,	"MOVFL",	gen,	"R%s,%m,CR"},
 	{31,	144,	ALL,	"MOVFL",	gen,	"R%s,%m,CR"},
 	{63,	70,	ALL,	"MTFSB0%C",	gencc,	"%D"},
 	{63,	70,	ALL,	"MTFSB0%C",	gencc,	"%D"},
 	{63,	38,	ALL,	"MTFSB1%C",	gencc,	"%D"},
 	{63,	38,	ALL,	"MTFSB1%C",	gencc,	"%D"},
@@ -835,7 +839,7 @@ static Opcode opcodes[] = {
 	{31,	11,	ALL,	"MULHWU%C",	gencc,	ir3},	/* POWER */
 	{31,	11,	ALL,	"MULHWU%C",	gencc,	ir3},	/* POWER */
 
 
 	{31,	235,	OEM,	"MULLW%V%C",	gencc,	ir3},
 	{31,	235,	OEM,	"MULLW%V%C",	gencc,	ir3},
-	{7,	0,	0,	"MULLW",	div,	"%i,R%a,R%d"},
+	{7,	0,	0,	"MULLW",	qdiv,	"%i,R%a,R%d"},
 
 
 	{31,	488,	OEM,	"NABS%V%C",	neg,	ir2},	/* POWER */
 	{31,	488,	OEM,	"NABS%V%C",	neg,	ir2},	/* POWER */
 
 
@@ -848,6 +852,7 @@ static Opcode opcodes[] = {
 	{25,	0,	0,	"OR",		shifted, 0},
 	{25,	0,	0,	"OR",		shifted, 0},
 
 
 	{19,	50,	ALL,	"RFI",		gen,	0},
 	{19,	50,	ALL,	"RFI",		gen,	0},
+	{19,	51,	ALL,	"RFCI",		gen,	0},
 
 
 	{22,	0,	0,	"RLMI%C",	gencc,	rlim},	/* POWER */
 	{22,	0,	0,	"RLMI%C",	gencc,	rlim},	/* POWER */
 	{20,	0,	0,	"RLWMI%C",	gencc,	rlimi},
 	{20,	0,	0,	"RLWMI%C",	gencc,	rlimi},
@@ -984,6 +989,7 @@ static	Spr	sprname[] = {
 	{981, "ICMP"},
 	{981, "ICMP"},
 	{982, "RPA"},
 	{982, "RPA"},
 	{1010, "IABR"},
 	{1010, "IABR"},
+	{1013, "DABR"},
 	{0,0},
 	{0,0},
 };
 };
 
 
@@ -1083,6 +1089,11 @@ format(char *mnemonic, Instr *i, char *f)
 				bprint(i, "SPR(%d)", n);
 				bprint(i, "SPR(%d)", n);
 			break;
 			break;
 
 
+		case 'Q':
+			n = ((i->spr&0x1f)<<5)|((i->spr>>5)&0x1f);
+			bprint(i, "%d", n);
+			break;
+
 		case 'n':
 		case 'n':
 			bprint(i, "%d", i->nb==0? 32: i->nb);	/* eg, pg 10-103 */
 			bprint(i, "%d", i->nb==0? 32: i->nb);	/* eg, pg 10-103 */
 			break;
 			break;

+ 15 - 3
sys/src/libmach/setmach.c

@@ -16,10 +16,10 @@ struct machtab
 	Machdata	*machdata;		/* machine functions */
 	Machdata	*machdata;		/* machine functions */
 };
 };
 
 
-extern	Mach		mmips, msparc, m68020, mi386,
-			marm, mmips2be, mmips2le, mpower, malpha;
+extern	Mach		mmips, msparc, m68020, mi386, mamd64,
+			marm, mmips2be, mmips2le, mpower, malpha, msparc64;
 extern	Machdata	mipsmach, sparcmach, m68020mach, i386mach,
 extern	Machdata	mipsmach, sparcmach, m68020mach, i386mach,
-			armmach, mipsmach2le, powermach, alphamach;
+			armmach, mipsmach2le, powermach, alphamach, sparc64mach;
 
 
 /*
 /*
  *	machine selection table.  machines with native disassemblers should
  *	machine selection table.  machines with native disassemblers should
@@ -88,6 +88,12 @@ Machtab	machines[] =
 		AI8086,
 		AI8086,
 		&mi386,
 		&mi386,
 		&i386mach,	},
 		&i386mach,	},
+	{	"amd64",				/* amd64 */
+		FAMD64,
+		FI386B,
+		AAMD64,
+		&mamd64,
+		&i386mach,	},
 	{	"arm",				/*ARM*/
 	{	"arm",				/*ARM*/
 		FARM,
 		FARM,
 		FNONE,
 		FNONE,
@@ -106,6 +112,12 @@ Machtab	machines[] =
 		AALPHA,
 		AALPHA,
 		&malpha,
 		&malpha,
 		&alphamach,	},
 		&alphamach,	},
+	{	"sparc64",			/*plan 9 sparc64 */
+		FSPARC64,
+		FSPARCB,			/* XXX? */
+		ASPARC64,
+		&msparc64,
+		&sparc64mach,	},
 	{	0		},		/*the terminator*/
 	{	0		},		/*the terminator*/
 };
 };
 
 

+ 118 - 0
sys/src/libmach/u.c

@@ -0,0 +1,118 @@
+/*
+ * sparc64 definition
+ */
+#include <u.h>
+#include <bio.h>
+#include "/sparc64/include/ureg.h"
+#include <mach.h>
+
+#define	REGOFF(x)	(ulong)(&((struct Ureg *) 0)->x)
+
+#define R1		REGOFF(r1)
+#define R7		REGOFF(r7)
+#define PC		REGOFF(pc)
+#define	R15		REGOFF(r15)
+
+#define	REGSIZE		sizeof(struct Ureg)
+#define	FP_REG(x)	(REGSIZE+4*(x))
+#define	FPREGSIZE	(33*4)
+
+Reglist sparc64reglist[] = {
+	{"Y",		REGOFF(y),	RINT|RRDONLY, 'X'},
+	{"TT",		REGOFF(tt),	RINT|RRDONLY, 'X'},
+	{"PSTATE",	REGOFF(pstate),	RINT|RRDONLY, 'X'},
+	{"PC",		REGOFF(pc),	RINT, 'X'},
+	{"SP",		REGOFF(sp),	RINT, 'X'},	/* also R1 */
+	{"R2",		REGOFF(r2),	RINT, 'X'},
+	{"R3",		REGOFF(r3),	RINT, 'X'},
+	{"R4",		REGOFF(r4),	RINT, 'X'},
+	{"R5",		REGOFF(r5),	RINT, 'X'},
+	{"R6",		REGOFF(r6),	RINT, 'X'},
+	{"R7",		REGOFF(r7),	RINT, 'X'},
+	{"R8",		REGOFF(r8),	RINT, 'X'},
+	{"R9",		REGOFF(r9),	RINT, 'X'},
+	{"R10",		REGOFF(r10),	RINT, 'X'},
+	{"R11",		REGOFF(r11),	RINT, 'X'},
+	{"R12",		REGOFF(r12),	RINT, 'X'},
+	{"R13",		REGOFF(r13),	RINT, 'X'},
+	{"R14",		REGOFF(r14),	RINT, 'X'},
+	{"R15",		REGOFF(r15),	RINT, 'X'},
+	{"R16",		REGOFF(r16),	RINT, 'X'},
+	{"R17",		REGOFF(r17),	RINT, 'X'},
+	{"R18",		REGOFF(r18),	RINT, 'X'},
+	{"R19",		REGOFF(r19),	RINT, 'X'},
+	{"R20",		REGOFF(r20),	RINT, 'X'},
+	{"R21",		REGOFF(r21),	RINT, 'X'},
+	{"R22",		REGOFF(r22),	RINT, 'X'},
+	{"R23",		REGOFF(r23),	RINT, 'X'},
+	{"R24",		REGOFF(r24),	RINT, 'X'},
+	{"R25",		REGOFF(r25),	RINT, 'X'},
+	{"R26",		REGOFF(r26),	RINT, 'X'},
+	{"R27",		REGOFF(r27),	RINT, 'X'},
+	{"R28",		REGOFF(r28),	RINT, 'X'},
+	{"R29",		REGOFF(r29),	RINT, 'X'},
+	{"R30",		REGOFF(r30),	RINT, 'X'},
+	{"R31",		REGOFF(r31),	RINT, 'X'},
+	{"NPC",		REGOFF(npc),	RINT, 'X'},
+
+	{"F0",		FP_REG(0),	RFLT, 'F'},
+	{"F1",		FP_REG(1),	RFLT, 'f'},
+	{"F2",		FP_REG(2),	RFLT, 'F'},
+	{"F3",		FP_REG(3),	RFLT, 'f'},
+	{"F4",		FP_REG(4),	RFLT, 'F'},
+	{"F5",		FP_REG(5),	RFLT, 'f'},
+	{"F6",		FP_REG(6),	RFLT, 'F'},
+	{"F7",		FP_REG(7),	RFLT, 'f'},
+	{"F8",		FP_REG(8),	RFLT, 'F'},
+	{"F9",		FP_REG(9),	RFLT, 'f'},
+	{"F10",		FP_REG(10),	RFLT, 'F'},
+	{"F11",		FP_REG(11),	RFLT, 'f'},
+	{"F12",		FP_REG(12),	RFLT, 'F'},
+	{"F13",		FP_REG(13),	RFLT, 'f'},
+	{"F14",		FP_REG(14),	RFLT, 'F'},
+	{"F15",		FP_REG(15),	RFLT, 'f'},
+	{"F16",		FP_REG(16),	RFLT, 'F'},
+	{"F17",		FP_REG(17),	RFLT, 'f'},
+	{"F18",		FP_REG(18),	RFLT, 'F'},
+	{"F19",		FP_REG(19),	RFLT, 'f'},
+	{"F20",		FP_REG(20),	RFLT, 'F'},
+	{"F21",		FP_REG(21),	RFLT, 'f'},
+	{"F22",		FP_REG(22),	RFLT, 'F'},
+	{"F23",		FP_REG(23),	RFLT, 'f'},
+	{"F24",		FP_REG(24),	RFLT, 'F'},
+	{"F25",		FP_REG(25),	RFLT, 'f'},
+	{"F26",		FP_REG(26),	RFLT, 'F'},
+	{"F27",		FP_REG(27),	RFLT, 'f'},
+	{"F28",		FP_REG(28),	RFLT, 'F'},
+	{"F29",		FP_REG(29),	RFLT, 'f'},
+	{"F30",		FP_REG(30),	RFLT, 'F'},
+	{"F31",		FP_REG(31),	RFLT, 'f'},
+	{"FSR",		FP_REG(32),	RINT, 'X'},
+	{"FPRS",	FP_REG(33),	RINT, 'X'},
+	{  0 }
+};
+
+/*
+ * sparc64 has same stack format as mips
+ */
+Mach msparc64 =
+{
+	"sparc64",
+	MSPARC64,	/* machine type */
+	sparc64reglist,	/* register list */
+	REGSIZE,	/* register set size in bytes */
+	FPREGSIZE,	/* floating point register size in bytes */
+	"PC",		/* name of PC */
+	"R1",		/* name of SP */
+	"R15",		/* name of link register */
+	"setSB",	/* static base register name */
+	0,		/* value */
+	0x2000,		/* page size */
+	0x80000000,	/* kernel base */
+	0,		/* kernel text mask */
+	4,		/* quantization of pc */
+	4,		/* szaddr */
+	4,		/* szreg */
+	4,		/* szfloat */
+	8,		/* szdouble */
+};

+ 2 - 0
sys/src/libmach/uc/README

@@ -0,0 +1,2 @@
+Stub data for omitted architectures,
+to make distribution easy to build.

+ 264 - 0
sys/src/libmach/uc/u.out.h

@@ -0,0 +1,264 @@
+#define	NSNAME	8
+#define	NSYM	50
+#define	NREG	32
+#define NOPROF	(1<<0)
+#define DUPOK	(1<<1)
+
+enum
+{
+	REGZERO		= 0,	/* always zero */
+	REGSP		= 1,	/* stack pointer */
+	REGSB		= 2,	/* static pointer */
+	REGSB1		= 3,	/* (possible) second static pointer */
+	REGEXT		= 6,	/* first external register, grows-- */
+	REGRET		= 7,	/* return register and first temp, grows++ */
+	REGTMP		= 14,	/* used by the loader */
+	REGLINK		= 15,	/* subroutine linkage */
+	REGARG		= 7,	/* first arg passed in */
+
+	FREGRET		= 0,
+	FREGEXT		= 22,	/* first external register */
+	FREGZERO	= 24,	/* both float and double */
+	FREGHALF	= 26,	/* double */
+	FREGONE		= 28,	/* double */
+	FREGTWO		= 30	/* double */
+/*
+ * GENERAL:
+ *
+ * compiler allocates R7 up as temps
+ * compiler allocates external registers R6 down
+ * compiler allocates register variables F4-F22
+ * compiler allocates external registers F22 down
+ */
+};
+
+enum	as
+{
+	AXXX	= 0,
+	AADD,
+	AADDCC,
+	AADDX,
+	AADDXCC,
+	AAND,
+	AANDCC,
+	AANDN,
+	AANDNCC,
+	ABA,
+	ABCC,
+	ABCS,
+	ABE,
+	ABG,
+	ABGE,
+	ABGU,
+	ABL,
+	ABLE,
+	ABLEU,
+	ABN,
+	ABNE,
+	ABNEG,
+	ABPOS,
+	ABVC,
+	ABVS,
+	ACB0,
+	ACB01,
+	ACB012,
+	ACB013,
+	ACB02,
+	ACB023,
+	ACB03,
+	ACB1,
+	ACB12,
+	ACB123,
+	ACB13,
+	ACB2,
+	ACB23,
+	ACB3,
+	ACBA,
+	ACBN,
+	ACMP,		/* pseudo op */
+	ACPOP1,
+	ACPOP2,
+	ADATA,
+	ADIV,
+	ADIVL,
+	AFABSD,		/* pseudo op */
+	AFABSF,
+	AFABSX,		/* pseudo op */
+	AFADDD,
+	AFADDF,
+	AFADDX,
+	AFBA,
+	AFBE,
+	AFBG,
+	AFBGE,
+	AFBL,
+	AFBLE,
+	AFBLG,
+	AFBN,
+	AFBNE,
+	AFBO,
+	AFBU,
+	AFBUE,
+	AFBUG,
+	AFBUGE,
+	AFBUL,
+	AFBULE,
+	AFCMPD,
+	AFCMPED,
+	AFCMPEF,
+	AFCMPEX,
+	AFCMPF,
+	AFCMPX,
+	AFDIVD,
+	AFDIVF,
+	AFDIVX,
+	AFMOVD,		/* pseudo op */
+	AFMOVDF,
+	AFMOVDW,
+	AFMOVDX,
+	AFMOVF,
+	AFMOVFD,
+	AFMOVFW,
+	AFMOVFX,
+	AFMOVWD,
+	AFMOVWF,
+	AFMOVWX,
+	AFMOVX,		/* pseudo op */
+	AFMOVXD,
+	AFMOVXF,
+	AFMOVXW,
+	AFMULD,
+	AFMULF,
+	AFMULX,
+	AFNEGD,		/* pseudo op */
+	AFNEGF,
+	AFNEGX,		/* pseudo op */
+	AFSQRTD,
+	AFSQRTF,
+	AFSQRTX,
+	AFSUBD,
+	AFSUBF,
+	AFSUBX,
+	AGLOBL,
+	AGOK,
+	AHISTORY,
+	AIFLUSH,
+	AJMPL,
+	AJMP,
+	AMOD,
+	AMODL,
+	AMOVB,
+	AMOVBU,
+	AMOVD,
+	AMOVH,
+	AMOVHU,
+	AMOVW,
+	AMUL,
+	AMULSCC,
+				AXXXdummy,		// to temporarily make ANAME/ASIGNAME different than .k's
+	ANAME,
+	ANOP,
+	AOR,
+	AORCC,
+	AORN,
+	AORNCC,
+	ARESTORE,
+	ARETT,
+	ARETURN,
+	ASAVE,
+	ASLL,
+	ASRA,
+	ASRL,
+	ASUB,
+	ASUBCC,
+	ASUBX,
+	ASUBXCC,
+	ASWAP,
+	ATA,
+	ATADDCC,
+	ATADDCCTV,
+	ATAS,
+	ATCC,
+	ATCS,
+	ATE,
+	ATEXT,
+	ATG,
+	ATGE,
+	ATGU,
+	ATL,
+	ATLE,
+	ATLEU,
+	ATN,
+	ATNE,
+	ATNEG,
+	ATPOS,
+	ATSUBCC,
+	ATSUBCCTV,
+	ATVC,
+	ATVS,
+	AUNIMP,
+	AWORD,
+	AXNOR,
+	AXNORCC,
+	AXOR,
+	AXORCC,
+	AEND,
+	ADYNT,
+	AINIT,
+	ASIGNAME,
+	ALAST
+};
+
+/* type/name */
+enum
+{
+	D_GOK	= 0,
+	D_NONE,
+
+/* name */
+	D_EXTERN,
+	D_STATIC,
+	D_AUTO,
+	D_PARAM,
+
+/* type */
+	D_BRANCH,
+	D_OREG,
+	D_ASI,
+	D_CONST,
+	D_FCONST,
+	D_SCONST,
+	D_REG,
+	D_FREG,
+	D_CREG,
+	D_PREG,
+	D_FILE,
+	D_FILE1,
+
+/* reg names iff type is D_PREG */
+	D_CPQ	= 0,
+	D_CSR,
+	D_FPQ,
+	D_FSR,
+	D_PSR,
+	D_TBR,
+	D_WIM,
+	D_Y
+};
+
+/*
+ * this is the ranlib header
+ */
+#define	SYMDEF	"__.SYMDEF"
+
+/*
+ * this is the simulated IEEE floating point
+ */
+typedef	struct	ieee	Ieee;
+struct	ieee
+{
+	long	l;	/* contains ls-man	0xffffffff */
+	long	h;	/* contains sign	0x80000000
+				    exp		0x7ff00000
+				    ms-man	0x000fffff */
+};

+ 1075 - 0
sys/src/libmach/udb.c

@@ -0,0 +1,1075 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include <mach.h>
+
+/*
+ * Sparc64-specific debugger interface
+ */
+
+static	char	*sparc64excep(Map*, Rgetter);
+static	int	sparc64foll(Map*, ulong, Rgetter, ulong*);
+static	int	sparc64inst(Map*, ulong, char, char*, int);
+static	int	sparc64das(Map*, ulong, char*, int);
+static	int	sparc64instlen(Map*, ulong);
+
+Machdata sparc64mach =
+{
+	{0x91, 0xd0, 0x20, 0x01},	/* breakpoint: TA $1 */
+	4,			/* break point size */
+
+	beswab,			/* convert short to local byte order */
+	beswal,			/* convert long to local byte order */
+	beswav,			/* convert vlong to local byte order */
+	risctrace,		/* C traceback */
+	riscframe,		/* frame finder */
+	sparc64excep,		/* print exception */
+	0,			/* breakpoint fixup */
+	beieeesftos,		/* single precision float printer */
+	beieeedftos,		/* double precision float printer */
+	sparc64foll,		/* following addresses */
+	sparc64inst,		/* print instruction */
+	sparc64das,		/* dissembler */
+	sparc64instlen,		/* instruction size */
+};
+
+static char *trapname[] =
+{
+	0,
+	"power on reset",
+	"watchdog reset",
+	"external reset",
+	"software reset",
+	"RED",
+	0, 0,
+	"instruction access exception",
+	"instruction access MMU miss",
+	"instruction access error",
+	0, 0, 0, 0, 0,
+	"illegal instruction",
+	"privileged opcode",
+	"unimplemented LDD",
+	"unimplemented STD",
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	"fp disabled",
+	"fp exception ieee 754",
+	"fp exception other",
+	0, 0, 0, 0,
+	"division by zero",
+	"internal processor error",
+	0, 0, 0, 0, 0, 0,
+	"data access exception",
+	"data access MMU miss",
+	"data access error",
+	"data access protection",
+	"mem address not aligned",
+	"LDDF mem address not aligned",
+	"STDF mem address not aligned",
+	"privileged action",
+	"LDQF mem address nto aligned",
+	"STQF mem address not aligned",
+};
+
+static char*
+excname(ulong tt)
+{
+	static char buf[32];
+
+	if(tt < sizeof trapname/sizeof(char*) && trapname[tt])
+		return trapname[tt];
+	if(tt >= 258)
+		sprint(buf, "trap instruction %ld", tt-128);
+	else if(65<=tt && tt<=79)
+		sprint(buf, "interrupt level %ld", tt-64);
+	else switch(tt){
+	case 64:
+		return "async data error";
+	case 96:
+		return "mondo interrupt";
+	case 100:
+		return "instruction access MMU miss";
+	case 104:
+		return "data access MMU miss";
+	case 108:
+		return "data access protection";
+	case 256:
+		return "syscall";
+	case 257:
+		return "breakpoint";
+	default:
+		sprint(buf, "unknown trap %ld", tt);
+	}
+	return buf;
+}
+
+static char*
+sparc64excep(Map *map, Rgetter rget)
+{
+	long tt;
+
+	tt = (*rget)(map, "TT");
+	return excname(tt);
+}
+
+	/* Sparc disassembler and related functions */
+
+struct opcode {
+	char	*mnemonic;
+	void	(*f)(struct instr*, char*);
+	int	flag;
+};
+
+static	char FRAMENAME[] = ".frame";
+
+typedef struct instr Instr;
+
+struct instr {
+	uchar	op;		/* bits 31-30 */
+	uchar	rd;		/* bits 29-25 */
+	uchar	op2;		/* bits 24-22 */
+	uchar	a;		/* bit  29    */
+	uchar	cond;		/* bits 28-25 */
+	uchar	op3;		/* bits 24-19 */
+	uchar	rs1;		/* bits 18-14 */
+	uchar	i;		/* bit  13    */
+	uchar	asi;		/* bits 12-05 */
+	uchar	rs2;		/* bits 04-00 */
+	short	simm13;		/* bits 12-00, signed */
+	ushort	opf;		/* bits 13-05 */
+	ulong	immdisp22;	/* bits 21-00 */
+	ulong	simmdisp22;	/* bits 21-00, signed */
+	ulong	disp30;		/* bits 30-00 */
+	ulong	imm32;		/* SETHI+ADD constant */
+	int	target;		/* SETHI+ADD dest reg */
+	long	w0;
+	long	w1;
+	ulong	addr;		/* pc of instruction */
+	char	*curr;		/* current fill level in output buffer */
+	char	*end;		/* end of buffer */
+	int 	size;		/* number of longs in instr */
+	char	*err;		/* errmsg */
+};
+
+static	Map	*mymap;		/* disassembler context */
+static	int	dascase;
+
+static int	mkinstr(ulong, Instr*);
+static void	bra1(Instr*, char*, char*[]);
+static void	bra(Instr*, char*);
+static void	fbra(Instr*, char*);
+static void	cbra(Instr*, char*);
+static void	unimp(Instr*, char*);
+static void	fpop(Instr*, char*);
+static void	shift(Instr*, char*);
+static void	sethi(Instr*, char*);
+static void	load(Instr*, char*);
+static void	loada(Instr*, char*);
+static void	store(Instr*, char*);
+static void	storea(Instr*, char*);
+static void	add(Instr*, char*);
+static void	cmp(Instr*, char*);
+static void	wr(Instr*, char*);
+static void	jmpl(Instr*, char*);
+static void	rd(Instr*, char*);
+static void	loadf(Instr*, char*);
+static void	storef(Instr*, char*);
+static void	loadc(Instr*, char*);
+static void	loadcsr(Instr*, char*);
+static void	trap(Instr*, char*);
+
+static struct opcode sparc64op0[8] = {
+	[0]	"UNIMP",	unimp,	0,	/* page 137 */
+	[2]	"B",		bra,	0,	/* page 119 */
+	[4]	"SETHI",	sethi,	0,	/* page 104 */
+	[6]	"FB",		fbra,	0,	/* page 121 */
+	[7]	"CB",		cbra,	0,	/* page 123 */
+};
+
+static struct opcode sparc64op2[64] = {
+	[0x00]	"ADD",		add,	0,	/* page 108 */
+	[0x10]	"ADDCC",	add,	0,
+	[0x08]	"ADDX",		add,	0,
+	[0x18]	"ADDXCC",	add,	0,
+
+	[0x20]	"TADD",		add,	0,	/* page 109 */
+	[0x22]	"TADDCCTV",	add,	0,
+
+	[0x04]	"SUB",		add,	0,	/* page 110 */
+	[0x14]	"SUBCC",	cmp,	0,
+	[0x0C]	"SUBX",		add,	0,
+	[0x1C]	"SUBXCC",	add,	0,
+
+	[0x21]	"TSUB",		add,	0,	/* page 111 */
+	[0x23]	"TSUBCCTV",	add,	0,
+
+	[0x24]	"MULSCC",	add,	0,	/* page 112 */
+
+	[0x0A]	"UMUL",		add,	0,	/* page 113 */
+	[0x0B]	"SMUL",		add,	0,
+	[0x1A]	"UMULCC",	add,	0,
+	[0x1B]	"SMULCC",	add,	0,
+
+	[0x0E]	"UDIV",		add,	0,	/* page 115 */
+	[0x0F]	"SDIV",		add,	0,
+	[0x1E]	"UDIVCC",	add,	0,
+	[0x1F]	"SDIVCC",	add,	0,
+
+	[0x01]	"AND",		add,	0,	/* page 106 */
+	[0x11]	"ANDCC",	add,	0,
+	[0x05]	"ANDN",		add,	0,
+	[0x15]	"ANDNCC",	add,	0,
+	[0x02]	"OR",		add,	0,
+	[0x12]	"ORCC",		add,	0,
+	[0x06]	"ORN",		add,	0,
+	[0x16]	"ORNCC",	add,	0,
+	[0x03]	"XOR",		add,	0,
+	[0x13]	"XORCC",	add,	0,
+	[0x07]	"XORN",		add,	0,
+	[0x17]	"XORNCC",	add,	0,
+
+	[0x25]	"SLL",		shift,	0,	/* page 107 */
+	[0x26]	"SRL",		shift,	0,
+	[0x27]	"SRA",		shift,	0,
+
+	[0x3C]	"SAVE",		add,	0,	/* page 117 */
+	[0x3D]	"RESTORE",	add,	0,
+
+	[0x38]	"JMPL",		jmpl,	0,	/* page 126 */
+
+	[0x39]	"RETT",		add,	0,	/* page 127 */
+
+	[0x3A]	"T",		trap,	0,	/* page 129 */
+
+	[0x28]	"rdy",		rd,	0,	/* page 131 */
+	[0x29]	"rdpsr",	rd,	0,
+	[0x2A]	"rdwim",	rd,	0,
+	[0x2B]	"rdtbr",	rd,	0,
+
+	[0x30]	"wry",		wr,	0,	/* page 133 */
+	[0x31]	"wrpsr",	wr,	0,
+	[0x32]	"wrwim",	wr,	0,
+	[0x33]	"wrtbr",	wr,	0,
+
+	[0x3B]	"flush",	add,	0,	/* page 138 */
+
+	[0x34]	"FPOP",		fpop,	0,	/* page 140 */
+	[0x35]	"FPOP",		fpop,	0,
+};
+
+static struct opcode sparc64op3[64]={
+	[0x09]	"ldsb",		load,	0,	/* page 90 */
+	[0x19]	"ldsba",	loada,	0,
+	[0x0A]	"ldsh",		load,	0,
+	[0x1A]	"ldsha",	loada,	0,
+	[0x01]	"ldub",		load,	0,
+	[0x11]	"lduba",	loada,	0,
+	[0x02]	"lduh",		load,	0,
+	[0x12]	"lduha",	loada,	0,
+	[0x00]	"ld",		load,	0,
+	[0x10]	"lda",		loada,	0,
+	[0x03]	"ldd",		load,	0,
+	[0x13]	"ldda",		loada,	0,
+
+	[0x20]	"ldf",		loadf,	0,	/* page 92 */
+	[0x23]	"lddf",		loadf,	0,
+	[0x21]	"ldfsr",	loadf,0,
+
+	[0x30]	"ldc",		loadc,	0,	/* page 94 */
+	[0x33]	"lddc",		loadc,	0,
+	[0x31]	"ldcsr",	loadcsr,0,
+
+	[0x05]	"stb",		store,	0,	/* page 95 */
+	[0x15]	"stba",		storea,	0,
+	[0x06]	"sth",		store,	0,
+	[0x16]	"stha",		storea,	0,
+	[0x04]	"st",		store,	0,
+	[0x14]	"sta",		storea,	0,
+	[0x07]	"std",		store,	0,
+	[0x17]	"stda",		storea,	0,
+
+	[0x24]	"stf",		storef,	0,	/* page 97 */
+	[0x27]	"stdf",		storef,	0,
+	[0x25]	"stfsr",	storef,0,
+	[0x26]	"stdfq",	storef,0,
+
+	[0x34]	"stc",		loadc,	0,	/* page 99 */
+	[0x37]	"stdc",		loadc,	0,
+	[0x35]	"stcsr",	loadcsr,0,
+	[0x36]	"stdcq",	loadcsr,0,
+
+	[0x0D]	"ldstub",	store,	0,	/* page 101 */
+	[0x1D]	"ldstuba",	storea,	0,
+
+	[0x0F]	"swap",		load,	0,	/* page 102 */
+	[0x1F]	"swapa",	loada,	0,
+};
+
+static void
+bprint(Instr *i, char *fmt, ...)
+{
+	va_list arg;
+
+	va_start(arg, fmt);
+	i->curr = vseprint(i->curr, i->end, fmt, arg);
+	va_end(arg);
+}
+
+static int
+decode(ulong pc, Instr *i)
+{
+	long w;
+
+	if (get4(mymap, pc, &w) < 0) {
+		werrstr("can't read instruction: %r");
+		return -1;
+	}
+	i->op = (w >> 30) & 0x03;
+	i->rd = (w >> 25) & 0x1F;
+	i->op2 = (w >> 22) & 0x07;
+	i->a = (w >> 29) & 0x01;
+	i->cond = (w >> 25) & 0x0F;
+	i->op3 = (w >> 19) & 0x3F;
+	i->rs1 = (w >> 14) & 0x1F;
+	i->i = (w >> 13) & 0x01;
+	i->asi = (w >> 5) & 0xFF;
+	i->rs2 = (w >> 0) & 0x1F;
+	i->simm13 = (w >> 0) & 0x1FFF;
+	if(i->simm13 & (1<<12))
+		i->simm13 |= ~((1<<13)-1);
+	i->opf = (w >> 5) & 0x1FF;
+	i->immdisp22 = (w >> 0) & 0x3FFFFF;
+	i->simmdisp22 = i->immdisp22;
+	if(i->simmdisp22 & (1<<21))
+		i->simmdisp22 |= ~((1<<22)-1);
+	i->disp30 = (w >> 0) & 0x3FFFFFFF;
+	i->w0 = w;
+	i->target = -1;
+	i->addr = pc;
+	i->size = 1;
+	return 1;
+}
+
+static int
+mkinstr(ulong pc, Instr *i)
+{
+	Instr xi;
+
+	if (decode(pc, i) < 0)
+		return -1;
+	if(i->op==0 && i->op2==4 && !dascase){	/* SETHI */
+		if (decode(pc+4, &xi) < 0)
+			return -1;
+		if(xi.op==2 && xi.op3==0)		/* ADD */
+		if(xi.i == 1 && xi.rs1 == i->rd){	/* immediate to same reg */
+			i->imm32 = xi.simm13 + (i->immdisp22<<10);
+			i->target = xi.rd;
+			i->w1 = xi.w0;
+			i->size++;
+			return 1;
+		}
+	}
+	if(i->op==2 && i->opf==1 && !dascase){	/* FMOVS */
+		if (decode(pc+4, &xi) < 0)
+			return -1;
+		if(i->op==2 && i->opf==1)		/* FMOVS */
+		if(xi.rd==i->rd+1 && xi.rs2==i->rs2+1){	/* next pair */
+			i->w1 = xi.w0;
+			i->size++;
+		}
+	}
+	return 1;
+}
+
+static int
+printins(Map *map, ulong pc, char *buf, int n)
+{
+	Instr instr;
+	void (*f)(Instr*, char*);
+
+	mymap = map;
+	memset(&instr, 0, sizeof(instr));
+	instr.curr = buf;
+	instr.end = buf+n-1;
+	if (mkinstr(pc, &instr) < 0)
+		return -1;
+	switch(instr.op){
+	case 0:
+		f = sparc64op0[instr.op2].f;
+		if(f)
+			(*f)(&instr, sparc64op0[instr.op2].mnemonic);
+		else
+			bprint(&instr, "unknown %lux", instr.w0);
+		break;
+
+	case 1:
+		bprint(&instr, "%X", "CALL\t");
+		instr.curr += symoff(instr.curr, instr.end-instr.curr,
+					pc+instr.disp30*4, CTEXT);
+		if (!dascase)
+			bprint(&instr, "(SB)");
+		break;
+
+	case 2:
+		f = sparc64op2[instr.op3].f;
+		if(f)
+			(*f)(&instr, sparc64op2[instr.op3].mnemonic);
+		else
+			bprint(&instr, "unknown %lux", instr.w0);
+		break;
+
+	case 3:
+		f = sparc64op3[instr.op3].f;
+		if(f)
+			(*f)(&instr, sparc64op3[instr.op3].mnemonic);
+		else
+			bprint(&instr, "unknown %lux", instr.w0);
+		break;
+	}
+	if (instr.err) {
+		if (instr.curr != buf)
+			bprint(&instr, "\t\t;");
+		bprint(&instr, instr.err);
+	}
+	return instr.size*4;
+}
+
+/* convert to lower case from upper, according to dascase */
+static int
+Xfmt(Fmt *f)
+{
+	char buf[128];
+	char *s, *t, *oa;
+
+	oa = va_arg(f->args, char*);
+	if(dascase){
+		for(s=oa,t=buf; *t = *s; s++,t++)
+			if('A'<=*t && *t<='Z')
+				*t += 'a'-'A';
+		return fmtstrcpy(f, buf);
+	}
+	return fmtstrcpy(f, oa);
+}
+
+static int
+sparc64inst(Map *map, ulong pc, char modifier, char *buf, int n)
+{
+	static int fmtinstalled = 0;
+
+		/* a modifier of 'I' toggles the dissassembler type */
+	if (!fmtinstalled) {
+		fmtinstalled = 1;
+		fmtinstall('X', Xfmt);
+	}
+	if ((asstype == ASUNSPARC && modifier == 'i')
+		|| (asstype == ASPARC && modifier == 'I'))
+		dascase = 'a'-'A';
+	else
+		dascase = 0;
+	return printins(map, pc, buf, n);
+}
+
+static int
+sparc64das(Map *map, ulong pc, char *buf, int n)
+{
+	Instr instr;
+
+	mymap = map;
+	memset(&instr, 0, sizeof(instr));
+	instr.curr = buf;
+	instr.end = buf+n-1;
+	if (mkinstr(pc, &instr) < 0)
+		return -1;
+	if (instr.end-instr.curr > 8)
+		instr.curr = _hexify(instr.curr, instr.w0, 7);
+	if (instr.end-instr.curr > 9 && instr.size == 2) {
+		*instr.curr++ = ' ';
+		instr.curr = _hexify(instr.curr, instr.w1, 7);
+	}
+	*instr.curr = 0;
+	return instr.size*4;
+}
+
+static int
+sparc64instlen(Map *map, ulong pc)
+{
+	Instr i;
+
+	mymap = map;
+	if (mkinstr(pc, &i) < 0)
+		return -1;
+	return i.size*4;
+}
+
+static int
+plocal(Instr *i)
+{
+	int offset;
+	Symbol s;
+
+	if (!findsym(i->addr, CTEXT, &s) || !findlocal(&s, FRAMENAME, &s))
+		return -1;
+	if (s.value > i->simm13) {
+		if(getauto(&s, s.value-i->simm13, CAUTO, &s)) {
+			bprint(i, "%s+%d(SP)", s.name, s.value);
+			return 1;
+		}
+	} else {
+		offset = i->simm13-s.value;
+		if (getauto(&s, offset-4, CPARAM, &s)) {
+			bprint(i, "%s+%d(FP)", s.name, offset);
+			return 1;
+		}
+	}
+	return -1;
+}
+
+static void
+address(Instr *i)
+{
+	Symbol s, s2;
+	long off, off1;
+
+	if (i->rs1 == 1 && plocal(i) >= 0)
+		return;
+	off = mach->sb+i->simm13;
+	if(i->rs1 == 2	&& findsym(off, CANY, &s)
+			&& s.value-off < 4096
+			&& (s.class == CDATA || s.class == CTEXT)) {
+		if(off==s.value && s.name[0]=='$'){
+			off1 = 0;
+			get4(mymap, s.value, &off1);
+			if(off1 && findsym(off1, CANY, &s2) && s2.value == off1){
+				bprint(i, "$%s(SB)", s2.name);
+				return;
+			}
+		}
+		bprint(i, "%s", s.name);
+		if (s.value != off)
+			bprint(i, "+%lux", s.value-off);
+		bprint(i, "(SB)");
+		return;
+	}
+	bprint(i, "%lux(R%d)", i->simm13, i->rs1);
+}
+
+static void
+unimp(Instr *i, char *m)
+{
+	bprint(i, "%X", m);
+}
+
+static char	*bratab[16] = {		/* page 91 */
+	[0X8]	"A",
+	[0X0]	"N",
+	[0X9]	"NE",
+	[0X1]	"E",
+	[0XA]	"G",
+	[0X2]	"LE",
+	[0XB]	"GE",
+	[0X3]	"L",
+	[0XC]	"GU",
+	[0X4]	"LEU",
+	[0XD]	"CC",
+	[0X5]	"CS",
+	[0XE]	"POS",
+	[0X6]	"NEG",
+	[0XF]	"VC",
+	[0X7]	"VS",
+};
+
+static char	*fbratab[16] = {	/* page 91 */
+	[0X8]	"A",
+	[0X0]	"N",
+	[0X7]	"U",
+	[0X6]	"G",
+	[0X5]	"UG",
+	[0X4]	"L",
+	[0X3]	"UL",
+	[0X2]	"LG",
+	[0X1]	"NE",
+	[0X9]	"E",
+	[0XA]	"UE",
+	[0XB]	"GE",
+	[0XC]	"UGE",
+	[0XD]	"LE",
+	[0XE]	"ULE",
+	[0XF]	"O",
+};
+
+static char	*cbratab[16] = {	/* page 91 */
+	[0X8]	"A",
+	[0X0]	"N",
+	[0X7]	"3",
+	[0X6]	"2",
+	[0X5]	"23",
+	[0X4]	"1",
+	[0X3]	"13",
+	[0X2]	"12",
+	[0X1]	"123",
+	[0X9]	"0",
+	[0XA]	"03",
+	[0XB]	"02",
+	[0XC]	"023",
+	[0XD]	"01",
+	[0XE]	"013",
+	[0XF]	"012",
+};
+
+static void
+bra1(Instr *i, char *m, char *tab[])
+{
+	long imm;
+
+	imm = i->simmdisp22;
+	if(i->a)
+		bprint(i, "%X%X.%c\t", m, tab[i->cond], 'A'+dascase);
+	else
+		bprint(i, "%X%X\t", m, tab[i->cond]);
+	i->curr += symoff(i->curr, i->end-i->curr, i->addr+4*imm, CTEXT);
+	if (!dascase)
+		bprint(i, "(SB)");
+}
+
+static void
+bra(Instr *i, char *m)			/* page 91 */
+{
+	bra1(i, m, bratab);
+}
+
+static void
+fbra(Instr *i, char *m)			/* page 93 */
+{
+	bra1(i, m, fbratab);
+}
+
+static void
+cbra(Instr *i, char *m)			/* page 95 */
+{
+	bra1(i, m, cbratab);
+}
+
+static void
+trap(Instr *i, char *m)			/* page 101 */
+{
+	if(i->i == 0)
+		bprint(i, "%X%X\tR%d+R%d", m, bratab[i->cond], i->rs2, i->rs1);
+	else
+		bprint(i, "%X%X\t$%lux+R%d", m, bratab[i->cond], i->simm13, i->rs1);
+}
+
+static void
+sethi(Instr *i, char *m)		/* page 89 */
+{
+	ulong imm;
+
+	imm = i->immdisp22<<10;
+	if(dascase){
+		bprint(i, "%X\t%lux, R%d", m, imm, i->rd);
+		return;
+	}
+	if(imm==0 && i->rd==0){
+		bprint(i, "NOP");
+		return;
+	}
+	if(i->target < 0){
+		bprint(i, "MOVW\t$%lux, R%d", imm, i->rd);
+		return;
+	}
+	bprint(i, "MOVW\t$%lux, R%d", i->imm32, i->target);
+}
+
+static char ldtab[] = {
+	'W',
+	'B',
+	'H',
+	'D',
+};
+
+static char*
+moveinstr(int op3, char *m)
+{
+	char *s;
+	int c;
+	static char buf[8];
+
+	if(!dascase){
+		/* batshit cases */
+		if(op3 == 0xF || op3 == 0x1F)
+			return "SWAP";
+		if(op3 == 0xD || op3 == 0x1D)
+			return "TAS";	/* really LDSTUB */
+		c = ldtab[op3&3];
+		s = "";
+		if((op3&11)==1 || (op3&11)==2)
+			s="U";
+		sprint(buf, "MOV%c%s", c, s);
+		return buf;
+	}
+	return m;
+}
+
+static void
+load(Instr *i, char *m)			/* page 68 */
+{
+	m = moveinstr(i->op3, m);
+	if(i->i == 0)
+		bprint(i, "%s\t(R%d+R%d), R%d", m, i->rs1, i->rs2, i->rd);
+	else{
+		bprint(i, "%s\t", m);
+		address(i);
+		bprint(i, ", R%d", i->rd);
+	}
+}
+
+static void
+loada(Instr *i, char *m)		/* page 68 */
+{
+	m = moveinstr(i->op3, m);
+	if(i->i == 0)
+		bprint(i, "%s\t(R%d+R%d, %d), R%d", m, i->rs1, i->rs2, i->asi, i->rd);
+	else
+		bprint(i, "unknown ld asi %lux", i->w0);
+}
+
+static void
+store(Instr *i, char *m)		/* page 74 */
+{
+	m = moveinstr(i->op3, m);
+	if(i->i == 0)
+		bprint(i, "%s\tR%d, (R%d+R%d)",
+				m, i->rd, i->rs1, i->rs2);
+	else{
+		bprint(i, "%s\tR%d, ", m, i->rd);
+		address(i);
+	}
+}
+
+static void
+storea(Instr *i, char *m)		/* page 74 */
+{
+	m = moveinstr(i->op3, m);
+	if(i->i == 0)
+		bprint(i, "%s\tR%d, (R%d+R%d, %d)", m, i->rd, i->rs1, i->rs2, i->asi);
+	else
+		bprint(i, "%s\tR%d, %d(R%d, %d), ???", m, i->rd, i->simm13, i->rs1, i->asi);
+}
+
+static void
+shift(Instr *i, char *m)		/* page 88 */
+{
+	if(i->i == 0){
+		if(i->rs1 == i->rd)
+			if(dascase)
+				bprint(i, "%X\tR%d, R%d", m, i->rs1, i->rs2);
+			else
+				bprint(i, "%X\tR%d, R%d", m, i->rs2, i->rs1);
+		else
+			if(dascase)
+				bprint(i, "%X\tR%d, R%d, R%d", m, i->rs1, i->rs2, i->rd);
+			else
+				bprint(i, "%X\tR%d, R%d, R%d", m, i->rs2, i->rs1, i->rd);
+	}else{
+		if(i->rs1 == i->rd)
+			if(dascase)
+				bprint(i, "%X\t$%d,R%d", m, i->simm13&0x1F, i->rs1);
+			else
+				bprint(i, "%X\tR%d, $%d", m,  i->rs1, i->simm13&0x1F);
+		else
+			if(dascase)
+				bprint(i, "%X\tR%d, $%d, R%d",m,i->rs1,i->simm13&0x1F,i->rd);
+			else
+				bprint(i, "%X\t$%d, R%d, R%d",m,i->simm13&0x1F,i->rs1,i->rd);
+	}
+}
+
+static void
+add(Instr *i, char *m)			/* page 82 */
+{
+	if(i->i == 0){
+		if(dascase)
+			bprint(i, "%X\tR%d, R%d", m, i->rs1, i->rs2);
+		else
+			if(i->op3==2 && i->rs1==0 && i->rd)  /* OR R2, R0, R1 */
+				bprint(i, "MOVW\tR%d", i->rs2);
+			else
+				bprint(i, "%X\tR%d, R%d", m, i->rs2, i->rs1);
+	}else{
+		if(dascase)
+			bprint(i, "%X\tR%d, $%lux", m, i->rs1, i->simm13);
+		else
+			if(i->op3==0 && i->rd && i->rs1==0)	/* ADD $x, R0, R1 */
+				bprint(i, "MOVW\t$%lux", i->simm13);
+			else if(i->op3==0 && i->rd && i->rs1==2){
+				/* ADD $x, R2, R1 -> MOVW $x(SB), R1 */
+				bprint(i, "MOVW\t$");
+				address(i);
+			} else
+				bprint(i, "%X\t$%lux, R%d", m, i->simm13, i->rs1);
+	}
+	if(i->rs1 != i->rd)
+		bprint(i, ", R%d", i->rd);
+}
+
+static void
+cmp(Instr *i, char *m)
+{
+	if(dascase || i->rd){
+		add(i, m);
+		return;
+	}
+	if(i->i == 0)
+		bprint(i, "CMP\tR%d, R%d", i->rs1, i->rs2);
+	else
+		bprint(i, "CMP\tR%d, $%lux", i->rs1, i->simm13);
+}
+
+static char *regtab[4] = {
+	"Y",
+	"PSTATE",
+	"WIM",	/* XXX not any more */
+	"TT",
+};
+
+static void
+wr(Instr *i, char *m)			/* page 82 */
+{
+	if(dascase){
+		if(i->i == 0)
+			bprint(i, "%s\tR%d, R%d", m, i->rs1, i->rs2);
+		else
+			bprint(i, "%s\tR%d, $%lux", m, i->rs1, i->simm13);
+	}else{
+		if(i->i && i->simm13==0)
+			bprint(i, "MOVW\tR%d", i->rs1);
+		else if(i->i == 0)
+			bprint(i, "wr\tR%d, R%d", i->rs2, i->rs1);
+		else
+			bprint(i, "wr\t$%lux, R%d", i->simm13, i->rs1);
+	}
+	bprint(i, ", %s", regtab[i->op3&3]);
+}
+
+static void
+rd(Instr *i, char *m)			/* page 103 */
+{
+	if(i->rs1==15 && i->rd==0){
+		m = "stbar";
+		if(!dascase)
+			m = "STBAR";
+		bprint(i, "%s", m);
+	}else{
+		if(!dascase)
+			m = "MOVW";
+		bprint(i, "%s\t%s, R%d", m, regtab[i->op3&3], i->rd);
+	}
+}
+
+static void
+jmpl(Instr *i, char *m)			/* page 82 */
+{
+	if(i->i == 0){
+		if(i->rd == 15)
+			bprint(i, "%X\t(R%d+R%d)", "CALL", i->rs2, i->rs1);
+		else
+			bprint(i, "%X\t(R%d+R%d), R%d", m, i->rs2, i->rs1, i->rd);
+	}else{
+		if(!dascase && i->simm13==8 && i->rs1==15 && i->rd==0)
+			bprint(i, "RETURN");
+		else{
+			bprint(i, "%X\t", m);
+			address(i);
+			bprint(i, ", R%d", i->rd);
+		}
+	}
+}
+
+static void
+loadf(Instr *i, char *m)		/* page 70 */
+{
+	if(!dascase){
+		m = "FMOVD";
+		if(i->op3 == 0x20)
+			m = "FMOVF";
+		else if(i->op3 == 0x21)
+			m = "MOVW";
+	}
+	if(i->i == 0)
+		bprint(i, "%s\t(R%d+R%d)", m, i->rs1, i->rs2);
+	else{
+		bprint(i, "%s\t", m);
+		address(i);
+	}
+	if(i->op3 == 0x21)
+		bprint(i, ", FSR");
+	else
+		bprint(i, ", R%d", i->rd);
+}
+
+static
+void storef(Instr *i, char *m)		/* page 70 */
+{
+	if(!dascase){
+		m = "FMOVD";
+		if(i->op3 == 0x25 || i->op3 == 0x26)
+			m = "MOVW";
+		else if(i->op3 == 0x20)
+			m = "FMOVF";
+	}
+	bprint(i, "%s\t", m);
+	if(i->op3 == 0x25)
+		bprint(i, "FSR, ");
+	else if(i->op3 == 0x26)
+		bprint(i, "FQ, ");
+	else
+		bprint(i, "R%d, ", i->rd);
+	if(i->i == 0)
+		bprint(i, "(R%d+R%d)", i->rs1, i->rs2);
+	else
+		address(i);
+}
+
+static
+void loadc(Instr *i, char *m)		/* page 72 */
+{
+	if(i->i == 0)
+		bprint(i, "%s\t(R%d+R%d), C%d", m, i->rs1, i->rs2, i->rd);
+	else{
+		bprint(i, "%s\t", m);
+		address(i);
+		bprint(i, ", C%d", i->rd);
+	}
+}
+
+static
+void loadcsr(Instr *i, char *m)		/* page 72 */
+{
+	if(i->i == 0)
+		bprint(i, "%s\t(R%d+R%d), CSR", m, i->rs1, i->rs2);
+	else{
+		bprint(i, "%s\t", m);
+		address(i);
+		bprint(i, ", CSR");
+	}
+}
+
+static struct{
+	int	opf;
+	char	*name;
+} fptab1[] = {				/* ignores rs1 */
+	0xC4,	"FITOS",		/* page 109 */
+	0xC8,	"FITOD",
+	0xCC,	"FITOX",
+
+	0xD1,	"FSTOI",		/* page 110 */
+	0xD2,	"FDTOI",
+	0xD3,	"FXTOI",
+
+	0xC9,	"FSTOD",		/* page 111 */
+	0xCD,	"FSTOX",
+	0xC6,	"FDTOS",
+	0xCE,	"FDTOX",
+	0xC7,	"FXTOS",
+	0xCB,	"FXTOD",
+
+	0x01,	"FMOVS",		/* page 112 */
+	0x05,	"FNEGS",
+	0x09,	"FABSS",
+
+	0x29,	"FSQRTS", 		/* page 113 */
+	0x2A,	"FSQRTD",
+	0x2B,	"FSQRTX",
+
+	0,	0,
+};
+
+static struct{
+	int	opf;
+	char	*name;
+} fptab2[] = {				/* uses rs1 */
+
+	0x41,	"FADDS",		/* page 114 */
+	0x42,	"FADDD",
+	0x43,	"FADDX",
+	0x45,	"FSUBS",
+	0x46,	"FSUBD",
+	0x47,	"FSUBX",
+
+	0x49,	"FMULS",		/* page 115 */
+	0x4A,	"FMULD",
+	0x4B,	"FMULX",
+	0x4D,	"FDIVS",
+	0x4E,	"FDIVD",
+	0x4F,	"FDIVX",
+
+	0x51,	"FCMPS",		/* page 116 */
+	0x52,	"FCMPD",
+	0x53,	"FCMPX",
+	0x55,	"FCMPES",
+	0x56,	"FCMPED",
+	0x57,	"FCMPEX",
+
+	0, 0
+};
+
+static void
+fpop(Instr *i, char *m)			/* page 108-116 */
+{
+	int j;
+
+	if(dascase==0 && i->size==2){
+		bprint(i, "FMOVD\tF%d, F%d", i->rs2, i->rd);
+		return;
+	}
+	for(j=0; fptab1[j].name; j++)
+		if(fptab1[j].opf == i->opf){
+			bprint(i, "%X\tF%d, F%d", fptab1[j].name, i->rs2, i->rd);
+			return;
+		}
+	for(j=0; fptab2[j].name; j++)
+		if(fptab2[j].opf == i->opf){
+			bprint(i, "%X\tF%d, F%d, F%d", fptab2[j].name, i->rs1, i->rs2, i->rd);
+			return;
+		}
+	bprint(i, "%X%ux\tF%d, F%d, F%d", m, i->opf, i->rs1, i->rs2, i->rd);
+}
+
+static int
+sparc64foll(Map *map, ulong pc, Rgetter rget, ulong *foll)
+{
+	ulong w, r1, r2;
+	char buf[8];
+	Instr i;
+
+	mymap = map;
+	if (mkinstr(pc, &i) < 0)
+		return -1;
+	w = i.w0;
+	switch(w & 0xC1C00000){
+	case 0x00800000:		/* branch on int cond */
+	case 0x01800000:		/* branch on fp cond */
+	case 0x01C00000:		/* branch on copr cond */
+		foll[0] = pc+8;
+		foll[1] = pc + (i.simmdisp22<<2);
+		return 2;
+	}
+
+	if((w&0xC0000000) == 0x40000000){	/* CALL */
+		foll[0] = pc + (i.disp30<<2);
+		return 1;
+	}
+
+	if((w&0xC1F80000) == 0x81C00000){	/* JMPL */
+		sprint(buf, "R%ld", (w>>14)&0xF);
+		r1 = (*rget)(map, buf);
+		if(w & 0x2000)			/* JMPL R1+simm13 */
+			r2 = i.simm13;
+		else{				/* JMPL R1+R2 */
+			sprint(buf, "R%ld", w&0xF);
+			r2 = (*rget)(map, buf);
+		}
+		foll[0] = r1 + r2;
+		return 1;
+	}
+	foll[0] = pc+i.size*4;
+	return 1;
+}

+ 133 - 0
sys/src/libmach/uobj.c

@@ -0,0 +1,133 @@
+/*
+ * uobj.c - identify and parse a sparc64 object file
+ */
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include "uc/u.out.h"
+#include "obj.h"
+
+typedef struct Addr	Addr;
+struct Addr
+{
+	char	type;
+	char	sym;
+	char	name;
+};
+static Addr addr(Biobuf*);
+static char type2char(int);
+static	void	skip(Biobuf*, int);
+
+
+int
+_isu(char *s)
+{
+	return  s[0] == ANAME				/* ANAME */
+		&& s[1] == D_FILE			/* type */
+		&& s[2] == 1				/* sym */
+		&& s[3] == '<';				/* name of file */
+}
+
+
+int
+_readu(Biobuf *bp, Prog *p)
+{
+	int as, n;
+	Addr a;
+
+	as = Bgetc(bp);			/* as */
+	if(as < 0)
+		return 0;
+	p->kind = aNone;
+	if(as == ANAME || as == ASIGNAME){
+		if(as == ASIGNAME)
+			skip(bp, 4);	/* signature */
+		p->kind = aName;
+		p->type = type2char(Bgetc(bp));		/* type */
+		p->sym = Bgetc(bp);			/* sym */
+		n = 0;
+		for(;;) {
+			as = Bgetc(bp);
+			if(as < 0)
+				return 0;
+			n++;
+			if(as == 0)
+				break;
+		}
+		p->id = malloc(n);
+		if(p->id == 0)
+			return 0;
+		Bseek(bp, -n, 1);
+		if(Bread(bp, p->id, n) != n)
+			return 0;
+		return 1;
+	}
+	if(as == ATEXT)
+		p->kind = aText;
+	else if(as == AGLOBL)
+		p->kind = aData;
+	skip(bp, 5);		/* reg (1 byte); lineno (4 bytes) */
+	a = addr(bp);
+	addr(bp);
+	if(a.type != D_OREG || a.name != D_STATIC && a.name != D_EXTERN)
+		p->kind = aNone;
+	p->sym = a.sym;
+	return 1;
+}
+
+static Addr
+addr(Biobuf *bp)
+{
+	Addr a;
+	long off;
+
+	a.type = Bgetc(bp);	/* a.type */
+	skip(bp, 1);		/* reg */
+	a.sym = Bgetc(bp);	/* sym index */
+	a.name = Bgetc(bp);	/* sym type */
+	switch(a.type) {
+	default:
+	case D_NONE: case D_REG: case D_FREG: case D_CREG: case D_PREG:
+		break;
+	case D_BRANCH:
+	case D_OREG:
+	case D_ASI:
+	case D_CONST:
+		off = Bgetc(bp);
+		off |= Bgetc(bp) << 8;
+		off |= Bgetc(bp) << 16;
+		off |= Bgetc(bp) << 24;
+		if(off < 0)
+			off = -off;
+		if(a.sym!=0 && (a.name==D_PARAM || a.name==D_AUTO))
+			_offset(a.sym, off);
+		break;
+	case D_SCONST:
+		skip(bp, NSNAME);
+		break;
+	case D_FCONST:
+		skip(bp, 8);
+		break;
+	}
+	return a;
+}
+
+
+static char
+type2char(int t)
+{
+	switch(t){
+	case D_EXTERN:		return 'U';
+	case D_STATIC:		return 'b';
+	case D_AUTO:		return 'a';
+	case D_PARAM:		return 'p';
+	default:		return UNKNOWN;
+	}
+}
+
+static void
+skip(Biobuf *bp, int n)
+{
+	while (n-- > 0)
+		Bgetc(bp);
+}

+ 0 - 237
sys/src/libmach/xc/x.out.h

@@ -1,237 +0,0 @@
-#define	NSNAME	8
-#define	NSYM	50
-#define	NREG	27	/* r0-r22 + pc + pcsh + +n + -n */
-#define	NFREG	4
-#define	NCREG	16
-
-enum
-{
-	REGZERO		= 0,	/* always zero */
-	REGSP		= 1,	/* stack pointer */
-	REGRET		= 3,	/* return register and first temp, grows++ to REGMAX*/
-	REGMAX		= 12,
-	REGEXT		= 14,	/* first external register, grows-- to REGMAX+1 */
-	REGPTR		= 14,	/* last floating pointer register */
-	REGTMP		= 2,	/* used by the loader */
-	REGLINK		= 18,	/* subroutine linkage */
-	REGARG		= 3,	/* first arg passed in */
-
-	REGPC		= 23,	/* pc */
-	REGPCSH		= 24,	/* shadowd pc */
-	REGPOS		= 25,	/* +n */
-	REGNEG		= 26,	/* -n */
-	
-	FREGRET		= 0,
-	FREGEXT		= 0,	/* no external registers */
-	FREGTMP		= 3,	/* used by compiler only */
-/*
- * GENERAL:
- *
- * no static base register
- * compiler allocates R2 up as temps
- * compiler allocates external registers R14-R12
- * compiler allocates register variables F0-F3
- * compiler allocates external registers F3 down
- */
-};
-
-enum	as
-{
-	AXXX	= 0,
-
-	AADD,
-	AADDCR,
-	AADDCRH,
-	AADDH,
-	AAND,
-	AANDH,
-	AANDN,
-	AANDNH,
-	ABIT,
-	ABITH,
-	ACMP,
-	ACMPH,
-	ADIV,		/* macro op */
-	ADIVL,		/* macro op */
-	AMOVB,
-	AMOVBU,
-	AMOVHB,
-	AMOVW,
-	AMOVH,
-	AMOVHU,
-	AMOD,		/* macro op */
-	AMODL,		/* macro op */
-	AMUL,		/* macro op */
-	AOR,
-	AORH,
-	AROL,
-	AROLH,
-	AROR,
-	ARORH,
-	ASLL,
-	ASLLH,
-	ASRA,
-	ASRAH,
-	ASRL,
-	ASRLH,
-	ASUB,
-	ASUBH,
-	ASUBR,		/* reverse operand order sub */
-	ASUBRH,
-	AXOR,
-	AXORH,
-
-	ABRA,		/* conditional jump */
-	ACALL,
-	ADATA,
-	ADBRA,
-	ABMOVW,		/* macro op */
-	ADO,
-	ADOLOCK,
-	ADOEND,		/* end of do/dolock */
-	AGLOBL,
-	AGOK,
-	AHISTORY,
-	AIRET,
-	AJMP,		/* unconditional jump */
-	ANAME,
-	ANOP,
-	ARETURN,
-	ASFTRST,
-	ATEXT,
-	AWAITI,
-	AWORD,
-
-	AFADD,
-	AFADDN,
-	AFADDT,
-	AFADDTN,
-	AFDIV,		/* macro op */
-	AFDSP,
-	AFIFEQ,
-	AFIFGT,
-	AFIEEE,
-	AFIFLT,
-	AFMOVF,
-	AFMOVFN,
-	AFMOVFB,
-	AFMOVFW,
-	AFMOVFH,
-	AFMOVBF,
-	AFMOVWF,
-	AFMOVHF,
-	AFMADD,
-	AFMADDN,
-	AFMADDT,
-	AFMADDTN,
-	AFMSUB,
-	AFMSUBN,
-	AFMSUBT,
-	AFMSUBTN,
-	AFMUL,
-	AFMULN,
-	AFMULT,
-	AFMULTN,
-	AFRND,
-	AFSEED,
-	AFSUB,
-	AFSUBN,
-	AFSUBT,
-	AFSUBTN,
-
-	AEND
-};
-
-/* type/name */
-enum
-{
-	D_GOK	= 0,
-	D_NONE,
-
-/* name */
-	D_EXTERN,
-	D_STATIC,
-	D_AUTO,
-	D_PARAM,
-
-/* type */
-	D_BRANCH,
-	D_OREG,			/* for branching only */
-	D_NAME,
-	D_REG,
-	D_INDREG,
-	D_INC,
-	D_DEC,
-	D_INCREG,
-	D_CONST,
-	D_FCONST,
-	D_SCONST,
-	D_FREG,
-	D_CREG,
-	D_FILE,
-	D_LINE,
-	D_AFCONST,		/* address of floating constant */
-	D_FILE1,
-};
-
-/* conditions */
-enum{
-	CCXXX = 0,
-	CCTRUE,
-	CCFALSE,
-	CCEQ,
-	CCNE,
-	CCGT,
-	CCLE,
-	CCLT,
-	CCGE,
-	CCHI,		/* greater unsigned */
-	CCLS,		/* less or equal, unsigned */
-	CCCC,		/* greater or equal, unsigned */
-	CCCS,		/* less then, unsigned */
-	CCMI,
-	CCPL,
-	CCOC,
-	CCOS,
-	CCFNE,
-	CCFEQ,
-	CCFGE,
-	CCFLT,
-	CCFOC,
-	CCFOS,
-	CCFUC,
-	CCFUS,
-	CCFGT,
-	CCFLE,
-	CCIBE,
-	CCIBF,
-	CCOBE,
-	CCOBF,
-	CCSYC,
-	CCSYS,
-	CCFBC,
-	CCFBS,
-	CCIR0C,
-	CCIR0S,
-	CCIR1C,
-	CCIR1S,
-	CCEND
-};
-
-/*
- * this is the ranlib header
- */
-#define	SYMDEF	"__.SYMDEF"
-
-/*
- * this is the simulated dsp floating point
- */
-enum{
-	Dspbits	= 23,			/* bits in a dsp mantissa */
-	Dspmask	= (1<<Dspbits) - 1,	/* mask for mantissa */
-	Dspbias	= 128,			/* exponent bias */
-	Dspexp	= 0xff,			/* mask for eponent */
-};
-typedef	ulong	Dsp;	/* contains sign	0x80000000
-				    man		0x7fffff00
-				    exp		0x000000ff */