linux-user: Make ipc syscall's third argument an abi_long

For those target ABIs that use the ipc system call (e.g. POWER),
the third argument is used in the shmat path as a pointer.  It
therefore must be declared as an abi_long (versus int) so that
the address bits are not lost in truncation.  In fact, all arguments
to do_ipc should be declared as abit_long.

In fact, it makes more sense for all of the arguments to be declaried
as abi_long (except call).

Signed-off-by: Tom Musta <tommusta@gmail.com>
Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
This commit is contained in:
Tom Musta 2014-08-12 13:53:35 -05:00 committed by Riku Voipio
parent 5464baecf5
commit 37ed09560c

View File

@ -3130,8 +3130,8 @@ static inline abi_long do_shmdt(abi_ulong shmaddr)
#ifdef TARGET_NR_ipc #ifdef TARGET_NR_ipc
/* ??? This only works with linear mappings. */ /* ??? This only works with linear mappings. */
/* do_ipc() must return target values and target errnos. */ /* do_ipc() must return target values and target errnos. */
static abi_long do_ipc(unsigned int call, int first, static abi_long do_ipc(unsigned int call, abi_long first,
int second, int third, abi_long second, abi_long third,
abi_long ptr, abi_long fifth) abi_long ptr, abi_long fifth)
{ {
int version; int version;
@ -3153,9 +3153,9 @@ static abi_long do_ipc(unsigned int call, int first,
/* The semun argument to semctl is passed by value, so dereference the /* The semun argument to semctl is passed by value, so dereference the
* ptr argument. */ * ptr argument. */
abi_ulong atptr; abi_ulong atptr;
get_user_ual(atptr, (abi_ulong)ptr); get_user_ual(atptr, ptr);
ret = do_semctl(first, second, third, ret = do_semctl(first, second, third,
(union target_semun)(abi_ulong) atptr); (union target_semun) atptr);
break; break;
} }