Revision 48e515d4
b/linux-user/syscall.c | ||
---|---|---|
580 | 580 |
extern int setfsgid(int); |
581 | 581 |
extern int setgroups(int, gid_t *); |
582 | 582 |
|
583 |
/* ARM EABI and MIPS expect 64bit types aligned even on pairs or registers */ |
|
584 |
#ifdef TARGET_ARM |
|
585 |
static inline int regpairs_aligned(void *cpu_env) { |
|
586 |
return ((((CPUARMState *)cpu_env)->eabi) == 1) ; |
|
587 |
} |
|
588 |
#elif defined(TARGET_MIPS) |
|
589 |
static inline int regpairs_aligned(void *cpu_env) { return 1; } |
|
590 |
#else |
|
591 |
static inline int regpairs_aligned(void *cpu_env) { return 0; } |
|
592 |
#endif |
|
593 |
|
|
583 | 594 |
#define ERRNO_TABLE_SIZE 1200 |
584 | 595 |
|
585 | 596 |
/* target_to_host_errno_table[] is initialized from |
... | ... | |
4375 | 4386 |
abi_long arg3, |
4376 | 4387 |
abi_long arg4) |
4377 | 4388 |
{ |
4378 |
#ifdef TARGET_ARM |
|
4379 |
if (((CPUARMState *)cpu_env)->eabi) |
|
4380 |
{ |
|
4389 |
if (regpairs_aligned(cpu_env)) { |
|
4381 | 4390 |
arg2 = arg3; |
4382 | 4391 |
arg3 = arg4; |
4383 |
} |
|
4384 |
#endif |
|
4392 |
} |
|
4385 | 4393 |
return get_errno(truncate64(arg1, target_offset64(arg2, arg3))); |
4386 | 4394 |
} |
4387 | 4395 |
#endif |
... | ... | |
4392 | 4400 |
abi_long arg3, |
4393 | 4401 |
abi_long arg4) |
4394 | 4402 |
{ |
4395 |
#ifdef TARGET_ARM |
|
4396 |
if (((CPUARMState *)cpu_env)->eabi) |
|
4397 |
{ |
|
4403 |
if (regpairs_aligned(cpu_env)) { |
|
4398 | 4404 |
arg2 = arg3; |
4399 | 4405 |
arg3 = arg4; |
4400 |
} |
|
4401 |
#endif |
|
4406 |
} |
|
4402 | 4407 |
return get_errno(ftruncate64(arg1, target_offset64(arg2, arg3))); |
4403 | 4408 |
} |
4404 | 4409 |
#endif |
... | ... | |
6857 | 6862 |
#endif |
6858 | 6863 |
#ifdef TARGET_NR_pread |
6859 | 6864 |
case TARGET_NR_pread: |
6860 |
#ifdef TARGET_ARM |
|
6861 |
if (((CPUARMState *)cpu_env)->eabi) |
|
6865 |
if (regpairs_aligned(cpu_env)) |
|
6862 | 6866 |
arg4 = arg5; |
6863 |
#endif |
|
6864 | 6867 |
if (!(p = lock_user(VERIFY_WRITE, arg2, arg3, 0))) |
6865 | 6868 |
goto efault; |
6866 | 6869 |
ret = get_errno(pread(arg1, p, arg3, arg4)); |
6867 | 6870 |
unlock_user(p, arg2, ret); |
6868 | 6871 |
break; |
6869 | 6872 |
case TARGET_NR_pwrite: |
6870 |
#ifdef TARGET_ARM |
|
6871 |
if (((CPUARMState *)cpu_env)->eabi) |
|
6873 |
if (regpairs_aligned(cpu_env)) |
|
6872 | 6874 |
arg4 = arg5; |
6873 |
#endif |
|
6874 | 6875 |
if (!(p = lock_user(VERIFY_READ, arg2, arg3, 1))) |
6875 | 6876 |
goto efault; |
6876 | 6877 |
ret = get_errno(pwrite(arg1, p, arg3, arg4)); |
... | ... | |
7621 | 7622 |
#ifdef TARGET_NR_readahead |
7622 | 7623 |
case TARGET_NR_readahead: |
7623 | 7624 |
#if TARGET_ABI_BITS == 32 |
7624 |
#ifdef TARGET_ARM |
|
7625 |
if (((CPUARMState *)cpu_env)->eabi) |
|
7626 |
{ |
|
7625 |
if (regpairs_aligned(cpu_env)) { |
|
7627 | 7626 |
arg2 = arg3; |
7628 | 7627 |
arg3 = arg4; |
7629 | 7628 |
arg4 = arg5; |
7630 | 7629 |
} |
7631 |
#endif |
|
7632 | 7630 |
ret = get_errno(readahead(arg1, ((off64_t)arg3 << 32) | arg2, arg4)); |
7633 | 7631 |
#else |
7634 | 7632 |
ret = get_errno(readahead(arg1, arg2, arg3)); |
Also available in: Unified diff