Revision 388bb21a linux-user/main.c

b/linux-user/main.c
1312 1312
	MIPS_SYS(sys_waitid	, 4)
1313 1313
	MIPS_SYS(sys_ni_syscall	, 0)	/* available, was setaltroot */
1314 1314
	MIPS_SYS(sys_add_key	, 5)
1315
	MIPS_SYS(sys_request_key	, 4)
1315
	MIPS_SYS(sys_request_key, 4)
1316 1316
	MIPS_SYS(sys_keyctl	, 5)
1317 1317
	MIPS_SYS(sys_set_thread_area, 1)
1318
	MIPS_SYS(sys_inotify_init, 0)
1319
	MIPS_SYS(sys_inotify_add_watch, 3) /* 4285 */
1320
	MIPS_SYS(sys_inotify_rm_watch, 2)
1321
	MIPS_SYS(sys_migrate_pages, 4)
1322
	MIPS_SYS(sys_openat, 4)
1323
	MIPS_SYS(sys_mkdirat, 3)
1324
	MIPS_SYS(sys_mknodat, 4)	/* 4290 */
1325
	MIPS_SYS(sys_fchownat, 5)
1326
	MIPS_SYS(sys_futimesat, 3)
1327
	MIPS_SYS(sys_fstatat64, 4)
1328
	MIPS_SYS(sys_unlinkat, 3)
1329
	MIPS_SYS(sys_renameat, 4)	/* 4295 */
1330
	MIPS_SYS(sys_linkat, 5)
1331
	MIPS_SYS(sys_symlinkat, 3)
1332
	MIPS_SYS(sys_readlinkat, 4)
1333
	MIPS_SYS(sys_fchmodat, 3)
1334
	MIPS_SYS(sys_faccessat, 3)	/* 4300 */
1335
	MIPS_SYS(sys_pselect6, 6)
1336
	MIPS_SYS(sys_ppoll, 5)
1337
	MIPS_SYS(sys_unshare, 1)
1338
	MIPS_SYS(sys_splice, 4)
1339
	MIPS_SYS(sys_sync_file_range, 7) /* 4305 */
1340
	MIPS_SYS(sys_tee, 4)
1341
	MIPS_SYS(sys_vmsplice, 4)
1342
	MIPS_SYS(sys_move_pages, 6)
1343
	MIPS_SYS(sys_set_robust_list, 2)
1344
	MIPS_SYS(sys_get_robust_list, 3) /* 4310 */
1345
	MIPS_SYS(sys_kexec_load, 4)
1346
	MIPS_SYS(sys_getcpu, 3)
1347
	MIPS_SYS(sys_epoll_pwait, 6)
1348
	MIPS_SYS(sys_ioprio_set, 3)
1349
	MIPS_SYS(sys_ioprio_get, 2)
1318 1350
};
1319 1351

  
1320 1352
#undef MIPS_SYS
......
1322 1354
void cpu_loop(CPUMIPSState *env)
1323 1355
{
1324 1356
    target_siginfo_t info;
1325
    int trapnr, ret, nb_args;
1357
    int trapnr, ret;
1326 1358
    unsigned int syscall_num;
1327
    target_ulong arg5, arg6, sp_reg;
1328 1359

  
1329 1360
    for(;;) {
1330 1361
        trapnr = cpu_mips_exec(env);
1331 1362
        switch(trapnr) {
1332 1363
        case EXCP_SYSCALL:
1333
            {
1334
                syscall_num = env->gpr[2] - 4000;
1335
                env->PC += 4;
1336
                if (syscall_num >= sizeof(mips_syscall_args)) {
1337
                    ret = -ENOSYS;
1338
                } else {
1339
                    nb_args = mips_syscall_args[syscall_num];
1340
                    if (nb_args >= 5) {
1341
                        sp_reg = env->gpr[29];
1342
                        /* these arguments are taken from the stack */
1343
                        arg5 = tgetl(sp_reg + 16);
1344
                        if (nb_args >= 6) {
1345
                            arg6 = tgetl(sp_reg + 20);
1346
                        } else {
1347
                            arg6 = 0;
1348
                        }
1349
                    } else {
1350
                        arg5 = 0;
1351
                        arg6 = 0;
1352
                    }
1353
                    ret = do_syscall(env, 
1354
                                     env->gpr[2], 
1355
                                     env->gpr[4],
1356
                                     env->gpr[5],
1357
                                     env->gpr[6],
1358
                                     env->gpr[7],
1359
                                     arg5, 
1360
                                     arg6);
1361
                }
1362
                if ((unsigned int)ret >= (unsigned int)(-1133)) {
1363
                    env->gpr[7] = 1; /* error flag */
1364
                    ret = -ret;
1365
                    env->gpr[0] = ret;
1366
                    env->gpr[2] = ret;
1367
                } else {
1368
                    env->gpr[7] = 0; /* error flag */
1369
                    env->gpr[2] = ret;
1364
            syscall_num = env->gpr[2] - 4000;
1365
            env->PC += 4;
1366
            if (syscall_num >= sizeof(mips_syscall_args)) {
1367
                ret = -ENOSYS;
1368
            } else {
1369
                int nb_args;
1370
                target_ulong sp_reg;
1371
                target_ulong arg5 = 0, arg6 = 0, arg7 = 0, arg8 = 0;
1372

  
1373
                nb_args = mips_syscall_args[syscall_num];
1374
                sp_reg = env->gpr[29];
1375
                switch (nb_args) {
1376
                /* these arguments are taken from the stack */
1377
                case 8: arg8 = tgetl(sp_reg + 28);
1378
                case 7: arg7 = tgetl(sp_reg + 24);
1379
                case 6: arg6 = tgetl(sp_reg + 20);
1380
                case 5: arg5 = tgetl(sp_reg + 16);
1381
                default:
1382
                    break;
1370 1383
                }
1384
                ret = do_syscall(env, env->gpr[2],
1385
                                 env->gpr[4], env->gpr[5],
1386
                                 env->gpr[6], env->gpr[7],
1387
                                 arg5, arg6/*, arg7, arg8*/);
1388
            }
1389
            if ((unsigned int)ret >= (unsigned int)(-1133)) {
1390
                env->gpr[7] = 1; /* error flag */
1391
                ret = -ret;
1392
            } else {
1393
                env->gpr[7] = 0; /* error flag */
1371 1394
            }
1395
            env->gpr[2] = ret;
1372 1396
            break;
1373 1397
        case EXCP_TLBL:
1374 1398
        case EXCP_TLBS:

Also available in: Unified diff