diff options
author | Flavio Cruz <flaviocruz@gmail.com> | 2023-01-03 00:41:42 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2023-01-03 00:43:04 +0100 |
commit | d7348c94453d2662affecbb7605047044898ed19 (patch) | |
tree | bde2413d0cfb14962f8f543ad96765a445920908 /kern | |
parent | 276f997fd7a51385829fec6d460d0a588b0bad7c (diff) | |
download | gnumach-d7348c94453d2662affecbb7605047044898ed19.tar.gz gnumach-d7348c94453d2662affecbb7605047044898ed19.tar.bz2 gnumach-d7348c94453d2662affecbb7605047044898ed19.zip |
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.c | 30 | ||||
-rw-r--r-- | kern/mach_clock.h | 1 |
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 *); |