kolibri-acpi: code cleanup

git-svn-id: svn://kolibrios.org@5593 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Sergey Semyonov (Serge) 2015-07-22 06:45:59 +00:00
parent c63fea095e
commit 80ceac6a9f
6 changed files with 623 additions and 626 deletions

View File

@ -354,17 +354,205 @@ EVENT_EXTENDED equ 0x00000400
EV_INTR equ 1 EV_INTR equ 1
struct THR_DATA struct SYSCALL_STACK
rb (8192-512) _eip dd ?
; pl0_stack _edi dd ? ; +4
fpu_state rb 512 _esi dd ? ; +8
tls_page rb 4096 _ebp dd ? ; +12
pdbr rb 4096 _esp dd ? ; +16
_ebx dd ? ; +20
_edx dd ? ; +24
_ecx dd ? ; +28
_eax dd ? ; +32
ends ends
virtual at (OS_BASE-sizeof.THR_DATA) struct LHEAD
thr_data THR_DATA next dd ? ;next object in list
end virtual prev dd ? ;prev object in list
ends
struct MUTEX_WAITER
list LHEAD
task dd ?
type dd ?
ends
struct MUTEX
wait_list LHEAD
count dd ?
ends
struct RWSEM
wait_list LHEAD
count dd ?
ends
struct FUTEX
list LHEAD
magic dd ?
handle dd ?
destroy dd ?
wait_list LHEAD
pointer dd ?
flags dd ?
ends
FUTEX_INIT equ 0
FUTEX_WAIT equ 1
FUTEX_WAKE equ 2
struct PROC
list LHEAD
thr_list LHEAD
heap_lock MUTEX
heap_base rd 1
heap_top rd 1
mem_used rd 1
dlls_list_ptr rd 1
pdt_0_phys rd 1
pdt_1_phys rd 1
io_map_0 rd 1
io_map_1 rd 1
ht_lock rd 1
ht_free rd 1 ;htab[0] stdin
ht_next rd 1 ;htab[1] stdout
htab rd (4096-$)/4 ;htab[2] stderr
pdt_0 rd 1024
ends
struct DBG_REGS
dr0 dd ?
dr1 dd ?
dr2 dd ?
dr3 dd ?
dr7 dd ?
ends
struct POINT
x dd ?
y dd ?
ends
struct RECT
left dd ?
top dd ?
right dd ?
bottom dd ?
ends
struct BOX
left dd ?
top dd ?
width dd ?
height dd ?
ends
struct APPDATA
app_name rb 11
rb 5
list LHEAD ;+16
process dd ? ;+24
fpu_state dd ? ;+28
exc_handler dd ? ;+32
except_mask dd ? ;+36
pl0_stack dd ? ;+40
cursor dd ? ;+44
fd_ev dd ? ;+48
bk_ev dd ? ;+52
fd_obj dd ? ;+56
bk_obj dd ? ;+60
saved_esp dd ? ;+64
io_map rd 2 ;+68
dbg_state dd ? ;+76
cur_dir dd ? ;+80
wait_timeout dd ? ;+84
saved_esp0 dd ? ;+88
wait_begin dd ? ;+92 +++
wait_test dd ? ;+96 +++
wait_param dd ? ;+100 +++
tls_base dd ? ;+104
dd ? ;+108
event_filter dd ? ;+112
draw_bgr_x dd ? ;+116
draw_bgr_y dd ? ;+120
dd ? ;+124
wnd_shape dd ? ;+128
wnd_shape_scale dd ? ;+132
dd ? ;+136
dd ? ;+140
saved_box BOX ;+144
ipc_start dd ? ;+160
ipc_size dd ? ;+164
event_mask dd ? ;+168
debugger_slot dd ? ;+172
terminate_protection dd ? ;+176
keyboard_mode db ? ;+180
rb 3
dd ? ;+184
dbg_event_mem dd ? ;+188
dbg_regs DBG_REGS ;+192
wnd_caption dd ? ;+212
wnd_clientbox BOX ;+216
priority dd ? ;+232
in_schedule LHEAD ;+236
ends
APP_OBJ_OFFSET equ 48
APP_EV_OFFSET equ 40
struct TASKDATA
event_mask dd ?
pid dd ?
dw ?
state db ?
db ?
dw ?
wnd_number db ?
db ?
mem_start dd ?
counter_sum dd ?
counter_add dd ?
cpu_usage dd ?
ends
TSTATE_RUNNING = 0
TSTATE_RUN_SUSPENDED = 1
TSTATE_WAIT_SUSPENDED = 2
TSTATE_ZOMBIE = 3
TSTATE_TERMINATING = 4
TSTATE_WAITING = 5
TSTATE_FREE = 9
; constants definition
WSTATE_NORMAL = 00000000b
WSTATE_MAXIMIZED = 00000001b
WSTATE_MINIMIZED = 00000010b
WSTATE_ROLLEDUP = 00000100b
WSTATE_REDRAW = 00000001b
WSTATE_WNDDRAWN = 00000010b
WSTYLE_HASCAPTION = 00010000b
WSTYLE_CLIENTRELATIVE = 00100000b
; structures definition
struct WDATA
box BOX
cl_workarea dd ?
cl_titlebar dd ?
cl_frames dd ?
reserved db ?
fl_wstate db ?
fl_wdrawn db ?
fl_redraw db ?
ends
label WDATA.fl_wstyle byte at WDATA.cl_workarea + 3
struct SYS_VARS struct SYS_VARS
bpp dd ? bpp dd ?
@ -382,9 +570,6 @@ struct APPOBJ ; common object header
pid dd ? ; owner id pid dd ? ; owner id
ends ends
APP_OBJ_OFFSET equ 48
APP_EV_OFFSET equ 40
struct CURSOR APPOBJ struct CURSOR APPOBJ
base dd ? ;allocated memory base dd ? ;allocated memory
hot_x dd ? ;hotspot coords hot_x dd ? ;hotspot coords
@ -480,33 +665,6 @@ struct BOOT_DATA
dd ? dd ?
ends ends
struct LHEAD
next dd ? ;next object in list
prev dd ? ;prev object in list
ends
struct MUTEX
wait_list LHEAD
count dd ?
ends
struct RWSEM
wait_list LHEAD
count dd ?
ends
struct FUTEX
list LHEAD
magic dd ?
handle dd ?
destroy dd ?
wait_list LHEAD
pointer dd ?
flags dd ?
ends
struct display_t struct display_t
x dd ? x dd ?
y dd ? y dd ?
@ -545,6 +703,13 @@ struct display_t
bytes_per_pixel dd ? bytes_per_pixel dd ?
ends ends
struct DISPMODE
width dw ?
height dw ?
bpp dw ?
freq dw ?
ends
struct PCIDEV struct PCIDEV
bk dd ? bk dd ?
@ -557,6 +722,37 @@ struct PCIDEV
owner dd ? ; pointer to SRV or 0 owner dd ? ; pointer to SRV or 0
ends ends
struct IDE_DATA
ProgrammingInterface dd ?
Interrupt dw ?
RegsBaseAddres dw ?
BAR0_val dw ?
BAR1_val dw ?
BAR2_val dw ?
BAR3_val dw ?
dma_hdd_channel_1 db ?
dma_hdd_channel_2 db ?
ends
struct IDE_CACHE
pointer dd ?
size dd ? ; not use
data_pointer dd ?
system_data_size dd ? ; not use
appl_data_size dd ? ; not use
system_data dd ?
appl_data dd ?
system_sad_size dd ?
appl_sad_size dd ?
search_start dd ?
appl_search_start dd ?
ends
struct IDE_DEVICE
UDMA_possible_modes db ?
UDMA_set_mode db ?
ends
; The following macro assume that we are on uniprocessor machine. ; The following macro assume that we are on uniprocessor machine.
; Serious work is needed for multiprocessor machines. ; Serious work is needed for multiprocessor machines.
macro spin_lock_irqsave spinlock macro spin_lock_irqsave spinlock

View File

@ -1392,22 +1392,4 @@ create_object:
ret ret
align 4
;struct futex* __fastcall create_futex(int *ptr)
create_futex:
push ecx
mov ecx, sizeof.FUTEX
call create_object
pop ecx
test eax, eax
jz .fail
mov [eax+FUTEX.magic], 'FUTX'
mov [eax+FUTEX.destroy], 0
mov [eax+FUTEX.pointer], ecx
lea ecx, [eax+FUTEX.wait_list]
list_init ecx
mov [eax+FUTEX.flags], 0
.fail:
ret

View File

@ -1313,10 +1313,9 @@ f68:
mov [esp+32], eax mov [esp+32], eax
ret ret
iglobal
align 4 align 4
f68call: ; keep this table closer to main code f68call:
dd f68.11 ; init_heap dd f68.11 ; init_heap
dd f68.12 ; user_alloc dd f68.12 ; user_alloc
dd f68.13 ; user_free dd f68.13 ; user_free
@ -1334,7 +1333,7 @@ f68call: ; keep this table closer to main code
dd f68.25 ; unmask exception dd f68.25 ; unmask exception
dd f68.26 ; user_unmap dd f68.26 ; user_unmap
dd f68.27 ; load_file_umode dd f68.27 ; load_file_umode
endg
align 4 align 4
proc load_pe_driver stdcall, file:dword, cmdline:dword proc load_pe_driver stdcall, file:dword, cmdline:dword
@ -1447,130 +1446,6 @@ proc print_mem
ret ret
endp endp
FUTEX_INIT equ 0
FUTEX_WAIT equ 1
FUTEX_WAKE equ 2
align 4
f77call:
dd f77.futex_init ;0
dd f77.futex_wait ;1
dd f77.futex_wake ;2
align 4
sys_synchronization:
f77:
cmp ebx, FUTEX_WAKE
ja .fail
jmp dword [f77call+ebx*4]
.fail:
mov [esp+32], dword 0
ret
align 4
.futex_init:
call create_futex
test eax, eax
jz @F
mov eax, [eax+FUTEX.handle]
@@:
mov [esp+32], eax
ret
align 4
;ecx futex handle
;edx new value
.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 eax, edx
lock cmpxchg [ecx], edx ;wait until old_value == new_value
jz .wait_slow
mov [esp+SYSCALL_STACK._eax], 0
ret
.wait_slow:
pushfd
cli
sub esp, sizeof.MUTEX_WAITER
mov ebx, [TASK_BASE]
mov [ebx+TASKDATA.state], 1
mov [esp+MUTEX_WAITER.task], ebx
lea esi, [edi+FUTEX.wait_list]
list_add_tail esp, esi ;esp= new waiter, esi= list head
.again:
call change_task
lock cmpxchg [ecx], edx
jz .again
list_del esp
add esp, sizeof.MUTEX_WAITER
popfd
mov [esp+SYSCALL_STACK._eax], 0
ret
.epicfail:
mov [esp+SYSCALL_STACK._eax], -1
ret
align 4
.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
pushfd
cli
lea ebx, [edi+FUTEX.wait_list]
mov esi, [edi+FUTEX.wait_list.next]
@@:
cmp esi, ebx
je @F
mov eax, [esi+MUTEX_WAITER.task]
mov [eax+TASKDATA.state], 0
mov esi, [esi+MUTEX_WAITER.list.next]
inc ecx
cmp ecx, edx
jb @B
@@:
popfd
mov [esp+SYSCALL_STACK._eax], ecx
ret

View File

@ -153,246 +153,6 @@ do_change_task:
;end. ;end.
struct MUTEX_WAITER
list LHEAD
task dd ?
type dd ?
ends
RWSEM_WAITING_FOR_WRITE equ 0
RWSEM_WAITING_FOR_READ equ 1
;void __fastcall mutex_init(struct mutex *lock)
align 4
mutex_init:
mov [ecx+MUTEX.wait_list.next], ecx
mov [ecx+MUTEX.wait_list.prev], ecx
mov [ecx+MUTEX.count], 1
ret
;void __fastcall mutex_lock(struct mutex *lock)
align 4
mutex_lock:
dec [ecx+MUTEX.count]
jns .done
pushfd
cli
sub esp, sizeof.MUTEX_WAITER
list_add_tail esp, ecx ;esp= new waiter, ecx= list head
mov edx, [TASK_BASE]
mov [esp+MUTEX_WAITER.task], edx
.forever:
mov eax, -1
xchg eax, [ecx+MUTEX.count]
dec eax
jz @F
mov [edx+TASKDATA.state], 1
call change_task
jmp .forever
@@:
mov eax, ecx
list_del esp
cmp [eax+MUTEX.wait_list.next], eax
jne @F
mov [eax+MUTEX.count], 0
@@:
add esp, sizeof.MUTEX_WAITER
popfd
.done:
ret
;void __fastcall mutex_unlock(struct mutex *lock)
align 4
mutex_unlock:
pushfd
cli
mov eax, [ecx+MUTEX.wait_list.next]
cmp eax, ecx
mov [ecx+MUTEX.count], 1
je @F
mov eax, [eax+MUTEX_WAITER.task]
mov [eax+TASKDATA.state], 0
@@:
popfd
ret
;void __fastcall init_rwsem(struct rw_semaphore *sem)
align 4
init_rwsem:
mov [ecx+RWSEM.wait_list.next], ecx
mov [ecx+RWSEM.wait_list.prev], ecx
mov [ecx+RWSEM.count], 0
ret
;void __fastcall down_read(struct rw_semaphore *sem)
align 4
down_read:
pushfd
cli
mov eax, [ecx+RWSEM.count]
test eax, eax
js @F
cmp ecx, [ecx+RWSEM.wait_list.next]
je .ok
@@:
sub esp, sizeof.MUTEX_WAITER
mov eax, [TASK_BASE]
mov [esp+MUTEX_WAITER.task], eax
mov [esp+MUTEX_WAITER.type], RWSEM_WAITING_FOR_READ
mov [eax+TASKDATA.state], 1
list_add_tail esp, ecx ;esp= new waiter, ecx= list head
call change_task
add esp, sizeof.MUTEX_WAITER
popfd
ret
.ok:
inc eax
mov [ecx+RWSEM.count], eax
popfd
ret
;void __fastcall down_write(struct rw_semaphore *sem)
align 4
down_write:
pushfd
cli
sub esp, sizeof.MUTEX_WAITER
mov edx, [TASK_BASE]
mov [esp+MUTEX_WAITER.task], edx
mov [esp+MUTEX_WAITER.type], RWSEM_WAITING_FOR_WRITE
mov [edx+TASKDATA.state], 1
list_add_tail esp, ecx ;esp= new waiter, ecx= list head
xor eax, eax
not eax
.forever:
test eax, [ecx+RWSEM.count]
jz @F
mov [edx+TASKDATA.state], 1
call change_task
jmp .forever
@@:
mov [ecx+RWSEM.count], eax
list_del esp
add esp, sizeof.MUTEX_WAITER
popfd
ret
;void __fastcall up_read(struct rw_semaphore *sem)
align 4
up_read:
pushfd
cli
dec [ecx+RWSEM.count]
jnz @F
mov eax, [ecx+RWSEM.wait_list.next]
cmp eax, ecx
je @F
mov eax, [eax+MUTEX_WAITER.task]
mov [eax+TASKDATA.state], 0
@@:
popfd
ret
;void __fastcall up_write(struct rw_semaphore *sem)
align 4
up_write:
pushfd
cli
mov eax, [ecx+RWSEM.wait_list.next]
mov [ecx+RWSEM.count], 0
cmp ecx, eax
je .done
mov edx, [eax+MUTEX_WAITER.type]
test edx, edx
jnz .wake
mov eax, [eax+MUTEX_WAITER.task]
mov [eax+TASKDATA.state], 0
.done:
popfd
ret
.wake:
push ebx
push esi
push edi
xor esi, esi
mov edi, ecx
.wake_list:
mov ebx, [eax+MUTEX_WAITER.list.next]
list_del eax
mov edx, [eax+MUTEX_WAITER.task]
mov [edx+TASKDATA.state], 0
inc esi
cmp edi, ebx
je .wake_done
mov ecx, [ebx+MUTEX_WAITER.type]
test ecx, ecx
jz .wake_done
mov eax, ebx
jmp .wake_list
.wake_done:
add [edi+RWSEM.count], esi
pop edi
pop esi
pop ebx
popfd
ret
purge MUTEX_WAITER
purge RWSEM_WAITING_FOR_WRITE
purge RWSEM_WAITING_FOR_READ
MAX_PRIORITY = 0 ; highest, used for kernel tasks MAX_PRIORITY = 0 ; highest, used for kernel tasks

View File

@ -5,10 +5,394 @@
;; ;; ;; ;;
;; Synhronization for MenuetOS. ;; ;; Synhronization for MenuetOS. ;;
;; Author: Halyavin Andrey, halyavin@land.ru ;; ;; Author: Halyavin Andrey, halyavin@land.ru ;;
;; ;;
;; ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$Revision$ $Revision$
align 4
;struct futex* __fastcall create_futex(int *ptr)
create_futex:
push ecx
mov ecx, sizeof.FUTEX
call create_object
pop ecx
test eax, eax
jz .fail
mov [eax+FUTEX.magic], 'FUTX'
mov [eax+FUTEX.destroy], 0
mov [eax+FUTEX.pointer], ecx
lea ecx, [eax+FUTEX.wait_list]
list_init ecx
mov [eax+FUTEX.flags], 0
.fail:
ret
iglobal
align 4
f77call:
dd f77.futex_init ;0
dd f77.futex_wait ;1
dd f77.futex_wake ;2
.end:
endg
align 4
sys_synchronization:
f77:
cmp ebx, (f77call.end-f77call)/4
jae .fail
jmp dword [f77call+ebx*4]
.fail:
mov [esp+SYSCALL_STACK._eax], -1
ret
align 4
.futex_init:
call create_futex
test eax, eax
jz @F
mov eax, [eax+FUTEX.handle]
@@:
mov [esp+SYSCALL_STACK._eax], eax
ret
align 4
;ecx futex handle
;edx control value
.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 eax, edx
lock cmpxchg [ecx], edx ;wait until old_value == new_value
jz .wait_slow
mov [esp+SYSCALL_STACK._eax], 0
ret
.wait_slow:
pushfd
cli
sub esp, sizeof.MUTEX_WAITER
mov ebx, [TASK_BASE]
mov [ebx+TASKDATA.state], 1
mov [esp+MUTEX_WAITER.task], ebx
lea esi, [edi+FUTEX.wait_list]
list_add_tail esp, esi ;esp= new waiter, esi= list head
.again:
call change_task
lock cmpxchg [ecx], edx
jz .again
list_del esp
add esp, sizeof.MUTEX_WAITER
popfd
mov [esp+SYSCALL_STACK._eax], 0
ret
.epicfail:
mov [esp+SYSCALL_STACK._eax], -1
ret
align 4
;ecx futex handle
;edx threads count
.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
pushfd
cli
lea ebx, [edi+FUTEX.wait_list]
mov esi, [edi+FUTEX.wait_list.next]
@@:
cmp esi, ebx
je @F
mov eax, [esi+MUTEX_WAITER.task]
mov [eax+TASKDATA.state], 0
mov esi, [esi+MUTEX_WAITER.list.next]
inc ecx
cmp ecx, edx
jb @B
@@:
popfd
mov [esp+SYSCALL_STACK._eax], ecx
ret
RWSEM_WAITING_FOR_WRITE equ 0
RWSEM_WAITING_FOR_READ equ 1
;void __fastcall mutex_init(struct mutex *lock)
align 4
mutex_init:
mov [ecx+MUTEX.wait_list.next], ecx
mov [ecx+MUTEX.wait_list.prev], ecx
mov [ecx+MUTEX.count], 1
ret
;void __fastcall mutex_lock(struct mutex *lock)
align 4
mutex_lock:
dec [ecx+MUTEX.count]
jns .done
pushfd
cli
sub esp, sizeof.MUTEX_WAITER
list_add_tail esp, ecx ;esp= new waiter, ecx= list head
mov edx, [TASK_BASE]
mov [esp+MUTEX_WAITER.task], edx
.forever:
mov eax, -1
xchg eax, [ecx+MUTEX.count]
dec eax
jz @F
mov [edx+TASKDATA.state], 1
call change_task
jmp .forever
@@:
mov eax, ecx
list_del esp
cmp [eax+MUTEX.wait_list.next], eax
jne @F
mov [eax+MUTEX.count], 0
@@:
add esp, sizeof.MUTEX_WAITER
popfd
.done:
ret
;void __fastcall mutex_unlock(struct mutex *lock)
align 4
mutex_unlock:
pushfd
cli
mov eax, [ecx+MUTEX.wait_list.next]
cmp eax, ecx
mov [ecx+MUTEX.count], 1
je @F
mov eax, [eax+MUTEX_WAITER.task]
mov [eax+TASKDATA.state], 0
@@:
popfd
ret
;void __fastcall init_rwsem(struct rw_semaphore *sem)
align 4
init_rwsem:
mov [ecx+RWSEM.wait_list.next], ecx
mov [ecx+RWSEM.wait_list.prev], ecx
mov [ecx+RWSEM.count], 0
ret
;void __fastcall down_read(struct rw_semaphore *sem)
align 4
down_read:
pushfd
cli
mov eax, [ecx+RWSEM.count]
test eax, eax
js @F
cmp ecx, [ecx+RWSEM.wait_list.next]
je .ok
@@:
sub esp, sizeof.MUTEX_WAITER
mov eax, [TASK_BASE]
mov [esp+MUTEX_WAITER.task], eax
mov [esp+MUTEX_WAITER.type], RWSEM_WAITING_FOR_READ
mov [eax+TASKDATA.state], 1
list_add_tail esp, ecx ;esp= new waiter, ecx= list head
call change_task
add esp, sizeof.MUTEX_WAITER
popfd
ret
.ok:
inc eax
mov [ecx+RWSEM.count], eax
popfd
ret
;void __fastcall down_write(struct rw_semaphore *sem)
align 4
down_write:
pushfd
cli
sub esp, sizeof.MUTEX_WAITER
mov edx, [TASK_BASE]
mov [esp+MUTEX_WAITER.task], edx
mov [esp+MUTEX_WAITER.type], RWSEM_WAITING_FOR_WRITE
mov [edx+TASKDATA.state], 1
list_add_tail esp, ecx ;esp= new waiter, ecx= list head
xor eax, eax
not eax
.forever:
test eax, [ecx+RWSEM.count]
jz @F
mov [edx+TASKDATA.state], 1
call change_task
jmp .forever
@@:
mov [ecx+RWSEM.count], eax
list_del esp
add esp, sizeof.MUTEX_WAITER
popfd
ret
;void __fastcall up_read(struct rw_semaphore *sem)
align 4
up_read:
pushfd
cli
dec [ecx+RWSEM.count]
jnz @F
mov eax, [ecx+RWSEM.wait_list.next]
cmp eax, ecx
je @F
mov eax, [eax+MUTEX_WAITER.task]
mov [eax+TASKDATA.state], 0
@@:
popfd
ret
;void __fastcall up_write(struct rw_semaphore *sem)
align 4
up_write:
pushfd
cli
mov eax, [ecx+RWSEM.wait_list.next]
mov [ecx+RWSEM.count], 0
cmp ecx, eax
je .done
mov edx, [eax+MUTEX_WAITER.type]
test edx, edx
jnz .wake
mov eax, [eax+MUTEX_WAITER.task]
mov [eax+TASKDATA.state], 0
.done:
popfd
ret
.wake:
push ebx
push esi
push edi
xor esi, esi
mov edi, ecx
.wake_list:
mov ebx, [eax+MUTEX_WAITER.list.next]
list_del eax
mov edx, [eax+MUTEX_WAITER.task]
mov [edx+TASKDATA.state], 0
inc esi
cmp edi, ebx
je .wake_done
mov ecx, [ebx+MUTEX_WAITER.type]
test ecx, ecx
jz .wake_done
mov eax, ebx
jmp .wake_list
.wake_done:
add [edi+RWSEM.count], esi
pop edi
pop esi
pop ebx
popfd
ret
purge MUTEX_WAITER
purge RWSEM_WAITING_FOR_WRITE
purge RWSEM_WAITING_FOR_READ
if ~defined sync_inc if ~defined sync_inc
sync_inc_fix: sync_inc_fix:

View File

@ -5,7 +5,7 @@
;; ;; ;; ;;
;; KERNEL32.INC ;; ;; KERNEL32.INC ;;
;; ;; ;; ;;
;; Included 32 bit kernel files for MenuetOS ;; ;; Included 32 bit kernel files for KolibriOS ;;
;; ;; ;; ;;
;; This file is kept separate as it will be easier to ;; ;; This file is kept separate as it will be easier to ;;
;; maintain and compile with an automated SETUP program ;; ;; maintain and compile with an automated SETUP program ;;
@ -15,206 +15,6 @@
$Revision$ $Revision$
struct POINT
x dd ?
y dd ?
ends
struct RECT
left dd ?
top dd ?
right dd ?
bottom dd ?
ends
struct BOX
left dd ?
top dd ?
width dd ?
height dd ?
ends
struct DISPMODE
width dw ?
height dw ?
bpp dw ?
freq dw ?
ends
; constants definition
WSTATE_NORMAL = 00000000b
WSTATE_MAXIMIZED = 00000001b
WSTATE_MINIMIZED = 00000010b
WSTATE_ROLLEDUP = 00000100b
WSTATE_REDRAW = 00000001b
WSTATE_WNDDRAWN = 00000010b
WSTYLE_HASCAPTION = 00010000b
WSTYLE_CLIENTRELATIVE = 00100000b
struct TASKDATA
event_mask dd ?
pid dd ?
dw ?
state db ?
db ?
dw ?
wnd_number db ?
db ?
mem_start dd ?
counter_sum dd ?
counter_add dd ?
cpu_usage dd ?
ends
TSTATE_RUNNING = 0
TSTATE_RUN_SUSPENDED = 1
TSTATE_WAIT_SUSPENDED = 2
TSTATE_ZOMBIE = 3
TSTATE_TERMINATING = 4
TSTATE_WAITING = 5
TSTATE_FREE = 9
; structures definition
struct WDATA
box BOX
cl_workarea dd ?
cl_titlebar dd ?
cl_frames dd ?
reserved db ?
fl_wstate db ?
fl_wdrawn db ?
fl_redraw db ?
ends
label WDATA.fl_wstyle byte at WDATA.cl_workarea + 3
struct DBG_REGS
dr0 dd ?
dr1 dd ?
dr2 dd ?
dr3 dd ?
dr7 dd ?
ends
struct PROC
list LHEAD
thr_list LHEAD
heap_lock MUTEX
heap_base rd 1
heap_top rd 1
mem_used rd 1
dlls_list_ptr rd 1
pdt_0_phys rd 1
pdt_1_phys rd 1
io_map_0 rd 1
io_map_1 rd 1
ht_lock rd 1
ht_free rd 1 ;htab[0] stdin
ht_next rd 1 ;htab[1] stdout
htab rd (4096-$)/4 ;htab[2] stderr
pdt_0 rd 1024
ends
struct APPDATA
app_name rb 11
rb 5
list LHEAD ;+16
process dd ? ;+24
fpu_state dd ? ;+28
exc_handler dd ? ;+32
except_mask dd ? ;+36
pl0_stack dd ? ;+40
cursor dd ? ;+44
fd_ev dd ? ;+48
bk_ev dd ? ;+52
fd_obj dd ? ;+56
bk_obj dd ? ;+60
saved_esp dd ? ;+64
io_map rd 2 ;+68
dbg_state dd ? ;+76
cur_dir dd ? ;+80
wait_timeout dd ? ;+84
saved_esp0 dd ? ;+88
wait_begin dd ? ;+92 +++
wait_test dd ? ;+96 +++
wait_param dd ? ;+100 +++
tls_base dd ? ;+104
dd ? ;+108
event_filter dd ? ;+112
draw_bgr_x dd ? ;+116
draw_bgr_y dd ? ;+120
dd ? ;+124
wnd_shape dd ? ;+128
wnd_shape_scale dd ? ;+132
dd ? ;+136
dd ? ;+140
saved_box BOX ;+144
ipc_start dd ? ;+160
ipc_size dd ? ;+164
event_mask dd ? ;+168
debugger_slot dd ? ;+172
terminate_protection dd ? ;+176
keyboard_mode db ? ;+180
rb 3
dd ? ;+184
dbg_event_mem dd ? ;+188
dbg_regs DBG_REGS ;+192
wnd_caption dd ? ;+212
wnd_clientbox BOX ;+216
priority dd ? ;+232
in_schedule LHEAD ;+236
ends
struct IDE_DATA
ProgrammingInterface dd ?
Interrupt dw ?
RegsBaseAddres dw ?
BAR0_val dw ?
BAR1_val dw ?
BAR2_val dw ?
BAR3_val dw ?
dma_hdd_channel_1 db ?
dma_hdd_channel_2 db ?
ends
struct IDE_CACHE
pointer dd ?
size dd ? ; not use
data_pointer dd ?
system_data_size dd ? ; not use
appl_data_size dd ? ; not use
system_data dd ?
appl_data dd ?
system_sad_size dd ?
appl_sad_size dd ?
search_start dd ?
appl_search_start dd ?
ends
struct IDE_DEVICE
UDMA_possible_modes db ?
UDMA_set_mode db ?
ends
struct SYSCALL_STACK
_eip dd ?
_edi dd ? ; +4
_esi dd ? ; +8
_ebp dd ? ; +12
_esp dd ? ; +16
_ebx dd ? ; +20
_edx dd ? ; +24
_ecx dd ? ; +28
_eax dd ? ; +32
ends
; Core functions ; Core functions
include "core/sync.inc" ; macros for synhronization objects include "core/sync.inc" ; macros for synhronization objects
include "core/sys32.inc" ; process management include "core/sys32.inc" ; process management