swissChili | cfd3c3c | 2021-04-03 15:04:24 -0700 | [diff] [blame] | 1 | [bits 32] |
| 2 | [extern _do_switch_task] |
| 3 | [global switch_task] |
| 4 | switch_task: |
| 5 | pusha ; Save everything |
| 6 | push esp ; Arguments for _do_switch_task(eip, ebp, esp) |
| 7 | push ebp |
| 8 | push .after |
| 9 | call _do_switch_task |
| 10 | .after: |
swissChili | 172fd63 | 2021-04-04 19:02:36 -0700 | [diff] [blame] | 11 | ;; add esp, 12 ; Clear the arguments |
swissChili | cfd3c3c | 2021-04-03 15:04:24 -0700 | [diff] [blame] | 12 | popa ; Reset everything |
| 13 | xor eax, eax ; Return 0 |
swissChili | 52a03d8 | 2021-07-18 15:22:14 -0700 | [diff] [blame^] | 14 | ret |
swissChili | cfd3c3c | 2021-04-03 15:04:24 -0700 | [diff] [blame] | 15 | |
| 16 | [global _switch_to_task] |
swissChili | 7be3274 | 2021-04-03 21:17:24 -0700 | [diff] [blame] | 17 | ;; _switch_to_task(uint page_directory, uint eip, uint ebp, uint esp) |
swissChili | cfd3c3c | 2021-04-03 15:04:24 -0700 | [diff] [blame] | 18 | _switch_to_task: ; (page_directory, eip, ebp, esp) |
| 19 | add esp, 4 ; We don't care about the return address |
swissChili | cfd3c3c | 2021-04-03 15:04:24 -0700 | [diff] [blame] | 20 | |
swissChili | 7be3274 | 2021-04-03 21:17:24 -0700 | [diff] [blame] | 21 | pop ecx ; Page directory |
| 22 | pop eax ; eip |
| 23 | pop ebp |
| 24 | pop ebx ; esp |
| 25 | |
swissChili | cfd3c3c | 2021-04-03 15:04:24 -0700 | [diff] [blame] | 26 | mov esp, ebx ; Reset old stack |
| 27 | |
| 28 | mov cr3, ecx ; Set page directory |
| 29 | sti |
| 30 | jmp eax ; Jump back to code |