X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Finclude%2Fmodules.h;h=d53f774927499362e53ad146817de8cb892e7015;hb=f2fd50e797e6a3b3590e4c2e13b6782dd87c25a2;hp=dcf346562e15c86114b68f5460e2635d6426a62f;hpb=8bc40333b1401d7616b225945fee53d972c2f418;p=tpg%2Facess2.git diff --git a/Kernel/include/modules.h b/Kernel/include/modules.h index dcf34656..d53f7749 100644 --- a/Kernel/include/modules.h +++ b/Kernel/include/modules.h @@ -8,24 +8,21 @@ #define MODULE_MAGIC ('A'|('M'<<8)|('D'<<16)|('\2'<<24)) // IA32 - Architecture 1 -#if ARCH == i386 || ARCH == i586 +#if ARCHDIR == x86 # define MODULE_ARCH_ID 1 // IA64 - Architecture 2 -#elif ARCH == x64 || ARCH == x86_64 +#elif ARCHDIR == x64 # define MODULE_ARCH_ID 2 #else -# error "Unknown architecture when determining MODULE_ARCH_ID ('" #ARCH "')" +# error "Unknown architecture when determining MODULE_ARCH_ID ('" #ARCHDIR "')" #endif -#if BUILD_MODULE -# define MODULE_DEFINE(_flags,_ver,_ident,_entry,_deps...) char *_DriverDeps[]={_deps};\ - tModule DriverInfo=\ - {MODULE_MAGIC,MODULE_ARCH_ID,_flags,_ver,NULL,#_ident,_entry,_DriverDeps} -#else -# define MODULE_DEFINE(_flags,_ver,_ident,_entry,_deps...) char *_DriverDeps_##_ident[]={_deps};\ - tModule __attribute__ ((section ("KMODULES"),unused)) _DriverInfo_##_ident=\ - {MODULE_MAGIC,MODULE_ARCH_ID,_flags,_ver,NULL,#_ident,_entry,_DriverDeps_##_ident} -#endif +#define MODULE_DEFINE(_flags,_ver,_ident,_entry,_deinit,_deps...) \ + char *EXPAND_CONCAT(_DriverDeps_,_ident)[]={_deps};\ + tModule __attribute__ ((section ("KMODULES"),unused))\ + EXPAND_CONCAT(_DriverInfo_,_ident)=\ + {MODULE_MAGIC,MODULE_ARCH_ID,_flags,_ver,NULL,EXPAND_STR(_ident),\ + _entry,_deinit,EXPAND_CONCAT(_DriverDeps_,_ident)} typedef struct sModule { Uint32 Magic; @@ -35,7 +32,31 @@ typedef struct sModule { struct sModule *Next; char *Name; int (*Init)(char **Arguments); + void (*Deinit)(); char **Dependencies; // NULL Terminated List } __attribute__((packed)) tModule; +#define MODULE_INIT_SUCCESS 1 +#define MODULE_INIT_FAILURE 0 + +/** + * \brief Module Loader definition + * + * Allows a module to extend the loader to recognise other module types + * E.g. EDI, UDI, Windows, Linux, ... + */ +typedef struct sModuleLoader { + struct sModuleLoader *Next; //!< Kernel Only - Next loader in list + char *Name; //!< Friendly name for the loader + int (*Detector)(void *Base); //!< Simple detector function + int (*Loader)(void *Base); //!< Initialises the module + int (*Unloader)(void *Base); //!< Calls module's cleanup +} PACKED tModuleLoader; + +/** + * \brief Registers a tModuleLoader with the kernel + * \param Loader Pointer to loader structure (must be persistent) + */ +extern int Module_RegisterLoader(tModuleLoader *Loader); + #endif