summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--Changelog1
-rwxr-xr-xconfigure2
-rw-r--r--linux-user/elfload.c25
-rw-r--r--linux-user/main.c407
-rw-r--r--linux-user/mips/syscall.h23
-rw-r--r--linux-user/mips/syscall_nr.h288
-rw-r--r--linux-user/mips/termbits.h214
-rw-r--r--linux-user/syscall.c6
-rw-r--r--linux-user/syscall_defs.h186
-rw-r--r--target-mips/op_helper.c33
10 files changed, 1167 insertions, 18 deletions
diff --git a/Changelog b/Changelog
index d386474acd..8c97b8ec50 100644
--- a/Changelog
+++ b/Changelog
@@ -13,6 +13,7 @@ version 0.7.3:
   - Linux host serial port access
   - Linux host low level parallel port access
   - New network emulation code supporting VLANs.
+  - MIPS User Linux emulation
 
 version 0.7.2:
   
diff --git a/configure b/configure
index bad61e9609..9a6e547353 100755
--- a/configure
+++ b/configure
@@ -230,7 +230,7 @@ if test -z "$target_list" ; then
     target_list="i386-softmmu ppc-softmmu sparc-softmmu x86_64-softmmu mips-softmmu arm-softmmu"
 # the following are Linux specific
     if [ "$linux" = "yes" ] ; then
-        target_list="i386-user arm-user armeb-user sparc-user ppc-user $target_list"
+        target_list="i386-user arm-user armeb-user sparc-user ppc-user mips-user $target_list"
     fi
 else
     target_list=$(echo "$target_list" | sed -e 's/,/ /g')
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index eda6e9ba23..f1af656dc0 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -247,6 +247,31 @@ static inline void init_thread(struct target_pt_regs *_regs, struct image_info *
 
 #endif
 
+#ifdef TARGET_MIPS
+
+#define ELF_START_MMAP 0x80000000
+
+#define elf_check_arch(x) ( (x) == EM_MIPS )
+
+#define ELF_CLASS   ELFCLASS32
+#ifdef TARGET_WORDS_BIGENDIAN
+#define ELF_DATA	ELFDATA2MSB
+#else
+#define ELF_DATA	ELFDATA2LSB
+#endif
+#define ELF_ARCH    EM_MIPS
+
+#define ELF_PLAT_INIT(_r) 
+
+static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
+{
+    regs->cp0_status = CP0St_UM;
+    regs->cp0_epc = infop->entry;
+    regs->regs[29] = infop->start_stack;
+}
+
+#endif /* TARGET_MIPS */
+
 #ifndef ELF_PLATFORM
 #define ELF_PLATFORM (NULL)
 #endif
diff --git a/linux-user/main.c b/linux-user/main.c
index 4b7fd7ca8c..907f7109ea 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -977,6 +977,404 @@ void cpu_loop(CPUPPCState *env)
 }
 #endif
 
+#ifdef TARGET_MIPS
+
+#define MIPS_SYS(name, args) args,
+
+static const uint8_t mips_syscall_args[] = {
+	MIPS_SYS(sys_syscall	, 0)	/* 4000 */
+	MIPS_SYS(sys_exit	, 1)
+	MIPS_SYS(sys_fork	, 0)
+	MIPS_SYS(sys_read	, 3)
+	MIPS_SYS(sys_write	, 3)
+	MIPS_SYS(sys_open	, 3)	/* 4005 */
+	MIPS_SYS(sys_close	, 1)
+	MIPS_SYS(sys_waitpid	, 3)
+	MIPS_SYS(sys_creat	, 2)
+	MIPS_SYS(sys_link	, 2)
+	MIPS_SYS(sys_unlink	, 1)	/* 4010 */
+	MIPS_SYS(sys_execve	, 0)
+	MIPS_SYS(sys_chdir	, 1)
+	MIPS_SYS(sys_time	, 1)
+	MIPS_SYS(sys_mknod	, 3)
+	MIPS_SYS(sys_chmod	, 2)	/* 4015 */
+	MIPS_SYS(sys_lchown	, 3)
+	MIPS_SYS(sys_ni_syscall	, 0)
+	MIPS_SYS(sys_ni_syscall	, 0)	/* was sys_stat */
+	MIPS_SYS(sys_lseek	, 3)
+	MIPS_SYS(sys_getpid	, 0)	/* 4020 */
+	MIPS_SYS(sys_mount	, 5)
+	MIPS_SYS(sys_oldumount	, 1)
+	MIPS_SYS(sys_setuid	, 1)
+	MIPS_SYS(sys_getuid	, 0)
+	MIPS_SYS(sys_stime	, 1)	/* 4025 */
+	MIPS_SYS(sys_ptrace	, 4)
+	MIPS_SYS(sys_alarm	, 1)
+	MIPS_SYS(sys_ni_syscall	, 0)	/* was sys_fstat */
+	MIPS_SYS(sys_pause	, 0)
+	MIPS_SYS(sys_utime	, 2)	/* 4030 */
+	MIPS_SYS(sys_ni_syscall	, 0)
+	MIPS_SYS(sys_ni_syscall	, 0)
+	MIPS_SYS(sys_access	, 2)
+	MIPS_SYS(sys_nice	, 1)
+	MIPS_SYS(sys_ni_syscall	, 0)	/* 4035 */
+	MIPS_SYS(sys_sync	, 0)
+	MIPS_SYS(sys_kill	, 2)
+	MIPS_SYS(sys_rename	, 2)
+	MIPS_SYS(sys_mkdir	, 2)
+	MIPS_SYS(sys_rmdir	, 1)	/* 4040 */
+	MIPS_SYS(sys_dup		, 1)
+	MIPS_SYS(sys_pipe	, 0)
+	MIPS_SYS(sys_times	, 1)
+	MIPS_SYS(sys_ni_syscall	, 0)
+	MIPS_SYS(sys_brk		, 1)	/* 4045 */
+	MIPS_SYS(sys_setgid	, 1)
+	MIPS_SYS(sys_getgid	, 0)
+	MIPS_SYS(sys_ni_syscall	, 0)	/* was signal(2) */
+	MIPS_SYS(sys_geteuid	, 0)
+	MIPS_SYS(sys_getegid	, 0)	/* 4050 */
+	MIPS_SYS(sys_acct	, 0)
+	MIPS_SYS(sys_umount	, 2)
+	MIPS_SYS(sys_ni_syscall	, 0)
+	MIPS_SYS(sys_ioctl	, 3)
+	MIPS_SYS(sys_fcntl	, 3)	/* 4055 */
+	MIPS_SYS(sys_ni_syscall	, 2)
+	MIPS_SYS(sys_setpgid	, 2)
+	MIPS_SYS(sys_ni_syscall	, 0)
+	MIPS_SYS(sys_olduname	, 1)
+	MIPS_SYS(sys_umask	, 1)	/* 4060 */
+	MIPS_SYS(sys_chroot	, 1)
+	MIPS_SYS(sys_ustat	, 2)
+	MIPS_SYS(sys_dup2	, 2)
+	MIPS_SYS(sys_getppid	, 0)
+	MIPS_SYS(sys_getpgrp	, 0)	/* 4065 */
+	MIPS_SYS(sys_setsid	, 0)
+	MIPS_SYS(sys_sigaction	, 3)
+	MIPS_SYS(sys_sgetmask	, 0)
+	MIPS_SYS(sys_ssetmask	, 1)
+	MIPS_SYS(sys_setreuid	, 2)	/* 4070 */
+	MIPS_SYS(sys_setregid	, 2)
+	MIPS_SYS(sys_sigsuspend	, 0)
+	MIPS_SYS(sys_sigpending	, 1)
+	MIPS_SYS(sys_sethostname	, 2)
+	MIPS_SYS(sys_setrlimit	, 2)	/* 4075 */
+	MIPS_SYS(sys_getrlimit	, 2)
+	MIPS_SYS(sys_getrusage	, 2)
+	MIPS_SYS(sys_gettimeofday, 2)
+	MIPS_SYS(sys_settimeofday, 2)
+	MIPS_SYS(sys_getgroups	, 2)	/* 4080 */
+	MIPS_SYS(sys_setgroups	, 2)
+	MIPS_SYS(sys_ni_syscall	, 0)	/* old_select */
+	MIPS_SYS(sys_symlink	, 2)
+	MIPS_SYS(sys_ni_syscall	, 0)	/* was sys_lstat */
+	MIPS_SYS(sys_readlink	, 3)	/* 4085 */
+	MIPS_SYS(sys_uselib	, 1)
+	MIPS_SYS(sys_swapon	, 2)
+	MIPS_SYS(sys_reboot	, 3)
+	MIPS_SYS(old_readdir	, 3)
+	MIPS_SYS(old_mmap	, 6)	/* 4090 */
+	MIPS_SYS(sys_munmap	, 2)
+	MIPS_SYS(sys_truncate	, 2)
+	MIPS_SYS(sys_ftruncate	, 2)
+	MIPS_SYS(sys_fchmod	, 2)
+	MIPS_SYS(sys_fchown	, 3)	/* 4095 */
+	MIPS_SYS(sys_getpriority	, 2)
+	MIPS_SYS(sys_setpriority	, 3)
+	MIPS_SYS(sys_ni_syscall	, 0)
+	MIPS_SYS(sys_statfs	, 2)
+	MIPS_SYS(sys_fstatfs	, 2)	/* 4100 */
+	MIPS_SYS(sys_ni_syscall	, 0)	/* was ioperm(2) */
+	MIPS_SYS(sys_socketcall	, 2)
+	MIPS_SYS(sys_syslog	, 3)
+	MIPS_SYS(sys_setitimer	, 3)
+	MIPS_SYS(sys_getitimer	, 2)	/* 4105 */
+	MIPS_SYS(sys_newstat	, 2)
+	MIPS_SYS(sys_newlstat	, 2)
+	MIPS_SYS(sys_newfstat	, 2)
+	MIPS_SYS(sys_uname	, 1)
+	MIPS_SYS(sys_ni_syscall	, 0)	/* 4110 was iopl(2) */
+	MIPS_SYS(sys_vhangup	, 0)
+	MIPS_SYS(sys_ni_syscall	, 0)	/* was sys_idle() */
+	MIPS_SYS(sys_ni_syscall	, 0)	/* was sys_vm86 */
+	MIPS_SYS(sys_wait4	, 4)
+	MIPS_SYS(sys_swapoff	, 1)	/* 4115 */
+	MIPS_SYS(sys_sysinfo	, 1)
+	MIPS_SYS(sys_ipc		, 6)
+	MIPS_SYS(sys_fsync	, 1)
+	MIPS_SYS(sys_sigreturn	, 0)
+	MIPS_SYS(sys_clone	, 0)	/* 4120 */
+	MIPS_SYS(sys_setdomainname, 2)
+	MIPS_SYS(sys_newuname	, 1)
+	MIPS_SYS(sys_ni_syscall	, 0)	/* sys_modify_ldt */
+	MIPS_SYS(sys_adjtimex	, 1)
+	MIPS_SYS(sys_mprotect	, 3)	/* 4125 */
+	MIPS_SYS(sys_sigprocmask	, 3)
+	MIPS_SYS(sys_ni_syscall	, 0)	/* was create_module */
+	MIPS_SYS(sys_init_module	, 5)
+	MIPS_SYS(sys_delete_module, 1)
+	MIPS_SYS(sys_ni_syscall	, 0)	/* 4130	was get_kernel_syms */
+	MIPS_SYS(sys_quotactl	, 0)
+	MIPS_SYS(sys_getpgid	, 1)
+	MIPS_SYS(sys_fchdir	, 1)
+	MIPS_SYS(sys_bdflush	, 2)
+	MIPS_SYS(sys_sysfs	, 3)	/* 4135 */
+	MIPS_SYS(sys_personality	, 1)
+	MIPS_SYS(sys_ni_syscall	, 0)	/* for afs_syscall */
+	MIPS_SYS(sys_setfsuid	, 1)
+	MIPS_SYS(sys_setfsgid	, 1)
+	MIPS_SYS(sys_llseek	, 5)	/* 4140 */
+	MIPS_SYS(sys_getdents	, 3)
+	MIPS_SYS(sys_select	, 5)
+	MIPS_SYS(sys_flock	, 2)
+	MIPS_SYS(sys_msync	, 3)
+	MIPS_SYS(sys_readv	, 3)	/* 4145 */
+	MIPS_SYS(sys_writev	, 3)
+	MIPS_SYS(sys_cacheflush	, 3)
+	MIPS_SYS(sys_cachectl	, 3)
+	MIPS_SYS(sys_sysmips	, 4)
+	MIPS_SYS(sys_ni_syscall	, 0)	/* 4150 */
+	MIPS_SYS(sys_getsid	, 1)
+	MIPS_SYS(sys_fdatasync	, 0)
+	MIPS_SYS(sys_sysctl	, 1)
+	MIPS_SYS(sys_mlock	, 2)
+	MIPS_SYS(sys_munlock	, 2)	/* 4155 */
+	MIPS_SYS(sys_mlockall	, 1)
+	MIPS_SYS(sys_munlockall	, 0)
+	MIPS_SYS(sys_sched_setparam, 2)
+	MIPS_SYS(sys_sched_getparam, 2)
+	MIPS_SYS(sys_sched_setscheduler, 3)	/* 4160 */
+	MIPS_SYS(sys_sched_getscheduler, 1)
+	MIPS_SYS(sys_sched_yield	, 0)
+	MIPS_SYS(sys_sched_get_priority_max, 1)
+	MIPS_SYS(sys_sched_get_priority_min, 1)
+	MIPS_SYS(sys_sched_rr_get_interval, 2)	/* 4165 */
+	MIPS_SYS(sys_nanosleep,	2)
+	MIPS_SYS(sys_mremap	, 4)
+	MIPS_SYS(sys_accept	, 3)
+	MIPS_SYS(sys_bind	, 3)
+	MIPS_SYS(sys_connect	, 3)	/* 4170 */
+	MIPS_SYS(sys_getpeername	, 3)
+	MIPS_SYS(sys_getsockname	, 3)
+	MIPS_SYS(sys_getsockopt	, 5)
+	MIPS_SYS(sys_listen	, 2)
+	MIPS_SYS(sys_recv	, 4)	/* 4175 */
+	MIPS_SYS(sys_recvfrom	, 6)
+	MIPS_SYS(sys_recvmsg	, 3)
+	MIPS_SYS(sys_send	, 4)
+	MIPS_SYS(sys_sendmsg	, 3)
+	MIPS_SYS(sys_sendto	, 6)	/* 4180 */
+	MIPS_SYS(sys_setsockopt	, 5)
+	MIPS_SYS(sys_shutdown	, 2)
+	MIPS_SYS(sys_socket	, 3)
+	MIPS_SYS(sys_socketpair	, 4)
+	MIPS_SYS(sys_setresuid	, 3)	/* 4185 */
+	MIPS_SYS(sys_getresuid	, 3)
+	MIPS_SYS(sys_ni_syscall	, 0)	/* was sys_query_module */
+	MIPS_SYS(sys_poll	, 3)
+	MIPS_SYS(sys_nfsservctl	, 3)
+	MIPS_SYS(sys_setresgid	, 3)	/* 4190 */
+	MIPS_SYS(sys_getresgid	, 3)
+	MIPS_SYS(sys_prctl	, 5)
+	MIPS_SYS(sys_rt_sigreturn, 0)
+	MIPS_SYS(sys_rt_sigaction, 4)
+	MIPS_SYS(sys_rt_sigprocmask, 4)	/* 4195 */
+	MIPS_SYS(sys_rt_sigpending, 2)
+	MIPS_SYS(sys_rt_sigtimedwait, 4)
+	MIPS_SYS(sys_rt_sigqueueinfo, 3)
+	MIPS_SYS(sys_rt_sigsuspend, 0)
+	MIPS_SYS(sys_pread64	, 6)	/* 4200 */
+	MIPS_SYS(sys_pwrite64	, 6)
+	MIPS_SYS(sys_chown	, 3)
+	MIPS_SYS(sys_getcwd	, 2)
+	MIPS_SYS(sys_capget	, 2)
+	MIPS_SYS(sys_capset	, 2)	/* 4205 */
+	MIPS_SYS(sys_sigaltstack	, 0)
+	MIPS_SYS(sys_sendfile	, 4)
+	MIPS_SYS(sys_ni_syscall	, 0)
+	MIPS_SYS(sys_ni_syscall	, 0)
+	MIPS_SYS(sys_mmap2	, 6)	/* 4210 */
+	MIPS_SYS(sys_truncate64	, 4)
+	MIPS_SYS(sys_ftruncate64	, 4)
+	MIPS_SYS(sys_stat64	, 2)
+	MIPS_SYS(sys_lstat64	, 2)
+	MIPS_SYS(sys_fstat64	, 2)	/* 4215 */
+	MIPS_SYS(sys_pivot_root	, 2)
+	MIPS_SYS(sys_mincore	, 3)
+	MIPS_SYS(sys_madvise	, 3)
+	MIPS_SYS(sys_getdents64	, 3)
+	MIPS_SYS(sys_fcntl64	, 3)	/* 4220 */
+	MIPS_SYS(sys_ni_syscall	, 0)
+	MIPS_SYS(sys_gettid	, 0)
+	MIPS_SYS(sys_readahead	, 5)
+	MIPS_SYS(sys_setxattr	, 5)
+	MIPS_SYS(sys_lsetxattr	, 5)	/* 4225 */
+	MIPS_SYS(sys_fsetxattr	, 5)
+	MIPS_SYS(sys_getxattr	, 4)
+	MIPS_SYS(sys_lgetxattr	, 4)
+	MIPS_SYS(sys_fgetxattr	, 4)
+	MIPS_SYS(sys_listxattr	, 3)	/* 4230 */
+	MIPS_SYS(sys_llistxattr	, 3)
+	MIPS_SYS(sys_flistxattr	, 3)
+	MIPS_SYS(sys_removexattr	, 2)
+	MIPS_SYS(sys_lremovexattr, 2)
+	MIPS_SYS(sys_fremovexattr, 2)	/* 4235 */
+	MIPS_SYS(sys_tkill	, 2)
+	MIPS_SYS(sys_sendfile64	, 5)
+	MIPS_SYS(sys_futex	, 2)
+	MIPS_SYS(sys_sched_setaffinity, 3)
+	MIPS_SYS(sys_sched_getaffinity, 3)	/* 4240 */
+	MIPS_SYS(sys_io_setup	, 2)
+	MIPS_SYS(sys_io_destroy	, 1)
+	MIPS_SYS(sys_io_getevents, 5)
+	MIPS_SYS(sys_io_submit	, 3)
+	MIPS_SYS(sys_io_cancel	, 3)	/* 4245 */
+	MIPS_SYS(sys_exit_group	, 1)
+	MIPS_SYS(sys_lookup_dcookie, 3)
+	MIPS_SYS(sys_epoll_create, 1)
+	MIPS_SYS(sys_epoll_ctl	, 4)
+	MIPS_SYS(sys_epoll_wait	, 3)	/* 4250 */
+	MIPS_SYS(sys_remap_file_pages, 5)
+	MIPS_SYS(sys_set_tid_address, 1)
+	MIPS_SYS(sys_restart_syscall, 0)
+	MIPS_SYS(sys_fadvise64_64, 7)
+	MIPS_SYS(sys_statfs64	, 3)	/* 4255 */
+	MIPS_SYS(sys_fstatfs64	, 2)
+	MIPS_SYS(sys_timer_create, 3)
+	MIPS_SYS(sys_timer_settime, 4)
+	MIPS_SYS(sys_timer_gettime, 2)
+	MIPS_SYS(sys_timer_getoverrun, 1)	/* 4260 */
+	MIPS_SYS(sys_timer_delete, 1)
+	MIPS_SYS(sys_clock_settime, 2)
+	MIPS_SYS(sys_clock_gettime, 2)
+	MIPS_SYS(sys_clock_getres, 2)
+	MIPS_SYS(sys_clock_nanosleep, 4)	/* 4265 */
+	MIPS_SYS(sys_tgkill	, 3)
+	MIPS_SYS(sys_utimes	, 2)
+	MIPS_SYS(sys_mbind	, 4)
+	MIPS_SYS(sys_ni_syscall	, 0)	/* sys_get_mempolicy */
+	MIPS_SYS(sys_ni_syscall	, 0)	/* 4270 sys_set_mempolicy */
+	MIPS_SYS(sys_mq_open	, 4)
+	MIPS_SYS(sys_mq_unlink	, 1)
+	MIPS_SYS(sys_mq_timedsend, 5)
+	MIPS_SYS(sys_mq_timedreceive, 5)
+	MIPS_SYS(sys_mq_notify	, 2)	/* 4275 */
+	MIPS_SYS(sys_mq_getsetattr, 3)
+	MIPS_SYS(sys_ni_syscall	, 0)	/* sys_vserver */
+	MIPS_SYS(sys_waitid	, 4)
+	MIPS_SYS(sys_ni_syscall	, 0)	/* available, was setaltroot */
+	MIPS_SYS(sys_add_key	, 5)
+	MIPS_SYS(sys_request_key	, 4)
+	MIPS_SYS(sys_keyctl	, 5)
+};
+
+#undef MIPS_SYS
+
+void cpu_loop(CPUMIPSState *env)
+{
+    target_siginfo_t info;
+    int trapnr, ret, nb_args;
+    unsigned int syscall_num;
+    target_ulong arg5, arg6, sp_reg;
+
+    for(;;) {
+        trapnr = cpu_mips_exec(env);
+        switch(trapnr) {
+        case EXCP_SYSCALL:
+            {
+                syscall_num = env->gpr[2] - 4000;
+                if (syscall_num >= sizeof(mips_syscall_args)) {
+                    ret = -ENOSYS;
+                } else {
+                    nb_args = mips_syscall_args[syscall_num];
+                    if (nb_args >= 5) {
+                        sp_reg = env->gpr[29];
+                        /* these arguments are taken from the stack */
+                        if (get_user(arg5, (target_ulong *)(sp_reg + 16))) {
+                            ret = -EFAULT;
+                            goto fail;
+                        }
+                        if (nb_args >= 6) {
+                            if (get_user(arg6, (target_ulong *)(sp_reg + 20))) {
+                                ret = -EFAULT;
+                                goto fail;
+                            }
+                        } else {
+                            arg6 = 0;
+                        }
+                    } else {
+                        arg5 = 0;
+                        arg6 = 0;
+                    }
+                    ret = do_syscall(env, 
+                                     env->gpr[2], 
+                                     env->gpr[4],
+                                     env->gpr[5],
+                                     env->gpr[6],
+                                     env->gpr[7],
+                                     arg5, 
+                                     arg6);
+                }
+                fail:
+                env->PC += 4;
+                if ((unsigned int)ret >= (unsigned int)(-1133)) {
+                    env->gpr[7] = 1; /* error flag */
+                    ret = -ret;
+                    env->gpr[0] = ret;
+                    env->gpr[2] = ret;
+                } else {
+                    env->gpr[7] = 0; /* error flag */
+                    env->gpr[2] = ret;
+                }
+            }
+            break;
+        case EXCP_RI:
+            {
+                uint32_t insn, op;
+
+                if (get_user(insn, (uint32_t *)env->PC) < 0)
+                    goto sigill;
+                op = insn >> 26;
+                //                printf("insn=%08x op=%02x\n", insn, op);
+                /* XXX: totally dummy FP ops just to be able to launch
+                   a few executables */
+                switch(op) {
+                case 0x31: /* LWC1 */
+                    env->PC += 4;
+                    break;
+                case 0x39: /* SWC1 */
+                    env->PC += 4;
+                    break;
+                case 0x11:
+                    switch((insn >> 21) & 0x1f) {
+                    case 0x02: /* CFC1 */
+                        env->PC += 4;
+                        break;
+                    default:
+                        goto sigill;
+                    }
+                    break;
+                default:
+                sigill:
+                    info.si_signo = TARGET_SIGILL;
+                    info.si_errno = 0;
+                    info.si_code = 0;
+                    queue_signal(info.si_signo, &info);
+                    break;
+                }
+            }
+            break;
+        default:
+            //        error:
+            fprintf(stderr, "qemu: unhandled CPU exception 0x%x - aborting\n", 
+                    trapnr);
+            cpu_dump_state(env, stderr, fprintf, 0);
+            abort();
+        }
+        process_pending_signals(env);
+    }
+}
+#endif
+
 void usage(void)
 {
     printf("qemu-" TARGET_ARCH " version " QEMU_VERSION ", Copyright (c) 2003-2005 Fabrice Bellard\n"
@@ -1245,6 +1643,15 @@ int main(int argc, char **argv)
             env->gpr[i] = regs->gpr[i];
         }
     }
+#elif defined(TARGET_MIPS)
+    {
+        int i;
+
+        for(i = 0; i < 32; i++) {
+            env->gpr[i] = regs->regs[i];
+        }
+        env->PC = regs->cp0_epc;
+    }
 #else
 #error unsupported target CPU
 #endif
diff --git a/linux-user/mips/syscall.h b/linux-user/mips/syscall.h
new file mode 100644
index 0000000000..4b3c7d625c
--- /dev/null
+++ b/linux-user/mips/syscall.h
@@ -0,0 +1,23 @@
+
+/* this struct defines the way the registers are stored on the
+   stack during a system call. */
+
+struct target_pt_regs {
+#if 1
+	/* Pad bytes for argument save space on the stack. */
+	target_ulong pad0[6];
+#endif
+
+	/* Saved main processor registers. */
+	target_ulong regs[32];
+
+	/* Saved special registers. */
+	target_ulong cp0_status;
+	target_ulong lo;
+	target_ulong hi;
+	target_ulong cp0_badvaddr;
+	target_ulong cp0_cause;
+	target_ulong cp0_epc;
+};
+
+#define UNAME_MACHINE "mips"
diff --git a/linux-user/mips/syscall_nr.h b/linux-user/mips/syscall_nr.h
new file mode 100644
index 0000000000..e635aa2813
--- /dev/null
+++ b/linux-user/mips/syscall_nr.h
@@ -0,0 +1,288 @@
+/*
+ * Linux o32 style syscalls are in the range from 4000 to 4999.
+ */
+#define TARGET_NR_Linux			4000
+#define TARGET_NR_syscall			(TARGET_NR_Linux +   0)
+#define TARGET_NR_exit			(TARGET_NR_Linux +   1)
+#define TARGET_NR_fork			(TARGET_NR_Linux +   2)
+#define TARGET_NR_read			(TARGET_NR_Linux +   3)
+#define TARGET_NR_write			(TARGET_NR_Linux +   4)
+#define TARGET_NR_open			(TARGET_NR_Linux +   5)
+#define TARGET_NR_close			(TARGET_NR_Linux +   6)
+#define TARGET_NR_waitpid			(TARGET_NR_Linux +   7)
+#define TARGET_NR_creat			(TARGET_NR_Linux +   8)
+#define TARGET_NR_link			(TARGET_NR_Linux +   9)
+#define TARGET_NR_unlink			(TARGET_NR_Linux +  10)
+#define TARGET_NR_execve			(TARGET_NR_Linux +  11)
+#define TARGET_NR_chdir			(TARGET_NR_Linux +  12)
+#define TARGET_NR_time			(TARGET_NR_Linux +  13)
+#define TARGET_NR_mknod			(TARGET_NR_Linux +  14)
+#define TARGET_NR_chmod			(TARGET_NR_Linux +  15)
+#define TARGET_NR_lchown			(TARGET_NR_Linux +  16)
+#define TARGET_NR_break			(TARGET_NR_Linux +  17)
+#define TARGET_NR_unused18			(TARGET_NR_Linux +  18)
+#define TARGET_NR_lseek			(TARGET_NR_Linux +  19)
+#define TARGET_NR_getpid			(TARGET_NR_Linux +  20)
+#define TARGET_NR_mount			(TARGET_NR_Linux +  21)
+#define TARGET_NR_umount			(TARGET_NR_Linux +  22)
+#define TARGET_NR_setuid			(TARGET_NR_Linux +  23)
+#define TARGET_NR_getuid			(TARGET_NR_Linux +  24)
+#define TARGET_NR_stime			(TARGET_NR_Linux +  25)
+#define TARGET_NR_ptrace			(TARGET_NR_Linux +  26)
+#define TARGET_NR_alarm			(TARGET_NR_Linux +  27)
+#define TARGET_NR_unused28			(TARGET_NR_Linux +  28)
+#define TARGET_NR_pause			(TARGET_NR_Linux +  29)
+#define TARGET_NR_utime			(TARGET_NR_Linux +  30)
+#define TARGET_NR_stty			(TARGET_NR_Linux +  31)
+#define TARGET_NR_gtty			(TARGET_NR_Linux +  32)
+#define TARGET_NR_access			(TARGET_NR_Linux +  33)
+#define TARGET_NR_nice			(TARGET_NR_Linux +  34)
+#define TARGET_NR_ftime			(TARGET_NR_Linux +  35)
+#define TARGET_NR_sync			(TARGET_NR_Linux +  36)
+#define TARGET_NR_kill			(TARGET_NR_Linux +  37)
+#define TARGET_NR_rename			(TARGET_NR_Linux +  38)
+#define TARGET_NR_mkdir			(TARGET_NR_Linux +  39)
+#define TARGET_NR_rmdir			(TARGET_NR_Linux +  40)
+#define TARGET_NR_dup			(TARGET_NR_Linux +  41)
+#define TARGET_NR_pipe			(TARGET_NR_Linux +  42)
+#define TARGET_NR_times			(TARGET_NR_Linux +  43)
+#define TARGET_NR_prof			(TARGET_NR_Linux +  44)
+#define TARGET_NR_brk			(TARGET_NR_Linux +  45)
+#define TARGET_NR_setgid			(TARGET_NR_Linux +  46)
+#define TARGET_NR_getgid			(TARGET_NR_Linux +  47)
+#define TARGET_NR_signal			(TARGET_NR_Linux +  48)
+#define TARGET_NR_geteuid			(TARGET_NR_Linux +  49)
+#define TARGET_NR_getegid			(TARGET_NR_Linux +  50)
+#define TARGET_NR_acct			(TARGET_NR_Linux +  51)
+#define TARGET_NR_umount2			(TARGET_NR_Linux +  52)
+#define TARGET_NR_lock			(TARGET_NR_Linux +  53)
+#define TARGET_NR_ioctl			(TARGET_NR_Linux +  54)
+#define TARGET_NR_fcntl			(TARGET_NR_Linux +  55)
+#define TARGET_NR_mpx			(TARGET_NR_Linux +  56)
+#define TARGET_NR_setpgid			(TARGET_NR_Linux +  57)
+#define TARGET_NR_ulimit			(TARGET_NR_Linux +  58)
+#define TARGET_NR_unused59			(TARGET_NR_Linux +  59)
+#define TARGET_NR_umask			(TARGET_NR_Linux +  60)
+#define TARGET_NR_chroot			(TARGET_NR_Linux +  61)
+#define TARGET_NR_ustat			(TARGET_NR_Linux +  62)
+#define TARGET_NR_dup2			(TARGET_NR_Linux +  63)
+#define TARGET_NR_getppid			(TARGET_NR_Linux +  64)
+#define TARGET_NR_getpgrp			(TARGET_NR_Linux +  65)
+#define TARGET_NR_setsid			(TARGET_NR_Linux +  66)
+#define TARGET_NR_sigaction			(TARGET_NR_Linux +  67)
+#define TARGET_NR_sgetmask			(TARGET_NR_Linux +  68)
+#define TARGET_NR_ssetmask			(TARGET_NR_Linux +  69)
+#define TARGET_NR_setreuid			(TARGET_NR_Linux +  70)
+#define TARGET_NR_setregid			(TARGET_NR_Linux +  71)
+#define TARGET_NR_sigsuspend			(TARGET_NR_Linux +  72)
+#define TARGET_NR_sigpending			(TARGET_NR_Linux +  73)
+#define TARGET_NR_sethostname		(TARGET_NR_Linux +  74)
+#define TARGET_NR_setrlimit			(TARGET_NR_Linux +  75)
+#define TARGET_NR_getrlimit			(TARGET_NR_Linux +  76)
+#define TARGET_NR_getrusage			(TARGET_NR_Linux +  77)
+#define TARGET_NR_gettimeofday		(TARGET_NR_Linux +  78)
+#define TARGET_NR_settimeofday		(TARGET_NR_Linux +  79)
+#define TARGET_NR_getgroups			(TARGET_NR_Linux +  80)
+#define TARGET_NR_setgroups			(TARGET_NR_Linux +  81)
+#define TARGET_NR_reserved82			(TARGET_NR_Linux +  82)
+#define TARGET_NR_symlink			(TARGET_NR_Linux +  83)
+#define TARGET_NR_unused84			(TARGET_NR_Linux +  84)
+#define TARGET_NR_readlink			(TARGET_NR_Linux +  85)
+#define TARGET_NR_uselib			(TARGET_NR_Linux +  86)
+#define TARGET_NR_swapon			(TARGET_NR_Linux +  87)
+#define TARGET_NR_reboot			(TARGET_NR_Linux +  88)
+#define TARGET_NR_readdir			(TARGET_NR_Linux +  89)
+#define TARGET_NR_mmap			(TARGET_NR_Linux +  90)
+#define TARGET_NR_munmap			(TARGET_NR_Linux +  91)
+#define TARGET_NR_truncate			(TARGET_NR_Linux +  92)
+#define TARGET_NR_ftruncate			(TARGET_NR_Linux +  93)
+#define TARGET_NR_fchmod			(TARGET_NR_Linux +  94)
+#define TARGET_NR_fchown			(TARGET_NR_Linux +  95)
+#define TARGET_NR_getpriority		(TARGET_NR_Linux +  96)
+#define TARGET_NR_setpriority		(TARGET_NR_Linux +  97)
+#define TARGET_NR_profil			(TARGET_NR_Linux +  98)
+#define TARGET_NR_statfs			(TARGET_NR_Linux +  99)
+#define TARGET_NR_fstatfs			(TARGET_NR_Linux + 100)
+#define TARGET_NR_ioperm			(TARGET_NR_Linux + 101)
+#define TARGET_NR_socketcall			(TARGET_NR_Linux + 102)
+#define TARGET_NR_syslog			(TARGET_NR_Linux + 103)
+#define TARGET_NR_setitimer			(TARGET_NR_Linux + 104)
+#define TARGET_NR_getitimer			(TARGET_NR_Linux + 105)
+#define TARGET_NR_stat			(TARGET_NR_Linux + 106)
+#define TARGET_NR_lstat			(TARGET_NR_Linux + 107)
+#define TARGET_NR_fstat			(TARGET_NR_Linux + 108)
+#define TARGET_NR_unused109			(TARGET_NR_Linux + 109)
+#define TARGET_NR_iopl			(TARGET_NR_Linux + 110)
+#define TARGET_NR_vhangup			(TARGET_NR_Linux + 111)
+#define TARGET_NR_idle			(TARGET_NR_Linux + 112)
+#define TARGET_NR_vm86			(TARGET_NR_Linux + 113)
+#define TARGET_NR_wait4			(TARGET_NR_Linux + 114)
+#define TARGET_NR_swapoff			(TARGET_NR_Linux + 115)
+#define TARGET_NR_sysinfo			(TARGET_NR_Linux + 116)
+#define TARGET_NR_ipc			(TARGET_NR_Linux + 117)
+#define TARGET_NR_fsync			(TARGET_NR_Linux + 118)
+#define TARGET_NR_sigreturn			(TARGET_NR_Linux + 119)
+#define TARGET_NR_clone			(TARGET_NR_Linux + 120)
+#define TARGET_NR_setdomainname		(TARGET_NR_Linux + 121)
+#define TARGET_NR_uname			(TARGET_NR_Linux + 122)
+#define TARGET_NR_modify_ldt			(TARGET_NR_Linux + 123)
+#define TARGET_NR_adjtimex			(TARGET_NR_Linux + 124)
+#define TARGET_NR_mprotect			(TARGET_NR_Linux + 125)
+#define TARGET_NR_sigprocmask		(TARGET_NR_Linux + 126)
+#define TARGET_NR_create_module		(TARGET_NR_Linux + 127)
+#define TARGET_NR_init_module		(TARGET_NR_Linux + 128)
+#define TARGET_NR_delete_module		(TARGET_NR_Linux + 129)
+#define TARGET_NR_get_kernel_syms		(TARGET_NR_Linux + 130)
+#define TARGET_NR_quotactl			(TARGET_NR_Linux + 131)
+#define TARGET_NR_getpgid			(TARGET_NR_Linux + 132)
+#define TARGET_NR_fchdir			(TARGET_NR_Linux + 133)
+#define TARGET_NR_bdflush			(TARGET_NR_Linux + 134)
+#define TARGET_NR_sysfs			(TARGET_NR_Linux + 135)
+#define TARGET_NR_personality		(TARGET_NR_Linux + 136)
+#define TARGET_NR_afs_syscall		(TARGET_NR_Linux + 137) /* Syscall for Andrew File System */
+#define TARGET_NR_setfsuid			(TARGET_NR_Linux + 138)
+#define TARGET_NR_setfsgid			(TARGET_NR_Linux + 139)
+#define TARGET_NR__llseek			(TARGET_NR_Linux + 140)
+#define TARGET_NR_getdents			(TARGET_NR_Linux + 141)
+#define TARGET_NR__newselect			(TARGET_NR_Linux + 142)
+#define TARGET_NR_flock			(TARGET_NR_Linux + 143)
+#define TARGET_NR_msync			(TARGET_NR_Linux + 144)
+#define TARGET_NR_readv			(TARGET_NR_Linux + 145)
+#define TARGET_NR_writev			(TARGET_NR_Linux + 146)
+#define TARGET_NR_cacheflush			(TARGET_NR_Linux + 147)
+#define TARGET_NR_cachectl			(TARGET_NR_Linux + 148)
+#define TARGET_NR_sysmips			(TARGET_NR_Linux + 149)
+#define TARGET_NR_unused150			(TARGET_NR_Linux + 150)
+#define TARGET_NR_getsid			(TARGET_NR_Linux + 151)
+#define TARGET_NR_fdatasync			(TARGET_NR_Linux + 152)
+#define TARGET_NR__sysctl			(TARGET_NR_Linux + 153)
+#define TARGET_NR_mlock			(TARGET_NR_Linux + 154)
+#define TARGET_NR_munlock			(TARGET_NR_Linux + 155)
+#define TARGET_NR_mlockall			(TARGET_NR_Linux + 156)
+#define TARGET_NR_munlockall			(TARGET_NR_Linux + 157)
+#define TARGET_NR_sched_setparam		(TARGET_NR_Linux + 158)
+#define TARGET_NR_sched_getparam		(TARGET_NR_Linux + 159)
+#define TARGET_NR_sched_setscheduler		(TARGET_NR_Linux + 160)
+#define TARGET_NR_sched_getscheduler		(TARGET_NR_Linux + 161)
+#define TARGET_NR_sched_yield		(TARGET_NR_Linux + 162)
+#define TARGET_NR_sched_get_priority_max	(TARGET_NR_Linux + 163)
+#define TARGET_NR_sched_get_priority_min	(TARGET_NR_Linux + 164)
+#define TARGET_NR_sched_rr_get_interval	(TARGET_NR_Linux + 165)
+#define TARGET_NR_nanosleep			(TARGET_NR_Linux + 166)
+#define TARGET_NR_mremap			(TARGET_NR_Linux + 167)
+#define TARGET_NR_accept			(TARGET_NR_Linux + 168)
+#define TARGET_NR_bind			(TARGET_NR_Linux + 169)
+#define TARGET_NR_connect			(TARGET_NR_Linux + 170)
+#define TARGET_NR_getpeername		(TARGET_NR_Linux + 171)
+#define TARGET_NR_getsockname		(TARGET_NR_Linux + 172)
+#define TARGET_NR_getsockopt			(TARGET_NR_Linux + 173)
+#define TARGET_NR_listen			(TARGET_NR_Linux + 174)
+#define TARGET_NR_recv			(TARGET_NR_Linux + 175)
+#define TARGET_NR_recvfrom			(TARGET_NR_Linux + 176)
+#define TARGET_NR_recvmsg			(TARGET_NR_Linux + 177)
+#define TARGET_NR_send			(TARGET_NR_Linux + 178)
+#define TARGET_NR_sendmsg			(TARGET_NR_Linux + 179)
+#define TARGET_NR_sendto			(TARGET_NR_Linux + 180)
+#define TARGET_NR_setsockopt			(TARGET_NR_Linux + 181)
+#define TARGET_NR_shutdown			(TARGET_NR_Linux + 182)
+#define TARGET_NR_socket			(TARGET_NR_Linux + 183)
+#define TARGET_NR_socketpair			(TARGET_NR_Linux + 184)
+#define TARGET_NR_setresuid			(TARGET_NR_Linux + 185)
+#define TARGET_NR_getresuid			(TARGET_NR_Linux + 186)
+#define TARGET_NR_query_module		(TARGET_NR_Linux + 187)
+#define TARGET_NR_poll			(TARGET_NR_Linux + 188)
+#define TARGET_NR_nfsservctl			(TARGET_NR_Linux + 189)
+#define TARGET_NR_setresgid			(TARGET_NR_Linux + 190)
+#define TARGET_NR_getresgid			(TARGET_NR_Linux + 191)
+#define TARGET_NR_prctl			(TARGET_NR_Linux + 192)
+#define TARGET_NR_rt_sigreturn		(TARGET_NR_Linux + 193)
+#define TARGET_NR_rt_sigaction		(TARGET_NR_Linux + 194)
+#define TARGET_NR_rt_sigprocmask		(TARGET_NR_Linux + 195)
+#define TARGET_NR_rt_sigpending		(TARGET_NR_Linux + 196)
+#define TARGET_NR_rt_sigtimedwait		(TARGET_NR_Linux + 197)
+#define TARGET_NR_rt_sigqueueinfo		(TARGET_NR_Linux + 198)
+#define TARGET_NR_rt_sigsuspend		(TARGET_NR_Linux + 199)
+#define TARGET_NR_pread64			(TARGET_NR_Linux + 200)
+#define TARGET_NR_pwrite64			(TARGET_NR_Linux + 201)
+#define TARGET_NR_chown			(TARGET_NR_Linux + 202)
+#define TARGET_NR_getcwd			(TARGET_NR_Linux + 203)
+#define TARGET_NR_capget			(TARGET_NR_Linux + 204)
+#define TARGET_NR_capset			(TARGET_NR_Linux + 205)
+#define TARGET_NR_sigaltstack		(TARGET_NR_Linux + 206)
+#define TARGET_NR_sendfile			(TARGET_NR_Linux + 207)
+#define TARGET_NR_getpmsg			(TARGET_NR_Linux + 208)
+#define TARGET_NR_putpmsg			(TARGET_NR_Linux + 209)
+#define TARGET_NR_mmap2			(TARGET_NR_Linux + 210)
+#define TARGET_NR_truncate64			(TARGET_NR_Linux + 211)
+#define TARGET_NR_ftruncate64		(TARGET_NR_Linux + 212)
+#define TARGET_NR_stat64			(TARGET_NR_Linux + 213)
+#define TARGET_NR_lstat64			(TARGET_NR_Linux + 214)
+#define TARGET_NR_fstat64			(TARGET_NR_Linux + 215)
+#define TARGET_NR_pivot_root			(TARGET_NR_Linux + 216)
+#define TARGET_NR_mincore			(TARGET_NR_Linux + 217)
+#define TARGET_NR_madvise			(TARGET_NR_Linux + 218)
+#define TARGET_NR_getdents64			(TARGET_NR_Linux + 219)
+#define TARGET_NR_fcntl64			(TARGET_NR_Linux + 220)
+#define TARGET_NR_reserved221		(TARGET_NR_Linux + 221)
+#define TARGET_NR_gettid			(TARGET_NR_Linux + 222)
+#define TARGET_NR_readahead			(TARGET_NR_Linux + 223)
+#define TARGET_NR_setxattr			(TARGET_NR_Linux + 224)
+#define TARGET_NR_lsetxattr			(TARGET_NR_Linux + 225)
+#define TARGET_NR_fsetxattr			(TARGET_NR_Linux + 226)
+#define TARGET_NR_getxattr			(TARGET_NR_Linux + 227)
+#define TARGET_NR_lgetxattr			(TARGET_NR_Linux + 228)
+#define TARGET_NR_fgetxattr			(TARGET_NR_Linux + 229)
+#define TARGET_NR_listxattr			(TARGET_NR_Linux + 230)
+#define TARGET_NR_llistxattr			(TARGET_NR_Linux + 231)
+#define TARGET_NR_flistxattr			(TARGET_NR_Linux + 232)
+#define TARGET_NR_removexattr		(TARGET_NR_Linux + 233)
+#define TARGET_NR_lremovexattr		(TARGET_NR_Linux + 234)
+#define TARGET_NR_fremovexattr		(TARGET_NR_Linux + 235)
+#define TARGET_NR_tkill			(TARGET_NR_Linux + 236)
+#define TARGET_NR_sendfile64			(TARGET_NR_Linux + 237)
+#define TARGET_NR_futex			(TARGET_NR_Linux + 238)
+#define TARGET_NR_sched_setaffinity		(TARGET_NR_Linux + 239)
+#define TARGET_NR_sched_getaffinity		(TARGET_NR_Linux + 240)
+#define TARGET_NR_io_setup			(TARGET_NR_Linux + 241)
+#define TARGET_NR_io_destroy			(TARGET_NR_Linux + 242)
+#define TARGET_NR_io_getevents		(TARGET_NR_Linux + 243)
+#define TARGET_NR_io_submit			(TARGET_NR_Linux + 244)
+#define TARGET_NR_io_cancel			(TARGET_NR_Linux + 245)
+#define TARGET_NR_exit_group			(TARGET_NR_Linux + 246)
+#define TARGET_NR_lookup_dcookie		(TARGET_NR_Linux + 247)
+#define TARGET_NR_epoll_create		(TARGET_NR_Linux + 248)
+#define TARGET_NR_epoll_ctl			(TARGET_NR_Linux + 249)
+#define TARGET_NR_epoll_wait			(TARGET_NR_Linux + 250)
+#define TARGET_NR_remap_file_pages		(TARGET_NR_Linux + 251)
+#define TARGET_NR_set_tid_address		(TARGET_NR_Linux + 252)
+#define TARGET_NR_restart_syscall		(TARGET_NR_Linux + 253)
+#define TARGET_NR_fadvise64			(TARGET_NR_Linux + 254)
+#define TARGET_NR_statfs64			(TARGET_NR_Linux + 255)
+#define TARGET_NR_fstatfs64			(TARGET_NR_Linux + 256)
+#define TARGET_NR_timer_create		(TARGET_NR_Linux + 257)
+#define TARGET_NR_timer_settime		(TARGET_NR_Linux + 258)
+#define TARGET_NR_timer_gettime		(TARGET_NR_Linux + 259)
+#define TARGET_NR_timer_getoverrun		(TARGET_NR_Linux + 260)
+#define TARGET_NR_timer_delete		(TARGET_NR_Linux + 261)
+#define TARGET_NR_clock_settime		(TARGET_NR_Linux + 262)
+#define TARGET_NR_clock_gettime		(TARGET_NR_Linux + 263)
+#define TARGET_NR_clock_getres		(TARGET_NR_Linux + 264)
+#define TARGET_NR_clock_nanosleep		(TARGET_NR_Linux + 265)
+#define TARGET_NR_tgkill			(TARGET_NR_Linux + 266)
+#define TARGET_NR_utimes			(TARGET_NR_Linux + 267)
+#define TARGET_NR_mbind			(TARGET_NR_Linux + 268)
+#define TARGET_NR_get_mempolicy		(TARGET_NR_Linux + 269)
+#define TARGET_NR_set_mempolicy		(TARGET_NR_Linux + 270)
+#define TARGET_NR_mq_open			(TARGET_NR_Linux + 271)
+#define TARGET_NR_mq_unlink			(TARGET_NR_Linux + 272)
+#define TARGET_NR_mq_timedsend		(TARGET_NR_Linux + 273)
+#define TARGET_NR_mq_timedreceive		(TARGET_NR_Linux + 274)
+#define TARGET_NR_mq_notify			(TARGET_NR_Linux + 275)
+#define TARGET_NR_mq_getsetattr		(TARGET_NR_Linux + 276)
+#define TARGET_NR_vserver			(TARGET_NR_Linux + 277)
+#define TARGET_NR_waitid			(TARGET_NR_Linux + 278)
+/* #define TARGET_NR_sys_setaltroot		(TARGET_NR_Linux + 279) */
+#define TARGET_NR_add_key			(TARGET_NR_Linux + 280)
+#define TARGET_NR_request_key		(TARGET_NR_Linux + 281)
+#define TARGET_NR_keyctl			(TARGET_NR_Linux + 282)
+
diff --git a/linux-user/mips/termbits.h b/linux-user/mips/termbits.h
new file mode 100644
index 0000000000..7f428997cc
--- /dev/null
+++ b/linux-user/mips/termbits.h
@@ -0,0 +1,214 @@
+/* from asm/termbits.h */
+
+#define TARGET_NCCS 23
+
+struct target_termios {
+    unsigned int c_iflag;               /* input mode flags */
+    unsigned int c_oflag;               /* output mode flags */
+    unsigned int c_cflag;               /* control mode flags */
+    unsigned int c_lflag;               /* local mode flags */
+    unsigned char c_line;                    /* line discipline */
+    unsigned char c_cc[TARGET_NCCS];                /* control characters */
+};
+
+/* c_iflag bits */
+#define TARGET_IGNBRK  0000001
+#define TARGET_BRKINT  0000002
+#define TARGET_IGNPAR  0000004
+#define TARGET_PARMRK  0000010
+#define TARGET_INPCK   0000020
+#define TARGET_ISTRIP  0000040
+#define TARGET_INLCR   0000100
+#define TARGET_IGNCR   0000200
+#define TARGET_ICRNL   0000400
+#define TARGET_IUCLC   0001000
+#define TARGET_IXON    0002000
+#define TARGET_IXANY   0004000
+#define TARGET_IXOFF   0010000
+#define TARGET_IMAXBEL 0020000
+
+/* c_oflag bits */
+#define TARGET_OPOST   0000001
+#define TARGET_OLCUC   0000002
+#define TARGET_ONLCR   0000004
+#define TARGET_OCRNL   0000010
+#define TARGET_ONOCR   0000020
+#define TARGET_ONLRET  0000040
+#define TARGET_OFILL   0000100
+#define TARGET_OFDEL   0000200
+#define TARGET_NLDLY   0000400
+#define   TARGET_NL0   0000000
+#define   TARGET_NL1   0000400
+#define TARGET_CRDLY   0003000
+#define   TARGET_CR0   0000000
+#define   TARGET_CR1   0001000
+#define   TARGET_CR2   0002000
+#define   TARGET_CR3   0003000
+#define TARGET_TABDLY  0014000
+#define   TARGET_TAB0  0000000
+#define   TARGET_TAB1  0004000
+#define   TARGET_TAB2  0010000
+#define   TARGET_TAB3  0014000
+#define   TARGET_XTABS 0014000
+#define TARGET_BSDLY   0020000
+#define   TARGET_BS0   0000000
+#define   TARGET_BS1   0020000
+#define TARGET_VTDLY   0040000
+#define   TARGET_VT0   0000000
+#define   TARGET_VT1   0040000
+#define TARGET_FFDLY   0100000
+#define   TARGET_FF0   0000000
+#define   TARGET_FF1   0100000
+
+/* c_cflag bit meaning */
+#define TARGET_CBAUD   0010017
+#define  TARGET_B0     0000000         /* hang up */
+#define  TARGET_B50    0000001
+#define  TARGET_B75    0000002
+#define  TARGET_B110   0000003
+#define  TARGET_B134   0000004
+#define  TARGET_B150   0000005
+#define  TARGET_B200   0000006
+#define  TARGET_B300   0000007
+#define  TARGET_B600   0000010
+#define  TARGET_B1200  0000011
+#define  TARGET_B1800  0000012
+#define  TARGET_B2400  0000013
+#define  TARGET_B4800  0000014
+#define  TARGET_B9600  0000015
+#define  TARGET_B19200 0000016
+#define  TARGET_B38400 0000017
+#define TARGET_EXTA B19200
+#define TARGET_EXTB B38400
+#define TARGET_CSIZE   0000060
+#define   TARGET_CS5   0000000
+#define   TARGET_CS6   0000020
+#define   TARGET_CS7   0000040
+#define   TARGET_CS8   0000060
+#define TARGET_CSTOPB  0000100
+#define TARGET_CREAD   0000200
+#define TARGET_PARENB  0000400
+#define TARGET_PARODD  0001000
+#define TARGET_HUPCL   0002000
+#define TARGET_CLOCAL  0004000
+#define TARGET_CBAUDEX 0010000
+#define  TARGET_B57600  0010001
+#define  TARGET_B115200 0010002
+#define  TARGET_B230400 0010003
+#define  TARGET_B460800 0010004
+#define TARGET_CIBAUD    002003600000  /* input baud rate (not used) */
+#define TARGET_CRTSCTS   020000000000          /* flow control */
+
+/* c_lflag bits */
+#define TARGET_ISIG    0000001
+#define TARGET_ICANON  0000002
+#define TARGET_XCASE   0000004
+#define TARGET_ECHO    0000010
+#define TARGET_ECHOE   0000020
+#define TARGET_ECHOK   0000040
+#define TARGET_ECHONL  0000100
+#define TARGET_NOFLSH  0000200
+#define TARGET_TOSTOP  0000400
+#define TARGET_ECHOCTL 0001000
+#define TARGET_ECHOPRT 0002000
+#define TARGET_ECHOKE  0004000
+#define TARGET_FLUSHO  0010000
+#define TARGET_PENDIN  0040000
+#define TARGET_IEXTEN  0100000
+
+/* c_cc character offsets */
+#define TARGET_VINTR	0
+#define TARGET_VQUIT	1
+#define TARGET_VERASE	2
+#define TARGET_VKILL	3
+#define TARGET_VEOF	4
+#define TARGET_VTIME	5
+#define TARGET_VMIN	6
+#define TARGET_VSWTC	7
+#define TARGET_VSTART	8
+#define TARGET_VSTOP	9
+#define TARGET_VSUSP	10
+#define TARGET_VEOL	11
+#define TARGET_VREPRINT	12
+#define TARGET_VDISCARD	13
+#define TARGET_VWERASE	14
+#define TARGET_VLNEXT	15
+#define TARGET_VEOL2	16
+
+/* ioctls */
+
+#define TARGET_TCGETS		0x5401
+#define TARGET_TCSETS		0x5402
+#define TARGET_TCSETSW		0x5403
+#define TARGET_TCSETSF		0x5404
+#define TARGET_TCGETA		0x5405
+#define TARGET_TCSETA		0x5406
+#define TARGET_TCSETAW		0x5407
+#define TARGET_TCSETAF		0x5408
+#define TARGET_TCSBRK		0x5409
+#define TARGET_TCXONC		0x540A
+#define TARGET_TCFLSH		0x540B
+
+#define TARGET_TIOCEXCL	0x540C
+#define TARGET_TIOCNXCL	0x540D
+#define TARGET_TIOCSCTTY	0x540E
+#define TARGET_TIOCGPGRP	0x540F
+#define TARGET_TIOCSPGRP	0x5410
+#define TARGET_TIOCOUTQ	0x5411
+#define TARGET_TIOCSTI		0x5412
+#define TARGET_TIOCGWINSZ	0x5413
+#define TARGET_TIOCSWINSZ	0x5414
+#define TARGET_TIOCMGET	0x5415
+#define TARGET_TIOCMBIS	0x5416
+#define TARGET_TIOCMBIC	0x5417
+#define TARGET_TIOCMSET	0x5418
+#define TARGET_TIOCGSOFTCAR	0x5419
+#define TARGET_TIOCSSOFTCAR	0x541A
+#define TARGET_FIONREAD	0x541B
+#define TARGET_TIOCINQ		TARGET_FIONREAD
+#define TARGET_TIOCLINUX	0x541C
+#define TARGET_TIOCCONS	0x541D
+#define TARGET_TIOCGSERIAL	0x541E
+#define TARGET_TIOCSSERIAL	0x541F
+#define TARGET_TIOCPKT		0x5420
+#define TARGET_FIONBIO		0x5421
+#define TARGET_TIOCNOTTY	0x5422
+#define TARGET_TIOCSETD	0x5423
+#define TARGET_TIOCGETD	0x5424
+#define TARGET_TCSBRKP		0x5425	/* Needed for POSIX tcsendbreak() */
+#define TARGET_TIOCTTYGSTRUCT	0x5426  /* For debugging only */
+#define TARGET_TIOCSBRK	0x5427  /* BSD compatibility */
+#define TARGET_TIOCCBRK	0x5428  /* BSD compatibility */
+#define TARGET_TIOCGSID	0x5429  /* Return the session ID of FD */
+#define TARGET_TIOCGPTN	TARGET_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
+#define TARGET_TIOCSPTLCK	TARGET_IOW('T',0x31, int)  /* Lock/unlock Pty */
+
+#define TARGET_FIONCLEX	0x5450  /* these numbers need to be adjusted. */
+#define TARGET_FIOCLEX		0x5451
+#define TARGET_FIOASYNC	0x5452
+#define TARGET_TIOCSERCONFIG	0x5453
+#define TARGET_TIOCSERGWILD	0x5454
+#define TARGET_TIOCSERSWILD	0x5455
+#define TARGET_TIOCGLCKTRMIOS	0x5456
+#define TARGET_TIOCSLCKTRMIOS	0x5457
+#define TARGET_TIOCSERGSTRUCT	0x5458 /* For debugging only */
+#define TARGET_TIOCSERGETLSR   0x5459 /* Get line status register */
+#define TARGET_TIOCSERGETMULTI 0x545A /* Get multiport config  */
+#define TARGET_TIOCSERSETMULTI 0x545B /* Set multiport config */
+
+#define TARGET_TIOCMIWAIT	0x545C	/* wait for a change on serial input line(s) */
+#define TARGET_TIOCGICOUNT	0x545D	/* read serial port inline interrupt counts */
+#define TARGET_TIOCGHAYESESP   0x545E  /* Get Hayes ESP configuration */
+#define TARGET_TIOCSHAYESESP   0x545F  /* Set Hayes ESP configuration */
+
+/* Used for packet mode */
+#define TARGET_TIOCPKT_DATA		 0
+#define TARGET_TIOCPKT_FLUSHREAD	 1
+#define TARGET_TIOCPKT_FLUSHWRITE	 2
+#define TARGET_TIOCPKT_STOP		 4
+#define TARGET_TIOCPKT_START		 8
+#define TARGET_TIOCPKT_NOSTOP		16
+#define TARGET_TIOCPKT_DOSTOP		32
+
+#define TARGET_TIOCSER_TEMT    0x01	/* Transmitter physically empty */
+
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index e51f513532..f5b7f8e68d 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -1497,6 +1497,8 @@ int do_fork(CPUState *env, unsigned int flags, unsigned long newsp)
         new_env->regs[0] = 0;
 #elif defined(TARGET_SPARC)
         printf ("HELPME: %s:%d\n", __FILE__, __LINE__);
+#elif defined(TARGET_MIPS)
+        printf ("HELPME: %s:%d\n", __FILE__, __LINE__);
 #elif defined(TARGET_PPC)
         if (!newsp)
             newsp = env->gpr[1];
@@ -2184,6 +2186,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
             ret = get_errno(settimeofday(&tv, NULL));
         }
         break;
+#ifdef TARGET_NR_select
     case TARGET_NR_select:
         {
             struct target_sel_arg_struct *sel = (void *)arg1;
@@ -2196,6 +2199,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
                             (void *)sel->exp, (void *)sel->tvp);
         }
         break;
+#endif
     case TARGET_NR_symlink:
         ret = get_errno(symlink((const char *)arg1, (const char *)arg2));
         break;
@@ -2802,9 +2806,11 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
     case TARGET_NR_putpmsg:
         goto unimplemented;
 #endif
+#ifdef TARGET_NR_vfork
     case TARGET_NR_vfork:
         ret = get_errno(do_fork(cpu_env, CLONE_VFORK | CLONE_VM | SIGCHLD, 0));
         break;
+#endif
 #ifdef TARGET_NR_ugetrlimit
     case TARGET_NR_ugetrlimit:
     {
diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
index ae212ec32c..ac12b52eeb 100644
--- a/linux-user/syscall_defs.h
+++ b/linux-user/syscall_defs.h
@@ -57,7 +57,8 @@
 #define TARGET_IOC_WRITE  1U
 #define TARGET_IOC_READ	  2U
 
-#elif defined(TARGET_PPC) || defined(TARGET_ALPHA) || defined(TARGET_SPARC)
+#elif defined(TARGET_PPC) || defined(TARGET_ALPHA) || \
+      defined(TARGET_SPARC) || defined(TARGET_MIPS)
 
 #define TARGET_IOC_SIZEBITS	13
 #define TARGET_IOC_DIRBITS	3
@@ -292,9 +293,26 @@ struct target_sigaction;
 int do_sigaction(int sig, const struct target_sigaction *act,
                  struct target_sigaction *oact);
 
-#if defined(TARGET_I386) || defined(TARGET_ARM) || defined(TARGET_SPARC) || defined(TARGET_PPC)
+#if defined(TARGET_I386) || defined(TARGET_ARM) || defined(TARGET_SPARC) || defined(TARGET_PPC) || defined(TARGET_MIPS)
 
-#if !defined(TARGET_SPARC)
+#if defined(TARGET_SPARC)
+#define TARGET_SA_NOCLDSTOP    8u
+#define TARGET_SA_NOCLDWAIT    0x100u
+#define TARGET_SA_SIGINFO      0x200u
+#define TARGET_SA_ONSTACK      1u
+#define TARGET_SA_RESTART      2u
+#define TARGET_SA_NODEFER      0x20u
+#define TARGET_SA_RESETHAND    4u
+#elif defined(TARGET_MIPS)
+#define TARGET_SA_NOCLDSTOP	0x00000001
+#define TARGET_SA_NOCLDWAIT	0x00010000
+#define TARGET_SA_SIGINFO	0x00000008
+#define TARGET_SA_ONSTACK	0x08000000
+#define TARGET_SA_NODEFER	0x40000000
+#define TARGET_SA_RESTART	0x10000000
+#define TARGET_SA_RESETHAND	0x80000000
+#define TARGET_SA_RESTORER	0x04000000	/* Only for o32 */
+#else
 #define TARGET_SA_NOCLDSTOP	0x00000001
 #define TARGET_SA_NOCLDWAIT	0x00000002 /* not supported yet */
 #define TARGET_SA_SIGINFO	0x00000004
@@ -303,14 +321,6 @@ int do_sigaction(int sig, const struct target_sigaction *act,
 #define TARGET_SA_NODEFER	0x40000000
 #define TARGET_SA_RESETHAND	0x80000000
 #define TARGET_SA_RESTORER	0x04000000
-#else /* TARGET_SPARC */
-#define TARGET_SA_NOCLDSTOP    8u
-#define TARGET_SA_NOCLDWAIT    0x100u
-#define TARGET_SA_SIGINFO      0x200u
-#define TARGET_SA_ONSTACK      1u
-#define TARGET_SA_RESTART      2u
-#define TARGET_SA_NODEFER      0x20u
-#define TARGET_SA_RESETHAND    4u
 #endif
 
 #if defined(TARGET_SPARC)
@@ -353,6 +363,49 @@ int do_sigaction(int sig, const struct target_sigaction *act,
 #define TARGET_SIG_UNBLOCK        0x02 /* for unblocking signals */
 #define TARGET_SIG_SETMASK        0x04 /* for setting the signal mask */
 
+#elif defined(TARGET_MIPS)
+
+#define TARGET_SIGHUP		 1	/* Hangup (POSIX).  */
+#define TARGET_SIGINT		 2	/* Interrupt (ANSI).  */
+#define TARGET_SIGQUIT		 3	/* Quit (POSIX).  */
+#define TARGET_SIGILL		 4	/* Illegal instruction (ANSI).  */
+#define TARGET_SIGTRAP		 5	/* Trace trap (POSIX).  */
+#define TARGET_SIGIOT		 6	/* IOT trap (4.2 BSD).  */
+#define TARGET_SIGABRT		 TARGET_SIGIOT	/* Abort (ANSI).  */
+#define TARGET_SIGEMT		 7
+#define TARGET_SIGSTKFLT	 7 /* XXX: incorrect */
+#define TARGET_SIGFPE		 8	/* Floating-point exception (ANSI).  */
+#define TARGET_SIGKILL		 9	/* Kill, unblockable (POSIX).  */
+#define TARGET_SIGBUS		10	/* BUS error (4.2 BSD).  */
+#define TARGET_SIGSEGV		11	/* Segmentation violation (ANSI).  */
+#define TARGET_SIGSYS		12
+#define TARGET_SIGPIPE		13	/* Broken pipe (POSIX).  */
+#define TARGET_SIGALRM		14	/* Alarm clock (POSIX).  */
+#define TARGET_SIGTERM		15	/* Termination (ANSI).  */
+#define TARGET_SIGUSR1		16	/* User-defined signal 1 (POSIX).  */
+#define TARGET_SIGUSR2		17	/* User-defined signal 2 (POSIX).  */
+#define TARGET_SIGCHLD		18	/* Child status has changed (POSIX).  */
+#define TARGET_SIGCLD		TARGET_SIGCHLD	/* Same as TARGET_SIGCHLD (System V).  */
+#define TARGET_SIGPWR		19	/* Power failure restart (System V).  */
+#define TARGET_SIGWINCH	20	/* Window size change (4.3 BSD, Sun).  */
+#define TARGET_SIGURG		21	/* Urgent condition on socket (4.2 BSD).  */
+#define TARGET_SIGIO		22	/* I/O now possible (4.2 BSD).  */
+#define TARGET_SIGPOLL		TARGET_SIGIO	/* Pollable event occurred (System V).  */
+#define TARGET_SIGSTOP		23	/* Stop, unblockable (POSIX).  */
+#define TARGET_SIGTSTP		24	/* Keyboard stop (POSIX).  */
+#define TARGET_SIGCONT		25	/* Continue (POSIX).  */
+#define TARGET_SIGTTIN		26	/* Background read from tty (POSIX).  */
+#define TARGET_SIGTTOU		27	/* Background write to tty (POSIX).  */
+#define TARGET_SIGVTALRM	28	/* Virtual alarm clock (4.2 BSD).  */
+#define TARGET_SIGPROF		29	/* Profiling alarm clock (4.2 BSD).  */
+#define TARGET_SIGXCPU		30	/* CPU limit exceeded (4.2 BSD).  */
+#define TARGET_SIGXFSZ		31	/* File size limit exceeded (4.2 BSD).  */
+#define TARGET_SIGRTMIN         32
+
+#define TARGET_SIG_BLOCK	1	/* for blocking signals */
+#define TARGET_SIG_UNBLOCK	2	/* for unblocking signals */
+#define TARGET_SIG_SETMASK	3	/* for setting the signal mask */
+
 #else
 
 #define TARGET_SIGHUP		 1
@@ -794,13 +847,21 @@ struct target_winsize {
 #define TARGET_MAP_PRIVATE	0x02		/* Changes are private */
 #define TARGET_MAP_TYPE	0x0f		/* Mask for type of mapping */
 #define TARGET_MAP_FIXED	0x10		/* Interpret addr exactly */
+#if defined(TARGET_MIPS)
+#define TARGET_MAP_ANONYMOUS	0x0800		/* don't use a file */
+#define TARGET_MAP_GROWSDOWN	0x1000		/* stack-like segment */
+#define TARGET_MAP_DENYWRITE	0x2000		/* ETXTBSY */
+#define TARGET_MAP_EXECUTABLE	0x4000		/* mark it as an executable */
+#define TARGET_MAP_LOCKED	0x8000		/* pages are locked */
+#define TARGET_MAP_NORESERVE	0x0400		/* don't check for reservations */
+#else
 #define TARGET_MAP_ANONYMOUS	0x20		/* don't use a file */
-
 #define TARGET_MAP_GROWSDOWN	0x0100		/* stack-like segment */
 #define TARGET_MAP_DENYWRITE	0x0800		/* ETXTBSY */
 #define TARGET_MAP_EXECUTABLE	0x1000		/* mark it as an executable */
 #define TARGET_MAP_LOCKED	0x2000		/* pages are locked */
 #define TARGET_MAP_NORESERVE	0x4000		/* don't check for reservations */
+#endif
 
 #if defined(TARGET_I386) || defined(TARGET_ARM)
 struct target_stat {
@@ -967,7 +1028,79 @@ struct target_stat64 {
         target_ulong    __unused5;
 };
 
-#endif /* defined(TARGET_PPC) */
+#elif defined(TARGET_MIPS)
+
+struct target_stat {
+	unsigned	st_dev;
+	target_long	st_pad1[3];		/* Reserved for network id */
+	target_ulong	st_ino;
+	unsigned int	st_mode;
+	unsigned int	st_nlink;
+	int		st_uid;
+	int		st_gid;
+	unsigned 	st_rdev;
+	target_long	st_pad2[2];
+	target_long	st_size;
+	target_long	st_pad3;
+	/*
+	 * Actually this should be timestruc_t st_atime, st_mtime and st_ctime
+	 * but we don't have it under Linux.
+	 */
+	target_long		target_st_atime;
+	target_long		target_st_atime_nsec;
+	target_long		target_st_mtime;
+	target_long		target_st_mtime_nsec;
+	target_long		target_st_ctime;
+	target_long		target_st_ctime_nsec;
+	target_long		st_blksize;
+	target_long		st_blocks;
+	target_long		st_pad4[14];
+};
+
+/*
+ * This matches struct stat64 in glibc2.1, hence the absolutely insane
+ * amounts of padding around dev_t's.  The memory layout is the same as of
+ * struct stat of the 64-bit kernel.
+ */
+
+struct target_stat64 {
+	target_ulong	st_dev;
+	target_ulong	st_pad0[3];	/* Reserved for st_dev expansion  */
+
+	uint64_t	st_ino;
+
+        unsigned int	st_mode;
+        unsigned int	st_nlink;
+
+	int		st_uid;
+	int		st_gid;
+
+	target_ulong	st_rdev;
+	target_ulong	st_pad1[3];	/* Reserved for st_rdev expansion  */
+
+	int64_t 	st_size;
+
+	/*
+	 * Actually this should be timestruc_t st_atime, st_mtime and st_ctime
+	 * but we don't have it under Linux.
+	 */
+	target_long	target_st_atime;
+	target_ulong	target_st_atime_nsec;	/* Reserved for st_atime expansion  */
+
+	target_long	target_st_mtime;
+	target_ulong	target_st_mtime_nsec;	/* Reserved for st_mtime expansion  */
+
+	target_long	target_st_ctime;
+	target_ulong	target_st_ctime_nsec;	/* Reserved for st_ctime expansion  */
+
+	target_ulong	st_blksize;
+	target_ulong	st_pad2;
+
+	int64_t  	st_blocks;
+};
+#else
+#error unsupported CPU
+#endif
 
 #define TARGET_F_DUPFD         0       /* dup */
 #define TARGET_F_GETFD         1       /* get close_on_exec */
@@ -1007,7 +1140,7 @@ struct target_stat64 {
 #define TARGET_O_TRUNC           01000 /* not fcntl */
 #define TARGET_O_APPEND          02000
 #define TARGET_O_NONBLOCK        04000
-#define TARGET_O_NDELAY        O_NONBLOCK
+#define TARGET_O_NDELAY        TARGET_O_NONBLOCK
 #define TARGET_O_SYNC           010000
 #define TARGET_FASYNC           020000 /* fcntl, for BSD compatibility */
 #define TARGET_O_DIRECTORY      040000 /* must be a directory */
@@ -1025,7 +1158,7 @@ struct target_stat64 {
 #define TARGET_O_TRUNC           01000 /* not fcntl */
 #define TARGET_O_APPEND          02000
 #define TARGET_O_NONBLOCK        04000
-#define TARGET_O_NDELAY        O_NONBLOCK
+#define TARGET_O_NDELAY        TARGET_O_NONBLOCK
 #define TARGET_O_SYNC           010000
 #define TARGET_FASYNC           020000 /* fcntl, for BSD compatibility */
 #define TARGET_O_DIRECTORY      040000 /* must be a directory */
@@ -1044,12 +1177,31 @@ struct target_stat64 {
 #define TARGET_O_EXCL          0x0800  /* not fcntl */
 #define TARGET_O_SYNC          0x2000
 #define TARGET_O_NONBLOCK      0x4000
-#define TARGET_O_NDELAY        (0x0004 | O_NONBLOCK)
+#define TARGET_O_NDELAY        (0x0004 | TARGET_O_NONBLOCK)
 #define TARGET_O_NOCTTY        0x8000  /* not fcntl */
 #define TARGET_O_DIRECTORY     0x10000 /* must be a directory */
 #define TARGET_O_NOFOLLOW      0x20000 /* don't follow links */
 #define TARGET_O_LARGEFILE     0x40000
 #define TARGET_O_DIRECT        0x100000 /* direct disk access hint */
+#elif defined(TARGET_MIPS)
+#define TARGET_O_ACCMODE	0x0003
+#define TARGET_O_RDONLY	0x0000
+#define TARGET_O_WRONLY	0x0001
+#define TARGET_O_RDWR		0x0002
+#define TARGET_O_APPEND	0x0008
+#define TARGET_O_SYNC		0x0010
+#define TARGET_O_NONBLOCK	0x0080
+#define TARGET_O_CREAT         0x0100	/* not fcntl */
+#define TARGET_O_TRUNC		0x0200	/* not fcntl */
+#define TARGET_O_EXCL		0x0400	/* not fcntl */
+#define TARGET_O_NOCTTY	0x0800	/* not fcntl */
+#define TARGET_FASYNC		0x1000	/* fcntl, for BSD compatibility */
+#define TARGET_O_LARGEFILE	0x2000	/* allow large file opens */
+#define TARGET_O_DIRECT	0x8000	/* direct disk access hint */
+#define TARGET_O_DIRECTORY	0x10000	/* must be a directory */
+#define TARGET_O_NOFOLLOW	0x20000	/* don't follow links */
+#define TARGET_O_NOATIME	0x40000
+#define TARGET_O_NDELAY	TARGET_O_NONBLOCK
 #else
 #define TARGET_O_ACCMODE          0003
 #define TARGET_O_RDONLY             00
@@ -1061,7 +1213,7 @@ struct target_stat64 {
 #define TARGET_O_TRUNC           01000 /* not fcntl */
 #define TARGET_O_APPEND          02000
 #define TARGET_O_NONBLOCK        04000
-#define TARGET_O_NDELAY        O_NONBLOCK
+#define TARGET_O_NDELAY        TARGET_O_NONBLOCK
 #define TARGET_O_SYNC           010000
 #define TARGET_FASYNC           020000 /* fcntl, for BSD compatibility */
 #define TARGET_O_DIRECT         040000 /* direct disk access hint */
diff --git a/target-mips/op_helper.c b/target-mips/op_helper.c
index b8397be299..cb4789cfa5 100644
--- a/target-mips/op_helper.c
+++ b/target-mips/op_helper.c
@@ -114,6 +114,37 @@ void do_msubu (void)
 }
 #endif
 
+#if defined(CONFIG_USER_ONLY) 
+void do_mfc0 (int reg, int sel)
+{
+    cpu_abort(env, "mfc0 reg=%d sel=%d\n", reg, sel);
+}
+void do_mtc0 (int reg, int sel)
+{
+    cpu_abort(env, "mtc0 reg=%d sel=%d\n", reg, sel);
+}
+
+void do_tlbwi (void)
+{
+    cpu_abort(env, "tlbwi\n");
+}
+
+void do_tlbwr (void)
+{
+    cpu_abort(env, "tlbwr\n");
+}
+
+void do_tlbp (void)
+{
+    cpu_abort(env, "tlbp\n");
+}
+
+void do_tlbr (void)
+{
+    cpu_abort(env, "tlbr\n");
+}
+#else
+
 /* CP0 helpers */
 void do_mfc0 (int reg, int sel)
 {
@@ -580,6 +611,8 @@ void do_tlbr (void)
 }
 #endif
 
+#endif /* !CONFIG_USER_ONLY */
+
 void op_dump_ldst (const unsigned char *func)
 {
     if (loglevel)