[SPARC]: Remove SunOS and Solaris binary support.

As per Documentation/feature-removal-schedule.txt

Signed-off-by: David S. Miller <davem@davemloft.net>
diff --git a/arch/sparc64/kernel/Makefile b/arch/sparc64/kernel/Makefile
index 459462e..63c6ae0 100644
--- a/arch/sparc64/kernel/Makefile
+++ b/arch/sparc64/kernel/Makefile
@@ -21,7 +21,6 @@
 obj-$(CONFIG_PCI_MSI)	+= pci_msi.o
 obj-$(CONFIG_SMP)	 += smp.o trampoline.o hvtramp.o
 obj-$(CONFIG_SPARC32_COMPAT) += sys32.o sys_sparc32.o signal32.o
-obj-$(CONFIG_BINFMT_AOUT32) += binfmt_aout32.o
 obj-$(CONFIG_MODULES) += module.o
 obj-$(CONFIG_US3_FREQ) += us3_cpufreq.o
 obj-$(CONFIG_US2E_FREQ) += us2e_cpufreq.o
@@ -30,11 +29,3 @@
 obj-$(CONFIG_AUDIT) += audit.o
 obj-$(CONFIG_AUDIT)$(CONFIG_SPARC32_COMPAT) += compat_audit.o
 obj-y += $(obj-yy)
-
-ifdef CONFIG_SUNOS_EMUL
-  obj-y += sys_sunos32.o sunos_ioctl32.o
-else
-  ifdef CONFIG_SOLARIS_EMUL
-    obj-y += sys_sunos32.o sunos_ioctl32.o
-  endif
-endif
diff --git a/arch/sparc64/kernel/binfmt_aout32.c b/arch/sparc64/kernel/binfmt_aout32.c
deleted file mode 100644
index 9877f2d..0000000
--- a/arch/sparc64/kernel/binfmt_aout32.c
+++ /dev/null
@@ -1,419 +0,0 @@
-/*
- *  linux/fs/binfmt_aout.c
- *
- *  Copyright (C) 1991, 1992, 1996  Linus Torvalds
- *
- *  Hacked a bit by DaveM to make it work with 32-bit SunOS
- *  binaries on the sparc64 port.
- */
-
-#include <linux/module.h>
-
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/mm.h>
-#include <linux/mman.h>
-#include <linux/a.out.h>
-#include <linux/errno.h>
-#include <linux/signal.h>
-#include <linux/string.h>
-#include <linux/fs.h>
-#include <linux/file.h>
-#include <linux/stat.h>
-#include <linux/fcntl.h>
-#include <linux/ptrace.h>
-#include <linux/user.h>
-#include <linux/slab.h>
-#include <linux/binfmts.h>
-#include <linux/personality.h>
-#include <linux/init.h>
-
-#include <asm/system.h>
-#include <asm/uaccess.h>
-#include <asm/pgalloc.h>
-#include <asm/mmu_context.h>
-#include <asm/a.out-core.h>
-
-static int load_aout32_binary(struct linux_binprm *, struct pt_regs * regs);
-static int load_aout32_library(struct file*);
-static int aout32_core_dump(long signr, struct pt_regs *regs, struct file *file, unsigned long limit);
-
-static struct linux_binfmt aout32_format = {
-	.module		= THIS_MODULE,
-	.load_binary	= load_aout32_binary,
-	.load_shlib	= load_aout32_library,
-	.core_dump	= aout32_core_dump,
-	.min_coredump	= PAGE_SIZE,
-};
-
-static void set_brk(unsigned long start, unsigned long end)
-{
-	start = PAGE_ALIGN(start);
-	end = PAGE_ALIGN(end);
-	if (end <= start)
-		return;
-	down_write(&current->mm->mmap_sem);
-	do_brk(start, end - start);
-	up_write(&current->mm->mmap_sem);
-}
-
-/*
- * These are the only things you should do on a core-file: use only these
- * macros to write out all the necessary info.
- */
-
-static int dump_write(struct file *file, const void *addr, int nr)
-{
-	return file->f_op->write(file, addr, nr, &file->f_pos) == nr;
-}
-
-#define DUMP_WRITE(addr, nr)	\
-	if (!dump_write(file, (void *)(addr), (nr))) \
-		goto end_coredump;
-
-#define DUMP_SEEK(offset) \
-if (file->f_op->llseek) { \
-	if (file->f_op->llseek(file,(offset),0) != (offset)) \
- 		goto end_coredump; \
-} else file->f_pos = (offset)
-
-/*
- * Routine writes a core dump image in the current directory.
- * Currently only a stub-function.
- *
- * Note that setuid/setgid files won't make a core-dump if the uid/gid
- * changed due to the set[u|g]id. It's enforced by the "current->mm->dumpable"
- * field, which also makes sure the core-dumps won't be recursive if the
- * dumping of the process results in another error..
- */
-
-static int aout32_core_dump(long signr, struct pt_regs *regs, struct file *file, unsigned long limit)
-{
-	mm_segment_t fs;
-	int has_dumped = 0;
-	unsigned long dump_start, dump_size;
-	struct user dump;
-#       define START_DATA(u)    (u.u_tsize)
-#       define START_STACK(u)   ((regs->u_regs[UREG_FP]) & ~(PAGE_SIZE - 1))
-
-	fs = get_fs();
-	set_fs(KERNEL_DS);
-	has_dumped = 1;
-	current->flags |= PF_DUMPCORE;
-       	strncpy(dump.u_comm, current->comm, sizeof(dump.u_comm));
-	dump.signal = signr;
-	aout_dump_thread(regs, &dump);
-
-/* If the size of the dump file exceeds the rlimit, then see what would happen
-   if we wrote the stack, but not the data area.  */
-	if (dump.u_dsize + dump.u_ssize > limit)
-		dump.u_dsize = 0;
-
-/* Make sure we have enough room to write the stack and data areas. */
-	if (dump.u_ssize > limit)
-		dump.u_ssize = 0;
-
-/* make sure we actually have a data and stack area to dump */
-	set_fs(USER_DS);
-	if (!access_ok(VERIFY_READ, (void __user *) START_DATA(dump), dump.u_dsize))
-		dump.u_dsize = 0;
-	if (!access_ok(VERIFY_READ, (void __user *) START_STACK(dump), dump.u_ssize))
-		dump.u_ssize = 0;
-
-	set_fs(KERNEL_DS);
-/* struct user */
-	DUMP_WRITE(&dump,sizeof(dump));
-/* now we start writing out the user space info */
-	set_fs(USER_DS);
-/* Dump the data area */
-	if (dump.u_dsize != 0) {
-		dump_start = START_DATA(dump);
-		dump_size = dump.u_dsize;
-		DUMP_WRITE(dump_start,dump_size);
-	}
-/* Now prepare to dump the stack area */
-	if (dump.u_ssize != 0) {
-		dump_start = START_STACK(dump);
-		dump_size = dump.u_ssize;
-		DUMP_WRITE(dump_start,dump_size);
-	}
-/* Finally dump the task struct.  Not be used by gdb, but could be useful */
-	set_fs(KERNEL_DS);
-	DUMP_WRITE(current,sizeof(*current));
-end_coredump:
-	set_fs(fs);
-	return has_dumped;
-}
-
-/*
- * create_aout32_tables() parses the env- and arg-strings in new user
- * memory and creates the pointer tables from them, and puts their
- * addresses on the "stack", returning the new stack pointer value.
- */
-
-static u32 __user *create_aout32_tables(char __user *p, struct linux_binprm *bprm)
-{
-	u32 __user *argv;
-	u32 __user *envp;
-	u32 __user *sp;
-	int argc = bprm->argc;
-	int envc = bprm->envc;
-
-	sp = (u32 __user *)((-(unsigned long)sizeof(char *))&(unsigned long)p);
-
-	/* This imposes the proper stack alignment for a new process. */
-	sp = (u32 __user *) (((unsigned long) sp) & ~7);
-	if ((envc+argc+3)&1)
-		--sp;
-
-	sp -= envc+1;
-	envp = sp;
-	sp -= argc+1;
-	argv = sp;
-	put_user(argc,--sp);
-	current->mm->arg_start = (unsigned long) p;
-	while (argc-->0) {
-		char c;
-		put_user(((u32)(unsigned long)(p)),argv++);
-		do {
-			get_user(c,p++);
-		} while (c);
-	}
-	put_user(0,argv);
-	current->mm->arg_end = current->mm->env_start = (unsigned long) p;
-	while (envc-->0) {
-		char c;
-		put_user(((u32)(unsigned long)(p)),envp++);
-		do {
-			get_user(c,p++);
-		} while (c);
-	}
-	put_user(0,envp);
-	current->mm->env_end = (unsigned long) p;
-	return sp;
-}
-
-/*
- * These are the functions used to load a.out style executables and shared
- * libraries.  There is no binary dependent code anywhere else.
- */
-
-static int load_aout32_binary(struct linux_binprm * bprm, struct pt_regs * regs)
-{
-	struct exec ex;
-	unsigned long error;
-	unsigned long fd_offset;
-	unsigned long rlim;
-	unsigned long orig_thr_flags;
-	int retval;
-
-	ex = *((struct exec *) bprm->buf);		/* exec-header */
-	if ((N_MAGIC(ex) != ZMAGIC && N_MAGIC(ex) != OMAGIC &&
-	     N_MAGIC(ex) != QMAGIC && N_MAGIC(ex) != NMAGIC) ||
-	    N_TRSIZE(ex) || N_DRSIZE(ex) ||
-	    bprm->file->f_path.dentry->d_inode->i_size < ex.a_text+ex.a_data+N_SYMSIZE(ex)+N_TXTOFF(ex)) {
-		return -ENOEXEC;
-	}
-
-	fd_offset = N_TXTOFF(ex);
-
-	/* Check initial limits. This avoids letting people circumvent
-	 * size limits imposed on them by creating programs with large
-	 * arrays in the data or bss.
-	 */
-	rlim = current->signal->rlim[RLIMIT_DATA].rlim_cur;
-	if (rlim >= RLIM_INFINITY)
-		rlim = ~0;
-	if (ex.a_data + ex.a_bss > rlim)
-		return -ENOMEM;
-
-	/* Flush all traces of the currently running executable */
-	retval = flush_old_exec(bprm);
-	if (retval)
-		return retval;
-
-	/* OK, This is the point of no return */
-	set_personality(PER_SUNOS);
-
-	current->mm->end_code = ex.a_text +
-		(current->mm->start_code = N_TXTADDR(ex));
-	current->mm->end_data = ex.a_data +
-		(current->mm->start_data = N_DATADDR(ex));
-	current->mm->brk = ex.a_bss +
-		(current->mm->start_brk = N_BSSADDR(ex));
-	current->mm->free_area_cache = current->mm->mmap_base;
-	current->mm->cached_hole_size = 0;
-
-	current->mm->mmap = NULL;
-	compute_creds(bprm);
- 	current->flags &= ~PF_FORKNOEXEC;
-	if (N_MAGIC(ex) == NMAGIC) {
-		loff_t pos = fd_offset;
-		/* Fuck me plenty... */
-		down_write(&current->mm->mmap_sem);	
-		error = do_brk(N_TXTADDR(ex), ex.a_text);
-		up_write(&current->mm->mmap_sem);
-		bprm->file->f_op->read(bprm->file, (char __user *)N_TXTADDR(ex),
-			  ex.a_text, &pos);
-		down_write(&current->mm->mmap_sem);
-		error = do_brk(N_DATADDR(ex), ex.a_data);
-		up_write(&current->mm->mmap_sem);
-		bprm->file->f_op->read(bprm->file, (char __user *)N_DATADDR(ex),
-			  ex.a_data, &pos);
-		goto beyond_if;
-	}
-
-	if (N_MAGIC(ex) == OMAGIC) {
-		loff_t pos = fd_offset;
-		down_write(&current->mm->mmap_sem);
-		do_brk(N_TXTADDR(ex) & PAGE_MASK,
-			ex.a_text+ex.a_data + PAGE_SIZE - 1);
-		up_write(&current->mm->mmap_sem);
-		bprm->file->f_op->read(bprm->file, (char __user *)N_TXTADDR(ex),
-			  ex.a_text+ex.a_data, &pos);
-	} else {
-		static unsigned long error_time;
-		if ((ex.a_text & 0xfff || ex.a_data & 0xfff) &&
-		    (N_MAGIC(ex) != NMAGIC) && (jiffies-error_time) > 5*HZ)
-		{
-			printk(KERN_NOTICE "executable not page aligned\n");
-			error_time = jiffies;
-		}
-
-		if (!bprm->file->f_op->mmap) {
-			loff_t pos = fd_offset;
-			down_write(&current->mm->mmap_sem);
-			do_brk(0, ex.a_text+ex.a_data);
-			up_write(&current->mm->mmap_sem);
-			bprm->file->f_op->read(bprm->file,
-				  (char __user *)N_TXTADDR(ex),
-				  ex.a_text+ex.a_data, &pos);
-			goto beyond_if;
-		}
-
-	        down_write(&current->mm->mmap_sem);
-		error = do_mmap(bprm->file, N_TXTADDR(ex), ex.a_text,
-			PROT_READ | PROT_EXEC,
-			MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE,
-			fd_offset);
-	        up_write(&current->mm->mmap_sem);
-
-		if (error != N_TXTADDR(ex)) {
-			send_sig(SIGKILL, current, 0);
-			return error;
-		}
-
-	        down_write(&current->mm->mmap_sem);
- 		error = do_mmap(bprm->file, N_DATADDR(ex), ex.a_data,
-				PROT_READ | PROT_WRITE | PROT_EXEC,
-				MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE,
-				fd_offset + ex.a_text);
-	        up_write(&current->mm->mmap_sem);
-		if (error != N_DATADDR(ex)) {
-			send_sig(SIGKILL, current, 0);
-			return error;
-		}
-	}
-beyond_if:
-	set_binfmt(&aout32_format);
-
-	set_brk(current->mm->start_brk, current->mm->brk);
-
-	/* Make sure STACK_TOP returns the right thing.  */
-	orig_thr_flags = current_thread_info()->flags;
-	current_thread_info()->flags |= _TIF_32BIT;
-
-	retval = setup_arg_pages(bprm, STACK_TOP, EXSTACK_DEFAULT);
-	if (retval < 0) { 
-		current_thread_info()->flags = orig_thr_flags;
-
-		/* Someone check-me: is this error path enough? */ 
-		send_sig(SIGKILL, current, 0); 
-		return retval;
-	}
-
-	current->mm->start_stack =
-		(unsigned long) create_aout32_tables((char __user *)bprm->p, bprm);
-	tsb_context_switch(current->mm);
-
-	start_thread32(regs, ex.a_entry, current->mm->start_stack);
-	if (current->ptrace & PT_PTRACED)
-		send_sig(SIGTRAP, current, 0);
-	return 0;
-}
-
-/* N.B. Move to .h file and use code in fs/binfmt_aout.c? */
-static int load_aout32_library(struct file *file)
-{
-	struct inode * inode;
-	unsigned long bss, start_addr, len;
-	unsigned long error;
-	int retval;
-	struct exec ex;
-
-	inode = file->f_path.dentry->d_inode;
-
-	retval = -ENOEXEC;
-	error = kernel_read(file, 0, (char *) &ex, sizeof(ex));
-	if (error != sizeof(ex))
-		goto out;
-
-	/* We come in here for the regular a.out style of shared libraries */
-	if ((N_MAGIC(ex) != ZMAGIC && N_MAGIC(ex) != QMAGIC) || N_TRSIZE(ex) ||
-	    N_DRSIZE(ex) || ((ex.a_entry & 0xfff) && N_MAGIC(ex) == ZMAGIC) ||
-	    inode->i_size < ex.a_text+ex.a_data+N_SYMSIZE(ex)+N_TXTOFF(ex)) {
-		goto out;
-	}
-
-	if (N_MAGIC(ex) == ZMAGIC && N_TXTOFF(ex) &&
-	    (N_TXTOFF(ex) < inode->i_sb->s_blocksize)) {
-		printk("N_TXTOFF < BLOCK_SIZE. Please convert library\n");
-		goto out;
-	}
-
-	if (N_FLAGS(ex))
-		goto out;
-
-	/* For  QMAGIC, the starting address is 0x20 into the page.  We mask
-	   this off to get the starting address for the page */
-
-	start_addr =  ex.a_entry & 0xfffff000;
-
-	/* Now use mmap to map the library into memory. */
-	down_write(&current->mm->mmap_sem);
-	error = do_mmap(file, start_addr, ex.a_text + ex.a_data,
-			PROT_READ | PROT_WRITE | PROT_EXEC,
-			MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE,
-			N_TXTOFF(ex));
-	up_write(&current->mm->mmap_sem);
-	retval = error;
-	if (error != start_addr)
-		goto out;
-
-	len = PAGE_ALIGN(ex.a_text + ex.a_data);
-	bss = ex.a_text + ex.a_data + ex.a_bss;
-	if (bss > len) {
-		down_write(&current->mm->mmap_sem);
-		error = do_brk(start_addr + len, bss - len);
-		up_write(&current->mm->mmap_sem);
-		retval = error;
-		if (error != start_addr + len)
-			goto out;
-	}
-	retval = 0;
-out:
-	return retval;
-}
-
-static int __init init_aout32_binfmt(void)
-{
-	return register_binfmt(&aout32_format);
-}
-
-static void __exit exit_aout32_binfmt(void)
-{
-	unregister_binfmt(&aout32_format);
-}
-
-module_init(init_aout32_binfmt);
-module_exit(exit_aout32_binfmt);
diff --git a/arch/sparc64/kernel/entry.S b/arch/sparc64/kernel/entry.S
index 49eca4b..fb43c76 100644
--- a/arch/sparc64/kernel/entry.S
+++ b/arch/sparc64/kernel/entry.S
@@ -1353,63 +1353,6 @@
 	ba,pt		%xcc, rtrap
 	 nop
 
-#if defined(CONFIG_SUNOS_EMUL) || defined(CONFIG_SOLARIS_EMUL) || \
-    defined(CONFIG_SOLARIS_EMUL_MODULE)
-	/* SunOS uses syscall zero as the 'indirect syscall' it looks
-	 * like indir_syscall(scall_num, arg0, arg1, arg2...);  etc.
-	 * This is complete brain damage.
-	 */
-	.globl	sunos_indir
-sunos_indir:
-	srl		%o0, 0, %o0
-	mov		%o7, %l4
-	cmp		%o0, NR_SYSCALLS
-	blu,a,pt	%icc, 1f
-	 sll		%o0, 0x2, %o0
-	sethi		%hi(sunos_nosys), %l6
-	b,pt		%xcc, 2f
-	 or		%l6, %lo(sunos_nosys), %l6
-1:	sethi		%hi(sunos_sys_table), %l7
-	or		%l7, %lo(sunos_sys_table), %l7
-	lduw		[%l7 + %o0], %l6
-2:	mov		%o1, %o0
-	mov		%o2, %o1
-	mov		%o3, %o2
-	mov		%o4, %o3
-	mov		%o5, %o4
-	call		%l6
-	 mov		%l4, %o7
-
-	.globl	sunos_getpid
-sunos_getpid:
-	call	sys_getppid
-	 nop
-	call	sys_getpid
-	 stx	%o0, [%sp + PTREGS_OFF + PT_V9_I1]
-	b,pt	%xcc, ret_sys_call
-	 stx	%o0, [%sp + PTREGS_OFF + PT_V9_I0]
-
-	/* SunOS getuid() returns uid in %o0 and euid in %o1 */
-	.globl	sunos_getuid
-sunos_getuid:
-	call	sys32_geteuid16
-	 nop
-	call	sys32_getuid16
-	 stx	%o0, [%sp + PTREGS_OFF + PT_V9_I1]
-	b,pt	%xcc, ret_sys_call
-	 stx	%o0, [%sp + PTREGS_OFF + PT_V9_I0]
-
-	/* SunOS getgid() returns gid in %o0 and egid in %o1 */
-	.globl	sunos_getgid
-sunos_getgid:
-	call	sys32_getegid16
-	 nop
-	call	sys32_getgid16
-	 stx	%o0, [%sp + PTREGS_OFF + PT_V9_I1]
-	b,pt	%xcc, ret_sys_call
-	 stx	%o0, [%sp + PTREGS_OFF + PT_V9_I0]
-#endif
-
 	/* SunOS's execv() call only specifies the argv argument, the
 	 * environment settings are the same as the calling processes.
 	 */
@@ -1591,7 +1534,7 @@
 	 mov		%i4, %o4
 
 
-	/* Linux 32-bit and SunOS system calls enter here... */
+	/* Linux 32-bit system calls enter here... */
 	.align	32
 	.globl	linux_sparc_syscall32
 linux_sparc_syscall32:
@@ -1614,7 +1557,7 @@
 	 srl		%i3, 0, %o3				! IEU0
 	ba,a,pt		%xcc, 3f
 
-	/* Linux native and SunOS system calls enter here... */
+	/* Linux native system calls enter here... */
 	.align	32
 	.globl	linux_sparc_syscall, ret_sys_call
 linux_sparc_syscall:
diff --git a/arch/sparc64/kernel/signal.c b/arch/sparc64/kernel/signal.c
index 9d51956..1c47009 100644
--- a/arch/sparc64/kernel/signal.c
+++ b/arch/sparc64/kernel/signal.c
@@ -25,7 +25,6 @@
 
 #include <asm/uaccess.h>
 #include <asm/ptrace.h>
-#include <asm/svr4.h>
 #include <asm/pgtable.h>
 #include <asm/fpumacro.h>
 #include <asm/uctx.h>
diff --git a/arch/sparc64/kernel/signal32.c b/arch/sparc64/kernel/signal32.c
index 8c1c121..74e0512 100644
--- a/arch/sparc64/kernel/signal32.c
+++ b/arch/sparc64/kernel/signal32.c
@@ -23,7 +23,6 @@
 
 #include <asm/uaccess.h>
 #include <asm/ptrace.h>
-#include <asm/svr4.h>
 #include <asm/pgtable.h>
 #include <asm/psrcompat.h>
 #include <asm/fpumacro.h>
@@ -798,281 +797,6 @@
 	force_sigsegv(signo, current);
 }
 
-/* Setup a Solaris stack frame */
-static void
-setup_svr4_frame32(struct sigaction *sa, unsigned long pc, unsigned long npc,
-		   struct pt_regs *regs, int signr, sigset_t *oldset)
-{
-	svr4_signal_frame_t __user *sfp;
-	svr4_gregset_t  __user *gr;
-	svr4_siginfo_t  __user *si;
-	svr4_mcontext_t __user *mc;
-	svr4_gwindows_t __user *gw;
-	svr4_ucontext_t __user *uc;
-	svr4_sigset_t setv;
-	unsigned int psr;
-	int i, err;
-
-	synchronize_user_stack();
-	save_and_clear_fpu();
-	
-	regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
-	sfp = (svr4_signal_frame_t __user *)
-		get_sigframe(sa, regs,
-			     sizeof(struct reg_window32) + SVR4_SF_ALIGNED);
-
-	if (invalid_frame_pointer(sfp, sizeof(*sfp)))
-		do_exit(SIGILL);
-
-	/* Start with a clean frame pointer and fill it */
-	err = clear_user(sfp, sizeof(*sfp));
-
-	/* Setup convenience variables */
-	si = &sfp->si;
-	uc = &sfp->uc;
-	gw = &sfp->gw;
-	mc = &uc->mcontext;
-	gr = &mc->greg;
-	
-	/* FIXME: where am I supposed to put this?
-	 * sc->sigc_onstack = old_status;
-	 * anyways, it does not look like it is used for anything at all.
-	 */
-	setv.sigbits[0] = oldset->sig[0];
-	setv.sigbits[1] = (oldset->sig[0] >> 32);
-	if (_NSIG_WORDS >= 2) {
-		setv.sigbits[2] = oldset->sig[1];
-		setv.sigbits[3] = (oldset->sig[1] >> 32);
-		err |= __copy_to_user(&uc->sigmask, &setv, sizeof(svr4_sigset_t));
-	} else
-		err |= __copy_to_user(&uc->sigmask, &setv,
-				      2 * sizeof(unsigned int));
-	
-	/* Store registers */
-	if (test_thread_flag(TIF_32BIT)) {
-		regs->tpc &= 0xffffffff;
-		regs->tnpc &= 0xffffffff;
-	}
-	err |= __put_user(regs->tpc, &((*gr)[SVR4_PC]));
-	err |= __put_user(regs->tnpc, &((*gr)[SVR4_NPC]));
-	psr = tstate_to_psr(regs->tstate);
-	if (current_thread_info()->fpsaved[0] & FPRS_FEF)
-		psr |= PSR_EF;
-	err |= __put_user(psr, &((*gr)[SVR4_PSR]));
-	err |= __put_user(regs->y, &((*gr)[SVR4_Y]));
-	
-	/* Copy g[1..7] and o[0..7] registers */
-	for (i = 0; i < 7; i++)
-		err |= __put_user(regs->u_regs[UREG_G1+i], (&(*gr)[SVR4_G1])+i);
-	for (i = 0; i < 8; i++)
-		err |= __put_user(regs->u_regs[UREG_I0+i], (&(*gr)[SVR4_O0])+i);
-
-	/* Setup sigaltstack */
-	err |= __put_user(current->sas_ss_sp, &uc->stack.sp);
-	err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &uc->stack.flags);
-	err |= __put_user(current->sas_ss_size, &uc->stack.size);
-
-	/* Save the currently window file: */
-
-	/* 1. Link sfp->uc->gwins to our windows */
-	err |= __put_user(ptr_to_compat(gw), &mc->gwin);
-	    
-	/* 2. Number of windows to restore at setcontext (): */
-	err |= __put_user(get_thread_wsaved(), &gw->count);
-
-	/* 3. We just pay attention to the gw->count field on setcontext */
-	set_thread_wsaved(0); /* So process is allowed to execute. */
-
-	/* Setup the signal information.  Solaris expects a bunch of
-	 * information to be passed to the signal handler, we don't provide
-	 * that much currently, should use siginfo.
-	 */
-	err |= __put_user(signr, &si->siginfo.signo);
-	err |= __put_user(SVR4_SINOINFO, &si->siginfo.code);
-	if (err)
-		goto sigsegv;
-
-	regs->u_regs[UREG_FP] = (unsigned long) sfp;
-	regs->tpc = (unsigned long) sa->sa_handler;
-	regs->tnpc = (regs->tpc + 4);
-	if (test_thread_flag(TIF_32BIT)) {
-		regs->tpc &= 0xffffffff;
-		regs->tnpc &= 0xffffffff;
-	}
-
-	/* Arguments passed to signal handler */
-	if (regs->u_regs[14]){
-		struct reg_window32 __user *rw = (struct reg_window32 __user *)
-			(regs->u_regs[14] & 0x00000000ffffffffUL);
-
-		err |= __put_user(signr, &rw->ins[0]);
-		err |= __put_user((u64)si, &rw->ins[1]);
-		err |= __put_user((u64)uc, &rw->ins[2]);
-		err |= __put_user((u64)sfp, &rw->ins[6]);	/* frame pointer */
-		if (err)
-			goto sigsegv;
-
-		regs->u_regs[UREG_I0] = signr;
-		regs->u_regs[UREG_I1] = (u32)(u64) si;
-		regs->u_regs[UREG_I2] = (u32)(u64) uc;
-	}
-	return;
-
-sigsegv:
-	force_sigsegv(signr, current);
-}
-
-asmlinkage int
-svr4_getcontext(svr4_ucontext_t __user *uc, struct pt_regs *regs)
-{
-	svr4_gregset_t  __user *gr;
-	svr4_mcontext_t __user *mc;
-	svr4_sigset_t setv;
-	int i, err;
-	u32 psr;
-
-	synchronize_user_stack();
-	save_and_clear_fpu();
-	
-	if (get_thread_wsaved())
-		do_exit(SIGSEGV);
-
-	err = clear_user(uc, sizeof(*uc));
-
-	/* Setup convenience variables */
-	mc = &uc->mcontext;
-	gr = &mc->greg;
-
-	setv.sigbits[0] = current->blocked.sig[0];
-	setv.sigbits[1] = (current->blocked.sig[0] >> 32);
-	if (_NSIG_WORDS >= 2) {
-		setv.sigbits[2] = current->blocked.sig[1];
-		setv.sigbits[3] = (current->blocked.sig[1] >> 32);
-		err |= __copy_to_user(&uc->sigmask, &setv, sizeof(svr4_sigset_t));
-	} else
-		err |= __copy_to_user(&uc->sigmask, &setv, 2 * sizeof(unsigned));
-
-	/* Store registers */
-	if (test_thread_flag(TIF_32BIT)) {
-		regs->tpc &= 0xffffffff;
-		regs->tnpc &= 0xffffffff;
-	}
-	err |= __put_user(regs->tpc, &uc->mcontext.greg[SVR4_PC]);
-	err |= __put_user(regs->tnpc, &uc->mcontext.greg[SVR4_NPC]);
-
-	psr = tstate_to_psr(regs->tstate) & ~PSR_EF;		   
-	if (current_thread_info()->fpsaved[0] & FPRS_FEF)
-		psr |= PSR_EF;
-	err |= __put_user(psr, &uc->mcontext.greg[SVR4_PSR]);
-
-	err |= __put_user(regs->y, &uc->mcontext.greg[SVR4_Y]);
-	
-	/* Copy g[1..7] and o[0..7] registers */
-	for (i = 0; i < 7; i++)
-		err |= __put_user(regs->u_regs[UREG_G1+i], (&(*gr)[SVR4_G1])+i);
-	for (i = 0; i < 8; i++)
-		err |= __put_user(regs->u_regs[UREG_I0+i], (&(*gr)[SVR4_O0])+i);
-
-	/* Setup sigaltstack */
-	err |= __put_user(current->sas_ss_sp, &uc->stack.sp);
-	err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &uc->stack.flags);
-	err |= __put_user(current->sas_ss_size, &uc->stack.size);
-
-	/* The register file is not saved
-	 * we have already stuffed all of it with sync_user_stack
-	 */
-	return (err ? -EFAULT : 0);
-}
-
-
-/* Set the context for a svr4 application, this is Solaris way to sigreturn */
-asmlinkage int svr4_setcontext(svr4_ucontext_t __user *c, struct pt_regs *regs)
-{
-	svr4_gregset_t  __user *gr;
-	mm_segment_t old_fs;
-	u32 pc, npc, psr, u_ss_sp;
-	sigset_t set;
-	svr4_sigset_t setv;
-	int i, err;
-	stack_t st;
-	
-	/* Fixme: restore windows, or is this already taken care of in
-	 * svr4_setup_frame when sync_user_windows is done?
-	 */
-	flush_user_windows();
-	
-	if (get_thread_wsaved())
-		goto sigsegv;
-
-	if (((unsigned long) c) & 3){
-		printk("Unaligned structure passed\n");
-		goto sigsegv;
-	}
-
-	if (!__access_ok(c, sizeof(*c))) {
-		/* Miguel, add nice debugging msg _here_. ;-) */
-		goto sigsegv;
-	}
-
-	/* Check for valid PC and nPC */
-	gr = &c->mcontext.greg;
-	err = __get_user(pc, &((*gr)[SVR4_PC]));
-	err |= __get_user(npc, &((*gr)[SVR4_NPC]));
-	if ((pc | npc) & 3)
-		goto sigsegv;
-	
-	/* Retrieve information from passed ucontext */
-	/* note that nPC is ored a 1, this is used to inform entry.S */
-	/* that we don't want it to mess with our PC and nPC */
-	
-	err |= copy_from_user(&setv, &c->sigmask, sizeof(svr4_sigset_t));
-	set.sig[0] = setv.sigbits[0] | (((long)setv.sigbits[1]) << 32);
-	if (_NSIG_WORDS >= 2)
-		set.sig[1] = setv.sigbits[2] | (((long)setv.sigbits[3]) << 32);
-	
-	err |= __get_user(u_ss_sp, &c->stack.sp);
-	st.ss_sp = compat_ptr(u_ss_sp);
-	err |= __get_user(st.ss_flags, &c->stack.flags);
-	err |= __get_user(st.ss_size, &c->stack.size);
-	if (err)
-		goto sigsegv;
-		
-	/* It is more difficult to avoid calling this function than to
-	   call it and ignore errors.  */
-	old_fs = get_fs();
-	set_fs(KERNEL_DS);
-	do_sigaltstack((stack_t __user *) &st, NULL, regs->u_regs[UREG_I6]);
-	set_fs(old_fs);
-	
-	sigdelsetmask(&set, ~_BLOCKABLE);
-	spin_lock_irq(&current->sighand->siglock);
-	current->blocked = set;
-	recalc_sigpending();
-	spin_unlock_irq(&current->sighand->siglock);
-	regs->tpc = pc;
-	regs->tnpc = npc | 1;
-	if (test_thread_flag(TIF_32BIT)) {
-		regs->tpc &= 0xffffffff;
-		regs->tnpc &= 0xffffffff;
-	}
-	err |= __get_user(regs->y, &((*gr)[SVR4_Y]));
-	err |= __get_user(psr, &((*gr)[SVR4_PSR]));
-	regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC);
-	regs->tstate |= psr_to_tstate_icc(psr);
-
-	/* Restore g[1..7] and o[0..7] registers */
-	for (i = 0; i < 7; i++)
-		err |= __get_user(regs->u_regs[UREG_G1+i], (&(*gr)[SVR4_G1])+i);
-	for (i = 0; i < 8; i++)
-		err |= __get_user(regs->u_regs[UREG_I0+i], (&(*gr)[SVR4_O0])+i);
-	if (err)
-		goto sigsegv;
-
-	return -EINTR;
-sigsegv:
-	return -EFAULT;
-}
-
 static void setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs,
 			     unsigned long signr, sigset_t *oldset,
 			     siginfo_t *info)
@@ -1216,20 +940,14 @@
 
 static inline void handle_signal32(unsigned long signr, struct k_sigaction *ka,
 				   siginfo_t *info,
-				   sigset_t *oldset, struct pt_regs *regs,
-				   int svr4_signal)
+				   sigset_t *oldset, struct pt_regs *regs)
 {
-	if (svr4_signal)
-		setup_svr4_frame32(&ka->sa, regs->tpc, regs->tnpc,
-				   regs, signr, oldset);
-	else {
-		if (ka->sa.sa_flags & SA_SIGINFO)
-			setup_rt_frame32(ka, regs, signr, oldset, info);
-		else if (test_thread_flag(TIF_NEWSIGNALS))
-			new_setup_frame32(ka, regs, signr, oldset);
-		else
-			setup_frame32(&ka->sa, regs, signr, oldset, info);
-	}
+	if (ka->sa.sa_flags & SA_SIGINFO)
+		setup_rt_frame32(ka, regs, signr, oldset, info);
+	else if (test_thread_flag(TIF_NEWSIGNALS))
+		new_setup_frame32(ka, regs, signr, oldset);
+	else
+		setup_frame32(&ka->sa, regs, signr, oldset, info);
 	spin_lock_irq(&current->sighand->siglock);
 	sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
 	if (!(ka->sa.sa_flags & SA_NOMASK))
@@ -1270,7 +988,6 @@
 	struct signal_deliver_cookie cookie;
 	struct k_sigaction ka;
 	int signr;
-	int svr4_signal = current->personality == PER_SVR4;
 	
 	cookie.restart_syscall = restart_syscall;
 	cookie.orig_i0 = orig_i0;
@@ -1279,8 +996,7 @@
 	if (signr > 0) {
 		if (cookie.restart_syscall)
 			syscall_restart32(orig_i0, regs, &ka.sa);
-		handle_signal32(signr, &ka, &info, oldset,
-				regs, svr4_signal);
+		handle_signal32(signr, &ka, &info, oldset, regs);
 
 		/* a signal was successfully delivered; the saved
 		 * sigmask will have been stored in the signal frame,
diff --git a/arch/sparc64/kernel/sparc64_ksyms.c b/arch/sparc64/kernel/sparc64_ksyms.c
index 051b8d9..3873646 100644
--- a/arch/sparc64/kernel/sparc64_ksyms.c
+++ b/arch/sparc64/kernel/sparc64_ksyms.c
@@ -33,13 +33,11 @@
 #include <asm/io.h>
 #include <asm/irq.h>
 #include <asm/idprom.h>
-#include <asm/svr4.h>
 #include <asm/elf.h>
 #include <asm/head.h>
 #include <asm/smp.h>
 #include <asm/mostek.h>
 #include <asm/ptrace.h>
-#include <asm/user.h>
 #include <asm/uaccess.h>
 #include <asm/checksum.h>
 #include <asm/fpumacro.h>
@@ -73,13 +71,8 @@
 extern void linux_sparc_syscall(void);
 extern void rtrap(void);
 extern void show_regs(struct pt_regs *);
-extern void solaris_syscall(void);
 extern void syscall_trace(struct pt_regs *, int);
-extern u32 sunos_sys_table[], sys_call_table32[];
-extern void tl0_solaris(void);
 extern void sys_sigsuspend(void);
-extern int svr4_getcontext(svr4_ucontext_t *uc, struct pt_regs *regs);
-extern int svr4_setcontext(svr4_ucontext_t *uc, struct pt_regs *regs);
 extern int compat_sys_ioctl(unsigned int fd, unsigned int cmd, u32 arg);
 extern int (*handle_mathemu)(struct pt_regs *, struct fpustate *);
 extern long sparc32_open(const char __user * filename, int flags, int mode);
@@ -90,8 +83,6 @@
 
 extern int dump_fpu (struct pt_regs * regs, elf_fpregset_t * fpregs);
 
-extern unsigned int sys_call_table[];
-
 extern void xor_vis_2(unsigned long, unsigned long *, unsigned long *);
 extern void xor_vis_3(unsigned long, unsigned long *, unsigned long *,
 		      unsigned long *);
@@ -213,11 +204,6 @@
 /* I/O device mmaping on Sparc64. */
 EXPORT_SYMBOL(io_remap_pfn_range);
 
-#if defined(CONFIG_COMPAT) && defined(CONFIG_NET)
-/* Solaris/SunOS binary compatibility */
-EXPORT_SYMBOL(verify_compat_iovec);
-#endif
-
 EXPORT_SYMBOL(dump_fpu);
 EXPORT_SYMBOL(put_fs_struct);
 
@@ -254,30 +240,6 @@
 EXPORT_SYMBOL(__strlen_user);
 EXPORT_SYMBOL(__strnlen_user);
 
-#ifdef CONFIG_SOLARIS_EMUL_MODULE
-EXPORT_SYMBOL(linux_sparc_syscall);
-EXPORT_SYMBOL(rtrap);
-EXPORT_SYMBOL(show_regs);
-EXPORT_SYMBOL(solaris_syscall);
-EXPORT_SYMBOL(syscall_trace);
-EXPORT_SYMBOL(sunos_sys_table);
-EXPORT_SYMBOL(sys_call_table32);
-EXPORT_SYMBOL(tl0_solaris);
-EXPORT_SYMBOL(sys_sigsuspend);
-EXPORT_SYMBOL(sys_getppid);
-EXPORT_SYMBOL(sys_getpid);
-EXPORT_SYMBOL(sys_geteuid);
-EXPORT_SYMBOL(sys_getuid);
-EXPORT_SYMBOL(sys_getegid);
-EXPORT_SYMBOL(sysctl_nr_open);
-EXPORT_SYMBOL(sys_getgid);
-EXPORT_SYMBOL(svr4_getcontext);
-EXPORT_SYMBOL(svr4_setcontext);
-EXPORT_SYMBOL(compat_sys_ioctl);
-EXPORT_SYMBOL(sys_ioctl);
-EXPORT_SYMBOL(sparc32_open);
-#endif
-
 /* Special internal versions of library functions. */
 EXPORT_SYMBOL(_clear_page);
 EXPORT_SYMBOL(clear_user_page);
@@ -334,9 +296,6 @@
 /* for ns8703 */
 EXPORT_SYMBOL(ns87303_lock);
 
-/* for solaris compat module */
-EXPORT_SYMBOL_GPL(sys_call_table);
-
 EXPORT_SYMBOL(tick_ops);
 
 EXPORT_SYMBOL(xor_vis_2);
diff --git a/arch/sparc64/kernel/sunos_ioctl32.c b/arch/sparc64/kernel/sunos_ioctl32.c
deleted file mode 100644
index 75d2bad..0000000
--- a/arch/sparc64/kernel/sunos_ioctl32.c
+++ /dev/null
@@ -1,275 +0,0 @@
-/* $Id: sunos_ioctl32.c,v 1.11 2000/07/30 23:12:24 davem Exp $
- * sunos_ioctl32.c: SunOS ioctl compatibility on sparc64.
- *
- * Copyright (C) 1995 Miguel de Icaza (miguel@nuclecu.unam.mx)
- * Copyright (C) 1995, 1996, 1997 David S. Miller (davem@caip.rutgers.edu)
- */
-
-#include <asm/uaccess.h>
-
-#include <linux/sched.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/termios.h>
-#include <linux/tty.h>
-#include <linux/ioctl.h>
-#include <linux/route.h>
-#include <linux/sockios.h>
-#include <linux/if.h>
-#include <linux/netdevice.h>
-#include <linux/if_arp.h>
-#include <linux/fs.h>
-#include <linux/file.h>
-#include <linux/mm.h>
-#include <linux/smp.h>
-#include <linux/syscalls.h>
-#include <linux/compat.h>
-
-#define SUNOS_NR_OPEN	256
-
-struct rtentry32 {
-        u32   		rt_pad1;
-        struct sockaddr rt_dst;         /* target address               */
-        struct sockaddr rt_gateway;     /* gateway addr (RTF_GATEWAY)   */
-        struct sockaddr rt_genmask;     /* target network mask (IP)     */
-        unsigned short  rt_flags;
-        short           rt_pad2;
-        u32   		rt_pad3;
-        unsigned char   rt_tos;
-        unsigned char   rt_class;
-        short           rt_pad4;
-        short           rt_metric;      /* +1 for binary compatibility! */
-        /* char * */ u32 rt_dev;        /* forcing the device at add    */
-        u32   		rt_mtu;         /* per route MTU/Window         */
-        u32   		rt_window;      /* Window clamping              */
-        unsigned short  rt_irtt;        /* Initial RTT                  */
-
-};
-
-struct ifmap32 {
-	u32 mem_start;
-	u32 mem_end;
-	unsigned short base_addr;
-	unsigned char irq;
-	unsigned char dma;
-	unsigned char port;
-};
-
-struct ifreq32 {
-#define IFHWADDRLEN     6
-#define IFNAMSIZ        16
-        union {
-                char    ifrn_name[IFNAMSIZ];            /* if name, e.g. "en0" */
-        } ifr_ifrn;
-        union {
-                struct  sockaddr ifru_addr;
-                struct  sockaddr ifru_dstaddr;
-                struct  sockaddr ifru_broadaddr;
-                struct  sockaddr ifru_netmask;
-                struct  sockaddr ifru_hwaddr;
-                short   ifru_flags;
-                int     ifru_ivalue;
-                int     ifru_mtu;
-                struct  ifmap32 ifru_map;
-                char    ifru_slave[IFNAMSIZ];   /* Just fits the size */
-                compat_caddr_t ifru_data;
-        } ifr_ifru;
-};
-
-struct ifconf32 {
-        int     ifc_len;                        /* size of buffer       */
-        compat_caddr_t  ifcbuf;
-};
-
-extern asmlinkage int compat_sys_ioctl(unsigned int, unsigned int, u32);
-
-asmlinkage int sunos_ioctl (int fd, u32 cmd, u32 arg)
-{
-	int ret = -EBADF;
-
-	if(fd >= SUNOS_NR_OPEN)
-		goto out;
-	if(!fcheck(fd))
-		goto out;
-
-	if(cmd == TIOCSETD) {
-		mm_segment_t old_fs = get_fs();
-		int __user *p;
-		int ntty = N_TTY;
-		int tmp;
-
-		p = (int __user *) (unsigned long) arg;
-		ret = -EFAULT;
-		if(get_user(tmp, p))
-			goto out;
-		if(tmp == 2) {
-			set_fs(KERNEL_DS);
-			ret = sys_ioctl(fd, cmd, (unsigned long) &ntty);
-			set_fs(old_fs);
-			ret = (ret == -EINVAL ? -EOPNOTSUPP : ret);
-			goto out;
-		}
-	}
-	if(cmd == TIOCNOTTY) {
-		ret = sys_setsid();
-		goto out;
-	}
-	switch(cmd) {
-	case _IOW('r', 10, struct rtentry32):
-		ret = compat_sys_ioctl(fd, SIOCADDRT, arg);
-		goto out;
-	case _IOW('r', 11, struct rtentry32):
-		ret = compat_sys_ioctl(fd, SIOCDELRT, arg);
-		goto out;
-
-	case _IOW('i', 12, struct ifreq32):
-		ret = compat_sys_ioctl(fd, SIOCSIFADDR, arg);
-		goto out;
-	case _IOWR('i', 13, struct ifreq32):
-		ret = compat_sys_ioctl(fd, SIOCGIFADDR, arg);
-		goto out;
-	case _IOW('i', 14, struct ifreq32):
-		ret = compat_sys_ioctl(fd, SIOCSIFDSTADDR, arg);
-		goto out;
-	case _IOWR('i', 15, struct ifreq32):
-		ret = compat_sys_ioctl(fd, SIOCGIFDSTADDR, arg);
-		goto out;
-	case _IOW('i', 16, struct ifreq32):
-		ret = compat_sys_ioctl(fd, SIOCSIFFLAGS, arg);
-		goto out;
-	case _IOWR('i', 17, struct ifreq32):
-		ret = compat_sys_ioctl(fd, SIOCGIFFLAGS, arg);
-		goto out;
-	case _IOW('i', 18, struct ifreq32):
-		ret = compat_sys_ioctl(fd, SIOCSIFMEM, arg);
-		goto out;
-	case _IOWR('i', 19, struct ifreq32):
-		ret = compat_sys_ioctl(fd, SIOCGIFMEM, arg);
-		goto out;
-
-	case _IOWR('i', 20, struct ifconf32):
-		ret = compat_sys_ioctl(fd, SIOCGIFCONF, arg);
-		goto out;
-
-	case _IOW('i', 21, struct ifreq32):
-		ret = compat_sys_ioctl(fd, SIOCSIFMTU, arg);
-		goto out;
-
-	case _IOWR('i', 22, struct ifreq32):
-		ret = compat_sys_ioctl(fd, SIOCGIFMTU, arg);
-		goto out;
-
-	case _IOWR('i', 23, struct ifreq32):
-		ret = compat_sys_ioctl(fd, SIOCGIFBRDADDR, arg);
-		goto out;
-	case _IOW('i', 24, struct ifreq32):
-		ret = compat_sys_ioctl(fd, SIOCSIFBRDADDR, arg);
-		goto out;
-	case _IOWR('i', 25, struct ifreq32):
-		ret = compat_sys_ioctl(fd, SIOCGIFNETMASK, arg);
-		goto out;
-	case _IOW('i', 26, struct ifreq32):
-		ret = compat_sys_ioctl(fd, SIOCSIFNETMASK, arg);
-		goto out;
-	case _IOWR('i', 27, struct ifreq32):
-		ret = compat_sys_ioctl(fd, SIOCGIFMETRIC, arg);
-		goto out;
-	case _IOW('i', 28, struct ifreq32):
-		ret = compat_sys_ioctl(fd, SIOCSIFMETRIC, arg);
-		goto out;
-
-	case _IOW('i', 30, struct arpreq):
-		ret = compat_sys_ioctl(fd, SIOCSARP, arg);
-		goto out;
-	case _IOWR('i', 31, struct arpreq):
-		ret = compat_sys_ioctl(fd, SIOCGARP, arg);
-		goto out;
-	case _IOW('i', 32, struct arpreq):
-		ret = compat_sys_ioctl(fd, SIOCDARP, arg);
-		goto out;
-
-	case _IOW('i', 40, struct ifreq32): /* SIOCUPPER */
-	case _IOW('i', 41, struct ifreq32): /* SIOCLOWER */
-	case _IOW('i', 44, struct ifreq32): /* SIOCSETSYNC */
-	case _IOW('i', 45, struct ifreq32): /* SIOCGETSYNC */
-	case _IOW('i', 46, struct ifreq32): /* SIOCSSDSTATS */
-	case _IOW('i', 47, struct ifreq32): /* SIOCSSESTATS */
-	case _IOW('i', 48, struct ifreq32): /* SIOCSPROMISC */
-		ret = -EOPNOTSUPP;
-		goto out;
-
-	case _IOW('i', 49, struct ifreq32):
-		ret = compat_sys_ioctl(fd, SIOCADDMULTI, arg);
-		goto out;
-	case _IOW('i', 50, struct ifreq32):
-		ret = compat_sys_ioctl(fd, SIOCDELMULTI, arg);
-		goto out;
-
-	/* FDDI interface ioctls, unsupported. */
-		
-	case _IOW('i', 51, struct ifreq32): /* SIOCFDRESET */
-	case _IOW('i', 52, struct ifreq32): /* SIOCFDSLEEP */
-	case _IOW('i', 53, struct ifreq32): /* SIOCSTRTFMWAR */
-	case _IOW('i', 54, struct ifreq32): /* SIOCLDNSTRTFW */
-	case _IOW('i', 55, struct ifreq32): /* SIOCGETFDSTAT */
-	case _IOW('i', 56, struct ifreq32): /* SIOCFDNMIINT */
-	case _IOW('i', 57, struct ifreq32): /* SIOCFDEXUSER */
-	case _IOW('i', 58, struct ifreq32): /* SIOCFDGNETMAP */
-	case _IOW('i', 59, struct ifreq32): /* SIOCFDGIOCTL */
-		printk("FDDI ioctl, returning EOPNOTSUPP\n");
-		ret = -EOPNOTSUPP;
-		goto out;
-
-	case _IOW('t', 125, int):
-		/* More stupid tty sunos ioctls, just
-		 * say it worked.
-		 */
-		ret = 0;
-		goto out;
-
-	/* Non posix grp */
-	case _IOW('t', 118, int): {
-		int oldval, newval, __user *ptr;
-
-		cmd = TIOCSPGRP;
-		ptr = (int __user *) (unsigned long) arg;
-		ret = -EFAULT;
-		if(get_user(oldval, ptr))
-			goto out;
-		ret = compat_sys_ioctl(fd, cmd, arg);
-		__get_user(newval, ptr);
-		if(newval == -1) {
-			__put_user(oldval, ptr);
-			ret = -EIO;
-		}
-		if(ret == -ENOTTY)
-			ret = -EIO;
-		goto out;
-	}
-
-	case _IOR('t', 119, int): {
-		int oldval, newval, __user *ptr;
-
-		cmd = TIOCGPGRP;
-		ptr = (int __user *) (unsigned long) arg;
-		ret = -EFAULT;
-		if(get_user(oldval, ptr))
-			goto out;
-		ret = compat_sys_ioctl(fd, cmd, arg);
-		__get_user(newval, ptr);
-		if(newval == -1) {
-			__put_user(oldval, ptr);
-			ret = -EIO;
-		}
-		if(ret == -ENOTTY)
-			ret = -EIO;
-		goto out;
-	}
-	};
-
-	ret = compat_sys_ioctl(fd, cmd, arg);
-	/* so stupid... */
-	ret = (ret == -EINVAL ? -EOPNOTSUPP : ret);
-out:
-	return ret;
-}
diff --git a/arch/sparc64/kernel/sys_sparc.c b/arch/sparc64/kernel/sys_sparc.c
index f952745..73ed01b 100644
--- a/arch/sparc64/kernel/sys_sparc.c
+++ b/arch/sparc64/kernel/sys_sparc.c
@@ -720,44 +720,6 @@
 	return err;
 }
 
-asmlinkage long solaris_syscall(struct pt_regs *regs)
-{
-	static int count;
-
-	regs->tpc = regs->tnpc;
-	regs->tnpc += 4;
-	if (test_thread_flag(TIF_32BIT)) {
-		regs->tpc &= 0xffffffff;
-		regs->tnpc &= 0xffffffff;
-	}
-	if (++count <= 5) {
-		printk ("For Solaris binary emulation you need solaris module loaded\n");
-		show_regs (regs);
-	}
-	send_sig(SIGSEGV, current, 1);
-
-	return -ENOSYS;
-}
-
-#ifndef CONFIG_SUNOS_EMUL
-asmlinkage long sunos_syscall(struct pt_regs *regs)
-{
-	static int count;
-
-	regs->tpc = regs->tnpc;
-	regs->tnpc += 4;
-	if (test_thread_flag(TIF_32BIT)) {
-		regs->tpc &= 0xffffffff;
-		regs->tnpc &= 0xffffffff;
-	}
-	if (++count <= 20)
-		printk ("SunOS binary emulation not compiled in\n");
-	force_sig(SIGSEGV, current);
-
-	return -ENOSYS;
-}
-#endif
-
 asmlinkage long sys_utrap_install(utrap_entry_t type,
 				  utrap_handler_t new_p,
 				  utrap_handler_t new_d,
diff --git a/arch/sparc64/kernel/sys_sunos32.c b/arch/sparc64/kernel/sys_sunos32.c
deleted file mode 100644
index e91194f..0000000
--- a/arch/sparc64/kernel/sys_sunos32.c
+++ /dev/null
@@ -1,1359 +0,0 @@
-/* $Id: sys_sunos32.c,v 1.64 2002/02/09 19:49:31 davem Exp $
- * sys_sunos32.c: SunOS binary compatibility layer on sparc64.
- *
- * Copyright (C) 1995, 1996, 1997 David S. Miller (davem@caip.rutgers.edu)
- * Copyright (C) 1995 Miguel de Icaza (miguel@nuclecu.unam.mx)
- *
- * Based upon preliminary work which is:
- *
- * Copyright (C) 1995 Adrian M. Rodriguez (adrian@remus.rutgers.edu)
- */
-
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/types.h>
-#include <linux/capability.h>
-#include <linux/compat.h>
-#include <linux/mman.h>
-#include <linux/mm.h>
-#include <linux/swap.h>
-#include <linux/fs.h>
-#include <linux/file.h>
-#include <linux/resource.h>
-#include <linux/ipc.h>
-#include <linux/shm.h>
-#include <linux/msg.h>
-#include <linux/sem.h>
-#include <linux/signal.h>
-#include <linux/uio.h>
-#include <linux/utsname.h>
-#include <linux/major.h>
-#include <linux/stat.h>
-#include <linux/slab.h>
-#include <linux/pagemap.h>
-#include <linux/errno.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/syscalls.h>
-
-#include <asm/uaccess.h>
-#include <asm/page.h>
-#include <asm/pgtable.h>
-#include <asm/pconf.h>
-#include <asm/idprom.h> /* for gethostid() */
-#include <asm/unistd.h>
-#include <asm/system.h>
-#include <asm/compat_signal.h>
-
-/* For the nfs mount emulation */
-#include <linux/socket.h>
-#include <linux/in.h>
-#include <linux/nfs.h>
-#include <linux/nfs2.h>
-#include <linux/nfs_mount.h>
-
-/* for sunos_select */
-#include <linux/time.h>
-#include <linux/personality.h>
-
-/* For SOCKET_I */
-#include <net/sock.h>
-#include <net/compat.h>
-
-#define SUNOS_NR_OPEN	256
-
-asmlinkage u32 sunos_mmap(u32 addr, u32 len, u32 prot, u32 flags, u32 fd, u32 off)
-{
-	struct file *file = NULL;
-	unsigned long retval, ret_type;
-
-	if (flags & MAP_NORESERVE) {
-		static int cnt;
-		if (cnt++ < 10)
-			printk("%s:  unimplemented SunOS MAP_NORESERVE mmap() flag\n",
-			       current->comm);
-		flags &= ~MAP_NORESERVE;
-	}
-	retval = -EBADF;
-	if (!(flags & MAP_ANONYMOUS)) {
-		struct inode * inode;
-		if (fd >= SUNOS_NR_OPEN)
-			goto out;
- 		file = fget(fd);
-		if (!file)
-			goto out;
-		inode = file->f_path.dentry->d_inode;
-		if (imajor(inode) == MEM_MAJOR && iminor(inode) == 5) {
-			flags |= MAP_ANONYMOUS;
-			fput(file);
-			file = NULL;
-		}
-	}
-
-	retval = -EINVAL;
-	if (!(flags & MAP_FIXED))
-		addr = 0;
-	else if (len > 0xf0000000 || addr > 0xf0000000 - len)
-		goto out_putf;
-	ret_type = flags & _MAP_NEW;
-	flags &= ~_MAP_NEW;
-
-	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
-	down_write(&current->mm->mmap_sem);
-	retval = do_mmap(file,
-			 (unsigned long) addr, (unsigned long) len,
-			 (unsigned long) prot, (unsigned long) flags,
-			 (unsigned long) off);
-	up_write(&current->mm->mmap_sem);
-	if (!ret_type)
-		retval = ((retval < 0xf0000000) ? 0 : retval);
-out_putf:
-	if (file)
-		fput(file);
-out:
-	return (u32) retval;
-}
-
-asmlinkage int sunos_mctl(u32 addr, u32 len, int function, u32 arg)
-{
-	return 0;
-}
-
-asmlinkage int sunos_brk(u32 baddr)
-{
-	int freepages, retval = -ENOMEM;
-	unsigned long rlim;
-	unsigned long newbrk, oldbrk, brk = (unsigned long) baddr;
-
-	down_write(&current->mm->mmap_sem);
-	if (brk < current->mm->end_code)
-		goto out;
-	newbrk = PAGE_ALIGN(brk);
-	oldbrk = PAGE_ALIGN(current->mm->brk);
-	retval = 0;
-	if (oldbrk == newbrk) {
-		current->mm->brk = brk;
-		goto out;
-	}
-	/* Always allow shrinking brk. */
-	if (brk <= current->mm->brk) {
-		current->mm->brk = brk;
-		do_munmap(current->mm, newbrk, oldbrk-newbrk);
-		goto out;
-	}
-	/* Check against rlimit and stack.. */
-	retval = -ENOMEM;
-	rlim = current->signal->rlim[RLIMIT_DATA].rlim_cur;
-	if (rlim >= RLIM_INFINITY)
-		rlim = ~0;
-	if (brk - current->mm->end_code > rlim)
-		goto out;
-	/* Check against existing mmap mappings. */
-	if (find_vma_intersection(current->mm, oldbrk, newbrk+PAGE_SIZE))
-		goto out;
-	/* stupid algorithm to decide if we have enough memory: while
-	 * simple, it hopefully works in most obvious cases.. Easy to
-	 * fool it, but this should catch most mistakes.
-	 */
-	freepages = global_page_state(NR_FILE_PAGES);
-	freepages >>= 1;
-	freepages += nr_free_pages();
-	freepages += nr_swap_pages;
-	freepages -= num_physpages >> 4;
-	freepages -= (newbrk-oldbrk) >> PAGE_SHIFT;
-	if (freepages < 0)
-		goto out;
-	/* Ok, we have probably got enough memory - let it rip. */
-	current->mm->brk = brk;
-	do_brk(oldbrk, newbrk-oldbrk);
-	retval = 0;
-out:
-	up_write(&current->mm->mmap_sem);
-	return retval;
-}
-
-asmlinkage u32 sunos_sbrk(int increment)
-{
-	int error, oldbrk;
-
-	/* This should do it hopefully... */
-	oldbrk = (int)current->mm->brk;
-	error = sunos_brk(((int) current->mm->brk) + increment);
-	if (!error)
-		error = oldbrk;
-	return error;
-}
-
-asmlinkage u32 sunos_sstk(int increment)
-{
-	printk("%s: Call to sunos_sstk(increment<%d>) is unsupported\n",
-	       current->comm, increment);
-
-	return (u32)-1;
-}
-
-/* Give hints to the kernel as to what paging strategy to use...
- * Completely bogus, don't remind me.
- */
-#define VA_NORMAL     0 /* Normal vm usage expected */
-#define VA_ABNORMAL   1 /* Abnormal/random vm usage probable */
-#define VA_SEQUENTIAL 2 /* Accesses will be of a sequential nature */
-#define VA_INVALIDATE 3 /* Page table entries should be flushed ??? */
-static char *vstrings[] = {
-	"VA_NORMAL",
-	"VA_ABNORMAL",
-	"VA_SEQUENTIAL",
-	"VA_INVALIDATE",
-};
-
-asmlinkage void sunos_vadvise(u32 strategy)
-{
-	static int count;
-
-	/* I wanna see who uses this... */
-	if (count++ < 5)
-		printk("%s: Advises us to use %s paging strategy\n",
-		       current->comm,
-		       strategy <= 3 ? vstrings[strategy] : "BOGUS");
-}
-
-/* This just wants the soft limit (ie. rlim_cur element) of the RLIMIT_NOFILE
- * resource limit and is for backwards compatibility with older sunos
- * revs.
- */
-asmlinkage int sunos_getdtablesize(void)
-{
-	return SUNOS_NR_OPEN;
-}
-
-
-#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
-
-asmlinkage u32 sunos_sigblock(u32 blk_mask)
-{
-	u32 old;
-
-	spin_lock_irq(&current->sighand->siglock);
-	old = (u32) current->blocked.sig[0];
-	current->blocked.sig[0] |= (blk_mask & _BLOCKABLE);
-	recalc_sigpending();
-	spin_unlock_irq(&current->sighand->siglock);
-	return old;
-}
-
-asmlinkage u32 sunos_sigsetmask(u32 newmask)
-{
-	u32 retval;
-
-	spin_lock_irq(&current->sighand->siglock);
-	retval = (u32) current->blocked.sig[0];
-	current->blocked.sig[0] = (newmask & _BLOCKABLE);
-	recalc_sigpending();
-	spin_unlock_irq(&current->sighand->siglock);
-	return retval;
-}
-
-/* SunOS getdents is very similar to the newer Linux (iBCS2 compliant)    */
-/* getdents system call, the format of the structure just has a different */
-/* layout (d_off+d_ino instead of d_ino+d_off) */
-struct sunos_dirent {
-    s32		d_off;
-    u32		d_ino;
-    u16		d_reclen;
-    u16		d_namlen;
-    char	d_name[1];
-};
-
-struct sunos_dirent_callback {
-    struct sunos_dirent __user *curr;
-    struct sunos_dirent __user *previous;
-    int count;
-    int error;
-};
-
-#define NAME_OFFSET(de) ((int) ((de)->d_name - (char __user *) (de)))
-#define ROUND_UP(x) (((x)+sizeof(s32)-1) & ~(sizeof(s32)-1))
-
-static int sunos_filldir(void * __buf, const char * name, int namlen,
-			 loff_t offset, ino_t ino, unsigned int d_type)
-{
-	struct sunos_dirent __user *dirent;
-	struct sunos_dirent_callback * buf = (struct sunos_dirent_callback *) __buf;
-	int reclen = ROUND_UP(NAME_OFFSET(dirent) + namlen + 1);
-	u32 d_ino;
-
-	buf->error = -EINVAL;	/* only used if we fail.. */
-	if (reclen > buf->count)
-		return -EINVAL;
-	d_ino = ino;
-	if (sizeof(d_ino) < sizeof(ino) && d_ino != ino)
-		return -EOVERFLOW;
-	dirent = buf->previous;
-	if (dirent)
-		put_user(offset, &dirent->d_off);
-	dirent = buf->curr;
-	buf->previous = dirent;
-	put_user(d_ino, &dirent->d_ino);
-	put_user(namlen, &dirent->d_namlen);
-	put_user(reclen, &dirent->d_reclen);
-	if (copy_to_user(dirent->d_name, name, namlen))
-		return -EFAULT;
-	put_user(0, dirent->d_name + namlen);
-	dirent = (void __user *) dirent + reclen;
-	buf->curr = dirent;
-	buf->count -= reclen;
-	return 0;
-}
-
-asmlinkage int sunos_getdents(unsigned int fd, void __user *dirent, int cnt)
-{
-	struct file * file;
-	struct sunos_dirent __user *lastdirent;
-	struct sunos_dirent_callback buf;
-	int error = -EBADF;
-
-	if (fd >= SUNOS_NR_OPEN)
-		goto out;
-
-	file = fget(fd);
-	if (!file)
-		goto out;
-
-	error = -EINVAL;
-	if (cnt < (sizeof(struct sunos_dirent) + 255))
-		goto out_putf;
-
-	buf.curr = (struct sunos_dirent __user *) dirent;
-	buf.previous = NULL;
-	buf.count = cnt;
-	buf.error = 0;
-
-	error = vfs_readdir(file, sunos_filldir, &buf);
-	if (error < 0)
-		goto out_putf;
-
-	lastdirent = buf.previous;
-	error = buf.error;
-	if (lastdirent) {
-		put_user(file->f_pos, &lastdirent->d_off);
-		error = cnt - buf.count;
-	}
-
-out_putf:
-	fput(file);
-out:
-	return error;
-}
-
-/* Old sunos getdirentries, severely broken compatibility stuff here. */
-struct sunos_direntry {
-    u32		d_ino;
-    u16		d_reclen;
-    u16		d_namlen;
-    char	d_name[1];
-};
-
-struct sunos_direntry_callback {
-    struct sunos_direntry __user *curr;
-    struct sunos_direntry __user *previous;
-    int count;
-    int error;
-};
-
-static int sunos_filldirentry(void * __buf, const char * name, int namlen,
-			      loff_t offset, ino_t ino, unsigned int d_type)
-{
-	struct sunos_direntry __user *dirent;
-	struct sunos_direntry_callback * buf =
-		(struct sunos_direntry_callback *) __buf;
-	int reclen = ROUND_UP(NAME_OFFSET(dirent) + namlen + 1);
-	u32 d_ino;
-
-	buf->error = -EINVAL;	/* only used if we fail.. */
-	if (reclen > buf->count)
-		return -EINVAL;
-	d_ino = ino;
-	if (sizeof(d_ino) < sizeof(ino) && d_ino != ino)
-		return -EOVERFLOW;
-	dirent = buf->previous;
-	dirent = buf->curr;
-	buf->previous = dirent;
-	put_user(d_ino, &dirent->d_ino);
-	put_user(namlen, &dirent->d_namlen);
-	put_user(reclen, &dirent->d_reclen);
-	if (copy_to_user(dirent->d_name, name, namlen))
-		return -EFAULT;
-	put_user(0, dirent->d_name + namlen);
-	dirent = (void __user *) dirent + reclen;
-	buf->curr = dirent;
-	buf->count -= reclen;
-	return 0;
-}
-
-asmlinkage int sunos_getdirentries(unsigned int fd,
-				   void __user *dirent,
-				   int cnt,
-				   unsigned int __user *basep)
-{
-	struct file * file;
-	struct sunos_direntry __user *lastdirent;
-	int error = -EBADF;
-	struct sunos_direntry_callback buf;
-
-	if (fd >= SUNOS_NR_OPEN)
-		goto out;
-
-	file = fget(fd);
-	if (!file)
-		goto out;
-
-	error = -EINVAL;
-	if (cnt < (sizeof(struct sunos_direntry) + 255))
-		goto out_putf;
-
-	buf.curr = (struct sunos_direntry __user *) dirent;
-	buf.previous = NULL;
-	buf.count = cnt;
-	buf.error = 0;
-
-	error = vfs_readdir(file, sunos_filldirentry, &buf);
-	if (error < 0)
-		goto out_putf;
-
-	lastdirent = buf.previous;
-	error = buf.error;
-	if (lastdirent) {
-		put_user(file->f_pos, basep);
-		error = cnt - buf.count;
-	}
-
-out_putf:
-	fput(file);
-out:
-	return error;
-}
-
-struct sunos_utsname {
-	char sname[9];
-	char nname[9];
-	char nnext[56];
-	char rel[9];
-	char ver[9];
-	char mach[9];
-};
-
-asmlinkage int sunos_uname(struct sunos_utsname __user *name)
-{
-	int ret;
-
-	down_read(&uts_sem);
-	ret = copy_to_user(&name->sname[0], &utsname()->sysname[0],
-			   sizeof(name->sname) - 1);
-	ret |= copy_to_user(&name->nname[0], &utsname()->nodename[0],
-			    sizeof(name->nname) - 1);
-	ret |= put_user('\0', &name->nname[8]);
-	ret |= copy_to_user(&name->rel[0], &utsname()->release[0],
-			    sizeof(name->rel) - 1);
-	ret |= copy_to_user(&name->ver[0], &utsname()->version[0],
-			    sizeof(name->ver) - 1);
-	ret |= copy_to_user(&name->mach[0], &utsname()->machine[0],
-			    sizeof(name->mach) - 1);
-	up_read(&uts_sem);
-	return (ret ? -EFAULT : 0);
-}
-
-asmlinkage int sunos_nosys(void)
-{
-	struct pt_regs *regs;
-	siginfo_t info;
-	static int cnt;
-
-	regs = current_thread_info()->kregs;
-	if (test_thread_flag(TIF_32BIT)) {
-		regs->tpc &= 0xffffffff;
-		regs->tnpc &= 0xffffffff;
-	}
-	info.si_signo = SIGSYS;
-	info.si_errno = 0;
-	info.si_code = __SI_FAULT|0x100;
-	info.si_addr = (void __user *)regs->tpc;
-	info.si_trapno = regs->u_regs[UREG_G1];
-	send_sig_info(SIGSYS, &info, current);
-	if (cnt++ < 4) {
-		printk("Process makes ni_syscall number %d, register dump:\n",
-		       (int) regs->u_regs[UREG_G1]);
-		show_regs(regs);
-	}
-	return -ENOSYS;
-}
-
-/* This is not a real and complete implementation yet, just to keep
- * the easy SunOS binaries happy.
- */
-asmlinkage int sunos_fpathconf(int fd, int name)
-{
-	int ret;
-
-	switch(name) {
-	case _PCONF_LINK:
-		ret = LINK_MAX;
-		break;
-	case _PCONF_CANON:
-		ret = MAX_CANON;
-		break;
-	case _PCONF_INPUT:
-		ret = MAX_INPUT;
-		break;
-	case _PCONF_NAME:
-		ret = NAME_MAX;
-		break;
-	case _PCONF_PATH:
-		ret = PATH_MAX;
-		break;
-	case _PCONF_PIPE:
-		ret = PIPE_BUF;
-		break;
-	case _PCONF_CHRESTRICT:		/* XXX Investigate XXX */
-		ret = 1;
-		break;
-	case _PCONF_NOTRUNC:		/* XXX Investigate XXX */
-	case _PCONF_VDISABLE:
-		ret = 0;
-		break;
-	default:
-		ret = -EINVAL;
-		break;
-	}
-	return ret;
-}
-
-asmlinkage int sunos_pathconf(u32 u_path, int name)
-{
-	int ret;
-
-	ret = sunos_fpathconf(0, name); /* XXX cheese XXX */
-	return ret;
-}
-
-asmlinkage int sunos_select(int width, u32 inp, u32 outp, u32 exp, u32 tvp_x)
-{
-	int ret;
-
-	/* SunOS binaries expect that select won't change the tvp contents */
-	ret = compat_sys_select(width, compat_ptr(inp), compat_ptr(outp),
-				compat_ptr(exp), compat_ptr(tvp_x));
-	if (ret == -EINTR && tvp_x) {
-		struct compat_timeval __user *tvp = compat_ptr(tvp_x);
-		time_t sec, usec;
-
-		__get_user(sec, &tvp->tv_sec);
-		__get_user(usec, &tvp->tv_usec);
-		if (sec == 0 && usec == 0)
-			ret = 0;
-	}
-	return ret;
-}
-
-asmlinkage void sunos_nop(void)
-{
-	return;
-}
-
-#if 0 /* This code doesn't translate user pointers correctly,
-       * disable for now. -DaveM
-       */
-
-/* XXXXXXXXXX SunOS mount/umount. XXXXXXXXXXX */
-#define SMNT_RDONLY       1
-#define SMNT_NOSUID       2
-#define SMNT_NEWTYPE      4
-#define SMNT_GRPID        8
-#define SMNT_REMOUNT      16
-#define SMNT_NOSUB        32
-#define SMNT_MULTI        64
-#define SMNT_SYS5         128
-
-struct sunos_fh_t {
-	char fh_data [NFS_FHSIZE];
-};
-
-struct sunos_nfs_mount_args {
-	struct sockaddr_in  *addr; /* file server address */
-	struct nfs_fh *fh;     /* File handle to be mounted */
-	int        flags;      /* flags */
-	int        wsize;      /* write size in bytes */
-	int        rsize;      /* read size in bytes */
-	int        timeo;      /* initial timeout in .1 secs */
-	int        retrans;    /* times to retry send */
-	char       *hostname;  /* server's hostname */
-	int        acregmin;   /* attr cache file min secs */
-	int        acregmax;   /* attr cache file max secs */
-	int        acdirmin;   /* attr cache dir min secs */
-	int        acdirmax;   /* attr cache dir max secs */
-	char       *netname;   /* server's netname */
-};
-
-
-/* Bind the socket on a local reserved port and connect it to the
- * remote server.  This on Linux/i386 is done by the mount program,
- * not by the kernel. 
- */
-/* XXXXXXXXXXXXXXXXXXXX */
-static int
-sunos_nfs_get_server_fd (int fd, struct sockaddr_in *addr)
-{
-	struct sockaddr_in local;
-	struct sockaddr_in server;
-	int    try_port;
-	int    ret;
-	struct socket *socket;
-	struct inode  *inode;
-	struct file   *file;
-
-	file = fget(fd);
-	if (!file)
-		return 0;
-
-	inode = file->f_path.dentry->d_inode;
-
-	socket = SOCKET_I(inode);
-	local.sin_family = AF_INET;
-	local.sin_addr.s_addr = htonl(INADDR_ANY);
-
-	/* IPPORT_RESERVED = 1024, can't find the definition in the kernel */
-	try_port = 1024;
-	do {
-		local.sin_port = htons (--try_port);
-		ret = socket->ops->bind(socket, (struct sockaddr*)&local,
-					sizeof(local));
-	} while (ret && try_port > (1024 / 2));
-
-	if (ret) {
-		fput(file);
-		return 0;
-	}
-
-	server.sin_family = AF_INET;
-	server.sin_addr = addr->sin_addr;
-	server.sin_port = NFS_PORT;
-
-	/* Call sys_connect */
-	ret = socket->ops->connect (socket, (struct sockaddr *) &server,
-				    sizeof (server), file->f_flags);
-	fput(file);
-	if (ret < 0)
-		return 0;
-	return 1;
-}
-
-/* XXXXXXXXXXXXXXXXXXXX */
-static int get_default (int value, int def_value)
-{
-    if (value)
-	return value;
-    else
-	return def_value;
-}
-
-/* XXXXXXXXXXXXXXXXXXXX */
-static int sunos_nfs_mount(char *dir_name, int linux_flags, void __user *data)
-{
-	int  server_fd, err;
-	char *the_name, *mount_page;
-	struct nfs_mount_data linux_nfs_mount;
-	struct sunos_nfs_mount_args sunos_mount;
-
-	/* Ok, here comes the fun part: Linux's nfs mount needs a
-	 * socket connection to the server, but SunOS mount does not
-	 * require this, so we use the information on the destination
-	 * address to create a socket and bind it to a reserved
-	 * port on this system
-	 */
-	if (copy_from_user(&sunos_mount, data, sizeof(sunos_mount)))
-		return -EFAULT;
-
-	server_fd = sys_socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);
-	if (server_fd < 0)
-		return -ENXIO;
-
-	if (copy_from_user(&linux_nfs_mount.addr, sunos_mount.addr,
-			   sizeof(*sunos_mount.addr)) ||
-	    copy_from_user(&linux_nfs_mount.root, sunos_mount.fh,
-			   sizeof(*sunos_mount.fh))) {
-		sys_close (server_fd);
-		return -EFAULT;
-	}
-
-	if (!sunos_nfs_get_server_fd (server_fd, &linux_nfs_mount.addr)){
-		sys_close (server_fd);
-		return -ENXIO;
-	}
-
-	/* Now, bind it to a locally reserved port */
-	linux_nfs_mount.version  = NFS_MOUNT_VERSION;
-	linux_nfs_mount.flags    = sunos_mount.flags;
-	linux_nfs_mount.fd       = server_fd;
-	
-	linux_nfs_mount.rsize    = get_default (sunos_mount.rsize, 8192);
-	linux_nfs_mount.wsize    = get_default (sunos_mount.wsize, 8192);
-	linux_nfs_mount.timeo    = get_default (sunos_mount.timeo, 10);
-	linux_nfs_mount.retrans  = sunos_mount.retrans;
-	
-	linux_nfs_mount.acregmin = sunos_mount.acregmin;
-	linux_nfs_mount.acregmax = sunos_mount.acregmax;
-	linux_nfs_mount.acdirmin = sunos_mount.acdirmin;
-	linux_nfs_mount.acdirmax = sunos_mount.acdirmax;
-
-	the_name = getname(sunos_mount.hostname);
-	if (IS_ERR(the_name))
-		return PTR_ERR(the_name);
-
-	strlcpy(linux_nfs_mount.hostname, the_name,
-		sizeof(linux_nfs_mount.hostname));
-	putname (the_name);
-	
-	mount_page = (char *) get_zeroed_page(GFP_KERNEL);
-	if (!mount_page)
-		return -ENOMEM;
-
-	memcpy(mount_page, &linux_nfs_mount, sizeof(linux_nfs_mount));
-
-	err = do_mount("", dir_name, "nfs", linux_flags, mount_page);
-
-	free_page((unsigned long) mount_page);
-	return err;
-}
-
-/* XXXXXXXXXXXXXXXXXXXX */
-asmlinkage int
-sunos_mount(char *type, char *dir, int flags, void *data)
-{
-	int linux_flags = 0;
-	int ret = -EINVAL;
-	char *dev_fname = 0;
-	char *dir_page, *type_page;
-
-	if (!capable (CAP_SYS_ADMIN))
-		return -EPERM;
-
-	/* We don't handle the integer fs type */
-	if ((flags & SMNT_NEWTYPE) == 0)
-		goto out;
-
-	/* Do not allow for those flags we don't support */
-	if (flags & (SMNT_GRPID|SMNT_NOSUB|SMNT_MULTI|SMNT_SYS5))
-		goto out;
-
-	if (flags & SMNT_REMOUNT)
-		linux_flags |= MS_REMOUNT;
-	if (flags & SMNT_RDONLY)
-		linux_flags |= MS_RDONLY;
-	if (flags & SMNT_NOSUID)
-		linux_flags |= MS_NOSUID;
-
-	dir_page = getname(dir);
-	ret = PTR_ERR(dir_page);
-	if (IS_ERR(dir_page))
-		goto out;
-
-	type_page = getname(type);
-	ret = PTR_ERR(type_page);
-	if (IS_ERR(type_page))
-		goto out1;
-
-	if (strcmp(type_page, "ext2") == 0) {
-		dev_fname = getname(data);
-	} else if (strcmp(type_page, "iso9660") == 0) {
-		dev_fname = getname(data);
-	} else if (strcmp(type_page, "minix") == 0) {
-		dev_fname = getname(data);
-	} else if (strcmp(type_page, "nfs") == 0) {
-		ret = sunos_nfs_mount (dir_page, flags, data);
-		goto out2;
-        } else if (strcmp(type_page, "ufs") == 0) {
-		printk("Warning: UFS filesystem mounts unsupported.\n");
-		ret = -ENODEV;
-		goto out2;
-	} else if (strcmp(type_page, "proc")) {
-		ret = -ENODEV;
-		goto out2;
-	}
-	ret = PTR_ERR(dev_fname);
-	if (IS_ERR(dev_fname))
-		goto out2;
-	lock_kernel();
-	ret = do_mount(dev_fname, dir_page, type_page, linux_flags, NULL);
-	unlock_kernel();
-	if (dev_fname)
-		putname(dev_fname);
-out2:
-	putname(type_page);
-out1:
-	putname(dir_page);
-out:
-	return ret;
-}
-#endif
-
-asmlinkage int sunos_setpgrp(pid_t pid, pid_t pgid)
-{
-	int ret;
-
-	/* So stupid... */
-	if ((!pid || pid == current->pid) &&
-	    !pgid) {
-		sys_setsid();
-		ret = 0;
-	} else {
-		ret = sys_setpgid(pid, pgid);
-	}
-	return ret;
-}
-
-/* So stupid... */
-extern long compat_sys_wait4(compat_pid_t, compat_uint_t __user *, int,
-			     struct compat_rusage __user *);
-
-asmlinkage int sunos_wait4(compat_pid_t pid, compat_uint_t __user *stat_addr, int options, struct compat_rusage __user *ru)
-{
-	int ret;
-
-	ret = compat_sys_wait4((pid ? pid : ((compat_pid_t)-1)),
-			       stat_addr, options, ru);
-	return ret;
-}
-
-asmlinkage int sunos_killpg(int pgrp, int sig)
-{
-	int ret;
-
-	rcu_read_lock();
-	ret = -EINVAL;
-	if (pgrp > 0)
-		ret = kill_pgrp(find_vpid(pgrp), sig, 0);
-	rcu_read_unlock();
-
-	return ret;
-}
-
-asmlinkage int sunos_audit(void)
-{
-	printk ("sys_audit\n");
-	return -1;
-}
-
-asmlinkage u32 sunos_gethostid(void)
-{
-	u32 ret;
-
-	ret = (((u32)idprom->id_machtype << 24) | ((u32)idprom->id_sernum));
-
-	return ret;
-}
-
-/* sysconf options, for SunOS compatibility */
-#define   _SC_ARG_MAX             1
-#define   _SC_CHILD_MAX           2
-#define   _SC_CLK_TCK             3
-#define   _SC_NGROUPS_MAX         4
-#define   _SC_OPEN_MAX            5
-#define   _SC_JOB_CONTROL         6
-#define   _SC_SAVED_IDS           7
-#define   _SC_VERSION             8
-
-asmlinkage s32 sunos_sysconf (int name)
-{
-	s32 ret;
-
-	switch (name){
-	case _SC_ARG_MAX:
-		ret = ARG_MAX;
-		break;
-	case _SC_CHILD_MAX:
-		ret = current->signal->rlim[RLIMIT_NPROC].rlim_cur;
-		break;
-	case _SC_CLK_TCK:
-		ret = HZ;
-		break;
-	case _SC_NGROUPS_MAX:
-		ret = NGROUPS_MAX;
-		break;
-	case _SC_OPEN_MAX:
-		ret = current->signal->rlim[RLIMIT_NOFILE].rlim_cur;
-		break;
-	case _SC_JOB_CONTROL:
-		ret = 1;	/* yes, we do support job control */
-		break;
-	case _SC_SAVED_IDS:
-		ret = 1;	/* yes, we do support saved uids  */
-		break;
-	case _SC_VERSION:
-		/* mhm, POSIX_VERSION is in /usr/include/unistd.h
-		 * should it go on /usr/include/linux?
-		 */
-		ret = 199009;
-		break;
-	default:
-		ret = -1;
-		break;
-	};
-	return ret;
-}
-
-asmlinkage int sunos_semsys(int op, u32 arg1, u32 arg2, u32 arg3, void __user *ptr)
-{
-	union semun arg4;
-	int ret;
-
-	switch (op) {
-	case 0:
-		/* Most arguments match on a 1:1 basis but cmd doesn't */
-		switch(arg3) {
-		case 4:
-			arg3=GETPID; break;
-		case 5:
-			arg3=GETVAL; break;
-		case 6:
-			arg3=GETALL; break;
-		case 3:
-			arg3=GETNCNT; break;
-		case 7:
-			arg3=GETZCNT; break;
-		case 8:
-			arg3=SETVAL; break;
-		case 9:
-			arg3=SETALL; break;
-		}
-		/* sys_semctl(): */
-		/* value to modify semaphore to */
-		arg4.__pad = ptr;
-		ret = sys_semctl((int)arg1, (int)arg2, (int)arg3, arg4);
-		break;
-	case 1:
-		/* sys_semget(): */
-		ret = sys_semget((key_t)arg1, (int)arg2, (int)arg3);
-		break;
-	case 2:
-		/* sys_semop(): */
-		ret = sys_semop((int)arg1, (struct sembuf __user *)(unsigned long)arg2,
-				(unsigned int) arg3);
-		break;
-	default:
-		ret = -EINVAL;
-		break;
-	};
-	return ret;
-}
-
-struct msgbuf32 {
-	s32 mtype;
-	char mtext[1];
-};
-
-struct ipc_perm32
-{
-	key_t    	  key;
-        compat_uid_t  uid;
-        compat_gid_t  gid;
-        compat_uid_t  cuid;
-        compat_gid_t  cgid;
-        compat_mode_t mode;
-        unsigned short  seq;
-};
-
-struct msqid_ds32
-{
-        struct ipc_perm32 msg_perm;
-        u32 msg_first;
-        u32 msg_last;
-        compat_time_t msg_stime;
-        compat_time_t msg_rtime;
-        compat_time_t msg_ctime;
-        u32 wwait;
-        u32 rwait;
-        unsigned short msg_cbytes;
-        unsigned short msg_qnum;  
-        unsigned short msg_qbytes;
-        compat_ipc_pid_t msg_lspid;
-        compat_ipc_pid_t msg_lrpid;
-};
-
-static inline int sunos_msqid_get(struct msqid_ds32 __user *user,
-				  struct msqid_ds *kern)
-{
-	if (get_user(kern->msg_perm.key, &user->msg_perm.key)		||
-	    __get_user(kern->msg_perm.uid, &user->msg_perm.uid)		||
-	    __get_user(kern->msg_perm.gid, &user->msg_perm.gid)		||
-	    __get_user(kern->msg_perm.cuid, &user->msg_perm.cuid)	||
-	    __get_user(kern->msg_perm.cgid, &user->msg_perm.cgid)	||
-	    __get_user(kern->msg_stime, &user->msg_stime)		||
-	    __get_user(kern->msg_rtime, &user->msg_rtime)		||
-	    __get_user(kern->msg_ctime, &user->msg_ctime)		||
-	    __get_user(kern->msg_ctime, &user->msg_cbytes)		||
-	    __get_user(kern->msg_ctime, &user->msg_qnum)		||
-	    __get_user(kern->msg_ctime, &user->msg_qbytes)		||
-	    __get_user(kern->msg_ctime, &user->msg_lspid)		||
-	    __get_user(kern->msg_ctime, &user->msg_lrpid))
-		return -EFAULT;
-	return 0;
-}
-
-static inline int sunos_msqid_put(struct msqid_ds32 __user *user,
-				  struct msqid_ds *kern)
-{
-	if (put_user(kern->msg_perm.key, &user->msg_perm.key)		||
-	    __put_user(kern->msg_perm.uid, &user->msg_perm.uid)		||
-	    __put_user(kern->msg_perm.gid, &user->msg_perm.gid)		||
-	    __put_user(kern->msg_perm.cuid, &user->msg_perm.cuid)	||
-	    __put_user(kern->msg_perm.cgid, &user->msg_perm.cgid)	||
-	    __put_user(kern->msg_stime, &user->msg_stime)		||
-	    __put_user(kern->msg_rtime, &user->msg_rtime)		||
-	    __put_user(kern->msg_ctime, &user->msg_ctime)		||
-	    __put_user(kern->msg_ctime, &user->msg_cbytes)		||
-	    __put_user(kern->msg_ctime, &user->msg_qnum)		||
-	    __put_user(kern->msg_ctime, &user->msg_qbytes)		||
-	    __put_user(kern->msg_ctime, &user->msg_lspid)		||
-	    __put_user(kern->msg_ctime, &user->msg_lrpid))
-		return -EFAULT;
-	return 0;
-}
-
-static inline int sunos_msgbuf_get(struct msgbuf32 __user *user, struct msgbuf *kern, int len)
-{
-	if (get_user(kern->mtype, &user->mtype)	||
-	    __copy_from_user(kern->mtext, &user->mtext, len))
-		return -EFAULT;
-	return 0;
-}
-
-static inline int sunos_msgbuf_put(struct msgbuf32 __user *user, struct msgbuf *kern, int len)
-{
-	if (put_user(kern->mtype, &user->mtype)	||
-	    __copy_to_user(user->mtext, kern->mtext, len))
-		return -EFAULT;
-	return 0;
-}
-
-asmlinkage int sunos_msgsys(int op, u32 arg1, u32 arg2, u32 arg3, u32 arg4)
-{
-	struct sparc_stackf32 __user *sp;
-	struct msqid_ds kds;
-	struct msgbuf *kmbuf;
-	mm_segment_t old_fs = get_fs();
-	u32 arg5;
-	int rval;
-
-	switch(op) {
-	case 0:
-		rval = sys_msgget((key_t)arg1, (int)arg2);
-		break;
-	case 1:
-		if (!sunos_msqid_get((struct msqid_ds32 __user *)(unsigned long)arg3, &kds)) {
-			set_fs(KERNEL_DS);
-			rval = sys_msgctl((int)arg1, (int)arg2,
-					  (struct msqid_ds __user *)(unsigned long)arg3);
-			set_fs(old_fs);
-			if (!rval)
-				rval = sunos_msqid_put((struct msqid_ds32 __user *)(unsigned long)arg3,
-						       &kds);
-		} else
-			rval = -EFAULT;
-		break;
-	case 2:
-		rval = -EFAULT;
-		kmbuf = kmalloc(sizeof(struct msgbuf) + arg3,
-						 GFP_KERNEL);
-		if (!kmbuf)
-			break;
-		sp = (struct sparc_stackf32 __user *)
-			(current_thread_info()->kregs->u_regs[UREG_FP] & 0xffffffffUL);
-		if (get_user(arg5, &sp->xxargs[0])) {
-			rval = -EFAULT;
-			kfree(kmbuf);
-			break;
-		}
-		set_fs(KERNEL_DS);
-		rval = sys_msgrcv((int)arg1, (struct msgbuf __user *) kmbuf,
-				  (size_t)arg3,
-				  (long)arg4, (int)arg5);
-		set_fs(old_fs);
-		if (!rval)
-			rval = sunos_msgbuf_put((struct msgbuf32 __user *)(unsigned long)arg2,
-						kmbuf, arg3);
-		kfree(kmbuf);
-		break;
-	case 3:
-		rval = -EFAULT;
-		kmbuf = kmalloc(sizeof(struct msgbuf) + arg3,
-						 GFP_KERNEL);
-		if (!kmbuf || sunos_msgbuf_get((struct msgbuf32 __user *)(unsigned long)arg2,
-					       kmbuf, arg3))
-			break;
-		set_fs(KERNEL_DS);
-		rval = sys_msgsnd((int)arg1, (struct msgbuf __user *) kmbuf,
-				  (size_t)arg3, (int)arg4);
-		set_fs(old_fs);
-		kfree(kmbuf);
-		break;
-	default:
-		rval = -EINVAL;
-		break;
-	}
-	return rval;
-}
-
-struct shmid_ds32 {
-        struct ipc_perm32       shm_perm;
-        int                     shm_segsz;
-        compat_time_t         shm_atime;
-        compat_time_t         shm_dtime;
-        compat_time_t         shm_ctime;
-        compat_ipc_pid_t    shm_cpid; 
-        compat_ipc_pid_t    shm_lpid; 
-        unsigned short          shm_nattch;
-};
-                                                        
-static inline int sunos_shmid_get(struct shmid_ds32 __user *user,
-				  struct shmid_ds *kern)
-{
-	if (get_user(kern->shm_perm.key, &user->shm_perm.key)		||
-	    __get_user(kern->shm_perm.uid, &user->shm_perm.uid)		||
-	    __get_user(kern->shm_perm.gid, &user->shm_perm.gid)		||
-	    __get_user(kern->shm_perm.cuid, &user->shm_perm.cuid)	||
-	    __get_user(kern->shm_perm.cgid, &user->shm_perm.cgid)	||
-	    __get_user(kern->shm_segsz, &user->shm_segsz)		||
-	    __get_user(kern->shm_atime, &user->shm_atime)		||
-	    __get_user(kern->shm_dtime, &user->shm_dtime)		||
-	    __get_user(kern->shm_ctime, &user->shm_ctime)		||
-	    __get_user(kern->shm_cpid, &user->shm_cpid)			||
-	    __get_user(kern->shm_lpid, &user->shm_lpid)			||
-	    __get_user(kern->shm_nattch, &user->shm_nattch))
-		return -EFAULT;
-	return 0;
-}
-
-static inline int sunos_shmid_put(struct shmid_ds32 __user *user,
-				  struct shmid_ds *kern)
-{
-	if (put_user(kern->shm_perm.key, &user->shm_perm.key)		||
-	    __put_user(kern->shm_perm.uid, &user->shm_perm.uid)		||
-	    __put_user(kern->shm_perm.gid, &user->shm_perm.gid)		||
-	    __put_user(kern->shm_perm.cuid, &user->shm_perm.cuid)	||
-	    __put_user(kern->shm_perm.cgid, &user->shm_perm.cgid)	||
-	    __put_user(kern->shm_segsz, &user->shm_segsz)		||
-	    __put_user(kern->shm_atime, &user->shm_atime)		||
-	    __put_user(kern->shm_dtime, &user->shm_dtime)		||
-	    __put_user(kern->shm_ctime, &user->shm_ctime)		||
-	    __put_user(kern->shm_cpid, &user->shm_cpid)			||
-	    __put_user(kern->shm_lpid, &user->shm_lpid)			||
-	    __put_user(kern->shm_nattch, &user->shm_nattch))
-		return -EFAULT;
-	return 0;
-}
-
-asmlinkage int sunos_shmsys(int op, u32 arg1, u32 arg2, u32 arg3)
-{
-	struct shmid_ds ksds;
-	unsigned long raddr;
-	mm_segment_t old_fs = get_fs();
-	int rval;
-
-	switch(op) {
-	case 0:
-		/* do_shmat(): attach a shared memory area */
-		rval = do_shmat((int)arg1,(char __user *)(unsigned long)arg2,(int)arg3,&raddr);
-		if (!rval)
-			rval = (int) raddr;
-		break;
-	case 1:
-		/* sys_shmctl(): modify shared memory area attr. */
-		if (!sunos_shmid_get((struct shmid_ds32 __user *)(unsigned long)arg3, &ksds)) {
-			set_fs(KERNEL_DS);
-			rval = sys_shmctl((int) arg1,(int) arg2,
-					  (struct shmid_ds __user *) &ksds);
-			set_fs(old_fs);
-			if (!rval)
-				rval = sunos_shmid_put((struct shmid_ds32 __user *)(unsigned long)arg3,
-						       &ksds);
-		} else
-			rval = -EFAULT;
-		break;
-	case 2:
-		/* sys_shmdt(): detach a shared memory area */
-		rval = sys_shmdt((char __user *)(unsigned long)arg1);
-		break;
-	case 3:
-		/* sys_shmget(): get a shared memory area */
-		rval = sys_shmget((key_t)arg1,(int)arg2,(int)arg3);
-		break;
-	default:
-		rval = -EINVAL;
-		break;
-	};
-	return rval;
-}
-
-extern asmlinkage long sparc32_open(const char __user * filename, int flags, int mode);
-
-asmlinkage int sunos_open(u32 fname, int flags, int mode)
-{
-	const char __user *filename = compat_ptr(fname);
-
-	return sparc32_open(filename, flags, mode);
-}
-
-#define SUNOS_EWOULDBLOCK 35
-
-/* see the sunos man page read(2v) for an explanation
-   of this garbage. We use O_NDELAY to mark
-   file descriptors that have been set non-blocking 
-   using 4.2BSD style calls. (tridge) */
-
-static inline int check_nonblock(int ret, int fd)
-{
-	if (ret == -EAGAIN) {
-		struct file * file = fget(fd);
-		if (file) {
-			if (file->f_flags & O_NDELAY)
-				ret = -SUNOS_EWOULDBLOCK;
-			fput(file);
-		}
-	}
-	return ret;
-}
-
-asmlinkage int sunos_read(unsigned int fd, char __user *buf, u32 count)
-{
-	int ret;
-
-	ret = check_nonblock(sys_read(fd, buf, count), fd);
-	return ret;
-}
-
-asmlinkage int sunos_readv(u32 fd, void __user *vector, s32 count)
-{
-	int ret;
-
-	ret = check_nonblock(compat_sys_readv(fd, vector, count), fd);
-	return ret;
-}
-
-asmlinkage int sunos_write(unsigned int fd, char __user *buf, u32 count)
-{
-	int ret;
-
-	ret = check_nonblock(sys_write(fd, buf, count), fd);
-	return ret;
-}
-
-asmlinkage int sunos_writev(u32 fd, void __user *vector, s32 count)
-{
-	int ret;
-
-	ret = check_nonblock(compat_sys_writev(fd, vector, count), fd);
-	return ret;
-}
-
-asmlinkage int sunos_recv(u32 __fd, void __user *ubuf, int size, unsigned flags)
-{
-	int ret, fd = (int) __fd;
-
-	ret = check_nonblock(sys_recv(fd, ubuf, size, flags), fd);
-	return ret;
-}
-
-asmlinkage int sunos_send(u32 __fd, void __user *buff, int len, unsigned flags)
-{
-	int ret, fd = (int) __fd;
-
-	ret = check_nonblock(sys_send(fd, buff, len, flags), fd);
-	return ret;
-}
-
-asmlinkage int sunos_accept(u32 __fd, struct sockaddr __user *sa, int __user *addrlen)
-{
-	int ret, fd = (int) __fd;
-
-	while (1) {
-		ret = check_nonblock(sys_accept(fd, sa, addrlen), fd);
-		if (ret != -ENETUNREACH && ret != -EHOSTUNREACH)
-			break;
-	}
-	return ret;
-}
-
-#define SUNOS_SV_INTERRUPT 2
-
-asmlinkage int sunos_sigaction (int sig,
-				struct old_sigaction32 __user *act,
-				struct old_sigaction32 __user *oact)
-{
-	struct k_sigaction new_ka, old_ka;
-	int ret;
-
-	if (act) {
-		compat_old_sigset_t mask;
-		u32 u_handler;
-
-		if (get_user(u_handler, &act->sa_handler) ||
-		    __get_user(new_ka.sa.sa_flags, &act->sa_flags))
-			return -EFAULT;
-		new_ka.sa.sa_handler = compat_ptr(u_handler);
-		__get_user(mask, &act->sa_mask);
-		new_ka.sa.sa_restorer = NULL;
-		new_ka.ka_restorer = NULL;
-		siginitset(&new_ka.sa.sa_mask, mask);
-		new_ka.sa.sa_flags ^= SUNOS_SV_INTERRUPT;
-	}
-
-	ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
-
-	if (!ret && oact) {
-		old_ka.sa.sa_flags ^= SUNOS_SV_INTERRUPT;
-		if (put_user(ptr_to_compat(old_ka.sa.sa_handler), &oact->sa_handler) ||
-		    __put_user(old_ka.sa.sa_flags, &oact->sa_flags))
-			return -EFAULT;
-		__put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
-	}
-
-	return ret;
-}
-
-asmlinkage int sunos_setsockopt(u32 __fd, u32 __level, u32 __optname,
-				char __user *optval, u32 __optlen)
-{
-	int fd = (int) __fd;
-	int level = (int) __level;
-	int optname = (int) __optname;
-	int optlen = (int) __optlen;
-	int tr_opt = optname;
-	int ret;
-
-	if (level == SOL_IP) {
-		/* Multicast socketopts (ttl, membership) */
-		if (tr_opt >=2 && tr_opt <= 6)
-			tr_opt += 30;
-	}
-	ret = sys_setsockopt(fd, level, tr_opt,
-			     optval, optlen);
-	return ret;
-}
-
-asmlinkage int sunos_getsockopt(u32 __fd, u32 __level, u32 __optname,
-				char __user *optval, int __user *optlen)
-{
-	int fd = (int) __fd;
-	int level = (int) __level;
-	int optname = (int) __optname;
-	int tr_opt = optname;
-	int ret;
-
-	if (level == SOL_IP) {
-		/* Multicast socketopts (ttl, membership) */
-		if (tr_opt >=2 && tr_opt <= 6)
-			tr_opt += 30;
-	}
-	ret = compat_sys_getsockopt(fd, level, tr_opt,
-				    optval, optlen);
-	return ret;
-}
diff --git a/arch/sparc64/kernel/systbls.S b/arch/sparc64/kernel/systbls.S
index 6b9b718..a4fef2b 100644
--- a/arch/sparc64/kernel/systbls.S
+++ b/arch/sparc64/kernel/systbls.S
@@ -155,125 +155,3 @@
 	.word sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait
 /*310*/	.word sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate
 	.word sys_timerfd_settime, sys_timerfd_gettime
-
-#if defined(CONFIG_SUNOS_EMUL) || defined(CONFIG_SOLARIS_EMUL) || \
-    defined(CONFIG_SOLARIS_EMUL_MODULE)
-	/* Now the 32-bit SunOS syscall table. */
-
-	.align 4
-	.globl sunos_sys_table
-sunos_sys_table:
-/*0*/	.word sunos_indir, sys32_exit, sys_fork
-	.word sunos_read, sunos_write, sunos_open
-	.word sys_close, sunos_wait4, sys_creat
-	.word sys_link, sys_unlink, sunos_execv
-	.word sys_chdir, sunos_nosys, sys32_mknod
-	.word sys_chmod, sys32_lchown16, sunos_brk
-	.word sunos_nosys, sys32_lseek, sunos_getpid
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_getuid, sunos_nosys, sys_ptrace
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sys_access, sunos_nosys, sunos_nosys
-	.word sys_sync, sys_kill, compat_sys_newstat
-	.word sunos_nosys, compat_sys_newlstat, sys_dup
-	.word sys_pipe, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_getgid
-	.word sunos_nosys, sunos_nosys
-/*50*/	.word sunos_nosys, sys_acct, sunos_nosys
-	.word sunos_mctl, sunos_ioctl, sys_reboot
-	.word sunos_nosys, sys_symlink, sys_readlink
-	.word sys32_execve, sys_umask, sys_chroot
-	.word compat_sys_newfstat, sunos_nosys, sys_getpagesize
-	.word sys_msync, sys_vfork, sunos_nosys
-	.word sunos_nosys, sunos_sbrk, sunos_sstk
-	.word sunos_mmap, sunos_vadvise, sys_munmap
-	.word sys_mprotect, sys_madvise, sys_vhangup
-	.word sunos_nosys, sys_mincore, sys32_getgroups16
-	.word sys32_setgroups16, sys_getpgrp, sunos_setpgrp
-	.word compat_sys_setitimer, sunos_nosys, sys_swapon
-	.word compat_sys_getitimer, sys_gethostname, sys_sethostname
-	.word sunos_getdtablesize, sys_dup2, sunos_nop
-	.word compat_sys_fcntl, sunos_select, sunos_nop
-	.word sys_fsync, sys32_setpriority, sys32_socket
-	.word sys32_connect, sunos_accept
-/*100*/	.word sys_getpriority, sunos_send, sunos_recv
-	.word sunos_nosys, sys32_bind, sunos_setsockopt
-	.word sys32_listen, sunos_nosys, sunos_sigaction
-	.word sunos_sigblock, sunos_sigsetmask, sys_sigpause
-	.word sys32_sigstack, sys32_recvmsg, sys32_sendmsg
-	.word sunos_nosys, sys32_gettimeofday, compat_sys_getrusage
-	.word sunos_getsockopt, sunos_nosys, sunos_readv
-	.word sunos_writev, sys32_settimeofday, sys32_fchown16
-	.word sys_fchmod, sys32_recvfrom, sys32_setreuid16
-	.word sys32_setregid16, sys_rename, sys_truncate
-	.word sys_ftruncate, sys_flock, sunos_nosys
-	.word sys32_sendto, sys32_shutdown, sys32_socketpair
-	.word sys_mkdir, sys_rmdir, sys32_utimes
-	.word sys32_sigreturn, sunos_nosys, sys32_getpeername
-	.word sunos_gethostid, sunos_nosys, compat_sys_getrlimit
-	.word compat_sys_setrlimit, sunos_killpg, sunos_nosys
-	.word sunos_nosys, sunos_nosys
-/*150*/	.word sys32_getsockname, sunos_nosys, sunos_nosys
-	.word sys_poll, sunos_nosys, sunos_nosys
-	.word sunos_getdirentries, compat_sys_statfs, compat_sys_fstatfs
-	.word sys_oldumount, sunos_nosys, sunos_nosys
-	.word sys_getdomainname, sys_setdomainname
-	.word sunos_nosys, sys_quotactl, sunos_nosys
-	.word sunos_nosys, sys_ustat, sunos_semsys
-	.word sunos_nosys, sunos_shmsys, sunos_audit
-	.word sunos_nosys, sunos_getdents, sys_setsid
-	.word sys_fchdir, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, compat_sys_sigpending, sunos_nosys
-	.word sys_setpgid, sunos_pathconf, sunos_fpathconf
-	.word sunos_sysconf, sunos_uname, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-/*200*/	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys
-/*250*/	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys
-/*260*/	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys
-/*270*/	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys
-/*280*/	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys
-/*290*/	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys
-/*300*/	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys
-/*310*/	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys, sunos_nosys, sunos_nosys
-	.word sunos_nosys
-
-#endif
diff --git a/arch/sparc64/kernel/systbls.h b/arch/sparc64/kernel/systbls.h
index 8a0d20a..bc9f5da 100644
--- a/arch/sparc64/kernel/systbls.h
+++ b/arch/sparc64/kernel/systbls.h
@@ -27,8 +27,6 @@
 					     unsigned long new_addr);
 extern asmlinkage unsigned long c_sys_nis_syscall(struct pt_regs *regs);
 extern asmlinkage long sys_getdomainname(char __user *name, int len);
-extern asmlinkage long solaris_syscall(struct pt_regs *regs);
-extern asmlinkage long sunos_syscall(struct pt_regs *regs);
 extern asmlinkage long sys_utrap_install(utrap_entry_t type,
 					 utrap_handler_t new_p,
 					 utrap_handler_t new_d,
diff --git a/arch/sparc64/kernel/ttable.S b/arch/sparc64/kernel/ttable.S
index 7575aa3..b0de4c0 100644
--- a/arch/sparc64/kernel/ttable.S
+++ b/arch/sparc64/kernel/ttable.S
@@ -117,16 +117,13 @@
 tl0_f5o:	FILL_5_OTHER
 tl0_f6o:	FILL_6_OTHER
 tl0_f7o:	FILL_7_OTHER
-tl0_sunos:	SUNOS_SYSCALL_TRAP
+tl0_resv100:	BTRAP(0x100)
 tl0_bkpt:	BREAKPOINT_TRAP
 tl0_divz:	TRAP(do_div0)
 tl0_flushw:	FLUSH_WINDOW_TRAP
-tl0_resv104:	BTRAP(0x104) BTRAP(0x105) BTRAP(0x106) BTRAP(0x107)
-		.globl tl0_solaris
-tl0_solaris:	SOLARIS_SYSCALL_TRAP
-tl0_resv109:	BTRAP(0x109)
-tl0_resv10a:	BTRAP(0x10a) BTRAP(0x10b) BTRAP(0x10c) BTRAP(0x10d) BTRAP(0x10e)
-tl0_resv10f:	BTRAP(0x10f)
+tl0_resv104:	BTRAP(0x104) BTRAP(0x105) BTRAP(0x106) BTRAP(0x107) BTRAP(0x108)
+tl0_resv109:	BTRAP(0x109) BTRAP(0x10a) BTRAP(0x10b) BTRAP(0x10c) BTRAP(0x10d)
+tl0_resv10e:	BTRAP(0x10e) BTRAP(0x10f)
 tl0_linux32:	LINUX_32BIT_SYSCALL_TRAP
 tl0_oldlinux64:	LINUX_64BIT_SYSCALL_TRAP
 tl0_resv112:	TRAP_UTRAP(UT_TRAP_INSTRUCTION_18,0x112) TRAP_UTRAP(UT_TRAP_INSTRUCTION_19,0x113)
@@ -139,8 +136,7 @@
 tl0_getcc:	GETCC_TRAP
 tl0_setcc:	SETCC_TRAP
 tl0_getpsr:	TRAP(do_getpsr)
-tl0_resv123:	BTRAP(0x123) BTRAP(0x124) BTRAP(0x125) BTRAP(0x126)
-tl0_solindir:	INDIRECT_SOLARIS_SYSCALL(156)
+tl0_resv123:	BTRAP(0x123) BTRAP(0x124) BTRAP(0x125) BTRAP(0x126) BTRAP(0x127)
 tl0_resv128:	BTRAP(0x128) BTRAP(0x129) BTRAP(0x12a) BTRAP(0x12b) BTRAP(0x12c)
 tl0_resv12d:	BTRAP(0x12d) BTRAP(0x12e) BTRAP(0x12f) BTRAP(0x130) BTRAP(0x131)
 tl0_resv132:	BTRAP(0x132) BTRAP(0x133) BTRAP(0x134) BTRAP(0x135) BTRAP(0x136)