Commit 1b8dd648bdccefa8ba1b05416e65e9b3a278b0e6
1 parent
17d996e1
Fix Sparc64 stat system call
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3053 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
59 additions
and
1 deletions
linux-user/syscall.c
| @@ -3535,7 +3535,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -3535,7 +3535,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
| 3535 | struct target_stat *target_st; | 3535 | struct target_stat *target_st; |
| 3536 | 3536 | ||
| 3537 | lock_user_struct(target_st, arg2, 0); | 3537 | lock_user_struct(target_st, arg2, 0); |
| 3538 | -#if defined(TARGET_MIPS) | 3538 | +#if defined(TARGET_MIPS) || defined(TARGET_SPARC64) |
| 3539 | target_st->st_dev = tswap32(st.st_dev); | 3539 | target_st->st_dev = tswap32(st.st_dev); |
| 3540 | #else | 3540 | #else |
| 3541 | target_st->st_dev = tswap16(st.st_dev); | 3541 | target_st->st_dev = tswap16(st.st_dev); |
| @@ -3545,6 +3545,10 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -3545,6 +3545,10 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
| 3545 | target_st->st_mode = tswapl(st.st_mode); /* XXX: check this */ | 3545 | target_st->st_mode = tswapl(st.st_mode); /* XXX: check this */ |
| 3546 | target_st->st_uid = tswap32(st.st_uid); | 3546 | target_st->st_uid = tswap32(st.st_uid); |
| 3547 | target_st->st_gid = tswap32(st.st_gid); | 3547 | target_st->st_gid = tswap32(st.st_gid); |
| 3548 | +#elif defined(TARGET_SPARC64) | ||
| 3549 | + target_st->st_mode = tswap32(st.st_mode); | ||
| 3550 | + target_st->st_uid = tswap32(st.st_uid); | ||
| 3551 | + target_st->st_gid = tswap32(st.st_gid); | ||
| 3548 | #else | 3552 | #else |
| 3549 | target_st->st_mode = tswap16(st.st_mode); | 3553 | target_st->st_mode = tswap16(st.st_mode); |
| 3550 | target_st->st_uid = tswap16(st.st_uid); | 3554 | target_st->st_uid = tswap16(st.st_uid); |
| @@ -3554,6 +3558,9 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -3554,6 +3558,9 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
| 3554 | /* If this is the same on PPC, then just merge w/ the above ifdef */ | 3558 | /* If this is the same on PPC, then just merge w/ the above ifdef */ |
| 3555 | target_st->st_nlink = tswapl(st.st_nlink); | 3559 | target_st->st_nlink = tswapl(st.st_nlink); |
| 3556 | target_st->st_rdev = tswapl(st.st_rdev); | 3560 | target_st->st_rdev = tswapl(st.st_rdev); |
| 3561 | +#elif defined(TARGET_SPARC64) | ||
| 3562 | + target_st->st_nlink = tswap32(st.st_nlink); | ||
| 3563 | + target_st->st_rdev = tswap32(st.st_rdev); | ||
| 3557 | #else | 3564 | #else |
| 3558 | target_st->st_nlink = tswap16(st.st_nlink); | 3565 | target_st->st_nlink = tswap16(st.st_nlink); |
| 3559 | target_st->st_rdev = tswap16(st.st_rdev); | 3566 | target_st->st_rdev = tswap16(st.st_rdev); |
linux-user/syscall_defs.h
| @@ -962,6 +962,57 @@ struct target_eabi_stat64 { | @@ -962,6 +962,57 @@ struct target_eabi_stat64 { | ||
| 962 | } __attribute__ ((packed)); | 962 | } __attribute__ ((packed)); |
| 963 | #endif | 963 | #endif |
| 964 | 964 | ||
| 965 | +#elif defined(TARGET_SPARC64) | ||
| 966 | +struct target_stat { | ||
| 967 | + unsigned int st_dev; | ||
| 968 | + target_ulong st_ino; | ||
| 969 | + unsigned int st_mode; | ||
| 970 | + unsigned int st_nlink; | ||
| 971 | + unsigned int st_uid; | ||
| 972 | + unsigned int st_gid; | ||
| 973 | + unsigned int st_rdev; | ||
| 974 | + target_long st_size; | ||
| 975 | + target_long target_st_atime; | ||
| 976 | + target_long target_st_mtime; | ||
| 977 | + target_long target_st_ctime; | ||
| 978 | + target_long st_blksize; | ||
| 979 | + target_long st_blocks; | ||
| 980 | + target_ulong __unused4[2]; | ||
| 981 | +}; | ||
| 982 | + | ||
| 983 | +struct target_stat64 { | ||
| 984 | + unsigned char __pad0[6]; | ||
| 985 | + unsigned short st_dev; | ||
| 986 | + | ||
| 987 | + uint64_t st_ino; | ||
| 988 | + uint64_t st_nlink; | ||
| 989 | + | ||
| 990 | + unsigned int st_mode; | ||
| 991 | + | ||
| 992 | + unsigned int st_uid; | ||
| 993 | + unsigned int st_gid; | ||
| 994 | + | ||
| 995 | + unsigned char __pad2[6]; | ||
| 996 | + unsigned short st_rdev; | ||
| 997 | + | ||
| 998 | + int64_t st_size; | ||
| 999 | + int64_t st_blksize; | ||
| 1000 | + | ||
| 1001 | + unsigned char __pad4[4]; | ||
| 1002 | + unsigned int st_blocks; | ||
| 1003 | + | ||
| 1004 | + target_ulong target_st_atime; | ||
| 1005 | + target_ulong __unused1; | ||
| 1006 | + | ||
| 1007 | + target_ulong target_st_mtime; | ||
| 1008 | + target_ulong __unused2; | ||
| 1009 | + | ||
| 1010 | + target_ulong target_st_ctime; | ||
| 1011 | + target_ulong __unused3; | ||
| 1012 | + | ||
| 1013 | + target_ulong __unused4[3]; | ||
| 1014 | +}; | ||
| 1015 | + | ||
| 965 | #elif defined(TARGET_SPARC) | 1016 | #elif defined(TARGET_SPARC) |
| 966 | 1017 | ||
| 967 | struct target_stat { | 1018 | struct target_stat { |