time: Retrieve and expose shared memory [6.0.0+]

This commit is contained in:
fincs 2020-04-10 17:18:12 +02:00
parent bf5331d178
commit 2edfb7cc56
No known key found for this signature in database
GPG Key ID: 62C7609ADA219C60
2 changed files with 30 additions and 4 deletions

View File

@ -77,6 +77,9 @@ Service* timeGetServiceSession_SystemClock(TimeType type);
/// Gets the Service object for ITimeZoneService.
Service* timeGetServiceSession_TimeZoneService(void);
/// [6.0.0+] Gets the address of the SharedMemory.
void* timeGetSharedmemAddr(void);
/**
* @brief Gets the time for the specified clock.
* @param[in] type Clock to use.

View File

@ -1,5 +1,6 @@
#define NX_SERVICE_ASSUME_NON_DOMAIN
#include "service_guard.h"
#include "kernel/shmem.h"
#include "services/time.h"
#include "runtime/hosversion.h"
@ -11,7 +12,10 @@ static Service g_timeNetworkSystemClock;
static Service g_timeTimeZoneService;
static Service g_timeLocalSystemClock;
static SharedMemory g_timeSharedmem;
static Result _timeCmdGetSession(Service* srv, Service* srv_out, u32 cmd_id);
static Result _timeGetSharedMemoryNativeHandle(Service* srv, Handle* out);
NX_GENERATE_SERVICE_GUARD(time);
@ -41,9 +45,7 @@ Result _timeInitialize(void) {
break;
}
if (R_FAILED(rc))
return rc;
if (R_SUCCEEDED(rc))
rc = _timeCmdGetSession(&g_timeSrv, &g_timeUserSystemClock, 0);
if (R_SUCCEEDED(rc))
@ -55,10 +57,20 @@ Result _timeInitialize(void) {
if (R_SUCCEEDED(rc))
rc = _timeCmdGetSession(&g_timeSrv, &g_timeLocalSystemClock, 4);
if (R_SUCCEEDED(rc) && hosversionAtLeast(6,0,0)) {
Handle shmem;
rc = _timeGetSharedMemoryNativeHandle(&g_timeSrv, &shmem);
if (R_SUCCEEDED(rc)) {
shmemLoadRemote(&g_timeSharedmem, shmem, 0x1000, Perm_R);
rc = shmemMap(&g_timeSharedmem);
}
}
return rc;
}
void _timeCleanup(void) {
shmemClose(&g_timeSharedmem);
serviceClose(&g_timeLocalSystemClock);
serviceClose(&g_timeTimeZoneService);
serviceClose(&g_timeNetworkSystemClock);
@ -89,6 +101,10 @@ Service* timeGetServiceSession_TimeZoneService(void) {
return &g_timeTimeZoneService;
}
void* timeGetSharedmemAddr(void) {
return shmemGetAddr(&g_timeSharedmem);
}
static Result _timeCmdGetSession(Service* srv, Service* srv_out, u32 cmd_id) {
return serviceDispatch(srv, cmd_id,
.out_num_objects = 1,
@ -96,6 +112,13 @@ static Result _timeCmdGetSession(Service* srv, Service* srv_out, u32 cmd_id) {
);
}
static Result _timeGetSharedMemoryNativeHandle(Service* srv, Handle* out) {
return serviceDispatch(srv, 20,
.out_handle_attrs = { SfOutHandleAttr_HipcCopy },
.out_handles = out,
);
}
static Result _timeCmdInU64NoOut(Service* srv, u64 inval, u32 cmd_id) {
return serviceDispatchIn(srv, cmd_id, inval);
}