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