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