kernel: Make DeviceRegistry store the created devices instead of creating them when requested
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
35b1b36599
commit
4753e80583
@ -1,6 +1,7 @@
|
|||||||
#include "fs/devices/ConsoleDevice.h"
|
#include "fs/devices/ConsoleDevice.h"
|
||||||
#include "Log.h"
|
#include "Log.h"
|
||||||
#include "arch/Keyboard.h"
|
#include "arch/Keyboard.h"
|
||||||
|
#include "fs/devices/DeviceRegistry.h"
|
||||||
#include "memory/MemoryManager.h"
|
#include "memory/MemoryManager.h"
|
||||||
#include "thread/Scheduler.h"
|
#include "thread/Scheduler.h"
|
||||||
#include "video/TextConsole.h"
|
#include "video/TextConsole.h"
|
||||||
@ -14,9 +15,10 @@ static Buffer g_console_input;
|
|||||||
static bool g_eof { false };
|
static bool g_eof { false };
|
||||||
static bool g_echo { true };
|
static bool g_echo { true };
|
||||||
|
|
||||||
Result<SharedPtr<Device>> ConsoleDevice::create()
|
Result<void> ConsoleDevice::create()
|
||||||
{
|
{
|
||||||
return (SharedPtr<Device>)TRY(make_shared<ConsoleDevice>());
|
auto device = (SharedPtr<Device>)TRY(make_shared<ConsoleDevice>());
|
||||||
|
return DeviceRegistry::register_special_device(DeviceRegistry::Console, 0, device);
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<usize> ConsoleDevice::read(u8* buf, usize, usize length) const
|
Result<usize> ConsoleDevice::read(u8* buf, usize, usize length) const
|
||||||
|
@ -5,7 +5,7 @@ class ConsoleDevice : public Device
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
// Initializer for DeviceRegistry.
|
// Initializer for DeviceRegistry.
|
||||||
static Result<SharedPtr<Device>> create();
|
static Result<void> create();
|
||||||
|
|
||||||
Result<usize> read(u8*, usize, usize) const override;
|
Result<usize> read(u8*, usize, usize) const override;
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
struct DeviceDescriptor
|
struct DeviceDescriptor
|
||||||
{
|
{
|
||||||
device_create_func_t initializer;
|
SharedPtr<Device> device;
|
||||||
u32 major;
|
u32 major;
|
||||||
u32 minor;
|
u32 minor;
|
||||||
};
|
};
|
||||||
@ -17,17 +17,17 @@ Vector<DeviceDescriptor> g_available_devices = {};
|
|||||||
|
|
||||||
namespace DeviceRegistry
|
namespace DeviceRegistry
|
||||||
{
|
{
|
||||||
Result<SharedPtr<Device>> create_special_device(u32 major, u32 minor)
|
Result<SharedPtr<Device>> fetch_special_device(u32 major, u32 minor)
|
||||||
{
|
{
|
||||||
for (const auto& descriptor : g_available_devices)
|
for (const auto& descriptor : g_available_devices)
|
||||||
{
|
{
|
||||||
if (descriptor.major == major && descriptor.minor == minor) return descriptor.initializer();
|
if (descriptor.major == major && descriptor.minor == minor) return descriptor.device;
|
||||||
}
|
}
|
||||||
|
|
||||||
return err(ENODEV);
|
return err(ENODEV);
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<void> register_special_device(u32 major, u32 minor, device_create_func_t initializer)
|
Result<void> register_special_device(u32 major, u32 minor, SharedPtr<Device> device)
|
||||||
{
|
{
|
||||||
for (const auto& descriptor : g_available_devices)
|
for (const auto& descriptor : g_available_devices)
|
||||||
{
|
{
|
||||||
@ -36,17 +36,15 @@ namespace DeviceRegistry
|
|||||||
|
|
||||||
kdbgln("DeviceRegistry: registered new device type %u:%u", major, minor);
|
kdbgln("DeviceRegistry: registered new device type %u:%u", major, minor);
|
||||||
|
|
||||||
return g_available_devices.try_append(
|
return g_available_devices.try_append(DeviceDescriptor { .device = device, .major = major, .minor = minor });
|
||||||
DeviceDescriptor { .initializer = initializer, .major = major, .minor = minor });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<void> init()
|
Result<void> init()
|
||||||
{
|
{
|
||||||
// Hardcode default devices.
|
NullDevice::create();
|
||||||
TRY(register_special_device(DeviceMajorTypes::Memory, 0, NullDevice::create));
|
ZeroDevice::create();
|
||||||
TRY(register_special_device(DeviceMajorTypes::Memory, 1, ZeroDevice::create));
|
ConsoleDevice::create();
|
||||||
TRY(register_special_device(DeviceMajorTypes::Console, 0, ConsoleDevice::create));
|
FramebufferDevice::create();
|
||||||
TRY(register_special_device(DeviceMajorTypes::Framebuffer, 0, FramebufferDevice::create));
|
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -3,8 +3,6 @@
|
|||||||
#include "fs/devices/Device.h"
|
#include "fs/devices/Device.h"
|
||||||
#include <luna/SharedPtr.h>
|
#include <luna/SharedPtr.h>
|
||||||
|
|
||||||
typedef Result<SharedPtr<Device>> (*device_create_func_t)(void);
|
|
||||||
|
|
||||||
namespace DeviceRegistry
|
namespace DeviceRegistry
|
||||||
{
|
{
|
||||||
enum DeviceMajorTypes : u32
|
enum DeviceMajorTypes : u32
|
||||||
@ -15,9 +13,9 @@ namespace DeviceRegistry
|
|||||||
Framebuffer = 3,
|
Framebuffer = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
Result<SharedPtr<Device>> create_special_device(u32 major, u32 minor);
|
Result<SharedPtr<Device>> fetch_special_device(u32 major, u32 minor);
|
||||||
|
|
||||||
Result<void> register_special_device(u32 major, u32 minor, device_create_func_t initializer);
|
Result<void> register_special_device(u32 major, u32 minor, SharedPtr<Device> device);
|
||||||
|
|
||||||
Result<void> init();
|
Result<void> init();
|
||||||
}
|
}
|
||||||
|
@ -3,9 +3,10 @@
|
|||||||
#include <bits/ioctl-defs.h>
|
#include <bits/ioctl-defs.h>
|
||||||
#include <luna/CString.h>
|
#include <luna/CString.h>
|
||||||
|
|
||||||
Result<SharedPtr<Device>> FramebufferDevice::create()
|
Result<void> FramebufferDevice::create()
|
||||||
{
|
{
|
||||||
return (SharedPtr<Device>)TRY(make_shared<FramebufferDevice>());
|
auto device = (SharedPtr<Device>)TRY(make_shared<FramebufferDevice>());
|
||||||
|
return DeviceRegistry::register_special_device(DeviceRegistry::Framebuffer, 0, device);
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<usize> FramebufferDevice::read(u8*, usize, usize) const
|
Result<usize> FramebufferDevice::read(u8*, usize, usize) const
|
||||||
|
@ -5,7 +5,7 @@ class FramebufferDevice : public Device
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
// Initializer for DeviceRegistry.
|
// Initializer for DeviceRegistry.
|
||||||
static Result<SharedPtr<Device>> create();
|
static Result<void> create();
|
||||||
|
|
||||||
Result<usize> read(u8*, usize, usize) const override;
|
Result<usize> read(u8*, usize, usize) const override;
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include "fs/devices/NullDevice.h"
|
#include "fs/devices/NullDevice.h"
|
||||||
|
|
||||||
Result<SharedPtr<Device>> NullDevice::create()
|
Result<void> NullDevice::create()
|
||||||
{
|
{
|
||||||
return (SharedPtr<Device>)TRY(make_shared<NullDevice>());
|
auto device = (SharedPtr<Device>)TRY(make_shared<NullDevice>());
|
||||||
|
return DeviceRegistry::register_special_device(DeviceRegistry::Memory, 0, device);
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@ class NullDevice : public Device
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
// Initializer for DeviceRegistry.
|
// Initializer for DeviceRegistry.
|
||||||
static Result<SharedPtr<Device>> create();
|
static Result<void> create();
|
||||||
|
|
||||||
Result<usize> read(u8*, usize, usize) const override
|
Result<usize> read(u8*, usize, usize) const override
|
||||||
{
|
{
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include "fs/devices/ZeroDevice.h"
|
#include "fs/devices/ZeroDevice.h"
|
||||||
|
|
||||||
Result<SharedPtr<Device>> ZeroDevice::create()
|
Result<void> ZeroDevice::create()
|
||||||
{
|
{
|
||||||
return (SharedPtr<Device>)TRY(make_shared<ZeroDevice>());
|
auto device = (SharedPtr<Device>)TRY(make_shared<ZeroDevice>());
|
||||||
|
return DeviceRegistry::register_special_device(DeviceRegistry::Memory, 1, device);
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@ class ZeroDevice : public Device
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
// Initializer for DeviceRegistry.
|
// Initializer for DeviceRegistry.
|
||||||
static Result<SharedPtr<Device>> create();
|
static Result<void> create();
|
||||||
|
|
||||||
Result<usize> read(u8* buf, usize, usize length) const override
|
Result<usize> read(u8* buf, usize, usize length) const override
|
||||||
{
|
{
|
||||||
|
@ -39,7 +39,7 @@ namespace TmpFS
|
|||||||
|
|
||||||
Result<SharedPtr<VFS::Inode>> FileSystem::create_device_inode(u32 major, u32 minor)
|
Result<SharedPtr<VFS::Inode>> FileSystem::create_device_inode(u32 major, u32 minor)
|
||||||
{
|
{
|
||||||
SharedPtr<Device> device = TRY(DeviceRegistry::create_special_device(major, minor));
|
SharedPtr<Device> device = TRY(DeviceRegistry::fetch_special_device(major, minor));
|
||||||
|
|
||||||
SharedPtr<DeviceInode> inode = TRY(make_shared<DeviceInode>());
|
SharedPtr<DeviceInode> inode = TRY(make_shared<DeviceInode>());
|
||||||
inode->set_fs(*this, {});
|
inode->set_fs(*this, {});
|
||||||
|
Loading…
Reference in New Issue
Block a user