diff options
author | Liam <byteslice@airmail.cc> | 2022-12-18 22:37:19 +0100 |
---|---|---|
committer | Liam <byteslice@airmail.cc> | 2022-12-18 22:37:19 +0100 |
commit | 67c0d714c5b6e93ddb00d0807147b5673c011ac6 (patch) | |
tree | bd35994725d098c7371506d533390800d3253f3e /src/core/hle/kernel/k_hardware_timer.h | |
parent | Merge pull request #9470 from german77/silenceIkillYou (diff) | |
download | yuzu-67c0d714c5b6e93ddb00d0807147b5673c011ac6.tar yuzu-67c0d714c5b6e93ddb00d0807147b5673c011ac6.tar.gz yuzu-67c0d714c5b6e93ddb00d0807147b5673c011ac6.tar.bz2 yuzu-67c0d714c5b6e93ddb00d0807147b5673c011ac6.tar.lz yuzu-67c0d714c5b6e93ddb00d0807147b5673c011ac6.tar.xz yuzu-67c0d714c5b6e93ddb00d0807147b5673c011ac6.tar.zst yuzu-67c0d714c5b6e93ddb00d0807147b5673c011ac6.zip |
Diffstat (limited to 'src/core/hle/kernel/k_hardware_timer.h')
-rw-r--r-- | src/core/hle/kernel/k_hardware_timer.h | 50 |
1 files changed, 50 insertions, 0 deletions
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<s64>::max()}; + std::shared_ptr<Core::Timing::EventType> m_event_type{}; +}; + +} // namespace Kernel |