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:
		
							parent
							
								
									c554ddb901
								
							
						
					
					
						commit
						3bd74d1712
					
				| 
						 | 
				
			
			@ -4764,10 +4764,10 @@ static inline abi_long host_to_target_stat64(void *cpu_env,
 | 
			
		|||
    } else
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
#if TARGET_ABI_BITS == 64 && !defined(TARGET_ALPHA)
 | 
			
		||||
        struct target_stat *target_st;
 | 
			
		||||
#else
 | 
			
		||||
#if defined(TARGET_HAS_STRUCT_STAT64)
 | 
			
		||||
        struct target_stat64 *target_st;
 | 
			
		||||
#else
 | 
			
		||||
        struct target_stat *target_st;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
        if (!lock_user_struct(VERIFY_WRITE, target_st, target_addr, 0))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1165,6 +1165,7 @@ struct target_stat {
 | 
			
		|||
/* This matches struct stat64 in glibc2.1, hence the absolutely
 | 
			
		||||
 * insane amounts of padding around dev_t's.
 | 
			
		||||
 */
 | 
			
		||||
#define TARGET_HAS_STRUCT_STAT64
 | 
			
		||||
struct target_stat64 {
 | 
			
		||||
	unsigned short	st_dev;
 | 
			
		||||
	unsigned char	__pad0[10];
 | 
			
		||||
| 
						 | 
				
			
			@ -1200,6 +1201,7 @@ struct target_stat64 {
 | 
			
		|||
} QEMU_PACKED;
 | 
			
		||||
 | 
			
		||||
#ifdef TARGET_ARM
 | 
			
		||||
#define TARGET_HAS_STRUCT_STAT64
 | 
			
		||||
struct target_eabi_stat64 {
 | 
			
		||||
        unsigned long long st_dev;
 | 
			
		||||
        unsigned int    __pad1;
 | 
			
		||||
| 
						 | 
				
			
			@ -1249,6 +1251,7 @@ struct target_stat {
 | 
			
		|||
	abi_ulong	__unused4[2];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define TARGET_HAS_STRUCT_STAT64
 | 
			
		||||
struct target_stat64 {
 | 
			
		||||
	unsigned char	__pad0[6];
 | 
			
		||||
	unsigned short	st_dev;
 | 
			
		||||
| 
						 | 
				
			
			@ -1304,6 +1307,7 @@ struct target_stat {
 | 
			
		|||
	abi_ulong	__unused4[2];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define TARGET_HAS_STRUCT_STAT64
 | 
			
		||||
struct target_stat64 {
 | 
			
		||||
	unsigned char	__pad0[6];
 | 
			
		||||
	unsigned short	st_dev;
 | 
			
		||||
| 
						 | 
				
			
			@ -1371,6 +1375,8 @@ struct target_stat {
 | 
			
		|||
#endif
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if !defined(TARGET_PPC64) || defined(TARGET_ABI32)
 | 
			
		||||
#define TARGET_HAS_STRUCT_STAT64
 | 
			
		||||
struct QEMU_PACKED target_stat64 {
 | 
			
		||||
	unsigned long long st_dev;
 | 
			
		||||
        unsigned long long st_ino;
 | 
			
		||||
| 
						 | 
				
			
			@ -1393,6 +1399,7 @@ struct QEMU_PACKED target_stat64 {
 | 
			
		|||
        unsigned int   __unused4;
 | 
			
		||||
        unsigned int   __unused5;
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#elif defined(TARGET_MICROBLAZE)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1418,6 +1425,7 @@ struct target_stat {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
/* FIXME: Microblaze no-mmu user-space has a difference stat64 layout...  */
 | 
			
		||||
#define TARGET_HAS_STRUCT_STAT64
 | 
			
		||||
struct QEMU_PACKED target_stat64 {
 | 
			
		||||
	uint64_t st_dev;
 | 
			
		||||
#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
 | 
			
		||||
 * insane amounts of padding around dev_t's.
 | 
			
		||||
 */
 | 
			
		||||
#define TARGET_HAS_STRUCT_STAT64
 | 
			
		||||
struct target_stat64 {
 | 
			
		||||
	unsigned long long	st_dev;
 | 
			
		||||
	unsigned char	__pad1[2];
 | 
			
		||||
| 
						 | 
				
			
			@ -1581,6 +1590,7 @@ struct target_stat {
 | 
			
		|||
 * struct stat of the 64-bit kernel.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define TARGET_HAS_STRUCT_STAT64
 | 
			
		||||
struct target_stat64 {
 | 
			
		||||
	unsigned int	st_dev;
 | 
			
		||||
	unsigned int	st_pad0[3];	/* Reserved for st_dev expansion  */
 | 
			
		||||
| 
						 | 
				
			
			@ -1652,6 +1662,7 @@ struct target_stat {
 | 
			
		|||
 * struct stat of the 64-bit kernel.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define TARGET_HAS_STRUCT_STAT64
 | 
			
		||||
struct target_stat64 {
 | 
			
		||||
	abi_ulong	st_dev;
 | 
			
		||||
	abi_ulong	st_pad0[3];	/* Reserved for st_dev expansion  */
 | 
			
		||||
| 
						 | 
				
			
			@ -1708,6 +1719,7 @@ struct target_stat {
 | 
			
		|||
       unsigned int    st_gen;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define TARGET_HAS_STRUCT_STAT64
 | 
			
		||||
struct target_stat64 {
 | 
			
		||||
       abi_ulong    st_dev;
 | 
			
		||||
       abi_ulong    st_ino;
 | 
			
		||||
| 
						 | 
				
			
			@ -1757,6 +1769,7 @@ struct target_stat {
 | 
			
		|||
/* This matches struct stat64 in glibc2.1, hence the absolutely
 | 
			
		||||
 * insane amounts of padding around dev_t's.
 | 
			
		||||
 */
 | 
			
		||||
#define TARGET_HAS_STRUCT_STAT64
 | 
			
		||||
struct QEMU_PACKED target_stat64 {
 | 
			
		||||
	unsigned long long	st_dev;
 | 
			
		||||
	unsigned char	__pad0[4];
 | 
			
		||||
| 
						 | 
				
			
			@ -1862,6 +1875,7 @@ struct target_stat {
 | 
			
		|||
    unsigned int __unused5;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define TARGET_HAS_STRUCT_STAT64
 | 
			
		||||
struct target_stat64 {
 | 
			
		||||
    uint64_t st_dev;
 | 
			
		||||
    uint64_t st_ino;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue