From a2c29e8abf4de587fe12ca0b37ce6f65a52efbc6 Mon Sep 17 00:00:00 2001 From: NAKAMURA Gou Date: Mon, 28 Mar 2016 22:28:09 +0900 Subject: [PATCH] correct the value of tod_data.origin tod_data.origin should hold a time when TSC is zero. --- kernel/init.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/kernel/init.c b/kernel/init.c index 5cd1da0d..d48f21fa 100644 --- a/kernel/init.c +++ b/kernel/init.c @@ -208,6 +208,7 @@ static void time_init(void) { unsigned long tv_sec, tv_nsec; unsigned long ns_per_kclock; + unsigned long tsc; ihk_mc_get_boot_time(&tv_sec, &tv_nsec); ns_per_kclock = ihk_mc_get_ns_per_tsc(); @@ -217,6 +218,15 @@ static void time_init(void) if (ns_per_kclock) { tod_data.clocks_per_sec = (1000L * NS_PER_SEC) / ns_per_kclock; + + tsc = rdtsc(); + tod_data.origin.tv_sec -= tsc / tod_data.clocks_per_sec; + tod_data.origin.tv_nsec -= NS_PER_SEC * (tsc % tod_data.clocks_per_sec) + / tod_data.clocks_per_sec; + if (tod_data.origin.tv_nsec < 0) { + --tod_data.origin.tv_sec; + tod_data.origin.tv_nsec += NS_PER_SEC; + } } if (!ns_per_kclock) {