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