From 83193830480648749814c15357897bd94229e656 Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Sun, 27 May 2018 00:15:13 +0100 Subject: [PATCH] provide microseconds to gettimeofday --- nx/source/runtime/init.c | 3 +++ nx/source/runtime/newlib.c | 27 +++++++++++++++++++++------ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/nx/source/runtime/init.c b/nx/source/runtime/init.c index a8f338b5..aef7211b 100644 --- a/nx/source/runtime/init.c +++ b/nx/source/runtime/init.c @@ -14,6 +14,7 @@ void NORETURN __nx_exit(Result rc, LoaderReturnFn retaddr); void virtmemSetup(void); void newlibSetup(void); void argvSetup(void); +void __libnx_init_time(void); extern u32 __nx_applet_type; @@ -106,6 +107,8 @@ void __attribute__((weak)) __appInit(void) if (R_FAILED(rc)) fatalSimple(MAKERESULT(Module_Libnx, LibnxError_InitFail_Time)); + __libnx_init_time(); + rc = fsInitialize(); if (R_FAILED(rc)) fatalSimple(MAKERESULT(Module_Libnx, LibnxError_InitFail_FS)); diff --git a/nx/source/runtime/newlib.c b/nx/source/runtime/newlib.c index 08238cff..0372df07 100644 --- a/nx/source/runtime/newlib.c +++ b/nx/source/runtime/newlib.c @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -8,6 +9,7 @@ #include "types.h" #include "runtime/env.h" #include "kernel/mutex.h" +#include "kernel/svc.h" #include "services/fatal.h" #include "services/time.h" #include "result.h" @@ -29,20 +31,33 @@ static struct _reent* __libnx_get_reent(void) { } //TODO: timeGetCurrentTime() returns UTC time. How to handle timezones? +static u64 __boottime; +static u64 __bootticks; + +// setup boot time variables +void __libnx_init_time(void) { + Result rc = timeGetCurrentTime(__nx_time_type, &__boottime); + if (R_FAILED(rc)) { + __boottime = UINT64_MAX; + } else { + __bootticks = svcGetSystemTick(); + } +} int __libnx_gtod(struct _reent *ptr, struct timeval *tp, struct timezone *tz) { if (tp != NULL) { - u64 now=0; - Result rc=0; - rc = timeGetCurrentTime(__nx_time_type, &now); - if (R_FAILED(rc)) { + if(__boottime == UINT64_MAX) { ptr->_errno = EINVAL; return -1; } - tp->tv_sec = now; - tp->tv_usec = now*1000000;//timeGetCurrentTime() only returns seconds. + u64 now=svcGetSystemTick() - __bootticks; + + u64 __bootsecs = now / 19200000ULL; + + tp->tv_sec = __bootsecs + __boottime; + tp->tv_usec = (now - tp->tv_sec * 19200000ULL) * 10ULL / 192ULL; } if (tz != NULL) {