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