diff options
author | Conrad Pankoff <deoxxa@fknsrs.biz> | 2019-06-02 22:57:44 +1000 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-06-02 14:57:44 +0200 |
commit | c02b8b715da8e1a6604b8b58c5c66cf44f823f77 (patch) | |
tree | 842727cb55fad1c9dd3e2fa3d1cb7df9e1356215 /Kernel/Devices/MBRPartitionTable.h | |
parent | 466a8179506647d33ee4511c6945f111d31d9500 (diff) | |
download | serenity-c02b8b715da8e1a6604b8b58c5c66cf44f823f77.zip |
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.
Diffstat (limited to 'Kernel/Devices/MBRPartitionTable.h')
-rw-r--r-- | Kernel/Devices/MBRPartitionTable.h | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/Kernel/Devices/MBRPartitionTable.h b/Kernel/Devices/MBRPartitionTable.h new file mode 100644 index 0000000000..a3ad937b2c --- /dev/null +++ b/Kernel/Devices/MBRPartitionTable.h @@ -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]; +}; |