forked from KolibriOS/kolibrios
linux-like kernel mutexes
git-svn-id: svn://kolibrios.org@1434 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
47a917da42
commit
2e1f635004
@ -22,6 +22,10 @@
|
|||||||
|
|
||||||
.global _MapIoMem
|
.global _MapIoMem
|
||||||
|
|
||||||
|
.global _MutexInit
|
||||||
|
.global _MutexLock
|
||||||
|
.global _MutexUnlock
|
||||||
|
|
||||||
.global _PciApi
|
.global _PciApi
|
||||||
.global _PciRead16
|
.global _PciRead16
|
||||||
.global _PciRead32
|
.global _PciRead32
|
||||||
@ -32,6 +36,7 @@
|
|||||||
|
|
||||||
.global _RegService
|
.global _RegService
|
||||||
|
|
||||||
|
.global _SetMouseData
|
||||||
.global _SetScreen
|
.global _SetScreen
|
||||||
.global _SysMsgBoardStr
|
.global _SysMsgBoardStr
|
||||||
|
|
||||||
@ -55,6 +60,10 @@
|
|||||||
|
|
||||||
.def _MapIoMem; .scl 2; .type 32; .endef
|
.def _MapIoMem; .scl 2; .type 32; .endef
|
||||||
|
|
||||||
|
.def _MutexInit; .scl 2; .type 32; .endef
|
||||||
|
.def _MutexLock; .scl 2; .type 32; .endef
|
||||||
|
.def _MutexUnlock; .scl 2; .type 32; .endef
|
||||||
|
|
||||||
.def _PciApi; .scl 2; .type 32; .endef
|
.def _PciApi; .scl 2; .type 32; .endef
|
||||||
.def _PciRead16; .scl 2; .type 32; .endef
|
.def _PciRead16; .scl 2; .type 32; .endef
|
||||||
.def _PciRead32; .scl 2; .type 32; .endef
|
.def _PciRead32; .scl 2; .type 32; .endef
|
||||||
@ -66,6 +75,7 @@
|
|||||||
.def _RegService; .scl 2; .type 32; .endef
|
.def _RegService; .scl 2; .type 32; .endef
|
||||||
|
|
||||||
.def _SetScreen; .scl 2; .type 32; .endef
|
.def _SetScreen; .scl 2; .type 32; .endef
|
||||||
|
.def _SetMouseData; .scl 2; .type 32; .endef
|
||||||
.def _SysMsgBoardStr; .scl 2; .type 32; .endef
|
.def _SysMsgBoardStr; .scl 2; .type 32; .endef
|
||||||
|
|
||||||
|
|
||||||
@ -89,6 +99,10 @@ _KernelFree:
|
|||||||
|
|
||||||
_MapIoMem:
|
_MapIoMem:
|
||||||
|
|
||||||
|
_MutexInit:
|
||||||
|
_MutexLock:
|
||||||
|
_MutexUnlock:
|
||||||
|
|
||||||
_PciApi:
|
_PciApi:
|
||||||
_PciRead16:
|
_PciRead16:
|
||||||
_PciRead32:
|
_PciRead32:
|
||||||
@ -99,6 +113,7 @@ _PciWrite8:
|
|||||||
|
|
||||||
_RegService:
|
_RegService:
|
||||||
|
|
||||||
|
_SetMouseData:
|
||||||
_SetScreen:
|
_SetScreen:
|
||||||
_SysMsgBoardStr:
|
_SysMsgBoardStr:
|
||||||
ret
|
ret
|
||||||
@ -125,6 +140,10 @@ _SysMsgBoardStr:
|
|||||||
|
|
||||||
.ascii " -export:MapIoMem" # stdcall
|
.ascii " -export:MapIoMem" # stdcall
|
||||||
|
|
||||||
|
.ascii " -export:MutexInit" # fastcall
|
||||||
|
.ascii " -export:MutexLock" # fastcall
|
||||||
|
.ascii " -export:MutexUnlock" # fastcall
|
||||||
|
|
||||||
.ascii " -export:PciApi" #
|
.ascii " -export:PciApi" #
|
||||||
.ascii " -export:PciRead16" # stdcall
|
.ascii " -export:PciRead16" # stdcall
|
||||||
.ascii " -export:PciRead32" # stdcall
|
.ascii " -export:PciRead32" # stdcall
|
||||||
@ -135,6 +154,7 @@ _SysMsgBoardStr:
|
|||||||
|
|
||||||
.ascii " -export:RegService" # stdcall
|
.ascii " -export:RegService" # stdcall
|
||||||
|
|
||||||
|
.ascii " -export:SetMouseData" # stdcall
|
||||||
.ascii " -export:SetScreen" # stdcall
|
.ascii " -export:SetScreen" # stdcall
|
||||||
.ascii " -export:SysMsgBoardStr" # stdcall
|
.ascii " -export:SysMsgBoardStr" # stdcall
|
||||||
|
|
||||||
|
@ -26,6 +26,8 @@ u32_t drvEntry(int, char *)__asm__("_drvEntry");
|
|||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#define STDCALL __attribute__ ((stdcall)) __attribute__ ((dllimport))
|
#define STDCALL __attribute__ ((stdcall)) __attribute__ ((dllimport))
|
||||||
|
#define FASTCALL __attribute__ ((fastcall)) __attribute__ ((dllimport))
|
||||||
|
|
||||||
#define IMPORT __attribute__ ((dllimport))
|
#define IMPORT __attribute__ ((dllimport))
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
@ -61,6 +63,9 @@ u32_t STDCALL RegService(char *name, srv_proc_t proc)__asm__("RegService");
|
|||||||
|
|
||||||
int STDCALL AttachIntHandler(int irq, void *handler, u32_t access) __asm__("AttachIntHandler");
|
int STDCALL AttachIntHandler(int irq, void *handler, u32_t access) __asm__("AttachIntHandler");
|
||||||
|
|
||||||
|
void FASTCALL MutexInit(struct mutex*)__asm__("MutexInit");
|
||||||
|
void FASTCALL MutexLock(struct mutex*)__asm__("MutexLock");
|
||||||
|
void FASTCALL MutexUnlock(struct mutex*)__asm__("MutexUnlock");
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
@ -293,6 +293,10 @@ __exports:
|
|||||||
free, 'Kfree', \
|
free, 'Kfree', \
|
||||||
map_io_mem, 'MapIoMem', \ ; stdcall
|
map_io_mem, 'MapIoMem', \ ; stdcall
|
||||||
get_pg_addr, 'GetPgAddr', \ ; eax
|
get_pg_addr, 'GetPgAddr', \ ; eax
|
||||||
|
\
|
||||||
|
mutex_init, 'MutexInit', \ ; gcc fastcall
|
||||||
|
mutex_lock, 'MutexLock', \ ; gcc fastcall
|
||||||
|
mutex_unlock, 'MutexUnlock', \ ; gcc fastcall
|
||||||
\
|
\
|
||||||
get_display, 'GetDisplay', \
|
get_display, 'GetDisplay', \
|
||||||
set_screen, 'SetScreen', \
|
set_screen, 'SetScreen', \
|
||||||
|
@ -217,7 +217,108 @@ do_change_task:
|
|||||||
@@: ret
|
@@: ret
|
||||||
;end.
|
;end.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struc MUTEX_WAITER
|
||||||
|
{
|
||||||
|
.next rd 1
|
||||||
|
.prev rd 1
|
||||||
|
.task rd 1
|
||||||
|
.sizeof:
|
||||||
|
};
|
||||||
|
|
||||||
|
virtual at 0
|
||||||
|
MUTEX_WAITER MUTEX_WAITER
|
||||||
|
end virtual
|
||||||
|
|
||||||
|
;void __fastcall mutex_init(struct mutex *lock)
|
||||||
|
|
||||||
|
align 4
|
||||||
|
mutex_init:
|
||||||
|
lea eax, [ecx+MUTEX.next]
|
||||||
|
mov [ecx+MUTEX.count],1
|
||||||
|
mov [ecx+MUTEX.next], eax
|
||||||
|
mov [ecx+MUTEX.prev], eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
;void __fastcall mutex_lock(struct mutex *lock)
|
||||||
|
|
||||||
|
align 4
|
||||||
|
mutex_lock:
|
||||||
|
|
||||||
|
dec [ecx+MUTEX.count]
|
||||||
|
jns .done
|
||||||
|
|
||||||
|
pushfd
|
||||||
|
cli
|
||||||
|
|
||||||
|
push esi
|
||||||
|
sub esp, MUTEX_WAITER.sizeof
|
||||||
|
|
||||||
|
mov eax, [ecx+MUTEX.prev]
|
||||||
|
lea esi, [ecx+MUTEX.next]
|
||||||
|
|
||||||
|
mov [ecx+MUTEX.prev], esp
|
||||||
|
mov [esp+MUTEX_WAITER.next], esi
|
||||||
|
mov [esp+MUTEX_WAITER.prev], eax
|
||||||
|
mov [eax], esp
|
||||||
|
|
||||||
|
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 edx, [esp+MUTEX_WAITER.next]
|
||||||
|
mov eax, [esp+MUTEX_WAITER.prev]
|
||||||
|
|
||||||
|
mov [eax+MUTEX_WAITER.next], edx
|
||||||
|
cmp [ecx+MUTEX.next], esi
|
||||||
|
mov [edx+MUTEX_WAITER.prev], eax
|
||||||
|
jne @F
|
||||||
|
|
||||||
|
mov [ecx+MUTEX.count], 0
|
||||||
|
@@:
|
||||||
|
add esp, MUTEX_WAITER.sizeof
|
||||||
|
|
||||||
|
pop esi
|
||||||
|
popfd
|
||||||
|
.done:
|
||||||
|
ret
|
||||||
|
|
||||||
|
;void __fastcall mutex_unlock(struct mutex *lock)
|
||||||
|
|
||||||
|
align 4
|
||||||
|
mutex_unlock:
|
||||||
|
|
||||||
|
pushfd
|
||||||
|
cli
|
||||||
|
|
||||||
|
lea eax, [ecx+MUTEX.next]
|
||||||
|
cmp eax, [ecx+MUTEX.next]
|
||||||
|
mov [ecx+MUTEX.count], 1
|
||||||
|
je @F
|
||||||
|
|
||||||
|
mov eax, [eax+MUTEX_WAITER.task]
|
||||||
|
mov [eax+TASKDATA.state], 0
|
||||||
|
@@:
|
||||||
|
popfd
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
purge MUTEX_WAITER
|
||||||
|
|
||||||
if 0
|
if 0
|
||||||
|
|
||||||
struc TIMER
|
struc TIMER
|
||||||
{
|
{
|
||||||
.next dd ?
|
.next dd ?
|
||||||
|
@ -194,6 +194,17 @@ end virtual
|
|||||||
|
|
||||||
;// mike.dld, 2006-29-01 ]
|
;// mike.dld, 2006-29-01 ]
|
||||||
|
|
||||||
|
struc MUTEX
|
||||||
|
{
|
||||||
|
.count rd 1
|
||||||
|
.next rd 1
|
||||||
|
.prev rd 1
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual at 0
|
||||||
|
MUTEX MUTEX
|
||||||
|
end virtual
|
||||||
|
|
||||||
|
|
||||||
; Core functions
|
; Core functions
|
||||||
include "core/sync.inc" ; macros for synhronization objects
|
include "core/sync.inc" ; macros for synhronization objects
|
||||||
|
Loading…
Reference in New Issue
Block a user