diff --git a/arch/um/include/shared/os.h b/arch/um/include/shared/os.h index d824528..b386cee 100644 --- a/arch/um/include/shared/os.h +++ b/arch/um/include/shared/os.h @@ -244,6 +244,7 @@ extern int timer_one_shot(int ticks); extern long long disable_timer(void); extern void uml_idle_timer(void); extern long long os_nsecs(void); +extern long long os_nsecs_monotonic(void); /* skas/mem.c */ extern long run_syscall_stub(struct mm_id * mm_idp, diff --git a/arch/um/kernel/time.c b/arch/um/kernel/time.c index 117568d..399687c 100644 --- a/arch/um/kernel/time.c +++ b/arch/um/kernel/time.c @@ -67,7 +67,7 @@ static irqreturn_t um_timer(int irq, void *dev) static cycle_t itimer_read(struct clocksource *cs) { - return os_nsecs() / 1000; + return os_nsecs_monotonic() / 1000; } static struct clocksource itimer_clocksource = { diff --git a/arch/um/os-Linux/time.c b/arch/um/os-Linux/time.c index e9824d5..0ef8faa 100644 --- a/arch/um/os-Linux/time.c +++ b/arch/um/os-Linux/time.c @@ -79,6 +79,15 @@ long long os_nsecs(void) return timeval_to_ns(&tv); } +long long os_nsecs_monotonic(void) +{ + struct timespec tp; + + clock_gettime(CLOCK_MONOTONIC, &tp); + + return ((long long)tp.tv_sec * UM_NSEC_PER_SEC) + tp.tv_nsec; +} + #ifdef UML_CONFIG_NO_HZ_COMMON static int after_sleep_interval(struct timespec *ts) {