From 97ef21e166a95419b97d164c6969ffaf1faacfb0 Mon Sep 17 00:00:00 2001 From: bunnei Date: Thu, 11 Jan 2018 21:59:31 -0500 Subject: [PATCH] svc: Implement GetSystemTick. --- src/core/hle/kernel/svc.cpp | 15 +++++++++++++-- src/core/hle/kernel/svc_wrap.h | 8 ++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 7c2aee417..b43e004bc 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp @@ -642,6 +642,16 @@ static ResultCode SignalProcessWideKey(VAddr condition_variable_addr, s32 target return RESULT_SUCCESS; } +/// This returns the total CPU ticks elapsed since the CPU was powered-on +static u64 GetSystemTick() { + const u64 result{CoreTiming::GetTicks()}; + + // Advance time to defeat dumb games that busy-wait for the frame to end. + CoreTiming::AddTicks(400); + + return result; +} + /// Close a handle static ResultCode CloseHandle(Handle handle) { LOG_TRACE(Kernel_SVC, "Closing handle 0x%08X", handle); @@ -659,7 +669,8 @@ static ResultCode ResetSignal(Handle handle) { /// Creates a TransferMemory object static ResultCode CreateTransferMemory(Handle* handle, VAddr addr, u64 size, u32 permissions) { - LOG_WARNING(Kernel_SVC, "(STUBBED) called addr=0x%llx, size=0x%llx, perms=%08X", addr, size, permissions); + LOG_WARNING(Kernel_SVC, "(STUBBED) called addr=0x%llx, size=0x%llx, perms=%08X", addr, size, + permissions); *handle = 0; return RESULT_SUCCESS; } @@ -705,7 +716,7 @@ static const FunctionDef SVC_Table[] = { {0x1B, SvcWrap, "UnlockMutex"}, {0x1C, SvcWrap, "WaitProcessWideKeyAtomic"}, {0x1D, SvcWrap, "SignalProcessWideKey"}, - {0x1E, nullptr, "GetSystemTick"}, + {0x1E, SvcWrap, "GetSystemTick"}, {0x1F, SvcWrap, "ConnectToPort"}, {0x20, nullptr, "SendSyncRequestLight"}, {0x21, SvcWrap, "SendSyncRequest"}, diff --git a/src/core/hle/kernel/svc_wrap.h b/src/core/hle/kernel/svc_wrap.h index 31cf71a0d..ffc323bce 100644 --- a/src/core/hle/kernel/svc_wrap.h +++ b/src/core/hle/kernel/svc_wrap.h @@ -148,6 +148,14 @@ void SvcWrap() { FuncReturn(func()); } +//////////////////////////////////////////////////////////////////////////////////////////////////// +// Function wrappers that return type u64 + +template +void SvcWrap() { + FuncReturn(func()); +} + //////////////////////////////////////////////////////////////////////////////////////////////////// /// Function wrappers that return type void