stat64 fix - added getpagesize()
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@495 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
060366c5ad
commit
c573ff6752
@ -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)
|
|||||||
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,
|
|||||||
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,
|
|||||||
#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,
|
|||||||
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,
|
|||||||
#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,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
fail:
|
fail:
|
||||||
|
#ifdef DEBUG
|
||||||
|
gemu_log(" = %ld\n", ret);
|
||||||
|
#endif
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user