kolibri-acpi: destroy_futex()

git-svn-id: svn://kolibrios.org@5597 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Sergey Semyonov (Serge) 2015-07-22 15:07:12 +00:00
parent 80a2140a64
commit f6a101596a
2 changed files with 77 additions and 37 deletions

View File

@ -354,6 +354,10 @@ EVENT_EXTENDED equ 0x00000400
EV_INTR equ 1 EV_INTR equ 1
STDIN_FILENO equ 0
STDOUT_FILENO equ 1
STDERR_FILENO equ 2
struct SYSCALL_STACK struct SYSCALL_STACK
_eip dd ? _eip dd ?
_edi dd ? ; +4 _edi dd ? ; +4
@ -399,8 +403,9 @@ struct FUTEX
ends ends
FUTEX_INIT equ 0 FUTEX_INIT equ 0
FUTEX_WAIT equ 1 FUTEX_DESTROY equ 1
FUTEX_WAKE equ 2 FUTEX_WAIT equ 2
FUTEX_WAKE equ 3
struct PROC struct PROC
list LHEAD list LHEAD

View File

@ -28,28 +28,78 @@ create_futex:
.fail: .fail:
ret ret
align 4
;int __fastcall destroy_futex(struct futex *futex)
destroy_futex:
push esi
mov esi, [current_process]
mov edx, [ecx+FUTEX.handle]
pushfd
cli
lea eax, [ecx+FUTEX.wait_list]
cmp eax, [eax+LHEAD.next]
jne .fail
mov eax, [esi+PROC.ht_next]
mov [esi+PROC.htab+edx*4], eax
mov [esi+PROC.ht_next], edx
inc [esi+PROC.ht_free]
popfd
pop esi
mov eax, ecx
call free
xor eax, eax
ret
.fail:
popfd
pop esi
mov eax, -1
ret
iglobal iglobal
align 4 align 4
f77call: f77call:
dd f77.futex_init ;0 dd f77.futex_init ;0
dd f77.futex_wait ;1 dd f77.futex_destroy ;1
dd f77.futex_wake ;2 dd f77.futex_wait ;2
dd f77.futex_wake ;3
.end: .end:
endg endg
align 4 align 4
sys_synchronization: sys_synchronization:
f77: f77:
test ebx, ebx
jz .futex_init
cmp ebx, (f77call.end-f77call)/4 cmp ebx, (f77call.end-f77call)/4
jae .fail jae .fail
cmp ecx, STDERR_FILENO
jbe .fail
cmp ecx, (PROC.pdt_0 - PROC.htab)/4
jae .fail
mov esi, [current_process]
mov edi, [esi+PROC.htab+ecx*4]
cmp [edi+FUTEX.magic], 'FUTX'
jne .fail
cmp [edi+FUTEX.handle], ecx
jne .fail
jmp dword [f77call+ebx*4] jmp dword [f77call+ebx*4]
.fail: .fail:
mov [esp+SYSCALL_STACK._eax], -1 mov [esp+SYSCALL_STACK._eax], -1
ret ret
align 4 align 4
.futex_init: .futex_init:
call create_futex call create_futex
@ -60,25 +110,24 @@ align 4
mov [esp+SYSCALL_STACK._eax], eax mov [esp+SYSCALL_STACK._eax], eax
ret ret
align 4 align 4
;ecx futex handle ;ecx futex handle
;esi current process
;edi futex object
.futex_destroy:
mov ecx, edi
call destroy_futex
mov [esp+SYSCALL_STACK._eax], eax
ret
align 4
;ecx futex handle
;esi current process
;edi futex object
;edx control value ;edx control value
.futex_wait: .futex_wait:
cmp ecx, 3
jb .epicfail
cmp ecx, (PROC.pdt_0 - PROC.htab)/4
jae .epicfail
mov esi, [current_process]
mov edi, [esi+PROC.htab+ecx*4]
cmp [edi+FUTEX.magic], 'FUTX'
jne .epicfail
cmp [edi+FUTEX.handle], ecx
jne .epicfail
mov ecx, [edi+FUTEX.pointer] mov ecx, [edi+FUTEX.pointer]
mov eax, edx mov eax, edx
lock cmpxchg [ecx], edx ;wait until old_value == new_value lock cmpxchg [ecx], edx ;wait until old_value == new_value
jz .wait_slow jz .wait_slow
@ -111,26 +160,12 @@ align 4
mov [esp+SYSCALL_STACK._eax], 0 mov [esp+SYSCALL_STACK._eax], 0
ret ret
.epicfail:
mov [esp+SYSCALL_STACK._eax], -1
ret
align 4 align 4
;ecx futex handle ;ecx futex handle
;esi current process
;edi futex object
;edx threads count ;edx threads count
.futex_wake: .futex_wake:
cmp ecx, 3
jb .epicfail
cmp ecx, (PROC.pdt_0 - PROC.htab)/4
jae .epicfail
mov esi, [current_process]
mov edi, [esi+PROC.htab+ecx*4]
cmp [edi+FUTEX.magic], 'FUTX'
jne .epicfail
cmp [edi+FUTEX.handle], ecx
jne .epicfail
xor ecx, ecx xor ecx, ecx
@ -138,7 +173,7 @@ align 4
cli cli
lea ebx, [edi+FUTEX.wait_list] lea ebx, [edi+FUTEX.wait_list]
mov esi, [edi+FUTEX.wait_list.next] mov esi, [ebx+LHEAD.next]
@@: @@:
cmp esi, ebx cmp esi, ebx
je @F je @F