On 12.08.21 18:28, Florian Bezdeka wrote: > From: Song Chen <chensong_2...@189.cn> > > Add a syscall specific for mq_timedreceive64 with 64bit time_t. > > Signed-off-by: Song Chen <chensong_2...@189.cn> > [Florian: > - Reformat commit msg > - relocate code > - tracing > - fix syscall declarations > ] > Signed-off-by: Florian Bezdeka <florian.bezd...@siemens.com> > --- > > @Jan: This should replace 76607e1a7237 in next. Other patches of the > same series were not affected. > > Changes in v4: > - Fixed COBALT_SYSCALL vs. COBALT_SYSCALL_DECL > > include/cobalt/uapi/syscall.h | 1 + > kernel/cobalt/posix/mqueue.c | 28 +++++++++++++++++++++++++++- > kernel/cobalt/posix/mqueue.h | 10 ++++++++++ > kernel/cobalt/posix/syscall32.c | 8 ++++++++ > kernel/cobalt/posix/syscall32.h | 5 +++++ > kernel/cobalt/trace/cobalt-posix.h | 3 ++- > 6 files changed, 53 insertions(+), 2 deletions(-) > > diff --git a/include/cobalt/uapi/syscall.h b/include/cobalt/uapi/syscall.h > index 464e170cc..c27d6d044 100644 > --- a/include/cobalt/uapi/syscall.h > +++ b/include/cobalt/uapi/syscall.h > @@ -130,6 +130,7 @@ > #define sc_cobalt_clock_adjtime64 107 > #define sc_cobalt_mutex_timedlock64 108 > #define sc_cobalt_mq_timedsend64 109 > +#define sc_cobalt_mq_timedreceive64 110 > > #define __NR_COBALT_SYSCALLS 128 /* Power of 2 */ > > diff --git a/kernel/cobalt/posix/mqueue.c b/kernel/cobalt/posix/mqueue.c > index a1828919c..ebe7cf7b0 100644 > --- a/kernel/cobalt/posix/mqueue.c > +++ b/kernel/cobalt/posix/mqueue.c > @@ -629,7 +629,7 @@ redo: > ret = fetch_timeout(&ts, u_ts); > if (ret) > return ERR_PTR(ret); > - if (ts.tv_nsec >= ONE_BILLION) > + if (!timespec64_valid(&ts)) > return ERR_PTR(-EINVAL); > to = ts2ns(&ts) + 1; > tmode = XN_REALTIME; > @@ -1013,6 +1013,24 @@ fail: > return ret; > } > > +int __cobalt_mq_timedreceive64(mqd_t uqd, void __user *u_buf, > + ssize_t __user *u_len, > + unsigned int __user *u_prio, > + const void __user *u_ts) > +{ > + ssize_t len; > + int ret; > + > + ret = cobalt_copy_from_user(&len, u_len, sizeof(len)); > + if (ret) > + return ret; > + > + ret = __cobalt_mq_timedreceive(uqd, u_buf, &len, u_prio, u_ts, > + u_ts ? mq_fetch_timeout64 : NULL); > + > + return ret ?: cobalt_copy_to_user(u_len, &len, sizeof(*u_len)); > +} > + > COBALT_SYSCALL(mq_timedreceive, primary, > (mqd_t uqd, void __user *u_buf, > ssize_t __user *u_len, > @@ -1031,3 +1049,11 @@ COBALT_SYSCALL(mq_timedreceive, primary, > > return ret ?: cobalt_copy_to_user(u_len, &len, sizeof(*u_len)); > } > + > +COBALT_SYSCALL(mq_timedreceive64, primary, > + (mqd_t uqd, void __user *u_buf, ssize_t __user *u_len, > + unsigned int __user *u_prio, > + const struct __kernel_timespec __user *u_ts)) > +{ > + return __cobalt_mq_timedreceive64(uqd, u_buf, u_len, u_prio, u_ts); > +} > diff --git a/kernel/cobalt/posix/mqueue.h b/kernel/cobalt/posix/mqueue.h > index f16774a3b..b4b263158 100644 > --- a/kernel/cobalt/posix/mqueue.h > +++ b/kernel/cobalt/posix/mqueue.h > @@ -50,6 +50,11 @@ int __cobalt_mq_timedreceive(mqd_t uqd, void __user *u_buf, > int (*fetch_timeout)(struct timespec64 *ts, > const void __user *u_ts)); > > +int __cobalt_mq_timedreceive64(mqd_t uqd, void __user *u_buf, > + ssize_t __user *u_len, > + unsigned int __user *u_prio, > + const void __user *u_ts); > + > int __cobalt_mq_notify(mqd_t fd, const struct sigevent *evp); > > COBALT_SYSCALL_DECL(mq_open, > @@ -76,6 +81,11 @@ COBALT_SYSCALL_DECL(mq_timedreceive, > unsigned int __user *u_prio, > const struct __user_old_timespec __user *u_ts)); > > +COBALT_SYSCALL_DECL(mq_timedreceive64, > + (mqd_t uqd, void __user *u_buf, ssize_t __user *u_len, > + unsigned int __user *u_prio, > + const struct __kernel_timespec __user *u_ts)); > + > COBALT_SYSCALL_DECL(mq_notify, > (mqd_t fd, const struct sigevent *__user evp)); > > diff --git a/kernel/cobalt/posix/syscall32.c b/kernel/cobalt/posix/syscall32.c > index d3f87c246..d52be0207 100644 > --- a/kernel/cobalt/posix/syscall32.c > +++ b/kernel/cobalt/posix/syscall32.c > @@ -354,6 +354,14 @@ COBALT_SYSCALL32emu(mq_timedreceive, primary, > return ret ?: cobalt_copy_to_user(u_len, &clen, sizeof(*u_len)); > } > > +COBALT_SYSCALL32emu(mq_timedreceive64, primary, > + (mqd_t uqd, void __user *u_buf, ssize_t __user *u_len, > + unsigned int __user *u_prio, > + const struct __kernel_timespec __user *u_ts)) > +{ > + return __cobalt_mq_timedreceive64(uqd, u_buf, u_len, u_prio, u_ts); > +} > + > static inline int mq_fetch_timeout(struct timespec64 *ts, > const void __user *u_ts) > { > diff --git a/kernel/cobalt/posix/syscall32.h b/kernel/cobalt/posix/syscall32.h > index 0e552202e..006054e85 100644 > --- a/kernel/cobalt/posix/syscall32.h > +++ b/kernel/cobalt/posix/syscall32.h > @@ -132,6 +132,11 @@ COBALT_SYSCALL32emu_DECL(mq_timedreceive, > unsigned int __user *u_prio, > const struct old_timespec32 __user *u_ts)); > > +COBALT_SYSCALL32emu_DECL(mq_timedreceive64, > + (mqd_t uqd, void __user *u_buf, ssize_t __user *u_len, > + unsigned int __user *u_prio, > + const struct __kernel_timespec __user *u_ts)); > + > COBALT_SYSCALL32emu_DECL(mq_notify, > (mqd_t fd, const struct compat_sigevent *__user > u_cev)); > > diff --git a/kernel/cobalt/trace/cobalt-posix.h > b/kernel/cobalt/trace/cobalt-posix.h > index d67a6ce09..b046c8a0e 100644 > --- a/kernel/cobalt/trace/cobalt-posix.h > +++ b/kernel/cobalt/trace/cobalt-posix.h > @@ -162,7 +162,8 @@ > __cobalt_symbolic_syscall(clock_getres64), \ > __cobalt_symbolic_syscall(clock_adjtime64), \ > __cobalt_symbolic_syscall(mutex_timedlock64), \ > - __cobalt_symbolic_syscall(mq_timedsend64)) > + __cobalt_symbolic_syscall(mq_timedsend64), \ > + __cobalt_symbolic_syscall(mq_timedreceive64)) > > > DECLARE_EVENT_CLASS(cobalt_syscall_entry, >
Thanks, replaced in next. I've used that chance to convert the muqueue to an mqueue. ;) Doing a scan for this error pattern, I also found COBALT_SYSCALL(mutex_timedlock64, primary, (struct cobalt_mutex_shadow __user *u_mx, const struct __kernel_timespec __user *u_ts)); in kernel/cobalt/posix/mutex.h. Could you update "y2038: cobalt/posix/mutex: Adding mutex_timedlock64" as well? Thanks, Jan -- Siemens AG, T RDA IOT Corporate Competence Center Embedded Linux