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 | 3535 | struct target_stat *target_st; |
| 3536 | 3536 | |
| 3537 | 3537 | lock_user_struct(target_st, arg2, 0); |
| 3538 | -#if defined(TARGET_MIPS) | |
| 3538 | +#if defined(TARGET_MIPS) || defined(TARGET_SPARC64) | |
| 3539 | 3539 | target_st->st_dev = tswap32(st.st_dev); |
| 3540 | 3540 | #else |
| 3541 | 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 | 3545 | target_st->st_mode = tswapl(st.st_mode); /* XXX: check this */ |
| 3546 | 3546 | target_st->st_uid = tswap32(st.st_uid); |
| 3547 | 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 | 3552 | #else |
| 3549 | 3553 | target_st->st_mode = tswap16(st.st_mode); |
| 3550 | 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 | 3558 | /* If this is the same on PPC, then just merge w/ the above ifdef */ |
| 3555 | 3559 | target_st->st_nlink = tswapl(st.st_nlink); |
| 3556 | 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 | 3564 | #else |
| 3558 | 3565 | target_st->st_nlink = tswap16(st.st_nlink); |
| 3559 | 3566 | target_st->st_rdev = tswap16(st.st_rdev); | ... | ... |
linux-user/syscall_defs.h
| ... | ... | @@ -962,6 +962,57 @@ struct target_eabi_stat64 { |
| 962 | 962 | } __attribute__ ((packed)); |
| 963 | 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 | 1016 | #elif defined(TARGET_SPARC) |
| 966 | 1017 | |
| 967 | 1018 | struct target_stat { | ... | ... |