summaryrefslogtreecommitdiff
path: root/kernel/drivers/pit.c
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2024-07-03 01:21:16 +0200
committerAnton Kling <anton@kling.gg>2024-07-03 01:21:28 +0200
commitdd9aece19f93c1cafe07dfc0e63e1599a06db04b (patch)
treeaf5ef66b2eba21d0eaa2d3a00abcfec64cea98b4 /kernel/drivers/pit.c
parent5751b4ff0baf41fd3f38b30b0cb58d09631e9bc0 (diff)
Kernel: Add simple support for timer using TSC
Diffstat (limited to 'kernel/drivers/pit.c')
-rw-r--r--kernel/drivers/pit.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/kernel/drivers/pit.c b/kernel/drivers/pit.c
index db9cd2a..ac4e555 100644
--- a/kernel/drivers/pit.c
+++ b/kernel/drivers/pit.c
@@ -1,4 +1,5 @@
#include "pit.h"
+#include <arch/i386/tsc.h>
#define PIT_IO_CHANNEL_0 0x40
#define PIT_IO_MODE_COMMAND 0x43
@@ -8,8 +9,9 @@ u32 pit_counter = 0;
u32 switch_counter = 0;
u16 hertz;
+u64 cpu_mhz = 0;
u64 pit_num_ms(void) {
- return clock_num_ms_ticks;
+ return (get_tsc()) / (cpu_mhz * 1000);
}
u16 read_pit_count(void) {
@@ -24,6 +26,8 @@ u16 read_pit_count(void) {
}
void set_pit_count(u16 _hertz) {
+ cpu_mhz = get_hz() / 10000;
+
hertz = _hertz;
u16 divisor = 1193180 / hertz;
@@ -45,9 +49,18 @@ void set_pit_count(u16 _hertz) {
int last_flush = 0;
+u64 last_tsc = 0;
+
extern int is_switching_tasks;
void int_clock(reg_t *regs) {
- clock_num_ms_ticks += 5;
+ u64 current_tsc = get_tsc();
+
+ u64 delta = (current_tsc - last_tsc) / (cpu_mhz * 1000);
+
+ clock_num_ms_ticks += delta;
+
+ last_tsc = current_tsc;
+
switch_counter++;
if (clock_num_ms_ticks - last_flush > 50) {
tcp_flush_acks();