#ifndef __IONDRV__
#define __IONDRV__
#include <IOKit/IORegistryEntry.h>
#include <IOKit/IOInterruptEventSource.h>
#include <IOKit/ndrvsupport/IOMacOSTypes.h>
#include <IOKit/ndrvsupport/IONDRVSupport.h>
#pragma options align=mac68k
#ifdef __cplusplus
extern "C" {
#endif
typedef void * RegEntryID[4];
struct DriverInitInfo {
UInt16 refNum;
RegEntryID deviceEntry;
};
#define MAKE_REG_ENTRY(regEntryID,obj) \
regEntryID[ 0 ] = (void *) obj; \
regEntryID[ 1 ] = (void *) ~(UInt32)obj; \
regEntryID[ 2 ] = (void *) 0x53696d65; \
regEntryID[ 3 ] = (void *) 0x52756c7a;
#define REG_ENTRY_TO_OBJ(regEntryID,obj) \
if( (UInt32)((obj = ((IORegistryEntry **)regEntryID)[ 0 ])) \
!= ~((UInt32 *)regEntryID)[ 1 ] ) \
return( -2538);
#define REG_ENTRY_TO_OBJ_RET(regEntryID,obj,ret) \
if( (UInt32)((obj = ((IORegistryEntry **)regEntryID)[ 0 ])) \
!= ~((UInt32 *)regEntryID)[ 1 ] ) \
return( ret);
#define REG_ENTRY_TO_PT(regEntryID,obj) \
IORegistryEntry * obj; \
if( (UInt32)((obj = ((IORegistryEntry **)regEntryID)[ 0 ])) \
!= ~((UInt32 *)regEntryID)[ 1 ] ) \
return( -2538);
#define REG_ENTRY_TO_SERVICE(regEntryID,type,obj) \
IORegistryEntry * regEntry; \
type * obj; \
if( (UInt32)((regEntry = ((IORegistryEntry **)regEntryID)[ 0 ])) \
!= ~((UInt32 *)regEntryID)[ 1 ] ) \
return( -2538); \
if( 0 == (obj = OSDynamicCast( type, regEntry))) \
return( -2542);
struct CntrlParam {
void * qLink;
short qType;
short ioTrap;
void * ioCmdAddr;
void * ioCompletion;
short ioResult;
char * ioNamePtr;
short ioVRefNum;
short ioCRefNum;
short csCode;
void * csParams;
short csParam[9];
};
typedef struct CntrlParam CntrlParam, *CntrlParamPtr;
#pragma options align=reset
enum {
kOpenCommand = 0,
kCloseCommand = 1,
kReadCommand = 2,
kWriteCommand = 3,
kControlCommand = 4,
kStatusCommand = 5,
kKillIOCommand = 6,
kInitializeCommand = 7,
kFinalizeCommand = 8,
kReplaceCommand = 9,
kSupersededCommand = 10
};
enum {
kSynchronousIOCommandKind = 0x00000001,
kAsynchronousIOCommandKind = 0x00000002,
kImmediateIOCommandKind = 0x00000004
};
extern OSStatus CallTVector(
void * p1, void * p2, void * p3, void * p4, void * p5, void * p6,
struct IOTVector * entry );
#ifdef __cplusplus
}
#endif
class IONDRV : public OSObject
{
OSDeclareDefaultStructors(IONDRV)
private:
void * pcInst;
struct IOTVector * fDoDriverIO;
struct DriverDescription * theDriverDesc;
public:
static IONDRV * instantiate( IORegistryEntry * regEntry,
IOLogicalAddress container,
IOByteCount containerSize,
IONDRVUndefinedSymbolHandler handler,
void * self );
static IONDRV * fromRegistryEntry( IORegistryEntry * regEntry,
IONDRVUndefinedSymbolHandler handler,
void * self);
virtual void free( void );
virtual IOReturn getSymbol( const char * symbolName,
IOLogicalAddress * address );
virtual const char * driverName( void );
virtual IOReturn doDriverIO( UInt32 commandID, void * contents,
UInt32 commandCode, UInt32 commandKind );
};
struct IONDRVInterruptSource {
void * refCon;
struct IOTVector * handler;
struct IOTVector * enabler;
struct IOTVector * disabler;
bool registered;
bool enabled;
};
class IONDRVInterruptSet : public OSObject {
OSDeclareDefaultStructors(IONDRVInterruptSet)
public:
IOService * provider;
IOOptionBits options;
UInt32 count;
IONDRVInterruptSource * sources;
IONDRVInterruptSet * child;
static IONDRVInterruptSet * with(IOService * provider,
IOOptionBits options, SInt32 count);
void free();
};
#endif