X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fmodules.c;h=e4f49b288e776b2b854bb771ad09ee3c5d92e213;hb=1c2a87ec67d332b6a165c79398693eac1eb1166e;hp=ba92905fe22ae5a549a2ffa5cb83cc4c3da8706e;hpb=ebe5e8898c7e8b2a0eb6ec285d214ff52ed18803;p=tpg%2Facess2.git diff --git a/Kernel/modules.c b/Kernel/modules.c index ba92905f..e4f49b28 100644 --- a/Kernel/modules.c +++ b/Kernel/modules.c @@ -2,7 +2,7 @@ * Acess2 * - Module Loader */ -#include +#include #include #define USE_EDI 0 @@ -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 @@ -144,34 +159,36 @@ int Module_LoadFile(char *Path, char *ArgString) base = Binary_LoadKernel(Path); // Error check - if(base == NULL) return 0; + if(base == NULL) { + Warning("Module_LoadFile: Unable to load '%s'", Path); + return 0; + } // Check for Acess Driver if( Binary_FindSymbol(base, "DriverInfo", (Uint*)&info ) == 0 ) { - #if USE_EDI - // Check for EDI Driver - if( Binary_FindSymbol(base, "driver_init", NULL ) == 0 ) + tModuleLoader *tmp; + for( tmp = gModule_Loaders; tmp; tmp = tmp->Next) { - Binary_Relocate(base); // Relocate - return Module_InitEDI( base ); // And intialise + if( tmp->Detector(base) == 0 ) continue; + + return tmp->Loader(base); } - #endif - #if USE_UDI - if( Binary_FindSymbol(base, "udi_init_info", NULL ) == 0 ) + #if USE_EDI + // Check for EDI Driver + if( Binary_FindSymbol(base, "driver_init", NULL ) != 0 ) { - Binary_Relocate(base); // Relocate - return UDI_LoadDriver( base ); // And intialise + return Module_InitEDI( base ); // And intialise } #endif // Unknown module type?, return error Binary_Unload(base); #if USE_EDI - Warning("Module_LoadMem: Module has neither a Module Info struct, nor an EDI entrypoint"); + Warning("Module_LoadFile: Module has neither a Module Info struct, nor an EDI entrypoint"); #else - Warning("Module_LoadMem: Module does not have a Module Info struct"); + Warning("Module_LoadFile: Module does not have a Module Info struct"); #endif return 0; } @@ -179,14 +196,14 @@ int Module_LoadFile(char *Path, char *ArgString) // Check magic number if(info->Magic != MODULE_MAGIC) { - Warning("Module_LoadMem: Module's magic value is invalid (0x%x != 0x%x)", info->Magic, MODULE_MAGIC); + Warning("Module_LoadFile: Module's magic value is invalid (0x%x != 0x%x)", info->Magic, MODULE_MAGIC); return 0; } // Check Architecture if(info->Arch != MODULE_ARCH_ID) { - Warning("Module_LoadMem: Module is for a different architecture"); + Warning("Module_LoadFile: Module is for a different architecture"); return 0; }