.global pit_init .global pit_interrupt_handler .global pit_get_ticks ticks: .int 0 pit_get_ticks: mov (ticks),%eax ret pit_interrupt_handler: push %eax // persist // INC TICK COUNTER mov $ticks, %eax incl (%eax) // ACK IRQ mov $0x20,%al out %al,$0x20 pop %eax // load original /////// pusha //Push all standard registers push %ds //Push data segment push %es //etc... push %fs push %gs mov %esp, %eax // remember current %esp movl $stack_top, %esp // switch to our small scheduler stack push %eax // set original %esp as param and... call task_switch_next // call scheduler mov %eax, %esp // use %esp we got from scheduler pop %gs pop %fs pop %es pop %ds popa 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