diff options
author | Morph <39850852+Morph1984@users.noreply.github.com> | 2021-10-25 15:17:49 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-25 15:17:49 +0200 |
commit | 63ed7d9af7bd78edf155af198100e4f9770efcaa (patch) | |
tree | 27c5a87081973ca5a6e9fcf1f9c6ca91388ec8e2 /src/core/hle | |
parent | Merge pull request #7218 from bylaws/aswdqdsam (diff) | |
parent | SVC: Implement svcInfo:IdleTickCount (diff) | |
download | yuzu-63ed7d9af7bd78edf155af198100e4f9770efcaa.tar yuzu-63ed7d9af7bd78edf155af198100e4f9770efcaa.tar.gz yuzu-63ed7d9af7bd78edf155af198100e4f9770efcaa.tar.bz2 yuzu-63ed7d9af7bd78edf155af198100e4f9770efcaa.tar.lz yuzu-63ed7d9af7bd78edf155af198100e4f9770efcaa.tar.xz yuzu-63ed7d9af7bd78edf155af198100e4f9770efcaa.tar.zst yuzu-63ed7d9af7bd78edf155af198100e4f9770efcaa.zip |
Diffstat (limited to 'src/core/hle')
-rw-r--r-- | src/core/hle/kernel/k_scheduler.h | 5 | ||||
-rw-r--r-- | src/core/hle/kernel/svc.cpp | 17 |
2 files changed, 22 insertions, 0 deletions
diff --git a/src/core/hle/kernel/k_scheduler.h b/src/core/hle/kernel/k_scheduler.h index c8ccc1ae4..7df288438 100644 --- a/src/core/hle/kernel/k_scheduler.h +++ b/src/core/hle/kernel/k_scheduler.h @@ -49,6 +49,11 @@ public: /// Gets the current running thread [[nodiscard]] KThread* GetCurrentThread() const; + /// Gets the idle thread + [[nodiscard]] KThread* GetIdleThread() const { + return idle_thread; + } + /// Returns true if the scheduler is idle [[nodiscard]] bool IsIdle() const { return GetCurrentThread() == idle_thread; diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index f98f24a60..7f38ade1c 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp @@ -886,7 +886,24 @@ static ResultCode GetInfo(Core::System& system, u64* result, u64 info_id, Handle *result = out_ticks; return ResultSuccess; } + case GetInfoType::IdleTickCount: { + if (handle == 0) { + LOG_ERROR(Kernel_SVC, "Thread handle does not exist, handle=0x{:08X}", + static_cast<Handle>(handle)); + return ResultInvalidHandle; + } + if (info_sub_id != 0xFFFFFFFFFFFFFFFF && info_sub_id != system.CurrentCoreIndex()) { + LOG_ERROR(Kernel_SVC, "Core is not the current core, got {}", info_sub_id); + return ResultInvalidCombination; + } + + const auto& scheduler = *system.Kernel().CurrentScheduler(); + const auto* const idle_thread = scheduler.GetIdleThread(); + + *result = idle_thread->GetCpuTime(); + return ResultSuccess; + } default: LOG_ERROR(Kernel_SVC, "Unimplemented svcGetInfo id=0x{:016X}", info_id); return ResultInvalidEnumValue; |