summaryrefslogtreecommitdiff
path: root/Kernel
diff options
context:
space:
mode:
authorSamuel Bowman <sam@sambowman.tech>2022-03-01 19:42:06 -0500
committerLinus Groh <mail@linusgroh.de>2022-07-21 20:13:44 +0100
commit1a6ef03e4a360d9497ef0babbb38c7c7cb1df0e0 (patch)
tree006b28bac47763166cc67be3d636bae5ea68879f /Kernel
parent940dde99473ec756cc78dc3ef9cea6fb1d651b6c (diff)
downloadserenity-1a6ef03e4a360d9497ef0babbb38c7c7cb1df0e0.zip
Kernel+LibPartition: Move MBRPartitionTable into LibPartition
Diffstat (limited to 'Kernel')
-rw-r--r--Kernel/CMakeLists.txt2
-rw-r--r--Kernel/Debug.h.in4
-rw-r--r--Kernel/Storage/Partition/EBRPartitionTable.h4
-rw-r--r--Kernel/Storage/Partition/GUIDPartitionTable.h4
-rw-r--r--Kernel/Storage/Partition/MBRPartitionTable.cpp119
-rw-r--r--Kernel/Storage/Partition/MBRPartitionTable.h66
-rw-r--r--Kernel/Storage/StorageManagement.cpp4
7 files changed, 7 insertions, 196 deletions
diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt
index 6c991ba302..49b8420c6c 100644
--- a/Kernel/CMakeLists.txt
+++ b/Kernel/CMakeLists.txt
@@ -106,7 +106,6 @@ set(KERNEL_SOURCES
Storage/Partition/DiskPartition.cpp
Storage/Partition/EBRPartitionTable.cpp
Storage/Partition/GUIDPartitionTable.cpp
- Storage/Partition/MBRPartitionTable.cpp
Storage/NVMe/NVMeController.cpp
Storage/NVMe/NVMeNameSpace.cpp
Storage/NVMe/NVMeInterruptQueue.cpp
@@ -405,6 +404,7 @@ set(CRYPTO_SOURCES
set(PARTITION_SOURCES
../Userland/Libraries/LibPartition/DiskPartitionMetadata.cpp
+ ../Userland/Libraries/LibPartition/MBRPartitionTable.cpp
../Userland/Libraries/LibPartition/PartitionTable.cpp
)
diff --git a/Kernel/Debug.h.in b/Kernel/Debug.h.in
index 0459798636..d5d6d9fc09 100644
--- a/Kernel/Debug.h.in
+++ b/Kernel/Debug.h.in
@@ -203,10 +203,6 @@
#cmakedefine01 MASTERPTY_DEBUG
#endif
-#ifndef MBR_DEBUG
-#cmakedefine01 MBR_DEBUG
-#endif
-
#ifndef MOUSE_DEBUG
#cmakedefine01 MOUSE_DEBUG
#endif
diff --git a/Kernel/Storage/Partition/EBRPartitionTable.h b/Kernel/Storage/Partition/EBRPartitionTable.h
index 6cce94358c..a32c20de87 100644
--- a/Kernel/Storage/Partition/EBRPartitionTable.h
+++ b/Kernel/Storage/Partition/EBRPartitionTable.h
@@ -12,12 +12,12 @@
#include <AK/Result.h>
#include <AK/Vector.h>
#include <Kernel/Storage/Partition/DiskPartition.h>
-#include <Kernel/Storage/Partition/MBRPartitionTable.h>
+#include <LibPartition/MBRPartitionTable.h>
namespace Kernel {
struct EBRPartitionHeader;
-class EBRPartitionTable : public MBRPartitionTable {
+class EBRPartitionTable : public Partition::MBRPartitionTable {
public:
~EBRPartitionTable();
diff --git a/Kernel/Storage/Partition/GUIDPartitionTable.h b/Kernel/Storage/Partition/GUIDPartitionTable.h
index 1d2eeb0149..163e75fb61 100644
--- a/Kernel/Storage/Partition/GUIDPartitionTable.h
+++ b/Kernel/Storage/Partition/GUIDPartitionTable.h
@@ -11,12 +11,12 @@
#include <AK/Result.h>
#include <AK/Types.h>
#include <AK/Vector.h>
-#include <Kernel/Storage/Partition/MBRPartitionTable.h>
+#include <LibPartition/MBRPartitionTable.h>
namespace Kernel {
struct GUIDPartitionHeader;
-class GUIDPartitionTable final : public MBRPartitionTable {
+class GUIDPartitionTable final : public Partition::MBRPartitionTable {
public:
virtual ~GUIDPartitionTable() = default;
;
diff --git a/Kernel/Storage/Partition/MBRPartitionTable.cpp b/Kernel/Storage/Partition/MBRPartitionTable.cpp
deleted file mode 100644
index ad32867857..0000000000
--- a/Kernel/Storage/Partition/MBRPartitionTable.cpp
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (c) 2020-2022, Liav A. <liavalb@hotmail.co.il>
- *
- * SPDX-License-Identifier: BSD-2-Clause
- */
-
-#include <AK/ByteBuffer.h>
-#include <Kernel/Debug.h>
-#include <Kernel/Storage/Partition/MBRPartitionTable.h>
-
-namespace Kernel {
-
-#define MBR_SIGNATURE 0xaa55
-#define MBR_PROTECTIVE 0xEE
-#define EBR_CHS_CONTAINER 0x05
-#define EBR_LBA_CONTAINER 0x0F
-
-ErrorOr<NonnullOwnPtr<MBRPartitionTable>> MBRPartitionTable::try_to_initialize(StorageDevice const& device)
-{
- auto table = TRY(adopt_nonnull_own_or_enomem(new (nothrow) MBRPartitionTable(device)));
- if (table->contains_ebr())
- return Error::from_errno(ENOTSUP);
- if (table->is_protective_mbr())
- return Error::from_errno(ENOTSUP);
- if (!table->is_valid())
- return Error::from_errno(EINVAL);
- return table;
-}
-
-OwnPtr<MBRPartitionTable> MBRPartitionTable::try_to_initialize(StorageDevice const& device, u32 start_lba)
-{
- auto table = adopt_nonnull_own_or_enomem(new (nothrow) MBRPartitionTable(device, start_lba)).release_value_but_fixme_should_propagate_errors();
- if (!table->is_valid())
- return {};
- return table;
-}
-
-bool MBRPartitionTable::read_boot_record()
-{
- auto buffer = UserOrKernelBuffer::for_kernel_buffer(m_cached_header.data());
- if (!m_device->read_block(m_start_lba, buffer))
- return false;
- m_header_valid = true;
- return m_header_valid;
-}
-
-MBRPartitionTable::MBRPartitionTable(StorageDevice const& device, u32 start_lba)
- : PartitionTable(device)
- , m_start_lba(start_lba)
- , m_cached_header(ByteBuffer::create_zeroed(m_device->block_size()).release_value_but_fixme_should_propagate_errors()) // FIXME: Do something sensible if this fails because of OOM.
-{
- if (!read_boot_record() || !initialize())
- return;
-
- m_header_valid = true;
-
- auto& header = this->header();
- for (size_t index = 0; index < 4; index++) {
- auto& entry = header.entry[index];
- if (entry.offset == 0x00) {
- continue;
- }
- MUST(m_partitions.try_empend(entry.offset, (entry.offset + entry.length), entry.type));
- }
- m_valid = true;
-}
-
-MBRPartitionTable::MBRPartitionTable(StorageDevice const& device)
- : PartitionTable(device)
- , m_start_lba(0)
- , m_cached_header(ByteBuffer::create_zeroed(m_device->block_size()).release_value_but_fixme_should_propagate_errors()) // FIXME: Do something sensible if this fails because of OOM.
-{
- if (!read_boot_record() || contains_ebr() || is_protective_mbr() || !initialize())
- return;
-
- auto& header = this->header();
- for (size_t index = 0; index < 4; index++) {
- auto& entry = header.entry[index];
- if (entry.offset == 0x00) {
- continue;
- }
- MUST(m_partitions.try_empend(entry.offset, (entry.offset + entry.length), entry.type));
- }
- m_valid = true;
-}
-
-MBRPartitionTable::~MBRPartitionTable() = default;
-
-MBRPartitionTable::Header const& MBRPartitionTable::header() const
-{
- return *(MBRPartitionTable::Header const*)m_cached_header.data();
-}
-
-bool MBRPartitionTable::initialize()
-{
- auto& header = this->header();
- dbgln_if(MBR_DEBUG, "Master Boot Record: mbr_signature={:#08x}", header.mbr_signature);
- if (header.mbr_signature != MBR_SIGNATURE) {
- dbgln("Master Boot Record: invalid signature");
- return false;
- }
- return true;
-}
-
-bool MBRPartitionTable::contains_ebr() const
-{
- for (int i = 0; i < 4; i++) {
- if (header().entry[i].type == EBR_CHS_CONTAINER || header().entry[i].type == EBR_LBA_CONTAINER)
- return true;
- }
- return false;
-}
-
-bool MBRPartitionTable::is_protective_mbr() const
-{
- return header().entry[0].type == MBR_PROTECTIVE;
-}
-
-}
diff --git a/Kernel/Storage/Partition/MBRPartitionTable.h b/Kernel/Storage/Partition/MBRPartitionTable.h
deleted file mode 100644
index 24bcdb49b9..0000000000
--- a/Kernel/Storage/Partition/MBRPartitionTable.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 2020-2022, Liav A. <liavalb@hotmail.co.il>
- *
- * SPDX-License-Identifier: BSD-2-Clause
- */
-
-#pragma once
-
-#include <AK/ByteBuffer.h>
-#include <AK/Error.h>
-#include <AK/RefPtr.h>
-#include <AK/Result.h>
-#include <AK/Vector.h>
-#include <LibPartition/PartitionTable.h>
-
-namespace Kernel {
-
-class MBRPartitionTable : public Partition::PartitionTable {
-public:
- struct [[gnu::packed]] Entry {
- u8 status;
- u8 chs1[3];
- u8 type;
- u8 chs2[3];
- u32 offset;
- u32 length;
- };
- struct [[gnu::packed]] Header {
- u8 code1[218];
- u16 ts_zero;
- u8 ts_drive;
- u8 ts_seconds;
- u8 ts_minutes;
- u8 ts_hours;
- u8 code2[216];
- u32 disk_signature;
- u16 disk_signature_zero;
- Entry entry[4];
- u16 mbr_signature;
- };
-
-public:
- ~MBRPartitionTable();
-
- static ErrorOr<NonnullOwnPtr<MBRPartitionTable>> try_to_initialize(StorageDevice const&);
- static OwnPtr<MBRPartitionTable> try_to_initialize(StorageDevice const&, u32 start_lba);
- explicit MBRPartitionTable(StorageDevice const&);
- MBRPartitionTable(StorageDevice const&, u32 start_lba);
-
- bool is_protective_mbr() const;
- bool contains_ebr() const;
- virtual bool is_valid() const override { return m_valid; };
-
-protected:
- Header const& header() const;
- bool is_header_valid() const { return m_header_valid; };
-
-private:
- bool read_boot_record();
- bool initialize();
- bool m_valid { false };
- bool m_header_valid { false };
- const u32 m_start_lba;
- ByteBuffer m_cached_header;
-};
-}
diff --git a/Kernel/Storage/StorageManagement.cpp b/Kernel/Storage/StorageManagement.cpp
index f574ebd119..32982078c9 100644
--- a/Kernel/Storage/StorageManagement.cpp
+++ b/Kernel/Storage/StorageManagement.cpp
@@ -23,9 +23,9 @@
#include <Kernel/Storage/NVMe/NVMeController.h>
#include <Kernel/Storage/Partition/EBRPartitionTable.h>
#include <Kernel/Storage/Partition/GUIDPartitionTable.h>
-#include <Kernel/Storage/Partition/MBRPartitionTable.h>
#include <Kernel/Storage/Ramdisk/Controller.h>
#include <Kernel/Storage/StorageManagement.h>
+#include <LibPartition/MBRPartitionTable.h>
namespace Kernel {
@@ -133,7 +133,7 @@ UNMAP_AFTER_INIT void StorageManagement::dump_storage_devices_and_partitions() c
UNMAP_AFTER_INIT ErrorOr<NonnullOwnPtr<Partition::PartitionTable>> StorageManagement::try_to_initialize_partition_table(StorageDevice const& device) const
{
- auto mbr_table_or_error = MBRPartitionTable::try_to_initialize(device);
+ auto mbr_table_or_error = Partition::MBRPartitionTable::try_to_initialize(device);
if (!mbr_table_or_error.is_error())
return mbr_table_or_error.release_value();
auto ebr_table_or_error = EBRPartitionTable::try_to_initialize(device);