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 | 105 | _syscall2(int,sys_statfs,const char *,path,struct kernel_statfs *,buf) |
106 | 106 | _syscall2(int,sys_fstatfs,int,fd,struct kernel_statfs *,buf) |
107 | 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 | 112 | extern int personality(int); |
110 | 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 | 1215 | ret = get_errno(write(arg1, (void *)arg2, arg3)); |
1213 | 1216 | break; |
1214 | 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 | 1219 | break; |
1217 | 1220 | case TARGET_NR_close: |
1218 | 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 | 1703 | case TARGET_NR_oldlstat: |
1701 | 1704 | goto unimplemented; |
1702 | 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 | 1707 | break; |
1705 | 1708 | case TARGET_NR_uselib: |
1706 | 1709 | goto unimplemented; |
... | ... | @@ -1779,7 +1782,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, |
1779 | 1782 | goto unimplemented; |
1780 | 1783 | case TARGET_NR_statfs: |
1781 | 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 | 1786 | convert_statfs: |
1784 | 1787 | if (!is_error(ret)) { |
1785 | 1788 | tswap32s(&stfs->f_type); |
... | ... | @@ -1844,10 +1847,10 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, |
1844 | 1847 | } |
1845 | 1848 | break; |
1846 | 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 | 1851 | goto do_stat; |
1849 | 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 | 1854 | goto do_stat; |
1852 | 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 | 1860 | struct target_stat *target_st = (void *)arg2; |
1858 | 1861 | target_st->st_dev = tswap16(st.st_dev); |
1859 | 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 | 1864 | target_st->st_nlink = tswap16(st.st_nlink); |
1862 | 1865 | target_st->st_uid = tswap16(st.st_uid); |
1863 | 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 | 1933 | case TARGET_NR_clone: |
1931 | 1934 | ret = get_errno(do_fork(cpu_env, arg1, arg2)); |
1932 | 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 | 1942 | case TARGET_NR_setdomainname: |
1934 | 1943 | ret = get_errno(setdomainname((const char *)arg1, arg2)); |
1935 | 1944 | break; |
... | ... | @@ -2235,10 +2244,10 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, |
2235 | 2244 | case TARGET_NR_ftruncate64: |
2236 | 2245 | goto unimplemented; |
2237 | 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 | 2248 | goto do_stat64; |
2240 | 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 | 2251 | goto do_stat64; |
2243 | 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 | 2255 | do_stat64: |
2247 | 2256 | if (!is_error(ret)) { |
2248 | 2257 | struct target_stat64 *target_st = (void *)arg2; |
2258 | + memset(target_st, 0, sizeof(struct target_stat64)); | |
2249 | 2259 | target_st->st_dev = tswap16(st.st_dev); |
2250 | 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 | 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 | 2268 | target_st->st_rdev = tswap16(st.st_rdev); |
2256 | 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 | 2271 | target_st->st_blksize = tswapl(st.st_blksize); |
2259 | 2272 | target_st->st_blocks = tswapl(st.st_blocks); |
2260 | 2273 | target_st->target_st_atime = tswapl(st.st_atime); | ... | ... |