summaryrefslogtreecommitdiff
path: root/kernel/timer.s
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/timer.s')
-rw-r--r--kernel/timer.s25
1 files changed, 25 insertions, 0 deletions
diff --git a/kernel/timer.s b/kernel/timer.s
index 3723782..c84a847 100644
--- a/kernel/timer.s
+++ b/kernel/timer.s
@@ -1,15 +1,40 @@
global ticks
global timer_init
+extern cstate
extern register_isr
+extern reschedule
ticks: dd 0
tick_handler:
+ pusha
+ ; save the data segment selectors
+ mov ax, ds
push ax
+ ; switch to kernel data segments
+ mov ax, 0x10
+ mov ds, ax
+ mov es, ax
+ mov fs, ax
+ mov gs, ax
+ ; save a pointer to the state information
+ mov [cstate], esp
+
+ ; handle the timer tick
inc dword [ticks]
mov al, 0x20
out 0x20, al
+
+ ; call the scheduler
+ call reschedule
+
+ ; restore the data segment selectors
pop ax
+ mov ds, ax
+ mov es, ax
+ mov fs, ax
+ mov gs, ax
+ popa
iret
timer_init: