gonna ask tsoding for help, fuck this shit
This commit is contained in:
+15
-19
@@ -16,39 +16,33 @@ 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
|
||||
push ebp
|
||||
|
||||
; Сохраняем указатель стека в current->context
|
||||
mov edi, [current]
|
||||
mov [edi + 12], esp ; PCB.CONTEXT находится по смещению 12
|
||||
mov [eax+4], esp
|
||||
mov esp, [edx+4]
|
||||
|
||||
; Загружаем следующий процесс
|
||||
mov esi, [esp + 20] ; next (первый аргумент)
|
||||
mov [current], esi
|
||||
mov esp, [esi + 12] ; Загружаем esp из next->context
|
||||
;mov eax, [edx+12]
|
||||
;sub eax, 0xC0000000
|
||||
;mov cr3, eax
|
||||
|
||||
; Восстанавливаем регистры
|
||||
pop ebp
|
||||
pop edi
|
||||
pop esi
|
||||
pop ebx
|
||||
pop ebp
|
||||
|
||||
|
||||
; Проверяем ring процесса
|
||||
mov eax, [esi + 20] ; PCB.RING находится по смещению 20
|
||||
cmp eax, 3
|
||||
je .ring3
|
||||
sti
|
||||
ret ; Для ring 0 просто возвращаемся
|
||||
.ring3:
|
||||
jmp trapret ; Для ring 3 переходим через trapret
|
||||
|
||||
|
||||
trapret:
|
||||
; Восстанавливаем общие регистры из trap frame
|
||||
popal ; edi, esi, ebp, oesp, ebx, edx, ecx, eax
|
||||
;popal ; edi, esi, ebp, oesp, ebx, edx, ecx, eax
|
||||
|
||||
; Восстанавливаем сегментные регистры
|
||||
pop gs
|
||||
@@ -56,6 +50,8 @@ trapret:
|
||||
pop es
|
||||
pop ds
|
||||
|
||||
popad
|
||||
|
||||
; Пропускаем trapno и err
|
||||
add esp, 8 ; trapno (4 байта) + err (4 байта)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user