diff options
author | bellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162> | 2003-09-30 21:08:41 +0000 |
---|---|---|
committer | bellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162> | 2003-09-30 21:08:41 +0000 |
commit | ebc054881ff60643abe1995b4bcdc558264470f2 (patch) | |
tree | 58d901def62e50fe4e2ee9cd2dfaa5316cc7a87f | |
parent | a20dd508aa3895b2e5f4d4f255a4d6306b5e2631 (diff) | |
download | qemu-ebc054881ff60643abe1995b4bcdc558264470f2.tar.gz qemu-ebc054881ff60643abe1995b4bcdc558264470f2.tar.bz2 qemu-ebc054881ff60643abe1995b4bcdc558264470f2.zip |
added utime syscall - fixed nanosleep exact behaviour
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@393 c046a42c-6fe2-441c-8c8c-71466251a162
-rw-r--r-- | linux-user/syscall.c | 68 |
1 files changed, 66 insertions, 2 deletions
diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 753a47cd2d..d218009ad6 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -41,6 +41,7 @@ #include <sys/uio.h> #include <sys/poll.h> #include <sys/times.h> +#include <utime.h> //#include <sys/user.h> #include <netinet/tcp.h> @@ -1262,6 +1263,8 @@ int do_fork(CPUState *env, unsigned int flags, unsigned long newsp) newsp = env->regs[13]; new_env->regs[13] = newsp; new_env->regs[0] = 0; +#elif defined(TARGET_SPARC) + printf ("HELPME: %s:%d\n", __FILE__, __LINE__); #else #error unsupported target CPU #endif @@ -1472,10 +1475,14 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, case TARGET_NR_lchown: ret = get_errno(chown((const char *)arg1, arg2, arg3)); break; +#ifdef TARGET_NR_break case TARGET_NR_break: goto unimplemented; +#endif +#ifdef TARGET_NR_oldstat case TARGET_NR_oldstat: goto unimplemented; +#endif case TARGET_NR_lseek: ret = get_errno(lseek(arg1, arg2, arg3)); break; @@ -1507,25 +1514,40 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, case TARGET_NR_alarm: ret = alarm(arg1); break; +#ifdef TARGET_NR_oldfstat case TARGET_NR_oldfstat: goto unimplemented; +#endif case TARGET_NR_pause: ret = get_errno(pause()); break; case TARGET_NR_utime: - goto unimplemented; + { + struct utimbuf tbuf; + struct target_utimbuf *target_tbuf = (void *)arg2; + tbuf.actime = tswapl(target_tbuf->actime); + tbuf.modtime = tswapl(target_tbuf->modtime); + ret = get_errno(utime((const char *)arg1, &tbuf)); + } + break; +#ifdef TARGET_NR_stty case TARGET_NR_stty: goto unimplemented; +#endif +#ifdef TARGET_NR_gtty case TARGET_NR_gtty: goto unimplemented; +#endif case TARGET_NR_access: ret = get_errno(access((const char *)arg1, arg2)); break; case TARGET_NR_nice: ret = get_errno(nice(arg1)); break; +#ifdef TARGET_NR_ftime case TARGET_NR_ftime: goto unimplemented; +#endif case TARGET_NR_sync: sync(); ret = 0; @@ -1570,8 +1592,10 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, ret = host_to_target_clock_t(ret); } break; +#ifdef TARGET_NR_prof case TARGET_NR_prof: goto unimplemented; +#endif case TARGET_NR_setgid: ret = get_errno(setgid(low2highgid(arg1))); break; @@ -1591,23 +1615,31 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, case TARGET_NR_umount2: ret = get_errno(umount2((const char *)arg1, arg2)); break; +#ifdef TARGET_NR_lock case TARGET_NR_lock: goto unimplemented; +#endif case TARGET_NR_ioctl: ret = do_ioctl(arg1, arg2, arg3); break; case TARGET_NR_fcntl: ret = get_errno(do_fcntl(arg1, arg2, arg3)); break; +#ifdef TARGET_NR_mpx case TARGET_NR_mpx: goto unimplemented; +#endif case TARGET_NR_setpgid: ret = get_errno(setpgid(arg1, arg2)); break; +#ifdef TARGET_NR_ulimit case TARGET_NR_ulimit: goto unimplemented; +#endif +#ifdef TARGET_NR_oldolduname case TARGET_NR_oldolduname: goto unimplemented; +#endif case TARGET_NR_umask: ret = get_errno(umask(arg1)); break; @@ -1917,8 +1949,10 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, case TARGET_NR_symlink: ret = get_errno(symlink((const char *)arg1, (const char *)arg2)); break; +#ifdef TARGET_NR_oldlstat case TARGET_NR_oldlstat: goto unimplemented; +#endif case TARGET_NR_readlink: ret = get_errno(readlink(path((const char *)arg1), (char *)arg2, arg3)); break; @@ -2001,8 +2035,10 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, case TARGET_NR_setpriority: ret = get_errno(setpriority(arg1, arg2, arg3)); break; +#ifdef TARGET_NR_profil case TARGET_NR_profil: goto unimplemented; +#endif case TARGET_NR_statfs: stfs = (void *)arg2; 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, stfs = (void *)arg2; ret = get_errno(sys_fstatfs(arg1, stfs)); goto convert_statfs; +#ifdef TARGET_NR_ioperm case TARGET_NR_ioperm: goto unimplemented; +#endif case TARGET_NR_socketcall: ret = do_socketcall(arg1, (int32_t *)arg2); break; @@ -2097,15 +2135,21 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, } } break; +#ifdef TARGET_NR_olduname case TARGET_NR_olduname: goto unimplemented; +#endif +#ifdef TARGET_NR_iopl case TARGET_NR_iopl: goto unimplemented; +#endif case TARGET_NR_vhangup: ret = get_errno(vhangup()); break; +#ifdef TARGET_NR_idle case TARGET_NR_idle: goto unimplemented; +#endif case TARGET_NR_wait4: { int status; @@ -2415,17 +2459,20 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, req.tv_sec = tswapl(target_req->tv_sec); req.tv_nsec = tswapl(target_req->tv_nsec); ret = get_errno(nanosleep(&req, &rem)); - if (target_rem) { + if (is_error(ret) && target_rem) { target_rem->tv_sec = tswapl(rem.tv_sec); target_rem->tv_nsec = tswapl(rem.tv_nsec); } } break; +#ifdef TARGET_NR_setresuid case TARGET_NR_setresuid: ret = get_errno(setresuid(low2highuid(arg1), low2highuid(arg2), low2highuid(arg3))); break; +#endif +#ifdef TARGET_NR_getresuid case TARGET_NR_getresuid: { int ruid, euid, suid; @@ -2437,11 +2484,15 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, } } break; +#endif +#ifdef TARGET_NR_getresgid case TARGET_NR_setresgid: ret = get_errno(setresgid(low2highgid(arg1), low2highgid(arg2), low2highgid(arg3))); break; +#endif +#ifdef TARGET_NR_getresgid case TARGET_NR_getresgid: { int rgid, egid, sgid; @@ -2453,6 +2504,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, } } break; +#endif case TARGET_NR_query_module: goto unimplemented; case TARGET_NR_nfsservctl: @@ -2480,13 +2532,18 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, goto unimplemented; case TARGET_NR_sendfile: goto unimplemented; +#ifdef TARGET_NR_getpmsg case TARGET_NR_getpmsg: goto unimplemented; +#endif +#ifdef TARGET_NR_putpmsg case TARGET_NR_putpmsg: goto unimplemented; +#endif case TARGET_NR_vfork: ret = get_errno(do_fork(cpu_env, CLONE_VFORK | CLONE_VM | SIGCHLD, 0)); break; +#ifdef TARGET_NR_ugetrlimit case TARGET_NR_ugetrlimit: { struct rlimit rlim; @@ -2498,6 +2555,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, } break; } +#endif case TARGET_NR_truncate64: goto unimplemented; case TARGET_NR_ftruncate64: @@ -2647,13 +2705,16 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, break; } #endif +#ifdef TARGET_NR_security case TARGET_NR_security: goto unimplemented; +#endif case TARGET_NR_gettid: ret = get_errno(gettid()); break; case TARGET_NR_readahead: goto unimplemented; +#ifdef TARGET_NR_setxattr case TARGET_NR_setxattr: case TARGET_NR_lsetxattr: case TARGET_NR_fsetxattr: @@ -2667,9 +2728,12 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, case TARGET_NR_lremovexattr: case TARGET_NR_fremovexattr: goto unimplemented_nowarn; +#endif +#ifdef TARGET_NR_set_thread_area case TARGET_NR_set_thread_area: case TARGET_NR_get_thread_area: goto unimplemented_nowarn; +#endif default: unimplemented: gemu_log("qemu: Unsupported syscall: %d\n", num); |