1/*-
2 * Copyright (c) 1996-1999 Distributed Processing Technology Corporation
3 * All rights reserved.
4 *
5 * Redistribution and use in source form, with or without modification, are
6 * permitted provided that redistributions of source code must retain the
7 * above copyright notice, this list of conditions and the following disclaimer.
8 *
9 * This software is provided `as is' by Distributed Processing Technology and
10 * any express or implied warranties, including, but not limited to, the
11 * implied warranties of merchantability and fitness for a particular purpose,
12 * are disclaimed. In no event shall Distributed Processing Technology be
13 * liable for any direct, indirect, incidental, special, exemplary or
14 * consequential damages (including, but not limited to, procurement of
15 * substitute goods or services; loss of use, data, or profits; or business
16 * interruptions) however caused and on any theory of liability, whether in
17 * contract, strict liability, or tort (including negligence or otherwise)
18 * arising in any way out of the use of this driver software, even if advised
19 * of the possibility of such damage.
20 *
21 * $FreeBSD$
22 */
23
24#ifndef		__OSD_UTIL_H
25#define		__OSD_UTIL_H
26
27/*File - OSD_UTIL.H
28 ****************************************************************************
29 *
30 *Description:
31 *
32 *	This file contains defines and function prototypes that are
33 *operating system dependent.  The resources defined in this file
34 *are not specific to any particular application.
35 *
36 *Copyright Distributed Processing Technology, Corp.
37 *	  140 Candace Dr.
38 *	  Maitland, Fl. 32751	USA
39 *	  Phone: (407) 830-5522	 Fax: (407) 260-5366
40 *	  All Rights Reserved
41 *
42 *Author:	Doug Anderson
43 *Date:		1/7/94
44 *
45 *Editors:
46 *
47 *Remarks:
48 *
49 *
50 *****************************************************************************/
51
52
53/*Definitions - Defines & Constants ----------------------------------------- */
54
55/*----------------------------- */
56/* Operating system selections: */
57/*----------------------------- */
58
59/*#define		      _DPT_MSDOS      */
60/*#define		      _DPT_WIN_3X     */
61/*#define		      _DPT_WIN_4X     */
62/*#define		      _DPT_WIN_NT     */
63/*#define		      _DPT_NETWARE    */
64/*#define		      _DPT_OS2	      */
65/*#define		      _DPT_SCO	      */
66/*#define		      _DPT_UNIXWARE   */
67/*#define		      _DPT_SOLARIS    */
68/*#define		      _DPT_NEXTSTEP   */
69/*#define		      _DPT_BANYAN     */
70
71/*-------------------------------- */
72/* Include the OS specific defines */
73/*-------------------------------- */
74
75/*#define	      OS_SELECTION    From Above List */
76/*#define	      SEMAPHORE_T     ??? */
77/*#define	      DLL_HANDLE_T    ??? */
78
79#if (defined(KERNEL) && defined(__bsdi__))
80# include	 "i386/isa/dpt_osd_defs.h"
81#elif ((defined(KERNEL) || defined(_KERNEL)) && defined(__FreeBSD__))
82# if (KERN_VERSION < 3)
83#  include	  "i386/isa/dpt_osd_defs.h"
84# else
85#  include	  "dev/asr/osd_defs.h"
86# endif
87#else
88# include	 "osd_defs.h"
89#endif
90
91#ifndef DPT_UNALIGNED
92   #define	     DPT_UNALIGNED
93#endif
94
95#ifndef DPT_EXPORT
96   #define	     DPT_EXPORT
97#endif
98
99#ifndef DPT_IMPORT
100   #define	     DPT_IMPORT
101#endif
102
103#ifndef DPT_RUNTIME_IMPORT
104   #define	     DPT_RUNTIME_IMPORT	 DPT_IMPORT
105#endif
106
107/*--------------------- */
108/* OS dependent defines */
109/*--------------------- */
110
111#if defined(_DPT_MSDOS) || defined(_DPT_WIN_3X)
112   #define	     _DPT_16_BIT
113#else
114   #define	     _DPT_32_BIT
115#endif
116
117#if defined(_DPT_SCO) || defined(_DPT_UNIXWARE) || defined(_DPT_SOLARIS) || defined(_DPT_AIX) || defined(SNI_MIPS) || defined(_DPT_BSDI) || defined(_DPT_FREE_BSD) || defined(_DPT_LINUX)
118   #define	     _DPT_UNIX
119#endif
120
121#if defined(_DPT_WIN_3x) || defined(_DPT_WIN_4X) || defined(_DPT_WIN_NT) \
122	    || defined(_DPT_OS2)
123   #define	     _DPT_DLL_SUPPORT
124#endif
125
126#if !defined(_DPT_MSDOS) && !defined(_DPT_WIN_3X) && !defined(_DPT_NETWARE)
127   #define	     _DPT_PREEMPTIVE
128#endif
129
130#if !defined(_DPT_MSDOS) && !defined(_DPT_WIN_3X)
131   #define	     _DPT_MULTI_THREADED
132#endif
133
134#if !defined(_DPT_MSDOS)
135   #define	     _DPT_MULTI_TASKING
136#endif
137
138  /* These exist for platforms that   */
139  /* chunk when accessing mis-aligned */
140  /* data			      */
141#if defined(SNI_MIPS) || defined(_DPT_SOLARIS)
142   #if defined(_DPT_BIG_ENDIAN)
143	#if !defined(_DPT_STRICT_ALIGN)
144	    #define	_DPT_STRICT_ALIGN
145	#endif
146   #endif
147#endif
148
149  /* Determine if in C or C++ mode */
150#ifdef __cplusplus
151   #define	     _DPT_CPP
152#else
153   #define	     _DPT_C
154#endif
155
156/*-------------------------------------------------------------------*/
157/* Under Solaris the compiler refuses to accept code like:	     */
158/*   { {"DPT"}, 0, NULL .... },					     */
159/* and complains about the {"DPT"} part by saying "cannot use { }    */
160/* to initialize char*".					     */
161/*								     */
162/* By defining these ugly macros we can get around this and also     */
163/* not have to copy and #ifdef large sections of code.	I know that  */
164/* these macros are *really* ugly, but they should help reduce	     */
165/* maintenance in the long run.					     */
166/*								     */
167/* In the meantime, just pray that we can all move to Win32 as soon  */
168/* as possible...						     */
169/*-------------------------------------------------------------------*/
170#if !defined(DPTSQO)
171   #if defined(_DPT_SOLARIS)
172      #define	DPTSQO
173      #define	DPTSQC
174   #else
175      #define	DPTSQO {
176      #define	DPTSQC }
177   #endif  /* solaris */
178#endif	/* DPTSQO */
179
180
181/*---------------------- */
182/* OS dependent typedefs */
183/*---------------------- */
184
185#if defined(_DPT_MSDOS) || defined(_DPT_SCO)
186   #define	BYTE unsigned char
187   #define	WORD unsigned short
188#endif
189
190#ifndef _DPT_TYPEDEFS
191   #define	_DPT_TYPEDEFS
192   typedef unsigned char   uCHAR;
193   typedef unsigned short  uSHORT;
194   typedef unsigned int	   uINT;
195   typedef unsigned long   uLONG;
196
197   typedef union {
198	 uCHAR	      u8[4];
199	 uSHORT	      u16[2];
200	 uLONG	      u32;
201   } access_U;
202#endif
203
204#if !defined(NULL)
205   #define	     NULL    0
206#endif
207
208
209/*Prototypes - function ----------------------------------------------------- */
210
211#ifdef __cplusplus
212   extern "C" {		/* Declare all these functions as "C" functions */
213#endif
214
215/*------------------------ */
216/* Byte reversal functions */
217/*------------------------ */
218
219  /* Reverses the byte ordering of a 2 byte variable */
220#if (!defined(osdSwap2))
221 uSHORT	      osdSwap2(DPT_UNALIGNED uSHORT *);
222#endif	/* !osdSwap2 */
223
224  /* Reverses the byte ordering of a 4 byte variable and shifts left 8 bits */
225#if (!defined(osdSwap3))
226 uLONG	      osdSwap3(DPT_UNALIGNED uLONG *);
227#endif	/* !osdSwap3 */
228
229
230#ifdef _DPT_NETWARE
231   #include "novpass.h" /* For DPT_Bswapl() prototype */
232	/* Inline the byte swap */
233   #ifdef __cplusplus
234	 inline uLONG osdSwap4(uLONG *inLong) {
235	 return *inLong = DPT_Bswapl(*inLong);
236	 }
237   #else
238	 #define	osdSwap4(inLong)       DPT_Bswapl(inLong)
239   #endif  /* cplusplus */
240#else
241	/* Reverses the byte ordering of a 4 byte variable */
242# if (!defined(osdSwap4))
243   uLONG	osdSwap4(DPT_UNALIGNED uLONG *);
244# endif	 /* !osdSwap4 */
245
246  /* The following functions ALWAYS swap regardless of the *
247   * presence of DPT_BIG_ENDIAN				   */
248
249   uSHORT	trueSwap2(DPT_UNALIGNED uSHORT *);
250   uLONG	trueSwap4(DPT_UNALIGNED uLONG *);
251
252#endif	/* netware */
253
254
255/*-------------------------------------*
256 * Network order swap functions	       *
257 *				       *
258 * These functions/macros will be used *
259 * by the structure insert()/extract() *
260 * functions.			       *
261 *
262 * We will enclose all structure       *
263 * portability modifications inside    *
264 * #ifdefs.  When we are ready, we     *
265 * will #define	DPT_PORTABLE to begin  *
266 * using the modifications.	       *
267 *-------------------------------------*/
268uLONG	netSwap4(uLONG val);
269
270#if defined(_DPT_BIG_ENDIAN)
271
272/* for big-endian we need to swap */
273
274#ifndef NET_SWAP_2
275#define	NET_SWAP_2(x) (((x) >> 8) | ((x) << 8))
276#endif	/* NET_SWAP_2 */
277
278#ifndef NET_SWAP_4
279#define	NET_SWAP_4(x) netSwap4((x))
280#endif	/* NET_SWAP_4 */
281
282#else
283
284/* for little-endian we don't need to do anything */
285
286#ifndef NET_SWAP_2
287#define	NET_SWAP_2(x) (x)
288#endif	/* NET_SWAP_2 */
289
290#ifndef NET_SWAP_4
291#define	NET_SWAP_4(x) (x)
292#endif	/* NET_SWAP_4 */
293
294#endif	/* big endian */
295
296
297
298/*----------------------------------- */
299/* Run-time loadable module functions */
300/*----------------------------------- */
301
302  /* Loads the specified run-time loadable DLL */
303DLL_HANDLE_T	osdLoadModule(uCHAR *);
304  /* Unloads the specified run-time loadable DLL */
305uSHORT		osdUnloadModule(DLL_HANDLE_T);
306  /* Returns a pointer to a function inside a run-time loadable DLL */
307void *		osdGetFnAddr(DLL_HANDLE_T,uCHAR *);
308
309/*--------------------------------------- */
310/* Mutually exclusive semaphore functions */
311/*--------------------------------------- */
312
313  /* Create a named semaphore */
314SEMAPHORE_T	osdCreateNamedSemaphore(char *);
315  /* Create a mutually exlusive semaphore */
316SEMAPHORE_T	osdCreateSemaphore(void);
317	/* create an event semaphore */
318SEMAPHORE_T		 osdCreateEventSemaphore(void);
319	/* create a named event semaphore */
320SEMAPHORE_T		osdCreateNamedEventSemaphore(char *);
321
322  /* Destroy the specified mutually exclusive semaphore object */
323uSHORT		osdDestroySemaphore(SEMAPHORE_T);
324  /* Request access to the specified mutually exclusive semaphore */
325uLONG		osdRequestSemaphore(SEMAPHORE_T,uLONG);
326  /* Release access to the specified mutually exclusive semaphore */
327uSHORT		osdReleaseSemaphore(SEMAPHORE_T);
328	/* wait for an event to happen */
329uLONG				 osdWaitForEventSemaphore(SEMAPHORE_T, uLONG);
330	/* signal an event */
331uLONG				 osdSignalEventSemaphore(SEMAPHORE_T);
332	/* reset the event */
333uLONG				 osdResetEventSemaphore(SEMAPHORE_T);
334
335/*----------------- */
336/* Thread functions */
337/*----------------- */
338
339  /* Releases control to the task switcher in non-preemptive */
340  /* multitasking operating systems. */
341void		osdSwitchThreads(void);
342
343  /* Starts a thread function */
344uLONG	osdStartThread(void *,void *);
345
346/* what is my thread id */
347uLONG osdGetThreadID(void);
348
349/* wakes up the specifed thread */
350void osdWakeThread(uLONG);
351
352/* osd sleep for x miliseconds */
353void osdSleep(uLONG);
354
355#define	DPT_THREAD_PRIORITY_LOWEST 0x00
356#define	DPT_THREAD_PRIORITY_NORMAL 0x01
357#define	DPT_THREAD_PRIORITY_HIGHEST 0x02
358
359uCHAR osdSetThreadPriority(uLONG tid, uCHAR priority);
360
361#ifdef __cplusplus
362   }	/* end the xtern "C" declaration */
363#endif
364
365#endif	/* osd_util_h */
366