X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fmodules.c;h=e4f49b288e776b2b854bb771ad09ee3c5d92e213;hb=1c2a87ec67d332b6a165c79398693eac1eb1166e;hp=a206cf97ea33a21899d1d39984e7019244f125b6;hpb=fbb51904de075386178cc6bb14717132d3b2153d;p=tpg%2Facess2.git diff --git a/Kernel/modules.c b/Kernel/modules.c index a206cf97..e4f49b28 100644 --- a/Kernel/modules.c +++ b/Kernel/modules.c @@ -27,6 +27,7 @@ extern void gKernelModulesEnd; int giNumBuiltinModules = 0; int giModuleSpinlock = 0; tModule *gLoadedModules = NULL; +tModuleLoader *gModule_Loaders = NULL; // === CODE === int Modules_LoadBuiltins() @@ -118,6 +119,20 @@ int Modules_LoadBuiltins() return 0; } +/** + * \brief Registers a tModuleLoader with the kernel + * \param Loader Pointer to loader structure (must be persistent) + */ +int Module_RegisterLoader(tModuleLoader *Loader) +{ + if(!Loader) return 1; + + Loader->Next = gModule_Loaders; + gModule_Loaders = Loader; + + return 0; +} + /** * \fn int Module_LoadMem(void *Buffer, Uint Length, char *ArgString) * \brief Load a module from a memory location @@ -152,6 +167,14 @@ int Module_LoadFile(char *Path, char *ArgString) // Check for Acess Driver if( Binary_FindSymbol(base, "DriverInfo", (Uint*)&info ) == 0 ) { + tModuleLoader *tmp; + for( tmp = gModule_Loaders; tmp; tmp = tmp->Next) + { + if( tmp->Detector(base) == 0 ) continue; + + return tmp->Loader(base); + } + #if USE_EDI // Check for EDI Driver if( Binary_FindSymbol(base, "driver_init", NULL ) != 0 ) @@ -160,13 +183,6 @@ int Module_LoadFile(char *Path, char *ArgString) } #endif - #if USE_UDI - if( Binary_FindSymbol(base, "udi_init_info", NULL ) != 0 ) - { - return UDI_LoadDriver( base ); // And intialise - } - #endif - // Unknown module type?, return error Binary_Unload(base); #if USE_EDI