On 13.08.21 08:53, Jan Kiszka via Xenomai wrote:
> 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?
> 

Looking at the diff, it's really just macro, so I already fixed this up
myself.

Jan

-- 
Siemens AG, T RDA IOT
Corporate Competence Center Embedded Linux

Reply via email to