Files
KatauOS/src/tasking/switch.asm
T

60 lines
1.3 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
switchProcess:
mov eax, [esp + 4] ; eax = old
mov edx, [esp + 8] ; edx = new
push ebp
push ebx
push esi
push edi
mov [eax+4], esp
mov esp, [edx+4]
;mov eax, [edx+12]
;sub eax, 0xC0000000
;mov cr3, eax
pop edi
pop esi
pop ebx
pop ebp
ret ; Для ring 0 просто возвращаемся
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