diff --git a/sys/kern/kern_time.c b/sys/kern/kern_time.c --- a/sys/kern/kern_time.c +++ b/sys/kern/kern_time.c @@ -504,24 +504,27 @@ sbintime_t sbt, sbtt, prec, tmp; time_t over; int error; - bool is_abs_real; + bool is_abs_real, precise; if (rqt->tv_nsec < 0 || rqt->tv_nsec >= NS_PER_SEC) return (EINVAL); if ((flags & ~TIMER_ABSTIME) != 0) return (EINVAL); + precise = false; switch (clock_id) { case CLOCK_REALTIME: case CLOCK_REALTIME_PRECISE: + precise = true; case CLOCK_REALTIME_FAST: case CLOCK_SECOND: is_abs_real = (flags & TIMER_ABSTIME) != 0; break; case CLOCK_MONOTONIC: - case CLOCK_MONOTONIC_PRECISE: - case CLOCK_MONOTONIC_FAST: case CLOCK_UPTIME: + case CLOCK_MONOTONIC_PRECISE: case CLOCK_UPTIME_PRECISE: + precise = true; + case CLOCK_MONOTONIC_FAST: case CLOCK_UPTIME_FAST: is_abs_real = false; break; @@ -553,8 +556,7 @@ } else over = 0; tmp = tstosbt(ts); - prec = tmp; - prec >>= tc_precexp; + prec = precise ? 0 : tmp >> tc_precexp; if (TIMESEL(&sbt, tmp)) sbt += tc_tick_sbt; sbt += tmp;