On Thu, 2021-03-11 at 10:46 +0800, chensong wrote:
> Adding a new syscall clock_settime64 specific for timespec64,
> It can solve y2038 in below scenarios:
> 
> 1, 64bit kernel, y2038 safe
> 2, 32bit kernel, 32bit time_t, go to clock_settime, no break,
>    y2038 not safe.
> 3, 32bit kernel, 64bit time_t, go to clock_settime64 by the help
>    of libcobalt, no break, y2038 safe.
> 
> Signed-off-by: chensong <[email protected]>
> ---
>  include/cobalt/uapi/syscall.h |  1 +
>  kernel/cobalt/posix/clock.c   | 12 ++++++++++++
>  kernel/cobalt/posix/clock.h   |  4 ++++
>  3 files changed, 17 insertions(+)
> 
> diff --git a/include/cobalt/uapi/syscall.h b/include/cobalt/uapi/syscall.h
> index 8895d2b..291b550 100644
> --- a/include/cobalt/uapi/syscall.h
> +++ b/include/cobalt/uapi/syscall.h
> @@ -123,6 +123,7 @@
>  #define sc_cobalt_clock_adjtime                      100
>  #define sc_cobalt_thread_setschedprio                101
>  #define sc_cobalt_sem_timedwait64            102
> +#define sc_cobalt_clock_settime64            103

I assume we should keep the order of affected syscalls. The next one
would be sc_cobalt_clock_gettime64.

And I'm missing the tests... Please add tests for everything you add /
fix.

>  
> 
> 
> 
>  #define __NR_COBALT_SYSCALLS                 128 /* Power of 2 */
>  
> 
> 
> 
> diff --git a/kernel/cobalt/posix/clock.c b/kernel/cobalt/posix/clock.c
> index 6a47956..9643f8f 100644
> --- a/kernel/cobalt/posix/clock.c
> +++ b/kernel/cobalt/posix/clock.c
> @@ -23,6 +23,7 @@
>  #include "thread.h"
>  #include "clock.h"
>  #include <trace/events/cobalt-posix.h>
> +#include <cobalt/kernel/time.h>
>  
> 
> 
> 
>  static struct xnclock *external_clocks[COBALT_MAX_EXTCLOCKS];
>  
> 
> 
> 
> @@ -193,6 +194,17 @@ COBALT_SYSCALL(clock_settime, current,
>       return __cobalt_clock_settime(clock_id, &ts);
>  }
>  
> 
> 
> 
> +COBALT_SYSCALL(clock_settime64, current,
> +            (clockid_t clock_id, const struct __kernel_timespec __user 
> *u_ts))
> +{
> +     struct timespec64 ts64;
> +
> +     if (cobalt_get_timespec64(&ts64, u_ts))
> +             return -EFAULT;
> +
> +     return __cobalt_clock_settime(clock_id, &ts64);
> +}
> +
>  COBALT_SYSCALL(clock_adjtime, current,
>              (clockid_t clock_id, struct __user_old_timex __user *u_tx))
>  {
> diff --git a/kernel/cobalt/posix/clock.h b/kernel/cobalt/posix/clock.h
> index e69e76e..90f79fa 100644
> --- a/kernel/cobalt/posix/clock.h
> +++ b/kernel/cobalt/posix/clock.h
> @@ -119,6 +119,10 @@ COBALT_SYSCALL_DECL(clock_gettime,
>  COBALT_SYSCALL_DECL(clock_settime,
>                   (clockid_t clock_id, const struct __user_old_timespec 
> __user *u_ts));
>  
> 
> 
> 
> +COBALT_SYSCALL_DECL(clock_settime64,
> +                 (clockid_t clock_id,
> +                      const struct __kernel_timespec __user *u_ts));
> +
>  COBALT_SYSCALL_DECL(clock_adjtime,
>                   (clockid_t clock_id, struct __user_old_timex __user *u_tx));
>  

Reply via email to