59 lines
801 B
ArmAsm
59 lines
801 B
ArmAsm
.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
|