X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fmodules.c;h=93de973d0b6b56081872beba8876a152ca7900be;hb=76504d6eb355267746921fb49ebd191219f4cb84;hp=b1d858c7d0d2672a39fe61e8460b815239e06759;hpb=77ed20ce9d7e25654215980d0f89e63b8dd366f0;p=tpg%2Facess2.git diff --git a/Kernel/modules.c b/Kernel/modules.c index b1d858c7..93de973d 100644 --- a/Kernel/modules.c +++ b/Kernel/modules.c @@ -2,16 +2,23 @@ * Acess2 * - Module Loader */ -#include +#include #include +#define USE_EDI 0 +#define USE_UDI 1 + // === PROTOTYPES === + int Modules_LoadBuiltins(); int Module_LoadMem(void *Buffer, Uint Length, char *ArgString); int Module_LoadFile(char *Path, char *ArgString); int Module_int_ResolveDeps(tModule *Info); int Module_IsLoaded(char *Name); // === IMPORTS === +#if USE_UDI +extern int UDI_LoadDriver(void *Base); +#endif extern void StartupPrint(char *Str); extern tModule gKernelModules[]; extern void gKernelModulesEnd; @@ -64,6 +71,8 @@ int Modules_LoadBuiltins() for( i = 0; i < giNumBuiltinModules; i++ ) { if( baIsLoaded[i] ) continue; // Ignore already loaded modules + + deps = gKernelModules[i].Dependencies; if( deps ) { @@ -95,9 +104,13 @@ int Modules_LoadBuiltins() gKernelModules[i].Name, gKernelModules[i].Version>>8, gKernelModules[i].Version & 0xFF ); - gKernelModules[i].Init(NULL); + if( gKernelModules[i].Init(NULL) == 0 ) { + Log("Loading Failed, all modules that depend on this will also fail"); + baIsLoaded[i] = -1; + } // Mark as loaded - baIsLoaded[i] = 1; + else + baIsLoaded[i] = 1; numToInit --; } } @@ -113,7 +126,7 @@ int Module_LoadMem(void *Buffer, Uint Length, char *ArgString) { char path[VFS_MEMPATH_SIZE]; - VFS_GetMemPath(Buffer, Length, path); + VFS_GetMemPath(path, Buffer, Length); return Module_LoadFile( path, ArgString ); } @@ -131,26 +144,37 @@ 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 ) + if( Binary_FindSymbol(base, "driver_init", NULL ) != 0 ) { Binary_Relocate(base); // Relocate return Module_InitEDI( base ); // And intialise } #endif + #if USE_UDI + if( Binary_FindSymbol(base, "udi_init_info", NULL ) != 0 ) + { + Binary_Relocate(base); // Relocate + return UDI_LoadDriver( 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; } @@ -158,14 +182,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; }