Kernel: StorageDevices and Controllers are now devices
This commit is contained in:
@@ -34,13 +34,17 @@ namespace Kernel
|
||||
IFREG = 0x8000,
|
||||
IFLNK = 0xA000,
|
||||
IFSOCK = 0xC000,
|
||||
TYPE_MASK = 0xF000,
|
||||
};
|
||||
|
||||
public:
|
||||
virtual ~Inode() {}
|
||||
|
||||
bool ifdir() const { return mode() & Mode::IFDIR; }
|
||||
bool ifreg() const { return mode() & Mode::IFREG; }
|
||||
bool ifdir() const { return (mode() & Mode::TYPE_MASK) == Mode::IFDIR; }
|
||||
bool ifblk() const { return (mode() & Mode::TYPE_MASK) == Mode::IFBLK; }
|
||||
bool ifreg() const { return (mode() & Mode::TYPE_MASK) == Mode::IFREG; }
|
||||
bool iflnk() const { return (mode() & Mode::TYPE_MASK) == Mode::IFLNK; }
|
||||
bool ifsock() const { return (mode() & Mode::TYPE_MASK) == Mode::IFSOCK; }
|
||||
|
||||
bool operator==(const Inode& other) const { return dev() == other.dev() && rdev() == other.rdev() && ino() == other.ino(); }
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ namespace Kernel
|
||||
static VirtualFileSystem& get();
|
||||
virtual ~VirtualFileSystem() {};
|
||||
|
||||
virtual BAN::RefPtr<Inode> root_inode() override { return m_root_inode; }
|
||||
virtual BAN::RefPtr<Inode> root_inode() override { return m_root_fs->root_inode(); }
|
||||
|
||||
BAN::ErrorOr<void> mount(FileSystem*, BAN::StringView);
|
||||
|
||||
@@ -36,10 +36,9 @@ namespace Kernel
|
||||
|
||||
private:
|
||||
VirtualFileSystem() = default;
|
||||
BAN::ErrorOr<void> initialize_impl();
|
||||
|
||||
private:
|
||||
BAN::RefPtr<Inode> m_root_inode;
|
||||
FileSystem* m_root_fs = nullptr;
|
||||
BAN::Vector<MountPoint> m_mount_points;
|
||||
BAN::Vector<StorageController*> m_storage_controllers;
|
||||
};
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include <BAN/Errors.h>
|
||||
#include <kernel/PCI.h>
|
||||
#include <kernel/Storage/StorageController.h>
|
||||
|
||||
namespace Kernel
|
||||
@@ -38,6 +38,24 @@ namespace Kernel
|
||||
ATAController* controller;
|
||||
|
||||
friend class ATAController;
|
||||
|
||||
char device_name[4] {};
|
||||
|
||||
public:
|
||||
virtual ino_t ino() const override { return !!slave_bit; }
|
||||
virtual mode_t mode() const override { return Mode::IFBLK; }
|
||||
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 sector_size(); }
|
||||
virtual blkcnt_t blocks() const override { return 0; }
|
||||
virtual dev_t dev() const override;
|
||||
virtual dev_t rdev() const override { return 0x5429; }
|
||||
|
||||
virtual BAN::StringView name() const override { return BAN::StringView(device_name, sizeof(device_name) - 1); }
|
||||
|
||||
virtual BAN::ErrorOr<size_t> read(size_t, void*, size_t) override;
|
||||
};
|
||||
|
||||
struct ATABus
|
||||
@@ -54,7 +72,7 @@ namespace Kernel
|
||||
BAN::Error error();
|
||||
};
|
||||
|
||||
class ATAController : public StorageController
|
||||
class ATAController final : public StorageController
|
||||
{
|
||||
public:
|
||||
static BAN::ErrorOr<ATAController*> create(const PCIDevice&);
|
||||
@@ -71,6 +89,22 @@ namespace Kernel
|
||||
const PCIDevice& m_pci_device;
|
||||
|
||||
friend class ATADevice;
|
||||
|
||||
public:
|
||||
virtual ino_t ino() const override { return 0; }
|
||||
virtual mode_t 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 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); }
|
||||
};
|
||||
|
||||
}
|
||||
@@ -1,18 +1,24 @@
|
||||
#pragma once
|
||||
|
||||
#include <kernel/PCI.h>
|
||||
#include <kernel/Storage/StorageDevice.h>
|
||||
|
||||
namespace Kernel
|
||||
{
|
||||
|
||||
class StorageController
|
||||
class StorageController : public CharacterDevice
|
||||
{
|
||||
public:
|
||||
BAN::Vector<StorageDevice*>& devices() { return m_devices; }
|
||||
const BAN::Vector<StorageDevice*>& devices() const { return m_devices; }
|
||||
|
||||
protected:
|
||||
void add_device(StorageDevice* device)
|
||||
{
|
||||
ASSERT(device);
|
||||
MUST(m_devices.push_back(device));
|
||||
}
|
||||
|
||||
private:
|
||||
BAN::Vector<StorageDevice*> m_devices;
|
||||
};
|
||||
|
||||
|
||||
@@ -16,10 +16,10 @@ namespace Kernel
|
||||
|
||||
class StorageDevice;
|
||||
|
||||
class Partition
|
||||
class Partition final : public BlockDevice
|
||||
{
|
||||
public:
|
||||
Partition(StorageDevice&, const GUID&, const GUID&, uint64_t, uint64_t, uint64_t, const char*);
|
||||
Partition(StorageDevice&, const GUID&, const GUID&, uint64_t, uint64_t, uint64_t, const char*, uint32_t);
|
||||
|
||||
const GUID& partition_type() const { return m_type; }
|
||||
const GUID& partition_guid() const { return m_guid; }
|
||||
@@ -31,7 +31,6 @@ namespace Kernel
|
||||
|
||||
BAN::ErrorOr<void> read_sectors(uint64_t lba, uint8_t sector_count, uint8_t* buffer);
|
||||
BAN::ErrorOr<void> write_sectors(uint64_t lba, uint8_t sector_count, const uint8_t* buffer);
|
||||
bool is_used() const { uint8_t zero[16] {}; return memcmp(&m_type, zero, 16); }
|
||||
|
||||
private:
|
||||
StorageDevice& m_device;
|
||||
@@ -41,9 +40,29 @@ namespace Kernel
|
||||
const uint64_t m_lba_end;
|
||||
const uint64_t m_attributes;
|
||||
char m_label[36 * 4 + 1];
|
||||
|
||||
public:
|
||||
virtual ino_t ino() const override { return m_index; }
|
||||
virtual mode_t 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 BAN::StringView name() const override { return m_device_name; }
|
||||
|
||||
virtual BAN::ErrorOr<size_t> read(size_t, void*, size_t) override;
|
||||
|
||||
private:
|
||||
const uint32_t m_index;
|
||||
BAN::String m_device_name;
|
||||
};
|
||||
|
||||
class StorageDevice
|
||||
class StorageDevice : public BlockDevice
|
||||
{
|
||||
public:
|
||||
virtual ~StorageDevice() {}
|
||||
@@ -55,10 +74,11 @@ namespace Kernel
|
||||
virtual uint32_t sector_size() const = 0;
|
||||
virtual uint64_t total_size() const = 0;
|
||||
|
||||
BAN::Vector<Partition>& partitions() { return m_partitions; }
|
||||
BAN::Vector<Partition*>& partitions() { return m_partitions; }
|
||||
const BAN::Vector<Partition*>& partitions() const { return m_partitions; }
|
||||
|
||||
private:
|
||||
BAN::Vector<Partition> m_partitions;
|
||||
BAN::Vector<Partition*> m_partitions;
|
||||
};
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user