git: ad5e9b986753 - stable/13 - linux(4): Implement timer_settime64 syscall.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 17 Jun 2022 19:39:41 UTC
The branch stable/13 has been updated by dchagin: URL: https://cgit.FreeBSD.org/src/commit/?id=ad5e9b9867539c6058e13b0054b9a0c5f2789aa1 commit ad5e9b9867539c6058e13b0054b9a0c5f2789aa1 Author: Dmitry Chagin <dchagin@FreeBSD.org> AuthorDate: 2022-05-04 10:06:49 +0000 Commit: Dmitry Chagin <dchagin@FreeBSD.org> CommitDate: 2022-06-17 19:34:26 +0000 linux(4): Implement timer_settime64 syscall. MFC after: 2 weeks (cherry picked from commit a1fd2911ddb06c1a2d23ebb636a46bc20ca498e7) --- sys/amd64/linux32/linux32_dummy_machdep.c | 1 - sys/compat/linux/linux_timer.c | 44 +++++++++++++++++++++++++++---- sys/i386/linux/linux_dummy_machdep.c | 1 - 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/sys/amd64/linux32/linux32_dummy_machdep.c b/sys/amd64/linux32/linux32_dummy_machdep.c index d6e4d89d573a..7dbc3352b07d 100644 --- a/sys/amd64/linux32/linux32_dummy_machdep.c +++ b/sys/amd64/linux32/linux32_dummy_machdep.c @@ -68,7 +68,6 @@ DUMMY(mq_getsetattr); DUMMY(arch_prctl); /* Linux 5.0: */ DUMMY(clock_adjtime64); -DUMMY(timer_settime64); DUMMY(timerfd_gettime64); DUMMY(timerfd_settime64); DUMMY(io_pgetevents_time64); diff --git a/sys/compat/linux/linux_timer.c b/sys/compat/linux/linux_timer.c index 83c099fbc800..3e844704f132 100644 --- a/sys/compat/linux/linux_timer.c +++ b/sys/compat/linux/linux_timer.c @@ -123,20 +123,54 @@ linux_timer_settime(struct thread *td, struct linux_timer_settime_args *uap) { struct l_itimerspec l_val, l_oval; struct itimerspec val, oval, *ovalp; - int error; + int flags, error; + + error = copyin(uap->new, &l_val, sizeof(l_val)); + if (error != 0) + return (error); + error = linux_to_native_itimerspec(&val, &l_val); + if (error != 0) + return (error); + ovalp = uap->old != NULL ? &oval : NULL; + error = linux_to_native_timerflags(&flags, uap->flags); + if (error != 0) + return (error); + error = kern_ktimer_settime(td, uap->timerid, flags, &val, ovalp); + if (error == 0 && uap->old != NULL) { + error = native_to_linux_itimerspec(&l_val, &val); + if (error == 0) + error = copyout(&l_oval, uap->old, sizeof(l_oval)); + } + return (error); +} + +#if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32)) +int +linux_timer_settime64(struct thread *td, struct linux_timer_settime64_args *uap) +{ + struct l_itimerspec64 l_val, l_oval; + struct itimerspec val, oval, *ovalp; + int flags, error; error = copyin(uap->new, &l_val, sizeof(l_val)); if (error != 0) return (error); - ITS_CP(l_val, val); + error = linux_to_native_itimerspec64(&val, &l_val); + if (error != 0) + return (error); ovalp = uap->old != NULL ? &oval : NULL; - error = kern_ktimer_settime(td, uap->timerid, uap->flags, &val, ovalp); + error = linux_to_native_timerflags(&flags, uap->flags); + if (error != 0) + return (error); + error = kern_ktimer_settime(td, uap->timerid, flags, &val, ovalp); if (error == 0 && uap->old != NULL) { - ITS_CP(oval, l_oval); - error = copyout(&l_oval, uap->old, sizeof(l_oval)); + error = native_to_linux_itimerspec64(&l_val, &val); + if (error == 0) + error = copyout(&l_oval, uap->old, sizeof(l_oval)); } return (error); } +#endif int linux_timer_gettime(struct thread *td, struct linux_timer_gettime_args *uap) diff --git a/sys/i386/linux/linux_dummy_machdep.c b/sys/i386/linux/linux_dummy_machdep.c index 57edba56004f..f4280da8df16 100644 --- a/sys/i386/linux/linux_dummy_machdep.c +++ b/sys/i386/linux/linux_dummy_machdep.c @@ -70,7 +70,6 @@ DUMMY(vm86old); DUMMY(arch_prctl); /* Linux 5.0: */ DUMMY(clock_adjtime64); -DUMMY(timer_settime64); DUMMY(timerfd_gettime64); DUMMY(timerfd_settime64); DUMMY(io_pgetevents_time64);