/kernel/trunk/core/except.inc |
---|
0,0 → 1,64 |
reg_eip equ ebp+4 |
reg_cs equ ebp+8 |
reg_eflags equ ebp+12 |
reg_esp equ ebp+16 |
reg_ss equ ebp+20 |
fpu_ctrl equ ebp-28 |
align 4 |
except_16: |
push ebp |
mov ebp, esp |
sub esp, 28 |
push eax |
push ebx |
push ecx |
push edx |
mov ebx, [ss:CURRENT_TASK] |
shl ebx, 8 |
mov eax, [ss:ebx+PROC_BASE+APPDATA.fpu_handler] |
test eax, eax |
jz .default |
mov ecx, [reg_eip] |
mov edx, [reg_esp] |
sub edx, 4 |
mov [ss:edx+new_app_base], ecx |
mov [reg_esp], edx |
mov dword [reg_eip], eax |
pop edx |
pop ecx |
pop ebx |
pop eax |
leave |
iretd |
.default: |
fnstenv [fpu_ctrl] |
fnclex |
or word [fpu_ctrl], 0111111b |
fldenv [fpu_ctrl] |
pop edx |
pop ecx |
pop ebx |
pop eax |
leave |
iretd |
restore reg_eip |
restore reg_cs |
restore reg_eflags |
restore reg_esp |
restore reg_ss |
restore fpu_ctrl |