#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(char *Name);
+ int Module_IsLoaded(const char *Name);
+// int Module_EnsureLoaded(const char *Name);
// === EXPORTS ===
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;
/**
* \brief Initialises a module
* \param Module Pointer to the module header
+ * \param ArgString Comma separated list of module arguments
* \return Zero on success, eModuleErrors or -1 on error
* \retval -1 Returned if a dependency fails, or a circular dependency
* exists.
* \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;
// 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
);
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);
}
free(gasBuiltinModuleArgs);
}
+/**
+ * \brief Initialise a builtin module given it's name
+ *
+ * E.g. Used by VTerm to load an alternate video driver at runtime
+ */
+int Modules_InitialiseBuiltin(const char *Name)
+{
+ int i;
+
+ // Check if it's loaded
+ if( Module_IsLoaded(Name) )
+ return 0;
+
+ if( !gapBuiltinModules )
+ Modules_int_GetBuiltinArray();
+
+ for( i = 0; i < giNumBuiltinModules; i++ )
+ {
+ if( strcmp(gapBuiltinModules[i]->Name, Name) == 0 ) {
+ return Module_int_Initialise(gapBuiltinModules[i],
+ (gasBuiltinModuleArgs ? gasBuiltinModuleArgs[i] : NULL)
+ );
+ }
+ }
+ return -1;
+}
+
/**
* \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;
* \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];
}
/**
- * \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;
*/
int Module_int_ResolveDeps(tModule *Info)
{
- char **names = Info->Dependencies;
+ const char **names = Info->Dependencies;
// Walk dependencies array
for( ; *names; names++ )
}
/**
- * \fn int Module_IsLoaded(char *Name)
+ * \fn int Module_IsLoaded(const char *Name)
* \brief Checks if a module is loaded
* \param Name Name of module to find
*/
-int Module_IsLoaded(char *Name)
+int Module_IsLoaded(const char *Name)
{
tModule *mod = gLoadedModules;
// 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;
+}