module.hpp 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. #pragma once
  2. #include <memory>
  3. #include <types/types.h>
  4. #define MODULE_LOADER(name) \
  5. static std::unique_ptr<kernel::kmod::kmod> __module##name##_loader()
  6. #define INTERNAL_MODULE(name, type) \
  7. MODULE_LOADER(name); \
  8. SECTION(".kmods") \
  9. __attribute__((used)) \
  10. std::unique_ptr<kernel::kmod::kmod> (*const __module##name##_entry)() = \
  11. __module##name##_loader; \
  12. MODULE_LOADER(name) { \
  13. return std::make_unique<type>(); \
  14. }
  15. namespace kernel::kmod {
  16. struct kmod {
  17. const char* const name;
  18. explicit kmod(const char* name);
  19. virtual ~kmod() = default;
  20. kmod(const kmod&) = delete;
  21. kmod& operator=(const kmod&) = delete;
  22. virtual int init() = 0;
  23. };
  24. extern "C" std::unique_ptr<kmod> (*const KMOD_LOADERS_START[])();
  25. void load_internal_modules();
  26. } // namespace kernel::kmod