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); | ... | ... |