提交 c573ff67 编写于 作者: B bellard

stat64 fix - added getpagesize()


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@495 c046a42c-6fe2-441c-8c8c-71466251a162
上级 060366c5
...@@ -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);
extern int getresgid(gid_t *, gid_t *, gid_t *); extern int getresgid(gid_t *, gid_t *, gid_t *);
extern int setgroups(int, gid_t *); extern int setgroups(int, gid_t *);
#define put_user(x,ptr)\
({\
int size = sizeof(*ptr);\
switch(size) {\
case 1:\
stb(ptr, (typeof(*ptr))(x));\
break;\
case 2:\
stw(ptr, (typeof(*ptr))(x));\
break;\
case 4:\
stl(ptr, (typeof(*ptr))(x));\
break;\
case 8:\
stq(ptr, (typeof(*ptr))(x));\
break;\
default:\
abort();\
}\
0;\
})
static inline long get_errno(long ret) static inline long get_errno(long ret)
{ {
if (ret == -1) if (ret == -1)
...@@ -1415,7 +1436,7 @@ void syscall_init(void) ...@@ -1415,7 +1436,7 @@ void syscall_init(void)
ie++; ie++;
} }
} }
long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
long arg4, long arg5, long arg6) long arg4, long arg5, long arg6)
{ {
...@@ -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,
struct kernel_statfs *stfs; struct kernel_statfs *stfs;
#ifdef DEBUG #ifdef DEBUG
gemu_log("syscall %d\n", num); gemu_log("syscall %d", num);
#endif #endif
switch(num) { switch(num) {
case TARGET_NR_exit: 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,
#endif #endif
break; break;
case TARGET_NR_mmap2: case TARGET_NR_mmap2:
#if defined(TARGET_SPARC)
#define MMAP_SHIFT 12
#else
#define MMAP_SHIFT TARGET_PAGE_BITS
#endif
ret = get_errno(target_mmap(arg1, arg2, arg3, ret = get_errno(target_mmap(arg1, arg2, arg3,
target_to_host_bitmask(arg4, mmap_flags_tbl), target_to_host_bitmask(arg4, mmap_flags_tbl),
arg5, arg5,
arg6 << TARGET_PAGE_BITS)); arg6 << MMAP_SHIFT));
break; break;
case TARGET_NR_munmap: case TARGET_NR_munmap:
ret = get_errno(target_munmap(arg1, arg2)); 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,
if (!is_error(ret)) { if (!is_error(ret)) {
struct target_stat64 *target_st = (void *)arg2; struct target_stat64 *target_st = (void *)arg2;
memset(target_st, 0, sizeof(struct target_stat64)); memset(target_st, 0, sizeof(struct target_stat64));
target_st->st_dev = tswap16(st.st_dev); put_user(st.st_dev, &target_st->st_dev);
target_st->st_ino = tswap64(st.st_ino); put_user(st.st_ino, &target_st->st_ino);
#ifdef TARGET_STAT64_HAS_BROKEN_ST_INO #ifdef TARGET_STAT64_HAS_BROKEN_ST_INO
target_st->__st_ino = tswapl(st.st_ino); put_user(st.st_ino, &target_st->__st_ino);
#endif #endif
target_st->st_mode = tswap32(st.st_mode); put_user(st.st_mode, &target_st->st_mode);
target_st->st_nlink = tswap32(st.st_nlink); put_user(st.st_nlink, &target_st->st_nlink);
target_st->st_uid = tswapl(st.st_uid); put_user(st.st_uid, &target_st->st_uid);
target_st->st_gid = tswapl(st.st_gid); put_user(st.st_gid, &target_st->st_gid);
target_st->st_rdev = tswap16(st.st_rdev); put_user(st.st_rdev, &target_st->st_rdev);
/* XXX: better use of kernel struct */ /* XXX: better use of kernel struct */
target_st->st_size = tswap64(st.st_size); put_user(st.st_size, &target_st->st_size);
target_st->st_blksize = tswapl(st.st_blksize); put_user(st.st_blksize, &target_st->st_blksize);
target_st->st_blocks = tswapl(st.st_blocks); put_user(st.st_blocks, &target_st->st_blocks);
target_st->target_st_atime = tswapl(st.st_atime); put_user(st.st_atime, &target_st->target_st_atime);
target_st->target_st_mtime = tswapl(st.st_mtime); put_user(st.st_mtime, &target_st->target_st_mtime);
target_st->target_st_ctime = tswapl(st.st_ctime); put_user(st.st_ctime, &target_st->target_st_ctime);
} }
} }
break; break;
...@@ -2765,6 +2791,11 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, ...@@ -2765,6 +2791,11 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
#ifdef TARGET_NR_security #ifdef TARGET_NR_security
case TARGET_NR_security: case TARGET_NR_security:
goto unimplemented; goto unimplemented;
#endif
#ifdef TARGET_NR_getpagesize
case TARGET_NR_getpagesize:
ret = TARGET_PAGE_SIZE;
break;
#endif #endif
case TARGET_NR_gettid: case TARGET_NR_gettid:
ret = get_errno(gettid()); ret = get_errno(gettid());
...@@ -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,
break; break;
} }
fail: fail:
#ifdef DEBUG
gemu_log(" = %ld\n", ret);
#endif
return ret; return ret;
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册