Files
KatauOS/src/tasking/switch.asm
T

62 lines
1.5 KiB
NASM

struc PCB
.PID resd 1 ; Offset: 0
.STATE resd 1 ; Offset: 4
.KSTACK resd 1 ; Offset: 8
.CONTEXT resd 1 ; Offset: 12
.TF resd 1 ; Offset: 16
.FLAGS resd 1 ; Offset: 20
.NEXT resd 1 ; Offset: 24
.PAGE_DIRECTORY resd 1 ; Offset: 28
endstruc
; void switchProcess(Process* next)
section .text
global switchProcess
extern current
extern trapret
; void switchProcess(Process* next_process_ptr)
switchProcess:
mov edx, [esp + 4] ; edx = next_process_ptr (получаем аргумент СРАЗУ)
cli ; Запретить прерывания
push ebp
push ebx
push esi
push edi
mov eax, [current]
mov [eax + 4], esp ; current->kesp = esp
; edx уже содержит next_process_ptr
mov esp, [edx + 4] ; esp = next_process_ptr->kesp
mov [current], edx ; current = next_process_ptr
mov eax, [edx + 40]
mov cr3, eax
pop edi
pop esi
pop ebx
pop ebp
ret
trapret:
; Восстанавливаем общие регистры из trap frame
;popal ; edi, esi, ebp, oesp, ebx, edx, ecx, eax
; Восстанавливаем сегментные регистры
pop gs
pop fs
pop es
pop ds
popad
; Пропускаем trapno и err
add esp, 8 ; trapno (4 байта) + err (4 байта)
; Теперь ESP указывает на eip, cs, eflags, esp, ss
iret