1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
.global pit_init
.global pit_interrupt_handler
.global pit_get_ticks
ticks:
.int 0
pit_get_ticks:
mov (ticks),%eax
ret
pit_interrupt_handler:
// increase tick counter
push %eax
mov $ticks, %eax
incl (%eax)
pop %eax
////
pusha //Push all standard registers
mov %esp, %eax //save current stack pointer (pointing to registers!)
movl $stack_top, %esp //use stack from multiboot.s(16Kb)
// call our scheduler passing it the old stack addres (pointing to pushed registers (pusha))
push %eax
call task_switch_next
// the scheduler returned the new stack pointer (after taskswitch)
mov %eax, %esp //Replace the stack with what the C code gave us
// acknowlege irq
mov $0x20,%al
out %al,$0x20
popa //Put the standard registers back
iret
pit_init:
// configure ticking 25 times a second
// 1193180 / 25 = 47727.2
mov $47727, %dx
mov $0b00110100, %al
outb %al,$0x43
mov %dx,%ax
out %al, $0x40
xchg %ah,%al
out %al, $0x40
ret
|