.intel_syntax noprefix .section .text .global switch_to_task switch_to_task: push ebx push ebp push edi push esi mov eax, [current_task] // save the current stack pointer to the old stack mov [eax+0], esp // stack pointer + the 4 regs pushed // and + 1 to get the argument (next task) mov esi, [esp+(4+1)*4] mov [current_task], esi mov eax, [current_task] mov esp, [eax+0] // get esp mov ecx, [eax+12] // get task's pd mov [current_pd], ecx mov ecx, [eax+8] mov cr3, ecx pop esi pop edi pop ebp pop ebx mov ecx, 0 cmp [eax+16], ecx je .END sti push [eax+16] // store func_ptr mov [eax+16], ecx // clear eip in current_task push 0 call pic_send_eoi pop edx // remove pic_send_eoi argument pop edx // get func_ptr call edx call exit_task .END: ret