Date: Sat, 20 Jul 2013 14:40:01 GMT From: Konstantin Belousov <kostikbel@gmail.com> To: freebsd-threads@FreeBSD.org Subject: Re: threads/180652: compat32 problem in clock_getcpuclockid2 Message-ID: <201307201440.r6KEe1YI056658@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR threads/180652; it has been noted by GNATS. From: Konstantin Belousov <kostikbel@gmail.com> To: Petr Salinger <Petr.Salinger@seznam.cz> Cc: freebsd-gnats-submit@FreeBSD.org Subject: Re: threads/180652: compat32 problem in clock_getcpuclockid2 Date: Sat, 20 Jul 2013 17:36:26 +0300 --ofoyOKZR33MYzbeX Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Sat, Jul 20, 2013 at 03:26:06PM +0200, Petr Salinger wrote: > It looks like the only remaining missing part of compat32 interfaces > (covered by our eglibc testsuite) is ktimer_*() family, used for > http://pubs.opengroup.org/onlinepubs/9699919799/functions/timer_gettime.h= tml Try this. Could you provide me with the isolated test case for timer_* functions ? commit 20bc0c0e4343307a4d24a1812c5cd546aa18b1da Author: Konstantin Belousov <kib@freebsd.org> Date: Sat Jul 20 17:31:39 2013 +0300 Implement compat32 for ktimer_*. diff --git a/sys/compat/freebsd32/freebsd32.h b/sys/compat/freebsd32/freebs= d32.h index a95b0e5..9b04965 100644 --- a/sys/compat/freebsd32/freebsd32.h +++ b/sys/compat/freebsd32/freebsd32.h @@ -69,6 +69,15 @@ struct timespec32 { CP((src).fld,(dst).fld,tv_nsec); \ } while (0) =20 +struct itimerspec32 { + struct timespec32 it_interval; + struct timespec32 it_value; +}; +#define ITS_CP(src, dst) do { \ + TS_CP((src), (dst), it_interval); \ + TS_CP((src), (dst), it_value); \ +} while (0) + struct rusage32 { struct timeval32 ru_utime; struct timeval32 ru_stime; diff --git a/sys/compat/freebsd32/freebsd32_misc.c b/sys/compat/freebsd32/f= reebsd32_misc.c index cfcd83b..4136ba9 100644 --- a/sys/compat/freebsd32/freebsd32_misc.c +++ b/sys/compat/freebsd32/freebsd32_misc.c @@ -2332,6 +2332,43 @@ freebsd32_clock_getres(struct thread *td, } =20 int +freebsd32_ktimer_settime(struct thread *td, + struct freebsd32_ktimer_settime_args *uap) +{ + struct itimerspec32 val32, oval32; + struct itimerspec val, oval, *ovalp; + int error; + + error =3D copyin(uap->value, &val32, sizeof(val32)); + if (error !=3D 0) + return (error); + ITS_CP(val32, val); + ovalp =3D uap->ovalue !=3D NULL ? &oval : NULL; + error =3D kern_ktimer_settime(td, uap->timerid, uap->flags, &val, ovalp); + if (error =3D=3D 0 && uap->ovalue !=3D NULL) { + ITS_CP(oval, oval32); + error =3D copyout(&oval32, uap->ovalue, sizeof(oval32)); + } + return (error); +} + +int +freebsd32_ktimer_gettime(struct thread *td, + struct freebsd32_ktimer_gettime_args *uap) +{ + struct itimerspec32 val32; + struct itimerspec val; + int error; + + error =3D kern_ktimer_gettime(td, uap->timerid, &val); + if (error =3D=3D 0) { + ITS_CP(val, val32); + error =3D copyout(&val32, uap->value, sizeof(val32)); + } + return (error); +} + +int freebsd32_clock_getcpuclockid2(struct thread *td, struct freebsd32_clock_getcpuclockid2_args *uap) { diff --git a/sys/compat/freebsd32/syscalls.master b/sys/compat/freebsd32/sy= scalls.master index 6cb649f..6d3ea7c 100644 --- a/sys/compat/freebsd32/syscalls.master +++ b/sys/compat/freebsd32/syscalls.master @@ -441,11 +441,16 @@ const struct timespec32 *tp); } 234 AUE_NULL STD { int freebsd32_clock_getres(clockid_t clock_id, \ struct timespec32 *tp); } -235 AUE_NULL UNIMPL timer_create -236 AUE_NULL UNIMPL timer_delete -237 AUE_NULL UNIMPL timer_settime -238 AUE_NULL UNIMPL timer_gettime -239 AUE_NULL UNIMPL timer_getoverrun +235 AUE_NULL NOPROTO { int ktimer_create(clockid_t clock_id, \ + struct sigevent *evp, int *timerid); } +236 AUE_NULL NOPROTO { int ktimer_delete(int timerid); } +237 AUE_NULL STD { int freebsd32_ktimer_settime(int timerid,\ + int flags, \ + const struct itimerspec32 *value, \ + struct itimerspec32 *ovalue); } +238 AUE_NULL STD { int freebsd32_ktimer_gettime(int timerid,\ + struct itimerspec32 *value); } +239 AUE_NULL NOPROTO { int ktimer_getoverrun(int timerid); } 240 AUE_NULL STD { int freebsd32_nanosleep( \ const struct timespec32 *rqtp, \ struct timespec32 *rmtp); } diff --git a/sys/kern/kern_time.c b/sys/kern/kern_time.c index 6b908a0..8703a11 100644 --- a/sys/kern/kern_time.c +++ b/sys/kern/kern_time.c @@ -1271,35 +1271,40 @@ struct ktimer_settime_args { int sys_ktimer_settime(struct thread *td, struct ktimer_settime_args *uap) { - struct proc *p =3D td->td_proc; - struct itimer *it; struct itimerspec val, oval, *ovalp; int error; =20 error =3D copyin(uap->value, &val, sizeof(val)); if (error !=3D 0) return (error); -=09 - if (uap->ovalue !=3D NULL) - ovalp =3D &oval; - else - ovalp =3D NULL; + ovalp =3D uap->ovalue !=3D NULL ? &oval : NULL; + error =3D kern_ktimer_settime(td, uap->timerid, uap->flags, &val, ovalp); + if (error =3D=3D 0 && uap->ovalue !=3D NULL) + error =3D copyout(ovalp, uap->ovalue, sizeof(*ovalp)); + return (error); +} + +int +kern_ktimer_settime(struct thread *td, int timer_id, int flags, + struct itimerspec *val, struct itimerspec *oval) +{ + struct proc *p; + struct itimer *it; + int error; =20 + p =3D td->td_proc; PROC_LOCK(p); - if (uap->timerid < 3 || - (it =3D itimer_find(p, uap->timerid)) =3D=3D NULL) { + if (timer_id < 3 || (it =3D itimer_find(p, timer_id)) =3D=3D NULL) { PROC_UNLOCK(p); error =3D EINVAL; } else { PROC_UNLOCK(p); itimer_enter(it); - error =3D CLOCK_CALL(it->it_clockid, timer_settime, - (it, uap->flags, &val, ovalp)); + error =3D CLOCK_CALL(it->it_clockid, timer_settime, (it, + flags, val, oval)); itimer_leave(it); ITIMER_UNLOCK(it); } - if (error =3D=3D 0 && uap->ovalue !=3D NULL) - error =3D copyout(ovalp, uap->ovalue, sizeof(*ovalp)); return (error); } =20 @@ -1312,26 +1317,34 @@ struct ktimer_gettime_args { int sys_ktimer_gettime(struct thread *td, struct ktimer_gettime_args *uap) { - struct proc *p =3D td->td_proc; - struct itimer *it; struct itimerspec val; int error; =20 + error =3D kern_ktimer_gettime(td, uap->timerid, &val); + if (error =3D=3D 0) + error =3D copyout(&val, uap->value, sizeof(val)); + return (error); +} + +int +kern_ktimer_gettime(struct thread *td, int timer_id, struct itimerspec *va= l) +{ + struct proc *p; + struct itimer *it; + int error; + + p =3D td->td_proc; PROC_LOCK(p); - if (uap->timerid < 3 || - (it =3D itimer_find(p, uap->timerid)) =3D=3D NULL) { + if (timer_id < 3 || (it =3D itimer_find(p, timer_id)) =3D=3D NULL) { PROC_UNLOCK(p); error =3D EINVAL; } else { PROC_UNLOCK(p); itimer_enter(it); - error =3D CLOCK_CALL(it->it_clockid, timer_gettime, - (it, &val)); + error =3D CLOCK_CALL(it->it_clockid, timer_gettime, (it, val)); itimer_leave(it); ITIMER_UNLOCK(it); } - if (error =3D=3D 0) - error =3D copyout(&val, uap->value, sizeof(val)); return (error); } =20 diff --git a/sys/sys/syscallsubr.h b/sys/sys/syscallsubr.h index 75278c3..4ed38b3 100644 --- a/sys/sys/syscallsubr.h +++ b/sys/sys/syscallsubr.h @@ -228,6 +228,10 @@ int kern_symlink(struct thread *td, char *path, char *= link, enum uio_seg segflg); int kern_symlinkat(struct thread *td, char *path1, int fd, char *path2, enum uio_seg segflg); +int kern_ktimer_settime(struct thread *td, int timer_id, int flags, + struct itimerspec *val, struct itimerspec *oval); +int kern_ktimer_gettime(struct thread *td, int timer_id, + struct itimerspec *val); int kern_thr_new(struct thread *td, struct thr_param *param); int kern_thr_suspend(struct thread *td, struct timespec *tsp); int kern_truncate(struct thread *td, char *path, enum uio_seg pathseg, --ofoyOKZR33MYzbeX Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.20 (FreeBSD) iQIcBAEBAgAGBQJR6qBqAAoJEJDCuSvBvK1BXIEP/2LMSizL9cYmu6TSo3dvTWqr ICOuzscpUHr1gJSOLVNimN6vdJVRbKPaWE4xW7QjxFYJYmkOfshuBW6kswstONXS Wctk8MmyICW1IhB48QFB3POGeo/qST1OQfXC9lNYcpsPmZT1B03zEKbJuZHDWUO7 MH7XLABc0+kR6aPIqhGQoEepn0okZLNvlbjG0rEBJ67SZjCMI6024pucn+J78I05 7vZOyTvWG8GRn9T/vCGsfKkkcYY6HnYwmEXTRhd5zR1HSufJIx2VCjuU6CRca1Uq o8x4IC7PXOtfMzXIZrbnVUJXnJR3wTHRAOJSdi+KM2aHhP6BRFY64v22ui5ITcBo yJ01k8aGQVn57WNh6rpnraYJ2gfJxyCxczSVBTk1y8eeNqRHli+56dUkvYld6+ZP mggoCmTuAPF7Dd9SmwtUuA18h98Nkf5BNyBbsCmAqAA0oT71vyPjc9ZVem5zUM5k tsorkrz/HyJWK5KiMFmdkD1l4cxJueIyb2e/QCMz3RraemfWPHaaO69FiERCVyeF Txuhq5bZEgaLxB1MdxWRpuR9Xhu5gesgJNH3gxARehaS1+P5oASc5/tSdq2tdH6x sMQ0rDhDMDuBfFO43HrXKDgHcmwfTEwmEIeCqiM+H1HCXIJ2w4DVWC+2MkHHR3Yt hf/ZkZtPbEU5LWwzeZDc =PNhX -----END PGP SIGNATURE----- --ofoyOKZR33MYzbeX--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201307201440.r6KEe1YI056658>