linux-user: Fix stat64 syscall for SPARC64

Some targets use a stat64 structure for the stat64 syscall while others
use a stat structure. SPARC64 used the wrong kind.

Instead of extending the conditional compilation in syscall.c, now a
macro TARGET_HAS_STRUCT_STAT64 is defined whenever a target has a
target_stat64.

Signed-off-by: Stefan Weil <sw@weilnetz.de>
Reviewed-by: Erik de Castro Lopo <erikd@mega-nerd.com>
(cherry picked from commit 20d155bc90)

Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
This commit is contained in:
Stefan Weil 2013-10-30 22:52:24 +01:00 committed by Michael Roth
parent c554ddb901
commit 3bd74d1712
2 changed files with 17 additions and 3 deletions

View File

@ -4764,10 +4764,10 @@ static inline abi_long host_to_target_stat64(void *cpu_env,
} else } else
#endif #endif
{ {
#if TARGET_ABI_BITS == 64 && !defined(TARGET_ALPHA) #if defined(TARGET_HAS_STRUCT_STAT64)
struct target_stat *target_st;
#else
struct target_stat64 *target_st; struct target_stat64 *target_st;
#else
struct target_stat *target_st;
#endif #endif
if (!lock_user_struct(VERIFY_WRITE, target_st, target_addr, 0)) if (!lock_user_struct(VERIFY_WRITE, target_st, target_addr, 0))

View File

@ -1165,6 +1165,7 @@ struct target_stat {
/* This matches struct stat64 in glibc2.1, hence the absolutely /* This matches struct stat64 in glibc2.1, hence the absolutely
* insane amounts of padding around dev_t's. * insane amounts of padding around dev_t's.
*/ */
#define TARGET_HAS_STRUCT_STAT64
struct target_stat64 { struct target_stat64 {
unsigned short st_dev; unsigned short st_dev;
unsigned char __pad0[10]; unsigned char __pad0[10];
@ -1200,6 +1201,7 @@ struct target_stat64 {
} QEMU_PACKED; } QEMU_PACKED;
#ifdef TARGET_ARM #ifdef TARGET_ARM
#define TARGET_HAS_STRUCT_STAT64
struct target_eabi_stat64 { struct target_eabi_stat64 {
unsigned long long st_dev; unsigned long long st_dev;
unsigned int __pad1; unsigned int __pad1;
@ -1249,6 +1251,7 @@ struct target_stat {
abi_ulong __unused4[2]; abi_ulong __unused4[2];
}; };
#define TARGET_HAS_STRUCT_STAT64
struct target_stat64 { struct target_stat64 {
unsigned char __pad0[6]; unsigned char __pad0[6];
unsigned short st_dev; unsigned short st_dev;
@ -1304,6 +1307,7 @@ struct target_stat {
abi_ulong __unused4[2]; abi_ulong __unused4[2];
}; };
#define TARGET_HAS_STRUCT_STAT64
struct target_stat64 { struct target_stat64 {
unsigned char __pad0[6]; unsigned char __pad0[6];
unsigned short st_dev; unsigned short st_dev;
@ -1371,6 +1375,8 @@ struct target_stat {
#endif #endif
}; };
#if !defined(TARGET_PPC64) || defined(TARGET_ABI32)
#define TARGET_HAS_STRUCT_STAT64
struct QEMU_PACKED target_stat64 { struct QEMU_PACKED target_stat64 {
unsigned long long st_dev; unsigned long long st_dev;
unsigned long long st_ino; unsigned long long st_ino;
@ -1393,6 +1399,7 @@ struct QEMU_PACKED target_stat64 {
unsigned int __unused4; unsigned int __unused4;
unsigned int __unused5; unsigned int __unused5;
}; };
#endif
#elif defined(TARGET_MICROBLAZE) #elif defined(TARGET_MICROBLAZE)
@ -1418,6 +1425,7 @@ struct target_stat {
}; };
/* FIXME: Microblaze no-mmu user-space has a difference stat64 layout... */ /* FIXME: Microblaze no-mmu user-space has a difference stat64 layout... */
#define TARGET_HAS_STRUCT_STAT64
struct QEMU_PACKED target_stat64 { struct QEMU_PACKED target_stat64 {
uint64_t st_dev; uint64_t st_dev;
#define TARGET_STAT64_HAS_BROKEN_ST_INO 1 #define TARGET_STAT64_HAS_BROKEN_ST_INO 1
@ -1473,6 +1481,7 @@ struct target_stat {
/* This matches struct stat64 in glibc2.1, hence the absolutely /* This matches struct stat64 in glibc2.1, hence the absolutely
* insane amounts of padding around dev_t's. * insane amounts of padding around dev_t's.
*/ */
#define TARGET_HAS_STRUCT_STAT64
struct target_stat64 { struct target_stat64 {
unsigned long long st_dev; unsigned long long st_dev;
unsigned char __pad1[2]; unsigned char __pad1[2];
@ -1581,6 +1590,7 @@ struct target_stat {
* struct stat of the 64-bit kernel. * struct stat of the 64-bit kernel.
*/ */
#define TARGET_HAS_STRUCT_STAT64
struct target_stat64 { struct target_stat64 {
unsigned int st_dev; unsigned int st_dev;
unsigned int st_pad0[3]; /* Reserved for st_dev expansion */ unsigned int st_pad0[3]; /* Reserved for st_dev expansion */
@ -1652,6 +1662,7 @@ struct target_stat {
* struct stat of the 64-bit kernel. * struct stat of the 64-bit kernel.
*/ */
#define TARGET_HAS_STRUCT_STAT64
struct target_stat64 { struct target_stat64 {
abi_ulong st_dev; abi_ulong st_dev;
abi_ulong st_pad0[3]; /* Reserved for st_dev expansion */ abi_ulong st_pad0[3]; /* Reserved for st_dev expansion */
@ -1708,6 +1719,7 @@ struct target_stat {
unsigned int st_gen; unsigned int st_gen;
}; };
#define TARGET_HAS_STRUCT_STAT64
struct target_stat64 { struct target_stat64 {
abi_ulong st_dev; abi_ulong st_dev;
abi_ulong st_ino; abi_ulong st_ino;
@ -1757,6 +1769,7 @@ struct target_stat {
/* This matches struct stat64 in glibc2.1, hence the absolutely /* This matches struct stat64 in glibc2.1, hence the absolutely
* insane amounts of padding around dev_t's. * insane amounts of padding around dev_t's.
*/ */
#define TARGET_HAS_STRUCT_STAT64
struct QEMU_PACKED target_stat64 { struct QEMU_PACKED target_stat64 {
unsigned long long st_dev; unsigned long long st_dev;
unsigned char __pad0[4]; unsigned char __pad0[4];
@ -1862,6 +1875,7 @@ struct target_stat {
unsigned int __unused5; unsigned int __unused5;
}; };
#define TARGET_HAS_STRUCT_STAT64
struct target_stat64 { struct target_stat64 {
uint64_t st_dev; uint64_t st_dev;
uint64_t st_ino; uint64_t st_ino;