2022-12-18 22:37:19 +01:00
|
|
|
// 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();
|
|
|
|
|
2022-12-18 22:50:02 +01:00
|
|
|
s64 GetCount() const {
|
2022-12-18 22:37:19 +01:00
|
|
|
return GetTick();
|
|
|
|
}
|
|
|
|
|
2022-12-18 22:50:02 +01:00
|
|
|
void RegisterTask(KTimerTask* task, s64 time_from_now) {
|
|
|
|
this->RegisterAbsoluteTask(task, GetTick() + time_from_now);
|
|
|
|
}
|
|
|
|
|
2022-12-18 22:37:19 +01:00
|
|
|
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();
|
2022-12-18 22:50:02 +01:00
|
|
|
s64 GetTick() const;
|
2022-12-18 22:37:19 +01:00
|
|
|
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
|