Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void swap_values(registers_t *r) {
- regs = &runningTask->regs; // Get registers
- /* Set old registers */
- regs->eflags = r->eflags;
- regs->eax = r->eax;
- regs->ebx = r->ebx;
- regs->ecx = r->ecx;
- regs->edx = r->edx;
- regs->edi = r->edi;
- regs->esi = r->esi;
- regs->eip = r->eip;
- regs->esp = r->esp;
- regs->ebp = r->ebp;
- // Select new running task
- runningTask = runningTask->next;
- while (runningTask->state != RUNNING) {
- runningTask = runningTask->next;
- }
- // Set values for context switch
- regs = &runningTask->regs;
- r->eflags = regs->eflags;
- r->eflags = r->eflags | 0x200;
- r->eax = regs->eax;
- r->ebx = regs->ebx;
- r->ecx = regs->ecx;
- r->edx = regs->edx;
- r->edi = regs->edi;
- r->esi = regs->esi;
- r->eip = regs->eip;
- r->useresp = regs->esp;
- r->esp = regs->esp;
- r->ebp = regs->ebp;
- sprint("\nDone switching\n");
- sprint_uint(r->esp);
- sprint("\n");
- sprint_uint(r->eip);
- }
- irq_common_stub:
- pushad
- mov ax, ds
- push eax
- mov eax, dr6
- push eax
- mov eax, esp ; At this point ESP is a pointer to where DS (and the rest
- ; of the interrupt handler state resides)
- ; Push ESP as 1st parameter as it's a
- ; pointer to a registers_t
- call irq_handler
- mov ebx, [switch_task]
- cmp ebx, 1
- jne testLabel
- mov ebx, 0
- mov [switch_task], ebx
- mov eax, esp ; Safety, irq_handler probably changed eax
- call swap_values ; Change context stored on stack
- testLabel:
- add esp, 8 ; DR6 and ss
- popad
- add esp, 8 ; IRQ code and error code
- sti ; Set interrupt flag
- iret ; Ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement