forked from Bananymous/banan-os
Kernel: Make PIT counter atomic with spinlock
This commit is contained in:
parent
e00efca170
commit
8fe798de6d
|
@ -1,6 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <kernel/Interruptable.h>
|
#include <kernel/Interruptable.h>
|
||||||
|
#include <kernel/Lock/SpinLock.h>
|
||||||
#include <kernel/Timer/Timer.h>
|
#include <kernel/Timer/Timer.h>
|
||||||
|
|
||||||
namespace Kernel
|
namespace Kernel
|
||||||
|
@ -19,9 +20,11 @@ namespace Kernel
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void initialize();
|
void initialize();
|
||||||
|
uint64_t read_counter() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
volatile uint64_t m_system_time { 0 };
|
mutable SpinLock m_lock;
|
||||||
|
uint64_t m_system_time { 0 };
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,23 +54,32 @@ namespace Kernel
|
||||||
|
|
||||||
void PIT::handle_irq()
|
void PIT::handle_irq()
|
||||||
{
|
{
|
||||||
m_system_time = m_system_time + 1;
|
{
|
||||||
|
SpinLockGuard _(m_lock);
|
||||||
|
m_system_time++;
|
||||||
|
}
|
||||||
Kernel::Scheduler::get().timer_reschedule();
|
Kernel::Scheduler::get().timer_reschedule();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint64_t PIT::read_counter() const
|
||||||
|
{
|
||||||
|
SpinLockGuard _(m_lock);
|
||||||
|
return m_system_time;
|
||||||
|
}
|
||||||
|
|
||||||
uint64_t PIT::ms_since_boot() const
|
uint64_t PIT::ms_since_boot() const
|
||||||
{
|
{
|
||||||
return m_system_time * (MS_PER_S / TICKS_PER_SECOND);
|
return read_counter() * (MS_PER_S / TICKS_PER_SECOND);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t PIT::ns_since_boot() const
|
uint64_t PIT::ns_since_boot() const
|
||||||
{
|
{
|
||||||
return m_system_time * (NS_PER_S / TICKS_PER_SECOND);
|
return read_counter() * (NS_PER_S / TICKS_PER_SECOND);
|
||||||
}
|
}
|
||||||
|
|
||||||
timespec PIT::time_since_boot() const
|
timespec PIT::time_since_boot() const
|
||||||
{
|
{
|
||||||
uint64_t ticks = m_system_time;
|
uint64_t ticks = read_counter();
|
||||||
return timespec {
|
return timespec {
|
||||||
.tv_sec = ticks / TICKS_PER_SECOND,
|
.tv_sec = ticks / TICKS_PER_SECOND,
|
||||||
.tv_nsec = (long)((ticks % TICKS_PER_SECOND) * (NS_PER_S / TICKS_PER_SECOND))
|
.tv_nsec = (long)((ticks % TICKS_PER_SECOND) * (NS_PER_S / TICKS_PER_SECOND))
|
||||||
|
|
Loading…
Reference in New Issue