Commit c573ff67522c98232748bef44f18faf6ae587fff

Authored by bellard
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 239 extern int getresgid(gid_t *, gid_t *, gid_t *);
240 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 263 static inline long get_errno(long ret)
243 264 {
244 265 if (ret == -1)
... ... @@ -1415,7 +1436,7 @@ void syscall_init(void)
1415 1436 ie++;
1416 1437 }
1417 1438 }
1418   -
  1439 +
1419 1440 long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
1420 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 1445 struct kernel_statfs *stfs;
1425 1446  
1426 1447 #ifdef DEBUG
1427   - gemu_log("syscall %d\n", num);
  1448 + gemu_log("syscall %d", num);
1428 1449 #endif
1429 1450 switch(num) {
1430 1451 case TARGET_NR_exit:
... ... @@ -1978,10 +1999,15 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
1978 1999 #endif
1979 2000 break;
1980 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 2007 ret = get_errno(target_mmap(arg1, arg2, arg3,
1982 2008 target_to_host_bitmask(arg4, mmap_flags_tbl),
1983 2009 arg5,
1984   - arg6 << TARGET_PAGE_BITS));
  2010 + arg6 << MMAP_SHIFT));
1985 2011 break;
1986 2012 case TARGET_NR_munmap:
1987 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 2545 if (!is_error(ret)) {
2520 2546 struct target_stat64 *target_st = (void *)arg2;
2521 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 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 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 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 2567 break;
... ... @@ -2766,6 +2792,11 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
2766 2792 case TARGET_NR_security:
2767 2793 goto unimplemented;
2768 2794 #endif
  2795 +#ifdef TARGET_NR_getpagesize
  2796 + case TARGET_NR_getpagesize:
  2797 + ret = TARGET_PAGE_SIZE;
  2798 + break;
  2799 +#endif
2769 2800 case TARGET_NR_gettid:
2770 2801 ret = get_errno(gettid());
2771 2802 break;
... ... @@ -2799,6 +2830,9 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
2799 2830 break;
2800 2831 }
2801 2832 fail:
  2833 +#ifdef DEBUG
  2834 + gemu_log(" = %ld\n", ret);
  2835 +#endif
2802 2836 return ret;
2803 2837 }
2804 2838  
... ...