2023-02-16 20:00:31 +02:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <BAN/Vector.h>
|
2023-07-19 23:50:57 +03:00
|
|
|
#include <kernel/Device/Device.h>
|
2023-06-03 02:23:14 +03:00
|
|
|
#include <kernel/Storage/DiskCache.h>
|
2023-02-16 20:00:31 +02:00
|
|
|
|
|
|
|
namespace Kernel
|
|
|
|
{
|
|
|
|
|
2023-02-20 01:46:00 +02:00
|
|
|
struct GUID
|
|
|
|
{
|
|
|
|
uint32_t data1;
|
|
|
|
uint16_t data2;
|
|
|
|
uint16_t data3;
|
|
|
|
uint8_t data4[8];
|
|
|
|
};
|
|
|
|
|
2023-03-29 13:23:01 +03:00
|
|
|
class StorageDevice;
|
|
|
|
|
2023-03-30 14:22:15 +03:00
|
|
|
class Partition final : public BlockDevice
|
2023-02-16 20:00:31 +02:00
|
|
|
{
|
|
|
|
public:
|
2023-10-07 15:46:30 +03:00
|
|
|
static BAN::ErrorOr<BAN::RefPtr<Partition>> create(StorageDevice&, const GUID& type, const GUID& guid, uint64_t start, uint64_t end, uint64_t attr, const char* label, uint32_t index);
|
2023-03-29 13:23:01 +03:00
|
|
|
|
|
|
|
const GUID& partition_type() const { return m_type; }
|
|
|
|
const GUID& partition_guid() const { return m_guid; }
|
|
|
|
uint64_t lba_start() const { return m_lba_start; }
|
|
|
|
uint64_t lba_end() const { return m_lba_end; }
|
|
|
|
uint64_t attributes() const { return m_attributes; }
|
|
|
|
const char* label() const { return m_label; }
|
|
|
|
const StorageDevice& device() const { return m_device; }
|
2023-02-16 20:00:31 +02:00
|
|
|
|
2023-10-20 05:07:44 +03:00
|
|
|
BAN::ErrorOr<void> read_sectors(uint64_t lba, uint8_t sector_count, BAN::ByteSpan);
|
|
|
|
BAN::ErrorOr<void> write_sectors(uint64_t lba, uint8_t sector_count, BAN::ConstByteSpan);
|
2023-10-07 15:46:30 +03:00
|
|
|
|
|
|
|
virtual BAN::StringView name() const override { return m_name; }
|
|
|
|
|
|
|
|
private:
|
|
|
|
Partition(StorageDevice&, const GUID&, const GUID&, uint64_t, uint64_t, uint64_t, const char*, uint32_t);
|
2023-03-29 13:23:01 +03:00
|
|
|
|
|
|
|
private:
|
|
|
|
StorageDevice& m_device;
|
|
|
|
const GUID m_type;
|
|
|
|
const GUID m_guid;
|
|
|
|
const uint64_t m_lba_start;
|
|
|
|
const uint64_t m_lba_end;
|
|
|
|
const uint64_t m_attributes;
|
|
|
|
char m_label[36 * 4 + 1];
|
2023-10-07 15:46:30 +03:00
|
|
|
const BAN::String m_name;
|
2023-03-30 14:22:15 +03:00
|
|
|
|
|
|
|
public:
|
2023-06-03 13:28:15 +03:00
|
|
|
virtual bool is_partition() const override { return true; }
|
2023-03-30 15:06:41 +03:00
|
|
|
|
2023-07-10 23:17:14 +03:00
|
|
|
virtual dev_t rdev() const override { return m_rdev; }
|
2023-03-30 14:22:15 +03:00
|
|
|
|
2023-09-09 22:45:27 +03:00
|
|
|
protected:
|
2023-10-20 05:07:44 +03:00
|
|
|
virtual BAN::ErrorOr<size_t> read_impl(off_t, BAN::ByteSpan) override;
|
2023-09-09 22:52:03 +03:00
|
|
|
|
2023-03-30 14:22:15 +03:00
|
|
|
private:
|
2023-07-10 23:17:14 +03:00
|
|
|
const dev_t m_rdev;
|
2023-03-29 13:23:01 +03:00
|
|
|
};
|
|
|
|
|
2023-03-30 14:22:15 +03:00
|
|
|
class StorageDevice : public BlockDevice
|
2023-03-29 13:23:01 +03:00
|
|
|
{
|
2023-02-16 20:00:31 +02:00
|
|
|
public:
|
2023-07-10 23:17:14 +03:00
|
|
|
StorageDevice()
|
|
|
|
: BlockDevice(0660, 0, 0)
|
|
|
|
{ }
|
2023-06-03 02:23:14 +03:00
|
|
|
virtual ~StorageDevice();
|
2023-02-16 20:00:31 +02:00
|
|
|
|
2023-02-26 03:00:29 +02:00
|
|
|
BAN::ErrorOr<void> initialize_partitions();
|
2023-02-16 20:00:31 +02:00
|
|
|
|
2023-10-20 05:07:44 +03:00
|
|
|
BAN::ErrorOr<void> read_sectors(uint64_t lba, uint64_t sector_count, BAN::ByteSpan);
|
|
|
|
BAN::ErrorOr<void> write_sectors(uint64_t lba, uint64_t sector_count, BAN::ConstByteSpan);
|
2023-06-03 02:23:14 +03:00
|
|
|
|
2023-02-16 20:48:41 +02:00
|
|
|
virtual uint32_t sector_size() const = 0;
|
2023-02-26 03:00:29 +02:00
|
|
|
virtual uint64_t total_size() const = 0;
|
2023-02-16 20:00:31 +02:00
|
|
|
|
2023-10-07 15:46:30 +03:00
|
|
|
BAN::Vector<BAN::RefPtr<Partition>>& partitions() { return m_partitions; }
|
|
|
|
const BAN::Vector<BAN::RefPtr<Partition>>& partitions() const { return m_partitions; }
|
2023-07-10 23:17:14 +03:00
|
|
|
|
2023-09-11 01:25:16 +03:00
|
|
|
BAN::ErrorOr<void> sync_disk_cache();
|
2023-09-11 01:26:27 +03:00
|
|
|
virtual bool is_storage_device() const override { return true; }
|
2023-09-11 01:25:16 +03:00
|
|
|
|
2023-06-03 02:23:14 +03:00
|
|
|
protected:
|
2023-10-20 05:07:44 +03:00
|
|
|
virtual BAN::ErrorOr<void> read_sectors_impl(uint64_t lba, uint64_t sector_count, BAN::ByteSpan) = 0;
|
|
|
|
virtual BAN::ErrorOr<void> write_sectors_impl(uint64_t lba, uint64_t sector_count, BAN::ConstByteSpan) = 0;
|
2023-06-03 02:23:14 +03:00
|
|
|
void add_disk_cache();
|
2023-02-20 01:46:00 +02:00
|
|
|
|
2023-02-16 20:00:31 +02:00
|
|
|
private:
|
2023-10-07 15:46:30 +03:00
|
|
|
SpinLock m_lock;
|
|
|
|
BAN::Optional<DiskCache> m_disk_cache;
|
|
|
|
BAN::Vector<BAN::RefPtr<Partition>> m_partitions;
|
2023-06-03 02:23:14 +03:00
|
|
|
|
|
|
|
friend class DiskCache;
|
2023-02-16 20:00:31 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|