--- a/kern/mach_clock.c +++ b/kern/mach_clock.c @@ -69,6 +69,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_value_t monotonic = { 0, 0 }; /* time since bootup (uncorrected) */ unsigned long elapsed_ticks = 0; /* ticks elapsed since bootup */ int timedelta = 0; @@ -93,9 +94,9 @@ * We have to insert write fence operations.) FIXME */ -mapped_time_value_t *mtime = 0; +mapped_time_value_extended_t *mtime = 0; -#define update_mapped_time(time) \ +#define update_mapped_time(time, monotonic) \ MACRO_BEGIN \ if (mtime != 0) { \ mtime->check_seconds = (time)->seconds; \ @@ -103,6 +104,16 @@ mtime->microseconds = (time)->microseconds; \ asm volatile("":::"memory"); \ mtime->seconds = (time)->seconds; \ + asm volatile("":::"memory"); \ + mtime->clock_rt.seconds = (time)->seconds; \ + asm volatile("":::"memory"); \ + mtime->clock_rt.nanoseconds = \ + (time)->microseconds * 1000; \ + asm volatile("":::"memory"); \ + mtime->clock_mt.seconds = (monotonic)->seconds; \ + asm volatile("":::"memory"); \ + mtime->clock_mt.nanoseconds = \ + (monotonic)->microseconds * 1000; \ } \ MACRO_END @@ -219,6 +230,7 @@ */ if (timedelta == 0) { time_value_add_usec(&time, usec); + time_value_add_usec(&monotonic, usec); } else { register int delta; @@ -232,8 +244,9 @@ timedelta -= tickdelta; } time_value_add_usec(&time, delta); + time_value_add_usec(&monotonic, delta); } - update_mapped_time(&time); + update_mapped_time(&time, &monotonic); /* * Schedule soft-interupt for timeout if needed @@ -427,7 +440,7 @@ s = splhigh(); time = new_time; - update_mapped_time(&time); + update_mapped_time(&time, &monotonic); resettodr(); splx(s); @@ -498,7 +511,8 @@ != KERN_SUCCESS) panic("mapable_time_init"); memset(mtime, 0, PAGE_SIZE); - update_mapped_time(&time); + mtime->version = 1; + update_mapped_time(&time, &monotonic); } int timeopen()