change functionality of f68:15, f68:18 (discussion on forum topic 1253)

git-svn-id: svn://kolibrios.org@1074 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Galkov
2009-05-22 08:55:09 +00:00
parent 4cb80b2638
commit 8d75380caf
9 changed files with 828 additions and 889 deletions

View File

@@ -468,7 +468,7 @@ struc EVENT
.id dd ? ;event uid
.state dd ? ;internal flags
.code dd ?
rd 6
rd 5
.size = $ - .magic
.codesize = $ - .code
}

View File

@@ -181,110 +181,3 @@ except_7: ;#NM exception handler
iglobal
fpu_owner dd 0
endg
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
align 4 ;not used now
proc except_16 ;fpu native exceptions handler
test byte [esp+8+2], 2
jnz v86_except_16
push ebp
mov ebp, esp
push eax
push ebx
push ecx
push edx
mov ebx, [CURRENT_TASK]
shl ebx, 8
mov eax, [ebx+SLOT_BASE+APPDATA.fpu_handler]
test eax, eax
jz .default
mov ecx, [reg_eip]
mov edx, [reg_esp]
sub edx, 4
mov [edx], ecx
mov [reg_esp], edx
mov dword [reg_eip], eax
pop edx
pop ecx
pop ebx
pop eax
leave
iretd
.default:
pop edx
pop ecx
pop ebx
pop eax
leave
save_ring3_context ;debugger support
mov bl, 16
jmp exc_c
endp
align 4 ;not used now
proc except_19 ;sse exceptions handler
test byte [esp+8+2], 2
jnz v86_except_19
push ebp
mov ebp, esp
push eax
push ebx
push ecx
push edx
mov ebx, [current_slot]
mov eax, [ebx+APPDATA.sse_handler]
test eax, eax
jz .default
mov ecx, [reg_eip]
mov edx, [reg_esp]
sub edx, 4
mov [edx], ecx
mov [reg_esp], edx
mov dword [reg_eip], eax
pop edx
pop ecx
pop ebx
pop eax
leave
iretd
.default:
pop edx
pop ecx
pop ebx
pop eax
leave
save_ring3_context ;debugger support
mov bl, 19
jmp exc_c
endp
restore reg_eip
restore reg_cs
restore reg_eflags
restore reg_esp
restore reg_ss

View File

@@ -1033,10 +1033,11 @@ f68:
mov [esp+36], eax
ret
.15:
mov ecx, [current_slot]
mov eax, [ecx+APPDATA.fpu_handler]
mov [ecx+APPDATA.fpu_handler], ebx
mov [esp+36], eax
mov eax, [current_slot]
xchg ebx, [eax+APPDATA.exc_handler]
xchg ecx, [eax+APPDATA.except_mask]
mov [esp+36], ebx ; reg_eax+8
mov [esp+24], ecx ; reg_ebx+8
ret
.16:
test ebx, ebx
@@ -1051,11 +1052,12 @@ f68:
mov [esp+36], eax
ret
.18:
mov ecx, [current_slot]
mov eax, [ecx+APPDATA.sse_handler]
mov [ecx+APPDATA.sse_handler], ebx
mov [esp+36], eax
ret
mov eax, [current_slot]
btr [eax+APPDATA.except_mask],ebx
setc byte[esp+36]
jecxz @f
bts [eax+APPDATA.except_mask],ebx
@@: ret
.19:
cmp ebx, OS_BASE
jae .fail

View File

@@ -124,22 +124,20 @@ exc_c: ;
Mov ds,ax,app_data ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mov es,ax ; <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
cld ; <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DF <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
movzx ebx,bl
; redirect to V86 manager? (EFLAGS & 0x20000) != 0?
test byte[reg_eflags+2],2
jnz v86_exc_c
cmp bl,14 ; #PF
jne .l0
jne @f
call page_fault_handler
.l0: mov esi, [current_slot]
mov eax,[esi+APPDATA.fpu_handler]
cmp bl,16 ; #MF
je .l1
cmp bl,19 ; #XF
jne .l2
mov eax,[esi+APPDATA.sse_handler]
.l1: test eax, eax
@@: mov esi, [current_slot]
btr [esi+APPDATA.except_mask], ebx
jnc @f
mov eax,[esi+APPDATA.exc_handler]
test eax, eax
jnz IRetToUserHook
.l2: cli
@@: cli
mov eax, [esi+APPDATA.debugger_slot]
test eax, eax
jnz .debug
@@ -154,15 +152,16 @@ exc_c: ;
; eax=debugger PID
cmp bl,1 ; #DB
je debug_ex
movzx edx, bl ; debug_message data=Number_Of_Exception
mov edx, ebx ; debug_message data=Number_Of_Exception
mov ecx,1 ; debug_message code=other_exception
jmp debug_ex.notify ; notify debugger and suspend ourself
IRetToUserHook:
xchg eax, [reg_eip]
sub dword[reg_esp3], 4
sub dword[reg_esp3], 8
mov edi, [reg_esp3]
stosd
mov [edi], ebx
restore_ring3_context
unknown_interrupt:
iretd
@@ -176,8 +175,7 @@ show_error_parameters:
cmp bl, 0x0e
jbe .l1
.l0: mov bl, 0x09
.l1: movzx eax,bl
mov eax,[msg_fault_sel+eax*4 - 0x08*4]
.l1: mov eax,[msg_fault_sel+ebx*4 - 0x08*4]
DEBUGF 1, "K : %s\n", eax
mov eax, [reg_cs3+4]
mov edi, msg_sel_app

View File

@@ -955,8 +955,8 @@ proc set_app_params stdcall,slot:dword, params:dword,\
shl eax, 8
mov [eax+SLOT_BASE+APPDATA.fpu_state], edi
mov [eax+SLOT_BASE+APPDATA.fpu_handler], 0
mov [eax+SLOT_BASE+APPDATA.sse_handler], 0
mov [eax+SLOT_BASE+APPDATA.exc_handler], 0
mov [eax+SLOT_BASE+APPDATA.except_mask], 0
;set default io permission map
mov [eax+SLOT_BASE+APPDATA.io_map],\

View File

@@ -3641,30 +3641,49 @@ Architecture Software Developer's Manual, Volume 3, Appendix B);
<20><><EFBFBD> <20><><EFBFBD><EFBFBD>㭪樥<E3ADAA> 20.
======================================================================
===== <20><EFBFBD><E3ADAA><EFBFBD> 68, <20><><EFBFBD><EFBFBD><EFBFBD><E3ADAA><EFBFBD> 14 - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E9A5AD> <20><> <20><EFBFBD><E0A0A9><EFBFBD><EFBFBD>. =====
==================== <20><EFBFBD><E3ADAA><EFBFBD> 68, <20><><EFBFBD><EFBFBD><EFBFBD><E3ADAA><EFBFBD> 14 =======================
===== <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E7A5AD><><E1A8A3><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD> <20><EFBFBD><E0A8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><EFBFBD><E0A0A9>஢. =====
======================================================================
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* eax = 68 - <20><><EFBFBD><EFBFBD><EFBFBD> <20>㭪樨
* ebx = 14 - <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>㭪樨
* ecx = 㪠<><E3AAA0><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>樨 (8 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
* ecx = 㪠<><E3AAA0><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>樨 (24 <20><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E7A5AD>:
* <20><><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><EFBFBD><EBA2A0> ecx, ᮤ<><EFBFBD><><E1ABA5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E0ACA0><EFBFBD>:
* +0: dword: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> EV_INTR = 1
* +4: dword: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A5A0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0A5A1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>쭮 "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
<20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><E0A5AA><EFBFBD><E7A5AD> <20><><EFBFBD><EFBFBD><E2A5AA><EFBFBD>.
* +0: dword: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E1ABA5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1A8A3><EFBFBD><EFBFBD>
* +4: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EFBFBD><><E1A8A3><EFBFBD><EFBFBD> (20 <20><><EFBFBD><EFBFBD>), <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> dword-<2D><>
======================================================================
== <20><EFBFBD><E3ADAA><EFBFBD> 68, <20><><EFBFBD><EFBFBD><EFBFBD><E3ADAA><EFBFBD> 15 - <20><><EFBFBD><E2A0AD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A0A1><20><EFBFBD><EFBFBD><E7A5AD> FPU. =
==== <20><EFBFBD><E3ADAA><EFBFBD> 68, <20><><EFBFBD><EFBFBD><EFBFBD><E3ADAA><EFBFBD> 15 - <20><><EFBFBD><E2A0AD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A0A1><20><EFBFBD><EFBFBD><E7A5AD> ===
======================================================================
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* eax = 68 - <20><><EFBFBD><EFBFBD><EFBFBD> <20>㭪樨
* ebx = 15 - <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>㭪樨
* ecx = <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A0A1><EFBFBD> <20><EFBFBD><EFBFBD><E7A5AD>
* edx = <20><><20><><EFBFBD><E0A0A1><EFBFBD><EBA2A0><EFBFBD><EFBFBD> <20><EFBFBD><EFBFBD><E7A5AD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E7A5AD>:
* eax = <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><E0A0A1><EFBFBD> <20><EFBFBD><EFBFBD><E7A5AD>
(0, <20><20><> <20><> <20><><EFBFBD> <20><><EFBFBD><E2A0AD><EFBFBD><EFBFBD><EFBFBD>)
* ebx = <20><><20><><EFBFBD><EFBFBD> <20><><EFBFBD><E0A0A1><EFBFBD> <20><EFBFBD><EFBFBD><E7A5AD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><20><EFBFBD><EFBFBD><E7A5AD> ᮮ⢥<E1AEAE><E2A2A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EFBFBD><E7A5AD> <20><>
<><E1AFA5><EFBFBD><20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Intel-PC). <20><><EFBFBD> <20><><EFBFBD><EFBFBD><E0A8AC>, <20><EFBFBD><EFBFBD><E7A5AD> FPU
<20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> 16 (#MF), <20> SSE - 19 (#XF).
* <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E0A5A0><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EFBFBD><E7A5AD> 7
- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><E0A0A1><EFBFBD><EBA2A0> #NM ᠬ<><E1A0AC><EFBFBD><EFBFBD><EFBFBD>⥫쭮.
* <20><><EFBFBD><EFBFBD><ECA7AE><EFBFBD><EFBFBD> <20><><EFBFBD><E0A0A1><20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EFBFBD><E7A5AD> <20><><EFBFBD><E0A0AC>
<20> <20><EFBFBD>. <20><><EFBFBD><EFBFBD> <20><EFBFBD><E0A0A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><20><> <20><><EFBFBD><E0A0A1><EFBFBD>: RET 4. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD> <20><20><EFBFBD><E0AEA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><EFBFBD><EBA7A2><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EFBFBD><E7A5AD>.
* <20><><EFBFBD> <20><><EFBFBD><E0A5A4><EFBFBD> <20><><EFBFBD><E0A0A2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A0A1><EFBFBD> <20><EFBFBD><EFBFBD><E7A5AD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBA2A0><EFBFBD><EFBFBD>
ᮮ⢥<E1AEAE><E2A2A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD> <20> <20><><20><EFBFBD><EFBFBD><E7A5AD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD> <20><>
<20><EFBFBD><EFBFBD><E7A5AD> <20> <20><><EFBFBD><E1ABA5><EFBFBD> - <20><EFBFBD><E0A8A2><EFBFBD><EFBFBD> <20> default-<2D><><EFBFBD>⪥ ⠪<><E2A0AA><EFBFBD><EFBFBD><EFBFBD>.
<20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8A5AD><><E0A0A1><EFBFBD> <20><EFBFBD><E0A8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><EFBFBD><EFBFBD><E2A0AD><EFBFBD><EFBFBD> <20>
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E2ABA0><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0A8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
* <20><><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8A5AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><E0A0A1><EFBFBD> <20><><EFBFBD><EFBFBD><ECA7AE><EFBFBD>,
<20><><EFBFBD><EFBFBD><EFBFBD><E2A0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EFBFBD><E7A5AD> <20><><EFBFBD><EFBFBD><EFBFBD><><E1A4A5><EFBFBD><EFBFBD>
<20><><EFBFBD><EFBFBD>㭪樥<E3ADAA> 18. <20><><EFBFBD><EFBFBD><EFBFBD><><E4ABA0><EFBFBD> <20><EFBFBD><EFBFBD><E7A5AD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FPU <20> XMM -
<><E2A0AA> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><E0A0A1><20><><EFBFBD><EFBFBD><ECA7AE><EFBFBD>.
======================================================================
=========== <20><EFBFBD><E3ADAA><EFBFBD> 68, <20><><EFBFBD><EFBFBD><EFBFBD><E3ADAA><EFBFBD> 16 - <20><><EFBFBD><EFBFBD><EFBFBD><E3A7A8> <20><EFBFBD><E0A0A9><EFBFBD>. ===========
@@ -3705,15 +3724,19 @@ Architecture Software Developer's Manual, Volume 3, Appendix B);
* <20><EFBFBD><E0A5A4><EFBFBD><EFBFBD>⥫쭮 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0A0A9><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>㭪樥<E3ADAA> 16.
======================================================================
== <20><EFBFBD><E3ADAA><EFBFBD> 68, <20><><EFBFBD><EFBFBD><EFBFBD><E3ADAA><EFBFBD> 18 - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><20><EFBFBD><EFBFBD><E7A5AD> SSE. =
= <20><EFBFBD><E3ADAA><EFBFBD> 68, <20><><EFBFBD><EFBFBD><EFBFBD><E3ADAA><EFBFBD> 18 - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E2A8A2><EFBFBD><EFBFBD><EFBFBD><><E1A8A3><EFBFBD><EFBFBD> =
======================================================================
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* eax = 68 - <20><><EFBFBD><EFBFBD><EFBFBD> <20>㭪樨
* ebx = 18 - <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>㭪樨
* ecx = <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A0A1><EFBFBD> <20><EFBFBD><EFBFBD><EFBFBD>
* ecx = <20><><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* edx = <20><><EFBFBD><EFBFBD><E7A5AD> <20><><EFBFBD><E2A0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E2A8A2><EFBFBD><EFBFBD><EFBFBD> (0/1)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E7A5AD>:
* eax = <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
(0, <20><20><> <20><> <20><><EFBFBD> <20><><EFBFBD><E2A0AD><EFBFBD><EFBFBD><EFBFBD>)
* eax = <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> (0/1)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <20><>饩 ॠ<><E0A5A0><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ⮫쪮 <20><><20><><EFBFBD><EFBFBD><ECA7AE><EFBFBD><EFBFBD><E1AAAE>
<20><><EFBFBD><E0A0A1><EFBFBD> <20><EFBFBD><EFBFBD><E7A5AD>, <20><><EFBFBD><E2A0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>㭪樥<E3ADAA> 15. <20><><EFBFBD> <20>
<20><><EFBFBD><EFBFBD><EFBFBD><><E1A8A3><EFBFBD><EFBFBD> ᮮ⢥<E1AEAE><E2A2A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EFBFBD><E7A5AD>.
======================================================================
============= <20><EFBFBD><E3ADAA><EFBFBD> 68, <20><><EFBFBD><EFBFBD><EFBFBD><E3ADAA><EFBFBD> 19 - <20><><EFBFBD><EFBFBD><EFBFBD><E3A7A8> DLL. =============

View File

@@ -3613,29 +3613,47 @@ Remarks:
or subfunction 20.
======================================================================
======== Function 68, subfunction 14 - wait for driver notify. =======
===================== Function 68, subfunction 14 ====================
====== Waiting delivering of signal from another program/driver ======
======================================================================
Parameters:
* eax = 68 - function number
* ebx = 14 - subfunction number
* ecx = pointer to the buffer for information (8 bytes)
* ecx = pointer to the buffer for information (24 bytes)
Returned value:
* buffer pointed to by ecx contains the following information:
* +0: dword: constant EV_INTR = 1
* +4: dword: driver data
Remarks:
* The current implementation at wait time uses "heavy" operations
of task switch.
* +0: dword: identifier for underlying data of signal
* +4: data of signal (20 bytes), format of which is defining by
first dword
======================================================================
====== Function 68, subfunction 15 - set FPU exception handler. ======
====== Function 68, subfunction 15 - set new exceptions handler ======
======================================================================
Parameters:
* eax = 68 - function number
* ebx = 15 - subfunction number
* ecx = address of the new exception handler
* edx = the mask of processing exceptions
Returned value:
* eax = address of the old exception handler (0, if it was not set)
* ebx = the old mask of exception handler
Remarks:
* Bit number in mask of exceptions is correspond to exception number
by CPU-specification (Intel-PC). For example, FPU-exception have
number 16 (#MF), and SSE-exception - 19 (#XF)
* The current implementation ignore the inquiry for hook of 7
exception - system process #NM by one's own.
* User handler get exception number in stack parameter. So, correct
exit from handler is: RET 4. Return from handler is to the same
instruction, that was cause the exception
* When control is transfering to user handler, corresponding bit in
exception mask is clearing. Rising this exception in consequence
- reduce to default-handling. Exactly: terminating the application,
or suspending with debug-notify to owner.
* After completion of critical operations in user handler, it may be
rising corresponding bit in exception mask by using subfunction 18
Clearing exceptions flags in FPU and/or XMM modules - is
responsibility of user handler too.
======================================================================
============= Function 68, subfunction 16 - load driver. =============
@@ -3676,14 +3694,19 @@ Remarks:
* Previously one must obtain driver handle by subfunction 16.
======================================================================
====== Function 68, subfunction 18 - set SSE exception handler. ======
==== Function 68, subfunction 18 - change state of signal activity ===
======================================================================
Parameters:
* eax = 68 - function number
* ebx = 15 - subfunction number
* ecx = address of the new exception handler
* ecx = signal number
* edx = value of activity (0/1)
Returned value:
* eax = address of the old exception handler (0, if it was not set)
* eax = value of old activity for this signal (0/1)
Remarks:
* In current implementation, it is changed only exception mask for
user exception handler, wich was previously set by subfunction 15.
At that, number of signal correspond to exception number.
======================================================================
=============== Function 68, subfunction 19 - load DLL. ==============

View File

@@ -675,8 +675,8 @@ no_lib_load:
xor eax, eax
mov dword [SLOT_BASE+APPDATA.fpu_state], fpu_data
mov dword [SLOT_BASE+APPDATA.fpu_handler], eax
mov dword [SLOT_BASE+APPDATA.sse_handler], eax
mov dword [SLOT_BASE+APPDATA.exc_handler], eax
mov dword [SLOT_BASE+APPDATA.except_mask], eax
; name for OS/IDLE process
@@ -697,8 +697,8 @@ no_lib_load:
cld
rep movsd
mov dword [SLOT_BASE+256+APPDATA.fpu_handler], eax
mov dword [SLOT_BASE+256+APPDATA.sse_handler], eax
mov dword [SLOT_BASE+256+APPDATA.exc_handler], eax
mov dword [SLOT_BASE+256+APPDATA.except_mask], eax
mov ebx, SLOT_BASE+256+APP_OBJ_OFFSET
mov dword [SLOT_BASE+256+APPDATA.fd_obj], ebx

View File

@@ -122,8 +122,8 @@ struc APPDATA
.fpu_state dd ? ;+16
.ev_count_ dd ? ;unused ;+20
.fpu_handler dd ? ;+24
.sse_handler dd ? ;+28
.exc_handler dd ? ;+24
.except_mask dd ? ;+28
.pl0_stack dd ? ;unused ;+32
.heap_base dd ? ;+36
.heap_top dd ? ;+40