87#include "pedigree/kernel/compiler.h"
88#include "pedigree/kernel/utilities/utility.h"
96typedef bool (*ModuleEntry)();
97typedef void (*ModuleExit)();
99#define MODULE_TAG 0xdeadbaba
106 const char** dependencies;
107 const char** opt_dependencies;
111 bool runtimeUnloadable;
117extern size_t g_StaticDriverN;
119class StaticDriverModule {
121 StaticDriverModule(
const char* name, ModuleEntry entry, ModuleExit exit,
const char** deps,
122 bool unloadable,
const char** opt_deps =
nullptr)
123 : StaticDriverModule(name, entry, exit, deps, unloadable, opt_deps, unloadable) {}
125 StaticDriverModule(
const char* name, ModuleEntry entry, ModuleExit exit,
const char** deps,
126 bool unloadable,
const char** opt_deps,
bool runtimeUnloadable) {
127 info.tag = MODULE_TAG;
131 info.dependencies = deps;
132 info.opt_dependencies = opt_deps;
133 info.unloadable = unloadable;
134 info.runtimeUnloadable = runtimeUnloadable;
135 g_StaticDrivers[g_StaticDriverN++] = &info;
141class StaticDriverOptionalDependencies {
143 StaticDriverOptionalDependencies(StaticDriverModule& module,
const char** dependencies) {
144 module.info.opt_dependencies = dependencies;
148#define MODULE_INFO2_FLAGS(unloadable, runtimeUnloadable, name, entry, exit, ...) \
149 static const char* __mod_deps[] = {__VA_ARGS__, 0}; \
150 static StaticDriverModule __module(name, entry, exit, __mod_deps, unloadable, nullptr, \
153#define MODULE_INFO2(name, entry, exit, ...) \
154 MODULE_INFO2_FLAGS(true, true, name, entry, exit, __VA_ARGS__)
156#define MODULE_OPTIONAL_DEPENDS(...) \
157 static const char* __mod_opt_deps[] = {__VA_ARGS__, 0}; \
158 static StaticDriverOptionalDependencies __module_opt_dependencies(__module, __mod_opt_deps)
162#define MODULE_NAME(x) const char* g_pModuleName EXPORTED_PUBLIC SECTION(".modinfo") USED = x
163#define MODULE_ENTRY(x) ModuleEntry g_pModuleEntry EXPORTED_PUBLIC SECTION(".modinfo") USED = x
164#define MODULE_EXIT(x) ModuleExit g_pModuleExit EXPORTED_PUBLIC SECTION(".modinfo") USED = x
165#define MODULE_UNLOADABLE(x) bool g_bModuleUnloadable EXPORTED_PUBLIC SECTION(".modinfo") USED = x
166#define MODULE_RUNTIME_UNLOADABLE(x) \
167 bool g_bModuleRuntimeUnloadable EXPORTED_PUBLIC SECTION(".modinfo") USED = x
168#define MODULE_DEPENDS(...) \
169 const char* g_pDepends[] EXPORTED_PUBLIC SECTION(".modinfo") USED = {__VA_ARGS__, 0}
170#define MODULE_DEPENDS2(...) \
171 const char* g_pDepends[] EXPORTED_PUBLIC SECTION(".modinfo") USED = {__VA_ARGS__}
173#define MODULE_OPTIONAL_DEPENDS(...) \
174 const char* g_pOptionalDepends[] EXPORTED_PUBLIC SECTION(".modinfo") USED = {__VA_ARGS__, 0}
176#define MODULE_INFO2_FLAGS(unloadable, runtimeUnloadable, name, entry, exit, ...) \
178 MODULE_ENTRY(entry); \
180 MODULE_UNLOADABLE(unloadable); \
181 MODULE_RUNTIME_UNLOADABLE(runtimeUnloadable); \
182 MODULE_DEPENDS2(__VA_ARGS__);
184#define MODULE_INFO2(name, entry, exit, ...) \
185 MODULE_INFO2_FLAGS(true, true, name, entry, exit, __VA_ARGS__)
187extern const char* g_pModuleName;
188extern ModuleEntry g_pModuleEntry;
189extern ModuleExit g_pModuleExit;
190extern bool g_bModuleUnloadable;
191extern bool g_bModuleRuntimeUnloadable;
192extern const char* g_pDepends[];
193extern const char* g_pOptionalDepends[];
197#define MODULE_INFO(...) MODULE_INFO2(__VA_ARGS__, 0)
198#define MODULE_INFO_NON_UNLOADABLE(...) MODULE_INFO2_FLAGS(false, false, __VA_ARGS__, 0)
199#define MODULE_INFO_RUNTIME_PINNED(...) MODULE_INFO2_FLAGS(true, false, __VA_ARGS__, 0)