diff options
| -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; | 
