/[qemu]/qemu/linux-user/main.c
ViewVC logotype

Diff of /qemu/linux-user/main.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.74 by bellard, Sat Nov 26 11:41:16 2005 UTC revision 1.75 by bellard, Sat Nov 26 18:47:20 2005 UTC
# Line 977  void cpu_loop(CPUPPCState *env) Line 977  void cpu_loop(CPUPPCState *env)
977  }  }
978  #endif  #endif
979    
980    #ifdef TARGET_MIPS
981    
982    #define MIPS_SYS(name, args) args,
983    
984    static const uint8_t mips_syscall_args[] = {
985            MIPS_SYS(sys_syscall    , 0)    /* 4000 */
986            MIPS_SYS(sys_exit       , 1)
987            MIPS_SYS(sys_fork       , 0)
988            MIPS_SYS(sys_read       , 3)
989            MIPS_SYS(sys_write      , 3)
990            MIPS_SYS(sys_open       , 3)    /* 4005 */
991            MIPS_SYS(sys_close      , 1)
992            MIPS_SYS(sys_waitpid    , 3)
993            MIPS_SYS(sys_creat      , 2)
994            MIPS_SYS(sys_link       , 2)
995            MIPS_SYS(sys_unlink     , 1)    /* 4010 */
996            MIPS_SYS(sys_execve     , 0)
997            MIPS_SYS(sys_chdir      , 1)
998            MIPS_SYS(sys_time       , 1)
999            MIPS_SYS(sys_mknod      , 3)
1000            MIPS_SYS(sys_chmod      , 2)    /* 4015 */
1001            MIPS_SYS(sys_lchown     , 3)
1002            MIPS_SYS(sys_ni_syscall , 0)
1003            MIPS_SYS(sys_ni_syscall , 0)    /* was sys_stat */
1004            MIPS_SYS(sys_lseek      , 3)
1005            MIPS_SYS(sys_getpid     , 0)    /* 4020 */
1006            MIPS_SYS(sys_mount      , 5)
1007            MIPS_SYS(sys_oldumount  , 1)
1008            MIPS_SYS(sys_setuid     , 1)
1009            MIPS_SYS(sys_getuid     , 0)
1010            MIPS_SYS(sys_stime      , 1)    /* 4025 */
1011            MIPS_SYS(sys_ptrace     , 4)
1012            MIPS_SYS(sys_alarm      , 1)
1013            MIPS_SYS(sys_ni_syscall , 0)    /* was sys_fstat */
1014            MIPS_SYS(sys_pause      , 0)
1015            MIPS_SYS(sys_utime      , 2)    /* 4030 */
1016            MIPS_SYS(sys_ni_syscall , 0)
1017            MIPS_SYS(sys_ni_syscall , 0)
1018            MIPS_SYS(sys_access     , 2)
1019            MIPS_SYS(sys_nice       , 1)
1020            MIPS_SYS(sys_ni_syscall , 0)    /* 4035 */
1021            MIPS_SYS(sys_sync       , 0)
1022            MIPS_SYS(sys_kill       , 2)
1023            MIPS_SYS(sys_rename     , 2)
1024            MIPS_SYS(sys_mkdir      , 2)
1025            MIPS_SYS(sys_rmdir      , 1)    /* 4040 */
1026            MIPS_SYS(sys_dup                , 1)
1027            MIPS_SYS(sys_pipe       , 0)
1028            MIPS_SYS(sys_times      , 1)
1029            MIPS_SYS(sys_ni_syscall , 0)
1030            MIPS_SYS(sys_brk                , 1)    /* 4045 */
1031            MIPS_SYS(sys_setgid     , 1)
1032            MIPS_SYS(sys_getgid     , 0)
1033            MIPS_SYS(sys_ni_syscall , 0)    /* was signal(2) */
1034            MIPS_SYS(sys_geteuid    , 0)
1035            MIPS_SYS(sys_getegid    , 0)    /* 4050 */
1036            MIPS_SYS(sys_acct       , 0)
1037            MIPS_SYS(sys_umount     , 2)
1038            MIPS_SYS(sys_ni_syscall , 0)
1039            MIPS_SYS(sys_ioctl      , 3)
1040            MIPS_SYS(sys_fcntl      , 3)    /* 4055 */
1041            MIPS_SYS(sys_ni_syscall , 2)
1042            MIPS_SYS(sys_setpgid    , 2)
1043            MIPS_SYS(sys_ni_syscall , 0)
1044            MIPS_SYS(sys_olduname   , 1)
1045            MIPS_SYS(sys_umask      , 1)    /* 4060 */
1046            MIPS_SYS(sys_chroot     , 1)
1047            MIPS_SYS(sys_ustat      , 2)
1048            MIPS_SYS(sys_dup2       , 2)
1049            MIPS_SYS(sys_getppid    , 0)
1050            MIPS_SYS(sys_getpgrp    , 0)    /* 4065 */
1051            MIPS_SYS(sys_setsid     , 0)
1052            MIPS_SYS(sys_sigaction  , 3)
1053            MIPS_SYS(sys_sgetmask   , 0)
1054            MIPS_SYS(sys_ssetmask   , 1)
1055            MIPS_SYS(sys_setreuid   , 2)    /* 4070 */
1056            MIPS_SYS(sys_setregid   , 2)
1057            MIPS_SYS(sys_sigsuspend , 0)
1058            MIPS_SYS(sys_sigpending , 1)
1059            MIPS_SYS(sys_sethostname        , 2)
1060            MIPS_SYS(sys_setrlimit  , 2)    /* 4075 */
1061            MIPS_SYS(sys_getrlimit  , 2)
1062            MIPS_SYS(sys_getrusage  , 2)
1063            MIPS_SYS(sys_gettimeofday, 2)
1064            MIPS_SYS(sys_settimeofday, 2)
1065            MIPS_SYS(sys_getgroups  , 2)    /* 4080 */
1066            MIPS_SYS(sys_setgroups  , 2)
1067            MIPS_SYS(sys_ni_syscall , 0)    /* old_select */
1068            MIPS_SYS(sys_symlink    , 2)
1069            MIPS_SYS(sys_ni_syscall , 0)    /* was sys_lstat */
1070            MIPS_SYS(sys_readlink   , 3)    /* 4085 */
1071            MIPS_SYS(sys_uselib     , 1)
1072            MIPS_SYS(sys_swapon     , 2)
1073            MIPS_SYS(sys_reboot     , 3)
1074            MIPS_SYS(old_readdir    , 3)
1075            MIPS_SYS(old_mmap       , 6)    /* 4090 */
1076            MIPS_SYS(sys_munmap     , 2)
1077            MIPS_SYS(sys_truncate   , 2)
1078            MIPS_SYS(sys_ftruncate  , 2)
1079            MIPS_SYS(sys_fchmod     , 2)
1080            MIPS_SYS(sys_fchown     , 3)    /* 4095 */
1081            MIPS_SYS(sys_getpriority        , 2)
1082            MIPS_SYS(sys_setpriority        , 3)
1083            MIPS_SYS(sys_ni_syscall , 0)
1084            MIPS_SYS(sys_statfs     , 2)
1085            MIPS_SYS(sys_fstatfs    , 2)    /* 4100 */
1086            MIPS_SYS(sys_ni_syscall , 0)    /* was ioperm(2) */
1087            MIPS_SYS(sys_socketcall , 2)
1088            MIPS_SYS(sys_syslog     , 3)
1089            MIPS_SYS(sys_setitimer  , 3)
1090            MIPS_SYS(sys_getitimer  , 2)    /* 4105 */
1091            MIPS_SYS(sys_newstat    , 2)
1092            MIPS_SYS(sys_newlstat   , 2)
1093            MIPS_SYS(sys_newfstat   , 2)
1094            MIPS_SYS(sys_uname      , 1)
1095            MIPS_SYS(sys_ni_syscall , 0)    /* 4110 was iopl(2) */
1096            MIPS_SYS(sys_vhangup    , 0)
1097            MIPS_SYS(sys_ni_syscall , 0)    /* was sys_idle() */
1098            MIPS_SYS(sys_ni_syscall , 0)    /* was sys_vm86 */
1099            MIPS_SYS(sys_wait4      , 4)
1100            MIPS_SYS(sys_swapoff    , 1)    /* 4115 */
1101            MIPS_SYS(sys_sysinfo    , 1)
1102            MIPS_SYS(sys_ipc                , 6)
1103            MIPS_SYS(sys_fsync      , 1)
1104            MIPS_SYS(sys_sigreturn  , 0)
1105            MIPS_SYS(sys_clone      , 0)    /* 4120 */
1106            MIPS_SYS(sys_setdomainname, 2)
1107            MIPS_SYS(sys_newuname   , 1)
1108            MIPS_SYS(sys_ni_syscall , 0)    /* sys_modify_ldt */
1109            MIPS_SYS(sys_adjtimex   , 1)
1110            MIPS_SYS(sys_mprotect   , 3)    /* 4125 */
1111            MIPS_SYS(sys_sigprocmask        , 3)
1112            MIPS_SYS(sys_ni_syscall , 0)    /* was create_module */
1113            MIPS_SYS(sys_init_module        , 5)
1114            MIPS_SYS(sys_delete_module, 1)
1115            MIPS_SYS(sys_ni_syscall , 0)    /* 4130 was get_kernel_syms */
1116            MIPS_SYS(sys_quotactl   , 0)
1117            MIPS_SYS(sys_getpgid    , 1)
1118            MIPS_SYS(sys_fchdir     , 1)
1119            MIPS_SYS(sys_bdflush    , 2)
1120            MIPS_SYS(sys_sysfs      , 3)    /* 4135 */
1121            MIPS_SYS(sys_personality        , 1)
1122            MIPS_SYS(sys_ni_syscall , 0)    /* for afs_syscall */
1123            MIPS_SYS(sys_setfsuid   , 1)
1124            MIPS_SYS(sys_setfsgid   , 1)
1125            MIPS_SYS(sys_llseek     , 5)    /* 4140 */
1126            MIPS_SYS(sys_getdents   , 3)
1127            MIPS_SYS(sys_select     , 5)
1128            MIPS_SYS(sys_flock      , 2)
1129            MIPS_SYS(sys_msync      , 3)
1130            MIPS_SYS(sys_readv      , 3)    /* 4145 */
1131            MIPS_SYS(sys_writev     , 3)
1132            MIPS_SYS(sys_cacheflush , 3)
1133            MIPS_SYS(sys_cachectl   , 3)
1134            MIPS_SYS(sys_sysmips    , 4)
1135            MIPS_SYS(sys_ni_syscall , 0)    /* 4150 */
1136            MIPS_SYS(sys_getsid     , 1)
1137            MIPS_SYS(sys_fdatasync  , 0)
1138            MIPS_SYS(sys_sysctl     , 1)
1139            MIPS_SYS(sys_mlock      , 2)
1140            MIPS_SYS(sys_munlock    , 2)    /* 4155 */
1141            MIPS_SYS(sys_mlockall   , 1)
1142            MIPS_SYS(sys_munlockall , 0)
1143            MIPS_SYS(sys_sched_setparam, 2)
1144            MIPS_SYS(sys_sched_getparam, 2)
1145            MIPS_SYS(sys_sched_setscheduler, 3)     /* 4160 */
1146            MIPS_SYS(sys_sched_getscheduler, 1)
1147            MIPS_SYS(sys_sched_yield        , 0)
1148            MIPS_SYS(sys_sched_get_priority_max, 1)
1149            MIPS_SYS(sys_sched_get_priority_min, 1)
1150            MIPS_SYS(sys_sched_rr_get_interval, 2)  /* 4165 */
1151            MIPS_SYS(sys_nanosleep, 2)
1152            MIPS_SYS(sys_mremap     , 4)
1153            MIPS_SYS(sys_accept     , 3)
1154            MIPS_SYS(sys_bind       , 3)
1155            MIPS_SYS(sys_connect    , 3)    /* 4170 */
1156            MIPS_SYS(sys_getpeername        , 3)
1157            MIPS_SYS(sys_getsockname        , 3)
1158            MIPS_SYS(sys_getsockopt , 5)
1159            MIPS_SYS(sys_listen     , 2)
1160            MIPS_SYS(sys_recv       , 4)    /* 4175 */
1161            MIPS_SYS(sys_recvfrom   , 6)
1162            MIPS_SYS(sys_recvmsg    , 3)
1163            MIPS_SYS(sys_send       , 4)
1164            MIPS_SYS(sys_sendmsg    , 3)
1165            MIPS_SYS(sys_sendto     , 6)    /* 4180 */
1166            MIPS_SYS(sys_setsockopt , 5)
1167            MIPS_SYS(sys_shutdown   , 2)
1168            MIPS_SYS(sys_socket     , 3)
1169            MIPS_SYS(sys_socketpair , 4)
1170            MIPS_SYS(sys_setresuid  , 3)    /* 4185 */
1171            MIPS_SYS(sys_getresuid  , 3)
1172            MIPS_SYS(sys_ni_syscall , 0)    /* was sys_query_module */
1173            MIPS_SYS(sys_poll       , 3)
1174            MIPS_SYS(sys_nfsservctl , 3)
1175            MIPS_SYS(sys_setresgid  , 3)    /* 4190 */
1176            MIPS_SYS(sys_getresgid  , 3)
1177            MIPS_SYS(sys_prctl      , 5)
1178            MIPS_SYS(sys_rt_sigreturn, 0)
1179            MIPS_SYS(sys_rt_sigaction, 4)
1180            MIPS_SYS(sys_rt_sigprocmask, 4) /* 4195 */
1181            MIPS_SYS(sys_rt_sigpending, 2)
1182            MIPS_SYS(sys_rt_sigtimedwait, 4)
1183            MIPS_SYS(sys_rt_sigqueueinfo, 3)
1184            MIPS_SYS(sys_rt_sigsuspend, 0)
1185            MIPS_SYS(sys_pread64    , 6)    /* 4200 */
1186            MIPS_SYS(sys_pwrite64   , 6)
1187            MIPS_SYS(sys_chown      , 3)
1188            MIPS_SYS(sys_getcwd     , 2)
1189            MIPS_SYS(sys_capget     , 2)
1190            MIPS_SYS(sys_capset     , 2)    /* 4205 */
1191            MIPS_SYS(sys_sigaltstack        , 0)
1192            MIPS_SYS(sys_sendfile   , 4)
1193            MIPS_SYS(sys_ni_syscall , 0)
1194            MIPS_SYS(sys_ni_syscall , 0)
1195            MIPS_SYS(sys_mmap2      , 6)    /* 4210 */
1196            MIPS_SYS(sys_truncate64 , 4)
1197            MIPS_SYS(sys_ftruncate64        , 4)
1198            MIPS_SYS(sys_stat64     , 2)
1199            MIPS_SYS(sys_lstat64    , 2)
1200            MIPS_SYS(sys_fstat64    , 2)    /* 4215 */
1201            MIPS_SYS(sys_pivot_root , 2)
1202            MIPS_SYS(sys_mincore    , 3)
1203            MIPS_SYS(sys_madvise    , 3)
1204            MIPS_SYS(sys_getdents64 , 3)
1205            MIPS_SYS(sys_fcntl64    , 3)    /* 4220 */
1206            MIPS_SYS(sys_ni_syscall , 0)
1207            MIPS_SYS(sys_gettid     , 0)
1208            MIPS_SYS(sys_readahead  , 5)
1209            MIPS_SYS(sys_setxattr   , 5)
1210            MIPS_SYS(sys_lsetxattr  , 5)    /* 4225 */
1211            MIPS_SYS(sys_fsetxattr  , 5)
1212            MIPS_SYS(sys_getxattr   , 4)
1213            MIPS_SYS(sys_lgetxattr  , 4)
1214            MIPS_SYS(sys_fgetxattr  , 4)
1215            MIPS_SYS(sys_listxattr  , 3)    /* 4230 */
1216            MIPS_SYS(sys_llistxattr , 3)
1217            MIPS_SYS(sys_flistxattr , 3)
1218            MIPS_SYS(sys_removexattr        , 2)
1219            MIPS_SYS(sys_lremovexattr, 2)
1220            MIPS_SYS(sys_fremovexattr, 2)   /* 4235 */
1221            MIPS_SYS(sys_tkill      , 2)
1222            MIPS_SYS(sys_sendfile64 , 5)
1223            MIPS_SYS(sys_futex      , 2)
1224            MIPS_SYS(sys_sched_setaffinity, 3)
1225            MIPS_SYS(sys_sched_getaffinity, 3)      /* 4240 */
1226            MIPS_SYS(sys_io_setup   , 2)
1227            MIPS_SYS(sys_io_destroy , 1)
1228            MIPS_SYS(sys_io_getevents, 5)
1229            MIPS_SYS(sys_io_submit  , 3)
1230            MIPS_SYS(sys_io_cancel  , 3)    /* 4245 */
1231            MIPS_SYS(sys_exit_group , 1)
1232            MIPS_SYS(sys_lookup_dcookie, 3)
1233            MIPS_SYS(sys_epoll_create, 1)
1234            MIPS_SYS(sys_epoll_ctl  , 4)
1235            MIPS_SYS(sys_epoll_wait , 3)    /* 4250 */
1236            MIPS_SYS(sys_remap_file_pages, 5)
1237            MIPS_SYS(sys_set_tid_address, 1)
1238            MIPS_SYS(sys_restart_syscall, 0)
1239            MIPS_SYS(sys_fadvise64_64, 7)
1240            MIPS_SYS(sys_statfs64   , 3)    /* 4255 */
1241            MIPS_SYS(sys_fstatfs64  , 2)
1242            MIPS_SYS(sys_timer_create, 3)
1243            MIPS_SYS(sys_timer_settime, 4)
1244            MIPS_SYS(sys_timer_gettime, 2)
1245            MIPS_SYS(sys_timer_getoverrun, 1)       /* 4260 */
1246            MIPS_SYS(sys_timer_delete, 1)
1247            MIPS_SYS(sys_clock_settime, 2)
1248            MIPS_SYS(sys_clock_gettime, 2)
1249            MIPS_SYS(sys_clock_getres, 2)
1250            MIPS_SYS(sys_clock_nanosleep, 4)        /* 4265 */
1251            MIPS_SYS(sys_tgkill     , 3)
1252            MIPS_SYS(sys_utimes     , 2)
1253            MIPS_SYS(sys_mbind      , 4)
1254            MIPS_SYS(sys_ni_syscall , 0)    /* sys_get_mempolicy */
1255            MIPS_SYS(sys_ni_syscall , 0)    /* 4270 sys_set_mempolicy */
1256            MIPS_SYS(sys_mq_open    , 4)
1257            MIPS_SYS(sys_mq_unlink  , 1)
1258            MIPS_SYS(sys_mq_timedsend, 5)
1259            MIPS_SYS(sys_mq_timedreceive, 5)
1260            MIPS_SYS(sys_mq_notify  , 2)    /* 4275 */
1261            MIPS_SYS(sys_mq_getsetattr, 3)
1262            MIPS_SYS(sys_ni_syscall , 0)    /* sys_vserver */
1263            MIPS_SYS(sys_waitid     , 4)
1264            MIPS_SYS(sys_ni_syscall , 0)    /* available, was setaltroot */
1265            MIPS_SYS(sys_add_key    , 5)
1266            MIPS_SYS(sys_request_key        , 4)
1267            MIPS_SYS(sys_keyctl     , 5)
1268    };
1269    
1270    #undef MIPS_SYS
1271    
1272    void cpu_loop(CPUMIPSState *env)
1273    {
1274        target_siginfo_t info;
1275        int trapnr, ret, nb_args;
1276        unsigned int syscall_num;
1277        target_ulong arg5, arg6, sp_reg;
1278    
1279        for(;;) {
1280            trapnr = cpu_mips_exec(env);
1281            switch(trapnr) {
1282            case EXCP_SYSCALL:
1283                {
1284                    syscall_num = env->gpr[2] - 4000;
1285                    if (syscall_num >= sizeof(mips_syscall_args)) {
1286                        ret = -ENOSYS;
1287                    } else {
1288                        nb_args = mips_syscall_args[syscall_num];
1289                        if (nb_args >= 5) {
1290                            sp_reg = env->gpr[29];
1291                            /* these arguments are taken from the stack */
1292                            if (get_user(arg5, (target_ulong *)(sp_reg + 16))) {
1293                                ret = -EFAULT;
1294                                goto fail;
1295                            }
1296                            if (nb_args >= 6) {
1297                                if (get_user(arg6, (target_ulong *)(sp_reg + 20))) {
1298                                    ret = -EFAULT;
1299                                    goto fail;
1300                                }
1301                            } else {
1302                                arg6 = 0;
1303                            }
1304                        } else {
1305                            arg5 = 0;
1306                            arg6 = 0;
1307                        }
1308                        ret = do_syscall(env,
1309                                         env->gpr[2],
1310                                         env->gpr[4],
1311                                         env->gpr[5],
1312                                         env->gpr[6],
1313                                         env->gpr[7],
1314                                         arg5,
1315                                         arg6);
1316                    }
1317                    fail:
1318                    env->PC += 4;
1319                    if ((unsigned int)ret >= (unsigned int)(-1133)) {
1320                        env->gpr[7] = 1; /* error flag */
1321                        ret = -ret;
1322                        env->gpr[0] = ret;
1323                        env->gpr[2] = ret;
1324                    } else {
1325                        env->gpr[7] = 0; /* error flag */
1326                        env->gpr[2] = ret;
1327                    }
1328                }
1329                break;
1330            case EXCP_RI:
1331                {
1332                    uint32_t insn, op;
1333    
1334                    if (get_user(insn, (uint32_t *)env->PC) < 0)
1335                        goto sigill;
1336                    op = insn >> 26;
1337                    //                printf("insn=%08x op=%02x\n", insn, op);
1338                    /* XXX: totally dummy FP ops just to be able to launch
1339                       a few executables */
1340                    switch(op) {
1341                    case 0x31: /* LWC1 */
1342                        env->PC += 4;
1343                        break;
1344                    case 0x39: /* SWC1 */
1345                        env->PC += 4;
1346                        break;
1347                    case 0x11:
1348                        switch((insn >> 21) & 0x1f) {
1349                        case 0x02: /* CFC1 */
1350                            env->PC += 4;
1351                            break;
1352                        default:
1353                            goto sigill;
1354                        }
1355                        break;
1356                    default:
1357                    sigill:
1358                        info.si_signo = TARGET_SIGILL;
1359                        info.si_errno = 0;
1360                        info.si_code = 0;
1361                        queue_signal(info.si_signo, &info);
1362                        break;
1363                    }
1364                }
1365                break;
1366            default:
1367                //        error:
1368                fprintf(stderr, "qemu: unhandled CPU exception 0x%x - aborting\n",
1369                        trapnr);
1370                cpu_dump_state(env, stderr, fprintf, 0);
1371                abort();
1372            }
1373            process_pending_signals(env);
1374        }
1375    }
1376    #endif
1377    
1378  void usage(void)  void usage(void)
1379  {  {
1380      printf("qemu-" TARGET_ARCH " version " QEMU_VERSION ", Copyright (c) 2003-2005 Fabrice Bellard\n"      printf("qemu-" TARGET_ARCH " version " QEMU_VERSION ", Copyright (c) 2003-2005 Fabrice Bellard\n"
# Line 1245  int main(int argc, char **argv) Line 1643  int main(int argc, char **argv)
1643              env->gpr[i] = regs->gpr[i];              env->gpr[i] = regs->gpr[i];
1644          }          }
1645      }      }
1646    #elif defined(TARGET_MIPS)
1647        {
1648            int i;
1649    
1650            for(i = 0; i < 32; i++) {
1651                env->gpr[i] = regs->regs[i];
1652            }
1653            env->PC = regs->cp0_epc;
1654        }
1655  #else  #else
1656  #error unsupported target CPU  #error unsupported target CPU
1657  #endif  #endif

Legend:
Removed from v.1.74  
changed lines
  Added in v.1.75

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26