From 67c0d714c5b6e93ddb00d0807147b5673c011ac6 Mon Sep 17 00:00:00 2001 From: Liam Date: Sun, 18 Dec 2022 16:37:19 -0500 Subject: kernel: add KHardwareTimer --- src/core/hle/kernel/k_hardware_timer.h | 50 ++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/core/hle/kernel/k_hardware_timer.h (limited to 'src/core/hle/kernel/k_hardware_timer.h') diff --git a/src/core/hle/kernel/k_hardware_timer.h b/src/core/hle/kernel/k_hardware_timer.h new file mode 100644 index 000000000..2c88876b3 --- /dev/null +++ b/src/core/hle/kernel/k_hardware_timer.h @@ -0,0 +1,50 @@ +// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "core/hle/kernel/k_hardware_timer_base.h" + +namespace Core::Timing { +struct EventType; +} // namespace Core::Timing + +namespace Kernel { + +class KHardwareTimer : /* public KInterruptTask, */ public KHardwareTimerBase { +public: + explicit KHardwareTimer(KernelCore& kernel) : KHardwareTimerBase{kernel} {} + + // Public API. + void Initialize(); + void Finalize(); + + s64 GetCount() { + return GetTick(); + } + + void RegisterAbsoluteTask(KTimerTask* task, s64 task_time) { + KScopedDisableDispatch dd{m_kernel}; + KScopedSpinLock lk{this->GetLock()}; + + if (this->RegisterAbsoluteTaskImpl(task, task_time)) { + if (task_time <= m_wakeup_time) { + this->EnableInterrupt(task_time); + } + } + } + +private: + void EnableInterrupt(s64 wakeup_time); + void DisableInterrupt(); + bool GetInterruptEnabled(); + s64 GetTick(); + void DoTask(); + +private: + // Absolute time in nanoseconds + s64 m_wakeup_time{std::numeric_limits::max()}; + std::shared_ptr m_event_type{}; +}; + +} // namespace Kernel -- cgit v1.2.3 From c770f25ccb4755f6a6861037fbfdfdac55191348 Mon Sep 17 00:00:00 2001 From: Liam Date: Sun, 18 Dec 2022 16:50:02 -0500 Subject: kernel: remove TimeManager --- src/core/hle/kernel/k_hardware_timer.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'src/core/hle/kernel/k_hardware_timer.h') diff --git a/src/core/hle/kernel/k_hardware_timer.h b/src/core/hle/kernel/k_hardware_timer.h index 2c88876b3..00bef6ea1 100644 --- a/src/core/hle/kernel/k_hardware_timer.h +++ b/src/core/hle/kernel/k_hardware_timer.h @@ -19,10 +19,14 @@ public: void Initialize(); void Finalize(); - s64 GetCount() { + s64 GetCount() const { return GetTick(); } + void RegisterTask(KTimerTask* task, s64 time_from_now) { + this->RegisterAbsoluteTask(task, GetTick() + time_from_now); + } + void RegisterAbsoluteTask(KTimerTask* task, s64 task_time) { KScopedDisableDispatch dd{m_kernel}; KScopedSpinLock lk{this->GetLock()}; @@ -38,7 +42,7 @@ private: void EnableInterrupt(s64 wakeup_time); void DisableInterrupt(); bool GetInterruptEnabled(); - s64 GetTick(); + s64 GetTick() const; void DoTask(); private: -- cgit v1.2.3