#include "fs/devices/DeviceRegistry.h" #include "Log.h" #include "fs/devices/ConsoleDevice.h" #include "fs/devices/FramebufferDevice.h" #include "fs/devices/NullDevice.h" #include "fs/devices/ZeroDevice.h" #include struct DeviceDescriptor { device_create_func_t initializer; u32 major; u32 minor; }; Vector g_available_devices = {}; namespace DeviceRegistry { Result> create_special_device(u32 major, u32 minor) { for (const auto& descriptor : g_available_devices) { if (descriptor.major == major && descriptor.minor == minor) return descriptor.initializer(); } return err(ENODEV); } Result register_special_device(u32 major, u32 minor, device_create_func_t initializer) { for (const auto& descriptor : g_available_devices) { if (descriptor.major == major && descriptor.minor == minor) return err(EEXIST); } kdbgln("DeviceRegistry: registered new device type %u:%u", major, minor); return g_available_devices.try_append( DeviceDescriptor { .initializer = initializer, .major = major, .minor = minor }); } Result init() { // Hardcode default devices. TRY(register_special_device(DeviceMajorTypes::Memory, 0, NullDevice::create)); TRY(register_special_device(DeviceMajorTypes::Memory, 1, ZeroDevice::create)); TRY(register_special_device(DeviceMajorTypes::Console, 0, ConsoleDevice::create)); TRY(register_special_device(DeviceMajorTypes::Framebuffer, 0, FramebufferDevice::create)); return {}; } }