Commit c573ff67522c98232748bef44f18faf6ae587fff
1 parent
060366c5
stat64 fix - added getpagesize()
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@495 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
51 additions
and
17 deletions
linux-user/syscall.c
@@ -239,6 +239,27 @@ extern int setresgid(gid_t, gid_t, gid_t); | @@ -239,6 +239,27 @@ extern int setresgid(gid_t, gid_t, gid_t); | ||
239 | extern int getresgid(gid_t *, gid_t *, gid_t *); | 239 | extern int getresgid(gid_t *, gid_t *, gid_t *); |
240 | extern int setgroups(int, gid_t *); | 240 | extern int setgroups(int, gid_t *); |
241 | 241 | ||
242 | +#define put_user(x,ptr)\ | ||
243 | +({\ | ||
244 | + int size = sizeof(*ptr);\ | ||
245 | + switch(size) {\ | ||
246 | + case 1:\ | ||
247 | + stb(ptr, (typeof(*ptr))(x));\ | ||
248 | + break;\ | ||
249 | + case 2:\ | ||
250 | + stw(ptr, (typeof(*ptr))(x));\ | ||
251 | + break;\ | ||
252 | + case 4:\ | ||
253 | + stl(ptr, (typeof(*ptr))(x));\ | ||
254 | + break;\ | ||
255 | + case 8:\ | ||
256 | + stq(ptr, (typeof(*ptr))(x));\ | ||
257 | + break;\ | ||
258 | + default:\ | ||
259 | + abort();\ | ||
260 | + }\ | ||
261 | + 0;\ | ||
262 | +}) | ||
242 | static inline long get_errno(long ret) | 263 | static inline long get_errno(long ret) |
243 | { | 264 | { |
244 | if (ret == -1) | 265 | if (ret == -1) |
@@ -1415,7 +1436,7 @@ void syscall_init(void) | @@ -1415,7 +1436,7 @@ void syscall_init(void) | ||
1415 | ie++; | 1436 | ie++; |
1416 | } | 1437 | } |
1417 | } | 1438 | } |
1418 | - | 1439 | + |
1419 | long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | 1440 | long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, |
1420 | long arg4, long arg5, long arg6) | 1441 | long arg4, long arg5, long arg6) |
1421 | { | 1442 | { |
@@ -1424,7 +1445,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -1424,7 +1445,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
1424 | struct kernel_statfs *stfs; | 1445 | struct kernel_statfs *stfs; |
1425 | 1446 | ||
1426 | #ifdef DEBUG | 1447 | #ifdef DEBUG |
1427 | - gemu_log("syscall %d\n", num); | 1448 | + gemu_log("syscall %d", num); |
1428 | #endif | 1449 | #endif |
1429 | switch(num) { | 1450 | switch(num) { |
1430 | case TARGET_NR_exit: | 1451 | case TARGET_NR_exit: |
@@ -1978,10 +1999,15 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -1978,10 +1999,15 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
1978 | #endif | 1999 | #endif |
1979 | break; | 2000 | break; |
1980 | case TARGET_NR_mmap2: | 2001 | case TARGET_NR_mmap2: |
2002 | +#if defined(TARGET_SPARC) | ||
2003 | +#define MMAP_SHIFT 12 | ||
2004 | +#else | ||
2005 | +#define MMAP_SHIFT TARGET_PAGE_BITS | ||
2006 | +#endif | ||
1981 | ret = get_errno(target_mmap(arg1, arg2, arg3, | 2007 | ret = get_errno(target_mmap(arg1, arg2, arg3, |
1982 | target_to_host_bitmask(arg4, mmap_flags_tbl), | 2008 | target_to_host_bitmask(arg4, mmap_flags_tbl), |
1983 | arg5, | 2009 | arg5, |
1984 | - arg6 << TARGET_PAGE_BITS)); | 2010 | + arg6 << MMAP_SHIFT)); |
1985 | break; | 2011 | break; |
1986 | case TARGET_NR_munmap: | 2012 | case TARGET_NR_munmap: |
1987 | ret = get_errno(target_munmap(arg1, arg2)); | 2013 | ret = get_errno(target_munmap(arg1, arg2)); |
@@ -2519,23 +2545,23 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -2519,23 +2545,23 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
2519 | if (!is_error(ret)) { | 2545 | if (!is_error(ret)) { |
2520 | struct target_stat64 *target_st = (void *)arg2; | 2546 | struct target_stat64 *target_st = (void *)arg2; |
2521 | memset(target_st, 0, sizeof(struct target_stat64)); | 2547 | memset(target_st, 0, sizeof(struct target_stat64)); |
2522 | - target_st->st_dev = tswap16(st.st_dev); | ||
2523 | - target_st->st_ino = tswap64(st.st_ino); | 2548 | + put_user(st.st_dev, &target_st->st_dev); |
2549 | + put_user(st.st_ino, &target_st->st_ino); | ||
2524 | #ifdef TARGET_STAT64_HAS_BROKEN_ST_INO | 2550 | #ifdef TARGET_STAT64_HAS_BROKEN_ST_INO |
2525 | - target_st->__st_ino = tswapl(st.st_ino); | 2551 | + put_user(st.st_ino, &target_st->__st_ino); |
2526 | #endif | 2552 | #endif |
2527 | - target_st->st_mode = tswap32(st.st_mode); | ||
2528 | - target_st->st_nlink = tswap32(st.st_nlink); | ||
2529 | - target_st->st_uid = tswapl(st.st_uid); | ||
2530 | - target_st->st_gid = tswapl(st.st_gid); | ||
2531 | - target_st->st_rdev = tswap16(st.st_rdev); | 2553 | + put_user(st.st_mode, &target_st->st_mode); |
2554 | + put_user(st.st_nlink, &target_st->st_nlink); | ||
2555 | + put_user(st.st_uid, &target_st->st_uid); | ||
2556 | + put_user(st.st_gid, &target_st->st_gid); | ||
2557 | + put_user(st.st_rdev, &target_st->st_rdev); | ||
2532 | /* XXX: better use of kernel struct */ | 2558 | /* XXX: better use of kernel struct */ |
2533 | - target_st->st_size = tswap64(st.st_size); | ||
2534 | - target_st->st_blksize = tswapl(st.st_blksize); | ||
2535 | - target_st->st_blocks = tswapl(st.st_blocks); | ||
2536 | - target_st->target_st_atime = tswapl(st.st_atime); | ||
2537 | - target_st->target_st_mtime = tswapl(st.st_mtime); | ||
2538 | - target_st->target_st_ctime = tswapl(st.st_ctime); | 2559 | + put_user(st.st_size, &target_st->st_size); |
2560 | + put_user(st.st_blksize, &target_st->st_blksize); | ||
2561 | + put_user(st.st_blocks, &target_st->st_blocks); | ||
2562 | + put_user(st.st_atime, &target_st->target_st_atime); | ||
2563 | + put_user(st.st_mtime, &target_st->target_st_mtime); | ||
2564 | + put_user(st.st_ctime, &target_st->target_st_ctime); | ||
2539 | } | 2565 | } |
2540 | } | 2566 | } |
2541 | break; | 2567 | break; |
@@ -2766,6 +2792,11 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -2766,6 +2792,11 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
2766 | case TARGET_NR_security: | 2792 | case TARGET_NR_security: |
2767 | goto unimplemented; | 2793 | goto unimplemented; |
2768 | #endif | 2794 | #endif |
2795 | +#ifdef TARGET_NR_getpagesize | ||
2796 | + case TARGET_NR_getpagesize: | ||
2797 | + ret = TARGET_PAGE_SIZE; | ||
2798 | + break; | ||
2799 | +#endif | ||
2769 | case TARGET_NR_gettid: | 2800 | case TARGET_NR_gettid: |
2770 | ret = get_errno(gettid()); | 2801 | ret = get_errno(gettid()); |
2771 | break; | 2802 | break; |
@@ -2799,6 +2830,9 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -2799,6 +2830,9 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
2799 | break; | 2830 | break; |
2800 | } | 2831 | } |
2801 | fail: | 2832 | fail: |
2833 | +#ifdef DEBUG | ||
2834 | + gemu_log(" = %ld\n", ret); | ||
2835 | +#endif | ||
2802 | return ret; | 2836 | return ret; |
2803 | } | 2837 | } |
2804 | 2838 |