k_hardware_timer.h 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include "core/hle/kernel/k_hardware_timer_base.h"
  5. namespace Core::Timing {
  6. struct EventType;
  7. } // namespace Core::Timing
  8. namespace Kernel {
  9. class KHardwareTimer : /* public KInterruptTask, */ public KHardwareTimerBase {
  10. public:
  11. explicit KHardwareTimer(KernelCore& kernel) : KHardwareTimerBase{kernel} {}
  12. // Public API.
  13. void Initialize();
  14. void Finalize();
  15. s64 GetCount() const {
  16. return GetTick();
  17. }
  18. void RegisterTask(KTimerTask* task, s64 time_from_now) {
  19. this->RegisterAbsoluteTask(task, GetTick() + time_from_now);
  20. }
  21. void RegisterAbsoluteTask(KTimerTask* task, s64 task_time) {
  22. KScopedDisableDispatch dd{m_kernel};
  23. KScopedSpinLock lk{this->GetLock()};
  24. if (this->RegisterAbsoluteTaskImpl(task, task_time)) {
  25. if (task_time <= m_wakeup_time) {
  26. this->EnableInterrupt(task_time);
  27. }
  28. }
  29. }
  30. private:
  31. void EnableInterrupt(s64 wakeup_time);
  32. void DisableInterrupt();
  33. bool GetInterruptEnabled();
  34. s64 GetTick() const;
  35. void DoTask();
  36. private:
  37. // Absolute time in nanoseconds
  38. s64 m_wakeup_time{std::numeric_limits<s64>::max()};
  39. std::shared_ptr<Core::Timing::EventType> m_event_type{};
  40. };
  41. } // namespace Kernel