my interrupt handling code
Code: Select all
.type irq0,@function
irq0:
call timer_handler
push $0
push $0
pusha
mov %ds, %eax
push %eax
mov %es, %eax
push %eax
mov %fs, %eax
push %eax
mov %gs, %eax
push %eax
mov %esp, %eax
push %eax
call switch_tasks
mov %eax, %esp
mov $0x20, %al
out %al, $0x20
pop %eax
pop %eax
pop %eax
pop %eax
pop %eax
popa
add $8, %esp
sti
iret
Code: Select all
void timer_handler(void)
{
ticks++;
Printf("timer handler\n");
update_time();
update_cursor();
}
Code: Select all
unsigned int switch_tasks(struct REGS *r)
{
Printf("Task switcher\n");
if(current_task==MAX_TASKS) current_task=0;
if(tasks[current_task++].status!=0)
{
tasks[current_task].r->eax=r->eax;
tasks[current_task].r->ebx=r->ebx;
tasks[current_task].r->ecx=r->ecx;
tasks[current_task].r->edx=r->edx;
tasks[current_task].r->esi=r->esi;
tasks[current_task].r->edi=r->edi;
tasks[current_task].r->esp=r->esp;
tasks[current_task].r->ebp=r->ebp;
tasks[current_task].r->ss=r->ss;
tasks[current_task].r->cs=r->cs;
tasks[current_task].r->es=r->es;
tasks[current_task].r->ds=r->ds;
tasks[current_task].r->fs=r->fs;
tasks[current_task].r->gs=r->gs;
tasks[current_task].r->eip=r->eip;
tasks[current_task].r->eflags=r->eflags;
tasks[current_task].r->int_no=r->int_no;
tasks[current_task].r->err_code=r->err_code;
current_task++;
}
else
{
tasks[current_task].r->eax=r->eax;
tasks[current_task].r->ebx=r->ebx;
tasks[current_task].r->ecx=r->ecx;
tasks[current_task].r->edx=r->edx;
tasks[current_task].r->esi=r->esi;
tasks[current_task].r->edi=r->edi;
tasks[current_task].r->esp=r->esp;
tasks[current_task].r->ebp=r->ebp;
tasks[current_task].r->ss=r->ss;
tasks[current_task].r->cs=r->cs;
tasks[current_task].r->es=r->es;
tasks[current_task].r->ds=r->ds;
tasks[current_task].r->fs=r->fs;
tasks[current_task].r->gs=r->gs;
tasks[current_task].r->eip=r->eip;
tasks[current_task].r->eflags=r->eflags;
tasks[current_task].r->int_no=r->int_no;
tasks[current_task].r->err_code=r->err_code;
current_task++;
while(tasks[current_task].status==0)
{
if(current_task==MAX_TASKS) current_task=0;
else current_task++;
}
}
return tasks[current_task].stack;
}