summaryrefslogtreecommitdiffstats
path: root/private/fp32/inc/i386/os2dll.inc
diff options
context:
space:
mode:
Diffstat (limited to 'private/fp32/inc/i386/os2dll.inc')
-rw-r--r--private/fp32/inc/i386/os2dll.inc325
1 files changed, 325 insertions, 0 deletions
diff --git a/private/fp32/inc/i386/os2dll.inc b/private/fp32/inc/i386/os2dll.inc
new file mode 100644
index 000000000..df0eedb88
--- /dev/null
+++ b/private/fp32/inc/i386/os2dll.inc
@@ -0,0 +1,325 @@
+;***
+;os2dll.inc - DynaLib/Multi-thread parameter definitions
+;
+; Copyright (c) 1987-1991, Microsoft Corporation. All rights reserved.
+;
+;Purpose:
+;
+;Revision History:
+; 10-22-87 JCR Module created
+; 11-13-87 SKS Added _HEAP_LOCK
+; 11-16-87 JCR Added _mlock/_munlock macros
+; 12-15-87 JCR Added _EXIT_LOCK
+; 01-07-88 BCM Added _SIGNAL_LOCK; upped MAXTHREADID from 16 to 32
+; 02-01-88 JCR Added _dll_mlock/_dll_munlock macros
+; 05-03-88 JCR Added _BHEAP_LOCK
+; 08-03-88 JCR Bumped maximum file count to 256
+; 08-09-88 GJF Added _lock_str/_unlock_str macros
+; 08-12-88 JCR 386 version
+; 06-02-89 JCR 386 mthread support
+; 06-09-89 JCR 386: Added values to _tiddata struc (for _beginthread)
+; 07-11-89 JCR 386mt: Corrected _DEBUG_LOCK_SIZE value
+; 07-13-89 JCR 386: Added _LOCKTAB_LOCK and some macros
+; 09-14-90 GJF Added __pxcptacttab, __pxcptinfoptr and __fpecode
+; fields to _tiddata struc.
+; 10-03-91 JCR Added _cvtbuf to _tiddata structure
+;
+;*******************************************************************************
+
+_NFILE_ = 256 ;maximum number of streams
+
+;Lock table offsets
+;------------------
+;[NOTE: These values must coincide with the values in os2dll.h.]
+
+;[NOTE: do not change _SIGNAL_LOCK without changing emulator's os2dll.inc.]
+_SIGNAL_LOCK equ 1 ; lock for signal() and emulator SignalAddress
+ ; emulator uses \math\include\os2dll.inc
+
+_IOB_SCAN_LOCK equ 2 ; _iob[] table lock
+_TMPNAM_LOCK equ 3 ; lock global tempnam variables
+_INPUT_LOCK equ 4 ; lock for _input() routine
+_OUTPUT_LOCK equ 5 ; lock for _output() routine
+_CSCANF_LOCK equ 6 ; lock for _cscanf() routine
+_CPRINTF_LOCK equ 7 ; lock for _cprintf() routine
+_CONIO_LOCK equ 8 ; lock for conio routines
+_HEAP_LOCK equ 9 ; lock for heap allocator routines
+_BHEAP_LOCK equ 10 ; lock for based heap routines
+_TIME_LOCK equ 11 ; lock for time functions
+_ENV_LOCK equ 12 ; lock for environment variables
+_EXIT_LOCK1 equ 13 ; lock #1 for exit code
+_EXIT_LOCK2 equ 14 ; lock #2 for exit code
+_THREADDATA_LOCK equ 15 ; lock for thread data table
+_POPEN_LOCK equ 16 ; lock for _popen/_pclose database
+_SSCANF_LOCK equ 17 ; lock for sscanf() iob
+_SPRINTF_LOCK equ 18 ; lock for sprintf() iob
+_VSPRINTF_LOCK equ 19 ; lock for vsprintf() iob
+_LOCKTAB_LOCK equ 20 ; lock to protect semaphore lock table
+_OSFHND_LOCK equ 21 ; lock to protect _osfhnd array
+_STREAM_LOCKS equ 21 ; Table of stream locks
+
+_LAST_STREAM_LOCK equ (_STREAM_LOCKS+_NFILE_-1) ; Last stream lock
+
+_FH_LOCKS equ (_LAST_STREAM_LOCK+1) ; Table of fh locks
+_LAST_FH_LOCK equ (_FH_LOCKS+_NFILE_-1) ; Last fh lock
+
+_TOTAL_LOCKS equ _LAST_FH_LOCK+1 ; Total number of locks
+
+_LOCK_BIT_INTS equ (_TOTAL_LOCKS/(ISIZE*8))+1; # of ints to hold lock bits
+
+;*** THE FH-LOCK TABLE SHOULD REALLY BASED ON __nfile NOT _NFILE_ ***
+
+
+IFDEF DEBUG
+;General multi-thread values
+;---------------------------
+
+MAXTHREADID EQU 32 ; max thread id supported
+THREADINTS EQU (MAXTHREADID/(ISIZE*8)) ; # of ints to hold thread bits
+
+;Semaphore debugging lock structure
+;----------------------------------
+
+debug_lock struc
+% holder DINT THREADINTS dup (0) ;bit set for thread holding lock
+% waiters DINT THREADINTS dup (0) ;bit(s) set for threads waiting
+% lockcnt DINT 0 ;total # of times lock has been aquired
+% collcnt DINT 0 ;total # of lock collisions
+debug_lock ends
+
+DEBUG_LOCK_SIZE EQU (2*(THREADINTS*ISIZE))+(2*ISIZE) ;size of debug_lock struct
+ENDIF
+
+
+; Tid Table Definitions
+; ---------------------
+
+IFDEF MTHREAD
+
+; Structure for each thread's data
+; [NOTE: Tid structure and data must agree with os2dll.h. In addition,
+; startup depends on __stkhqq being the third entry in the structure.]
+
+_tiddata struc
+% __terrno DINT 0 ; errno value
+% __tdoserrno DINT 0 ; _doserrno value
+% __stkhqq DINT 0 ; stack limit
+% __fpds DINT 0 ; Floating Point data segment
+% __holdrand DLONG 0 ; rand() seed value
+% __token DDPTR 0 ; * to strtok() token
+ ;following pointers get malloc'd at runtime
+% __errmsg DDPTR 0 ; * to strerror()/_strerror() buffer
+% __namebuf DDPTR 0 ; * to tmpfile() buffer
+% __asctimebuf DDPTR 0 ; * to asctime() buffer
+% __gmtimebuf DDPTR 0 ; * to gmtime() structure
+% __cvtbuf DDPTR 0 ; * to ecvt()/fcvt() buffer
+ ;following three values needed by _beginthread code
+% __initaddr DCPTR 0 ; initial user thread address
+% __initarg DDPTR 0 ; initial user thread argument
+% __initstksz DINT 0 ; initial stack size (specified by user)
+ ;following three fields are needed to support signal handling and
+ ;runtime errors
+% __pxcptacttab DDPTR 0 ; * to exception-action table
+% __tpxcptinfoptrs DDPTR 0 ; * to exception info pointers
+% __tfpecode DINT 0 ; * float point exception code
+_tiddata ends
+
+_TIDDATASIZE = (size _tiddata) ; size of _tiddata entry (bytes)
+_TIDSHIFT = 6 ; # of bits to shift to get _TIDSIZE
+_TIDSIZE = (1 shl _TIDSHIFT) ; # of bytes in each tid entry (rounded
+ ; to next power of two).
+
+_TID_INCSIZE equ 1000h ; grow thread table a page at a time
+_TIDTABGROW = (_TID_INCSIZE/_TIDSIZE) ; table increment (# of tid's per page)
+ ; (must be power of 2!!!)
+_TIDTABMASK = (NOT (_TIDTABGROW -1)) ; mask off grow bits
+
+_TID_MAXTID = 1024 ; max # of tids supported
+_TID_REGSIZE = (_TID_MAXTID * _TIDSIZE) ; size of tid table region
+
+.ERRE (_TIDSIZE GE _TIDDATASIZE) ; make sure _TIDSIZE >= _TIDDATASIZE
+.ERRE ((_TIDSIZE SHR 1) LT _TIDDATASIZE); make sure _TIDSIZE/2 < _TIDDATASIZE
+.ERRE (_TIDTABGROW GE 1) ; must be at least 1 !!!
+.ERRE (_TID_MAXTID GE _TIDTABGROW) ; make sure _TID_MAXTID >= _TIDTABGROW
+
+ENDIF ;MTHREAD
+
+;Declarations
+;------------
+
+;Multi-thread Macros
+;-------------------
+
+;_mlock -- Aquire a lock
+;Arg = lock number
+
+IFDEF MTHREAD
+_mlock MACRO locknum
+ push locknum
+ call _lock
+ add rsp,ISIZE
+ ENDM
+ELSE
+_mlock MACRO locknum
+ ENDM
+ENDIF
+
+;_munlock -- Release a lock
+;Arg = lock number
+
+IFDEF MTHREAD
+_munlock MACRO locknum
+ push locknum
+ call _unlock
+ add rsp,ISIZE
+ ENDM
+ELSE
+_munlock MACRO locknum
+ ENDM
+ENDIF
+
+;_mwait -- Wait for a lock but don't aquire it
+;Arg = lock number
+
+IFDEF MTHREAD
+_mwait MACRO locknum
+ push locknum
+ call _waitlock
+ add rsp,ISIZE
+ ENDM
+ELSE
+_mwait MACRO locknum
+ ENDM
+ENDIF
+
+;_lock_fh -- Lock file handle
+;Arg = file handle
+
+IFDEF MTHREAD
+_lock_fh MACRO fh
+ push fh
+ call _lock_file
+ add rsp,ISIZE
+ ENDM
+ELSE
+_lock_fh MACRO fh
+ ENDM
+ENDIF
+
+;_unlock_fh -- Unlock file handle
+;Arg = register containing file handle
+
+IFDEF MTHREAD
+_unlock_fh MACRO fh
+ push fh
+ call _unlock_file
+ add rsp,ISIZE
+ ENDM
+ELSE
+_unlock_fh MACRO fh
+ ENDM
+ENDIF
+
+;_unlock_fh_check -- Unlock file handle if flag is set
+;Args: reg = register to use in the macro (e.g., ax)
+; file = file handle (e.g., bx or [fh])
+; flag = lock/unlock flag (e.g., [lock_flag])
+; (0 = no lock/unlock operation)
+
+IFDEF MTHREAD
+_unlock_fh_check MACRO reg,file,flag
+ LOCAL no_unlock ;; local label
+ mov reg,flag ;; get lock flag
+ or reg,reg ;; test it
+ jz no_unlock ;; 0 = no lock/unlock
+ push file ;; unlock file
+ call _unlock_file
+ add rsp,ISIZE
+no_unlock:
+ ENDM
+ELSE
+_unlock_fh_check MACRO reg,file,flag
+ ENDM
+ENDIF
+
+;_lock_fh_check -- Lock file handle if flag is set
+;Args: reg = register to use in the macro (e.g., ax)
+; file = file handle (e.g., bx or [fh])
+; flag = lock/unlock flag (e.g., [lock_flag])
+; (0 = no lock/unlock operation)
+
+IFDEF MTHREAD
+_lock_fh_check MACRO reg,file,flag
+ LOCAL no_lock ;; local label
+ mov reg,flag ;; get lock flag
+ or reg,reg ;; test it
+ jz no_unlock ;; 0 = no lock/unlock
+ push file ;; lock the file
+ call _lock_file
+ add rsp,ISIZE
+no_lock:
+ ENDM
+ELSE
+_lock_fh_check MACRO reg,file,flag
+ ENDM
+ENDIF
+
+;_lock_str -- Acquire stream lock
+;Arg: str = index of stream in _iob[]
+
+IFDEF MTHREAD
+_lock_str MACRO str
+ push str
+ call _lock_stream
+ add rsp,ISIZE
+ ENDM
+ELSE
+_lock_str MACRO str
+ ENDM
+ENDIF
+
+;_unlock_str -- Unlock stream
+;Arg: str = index of stream in _iob[]
+
+IFDEF MTHREAD
+_unlock_str MACRO str
+ push str
+ call _unlock_stream
+ add rsp,ISIZE
+ ENDM
+ELSE
+_unlock_str MACRO str
+ ENDM
+ENDIF
+
+;_dll_mlock -- Aquire a lock (set/clear DS)
+;Arg = lock number
+
+IFDEF _LOAD_DGROUP
+IFDEF MTHREAD
+_dll_mlock MACRO locknum
+ push locknum
+ call _dll_lock
+ add rsp,ISIZE
+ ENDM
+ELSE
+_dll_mlock MACRO locknum
+ ENDM
+ENDIF
+ENDIF
+
+;_dll_munlock -- Release a lock (set/clear DS)
+;Arg = lock number
+
+IFDEF _LOAD_DGROUP
+IFDEF MTHREAD
+_dll_munlock MACRO locknum
+ push locknum
+ call _dll_unlock
+ add rsp,ISIZE
+ ENDM
+ELSE
+_dll_munlock MACRO locknum
+ ENDM
+ENDIF
+ENDIF