Kernel: Device dev and rdev number is done more properly
Also hd* partitions are now 1 indexed instead of 0
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include <kernel/FS/Inode.h>
|
||||
#include <kernel/DeviceManager.h>
|
||||
|
||||
namespace Kernel
|
||||
{
|
||||
@@ -23,12 +23,28 @@ namespace Kernel
|
||||
|
||||
virtual InodeType inode_type() const override { return InodeType::Device; }
|
||||
|
||||
virtual ino_t ino() const override { return m_ino_t; }
|
||||
virtual nlink_t nlink() const override { return 1; }
|
||||
virtual off_t size() const override { return 0; }
|
||||
virtual timespec atime() const override { return m_create_time; }
|
||||
virtual timespec mtime() const override { return m_create_time; }
|
||||
virtual timespec ctime() const override { return m_create_time; }
|
||||
virtual blksize_t blksize() const override { return DeviceManager::get().blksize(); }
|
||||
virtual blkcnt_t blocks() const override { return DeviceManager::get().blocks(); }
|
||||
virtual dev_t dev() const override { return DeviceManager::get().dev(); }
|
||||
|
||||
/*
|
||||
a device has to overload
|
||||
virtual Mode mode() const;
|
||||
virtual uid_t uid() const;
|
||||
virtual gid_t gid() const;
|
||||
virutal dev_t rdev() const;
|
||||
virtual BAN::StringView name() const;
|
||||
*/
|
||||
|
||||
private:
|
||||
timespec m_create_time;
|
||||
const timespec m_create_time;
|
||||
const ino_t m_ino_t;
|
||||
};
|
||||
|
||||
class BlockDevice : public Device
|
||||
|
||||
@@ -2,12 +2,15 @@
|
||||
|
||||
#include <BAN/StringView.h>
|
||||
#include <kernel/FS/FileSystem.h>
|
||||
#include <kernel/Device.h>
|
||||
#include <kernel/SpinLock.h>
|
||||
|
||||
#include <sys/sysmacros.h>
|
||||
|
||||
namespace Kernel
|
||||
{
|
||||
|
||||
class Device;
|
||||
|
||||
class DeviceManager final : public FileSystem, public Inode
|
||||
{
|
||||
BAN_NON_COPYABLE(DeviceManager);
|
||||
@@ -17,6 +20,10 @@ namespace Kernel
|
||||
static void initialize();
|
||||
static DeviceManager& get();
|
||||
|
||||
ino_t get_next_ino() const;
|
||||
dev_t get_next_rdev() const;
|
||||
uint8_t get_next_input_dev() const;
|
||||
|
||||
void update();
|
||||
void add_device(Device*);
|
||||
|
||||
@@ -48,13 +55,18 @@ namespace Kernel
|
||||
virtual timespec atime() const override { return { 0, 0 }; }
|
||||
virtual timespec mtime() const override { return { 0, 0 }; }
|
||||
virtual timespec ctime() const override { return { 0, 0 }; }
|
||||
virtual blksize_t blksize() const override { return 0; }
|
||||
virtual blksize_t blksize() const override { ASSERT(m_blksize); return m_blksize; }
|
||||
virtual blkcnt_t blocks() const override { return 0; }
|
||||
virtual dev_t dev() const override { return 0x4900; }
|
||||
virtual dev_t rdev() const override { return 0x7854; }
|
||||
virtual dev_t dev() const override { return makedev(0, 5); }
|
||||
virtual dev_t rdev() const override { return 0; }
|
||||
|
||||
virtual BAN::ErrorOr<size_t> read(size_t, void*, size_t) { ASSERT_NOT_REACHED(); }
|
||||
virtual BAN::ErrorOr<void> create_file(BAN::StringView, mode_t) { ASSERT_NOT_REACHED(); }
|
||||
virtual BAN::ErrorOr<size_t> read(size_t, void*, size_t) { return BAN::Error::from_errno(EISDIR); }
|
||||
virtual BAN::ErrorOr<void> create_file(BAN::StringView, mode_t) { return BAN::Error::from_errno(ENOTSUP); }
|
||||
|
||||
void set_blksize(blksize_t blksize) { m_blksize = blksize; }
|
||||
|
||||
private:
|
||||
blksize_t m_blksize = 0;
|
||||
};
|
||||
|
||||
}
|
||||
@@ -8,23 +8,13 @@ namespace Kernel::Input
|
||||
class PS2Device : public CharacterDevice
|
||||
{
|
||||
public:
|
||||
PS2Device(dev_t);
|
||||
virtual ~PS2Device() {}
|
||||
virtual void on_byte(uint8_t) = 0;
|
||||
|
||||
public:
|
||||
virtual ino_t ino() const override { return m_ino; }
|
||||
virtual Mode mode() const override { return { Mode::IFCHR | Mode::IRUSR | Mode::IRGRP }; }
|
||||
virtual nlink_t nlink() const override { return 1; }
|
||||
virtual uid_t uid() const override { return 0; }
|
||||
virtual gid_t gid() const override { return 0; }
|
||||
virtual off_t size() const override { return 0; }
|
||||
virtual blkcnt_t blocks() const override { return 0; }
|
||||
virtual dev_t dev() const override { return m_dev; }
|
||||
|
||||
private:
|
||||
ino_t m_ino;
|
||||
dev_t m_dev;
|
||||
};
|
||||
|
||||
class PS2Controller
|
||||
|
||||
@@ -27,17 +27,13 @@ namespace Kernel::Input
|
||||
};
|
||||
|
||||
public:
|
||||
static BAN::ErrorOr<PS2Keyboard*> create(PS2Controller&, dev_t);
|
||||
static BAN::ErrorOr<PS2Keyboard*> create(PS2Controller&);
|
||||
|
||||
virtual void on_byte(uint8_t) override;
|
||||
virtual void update() override;
|
||||
|
||||
private:
|
||||
PS2Keyboard(PS2Controller& controller, dev_t device)
|
||||
: PS2Device(device)
|
||||
, m_controller(controller)
|
||||
, m_name(BAN::String::formatted("input{}", device))
|
||||
{}
|
||||
PS2Keyboard(PS2Controller& controller);
|
||||
BAN::ErrorOr<void> initialize();
|
||||
|
||||
void append_command_queue(uint8_t);
|
||||
@@ -63,13 +59,15 @@ namespace Kernel::Input
|
||||
|
||||
Semaphore m_semaphore;
|
||||
|
||||
BAN::String m_name;
|
||||
|
||||
public:
|
||||
virtual BAN::StringView name() const override { return m_name; }
|
||||
virtual blksize_t blksize() const override { return sizeof(KeyEvent); }
|
||||
virtual dev_t rdev() const override { return 0x8594; }
|
||||
virtual dev_t rdev() const override { return m_rdev; }
|
||||
|
||||
virtual BAN::ErrorOr<size_t> read(size_t, void*, size_t) override;
|
||||
|
||||
private:
|
||||
const BAN::String m_name;
|
||||
const dev_t m_rdev;
|
||||
};
|
||||
|
||||
}
|
||||
@@ -20,7 +20,9 @@ namespace Kernel
|
||||
uint8_t next_device_index() const;
|
||||
|
||||
private:
|
||||
ATAController() = default;
|
||||
ATAController()
|
||||
: m_rdev(makedev(DeviceManager::get().get_next_rdev(), 0))
|
||||
{ }
|
||||
BAN::ErrorOr<void> initialize(const PCIDevice& device);
|
||||
|
||||
private:
|
||||
@@ -28,20 +30,17 @@ namespace Kernel
|
||||
friend class ATABus;
|
||||
|
||||
public:
|
||||
virtual ino_t ino() const override { return 0; }
|
||||
virtual Mode mode() const override { return { Mode::IFCHR }; }
|
||||
virtual nlink_t nlink() const override { return 1; }
|
||||
virtual uid_t uid() const override { return 0; }
|
||||
virtual gid_t gid() const override { return 0; }
|
||||
virtual off_t size() const override { return 0; }
|
||||
virtual blksize_t blksize() const override { return 0; }
|
||||
virtual blkcnt_t blocks() const override { return 0; }
|
||||
virtual dev_t dev() const override { return DeviceManager::get().dev(); }
|
||||
virtual dev_t rdev() const override { return 0x8594; }
|
||||
virtual dev_t rdev() const override { return m_rdev; }
|
||||
|
||||
virtual BAN::StringView name() const override { return "hd"sv; }
|
||||
|
||||
virtual BAN::ErrorOr<size_t> read(size_t, void*, size_t) { return BAN::Error::from_errno(ENOTSUP); }
|
||||
|
||||
private:
|
||||
const dev_t m_rdev;
|
||||
};
|
||||
|
||||
}
|
||||
@@ -9,7 +9,10 @@ namespace Kernel
|
||||
class ATADevice final : public StorageDevice
|
||||
{
|
||||
public:
|
||||
ATADevice(ATABus* bus) : m_bus(bus) { }
|
||||
ATADevice(ATABus* bus)
|
||||
: m_bus(bus)
|
||||
, m_rdev(makedev(DeviceManager::get().get_next_rdev(), 0))
|
||||
{ }
|
||||
BAN::ErrorOr<void> initialize(ATABus::DeviceType, const uint16_t*);
|
||||
|
||||
virtual BAN::ErrorOr<void> read_sectors(uint64_t, uint8_t, uint8_t*) override;
|
||||
@@ -34,22 +37,17 @@ namespace Kernel
|
||||
friend class ATABus;
|
||||
|
||||
public:
|
||||
virtual ino_t ino() const override { return m_index; }
|
||||
virtual Mode mode() const override { return { Mode::IFBLK }; }
|
||||
virtual nlink_t nlink() const override { return 1; }
|
||||
virtual Mode mode() const override { return { Mode::IFBLK | Mode::IRUSR | Mode::IRGRP }; }
|
||||
virtual uid_t uid() const override { return 0; }
|
||||
virtual gid_t gid() const override { return 0; }
|
||||
virtual off_t size() const override { return 0; }
|
||||
virtual blksize_t blksize() const override { return sector_size(); }
|
||||
virtual blkcnt_t blocks() const override { return 0; }
|
||||
virtual dev_t dev() const override { return m_bus->controller()->dev(); }
|
||||
virtual dev_t rdev() const override { return 0x5429; }
|
||||
virtual dev_t rdev() const override { return m_rdev; }
|
||||
|
||||
virtual BAN::StringView name() const override { return BAN::StringView(m_device_name, sizeof(m_device_name) - 1); }
|
||||
|
||||
virtual BAN::ErrorOr<size_t> read(size_t, void*, size_t) override;
|
||||
|
||||
public:
|
||||
const dev_t m_rdev;
|
||||
char m_device_name[4] {};
|
||||
};
|
||||
|
||||
|
||||
@@ -44,16 +44,10 @@ namespace Kernel
|
||||
public:
|
||||
virtual DeviceType device_type() const override { return DeviceType::Partition; }
|
||||
|
||||
virtual ino_t ino() const override { return m_index; }
|
||||
virtual Mode mode() const override { return { Mode::IFBLK | Mode::IRUSR | Mode::IRGRP }; }
|
||||
virtual nlink_t nlink() const override { return 1; }
|
||||
virtual uid_t uid() const override { return 0; }
|
||||
virtual gid_t gid() const override { return 0; }
|
||||
virtual off_t size() const override { return 0; }
|
||||
virtual blksize_t blksize() const;
|
||||
virtual blkcnt_t blocks() const override { return 0; }
|
||||
virtual dev_t dev() const override;
|
||||
virtual dev_t rdev() const { return 0x7459; }
|
||||
virtual dev_t rdev() const override;
|
||||
|
||||
virtual BAN::StringView name() const override { return m_device_name; }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user