mirror of
https://github.com/RGBCube/serenity
synced 2025-06-19 23:32:07 +00:00

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.
63 lines
1.6 KiB
C++
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";
|
|
}
|