1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-06-19 23:32:07 +00:00
serenity/Kernel/Devices/OffsetDiskDevice.cpp
Conrad Pankoff 6f43f81fb4 Kernel: Implement OffsetDiskDevice to prepare for partition support
This implements a passthrough disk driver that translates the read/write
block addresses by a fixed offset. This could form the basis of MBR
partition support if we were to parse the MBR table at boot and create that
OffsetDiskDevice dynamically, rather than seeking to a fixed offset.

This also introduces a dependency in the form of grub. You'll need to have
32-bit grub binaries installed to build the project now.

As a bonus, divorcing Serenity from qemu's kernel loading means we can now
*technically* boot on real hardware. It just... doesn't get very far yet.
If you write the `_disk_image` file to an IDE hard drive and boot it in a
machine that supports all the basic PC hardware, it *will* start loading
the kernel.
2019-06-02 12:37:29 +02:00

63 lines
1.6 KiB
C++

#include <Kernel/Devices/OffsetDiskDevice.h>
// #define OFFD_DEBUG
Retained<OffsetDiskDevice> OffsetDiskDevice::create(Retained<DiskDevice>&& device, unsigned offset)
{
return adopt(*new OffsetDiskDevice(move(device), offset));
}
OffsetDiskDevice::OffsetDiskDevice(Retained<DiskDevice>&& device, unsigned offset)
: m_device(move(device)), m_offset(offset)
{
}
OffsetDiskDevice::~OffsetDiskDevice()
{
}
unsigned OffsetDiskDevice::block_size() const
{
return m_device->block_size();
}
bool OffsetDiskDevice::read_block(unsigned index, byte* out) const
{
#ifdef OFFD_DEBUG
kprintf("OffsetDiskDevice::read_block %u (really: %u)\n", index, m_offset + index);
#endif
return m_device->read_block(m_offset + index, out);
}
bool OffsetDiskDevice::write_block(unsigned index, const byte* data)
{
#ifdef OFFD_DEBUG
kprintf("OffsetDiskDevice::write_block %u (really: %u)\n", index, m_offset + index);
#endif
return m_device->write_block(m_offset + index, data);
}
bool OffsetDiskDevice::read_blocks(unsigned index, word count, byte* out)
{
#ifdef OFFD_DEBUG
kprintf("OffsetDiskDevice::read_blocks %u (really: %u) count=%u\n", index, m_offset + index, count);
#endif
return m_device->read_blocks(m_offset + index, count, out);
}
bool OffsetDiskDevice::write_blocks(unsigned index, word count, const byte* data)
{
#ifdef OFFD_DEBUG
kprintf("OffsetDiskDevice::write_blocks %u (really: %u) count=%u\n", index, m_offset + index, count);
#endif
return m_device->write_blocks(m_offset + index, count, data);
}
const char* OffsetDiskDevice::class_name() const
{
return "OffsetDiskDevice";
}