From 95c747d9e71d4d385cfed0554c9dadfa76c44491 Mon Sep 17 00:00:00 2001 From: Gabriel Moyano Date: Fri, 20 May 2022 11:29:56 +0200 Subject: kern_tc.c: Replace FreeBSD event mechanism by adding pointers to function Update #2349. --- cpukit/include/sys/timepps.h | 24 ++++++++++++++++++++++++ cpukit/score/src/kern_tc.c | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/cpukit/include/sys/timepps.h b/cpukit/include/sys/timepps.h index 5703381ffa..2513298557 100644 --- a/cpukit/include/sys/timepps.h +++ b/cpukit/include/sys/timepps.h @@ -164,6 +164,30 @@ struct pps_state { int ppscap; struct timecounter *ppstc; unsigned ppscount[3]; +#ifdef __rtems__ + /** + * @brief Wait for an event. + * + * Called internally when time_pps_fetch() is used. + * It is initialized by pps_init() to a handler which just returns ETIMEDOUT. + * + * @param pps is the pointer to the object. + * + * @param timeout + * + * @retval 0 A wakeup event was received. + * + * @retval ETIMEDOUT A timeout occurred while waiting for the event. + */ + int (*wait)(struct pps_state *pps, struct timespec timeout); + + /** + * @brief Wakeup the tasks waiting for an event. + * + * @param pps is the pointer to the object. + */ + void (*wakeup)(struct pps_state *pps); +#endif /* __rtems__ */ /* * The following fields are valid if the driver calls pps_init_abi(). */ diff --git a/cpukit/score/src/kern_tc.c b/cpukit/score/src/kern_tc.c index f7d0a0b4ba..c22ce121a4 100644 --- a/cpukit/score/src/kern_tc.c +++ b/cpukit/score/src/kern_tc.c @@ -1917,9 +1917,15 @@ abi_aware(struct pps_state *pps, int vers) static int pps_fetch(struct pps_fetch_args *fapi, struct pps_state *pps) { +#ifndef __rtems__ int err, timo; +#else /* __rtems__ */ + int err; +#endif /* __rtems__ */ pps_seq_t aseq, cseq; +#ifndef __rtems__ struct timeval tv; +#endif /* __rtems__ */ if (fapi->tsformat && fapi->tsformat != PPS_TSFMT_TSPEC) return (EINVAL); @@ -1932,6 +1938,7 @@ pps_fetch(struct pps_fetch_args *fapi, struct pps_state *pps) * sleep a long time. */ if (fapi->timeout.tv_sec || fapi->timeout.tv_nsec) { +#ifndef __rtems__ if (fapi->timeout.tv_sec == -1) timo = 0x7fffffff; else { @@ -1939,10 +1946,12 @@ pps_fetch(struct pps_fetch_args *fapi, struct pps_state *pps) tv.tv_usec = fapi->timeout.tv_nsec / 1000; timo = tvtohz(&tv); } +#endif /* __rtems__ */ aseq = atomic_load_int(&pps->ppsinfo.assert_sequence); cseq = atomic_load_int(&pps->ppsinfo.clear_sequence); while (aseq == atomic_load_int(&pps->ppsinfo.assert_sequence) && cseq == atomic_load_int(&pps->ppsinfo.clear_sequence)) { +#ifndef __rtems__ if (abi_aware(pps, 1) && pps->driver_mtx != NULL) { if (pps->flags & PPSFLAG_MTX_SPIN) { err = msleep_spin(pps, pps->driver_mtx, @@ -1963,6 +1972,11 @@ pps_fetch(struct pps_fetch_args *fapi, struct pps_state *pps) } else if (err != 0) { return (err); } +#else /* __rtems__ */ + _Assert(pps->wait != NULL); + err = (*pps->wait)(pps, fapi->timeout); + return (err); +#endif /* __rtems__ */ } } @@ -2058,9 +2072,31 @@ pps_ioctl(u_long cmd, caddr_t data, struct pps_state *pps) } } +#ifdef __rtems__ +static int +default_wait(struct pps_state *pps, struct timespec timeout) +{ + + (void)pps; + (void)timeout; + + return (ETIMEDOUT); +} + +static void +default_wakeup(struct pps_state *pps) +{ + + (void)pps; +} +#endif /* __rtems__ */ void pps_init(struct pps_state *pps) { +#ifdef __rtems__ + pps->wait = default_wait; + pps->wakeup = default_wakeup; +#endif /* __rtems__ */ pps->ppscap |= PPS_TSFMT_TSPEC | PPS_CANWAIT; if (pps->ppscap & PPS_CAPTUREASSERT) pps->ppscap |= PPS_OFFSETASSERT; @@ -2227,7 +2263,12 @@ pps_event(struct pps_state *pps, int event) #endif /* Wakeup anyone sleeping in pps_fetch(). */ +#ifndef __rtems__ wakeup(pps); +#else /* __rtems__ */ + _Assert(pps->wakeup != NULL); + (*pps->wakeup)(pps); +#endif /* __rtems__ */ } #else /* __rtems__ */ /* FIXME: https://devel.rtems.org/ticket/2349 */ -- cgit v1.2.3