diff --git a/repos/libports/src/lib/libc/clock_gettime.cc b/repos/libports/src/lib/libc/clock_gettime.cc index 8e73b4532..ab253debc 100644 --- a/repos/libports/src/lib/libc/clock_gettime.cc +++ b/repos/libports/src/lib/libc/clock_gettime.cc @@ -16,13 +16,25 @@ #include +namespace Libc { +extern time_t read_rtc(); +} + extern "C" __attribute__((weak)) int clock_gettime(clockid_t clk_id, struct timespec *tp) { + static bool read_rtc = false; + static time_t rtc = 0; + + if (!read_rtc) { + rtc = Libc::read_rtc(); + read_rtc = true; + } + Genode::Alarm::Time time = Genode::Timeout_thread::alarm_timer()->time(); if (tp) { - tp->tv_sec = time / 1000; + tp->tv_sec = rtc + time / 1000; tp->tv_nsec = (time % 1000) * (1000 * 1000); } diff --git a/repos/libports/src/lib/libc/gettimeofday.cc b/repos/libports/src/lib/libc/gettimeofday.cc index 7274dba48..1e856086d 100644 --- a/repos/libports/src/lib/libc/gettimeofday.cc +++ b/repos/libports/src/lib/libc/gettimeofday.cc @@ -15,13 +15,25 @@ #include +namespace Libc { +extern time_t read_rtc(); +} + extern "C" __attribute__((weak)) int gettimeofday(struct timeval *tv, struct timezone *tz) { + static bool read_rtc = false; + static time_t rtc = 0; + + if (!read_rtc) { + rtc = Libc::read_rtc(); + read_rtc = true; + } + Genode::Alarm::Time time = Genode::Timeout_thread::alarm_timer()->time(); if (tv) { - tv->tv_sec = time / 1000; + tv->tv_sec = rtc + time / 1000; tv->tv_usec = (time % 1000) * 1000; }