Kernel: Start working on filesystem

We have a basic PATA driver (for reading) and gpt parser.
This commit is contained in:
Bananymous
2023-02-16 20:00:31 +02:00
parent 94cbacc998
commit 460fc3a29f
6 changed files with 613 additions and 3 deletions

View File

@@ -0,0 +1,58 @@
#pragma once
#include <BAN/Vector.h>
#include <kernel/DiskIO.h>
namespace Kernel
{
class ATADevice : public DiskDevice
{
public:
static ATADevice* create(uint16_t io_base, uint16_t ctl_base, uint8_t slave_bit);
virtual ~ATADevice() {}
uint16_t io_base() const { return m_io_base; }
uint16_t ctl_base() const { return m_ctl_base; }
uint8_t slave_bit() const { return m_slave_bit; }
virtual const char* type() const = 0;
protected:
ATADevice(uint16_t io_base, uint16_t ctl_base, uint8_t slave_bit)
: m_io_base(io_base)
, m_ctl_base(ctl_base)
, m_slave_bit(slave_bit)
{}
private:
const uint16_t m_io_base;
const uint16_t m_ctl_base;
const uint8_t m_slave_bit;
};
class PATADevice final : public ATADevice
{
public:
PATADevice(uint16_t io_base, uint16_t ctl_base, uint8_t slave_bit)
: ATADevice(io_base, ctl_base, slave_bit)
{}
virtual const char* type() const override { return "PATA"; }
virtual bool read(uint32_t lba, uint32_t sector_count, uint8_t* buffer) override;
protected:
virtual bool initialize() override;
private:
bool read_lba28(uint32_t lba, uint8_t sector_count, uint8_t* buffer);
bool wait_while_buzy();
bool wait_for_transfer();
void flush();
private:
bool m_lba_48 = false;
};
}

View File

@@ -0,0 +1,46 @@
#pragma once
#include <BAN/Vector.h>
namespace Kernel
{
class DiskDevice
{
public:
struct Partition
{
uint8_t type_guid[16];
uint8_t guid[16];
uint64_t start_lba;
uint64_t end_lba;
uint64_t attributes;
char name[72];
};
public:
virtual ~DiskDevice() {}
virtual bool initialize() = 0;
bool initialize_partitions();
virtual bool read(uint32_t lba, uint32_t sector_count, uint8_t* buffer) = 0;
private:
BAN::Vector<Partition> m_partitions;
};
class DiskIO
{
public:
static bool initialize();
static DiskIO& get();
private:
DiskIO();
private:
BAN::Vector<DiskDevice*> m_devices;
};
}