1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-24 22:47:44 +00:00

Kernel: Allow to boot from a partition with partition UUID

Instead of specifying the boot argument to be root=/dev/hdXY, now
one can write root=PARTUUID= with the right UUID, and if the partition
is found, the kernel will boot from it.

This feature is mainly used with GUID partitions, and is considered to
be the most reliable way for the kernel to identify partitions.
This commit is contained in:
Liav A 2020-12-31 13:17:03 +02:00 committed by Andreas Kling
parent d22d29a29a
commit 9dc8bea3e7
9 changed files with 162 additions and 62 deletions

View file

@ -24,31 +24,72 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <AK/AllOf.h>
#include <Kernel/Storage/Partition/DiskPartitionMetadata.h>
namespace Kernel {
DiskPartitionMetadata::DiskPartitionMetadata(u64 start_block, u64 end_block, ByteBuffer partition_type)
: m_start_block(start_block)
, m_end_block(end_block)
, m_partition_type(partition_type)
DiskPartitionMetadata::PartitionType::PartitionType(u8 partition_type)
{
ASSERT(!m_partition_type.is_empty());
m_partition_type[0] = partition_type;
}
DiskPartitionMetadata::DiskPartitionMetadata(u64 start_block, u64 end_block, ByteBuffer partition_guid, ByteBuffer unique_guid, u64 special_attributes, String name)
DiskPartitionMetadata::PartitionType::PartitionType(Array<u8, 16> partition_type)
: m_partition_type_is_uuid(true)
{
m_partition_type.span().overwrite(0, partition_type.data(), partition_type.size());
}
UUID DiskPartitionMetadata::PartitionType::to_uuid() const
{
ASSERT(is_uuid());
return m_partition_type;
}
u8 DiskPartitionMetadata::PartitionType::to_byte_indicator() const
{
ASSERT(!is_uuid());
return m_partition_type[0];
}
bool DiskPartitionMetadata::PartitionType::is_uuid() const
{
return m_partition_type_is_uuid;
}
bool DiskPartitionMetadata::PartitionType::is_valid() const
{
return !all_of(m_partition_type.begin(), m_partition_type.end(), [](const auto octet) { return octet == 0; });
}
DiskPartitionMetadata::DiskPartitionMetadata(u64 start_block, u64 end_block, u8 partition_type)
: m_start_block(start_block)
, m_end_block(end_block)
, m_partition_type(partition_guid)
, m_type(partition_type)
{
ASSERT(m_type.is_valid());
}
DiskPartitionMetadata::DiskPartitionMetadata(u64 start_block, u64 end_block, Array<u8, 16> partition_type)
: m_start_block(start_block)
, m_end_block(end_block)
, m_type(partition_type)
{
ASSERT(m_type.is_valid());
}
DiskPartitionMetadata::DiskPartitionMetadata(u64 start_block, u64 end_block, Array<u8, 16> partition_type, UUID unique_guid, u64 special_attributes, String name)
: m_start_block(start_block)
, m_end_block(end_block)
, m_type(partition_type)
, m_unique_guid(unique_guid)
, m_attributes(special_attributes)
, m_name(name)
{
ASSERT(!m_partition_type.is_empty());
ASSERT(!m_unique_guid.is_empty());
ASSERT(m_type.is_valid());
ASSERT(!m_unique_guid.is_zero());
}
DiskPartitionMetadata DiskPartitionMetadata::offset(u64 blocks_count) const
{
return DiskPartitionMetadata({ blocks_count + m_start_block, blocks_count + m_end_block, m_partition_type });
return { blocks_count + m_start_block, blocks_count + m_end_block, m_type.m_partition_type };
}
u64 DiskPartitionMetadata::start_block() const
@ -71,16 +112,12 @@ Optional<String> DiskPartitionMetadata::name() const
return {};
return m_name;
}
Optional<ByteBuffer> DiskPartitionMetadata::partition_type() const
const DiskPartitionMetadata::PartitionType& DiskPartitionMetadata::type() const
{
if (m_partition_type.is_null() || m_partition_type.is_empty())
return {};
return m_partition_type;
return m_type;
}
Optional<ByteBuffer> DiskPartitionMetadata::unique_guid() const
const UUID& DiskPartitionMetadata::unique_guid() const
{
if (m_unique_guid.is_null() || m_unique_guid.is_empty())
return {};
return m_unique_guid;
}