| [bits 32] |
| [extern _do_switch_task] |
| [global switch_task] |
| switch_task: |
| pusha ; Save everything |
| push esp ; Arguments for _do_switch_task(eip, ebp, esp) |
| push ebp |
| push .after |
| call _do_switch_task |
| .after: |
| popa ; Reset everything |
| xor eax, eax ; Return 0 |
| ret |
| |
| [global _switch_to_task] |
| ;; _switch_to_task(uint page_directory, uint eip, uint ebp, uint esp) |
| _switch_to_task: ; (page_directory, eip, ebp, esp) |
| add esp, 4 ; We don't care about the return address |
| |
| pop ecx ; Page directory |
| pop eax ; eip |
| pop ebp |
| pop ebx ; esp |
| |
| mov esp, ebx ; Reset old stack |
| |
| mov cr3, ecx ; Set page directory |
| sti |
| jmp eax ; Jump back to code |
| |
| [extern _init_tasks] |
| [global init_tasks] |
| init_tasks: |
| lea eax, [esp + 4] ; Stack pointer before call |
| mov ebx, [esp] ; Return address |
| push ebx ; eip |
| push ebp ; ebp |
| push eax ; esp |
| call _init_tasks |
| add esp, 12 |
| ret |