Le 26/06/2020 à 14:46, Matus Kysel a écrit : > Refactoring ipc syscall for s390x and SPARC, so it matches glibc > implementation > > Signed-off-by: Matus Kysel <mky...@tachyum.com> > --- > linux-user/syscall.c | 26 +++++++++++++++++++++++++- > 1 file changed, 25 insertions(+), 1 deletion(-) > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index 97de9fb5c9..990412733b 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c > @@ -814,9 +814,14 @@ safe_syscall4(int, clock_nanosleep, const clockid_t, > clock, int, flags, > const struct timespec *, req, struct timespec *, rem) > #endif > #ifdef __NR_ipc > +#ifdef __s390x__ > +safe_syscall5(int, ipc, int, call, long, first, long, second, long, third, > + void *, ptr) > +#else > safe_syscall6(int, ipc, int, call, long, first, long, second, long, third, > void *, ptr, long, fifth) > #endif > +#endif > #ifdef __NR_msgsnd > safe_syscall4(int, msgsnd, int, msgid, const void *, msgp, size_t, sz, > int, flags) > @@ -4053,8 +4058,13 @@ static inline abi_long do_msgsnd(int msqid, abi_long > msgp, > #endif > #ifdef __NR_ipc > if (ret == -TARGET_ENOSYS) { > +#ifdef __s390x__ > + ret = get_errno(safe_ipc(IPCOP_msgsnd, msqid, msgsz, msgflg, > + host_mb)); > +#else > ret = get_errno(safe_ipc(IPCOP_msgsnd, msqid, msgsz, msgflg, > host_mb, 0)); > +#endif > } > #endif > g_free(host_mb); > @@ -4063,6 +4073,20 @@ static inline abi_long do_msgsnd(int msqid, abi_long > msgp, > return ret; > } > > +#ifdef __NR_ipc > +#if defined(__sparc__) > +/* SPARC for msgrcv it does not use the kludge on final 2 arguments. */ > +#define MSGRCV_ARGS(__msgp, __msgtyp) __msgp, __msgtyp > +#elif defined(__s390x__) > +/* The s390 sys_ipc variant has only five parameters. */ > +#define MSGRCV_ARGS(__msgp, __msgtyp) \ > + ((long int[]){(long int)__msgp, __msgtyp}) > +#else > +#define MSGRCV_ARGS(__msgp, __msgtyp) \ > + ((long int[]){(long int)__msgp, __msgtyp}), 0 > +#endif > +#endif > + > static inline abi_long do_msgrcv(int msqid, abi_long msgp, > ssize_t msgsz, abi_long msgtyp, > int msgflg) > @@ -4091,7 +4115,7 @@ static inline abi_long do_msgrcv(int msqid, abi_long > msgp, > #ifdef __NR_ipc > if (ret == -TARGET_ENOSYS) { > ret = get_errno(safe_ipc(IPCOP_CALL(1, IPCOP_msgrcv), msqid, msgsz, > - msgflg, host_mb, msgtyp)); > + msgflg, MSGRCV_ARGS(host_mb, msgtyp))); > } > #endif > >
This patch breaks build because there is safe_ipc() that is not updated to use only 5 arguments with s390x. This is updated in the next patch so the build in the end works, but it breaks bisect so you should fix that. Otherwise: Reviewed-by: Laurent Vivier <laur...@vivier.eu> Thanks, Laurent