Commit ebc054881ff60643abe1995b4bcdc558264470f2
1 parent
a20dd508
added utime syscall - fixed nanosleep exact behaviour
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@393 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
66 additions
and
2 deletions
linux-user/syscall.c
| @@ -41,6 +41,7 @@ | @@ -41,6 +41,7 @@ | ||
| 41 | #include <sys/uio.h> | 41 | #include <sys/uio.h> |
| 42 | #include <sys/poll.h> | 42 | #include <sys/poll.h> |
| 43 | #include <sys/times.h> | 43 | #include <sys/times.h> |
| 44 | +#include <utime.h> | ||
| 44 | //#include <sys/user.h> | 45 | //#include <sys/user.h> |
| 45 | #include <netinet/tcp.h> | 46 | #include <netinet/tcp.h> |
| 46 | 47 | ||
| @@ -1262,6 +1263,8 @@ int do_fork(CPUState *env, unsigned int flags, unsigned long newsp) | @@ -1262,6 +1263,8 @@ int do_fork(CPUState *env, unsigned int flags, unsigned long newsp) | ||
| 1262 | newsp = env->regs[13]; | 1263 | newsp = env->regs[13]; |
| 1263 | new_env->regs[13] = newsp; | 1264 | new_env->regs[13] = newsp; |
| 1264 | new_env->regs[0] = 0; | 1265 | new_env->regs[0] = 0; |
| 1266 | +#elif defined(TARGET_SPARC) | ||
| 1267 | + printf ("HELPME: %s:%d\n", __FILE__, __LINE__); | ||
| 1265 | #else | 1268 | #else |
| 1266 | #error unsupported target CPU | 1269 | #error unsupported target CPU |
| 1267 | #endif | 1270 | #endif |
| @@ -1472,10 +1475,14 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -1472,10 +1475,14 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
| 1472 | case TARGET_NR_lchown: | 1475 | case TARGET_NR_lchown: |
| 1473 | ret = get_errno(chown((const char *)arg1, arg2, arg3)); | 1476 | ret = get_errno(chown((const char *)arg1, arg2, arg3)); |
| 1474 | break; | 1477 | break; |
| 1478 | +#ifdef TARGET_NR_break | ||
| 1475 | case TARGET_NR_break: | 1479 | case TARGET_NR_break: |
| 1476 | goto unimplemented; | 1480 | goto unimplemented; |
| 1481 | +#endif | ||
| 1482 | +#ifdef TARGET_NR_oldstat | ||
| 1477 | case TARGET_NR_oldstat: | 1483 | case TARGET_NR_oldstat: |
| 1478 | goto unimplemented; | 1484 | goto unimplemented; |
| 1485 | +#endif | ||
| 1479 | case TARGET_NR_lseek: | 1486 | case TARGET_NR_lseek: |
| 1480 | ret = get_errno(lseek(arg1, arg2, arg3)); | 1487 | ret = get_errno(lseek(arg1, arg2, arg3)); |
| 1481 | break; | 1488 | break; |
| @@ -1507,25 +1514,40 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -1507,25 +1514,40 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
| 1507 | case TARGET_NR_alarm: | 1514 | case TARGET_NR_alarm: |
| 1508 | ret = alarm(arg1); | 1515 | ret = alarm(arg1); |
| 1509 | break; | 1516 | break; |
| 1517 | +#ifdef TARGET_NR_oldfstat | ||
| 1510 | case TARGET_NR_oldfstat: | 1518 | case TARGET_NR_oldfstat: |
| 1511 | goto unimplemented; | 1519 | goto unimplemented; |
| 1520 | +#endif | ||
| 1512 | case TARGET_NR_pause: | 1521 | case TARGET_NR_pause: |
| 1513 | ret = get_errno(pause()); | 1522 | ret = get_errno(pause()); |
| 1514 | break; | 1523 | break; |
| 1515 | case TARGET_NR_utime: | 1524 | case TARGET_NR_utime: |
| 1516 | - goto unimplemented; | 1525 | + { |
| 1526 | + struct utimbuf tbuf; | ||
| 1527 | + struct target_utimbuf *target_tbuf = (void *)arg2; | ||
| 1528 | + tbuf.actime = tswapl(target_tbuf->actime); | ||
| 1529 | + tbuf.modtime = tswapl(target_tbuf->modtime); | ||
| 1530 | + ret = get_errno(utime((const char *)arg1, &tbuf)); | ||
| 1531 | + } | ||
| 1532 | + break; | ||
| 1533 | +#ifdef TARGET_NR_stty | ||
| 1517 | case TARGET_NR_stty: | 1534 | case TARGET_NR_stty: |
| 1518 | goto unimplemented; | 1535 | goto unimplemented; |
| 1536 | +#endif | ||
| 1537 | +#ifdef TARGET_NR_gtty | ||
| 1519 | case TARGET_NR_gtty: | 1538 | case TARGET_NR_gtty: |
| 1520 | goto unimplemented; | 1539 | goto unimplemented; |
| 1540 | +#endif | ||
| 1521 | case TARGET_NR_access: | 1541 | case TARGET_NR_access: |
| 1522 | ret = get_errno(access((const char *)arg1, arg2)); | 1542 | ret = get_errno(access((const char *)arg1, arg2)); |
| 1523 | break; | 1543 | break; |
| 1524 | case TARGET_NR_nice: | 1544 | case TARGET_NR_nice: |
| 1525 | ret = get_errno(nice(arg1)); | 1545 | ret = get_errno(nice(arg1)); |
| 1526 | break; | 1546 | break; |
| 1547 | +#ifdef TARGET_NR_ftime | ||
| 1527 | case TARGET_NR_ftime: | 1548 | case TARGET_NR_ftime: |
| 1528 | goto unimplemented; | 1549 | goto unimplemented; |
| 1550 | +#endif | ||
| 1529 | case TARGET_NR_sync: | 1551 | case TARGET_NR_sync: |
| 1530 | sync(); | 1552 | sync(); |
| 1531 | ret = 0; | 1553 | ret = 0; |
| @@ -1570,8 +1592,10 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -1570,8 +1592,10 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
| 1570 | ret = host_to_target_clock_t(ret); | 1592 | ret = host_to_target_clock_t(ret); |
| 1571 | } | 1593 | } |
| 1572 | break; | 1594 | break; |
| 1595 | +#ifdef TARGET_NR_prof | ||
| 1573 | case TARGET_NR_prof: | 1596 | case TARGET_NR_prof: |
| 1574 | goto unimplemented; | 1597 | goto unimplemented; |
| 1598 | +#endif | ||
| 1575 | case TARGET_NR_setgid: | 1599 | case TARGET_NR_setgid: |
| 1576 | ret = get_errno(setgid(low2highgid(arg1))); | 1600 | ret = get_errno(setgid(low2highgid(arg1))); |
| 1577 | break; | 1601 | break; |
| @@ -1591,23 +1615,31 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -1591,23 +1615,31 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
| 1591 | case TARGET_NR_umount2: | 1615 | case TARGET_NR_umount2: |
| 1592 | ret = get_errno(umount2((const char *)arg1, arg2)); | 1616 | ret = get_errno(umount2((const char *)arg1, arg2)); |
| 1593 | break; | 1617 | break; |
| 1618 | +#ifdef TARGET_NR_lock | ||
| 1594 | case TARGET_NR_lock: | 1619 | case TARGET_NR_lock: |
| 1595 | goto unimplemented; | 1620 | goto unimplemented; |
| 1621 | +#endif | ||
| 1596 | case TARGET_NR_ioctl: | 1622 | case TARGET_NR_ioctl: |
| 1597 | ret = do_ioctl(arg1, arg2, arg3); | 1623 | ret = do_ioctl(arg1, arg2, arg3); |
| 1598 | break; | 1624 | break; |
| 1599 | case TARGET_NR_fcntl: | 1625 | case TARGET_NR_fcntl: |
| 1600 | ret = get_errno(do_fcntl(arg1, arg2, arg3)); | 1626 | ret = get_errno(do_fcntl(arg1, arg2, arg3)); |
| 1601 | break; | 1627 | break; |
| 1628 | +#ifdef TARGET_NR_mpx | ||
| 1602 | case TARGET_NR_mpx: | 1629 | case TARGET_NR_mpx: |
| 1603 | goto unimplemented; | 1630 | goto unimplemented; |
| 1631 | +#endif | ||
| 1604 | case TARGET_NR_setpgid: | 1632 | case TARGET_NR_setpgid: |
| 1605 | ret = get_errno(setpgid(arg1, arg2)); | 1633 | ret = get_errno(setpgid(arg1, arg2)); |
| 1606 | break; | 1634 | break; |
| 1635 | +#ifdef TARGET_NR_ulimit | ||
| 1607 | case TARGET_NR_ulimit: | 1636 | case TARGET_NR_ulimit: |
| 1608 | goto unimplemented; | 1637 | goto unimplemented; |
| 1638 | +#endif | ||
| 1639 | +#ifdef TARGET_NR_oldolduname | ||
| 1609 | case TARGET_NR_oldolduname: | 1640 | case TARGET_NR_oldolduname: |
| 1610 | goto unimplemented; | 1641 | goto unimplemented; |
| 1642 | +#endif | ||
| 1611 | case TARGET_NR_umask: | 1643 | case TARGET_NR_umask: |
| 1612 | ret = get_errno(umask(arg1)); | 1644 | ret = get_errno(umask(arg1)); |
| 1613 | break; | 1645 | break; |
| @@ -1917,8 +1949,10 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -1917,8 +1949,10 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
| 1917 | case TARGET_NR_symlink: | 1949 | case TARGET_NR_symlink: |
| 1918 | ret = get_errno(symlink((const char *)arg1, (const char *)arg2)); | 1950 | ret = get_errno(symlink((const char *)arg1, (const char *)arg2)); |
| 1919 | break; | 1951 | break; |
| 1952 | +#ifdef TARGET_NR_oldlstat | ||
| 1920 | case TARGET_NR_oldlstat: | 1953 | case TARGET_NR_oldlstat: |
| 1921 | goto unimplemented; | 1954 | goto unimplemented; |
| 1955 | +#endif | ||
| 1922 | case TARGET_NR_readlink: | 1956 | case TARGET_NR_readlink: |
| 1923 | ret = get_errno(readlink(path((const char *)arg1), (char *)arg2, arg3)); | 1957 | ret = get_errno(readlink(path((const char *)arg1), (char *)arg2, arg3)); |
| 1924 | break; | 1958 | break; |
| @@ -2001,8 +2035,10 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -2001,8 +2035,10 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
| 2001 | case TARGET_NR_setpriority: | 2035 | case TARGET_NR_setpriority: |
| 2002 | ret = get_errno(setpriority(arg1, arg2, arg3)); | 2036 | ret = get_errno(setpriority(arg1, arg2, arg3)); |
| 2003 | break; | 2037 | break; |
| 2038 | +#ifdef TARGET_NR_profil | ||
| 2004 | case TARGET_NR_profil: | 2039 | case TARGET_NR_profil: |
| 2005 | goto unimplemented; | 2040 | goto unimplemented; |
| 2041 | +#endif | ||
| 2006 | case TARGET_NR_statfs: | 2042 | case TARGET_NR_statfs: |
| 2007 | stfs = (void *)arg2; | 2043 | stfs = (void *)arg2; |
| 2008 | ret = get_errno(sys_statfs(path((const char *)arg1), stfs)); | 2044 | ret = get_errno(sys_statfs(path((const char *)arg1), stfs)); |
| @@ -2024,8 +2060,10 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -2024,8 +2060,10 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
| 2024 | stfs = (void *)arg2; | 2060 | stfs = (void *)arg2; |
| 2025 | ret = get_errno(sys_fstatfs(arg1, stfs)); | 2061 | ret = get_errno(sys_fstatfs(arg1, stfs)); |
| 2026 | goto convert_statfs; | 2062 | goto convert_statfs; |
| 2063 | +#ifdef TARGET_NR_ioperm | ||
| 2027 | case TARGET_NR_ioperm: | 2064 | case TARGET_NR_ioperm: |
| 2028 | goto unimplemented; | 2065 | goto unimplemented; |
| 2066 | +#endif | ||
| 2029 | case TARGET_NR_socketcall: | 2067 | case TARGET_NR_socketcall: |
| 2030 | ret = do_socketcall(arg1, (int32_t *)arg2); | 2068 | ret = do_socketcall(arg1, (int32_t *)arg2); |
| 2031 | break; | 2069 | break; |
| @@ -2097,15 +2135,21 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -2097,15 +2135,21 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
| 2097 | } | 2135 | } |
| 2098 | } | 2136 | } |
| 2099 | break; | 2137 | break; |
| 2138 | +#ifdef TARGET_NR_olduname | ||
| 2100 | case TARGET_NR_olduname: | 2139 | case TARGET_NR_olduname: |
| 2101 | goto unimplemented; | 2140 | goto unimplemented; |
| 2141 | +#endif | ||
| 2142 | +#ifdef TARGET_NR_iopl | ||
| 2102 | case TARGET_NR_iopl: | 2143 | case TARGET_NR_iopl: |
| 2103 | goto unimplemented; | 2144 | goto unimplemented; |
| 2145 | +#endif | ||
| 2104 | case TARGET_NR_vhangup: | 2146 | case TARGET_NR_vhangup: |
| 2105 | ret = get_errno(vhangup()); | 2147 | ret = get_errno(vhangup()); |
| 2106 | break; | 2148 | break; |
| 2149 | +#ifdef TARGET_NR_idle | ||
| 2107 | case TARGET_NR_idle: | 2150 | case TARGET_NR_idle: |
| 2108 | goto unimplemented; | 2151 | goto unimplemented; |
| 2152 | +#endif | ||
| 2109 | case TARGET_NR_wait4: | 2153 | case TARGET_NR_wait4: |
| 2110 | { | 2154 | { |
| 2111 | int status; | 2155 | int status; |
| @@ -2415,17 +2459,20 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -2415,17 +2459,20 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
| 2415 | req.tv_sec = tswapl(target_req->tv_sec); | 2459 | req.tv_sec = tswapl(target_req->tv_sec); |
| 2416 | req.tv_nsec = tswapl(target_req->tv_nsec); | 2460 | req.tv_nsec = tswapl(target_req->tv_nsec); |
| 2417 | ret = get_errno(nanosleep(&req, &rem)); | 2461 | ret = get_errno(nanosleep(&req, &rem)); |
| 2418 | - if (target_rem) { | 2462 | + if (is_error(ret) && target_rem) { |
| 2419 | target_rem->tv_sec = tswapl(rem.tv_sec); | 2463 | target_rem->tv_sec = tswapl(rem.tv_sec); |
| 2420 | target_rem->tv_nsec = tswapl(rem.tv_nsec); | 2464 | target_rem->tv_nsec = tswapl(rem.tv_nsec); |
| 2421 | } | 2465 | } |
| 2422 | } | 2466 | } |
| 2423 | break; | 2467 | break; |
| 2468 | +#ifdef TARGET_NR_setresuid | ||
| 2424 | case TARGET_NR_setresuid: | 2469 | case TARGET_NR_setresuid: |
| 2425 | ret = get_errno(setresuid(low2highuid(arg1), | 2470 | ret = get_errno(setresuid(low2highuid(arg1), |
| 2426 | low2highuid(arg2), | 2471 | low2highuid(arg2), |
| 2427 | low2highuid(arg3))); | 2472 | low2highuid(arg3))); |
| 2428 | break; | 2473 | break; |
| 2474 | +#endif | ||
| 2475 | +#ifdef TARGET_NR_getresuid | ||
| 2429 | case TARGET_NR_getresuid: | 2476 | case TARGET_NR_getresuid: |
| 2430 | { | 2477 | { |
| 2431 | int ruid, euid, suid; | 2478 | int ruid, euid, suid; |
| @@ -2437,11 +2484,15 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -2437,11 +2484,15 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
| 2437 | } | 2484 | } |
| 2438 | } | 2485 | } |
| 2439 | break; | 2486 | break; |
| 2487 | +#endif | ||
| 2488 | +#ifdef TARGET_NR_getresgid | ||
| 2440 | case TARGET_NR_setresgid: | 2489 | case TARGET_NR_setresgid: |
| 2441 | ret = get_errno(setresgid(low2highgid(arg1), | 2490 | ret = get_errno(setresgid(low2highgid(arg1), |
| 2442 | low2highgid(arg2), | 2491 | low2highgid(arg2), |
| 2443 | low2highgid(arg3))); | 2492 | low2highgid(arg3))); |
| 2444 | break; | 2493 | break; |
| 2494 | +#endif | ||
| 2495 | +#ifdef TARGET_NR_getresgid | ||
| 2445 | case TARGET_NR_getresgid: | 2496 | case TARGET_NR_getresgid: |
| 2446 | { | 2497 | { |
| 2447 | int rgid, egid, sgid; | 2498 | int rgid, egid, sgid; |
| @@ -2453,6 +2504,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -2453,6 +2504,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
| 2453 | } | 2504 | } |
| 2454 | } | 2505 | } |
| 2455 | break; | 2506 | break; |
| 2507 | +#endif | ||
| 2456 | case TARGET_NR_query_module: | 2508 | case TARGET_NR_query_module: |
| 2457 | goto unimplemented; | 2509 | goto unimplemented; |
| 2458 | case TARGET_NR_nfsservctl: | 2510 | case TARGET_NR_nfsservctl: |
| @@ -2480,13 +2532,18 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -2480,13 +2532,18 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
| 2480 | goto unimplemented; | 2532 | goto unimplemented; |
| 2481 | case TARGET_NR_sendfile: | 2533 | case TARGET_NR_sendfile: |
| 2482 | goto unimplemented; | 2534 | goto unimplemented; |
| 2535 | +#ifdef TARGET_NR_getpmsg | ||
| 2483 | case TARGET_NR_getpmsg: | 2536 | case TARGET_NR_getpmsg: |
| 2484 | goto unimplemented; | 2537 | goto unimplemented; |
| 2538 | +#endif | ||
| 2539 | +#ifdef TARGET_NR_putpmsg | ||
| 2485 | case TARGET_NR_putpmsg: | 2540 | case TARGET_NR_putpmsg: |
| 2486 | goto unimplemented; | 2541 | goto unimplemented; |
| 2542 | +#endif | ||
| 2487 | case TARGET_NR_vfork: | 2543 | case TARGET_NR_vfork: |
| 2488 | ret = get_errno(do_fork(cpu_env, CLONE_VFORK | CLONE_VM | SIGCHLD, 0)); | 2544 | ret = get_errno(do_fork(cpu_env, CLONE_VFORK | CLONE_VM | SIGCHLD, 0)); |
| 2489 | break; | 2545 | break; |
| 2546 | +#ifdef TARGET_NR_ugetrlimit | ||
| 2490 | case TARGET_NR_ugetrlimit: | 2547 | case TARGET_NR_ugetrlimit: |
| 2491 | { | 2548 | { |
| 2492 | struct rlimit rlim; | 2549 | struct rlimit rlim; |
| @@ -2498,6 +2555,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -2498,6 +2555,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
| 2498 | } | 2555 | } |
| 2499 | break; | 2556 | break; |
| 2500 | } | 2557 | } |
| 2558 | +#endif | ||
| 2501 | case TARGET_NR_truncate64: | 2559 | case TARGET_NR_truncate64: |
| 2502 | goto unimplemented; | 2560 | goto unimplemented; |
| 2503 | case TARGET_NR_ftruncate64: | 2561 | case TARGET_NR_ftruncate64: |
| @@ -2647,13 +2705,16 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -2647,13 +2705,16 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
| 2647 | break; | 2705 | break; |
| 2648 | } | 2706 | } |
| 2649 | #endif | 2707 | #endif |
| 2708 | +#ifdef TARGET_NR_security | ||
| 2650 | case TARGET_NR_security: | 2709 | case TARGET_NR_security: |
| 2651 | goto unimplemented; | 2710 | goto unimplemented; |
| 2711 | +#endif | ||
| 2652 | case TARGET_NR_gettid: | 2712 | case TARGET_NR_gettid: |
| 2653 | ret = get_errno(gettid()); | 2713 | ret = get_errno(gettid()); |
| 2654 | break; | 2714 | break; |
| 2655 | case TARGET_NR_readahead: | 2715 | case TARGET_NR_readahead: |
| 2656 | goto unimplemented; | 2716 | goto unimplemented; |
| 2717 | +#ifdef TARGET_NR_setxattr | ||
| 2657 | case TARGET_NR_setxattr: | 2718 | case TARGET_NR_setxattr: |
| 2658 | case TARGET_NR_lsetxattr: | 2719 | case TARGET_NR_lsetxattr: |
| 2659 | case TARGET_NR_fsetxattr: | 2720 | case TARGET_NR_fsetxattr: |
| @@ -2667,9 +2728,12 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -2667,9 +2728,12 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
| 2667 | case TARGET_NR_lremovexattr: | 2728 | case TARGET_NR_lremovexattr: |
| 2668 | case TARGET_NR_fremovexattr: | 2729 | case TARGET_NR_fremovexattr: |
| 2669 | goto unimplemented_nowarn; | 2730 | goto unimplemented_nowarn; |
| 2731 | +#endif | ||
| 2732 | +#ifdef TARGET_NR_set_thread_area | ||
| 2670 | case TARGET_NR_set_thread_area: | 2733 | case TARGET_NR_set_thread_area: |
| 2671 | case TARGET_NR_get_thread_area: | 2734 | case TARGET_NR_get_thread_area: |
| 2672 | goto unimplemented_nowarn; | 2735 | goto unimplemented_nowarn; |
| 2736 | +#endif | ||
| 2673 | default: | 2737 | default: |
| 2674 | unimplemented: | 2738 | unimplemented: |
| 2675 | gemu_log("qemu: Unsupported syscall: %d\n", num); | 2739 | gemu_log("qemu: Unsupported syscall: %d\n", num); |