#include <security/mac_framework.h>
#endif
#include <IOKit/IOBSD.h>
+#include <os/log.h>
typedef int64_t l_fp;
#define L_ADD(v, u) ((v) += (u))
static void refresh_ntp_loop(void);
static void start_ntp_loop(void);
+#if DEVELOPMENT || DEBUG
+uint32_t g_should_log_clock_adjustments = 0;
+SYSCTL_INT(_kern, OID_AUTO, log_clock_adjustments, CTLFLAG_RW | CTLFLAG_LOCKED, &g_should_log_clock_adjustments, 0, "enable kernel clock adjustment logging");
+#endif
+
static bool
ntp_is_time_error(int tsl)
{
NTP_UNLOCK(enable);
if (IS_64BIT_PROCESS(p)) {
- struct user64_ntptimeval user_ntv;
+ struct user64_ntptimeval user_ntv = {};
user_ntv.time.tv_sec = ntv.time.tv_sec;
user_ntv.time.tv_nsec = ntv.time.tv_nsec;
user_ntv.maxerror = ntv.maxerror;
user_ntv.time_state = ntv.time_state;
error = copyout(&user_ntv, uap->ntvp, sizeof(user_ntv));
} else {
- struct user32_ntptimeval user_ntv;
+ struct user32_ntptimeval user_ntv = {};
user_ntv.time.tv_sec = ntv.time.tv_sec;
user_ntv.time.tv_nsec = ntv.time.tv_nsec;
user_ntv.maxerror = ntv.maxerror;
if (error)
return (error);
+#if DEVELOPEMNT || DEBUG
+ if (g_should_log_clock_adjustments) {
+ os_log(OS_LOG_DEFAULT, "%s:BEFORE modes %u offset %ld freq %ld status %d constant %ld time_adjtime %lld\n",
+ __func__, ntv.modes, ntv.offset, ntv.freq, ntv.status, ntv.constant, time_adjtime);
+ }
+#endif
/*
* Update selected clock variables - only the superuser can
* change anything. Note that there is no error checking here on
ret = ntp_is_time_error(time_status) ? TIME_ERROR : time_state;
+#if DEVELOPEMNT || DEBUG
+ if (g_should_log_clock_adjustments) {
+ os_log(OS_LOG_DEFAULT, "%s:AFTER offset %lld freq %lld status %d constant %ld time_adjtime %lld\n",
+ __func__, time_offset, time_freq, time_status, time_constant, time_adjtime);
+ }
+#endif
+
/*
* Retrieve all clock variables. Note that the TAI offset is
* returned only by ntp_gettime();
*/
if (IS_64BIT_PROCESS(p)) {
- struct user64_timex user_ntv;
+ struct user64_timex user_ntv = {};
if (time_status & STA_NANO)
user_ntv.offset = L_GINT(time_offset);
}
else{
- struct user32_timex user_ntv;
+ struct user32_timex user_ntv = {};
if (time_status & STA_NANO)
user_ntv.offset = L_GINT(time_offset);
updated = 0;
}
+#if DEVELOPEMNT || DEBUG
+ if (g_should_log_clock_adjustments) {
+ int64_t nano = (time_adj > 0)? time_adj >> 32 : -((-time_adj) >> 32);
+ int64_t frac = (time_adj > 0)? ((uint32_t) time_adj) : -((uint32_t) (-time_adj));
+
+ os_log(OS_LOG_DEFAULT, "%s:AFTER offset %lld (%lld) freq %lld status %d "
+ "constant %ld time_adjtime %lld nano %lld frac %lld adj %lld\n",
+ __func__, time_offset, (time_offset > 0)? time_offset >> 32 : -((-time_offset) >> 32),
+ time_freq, time_status, time_constant, time_adjtime, nano, frac, time_adj);
+ }
+#endif
+
*adjustment = time_adj;
}
NTP_LOCK(enable);
ltr = time_adjtime;
time_adjtime = ltw;
+#if DEVELOPEMNT || DEBUG
+ if (g_should_log_clock_adjustments) {
+ os_log(OS_LOG_DEFAULT, "%s:AFTER offset %lld freq %lld status %d constant %ld time_adjtime %lld\n",
+ __func__, time_offset, time_freq, time_status, time_constant, time_adjtime);
+ }
+#endif
NTP_UNLOCK(enable);
atv.tv_sec = ltr / (int64_t)USEC_PER_SEC;
if (uap->olddelta) {
if (IS_64BIT_PROCESS(p)) {
- struct user64_timeval user_atv;
+ struct user64_timeval user_atv = {};
user_atv.tv_sec = atv.tv_sec;
user_atv.tv_usec = atv.tv_usec;
error = copyout(&user_atv, uap->olddelta, sizeof(user_atv));
} else {
- struct user32_timeval user_atv;
+ struct user32_timeval user_atv = {};
user_atv.tv_sec = atv.tv_sec;
user_atv.tv_usec = atv.tv_usec;
error = copyout(&user_atv, uap->olddelta, sizeof(user_atv));