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. The "int-ness" of this argument is retained for all other system calls via an explicit cast.
Signed-off-by: Tom Musta <tommu...@gmail.com> diff --git a/linux-user/syscall.c b/linux-user/syscall.c index fb03e96..bf6dd1e 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -3122,7 +3122,7 @@ static inline abi_long do_shmdt(abi_ulong shmaddr) /* ??? This only works with linear mappings. */ /* do_ipc() must return target values and target errnos. */ static abi_long do_ipc(unsigned int call, int first, - int second, int third, + int second, abi_long third, abi_long ptr, abi_long fifth) { int version; @@ -3137,7 +3137,7 @@ static abi_long do_ipc(unsigned int call, int first, break; case IPCOP_semget: - ret = get_errno(semget(first, second, third)); + ret = get_errno(semget(first, second, (int)third)); break; case IPCOP_semctl: { @@ -3145,7 +3145,7 @@ static abi_long do_ipc(unsigned int call, int first, * ptr argument. */ abi_ulong atptr; get_user_ual(atptr, (abi_ulong)ptr); - ret = do_semctl(first, second, third, + ret = do_semctl(first, second, (int)third, (union target_semun)(abi_ulong) atptr); break; } @@ -3155,7 +3155,7 @@ static abi_long do_ipc(unsigned int call, int first, break; case IPCOP_msgsnd: - ret = do_msgsnd(first, ptr, second, third); + ret = do_msgsnd(first, ptr, second, (int)third); break; case IPCOP_msgctl: @@ -3176,13 +3176,14 @@ static abi_long do_ipc(unsigned int call, int first, break; } - ret = do_msgrcv(first, tswapal(tmp->msgp), second, tswapal(tmp->msgtyp), third); + ret = do_msgrcv(first, tswapal(tmp->msgp), second, + tswapal(tmp->msgtyp), (int)third); unlock_user_struct(tmp, ptr, 0); break; } default: - ret = do_msgrcv(first, ptr, second, fifth, third); + ret = do_msgrcv(first, ptr, second, fifth, (int)third); } break; @@ -3209,7 +3210,7 @@ static abi_long do_ipc(unsigned int call, int first, case IPCOP_shmget: /* IPC_* flag values are the same on all linux platforms */ - ret = get_errno(shmget(first, second, third)); + ret = get_errno(shmget(first, second, (int)third)); break; /* IPC_* and SHM_* command values are the same on all linux platforms */ -- 1.7.1