diff options
author | Samuel Bowman <sam@sambowman.tech> | 2022-03-01 19:42:06 -0500 |
---|---|---|
committer | Linus Groh <mail@linusgroh.de> | 2022-07-21 20:13:44 +0100 |
commit | 1a6ef03e4a360d9497ef0babbb38c7c7cb1df0e0 (patch) | |
tree | 006b28bac47763166cc67be3d636bae5ea68879f /Kernel | |
parent | 940dde99473ec756cc78dc3ef9cea6fb1d651b6c (diff) | |
download | serenity-1a6ef03e4a360d9497ef0babbb38c7c7cb1df0e0.zip |
Kernel+LibPartition: Move MBRPartitionTable into LibPartition
Diffstat (limited to 'Kernel')
-rw-r--r-- | Kernel/CMakeLists.txt | 2 | ||||
-rw-r--r-- | Kernel/Debug.h.in | 4 | ||||
-rw-r--r-- | Kernel/Storage/Partition/EBRPartitionTable.h | 4 | ||||
-rw-r--r-- | Kernel/Storage/Partition/GUIDPartitionTable.h | 4 | ||||
-rw-r--r-- | Kernel/Storage/Partition/MBRPartitionTable.cpp | 119 | ||||
-rw-r--r-- | Kernel/Storage/Partition/MBRPartitionTable.h | 66 | ||||
-rw-r--r-- | Kernel/Storage/StorageManagement.cpp | 4 |
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); |