summaryrefslogtreecommitdiff
path: root/kern
diff options
context:
space:
mode:
authorFlavio Cruz <flaviocruz@gmail.com>2023-01-03 00:41:42 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2023-01-03 00:43:04 +0100
commitd7348c94453d2662affecbb7605047044898ed19 (patch)
treebde2413d0cfb14962f8f543ad96765a445920908 /kern
parent276f997fd7a51385829fec6d460d0a588b0bad7c (diff)
Introduce time_value64_t to keep track of real time in the kernel
time_value64_t uses int64_t to track seconds and nanoseconds and hence is Y2038 proof. It does not have nano second resolution but it could be provided in the future. Removed include/sys/time.h as it remaps time_value_t into timeval which can create confusion. The timestamp from keyboard and mouse events is no longer set and replaced with rpc_time_value for better compatibility.
Diffstat (limited to 'kern')
-rw-r--r--kern/mach_clock.c30
-rw-r--r--kern/mach_clock.h1
2 files changed, 16 insertions, 15 deletions
diff --git a/kern/mach_clock.c b/kern/mach_clock.c
index ad986c64..7383684b 100644
--- a/kern/mach_clock.c
+++ b/kern/mach_clock.c
@@ -55,7 +55,6 @@
#include <kern/timer.h>
#include <kern/priority.h>
#include <vm/vm_kern.h>
-#include <sys/time.h>
#include <machine/mach_param.h> /* HZ */
#include <machine/machspl.h>
#include <machine/model_dep.h>
@@ -66,7 +65,7 @@
int hz = HZ; /* number of ticks per second */
int tick = (1000000 / HZ); /* number of usec per tick */
-time_value_t time = { 0, 0 }; /* time since bootup (uncorrected) */
+time_value64_t time = { 0, 0 }; /* time since bootup (uncorrected) */
unsigned long elapsed_ticks = 0; /* ticks elapsed since bootup */
int timedelta = 0;
@@ -93,15 +92,15 @@ unsigned bigadj = 1000000; /* adjust 10*tickadj if adjustment
volatile mapped_time_value_t *mtime = 0;
-#define update_mapped_time(time) \
-MACRO_BEGIN \
- if (mtime != 0) { \
- mtime->check_seconds = (time)->seconds; \
- __sync_synchronize(); \
- mtime->microseconds = (time)->microseconds; \
- __sync_synchronize(); \
- mtime->seconds = (time)->seconds; \
- } \
+#define update_mapped_time(time) \
+MACRO_BEGIN \
+ if (mtime != 0) { \
+ mtime->check_seconds = (time)->seconds; \
+ __sync_synchronize(); \
+ mtime->microseconds = (time)->nanoseconds / 1000; \
+ __sync_synchronize(); \
+ mtime->seconds = (time)->seconds; \
+ } \
MACRO_END
#define read_mapped_time(time) \
@@ -226,7 +225,7 @@ void clock_interrupt(
* Increment the time-of-day clock.
*/
if (timedelta == 0) {
- time_value_add_usec(&time, usec);
+ time_value64_add_usec(&time, usec);
}
else {
int delta;
@@ -247,7 +246,7 @@ void clock_interrupt(
delta = usec + tickdelta;
timedelta -= tickdelta;
}
- time_value_add_usec(&time, delta);
+ time_value64_add_usec(&time, delta);
}
update_mapped_time(&time);
@@ -401,7 +400,7 @@ struct time_value clock_boottime_offset;
static void
clock_boottime_update(struct time_value *new_time)
{
- struct time_value delta = time;
+ struct time_value delta = {.seconds = time.seconds, .microseconds = time.nanoseconds / 1000};
time_value_sub(&delta, new_time);
time_value_add(&clock_boottime_offset, &delta);
}
@@ -464,7 +463,8 @@ host_set_time(const host_t host, time_value_t new_time)
s = splhigh();
clock_boottime_update(&new_time);
- time = new_time;
+ time.seconds = new_time.seconds;
+ time.nanoseconds = new_time.microseconds * 1000;
update_mapped_time(&time);
resettodr();
splx(s);
diff --git a/kern/mach_clock.h b/kern/mach_clock.h
index 977b43be..903492e6 100644
--- a/kern/mach_clock.h
+++ b/kern/mach_clock.h
@@ -40,6 +40,7 @@ extern unsigned long elapsed_ticks; /* number of ticks elapsed since bootup */
extern int hz; /* number of ticks per second */
extern int tick; /* number of usec per tick */
+extern time_value64_t time; /* time since bootup (uncorrected) */
typedef void timer_func_t(void *);