diff --git a/linux-user/syscall.c b/linux-user/syscall.c index caaea1aae6..1e7dcedbdd 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -1002,10 +1002,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, case TARGET_NR_sigaction: #if 1 { - int signum = arg1; - struct target_old_sigaction *tact = arg2, *toldact = arg3; ret = 0; - } break; #else @@ -1464,9 +1461,37 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, case TARGET_NR_ugetrlimit: case TARGET_NR_truncate64: case TARGET_NR_ftruncate64: + goto unimplemented; case TARGET_NR_stat64: + ret = get_errno(stat((const char *)arg1, &st)); + goto do_stat64; case TARGET_NR_lstat64: + ret = get_errno(lstat((const char *)arg1, &st)); + goto do_stat64; case TARGET_NR_fstat64: + { + ret = get_errno(fstat(arg1, &st)); + do_stat64: + if (!is_error(ret)) { + struct target_stat64 *target_st = (void *)arg2; + target_st->st_dev = tswap16(st.st_dev); + target_st->st_ino = tswapl(st.st_ino); + target_st->st_mode = tswap16(st.st_mode); + target_st->st_nlink = tswap16(st.st_nlink); + target_st->st_uid = tswap16(st.st_uid); + target_st->st_gid = tswap16(st.st_gid); + target_st->st_rdev = tswap16(st.st_rdev); + /* XXX: better use of kernel struct */ + target_st->st_size = tswapl(st.st_size); + target_st->st_blksize = tswapl(st.st_blksize); + target_st->st_blocks = tswapl(st.st_blocks); + target_st->st_atime = tswapl(st.st_atime); + target_st->st_mtime = tswapl(st.st_mtime); + target_st->st_ctime = tswapl(st.st_ctime); + } + } + break; + case TARGET_NR_lchown32: case TARGET_NR_getuid32: case TARGET_NR_getgid32: @@ -1490,7 +1515,20 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, case TARGET_NR_mincore: case TARGET_NR_madvise: case TARGET_NR_getdents64: + goto unimplemented; +#if TARGET_LONG_BITS == 32 case TARGET_NR_fcntl64: + switch(arg2) { + case F_GETLK64: + case F_SETLK64: + case F_SETLKW64: + goto unimplemented; + default: + ret = get_errno(fcntl(arg1, arg2, arg3)); + break; + } + break; +#endif case TARGET_NR_security: goto unimplemented; case TARGET_NR_gettid: diff --git a/syscall-i386.h b/syscall-i386.h index fa84d9a553..3d270d7754 100644 --- a/syscall-i386.h +++ b/syscall-i386.h @@ -245,24 +245,24 @@ struct target_stat { unsigned short st_dev; unsigned short __pad1; - unsigned long st_ino; + target_ulong st_ino; unsigned short st_mode; unsigned short st_nlink; unsigned short st_uid; unsigned short st_gid; unsigned short st_rdev; unsigned short __pad2; - unsigned long st_size; - unsigned long st_blksize; - unsigned long st_blocks; - unsigned long st_atime; - unsigned long __unused1; - unsigned long st_mtime; - unsigned long __unused2; - unsigned long st_ctime; - unsigned long __unused3; - unsigned long __unused4; - unsigned long __unused5; + target_ulong st_size; + target_ulong st_blksize; + target_ulong st_blocks; + target_ulong st_atime; + target_ulong __unused1; + target_ulong st_mtime; + target_ulong __unused2; + target_ulong st_ctime; + target_ulong __unused3; + target_ulong __unused4; + target_ulong __unused5; }; /* This matches struct stat64 in glibc2.1, hence the absolutely @@ -273,31 +273,31 @@ struct target_stat64 { unsigned char __pad0[10]; #define STAT64_HAS_BROKEN_ST_INO 1 - unsigned long __st_ino; + target_ulong __st_ino; unsigned int st_mode; unsigned int st_nlink; - unsigned long st_uid; - unsigned long st_gid; + target_ulong st_uid; + target_ulong st_gid; unsigned short st_rdev; unsigned char __pad3[10]; long long st_size; - unsigned long st_blksize; + target_ulong st_blksize; - unsigned long st_blocks; /* Number 512-byte blocks allocated. */ - unsigned long __pad4; /* future possible st_blocks high bits */ + target_ulong st_blocks; /* Number 512-byte blocks allocated. */ + target_ulong __pad4; /* future possible st_blocks high bits */ - unsigned long st_atime; - unsigned long __pad5; + target_ulong st_atime; + target_ulong __pad5; - unsigned long st_mtime; - unsigned long __pad6; + target_ulong st_mtime; + target_ulong __pad6; - unsigned long st_ctime; - unsigned long __pad7; /* will be high 32 bits of ctime someday */ + target_ulong st_ctime; + target_ulong __pad7; /* will be high 32 bits of ctime someday */ unsigned long long st_ino; };