ladybird/Kernel/Devices/MBRPartitionTable.cpp
Conrad Pankoff 842bf96e2c Kernel: Fix booting from "inactive" MBR partitions
Apparently you can boot from any MBR partition, not just the one labeled
as "bootable" or "active". The only ones you don't want to boot from are
the ones that don't exist.
2019-06-08 17:59:17 +02:00

70 lines
1.7 KiB
C++

#include <AK/ByteBuffer.h>
#include <Kernel/Devices/MBRPartitionTable.h>
#define MBR_DEBUG
MBRPartitionTable::MBRPartitionTable(Retained<DiskDevice>&& device)
: m_device(move(device))
{
}
MBRPartitionTable::~MBRPartitionTable()
{
}
const MBRPartitionHeader& MBRPartitionTable::header() const
{
return *reinterpret_cast<const MBRPartitionHeader*>(m_cached_header);
}
bool MBRPartitionTable::initialize()
{
if (!m_device->read_block(0, m_cached_header)) {
return false;
}
auto& header = this->header();
#ifdef MBR_DEBUG
kprintf("MBRPartitionTable::initialize: mbr_signature=%#x\n", header.mbr_signature);
#endif
if (header.mbr_signature != MBR_SIGNATURE) {
kprintf("MBRPartitionTable::initialize: bad mbr signature %#x\n", header.mbr_signature);
return false;
}
return true;
}
RetainPtr<DiskPartition> MBRPartitionTable::partition(unsigned index)
{
ASSERT(index >= 1 && index <= 4);
auto& header = this->header();
auto& entry = header.entry[index - 1];
if (header.mbr_signature != MBR_SIGNATURE) {
kprintf("MBRPartitionTable::initialize: bad mbr signature - not initalized? %#x\n", header.mbr_signature);
return nullptr;
}
#ifdef MBR_DEBUG
kprintf("MBRPartitionTable::partition: status=%#x offset=%#x\n", entry.status, entry.offset);
#endif
if (entry.offset == 0x00) {
#ifdef MBR_DEBUG
kprintf("MBRPartitionTable::partition: missing partition requested index=%d\n", index);
#endif
return nullptr;
}
#ifdef MBR_DEBUG
kprintf("MBRPartitionTable::partition: found partition index=%d type=%x\n", index, entry.type);
#endif
return DiskPartition::create(m_device.copy_ref(), entry.offset);
}