Kernel: All processors use LAPIC timer when running with APIC

This makes scheduler preemption much cleaner as bsb does not have to
send smp messages to notify other processes about timer interrupt.

Also PIT percision is now "full" 0.8 us instead of 1 ms that I was using
before.
This commit is contained in:
2024-07-23 02:28:52 +03:00
parent 3e0150f847
commit 539afb329a
17 changed files with 224 additions and 73 deletions

View File

@@ -19,6 +19,8 @@ namespace Kernel
virtual uint64_t ns_since_boot() const override;
virtual timespec time_since_boot() const override;
virtual void pre_scheduler_sleep_ns(uint64_t) override;
virtual void handle_irq() override;
private:

View File

@@ -16,15 +16,18 @@ namespace Kernel
virtual uint64_t ns_since_boot() const override;
virtual timespec time_since_boot() const override;
virtual void pre_scheduler_sleep_ns(uint64_t) override;
virtual void handle_irq() override;
private:
void initialize();
uint64_t read_counter() const;
uint64_t read_counter_ns() const;
private:
mutable SpinLock m_lock;
uint64_t m_system_time { 0 };
uint64_t m_system_time_ms { 0 };
};
}

View File

@@ -16,6 +16,16 @@ namespace Kernel
virtual uint64_t ms_since_boot() const = 0;
virtual uint64_t ns_since_boot() const = 0;
virtual timespec time_since_boot() const = 0;
virtual void pre_scheduler_sleep_ns(uint64_t) = 0;
void dont_invoke_scheduler() { m_should_invoke_scheduler = false; }
protected:
bool should_invoke_scheduler() const { return m_should_invoke_scheduler; }
private:
bool m_should_invoke_scheduler { true };
};
class SystemTimer : public Timer
@@ -29,6 +39,8 @@ namespace Kernel
virtual uint64_t ns_since_boot() const override;
virtual timespec time_since_boot() const override;
virtual void pre_scheduler_sleep_ns(uint64_t) override;
void sleep_ms(uint64_t ms) const { return sleep_ns(ms * 1'000'000); }
void sleep_ns(uint64_t ns) const;