Commit ec86b0fb3aa854ea8cec28df15cbd43f30d21519
1 parent
1d346ae6
stat patches - path patches - added exit_group() syscall
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@95 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
25 additions
and
12 deletions
linux-user/syscall.c
| @@ -105,6 +105,9 @@ _syscall5(int, _llseek, uint, fd, ulong, hi, ulong, lo, | @@ -105,6 +105,9 @@ _syscall5(int, _llseek, uint, fd, ulong, hi, ulong, lo, | ||
| 105 | _syscall2(int,sys_statfs,const char *,path,struct kernel_statfs *,buf) | 105 | _syscall2(int,sys_statfs,const char *,path,struct kernel_statfs *,buf) |
| 106 | _syscall2(int,sys_fstatfs,int,fd,struct kernel_statfs *,buf) | 106 | _syscall2(int,sys_fstatfs,int,fd,struct kernel_statfs *,buf) |
| 107 | _syscall3(int,sys_rt_sigqueueinfo,int,pid,int,sig,siginfo_t *,uinfo) | 107 | _syscall3(int,sys_rt_sigqueueinfo,int,pid,int,sig,siginfo_t *,uinfo) |
| 108 | +#ifdef __NR_exit_group | ||
| 109 | +_syscall1(int,exit_group,int,error_code) | ||
| 110 | +#endif | ||
| 108 | 111 | ||
| 109 | extern int personality(int); | 112 | extern int personality(int); |
| 110 | extern int flock(int, int); | 113 | extern int flock(int, int); |
| @@ -1212,7 +1215,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -1212,7 +1215,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
| 1212 | ret = get_errno(write(arg1, (void *)arg2, arg3)); | 1215 | ret = get_errno(write(arg1, (void *)arg2, arg3)); |
| 1213 | break; | 1216 | break; |
| 1214 | case TARGET_NR_open: | 1217 | case TARGET_NR_open: |
| 1215 | - ret = get_errno(open((const char *)arg1, arg2, arg3)); | 1218 | + ret = get_errno(open(path((const char *)arg1), arg2, arg3)); |
| 1216 | break; | 1219 | break; |
| 1217 | case TARGET_NR_close: | 1220 | case TARGET_NR_close: |
| 1218 | ret = get_errno(close(arg1)); | 1221 | ret = get_errno(close(arg1)); |
| @@ -1700,7 +1703,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -1700,7 +1703,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
| 1700 | case TARGET_NR_oldlstat: | 1703 | case TARGET_NR_oldlstat: |
| 1701 | goto unimplemented; | 1704 | goto unimplemented; |
| 1702 | case TARGET_NR_readlink: | 1705 | case TARGET_NR_readlink: |
| 1703 | - ret = get_errno(readlink((const char *)arg1, (char *)arg2, arg3)); | 1706 | + ret = get_errno(readlink(path((const char *)arg1), (char *)arg2, arg3)); |
| 1704 | break; | 1707 | break; |
| 1705 | case TARGET_NR_uselib: | 1708 | case TARGET_NR_uselib: |
| 1706 | goto unimplemented; | 1709 | goto unimplemented; |
| @@ -1779,7 +1782,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -1779,7 +1782,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
| 1779 | goto unimplemented; | 1782 | goto unimplemented; |
| 1780 | case TARGET_NR_statfs: | 1783 | case TARGET_NR_statfs: |
| 1781 | stfs = (void *)arg2; | 1784 | stfs = (void *)arg2; |
| 1782 | - ret = get_errno(sys_statfs((const char *)arg1, stfs)); | 1785 | + ret = get_errno(sys_statfs(path((const char *)arg1), stfs)); |
| 1783 | convert_statfs: | 1786 | convert_statfs: |
| 1784 | if (!is_error(ret)) { | 1787 | if (!is_error(ret)) { |
| 1785 | tswap32s(&stfs->f_type); | 1788 | tswap32s(&stfs->f_type); |
| @@ -1844,10 +1847,10 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -1844,10 +1847,10 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
| 1844 | } | 1847 | } |
| 1845 | break; | 1848 | break; |
| 1846 | case TARGET_NR_stat: | 1849 | case TARGET_NR_stat: |
| 1847 | - ret = get_errno(stat((const char *)arg1, &st)); | 1850 | + ret = get_errno(stat(path((const char *)arg1), &st)); |
| 1848 | goto do_stat; | 1851 | goto do_stat; |
| 1849 | case TARGET_NR_lstat: | 1852 | case TARGET_NR_lstat: |
| 1850 | - ret = get_errno(lstat((const char *)arg1, &st)); | 1853 | + ret = get_errno(lstat(path((const char *)arg1), &st)); |
| 1851 | goto do_stat; | 1854 | goto do_stat; |
| 1852 | case TARGET_NR_fstat: | 1855 | case TARGET_NR_fstat: |
| 1853 | { | 1856 | { |
| @@ -1857,7 +1860,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -1857,7 +1860,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
| 1857 | struct target_stat *target_st = (void *)arg2; | 1860 | struct target_stat *target_st = (void *)arg2; |
| 1858 | target_st->st_dev = tswap16(st.st_dev); | 1861 | target_st->st_dev = tswap16(st.st_dev); |
| 1859 | target_st->st_ino = tswapl(st.st_ino); | 1862 | target_st->st_ino = tswapl(st.st_ino); |
| 1860 | - target_st->st_mode = tswap32(st.st_mode); | 1863 | + target_st->st_mode = tswap16(st.st_mode); |
| 1861 | target_st->st_nlink = tswap16(st.st_nlink); | 1864 | target_st->st_nlink = tswap16(st.st_nlink); |
| 1862 | target_st->st_uid = tswap16(st.st_uid); | 1865 | target_st->st_uid = tswap16(st.st_uid); |
| 1863 | target_st->st_gid = tswap16(st.st_gid); | 1866 | target_st->st_gid = tswap16(st.st_gid); |
| @@ -1930,6 +1933,12 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -1930,6 +1933,12 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
| 1930 | case TARGET_NR_clone: | 1933 | case TARGET_NR_clone: |
| 1931 | ret = get_errno(do_fork(cpu_env, arg1, arg2)); | 1934 | ret = get_errno(do_fork(cpu_env, arg1, arg2)); |
| 1932 | break; | 1935 | break; |
| 1936 | +#ifdef __NR_exit_group | ||
| 1937 | + /* new thread calls */ | ||
| 1938 | + case TARGET_NR_exit_group: | ||
| 1939 | + ret = get_errno(exit_group(arg1)); | ||
| 1940 | + break; | ||
| 1941 | +#endif | ||
| 1933 | case TARGET_NR_setdomainname: | 1942 | case TARGET_NR_setdomainname: |
| 1934 | ret = get_errno(setdomainname((const char *)arg1, arg2)); | 1943 | ret = get_errno(setdomainname((const char *)arg1, arg2)); |
| 1935 | break; | 1944 | break; |
| @@ -2235,10 +2244,10 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -2235,10 +2244,10 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
| 2235 | case TARGET_NR_ftruncate64: | 2244 | case TARGET_NR_ftruncate64: |
| 2236 | goto unimplemented; | 2245 | goto unimplemented; |
| 2237 | case TARGET_NR_stat64: | 2246 | case TARGET_NR_stat64: |
| 2238 | - ret = get_errno(stat((const char *)arg1, &st)); | 2247 | + ret = get_errno(stat(path((const char *)arg1), &st)); |
| 2239 | goto do_stat64; | 2248 | goto do_stat64; |
| 2240 | case TARGET_NR_lstat64: | 2249 | case TARGET_NR_lstat64: |
| 2241 | - ret = get_errno(lstat((const char *)arg1, &st)); | 2250 | + ret = get_errno(lstat(path((const char *)arg1), &st)); |
| 2242 | goto do_stat64; | 2251 | goto do_stat64; |
| 2243 | case TARGET_NR_fstat64: | 2252 | case TARGET_NR_fstat64: |
| 2244 | { | 2253 | { |
| @@ -2246,15 +2255,19 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -2246,15 +2255,19 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
| 2246 | do_stat64: | 2255 | do_stat64: |
| 2247 | if (!is_error(ret)) { | 2256 | if (!is_error(ret)) { |
| 2248 | struct target_stat64 *target_st = (void *)arg2; | 2257 | struct target_stat64 *target_st = (void *)arg2; |
| 2258 | + memset(target_st, 0, sizeof(struct target_stat64)); | ||
| 2249 | target_st->st_dev = tswap16(st.st_dev); | 2259 | target_st->st_dev = tswap16(st.st_dev); |
| 2250 | target_st->st_ino = tswapl(st.st_ino); | 2260 | target_st->st_ino = tswapl(st.st_ino); |
| 2261 | +#ifdef TARGET_STAT64_HAS_BROKEN_ST_INO | ||
| 2262 | + target_st->__st_ino = tswapl(st.st_ino); | ||
| 2263 | +#endif | ||
| 2251 | target_st->st_mode = tswap32(st.st_mode); | 2264 | target_st->st_mode = tswap32(st.st_mode); |
| 2252 | - target_st->st_nlink = tswap16(st.st_nlink); | ||
| 2253 | - target_st->st_uid = tswap16(st.st_uid); | ||
| 2254 | - target_st->st_gid = tswap16(st.st_gid); | 2265 | + target_st->st_nlink = tswap32(st.st_nlink); |
| 2266 | + target_st->st_uid = tswapl(st.st_uid); | ||
| 2267 | + target_st->st_gid = tswapl(st.st_gid); | ||
| 2255 | target_st->st_rdev = tswap16(st.st_rdev); | 2268 | target_st->st_rdev = tswap16(st.st_rdev); |
| 2256 | /* XXX: better use of kernel struct */ | 2269 | /* XXX: better use of kernel struct */ |
| 2257 | - target_st->st_size = tswapl(st.st_size); | 2270 | + target_st->st_size = tswap64(st.st_size); |
| 2258 | target_st->st_blksize = tswapl(st.st_blksize); | 2271 | target_st->st_blksize = tswapl(st.st_blksize); |
| 2259 | target_st->st_blocks = tswapl(st.st_blocks); | 2272 | target_st->st_blocks = tswapl(st.st_blocks); |
| 2260 | target_st->target_st_atime = tswapl(st.st_atime); | 2273 | target_st->target_st_atime = tswapl(st.st_atime); |