mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 19:38:12 +00:00
Kernel: Implement MBR partition loader (#168)
This implements a basic MBR partition loader, which removes the reliance on a hard-coded filesystem offset in the stage2 init.
This commit is contained in:
parent
466a817950
commit
c02b8b715d
4 changed files with 133 additions and 9 deletions
47
Kernel/Devices/MBRPartitionTable.h
Normal file
47
Kernel/Devices/MBRPartitionTable.h
Normal file
|
@ -0,0 +1,47 @@
|
|||
#pragma once
|
||||
|
||||
#include <AK/RetainPtr.h>
|
||||
#include <AK/Vector.h>
|
||||
#include <Kernel/Devices/DiskDevice.h>
|
||||
#include <Kernel/Devices/DiskPartition.h>
|
||||
|
||||
#define MBR_SIGNATURE 0xaa55
|
||||
|
||||
struct MBRPartitionEntry {
|
||||
byte status;
|
||||
byte chs1[3];
|
||||
byte type;
|
||||
byte chs2[3];
|
||||
dword offset;
|
||||
dword length;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct MBRPartitionHeader {
|
||||
byte code1[218];
|
||||
word ts_zero;
|
||||
byte ts_drive, ts_seconds, ts_minutes, ts_hours;
|
||||
byte code2[216];
|
||||
dword disk_signature;
|
||||
word disk_signature_zero;
|
||||
MBRPartitionEntry entry[4];
|
||||
word mbr_signature;
|
||||
} __attribute__((packed));
|
||||
|
||||
class MBRPartitionTable {
|
||||
AK_MAKE_ETERNAL
|
||||
|
||||
public:
|
||||
MBRPartitionTable(Retained<DiskDevice>&& device);
|
||||
~MBRPartitionTable();
|
||||
|
||||
bool initialize();
|
||||
RetainPtr<DiskPartition> partition(unsigned index);
|
||||
|
||||
private:
|
||||
Retained<DiskDevice> m_device;
|
||||
|
||||
ByteBuffer read_header() const;
|
||||
const MBRPartitionHeader& header() const;
|
||||
|
||||
byte m_cached_header[512];
|
||||
};
|
Loading…
Add table
Add a link
Reference in a new issue