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/trampoline - 775 sys sys 1104121988 83293
 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/vmware - 775 sys sys 1049428256 453
 386/bin/aux/vmwarefs - 775 sys sys 1095563640 99117
@@ -549,7 +549,7 @@
 386/lib/libhttpd.a - 664 sys sys 1108268398 99488
 386/lib/libip.a - 664 sys sys 1108268398 35602
 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/libmemlayer.a - 664 sys sys 1108699740 47360
 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/ape - 20000000775 sys sys 947992106 0
 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/bin - 20000000775 sys sys 1018321186 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/kfs - 664 sys sys 1019527929 237
 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
 fd - 20000000775 sys sys 947958544 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/ape - 20000000775 sys sys 947992106 0
 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/doc - 20000000775 sys sys 1018471272 0
 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/watchfd - 775 sys sys 1112361039 361
 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.blank - 664 sys sys 1018469720 512
 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/venti - 664 sys sys 1069101926 5422
 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/index.html - 664 sys sys 1019918444 1859
 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/boot.c - 664 sys sys 1109364490 8418
 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/clock.c - 664 sys sys 1103641772 6425
 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/mkfile - 664 sys sys 1103641863 3105
 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/pbsdisk - 775 sys sys 1017854325 509
 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/cgen.c - 664 sys sys 1089299179 28257
 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/mkfile - 664 sys sys 944961353 264
 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/cgen.c - 664 sys sys 1089299176 28451
 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/mkfile - 664 sys sys 944960717 258
 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/ct65540.c - 664 sys sys 1014925007 5355
 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/et4000.c - 664 sys sys 1014925008 6720
 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/mach64.c - 664 sys sys 1014925009 8279
 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/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/notes.txt - 664 sys sys 1028334647 14376
 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/tvp3026.c - 664 sys sys 1014925013 3580
 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.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/vision864.c - 664 sys sys 1014925014 2325
 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/yywrap.c - 664 sys sys 944961728 85
 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/2db.c - 664 sys sys 1014929543 61245
 sys/src/libmach/2obj.c - 664 sys sys 1091732624 2335
 sys/src/libmach/5.c - 664 sys sys 984710422 1513
 sys/src/libmach/5db.c - 664 sys sys 1114218476 21530
 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/7db.c - 664 sys sys 1014929543 17320
 sys/src/libmach/7obj.c - 664 sys sys 1091732676 2367
 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/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/kdb.c - 664 sys sys 1014929544 21143
 sys/src/libmach/kobj.c - 664 sys sys 1091732625 2217
 sys/src/libmach/machdata.c - 664 sys sys 964540516 8814
 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/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/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/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/vcodas.c - 664 sys sys 1014929545 10253
 sys/src/libmach/vdb.c - 664 sys sys 1014929545 22248
 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/alloc.c - 664 sys sys 1046640198 3234
 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.rio - 664 glenda glenda 1019860628 6370
 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/9660srv - 775 sys sys 1113794389 103976
 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/ape - 20000000775 sys sys 1016944144 0
 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/uname - 775 sys sys 1087442505 132510
 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/ascii - 775 sys sys 1104121959 64668
 386/bin/astro - 775 sys sys 1104121959 138803
@@ -117,7 +117,7 @@
 386/bin/aux/mklatinkbd - 775 sys sys 1104121979 64179
 386/bin/aux/mnihongo - 775 sys sys 1106799170 138512
 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/mswordstrings - 775 sys sys 1104121980 65317
 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/trampoline - 775 sys sys 1104121988 83293
 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/vmware - 775 sys sys 1049428256 453
 386/bin/aux/vmwarefs - 775 sys sys 1095563640 99117
@@ -187,7 +187,7 @@
 386/bin/cpu - 775 sys sys 1108354550 137694
 386/bin/crop - 775 sys sys 1104121998 115763
 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/dd - 775 sys sys 1104121999 45347
 386/bin/deroff - 775 sys sys 1104122000 74244
@@ -224,7 +224,7 @@
 386/bin/faces - 775 sys sys 1106799174 192579
 386/bin/factor - 775 sys sys 1104122008 61475
 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/fortune - 775 sys sys 1104122009 67136
 386/bin/fossil - 20000000775 sys sys 1042005470 0
@@ -308,8 +308,8 @@
 386/bin/join - 775 sys sys 1113794393 114091
 386/bin/jpg - 775 sys sys 1108960009 174528
 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/lex - 775 sys sys 1104122033 98664
 386/bin/lnfs - 775 sys sys 1108354557 99449
@@ -342,7 +342,7 @@
 386/bin/netstat - 775 sys sys 1104122040 84385
 386/bin/news - 775 sys sys 1104122041 71653
 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/ns - 775 sys sys 1104122042 65260
 386/bin/p - 775 sys sys 1108268390 64990
@@ -360,7 +360,7 @@
 386/bin/ppm - 775 sys sys 1108960012 149347
 386/bin/pr - 775 sys sys 1104122046 77408
 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/ps - 775 sys sys 1104122047 65805
 386/bin/pwd - 775 sys sys 1104122047 36897
@@ -389,10 +389,10 @@
 386/bin/sed - 775 sys sys 1104122054 89523
 386/bin/seq - 775 sys sys 1104122054 38206
 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/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/snoopy - 775 sys sys 1108354563 157546
 386/bin/sort - 775 sys sys 1104122056 82285
@@ -425,7 +425,7 @@
 386/bin/topng - 775 sys sys 1108872012 138083
 386/bin/toppm - 775 sys sys 1104122065 164905
 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/trace - 775 sys sys 1106799181 180728
 386/bin/troff - 775 sys sys 1094040114 357714
@@ -549,7 +549,7 @@
 386/lib/libhttpd.a - 664 sys sys 1108268398 99488
 386/lib/libip.a - 664 sys sys 1108268398 35602
 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/libmemlayer.a - 664 sys sys 1108699740 47360
 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/ape - 20000000775 sys sys 947992106 0
 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/bin - 20000000775 sys sys 1018321186 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/kfs - 664 sys sys 1019527929 237
 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
 fd - 20000000775 sys sys 947958544 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/ape - 20000000775 sys sys 947992106 0
 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/doc - 20000000775 sys sys 1018471272 0
 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/watchfd - 775 sys sys 1112361039 361
 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.blank - 664 sys sys 1018469720 512
 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/venti - 664 sys sys 1069101926 5422
 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/index.html - 664 sys sys 1019918444 1859
 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/boot.c - 664 sys sys 1109364490 8418
 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/clock.c - 664 sys sys 1103641772 6425
 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/mkfile - 664 sys sys 1103641863 3105
 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/pbsdisk - 775 sys sys 1017854325 509
 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/cgen.c - 664 sys sys 1089299179 28257
 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/mkfile - 664 sys sys 944961353 264
 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/cgen.c - 664 sys sys 1089299176 28451
 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/mkfile - 664 sys sys 944960717 258
 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/ct65540.c - 664 sys sys 1014925007 5355
 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/et4000.c - 664 sys sys 1014925008 6720
 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/mach64.c - 664 sys sys 1014925009 8279
 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/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/notes.txt - 664 sys sys 1028334647 14376
 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/tvp3026.c - 664 sys sys 1014925013 3580
 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.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/vision864.c - 664 sys sys 1014925014 2325
 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/yywrap.c - 664 sys sys 944961728 85
 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/2db.c - 664 sys sys 1014929543 61245
 sys/src/libmach/2obj.c - 664 sys sys 1091732624 2335
 sys/src/libmach/5.c - 664 sys sys 984710422 1513
 sys/src/libmach/5db.c - 664 sys sys 1114218476 21530
 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/7db.c - 664 sys sys 1014929543 17320
 sys/src/libmach/7obj.c - 664 sys sys 1091732676 2367
 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/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/kdb.c - 664 sys sys 1014929544 21143
 sys/src/libmach/kobj.c - 664 sys sys 1091732625 2217
 sys/src/libmach/machdata.c - 664 sys sys 964540516 8814
 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/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/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/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/vcodas.c - 664 sys sys 1014929545 10253
 sys/src/libmach/vdb.c - 664 sys sys 1014929545 22248
 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/alloc.c - 664 sys sys 1046640198 3234
 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 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
+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
 alpha	- sys sys
 	+	- sys sys
+amd64	- sys sys
+	+	- sys sys
 arm	- sys sys
 	+	- sys sys
 mips	- sys sys
@@ -42,6 +44,8 @@ power	- sys sys
 	+	- sys sys
 sparc	- sys sys
 	+	- sys sys
+sparc64	- sys sys
+	+	- sys sys
 
 # everything else is owned by 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
 	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
 	bind plan9.ini.cd plan9.ini
 	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.
 This is useful on displays with small screens,
 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
 Change the display resolution:
 .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);
 				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++) {
 		if(trace)
 			print("dp %d...", dp->type);
-		start = mbroffset+GLONG(dp->start);
+		start = mbroffset/512+GLONG(dp->start);
 		end = start+GLONG(dp->len);
 
 		if(dp->type == PLAN9) {

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

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

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

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

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

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

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

@@ -74,7 +74,7 @@ addctlr(Vga* vga, char* val)
 		return *ctlr;	
 	}
 
-	error("dbctlr: unknown controller \"%s\" ctlr\n", val);
+	fprint(2, "dbctlr: unknown controller \"%s\" ctlr\n", val);
 	return 0;
 }
 
@@ -158,20 +158,25 @@ dbpci(Vga *vga, Ndbtuple *tuple)
 static void
 save(Vga *vga, Ndbtuple *tuple)
 {
+	Ctlr *c;
 	Ndbtuple *t;
 
 	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);
-		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);
 		else if(strcmp(t->attr, "clock") == 0)
 			vga->clock = addctlr(vga, t->val);
 		else if(strcmp(t->attr, "hwgc") == 0)
 			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);
 		else if(strcmp(t->attr, "membw") == 0)
 			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)
 {
 	char buf[256];
+	char *p;
 
 	/*
 	 * Set up for linear addressing: try to allocate the
@@ -109,11 +110,28 @@ linear(Vga* vga)
 		return;
 	}
 	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);
+		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);
-		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
 		vgactlw("linear", "0");
@@ -133,7 +151,8 @@ chanstr[32+1] = {
 void
 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;
 	Ctlr *ctlr;
 	Vga *vga;
@@ -220,6 +239,12 @@ main(int argc, char** argv)
 		error(usage, argv0);
 	}
 
+	if(lflag && strcmp(vsize, "text") == 0){
+		vesatextmode();
+		vgactlw("textmode", "");
+		exits(0);
+	}
+
 	vga = alloc(sizeof(Vga));
 	if(bios){
 		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
 	 * 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);
 		type = "vga";
 		vsize = psize = "640x480x1";
@@ -265,8 +292,14 @@ main(int argc, char** argv)
 		else
 			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);
+
 		if(virtual){
 			if((p = strchr(vsize, 'x')) == nil)
 				error("bad virtual size %s\n", vsize);
@@ -324,6 +357,10 @@ main(int argc, char** argv)
 			(*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){
 			if(ctlr->init == 0)
 				continue;
@@ -348,21 +385,38 @@ main(int argc, char** argv)
 					vga->ctlr->name, vga->vmz);
 
 			if(vga->ctlr->type)
-				vgactlw("type", vga->ctlr->type);
+				vtype = vga->ctlr->type;
 			else if(p = strchr(vga->ctlr->name, '-')){
 				strncpy(buf, vga->ctlr->name, p - vga->ctlr->name);
 				buf[p - vga->ctlr->name] = 0;
-				vgactlw("type", buf);
+				vtype = buf;
 			}
 			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
 			 * before size.
 			 */
 			linear(vga);
 
+			/*
+			 * Linear is over so switch to other driver for
+			 * acceleration.
+			 */
+			if(vga->vesa)
+				vgactlw("type", vtype);
+
 			sprint(buf, "%ludx%ludx%d %s",
 				vga->virtx, vga->virty,
 				vga->mode->z, vga->mode->chan);
@@ -376,19 +430,25 @@ main(int argc, char** argv)
 				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", "");
 
 			if(vga->hwgc == 0 || cflag)

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

@@ -51,6 +51,7 @@ OFILES=\
 	tvp3025clock.$O\
 	tvp3026.$O\
 	tvp3026clock.$O\
+	vesa.$O\
 	vga.$O\
 	virge.$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*	clock;
 	Ctlr*	hwgc;
+	Ctlr* vesa;
 	Ctlr*	link;
 	int	linear;
 	Attr*	attr;
@@ -412,6 +413,13 @@ extern void vgao(long, uchar);
 extern void vgaxo(long, uchar, uchar);
 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 */
 extern Ctlr virge;
 

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

@@ -3,7 +3,7 @@
  */
 #include <u.h>
 #include <bio.h>
-#include "xc/mips2ureg.h"
+#include "0c/ureg.h"
 #include <mach.h>
 
 #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
+ * also amd64 extensions
  */
 
 static	char	*i386excep(Map*, Rgetter);
@@ -35,6 +36,9 @@ static char *excname[] =
 [13]	"general protection violation",
 [14]	"page fault",
 [16]	"math coprocessor error",
+[17]	"alignment check",
+[18]	"machine check",
+[19]	"floating-point exception",
 [24]	"clock",
 [25]	"keyboard",
 [27]	"modem status",
@@ -166,17 +170,22 @@ struct	Instr
 	char	*prefix;	/* instr prefix */
 	char	*segment;	/* segment override */
 	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	reg;		/* bits 3-5 of mod r/m field */
 	char	ss;		/* bits 6-7 of SIB */
 	char	index;		/* bits 3-5 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 */
 	ulong	disp;		/* displacement */
 	ulong 	imm;		/* immediate */
 	ulong 	imm2;		/* second immediate operand */
+	uvlong	imm64;	/* big immediate */
 	char	*curr;		/* fill level in output buffer */
 	char	*end;		/* end of output buffer */
 	char	*err;		/* error message */
@@ -192,7 +201,26 @@ enum{
 	BP,
 	SI,
 	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 */
 /*
 %A	-	address size register modifier (!asize -> 'E')
@@ -202,7 +230,7 @@ enum{
 %O	-	Operand size register modifier (!osize -> 'E')
 %T	-	Test register TR6/TR7
 %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
 %e	-	effective address - Mod R/M value
 %f	-	floating point register F0-F7 - from Mod R/M register
@@ -210,7 +238,7 @@ enum{
 %i	-	immediate operand 8-32 bits
 %p	-	PC-relative - signed displacement in immediate field
 %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;
@@ -227,6 +255,7 @@ enum {
 	Iw,			/* 16-bit immediate -> imm */
 	Iw2,			/* 16-bit immediate -> imm2 */
 	Iwd,			/* Operand-sized immediate (no sign extension)*/
+	Iwdq,		/* Operand-sized immediate, possibly 64 bits */
 	Awd,			/* Address offset */
 	Iwds,			/* Operand-sized immediate (sign extended) */
 	RM,			/* Word or long R/M field with register (/r) */
@@ -244,7 +273,9 @@ enum {
 	OA,			/* literal 0x0a byte */
 	PTR,			/* Seg:Displacement addr (ptr16:16 or ptr16:32) */
 	AUX,			/* Multi-byte op code - Auxiliary table */
+	AUXMM,		/* multi-byte op code - auxiliary table chosen by prefix */
 	PRE,			/* Instr Prefix */
+	OPRE,		/* Instr Prefix or media op extension */
 	SEG,			/* Segment Prefix */
 	OPOVER,			/* Operand size override */
 	ADDOVER,		/* Address size override */
@@ -268,8 +299,27 @@ static Optable optab0F01[8]=
 [0x03]	0,0,		"MOVL	%e,IDTR",
 [0x04]	0,0,		"MOVW	MSW,%e",	/* 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]=
 {
 [0x04]	Ib,0,		"BT%S	%i,%e",
@@ -278,6 +328,121 @@ static Optable optab0FBA[8]=
 [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]=
 {
 [0x00]	RMOP,0,		optab0F00,
@@ -285,17 +450,36 @@ static Optable optab0F[256]=
 [0x02]	RM,0,		"LAR	%e,%r",
 [0x03]	RM,0,		"LSL	%e,%r",
 [0x06]	0,0,		"CLTS",
+[0x07]	0,0,		"SYSRET",
 [0x08]	0,0,		"INVD",
 [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",
 [0x21]	RMR,0,		"MOVL	%D,%e",
 [0x22]	RMR,0,		"MOVL	%e,%C",
 [0x23]	RMR,0,		"MOVL	%e,%D",
 [0x24]	RMR,0,		"MOVL	%T,%e",
 [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",
 [0x31]	0,0,		"RDTSC",
 [0x32]	0,0,		"RDMSR",
+[0x33]	0,0,		"RDPMC",
 [0x42]	RM,0,		"CMOVC	%e,%r",		/* CF */
 [0x43]	RM,0,		"CMOVNC	%e,%r",		/* ¬ CF */
 [0x44]	RM,0,		"CMOVZ	%e,%r",		/* ZF */
@@ -310,6 +494,94 @@ static Optable optab0F[256]=
 [0x4D]	RM,0,		"CMOVGE	%e,%r",		/* GE ≡ ZF ∨ SF */
 [0x4E]	RM,0,		"CMOVLE	%e,%r",		/* LE ≡ ZF ∨ LT */
 [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",
 [0x81]	Iwds,0,		"JOC	%p",
 [0x82]	Iwds,0,		"JCS	%p",
@@ -366,6 +638,7 @@ static Optable optab0F[256]=
 [0xbd]	RM,0,		"BSR%S	%e,%r",
 [0xbe]	RMB,0,		"MOVBSX	%e,%R",
 [0xbf]	RM,0,		"MOVWSX	%e,%R",
+[0xc7]	RMOP,0,		optab0FC7,
 };
 
 static Optable optab80[8]=
@@ -679,7 +952,7 @@ static Optable optabFF[8] =
 [0x06]	0,0,		"PUSHL	%e",
 };
 
-static Optable optable[256] =
+static Optable optable[256+1] =
 {
 [0x00]	RMB,0,		"ADDB	%r,%e",
 [0x01]	RM,0,		"ADD%S	%r,%e",
@@ -696,7 +969,7 @@ static Optable optable[256] =
 [0x0c]	Ib,0,		"ORB	%i,AL",
 [0x0d]	Iwd,0,		"OR%S	%i,%OAX",
 [0x0e]	0,0,		"PUSHL	CS",
-[0x0f]	AUX,0,		optab0F,
+[0x0f]	AUXMM,0,		optab0F,
 [0x10]	RMB,0,		"ADCB	%r,%e",
 [0x11]	RM,0,		"ADC%S	%r,%e",
 [0x12]	RMB,0,		"ADCB	%e,%r",
@@ -832,8 +1105,8 @@ static Optable optable[256] =
 [0x95]	0,0,		"XCHG	%OBP,%OAX",
 [0x96]	0,0,		"XCHG	%OSI,%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",
 [0x9b]	0,0,		"WAIT",
 [0x9c]	0,0,		"PUSHF",
@@ -864,14 +1137,14 @@ static Optable optable[256] =
 [0xb5]	Ib,0,		"MOVB	%i,CH",
 [0xb6]	Ib,0,		"MOVB	%i,DH",
 [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,
 [0xc1]	RMOP,0,		optabC1,
 [0xc2]	Iw,0,		"RET	%i",
@@ -920,8 +1193,8 @@ static Optable optable[256] =
 [0xee]	0,0,		"OUTB	AL,DX",
 [0xef]	0,0,		"OUT%S	%OAX,DX",
 [0xf0]	PRE,0,		"LOCK",
-[0xf2]	PRE,0,		"REPNE",
-[0xf3]	PRE,0,		"REP",
+[0xf2]	OPRE,0,		"REPNE",
+[0xf3]	OPRE,0,		"REP",
 [0xf4]	0,0,		"HALT",
 [0xf5]	0,0,		"CMC",
 [0xf6]	RMOPB,0,	optabF6,
@@ -934,6 +1207,7 @@ static Optable optable[256] =
 [0xfd]	0,0,		"STD",
 [0xfe]	RMOPB,0,	optabFE,
 [0xff]	RMOP,0,		optabFF,
+[0x100]	RM,0,		"MOVLQSX	%r,%e",
 };
 
 /*
@@ -992,8 +1266,27 @@ igetl(Map *map, Instr *ip, ulong *lp)
 	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
-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;
 	ushort s;
@@ -1011,6 +1304,8 @@ getdisp(Map *map, Instr *ip, int mod, int rm, int code)
 		if (ip->asize == 'E') {
 			if (igetl(map, ip, &ip->disp) < 0)
 				return -1;
+			if (mod == 0)
+				ip->rip = pcrel;
 		} else {
 			if (igets(map, ip, &s) < 0)
 				return -1;
@@ -1035,11 +1330,11 @@ modrm(Map *map, Instr *ip, uchar c)
 	ip->mod = mod;
 	ip->base = rm;
 	ip->reg = (c>>3)&7;
+	ip->rip = 0;
 	if (mod == 3)			/* register */
 		return 1;
 	if (ip->asize == 0) {		/* 16-bit mode */
-		switch(rm)
-		{
+		switch(rm) {
 		case 0:
 			ip->base = BX; ip->index = SI;
 			break;
@@ -1067,7 +1362,7 @@ modrm(Map *map, Instr *ip, uchar c)
 		default:
 			break;
 		}
-		return getdisp(map, ip, mod, rm, 6);
+		return getdisp(map, ip, mod, rm, 6, 0);
 	}
 	if (rm == 4) {	/* scummy sib byte */
 		if (igetc(map, ip, &c) < 0)
@@ -1077,21 +1372,22 @@ modrm(Map *map, Instr *ip, uchar c)
 		if (ip->index == 4)
 			ip->index = -1;
 		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 *
 mkinstr(Map *map, Instr *ip, ulong pc)
 {
-	int i, n;
+	int i, n, norex;
 	uchar c;
 	ushort s;
 	Optable *op, *obase;
 	char buf[128];
 
 	memset(ip, 0, sizeof(*ip));
+	norex = 1;
 	ip->base = -1;
 	ip->index = -1;
 	if(asstype == AI8086)
@@ -1099,13 +1395,27 @@ mkinstr(Map *map, Instr *ip, ulong pc)
 	else {
 		ip->osize = 'L';
 		ip->asize = 'E';
+		ip->amd64 = asstype != AI386;
+		norex = 0;
 	}
 	ip->addr = pc;
 	if (igetc(map, ip, &c) < 0)
 		return 0;
 	obase = optable;
 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];
+hack:
 	if (op->proto == 0) {
 badop:
 		n = snprint(buf, sizeof(buf), "opcode: ??");
@@ -1116,8 +1426,7 @@ badop:
 		return 0;
 	}
 	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)*/
 			if (igetc(map, ip, &c) < 0)
 				return 0;
@@ -1154,10 +1463,31 @@ badop:
 				return 0;
 			ip->imm2 = s&0xffff;
 			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 (igetl(map, ip, &ip->imm) < 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 {
 				if (igets(map, ip, &s)< 0)
 					return 0;
@@ -1168,6 +1498,7 @@ badop:
 			if (ip->asize == 'E') {
 				if (igetl(map, ip, &ip->imm) < 0)
 					return 0;
+				/* TO DO: REX */
 			} else {
 				if (igets(map, ip, &s)< 0)
 					return 0;
@@ -1287,15 +1618,35 @@ badop:
 				return 0;
 			ip->jumptype = PTR;
 			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 */
 			obase = (Optable*)op->proto;
 			if (igetc(map, ip, &c) < 0)
 				return 0;
 			goto newop;
+		case OPRE:	/* Instr Prefix or media op */
+			ip->opre = c;
+			/* fall through */
 		case PRE:	/* Instr Prefix */
 			ip->prefix = (char*)op->proto;
 			if (igetc(map, ip, &c) < 0)
 				return 0;
+			if (ip->opre && c == 0x0F)
+				ip->prefix = 0;
 			goto newop;
 		case SEG:	/* Segment Prefix */
 			ip->segment = (char*)op->proto;
@@ -1303,9 +1654,14 @@ badop:
 				return 0;
 			goto newop;
 		case OPOVER:	/* Operand size override */
+			ip->opre = c;
 			ip->osize = 'W';
 			if (igetc(map, ip, &c) < 0)
 				return 0;
+			if (c == 0x0F)
+				ip->osize = 'L';
+			else if (ip->amd64 && (c&0xF0) == 0x40)
+				ip->osize = 'Q';
 			goto newop;
 		case ADDOVER:	/* Address size override */
 			ip->asize = 0;
@@ -1353,9 +1709,21 @@ static char *reg[] =  {
 [BP]	"BP",
 [SI]	"SI",
 [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 *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 void
@@ -1446,12 +1814,12 @@ issymref(Instr *ip, Symbol *s, long w, long val)
 }
 
 static void
-immediate(Instr *ip, long val)
+immediate(Instr *ip, vlong val)
 {
 	Symbol s;
 	long w;
 
-	if (findsym(val, CANY, &s)) {
+	if (findsym((long)val, CANY, &s)) {	/* TO DO */
 		w = val - s.value;
 		if (w < 0)
 			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
@@ -1482,7 +1853,9 @@ pea(Instr *ip)
 {
 	if (ip->mod == 3) {
 		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
 			bprint(ip, "%s%s", ANAME(ip), reg[ip->base]);
 		return;
@@ -1496,23 +1869,26 @@ pea(Instr *ip)
 			immediate(ip, ip->disp);
 		else {
 			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)
-		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
 prinstr(Instr *ip, char *fmt)
 {
+	vlong v;
+
 	if (ip->prefix)
 		bprint(ip, "%s ", ip->prefix);
 	for (; *fmt && ip->curr < ip->end; fmt++) {
-		if (*fmt != '%')
+		if (*fmt != '%'){
 			*ip->curr++ = *fmt;
-		else switch(*++fmt)
-		{
+			continue;
+		}
+		switch(*++fmt){
 		case '%':
 			*ip->curr++ = '%';
 			break;
@@ -1537,13 +1913,29 @@ prinstr(Instr *ip, char *fmt)
 			break;
 		case 'i':
 			bprint(ip, "$");
-			immediate(ip,ip->imm);
+			v = ip->imm;
+			if(ip->rex & REXW)
+				v = ip->imm64;
+			immediate(ip, v);
 			break;
 		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;
 		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;
 		case 'T':
 			if (ip->reg == 6 || ip->reg == 7)
@@ -1551,8 +1943,10 @@ prinstr(Instr *ip, char *fmt)
 			else
 				bprint(ip, "???");
 			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");
 			else
 				bprint(ip, "CBW");
@@ -1560,6 +1954,20 @@ prinstr(Instr *ip, char *fmt)
 		case 'd':
 			bprint(ip,"%lux:%lux",ip->seg,ip->disp);
 			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':
 			pea(ip);
 			break;
@@ -1577,16 +1985,34 @@ prinstr(Instr *ip, char *fmt)
 			break;
 		case 'r':
 			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
-				bprint(ip, reg[ip->reg]);
+				bprint(ip, reg[ip->rex&REXR? ip->reg+8: ip->reg]);
 			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");
 			else
 				bprint(ip, "CWD");
 			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:
 			bprint(ip, "%%%c", *fmt);
 			break;
@@ -1678,18 +2104,18 @@ i386foll(Map *map, ulong pc, Rgetter rget, ulong *foll)
 	case JUMP:		/* JUMP or CALL EA */
 
 		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;
 		}
 			/* calculate the effective address */
 		addr = i.disp;
 		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;
 			addr += l;
 		}
 		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;
 			addr += l*(1<<i.ss);
 		}

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

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

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

@@ -57,8 +57,10 @@ extern	Mach	mmips;
 extern	Mach	mmips2le;
 extern	Mach	mmips2be;
 extern	Mach	msparc;
+extern	Mach	msparc64;
 extern	Mach	m68020;
 extern	Mach	mi386;
+extern	Mach	mamd64;
 extern	Mach	marm;
 extern	Mach	mpower;
 extern	Mach	malpha;
@@ -121,6 +123,14 @@ ExecTable exectab[] =
 		sizeof(struct sparcexec),
 		beswal,
 		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 */
 		"68020 plan 9 executable",
 		"68020 plan 9 dlm",
@@ -145,6 +155,14 @@ ExecTable exectab[] =
 		sizeof(Exec),
 		beswal,
 		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 */
 		"power plan 9 executable",
 		"power plan 9 dlm",
@@ -154,7 +172,7 @@ ExecTable exectab[] =
 		beswal,
 		common },
 	{ ELF_MAG,			/* any elf32 */
-		"Elf executable",
+		"elf executable",
 		nil,
 		FNONE,
 		&mi386,
@@ -162,15 +180,15 @@ ExecTable exectab[] =
 		noswal,
 		elfdotout },
 	{ E_MAGIC,			/* Arm 5.out */
-		"Arm plan 9 executable",
-		"Arm plan 9 dlm",
+		"arm plan 9 executable",
+		"arm plan 9 dlm",
 		FARM,
 		&marm,
 		sizeof(Exec),
 		beswal,
 		common },
 	{ (143<<16)|0413,		/* (Free|Net)BSD Arm */
-		"Arm *BSD executable",
+		"arm *bsd executable",
 		nil,
 		FARM,
 		&marm,
@@ -506,10 +524,18 @@ elfdotout(int fd, Fhdr *fp, ExecHdr *hp)
 		mach = &mmips;
 		fp->type = FMIPS;
 		break;
+	case SPARC64:
+		mach = &msparc64;
+		fp->type = FSPARC64;
+		break;
 	case POWER:
 		mach = &mpower;
 		fp->type = FPOWER;
 		break;
+	case AMD64:
+		mach = &mamd64;
+		fp->type = FAMD64;
+		break;
 	default:
 		return 0;
 	}
@@ -542,6 +568,29 @@ elfdotout(int fd, Fhdr *fp, ExecHdr *hp)
 			is = i;
 	}
 	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");
 		free(ph);
 		return 0;

+ 8 - 3
sys/src/libmach/mkfile

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

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

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

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

@@ -5,7 +5,7 @@
 
 /*
  * PowerPC-specific debugger interface
- *	forsyth@plan9.cs.york.ac.uk
+ *	forsyth@terzarima.net
  */
 
 static	char	*powerexcep(Map*, Rgetter);
@@ -584,7 +584,7 @@ sub(Opcode *o, Instr *i)
 }
 
 static void
-div(Opcode *o, Instr *i)
+qdiv(Opcode *o, Instr *i)
 {
 	format(o->mnemonic, i, 0);
 	if(i->op == 31)
@@ -728,11 +728,13 @@ static Opcode opcodes[] = {
 	{31,	278,	ALL,	"DCBT",		dcb,	0},
 	{31,	246,	ALL,	"DCBTST",	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 */
 	{9,	0,	0,	"DOZ",		gen,	ir2i},	/* POWER */
@@ -820,6 +822,8 @@ static Opcode opcodes[] = {
 	{31,	339,	ALL,	"MOVW",		gen,	"%P,R%d"},
 	{31,	595,	ALL,	"MOVW",		gen,	"SEG(%a),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"},
 	{63,	70,	ALL,	"MTFSB0%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,	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 */
 
@@ -848,6 +852,7 @@ static Opcode opcodes[] = {
 	{25,	0,	0,	"OR",		shifted, 0},
 
 	{19,	50,	ALL,	"RFI",		gen,	0},
+	{19,	51,	ALL,	"RFCI",		gen,	0},
 
 	{22,	0,	0,	"RLMI%C",	gencc,	rlim},	/* POWER */
 	{20,	0,	0,	"RLWMI%C",	gencc,	rlimi},
@@ -984,6 +989,7 @@ static	Spr	sprname[] = {
 	{981, "ICMP"},
 	{982, "RPA"},
 	{1010, "IABR"},
+	{1013, "DABR"},
 	{0,0},
 };
 
@@ -1083,6 +1089,11 @@ format(char *mnemonic, Instr *i, char *f)
 				bprint(i, "SPR(%d)", n);
 			break;
 
+		case 'Q':
+			n = ((i->spr&0x1f)<<5)|((i->spr>>5)&0x1f);
+			bprint(i, "%d", n);
+			break;
+
 		case 'n':
 			bprint(i, "%d", i->nb==0? 32: i->nb);	/* eg, pg 10-103 */
 			break;

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

@@ -16,10 +16,10 @@ struct machtab
 	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,
-			armmach, mipsmach2le, powermach, alphamach;
+			armmach, mipsmach2le, powermach, alphamach, sparc64mach;
 
 /*
  *	machine selection table.  machines with native disassemblers should
@@ -88,6 +88,12 @@ Machtab	machines[] =
 		AI8086,
 		&mi386,
 		&i386mach,	},
+	{	"amd64",				/* amd64 */
+		FAMD64,
+		FI386B,
+		AAMD64,
+		&mamd64,
+		&i386mach,	},
 	{	"arm",				/*ARM*/
 		FARM,
 		FNONE,
@@ -106,6 +112,12 @@ Machtab	machines[] =
 		AALPHA,
 		&malpha,
 		&alphamach,	},
+	{	"sparc64",			/*plan 9 sparc64 */
+		FSPARC64,
+		FSPARCB,			/* XXX? */
+		ASPARC64,
+		&msparc64,
+		&sparc64mach,	},
 	{	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 */