Add sparc patches from Jakub Jelinek
diff --git a/CREDITS b/CREDITS
index 1d7717c..c9afc1c 100644
--- a/CREDITS
+++ b/CREDITS
@@ -33,4 +33,4 @@
 	David Mosberger-Tang <davidm@AZStarNet.com>
 	Ulrich Drepper <drepper@cygnus.com>
 	Nate Eldredge <nate@cartsys.com>
-
+	Jakub Jelinek <jj@ultra.linux.cz>
diff --git a/ChangeLog b/ChangeLog
index f4a7f6d..4b8596e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+Wed Jun  2 18:30:12 CEST 1999 Jakub Jelinek <jj@ultra.linux.cz>
+
+  * system.c: sys_umount2 syscall support.
+  * linux/sparc/errnoent.h: Update sparc-linux errnos.
+  * linux/sparc/syscall.h: Update used sparc-linux syscalls.
+  * linux/sparc/syscallent.h: Match 2.2.9 system calls.
+  * file.c: sparc-linux asm/stat.h uses dev_t etc. types,
+    so it needs strace's own copy of the stat structure.
+  * util.c: Make it compile on sparc-linux.
+  * strace.c: Fix strace -f and -ff operation on sparc-linux.
+  * signal.c: rt_sigaction has different arguments on sparc*-linux
+    and alpha-linux.
+  * syscall.c: Recognize sparc64-linux binaries.
+
 Fri May 28 21:09:00 PST Ulrich Drepper <drepper@cygnus.com>
 
   * configure.in: Fix typo (CFLAG -> CFLAGS).
diff --git a/file.c b/file.c
index 199ecd5..72d0a9e 100644
--- a/file.c
+++ b/file.c
@@ -42,7 +42,32 @@
 #endif
 
 #ifdef linux
-#  include <asm/stat.h>
+#  ifdef LINUXSPARC
+struct stat {
+	unsigned short	st_dev;
+	unsigned int	st_ino;
+	unsigned short	st_mode;
+	short		st_nlink;
+	unsigned short	st_uid;
+	unsigned short	st_gid;
+	unsigned short	st_rdev;
+	unsigned int	st_size;
+	int		st_atime;
+	unsigned int	__unused1;
+	int		st_mtime;
+	unsigned int	__unused2;
+	int		st_ctime;
+	unsigned int	__unused3;
+	int		st_blksize;
+	int		st_blocks;
+	unsigned int	__unused4[2];
+};
+#    define stat kernel_stat
+#    include <asm/stat.h>
+#    undef stat
+#  else
+#    include <asm/stat.h>
+#  endif
 #  define stat libc_stat
 #  include <sys/stat.h>
 #  undef stat
diff --git a/linux/alpha/syscallent.h b/linux/alpha/syscallent.h
index 03bf273..1fb939f 100644
--- a/linux/alpha/syscallent.h
+++ b/linux/alpha/syscallent.h
@@ -50,7 +50,7 @@
 	{ 3,	TF,	sys_lseek,		"lseek"		}, /* 19 */
 	{ 0,	0,	sys_getpid,		"getxpid"	}, /* 20 */
 	{ 4,	0,	printargs,		"osf_mount"	}, /* 21 */
-	{ 2,	0,	sys_umount,		"umount"	}, /* 22 */
+	{ 2,	0,	sys_umount2,		"umount"	}, /* 22 */
 	{ 1,	0,	sys_setuid,		"setuid"	}, /* 23 */
 	{ 0,	0,	sys_getuid,		"getxuid"	}, /* 24 */
 	{ 5,	0,	printargs,		"SYS_25"	}, /* 25 */
@@ -349,7 +349,7 @@
 	{ 1,	0,	sys_sysinfo,		"sysinfo"	}, /* 318 */
 	{ 1,	0,	sys_sysctl,		"sysctl"	}, /* 319 */
 	{ 0,	0,	sys_idle,		"idle"		}, /* 320 */
-	{ 1,	0,	printargs,		"oldumount"	}, /* 321 */
+	{ 1,	0,	sys_umount,		"oldumount"	}, /* 321 */
 	{ 1,	0,	sys_swapon,		"swapon"	}, /* 322 */
 	{ 1,	0,	sys_times,		"times"		}, /* 323 */
 	{ 1,	0,	sys_personality,	"personality"	}, /* 324 */
diff --git a/linux/powerpc/syscallent.h b/linux/powerpc/syscallent.h
index 9c22520..ef24c4c 100644
--- a/linux/powerpc/syscallent.h
+++ b/linux/powerpc/syscallent.h
@@ -50,7 +50,7 @@
 	{ 3,	TF,	sys_lseek,		"lseek"			}, /* 19 */
 	{ 0,	0,	sys_getpid,		"getpid"		}, /* 20 */
 	{ 5,	TF,	sys_mount,		"mount"			}, /* 21 */
-	{ 1,	0,	sys_umount,		"umount"		}, /* 22 */
+	{ 1,	0,	sys_umount,		"oldumount"		}, /* 22 */
 	{ 1,	0,	sys_setuid,		"setuid"		}, /* 23 */
 	{ 0,	0,	sys_getuid,		"getuid"		}, /* 24 */
 	{ 1,	0,	sys_stime,		"stime"			}, /* 25 */
@@ -80,7 +80,7 @@
 	{ 0,	0,	printargs,		"geteuid"		}, /* 49 */
 	{ 0,	0,	printargs,		"getegid"		}, /* 50 */
 	{ 1,	TF,	sys_acct,		"acct"			}, /* 51 */
-	{ 2,	0,	printargs,		"umount2"		}, /* 52 */
+	{ 2,	0,	sys_umount2,		"umount"		}, /* 52 */
 	{ 5,	0,	printargs,		"lock"			}, /* 53 */
 	{ 3,	0,	sys_ioctl,		"ioctl"			}, /* 54 */
 	{ 3,	0,	sys_fcntl,		"fcntl"			}, /* 55 */
diff --git a/linux/sparc/errnoent.h b/linux/sparc/errnoent.h
index cca460e..d243699 100644
--- a/linux/sparc/errnoent.h
+++ b/linux/sparc/errnoent.h
@@ -123,3 +123,5 @@
 	"EILSEQ", /* 122 */
 	"ELIBMAX", /* 123 */
 	"ELIBSCN", /* 124 */
+	"ENOMEDIUM", /* 125 */
+	"EMEDIUMTYPE", /* 126 */
diff --git a/linux/sparc/syscall.h b/linux/sparc/syscall.h
index 9c7f46c..1857f90 100644
--- a/linux/sparc/syscall.h
+++ b/linux/sparc/syscall.h
@@ -44,7 +44,7 @@
 
 /* 1.2 memory management */
 int	sys_brk(),sys_sbrk(),sys_sstk();
-int	sys_getpagesize(),sys_mmap(),sys_mctl(),sys_munmap(),sys_mprotect(),sys_mincore();
+int	sys_getpagesize(),sys_mmap(),sys_mctl(),sys_munmap(),sys_mprotect(),sys_mincore(), sys_mremap();
 int	sys_omsync(),sys_omadvise();
 
 /* 1.3 signals */
@@ -58,7 +58,7 @@
 
 /* 1.5 descriptors */
 int	sys_getdtablesize(),sys_dup(),sys_dup2(),sys_close();
-int	sys_select(),sys_getdopt(),sys_setdopt(),sys_fcntl(),sys_flock();
+int	sys_oldselect(),sys_select(),sys_getdopt(),sys_setdopt(),sys_fcntl(),sys_flock();
 
 /* 1.6 resource controls */
 int	sys_getpriority(),sys_setpriority(),sys_getrusage(),sys_getrlimit(),sys_setrlimit();
@@ -84,7 +84,7 @@
 int	sys_creat(),sys_open(),sys_mknod(),sys_unlink(),sys_stat(),sys_fstat(),sys_lstat();
 int	sys_chown(),sys_fchown(),sys_chmod(),sys_fchmod(),sys_utimes();
 int	sys_link(),sys_symlink(),sys_readlink(),sys_rename();
-int	sys_lseek(),sys_truncate(),sys_ftruncate(),sys_access(),sys_fsync();
+int	sys_lseek(),sys_truncate(),sys_ftruncate(),sys_access(),sys_fsync(),sys_sysctl();
 int	sys_statfs(),sys_fstatfs(),sys_msync();
 
 /* 2.3 communications */
@@ -93,6 +93,13 @@
 int	sys_sendmsg(),sys_recvmsg(),sys_shutdown(),sys_setsockopt(),sys_getsockopt();
 int	sys_getsockname(),sys_getpeername(),sys_pipe();
 
+int sys_setresuid(), sys_setresgid(), sys_getresuid(), sys_getresgid(), sys_pread();
+int sys_pwrite(), sys_getcwd();
+int sys_sigaltstack(), sys_rt_sigprocmask(), sys_rt_sigaction();
+int sys_rt_sigpending(), sys_rt_sigsuspend(), sys_rt_sigqueueinfo();
+int sys_rt_sigtimedwait(), sys_prctl(), sys_poll();
+int sys_sendfile(), sys_query_module(), sys_capget(), sys_capset();
+
 int	sys_umask();		/* XXX */
 
 /* 2.3.1 SystemV-compatible IPC */
@@ -150,6 +157,7 @@
 int	sys_owait();		/* should use wait4 interface */
 int	sys_owait3();		/* should use wait4 interface */
 int	sys_umount();		/* still more Sys V (and 4.2?) compatibility */
+int	sys_umount2();
 int	sys_pathconf();		/* posix */
 int	sys_fpathconf();		/* posix */
 int	sys_sysconf();		/* posix */
diff --git a/linux/sparc/syscallent.h b/linux/sparc/syscallent.h
index 3b85e1c..161814a 100644
--- a/linux/sparc/syscallent.h
+++ b/linux/sparc/syscallent.h
@@ -11,22 +11,22 @@
 	{ 1,	TF,	sys_unlink,	"unlink" },		/* 10 */
 	{ 2,    TF|TP,	sys_execv,	"execv" },		/* 11 */
 	{ 1,	TF,	sys_chdir,	"chdir" },		/* 12 */
-        { 0,    0,      printargs,      "sunos-time!"},		/* 13 */
+        { 3,    TF,     sys_chown,      "chown"},		/* 13 */
 	{ 3,	TF,	sys_mknod,	"mknod" },		/* 14 */
 	{ 2,	TF,	sys_chmod,	"chmod" },		/* 15 */
-	{ 3,	TF,	sys_chown,	"chown" },		/* 16 */
+	{ 3,	TF,	sys_chown,	"lchown" },		/* 16 */
 	{ 1,	0,	sys_brk,	"brk" },		/* 17 */
-	{ 2,	0,	printargs,	"SYS_18" },		/* 18 */
+	{ 2,	0,	printargs,	"perfctr" },		/* 18 */
 	{ 3,	0,	sys_lseek,	"lseek" },		/* 19 */
 	{ 0,	0,	sys_getpid,	"getpid" },		/* 20 */
-	{ 0,	0,	printargs,	"SYS_21" },		/* 21 */
-	{ 1,	TF,	printargs,	"SYS_22" },		/* 22 */
+	{ 2,	0,	sys_capget,	"capget" },		/* 21 */
+	{ 2,	0,	sys_capset,	"capset" },		/* 22 */
 	{ 1,	0,	sys_setuid,	"setuid" },		/* 23 */
 	{ 0,	0,	sys_getuid,	"getuid" },		/* 24 */
-	{ 1,	0,	printargs,	"SYS_25" },		/* 25 */
+	{ 1,	0,	sys_time,	"time" },		/* 25 */
 	{ 5,	0,	sys_ptrace,	"ptrace" },		/* 26 */
 	{ 1,	0,	sys_alarm,	"alarm" },		/* 27 */
-	{ 2,	0,	printargs,	"SYS_28" },		/* 28 */
+	{ 2,	TS,	sys_sigaltstack,"sigaltstack" },	/* 28 */
 	{ 0,	TS,	sys_pause,	"pause" },		/* 29 */
 	{ 2,	TF,	sys_utime,	"utime" },		/* 30 */
 	{ 2,	0,	sys_stty,	"stty" },		/* 31 */
@@ -37,13 +37,13 @@
 	{ 0,	0,	sys_sync,	"sync" },		/* 36 */
 	{ 2,	TS,	sys_kill,	"kill" },		/* 37 */
 	{ 2,	TF,	sys_stat,	"stat" },		/* 38 */
-	{ 2,	0,	printargs,	"SYS_39" },		/* 39 */
+	{ 4,	TF,	sys_sendfile,	"sendfile" },		/* 39 */
 	{ 2,	TF,	sys_lstat,	"lstat" },		/* 40 */
 	{ 2,	0,	sys_dup,	"dup" },		/* 41 */
 	{ 0,	0,	sys_pipe,	"pipe" },		/* 42 */
 	{ 1,	0,	sys_times,	"times" },		/* 43 */
 	{ 4,	0,	sys_profil,	"profil" },		/* 44 */
-	{ 0,	0,	printargs,	"SYS_45" },		/* 45 */
+	{ 2,	TF,	sys_umount2,	"umount" },		/* 45 */
 	{ 1,	0,	sys_setgid,	"setgid" },		/* 46 */
 	{ 0,	0,	sys_getgid,	"getgid" },		/* 47 */
 	{ 2,	0,	sys_signal,	"signal" },		/* 48 */
@@ -64,10 +64,10 @@
 	{ 0,	0,	printargs,	"SYS_63" },		/* 63 */
 	{ 1,	0,	sys_getpagesize,"getpagesize" },	/* 64 */
 	{ 3,	0,	sys_msync,	"msync" },		/* 65 */
-	{ 0,	TP,	printargs,	"SYS_66" },		/* 66 */
-	{ 0,	0,	printargs,	"SYS_67" },		/* 67 */
-	{ 0,	0,	printargs,	"SYS_68" },		/* 68 */
-	{ 1,   0,	sys_sbrk,	"sbrk" },		/* 69 */
+	{ 0,	TP,	sys_vfork,	"vfork" },		/* 66 */
+	{ 5,	TF,	sys_pread,	"pread" },		/* 67 */
+	{ 5,	TF,	sys_pwrite,	"pwrite" },		/* 68 */
+	{ 1,    0,	sys_sbrk,	"sbrk" },		/* 69 */
 	{ 1,	0,	printargs,	"sstk" },		/* 70 */
 	{ 6,	0,	sys_mmap,	"mmap" },		/* 71 */
 	{ 1,	0,	printargs,	"vadvise" },		/* 72 */
@@ -91,7 +91,7 @@
 	{ 2,	0,	sys_dup2,	"dup2" },		/* 90 */
 	{ 2,	0,	printargs,	"getdopt" },		/* 91 */
 	{ 3,	0,	sys_fcntl,	"fcntl" },		/* 92 */
-	{ 5,	0,	sys_select,	"select" },		/* 93 */
+	{ 5,	0,	sys_oldselect,	"select" },		/* 93 */
 	{ 2,	0,	printargs,	"setdopt" },		/* 94 */
 	{ 1,	0,	sys_fsync,	"fsync" },		/* 95 */
 	{ 3,	0,	sys_setpriority,"setpriority" },	/* 96 */
@@ -99,13 +99,13 @@
 	{ 3,	TN,	sys_connect,	"connect" },		/* 98 */
 	{ 3,	TN,	sys_accept,	"accept" },		/* 99 */
 	{ 2,	0,	sys_getpriority,"getpriority" },	/* 100 */
-	{ 4,	TN,	sys_send,	"send" },		/* 101 */
-	{ 4,	TN,	sys_recv,	"recv" },		/* 102 */
-	{ 0,	0,	printargs,	"SYS_103" },		/* 103 */
-	{ 3,	TN,	sys_bind,	"bind" },		/* 104 */
-	{ 5,	TN,	sys_setsockopt,	"setsockopt" },		/* 105 */
-	{ 2,	TN,	sys_listen,	"listen" },		/* 106 */
-	{ 2,	0,	printargs,	"SYS_107" },		/* 107 */
+	{ 0,	TS,	printargs,	"rt_sigreturn" },	/* 101 */
+	{ 5,	TS,	sys_rt_sigaction,"rt_sigaction" },	/* 102 */
+	{ 4,	TS,	sys_rt_sigprocmask,"rt_sigprocmask" },	/* 103 */
+	{ 2,	TS,	sys_rt_sigpending,"rt_sigpending" },	/* 104 */
+	{ 4,	TS,	sys_rt_sigtimedwait,"rt_sigtimedwait" },/* 105 */
+	{ 3,	TS,	sys_rt_sigqueueinfo,"rt_sigqueueinfo" },/* 106 */
+	{ 2,	TS,	sys_rt_sigsuspend,"rt_sigsuspend" },	/* 107 */
 	{ 3,	TS,	printargs,	"sigvec" },		/* 108 */
 	{ 1,    TS,	sys_sigblock,	"sigblock" },		/* 109 */
 	{ 1,	TS,	sys_sigsetmask,	"sigsetmask" },		/* 110 */
@@ -117,7 +117,7 @@
 	{ 2,	0,	sys_gettimeofday,"gettimeofday" },	/* 116 */
 	{ 2,	0,	sys_getrusage,	"getrusage" },		/* 117 */
 	{ 5,	TN,	sys_getsockopt,	"getsockopt" },		/* 118 */
-	{ 0,	0,	printargs,	"SYS_119" },		/* 119 */
+	{ 2,	0,	sys_getcwd,	"getcwd" },		/* 119 */
 	{ 3,	0,	sys_readv,	"readv" },		/* 120 */
 	{ 3,	0,	sys_writev,	"writev" },		/* 121 */
 	{ 2,	0,	sys_settimeofday,"settimeofday" },	/* 122 */
@@ -145,19 +145,19 @@
 	{ 2,	0,	sys_getrlimit,	"getrlimit" },		/* 144 */
 	{ 2,	0,	sys_setrlimit,	"setrlimit" },		/* 145 */
 	{ 2,	TS,	sys_killpg,	"killpg" },		/* 146 */
-	{ 0,	0,	printargs,	"SYS_147" },		/* 147 */
-	{ 0,	0,	printargs,	"SYS_148" },		/* 148 */
-	{ 0,	0,	printargs,	"SYS_149" },		/* 149 */
+	{ 5,	0,	printargs,	"prctl" },		/* 147 */
+	{ 5,	0,	printargs,	"pciconfig_read" },	/* 148 */
+	{ 5,	0,	printargs,	"pciconfig_write" },	/* 149 */
 	{ 3,	TN,	sys_getsockname,"getsockname" },	/* 150 */
 	{ 4,	TN,	sys_getmsg,	"getmsg" },		/* 151 */
 	{ 4,	TN,	sys_putmsg,	"putmsg" },		/* 152 */
-	{ 4,	TN,	printargs,	"poll" },		/* 153 */
+	{ 3,	0,	sys_poll,	"poll" },		/* 153 */
 	{ 0,	0,	printargs,	"SYS_154" },		/* 154 */
 	{ 1,	0,	printargs,	"nfssvc" },		/* 155 */
 	{ 4,	0,	printargs,	"getdirentries" },	/* 156 */
 	{ 2,	TF,	sys_statfs,	"statfs" },		/* 157 */
 	{ 2,	0,	sys_fstatfs,	"fstatfs" },		/* 158 */
-	{ 1,	TF,	sys_umount,	"umount" },		/* 159 */
+	{ 1,	TF,	sys_umount,	"oldumount" },		/* 159 */
 	{ 0,	0,	printargs,	"async_daemon" },	/* 160 */
 	{ 2,	0,	printargs,	"getfh" },		/* 161 */
 	{ 2,	0,	printargs,	"getdomainname" },	/* 162 */
@@ -182,7 +182,7 @@
 	{ 1,	0,	printargs,	"aiowait" },		/* 181 */
 	{ 1,	0,	printargs,	"aiocancel" },		/* 182 */
 	{ 1,	TS,	sys_sigpending,	"sigpending" },		/* 183 */
-	{ 0,	0,	printargs,	"SYS_184" },		/* 184 */
+	{ 5,	0,	sys_query_module,"query_module" },	/* 184 */
 	{ 2,	0,	sys_setpgid,	"setpgid" },		/* 185 */
 	{ 2,	TF,	printargs,	"pathconf" },		/* 186 */
 	{ 2,	0,	printargs,	"fpathconf" },		/* 187 */
@@ -231,7 +231,7 @@
 	{ 5,	0,	sys_afs_syscall,"afs_syscall" },	/* 227 */
 	{ 1,	0,	sys_setfsuid,	"setfsuid" },		/* 228 */
 	{ 1,	0,	sys_setfsgid,	"setfsgid" },		/* 229 */
-	{ 5,	0,	printargs,	"_newselect" },		/* 230 */
+	{ 5,	0,	sys_select,	"select" },		/* 230 */
 	{ 1,	0,	sys_time,	"time" },		/* 231 */
 	{ 2,	TF,	printargs,	"nis_syscall" },	/* 232 */
 	{ 1,	0,	sys_stime,	"stime" },		/* 233 */
diff --git a/linux/syscall.h b/linux/syscall.h
index 213e29e..52219fb 100644
--- a/linux/syscall.h
+++ b/linux/syscall.h
@@ -36,7 +36,7 @@
 int sys_open(), sys_close(), sys_waitpid(), sys_creat(), sys_link();
 int sys_unlink(), sys_execve(), sys_chdir(), sys_time(), sys_mknod();
 int sys_chmod(), sys_chown(), sys_break(), sys_oldstat();
-int sys_lseek(), sys_getpid(), sys_mount(), sys_umount();
+int sys_lseek(), sys_getpid(), sys_mount(), sys_umount(), sys_umount2();
 int sys_setuid(), sys_getuid(), sys_stime(), sys_ptrace();
 int sys_alarm(), sys_oldfstat(), sys_pause(), sys_utime();
 int sys_stty(), sys_gtty(), sys_access(), sys_nice(), sys_ftime();
diff --git a/linux/syscallent.h b/linux/syscallent.h
index 0b66a01..90aead6 100644
--- a/linux/syscallent.h
+++ b/linux/syscallent.h
@@ -54,7 +54,7 @@
 	{ 3,	0,	sys_lseek,		"lseek"		}, /* 19 */
 	{ 0,	0,	sys_getpid,		"getpid"	}, /* 20 */
 	{ 5,	TF,	sys_mount,		"mount"		}, /* 21 */
-	{ 1,	TF,	sys_umount,		"umount"	}, /* 22 */
+	{ 1,	TF,	sys_umount,		"oldumount"	}, /* 22 */
 	{ 1,	0,	sys_setuid,		"setuid"	}, /* 23 */
 	{ 0,	0,	sys_getuid,		"getuid"	}, /* 24 */
 	{ 1,	0,	sys_stime,		"stime"		}, /* 25 */
@@ -84,7 +84,7 @@
 	{ 0,	0,	sys_geteuid,		"geteuid"	}, /* 49 */
 	{ 0,	0,	sys_getegid,		"getegid"	}, /* 50 */
 	{ 1,	TF,	sys_acct,		"acct"		}, /* 51 */
-	{ 0,	0,	sys_phys,		"phys"		}, /* 52 */
+	{ 2,	TF,	sys_umount2,		"umount"	}, /* 52 */
 	{ 0,	0,	sys_lock,		"lock"		}, /* 53 */
 	{ 3,	0,	sys_ioctl,		"ioctl"		}, /* 54 */
 	{ 3,	0,	sys_fcntl,		"fcntl"		}, /* 55 */
@@ -145,7 +145,7 @@
 	{ 1,	0,	sys_iopl,		"iopl"		}, /* 110 */
 	{ 0,	0,	sys_vhangup,		"vhangup"	}, /* 111 */
 	{ 0,	0,	sys_idle,		"idle"		}, /* 112 */
-	{ 1,	0,	sys_vm86old,		"vm86old"		}, /* 113 */
+	{ 1,	0,	sys_vm86old,		"vm86old"	}, /* 113 */
 	{ 4,	TP,	sys_wait4,		"wait4"		}, /* 114 */
 	{ 1,	0,	sys_swapoff,		"swapoff"	}, /* 115 */
 	{ 1,	0,	sys_sysinfo,		"sysinfo"	}, /* 116 */
diff --git a/signal.c b/signal.c
index 23cb4c8..257de73 100644
--- a/signal.c
+++ b/signal.c
@@ -1243,8 +1243,13 @@
 				tprintf("{%#lx, ",
 						(long) sa.__sigaction_handler.__sa_handler);
 				sigemptyset(&sigset);
+#ifdef LINUXSPARC
+				if (tcp->u_arg[4] <= sizeof(sigset))
+					memcpy(&sigset, &sa.sa_mask, tcp->u_arg[4]);
+#else
 				if (tcp->u_arg[3] <= sizeof(sigset))
 					memcpy(&sigset, &sa.sa_mask, tcp->u_arg[3]);
+#endif
 				else
 					memcpy(&sigset, &sa.sa_mask, sizeof(sigset));
 				printsigmask(&sigset, 1);
@@ -1257,7 +1262,13 @@
 	if (entering(tcp))
 		tprintf(", ");
 	else
+#ifdef LINUXSPARC
+		tprintf(", %#lx, %lu", tcp->u_arg[3], tcp->u_arg[4]);
+#elif defined(ALPHA)
+		tprintf(", %lu, %#lx", tcp->u_arg[3], tcp->u_arg[4]);
+#else
 		tprintf(", %lu", addr = tcp->u_arg[3]);
+#endif
 	return 0;
 }
 
diff --git a/strace.c b/strace.c
index 3af5235..fe876eb 100644
--- a/strace.c
+++ b/strace.c
@@ -820,6 +820,10 @@
 	 * before detaching.  Arghh.  We go through hoops
 	 * to make a clean break of things.
 	 */
+#if defined(SPARC)
+#undef PTRACE_DETACH
+#define PTRACE_DETACH PTRACE_SUNDETACH
+#endif
 	if ((error = ptrace(PTRACE_DETACH, tcp->pid, (char *) 1, sig)) == 0) {
 		/* On a clear day, you can see forever. */
 	}
diff --git a/syscall.c b/syscall.c
index 4504e4c..cea9e67 100644
--- a/syscall.c
+++ b/syscall.c
@@ -653,6 +653,10 @@
 			/* Linux/SPARC syscall trap. */
 			set_personality(0);
 			break;
+		case 0x91d0206d:
+			/* Linux/SPARC64 syscall trap. */
+			fprintf(stderr,"syscall: Linux/SPARC64 not supported yet\n");
+			return -1;
 		case 0x91d02000:
 			/* SunOS syscall trap. (pers 1) */
 			fprintf(stderr,"syscall: SunOS no support\n");
diff --git a/system.c b/system.c
index cc59aa9..c49cdc7 100644
--- a/system.c
+++ b/system.c
@@ -96,6 +96,21 @@
 	return 0;
 }
 
+int
+sys_umount2(tcp)
+struct tcb *tcp;
+{
+	if (entering(tcp)) {
+		printstr(tcp, tcp->u_arg[0], -1);
+		tprintf(", ");
+		if (tcp->u_arg[1] & 1)
+			tprintf("MNT_FORCE");
+		else
+			tprintf("0");
+	}
+	return 0;
+}
+
 static struct xlat personality_options[] = {
 #ifdef PER_LINUX
 	{ PER_LINUX,	"PER_LINUX"	},
diff --git a/util.c b/util.c
index 6a3fb10..6d075b4 100644
--- a/util.c
+++ b/util.c
@@ -44,7 +44,7 @@
 # define PTRACE_PEEKUSR PTRACE_PEEKUSER
 #endif
 #ifdef LINUX
-#ifndef __GLIBC__
+#if !defined(__GLIBC__) || defined(SPARC)
 #include <linux/ptrace.h>
 #endif
 #endif /* LINUX */