X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fmodules.c;h=c0c021615a329b0aa09f148d96448e0cdd5d3d0e;hb=1baac59e0cea8985a60093e7415a1796bad138ae;hp=0409711dde045bf5309fedbb0cb08d1e68410948;hpb=efa38e0d56b1b620b6f4e5c4f91abc483a3065e2;p=tpg%2Facess2.git diff --git a/Kernel/modules.c b/Kernel/modules.c index 0409711d..c0c02161 100644 --- a/Kernel/modules.c +++ b/Kernel/modules.c @@ -10,14 +10,17 @@ #define USE_UDI 0 // === PROTOTYPES === - int Module_int_Initialise(tModule *Module, char *ArgString); + int Module_int_Initialise(tModule *Module, const char *ArgString); +void Modules_int_GetBuiltinArray(void); void Modules_LoadBuiltins(void); -void Modules_SetBuiltinParams(char *Name, char *ArgString); - int Module_RegisterLoader(tModuleLoader *Loader); - int Module_LoadMem(void *Buffer, Uint Length, char *ArgString); - int Module_LoadFile(char *Path, char *ArgString); +void Modules_SetBuiltinParams(const char *Name, char *ArgString); + int Modules_InitialiseBuiltin(const char *Name); +// int Module_RegisterLoader(tModuleLoader *Loader); +// 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(const char *Name); +// int Module_EnsureLoaded(const char *Name); // === EXPORTS === EXPORT(Module_RegisterLoader); @@ -26,13 +29,13 @@ EXPORT(Module_RegisterLoader); #if USE_UDI extern int UDI_LoadDriver(void *Base); #endif -extern void StartupPrint(char *Str); -extern void gKernelModules; -extern void gKernelModulesEnd; +extern void StartupPrint(const char *Str); +extern tModule gKernelModules; +extern tModule gKernelModulesEnd; // === GLOBALS === int giNumBuiltinModules = 0; -tSpinlock glModuleSpinlock; +tShortSpinlock glModuleSpinlock; tModule *gLoadedModules = NULL; tModuleLoader *gModule_Loaders = NULL; tModule *gLoadingModules = NULL; @@ -50,11 +53,11 @@ char **gasBuiltinModuleArgs; * \retval 0 Returned on success * \retval >0 Error code form the module's initialisation function */ -int Module_int_Initialise(tModule *Module, char *ArgString) +int Module_int_Initialise(tModule *Module, const char *ArgString) { int i, j; int ret; - char **deps; + const char **deps; char **args; tModule *mod; @@ -141,7 +144,7 @@ int Module_int_Initialise(tModule *Module, char *ArgString) // All Dependencies OK? Initialise StartupPrint(Module->Name); - Log_Log("Module", "Initialising %p '%s' v%i.%i...", + Log_Log("Module", "Starting %p '%s' v%i.%i", Module, Module->Name, Module->Version >> 8, Module->Version & 0xFF ); @@ -180,10 +183,10 @@ int Module_int_Initialise(tModule *Module, char *ArgString) LOG("ret = %i", ret); // Add to loaded list - LOCK( &glModuleSpinlock ); + SHORTLOCK( &glModuleSpinlock ); Module->Next = gLoadedModules; gLoadedModules = Module; - RELEASE( &glModuleSpinlock ); + SHORTREL( &glModuleSpinlock ); LEAVE_RET('i', 0); } @@ -254,7 +257,8 @@ void Modules_LoadBuiltins() /** * \brief Initialise a builtin module given it's name - * \example Used by VTerm to load an alternate video driver at runtime + * + * E.g. Used by VTerm to load an alternate video driver at runtime */ int Modules_InitialiseBuiltin(const char *Name) { @@ -281,7 +285,7 @@ int Modules_InitialiseBuiltin(const char *Name) /** * \brief Sets the parameters for a builtin module */ -void Modules_SetBuiltinParams(char *Name, char *ArgString) +void Modules_SetBuiltinParams(const char *Name, char *ArgString) { int i; @@ -320,7 +324,7 @@ int Module_RegisterLoader(tModuleLoader *Loader) * \fn int Module_LoadMem(void *Buffer, Uint Length, char *ArgString) * \brief Load a module from a memory location */ -int Module_LoadMem(void *Buffer, Uint Length, char *ArgString) +int Module_LoadMem(void *Buffer, Uint Length, const char *ArgString) { char path[VFS_MEMPATH_SIZE]; @@ -330,10 +334,10 @@ int Module_LoadMem(void *Buffer, Uint Length, char *ArgString) } /** - * \fn int Module_LoadFile(char *Path, char *ArgString) + * \fn int Module_LoadFile(const char *Path, const char *ArgString) * \brief Load a module from a file */ -int Module_LoadFile(char *Path, char *ArgString) +int Module_LoadFile(const char *Path, const char *ArgString) { void *base; tModule *info; @@ -394,7 +398,7 @@ int Module_LoadFile(char *Path, char *ArgString) */ int Module_int_ResolveDeps(tModule *Info) { - char **names = Info->Dependencies; + const char **names = Info->Dependencies; // Walk dependencies array for( ; *names; names++ ) @@ -427,3 +431,19 @@ int Module_IsLoaded(const char *Name) // not found - return false return 0; } + +/** + * \brief Load a module if needed + */ +int Module_EnsureLoaded(const char *Name) +{ + if( Module_IsLoaded(Name) ) + return 0; + + if( Modules_InitialiseBuiltin(Name) == 0 ) + return 0; + + // TODO: Load from a file? + + return -1; +}