]> git.proxmox.com Git - mirror_qemu.git/commitdiff
mips user emulation
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Sat, 26 Nov 2005 18:47:20 +0000 (18:47 +0000)
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Sat, 26 Nov 2005 18:47:20 +0000 (18:47 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1668 c046a42c-6fe2-441c-8c8c-71466251a162

Changelog
configure
linux-user/elfload.c
linux-user/main.c
linux-user/mips/syscall.h [new file with mode: 0644]
linux-user/mips/syscall_nr.h [new file with mode: 0644]
linux-user/mips/termbits.h [new file with mode: 0644]
linux-user/syscall.c
linux-user/syscall_defs.h
target-mips/op_helper.c

index d386474acd751a91433a38f6cc8a670fc0cd1ba0..8c97b8ec50f4bca23d5cbf5d22eba4d9b0ed4313 100644 (file)
--- 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:
   
index bad61e9609e5dbe08ba0aaf90ce2e2153b2341f4..9a6e547353437b6f3d58496cfcdd7b791404719c 100755 (executable)
--- 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')
index eda6e9ba23205e2169ac99aa338b654f50c5b2bc..f1af656dc09dad4a54b02596f4ed22b93c3984fb 100644 (file)
@@ -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
index 4b7fd7ca8c0ce1fcf85d44cf25c3bc0726f4e3a9..907f7109eac6fc3d7b1178705b8064b8eca9c6d3 100644 (file)
@@ -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 (file)
index 0000000..4b3c7d6
--- /dev/null
@@ -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 (file)
index 0000000..e635aa2
--- /dev/null
@@ -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 (file)
index 0000000..7f42899
--- /dev/null
@@ -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 */
+
index e51f5135329f879fa63b8ed8e39fc96883cb3a10..f5b7f8e68dda8825a3fdba544e88e8a5fb63b4e6 100644 (file)
@@ -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:
     {
index ae212ec32cb32498c157535e79e306ccc236fe9b..ac12b52eeb890be9365cfab023f62153b1cd9efa 100644 (file)
@@ -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 */
index b8397be299d9067b23d7fb430b955c25db9acb2a..cb4789cfa58278b5a51dda2358f0af97fddeddca 100644 (file)
@@ -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)