591dbf92bc2708636ed4c82947ab7b04c4465e5c
[tpg/acess2.git] / Kernel / include / modules.h
1 /*
2  * AcessOS 2
3  * - Module Loader
4  */
5 #ifndef _MODULE_H
6 #define _MODULE_H
7
8 #define MODULE_MAGIC    ('A'|('M'<<8)|('D'<<16)|('\2'<<24))
9
10 // IA32 - Architecture 1
11 #if ARCHDIR == x86
12 # define MODULE_ARCH_ID 1
13 // IA64 - Architecture 2
14 #elif ARCHDIR == x64
15 # define MODULE_ARCH_ID 2
16 #else
17 # error "Unknown architecture when determining MODULE_ARCH_ID ('" #ARCHDIR "')"
18 #endif
19
20 #define MODULE_DEFINE(_flags,_ver,_ident,_entry,_deinit,_deps...)       char *_DriverDeps_##_ident[]={_deps};\
21         tModule __attribute__ ((section ("KMODULES"),unused)) _DriverInfo_##_ident=\
22         {MODULE_MAGIC,MODULE_ARCH_ID,_flags,_ver,NULL,#_ident,_entry,_deinit,_DriverDeps_##_ident}
23
24 typedef struct sModule {
25         Uint32  Magic;
26         Uint8   Arch;
27         Uint8   Flags;
28         Uint16  Version;
29         struct sModule  *Next;
30         char    *Name;
31          int    (*Init)(char **Arguments);
32         void    (*Deinit)();
33         char    **Dependencies; // NULL Terminated List
34 } __attribute__((packed)) tModule;
35
36 #define MODULE_INIT_SUCCESS     1
37 #define MODULE_INIT_FAILURE     0
38
39 /**
40  * \brief Module Loader definition
41  * 
42  * Allows a module to extend the loader to recognise other module types
43  * E.g. EDI, UDI, Windows, Linux, ...
44  */
45 typedef struct sModuleLoader {
46         struct sModuleLoader    *Next;  //!< Kernel Only - Next loader in list
47         char    *Name;  //!< Friendly name for the loader
48          int    (*Detector)(void *Base);        //!< Simple detector function
49          int    (*Loader)(void *Base);  //!< Initialises the module
50          int    (*Unloader)(void *Base);        //!< Calls module's cleanup
51 } PACKED tModuleLoader;
52
53 /**
54  * \brief Registers a tModuleLoader with the kernel
55  * \param Loader        Pointer to loader structure (must be persistent)
56  */
57 extern int      Module_RegisterLoader(tModuleLoader *Loader);
58
59 #endif

UCC git Repository :: git.ucc.asn.au