diff --git a/kernel/include/kernel/Timer/HPET.h b/kernel/include/kernel/Timer/HPET.h index e37729745..8ad149dd3 100644 --- a/kernel/include/kernel/Timer/HPET.h +++ b/kernel/include/kernel/Timer/HPET.h @@ -12,6 +12,7 @@ namespace Kernel static BAN::ErrorOr> create(bool force_pic); virtual uint64_t ms_since_boot() const override; + virtual uint64_t ns_since_boot() const override; virtual timespec time_since_boot() const override; virtual void handle_irq() override; diff --git a/kernel/include/kernel/Timer/PIT.h b/kernel/include/kernel/Timer/PIT.h index d0750984c..dc9c149f2 100644 --- a/kernel/include/kernel/Timer/PIT.h +++ b/kernel/include/kernel/Timer/PIT.h @@ -12,6 +12,7 @@ namespace Kernel static BAN::ErrorOr> create(); virtual uint64_t ms_since_boot() const override; + virtual uint64_t ns_since_boot() const override; virtual timespec time_since_boot() const override; virtual void handle_irq() override; diff --git a/kernel/include/kernel/Timer/Timer.h b/kernel/include/kernel/Timer/Timer.h index f4c0f49bd..a2e0cd5a2 100644 --- a/kernel/include/kernel/Timer/Timer.h +++ b/kernel/include/kernel/Timer/Timer.h @@ -14,6 +14,7 @@ namespace Kernel public: virtual ~Timer() {}; virtual uint64_t ms_since_boot() const = 0; + virtual uint64_t ns_since_boot() const = 0; virtual timespec time_since_boot() const = 0; }; @@ -25,6 +26,7 @@ namespace Kernel static bool is_initialized(); virtual uint64_t ms_since_boot() const override; + virtual uint64_t ns_since_boot() const override; virtual timespec time_since_boot() const override; void sleep(uint64_t ms) const; diff --git a/kernel/kernel/Timer/HPET.cpp b/kernel/kernel/Timer/HPET.cpp index 8813b56e6..e660b2d88 100644 --- a/kernel/kernel/Timer/HPET.cpp +++ b/kernel/kernel/Timer/HPET.cpp @@ -148,6 +148,12 @@ namespace Kernel return read_register(HPET_REG_COUNTER) * m_counter_tick_period_fs / FS_PER_MS; } + uint64_t HPET::ns_since_boot() const + { + // FIXME: 32 bit CPUs should use 32 bit counter with 32 bit reads + return read_register(HPET_REG_COUNTER) * m_counter_tick_period_fs / FS_PER_NS; + } + timespec HPET::time_since_boot() const { uint64_t time_fs = read_register(HPET_REG_COUNTER) * m_counter_tick_period_fs; diff --git a/kernel/kernel/Timer/PIT.cpp b/kernel/kernel/Timer/PIT.cpp index b61901edc..4e4d298a2 100644 --- a/kernel/kernel/Timer/PIT.cpp +++ b/kernel/kernel/Timer/PIT.cpp @@ -62,6 +62,11 @@ namespace Kernel return m_system_time * (MS_PER_S / TICKS_PER_SECOND); } + uint64_t PIT::ns_since_boot() const + { + return m_system_time * (NS_PER_S / TICKS_PER_SECOND); + } + timespec PIT::time_since_boot() const { uint64_t ticks = m_system_time; diff --git a/kernel/kernel/Timer/Timer.cpp b/kernel/kernel/Timer/Timer.cpp index d1cbb9620..ff29d0f6d 100644 --- a/kernel/kernel/Timer/Timer.cpp +++ b/kernel/kernel/Timer/Timer.cpp @@ -59,6 +59,11 @@ namespace Kernel return m_timer->ms_since_boot(); } + uint64_t SystemTimer::ns_since_boot() const + { + return m_timer->ns_since_boot(); + } + timespec SystemTimer::time_since_boot() const { return m_timer->time_since_boot();