linux-user: make MIPS and ARM eabi use same argument reordering
MIPS uses similar calling convention than ARM eabi, where when using 64-bit values some registers are skipped. This patch makes MIPS and ARM eabi share the argument reordering code. This affects ftruncate64, creating insane sized fails (or just failing). Cc: Wesley W. Terpstra <terpstra@debian.org> Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
This commit is contained in:
		
							parent
							
								
									c3edf3472f
								
							
						
					
					
						commit
						48e515d4fa
					
				| @ -580,6 +580,17 @@ extern int setfsuid(int); | ||||
| extern int setfsgid(int); | ||||
| extern int setgroups(int, gid_t *); | ||||
| 
 | ||||
| /* ARM EABI and MIPS expect 64bit types aligned even on pairs or registers */ | ||||
| #ifdef TARGET_ARM  | ||||
| static inline int regpairs_aligned(void *cpu_env) { | ||||
|     return ((((CPUARMState *)cpu_env)->eabi) == 1) ; | ||||
| } | ||||
| #elif defined(TARGET_MIPS) | ||||
| static inline int regpairs_aligned(void *cpu_env) { return 1; } | ||||
| #else | ||||
| static inline int regpairs_aligned(void *cpu_env) { return 0; } | ||||
| #endif | ||||
| 
 | ||||
| #define ERRNO_TABLE_SIZE 1200 | ||||
| 
 | ||||
| /* target_to_host_errno_table[] is initialized from
 | ||||
| @ -4375,13 +4386,10 @@ static inline abi_long target_truncate64(void *cpu_env, const char *arg1, | ||||
|                                          abi_long arg3, | ||||
|                                          abi_long arg4) | ||||
| { | ||||
| #ifdef TARGET_ARM | ||||
|     if (((CPUARMState *)cpu_env)->eabi) | ||||
|       { | ||||
|     if (regpairs_aligned(cpu_env)) { | ||||
|         arg2 = arg3; | ||||
|         arg3 = arg4; | ||||
|       } | ||||
| #endif | ||||
|     } | ||||
|     return get_errno(truncate64(arg1, target_offset64(arg2, arg3))); | ||||
| } | ||||
| #endif | ||||
| @ -4392,13 +4400,10 @@ static inline abi_long target_ftruncate64(void *cpu_env, abi_long arg1, | ||||
|                                           abi_long arg3, | ||||
|                                           abi_long arg4) | ||||
| { | ||||
| #ifdef TARGET_ARM | ||||
|     if (((CPUARMState *)cpu_env)->eabi) | ||||
|       { | ||||
|     if (regpairs_aligned(cpu_env)) { | ||||
|         arg2 = arg3; | ||||
|         arg3 = arg4; | ||||
|       } | ||||
| #endif | ||||
|     } | ||||
|     return get_errno(ftruncate64(arg1, target_offset64(arg2, arg3))); | ||||
| } | ||||
| #endif | ||||
| @ -6857,20 +6862,16 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, | ||||
| #endif | ||||
| #ifdef TARGET_NR_pread | ||||
|     case TARGET_NR_pread: | ||||
| #ifdef TARGET_ARM | ||||
|         if (((CPUARMState *)cpu_env)->eabi) | ||||
|         if (regpairs_aligned(cpu_env)) | ||||
|             arg4 = arg5; | ||||
| #endif | ||||
|         if (!(p = lock_user(VERIFY_WRITE, arg2, arg3, 0))) | ||||
|             goto efault; | ||||
|         ret = get_errno(pread(arg1, p, arg3, arg4)); | ||||
|         unlock_user(p, arg2, ret); | ||||
|         break; | ||||
|     case TARGET_NR_pwrite: | ||||
| #ifdef TARGET_ARM | ||||
|         if (((CPUARMState *)cpu_env)->eabi) | ||||
|         if (regpairs_aligned(cpu_env)) | ||||
|             arg4 = arg5; | ||||
| #endif | ||||
|         if (!(p = lock_user(VERIFY_READ, arg2, arg3, 1))) | ||||
|             goto efault; | ||||
|         ret = get_errno(pwrite(arg1, p, arg3, arg4)); | ||||
| @ -7621,14 +7622,11 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, | ||||
| #ifdef TARGET_NR_readahead | ||||
|     case TARGET_NR_readahead: | ||||
| #if TARGET_ABI_BITS == 32 | ||||
| #ifdef TARGET_ARM | ||||
|         if (((CPUARMState *)cpu_env)->eabi) | ||||
|         { | ||||
|         if (regpairs_aligned(cpu_env)) { | ||||
|             arg2 = arg3; | ||||
|             arg3 = arg4; | ||||
|             arg4 = arg5; | ||||
|         } | ||||
| #endif | ||||
|         ret = get_errno(readahead(arg1, ((off64_t)arg3 << 32) | arg2, arg4)); | ||||
| #else | ||||
|         ret = get_errno(readahead(arg1, arg2, arg3)); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Riku Voipio
						Riku Voipio