* Added missing "name" parameter to efi_gpt_create_child(), and

efi_gpt_validate_create_child() hooks.
* Implemented setting the name to the partition for real.
* Implemented to_ucs2().


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31712 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2009-07-23 12:06:23 +00:00
parent b8e5a675e5
commit c6efb0f437
2 changed files with 25 additions and 11 deletions
@@ -1,10 +1,9 @@
SubDir HAIKU_TOP src add-ons kernel partitioning_systems efi ;
UsePrivateHeaders [ FDirName kernel disk_device_manager ] ;
UsePrivateHeaders [ FDirName kernel ] ;
UsePrivateHeaders [ FDirName storage ] ;
UsePrivateHeaders interface kernel storage ;
KernelAddon efi_gpt :
efi_gpt.cpp
PartitionLocker.cpp
;
;
@@ -1,9 +1,11 @@
/*
* Copyright 2009, Michael Lotz, [email protected]. All rights reserved.
* Copyright 2007-2008, Axel Dörfler, [email protected]. All rights reserved.
* Copyright 2007-2009, Axel Dörfler, [email protected].
*
* Distributed under the terms of the MIT License.
*/
#include "efi_gpt.h"
#include <KernelExport.h>
@@ -13,6 +15,7 @@
#else
# include <DiskDeviceTypes.h>
# include "PartitionLocker.h"
# include <utf8_functions.h>
#endif
#include <util/kernel_cpp.h>
@@ -161,7 +164,13 @@ to_utf8(const uint16 *from, size_t maxFromLength, char *to, size_t toSize)
static void
to_ucs2(const char *from, size_t fromLength, uint16 *to, size_t maxToLength)
{
// TODO: implement
size_t index = 0;
while (from[0] && index < maxToLength) {
to[index++] = UTF8ToCharCode(&from);
}
if (index < maxToLength)
to[index] = '\0';
}
#endif // !_BOOT_MODE
@@ -449,7 +458,9 @@ efi_gpt_identify_partition(int fd, partition_data *partition, void **_cookie)
}
*_cookie = header;
return 0.7;
return 0.96;
// This must be higher as Intel partitioning, as EFI can contain this
// partitioning for compatibility
}
@@ -712,10 +723,11 @@ efi_gpt_validate_initialize(partition_data *partition, char *name,
static bool
efi_gpt_validate_create_child(partition_data *partition, off_t *start,
off_t *size, const char *type, const char *parameters, int32 *index)
off_t *size, const char *type, const char *name, const char *parameters,
int32 *index)
{
if ((efi_gpt_get_supported_operations(partition, ~0)
& B_DISK_SYSTEM_SUPPORTS_CREATING_CHILD) == 0)
& B_DISK_SYSTEM_SUPPORTS_CREATING_CHILD) == 0)
return false;
if (guid_for_partition_type(type) == NULL)
@@ -733,6 +745,7 @@ efi_gpt_validate_create_child(partition_data *partition, off_t *start,
if (entryIndex < 0)
return false;
*index = entryIndex;
// ensure that child lies between first and last usable block
@@ -1083,8 +1096,8 @@ efi_gpt_initialize(int fd, partition_id partitionID, const char *name,
static status_t
efi_gpt_create_child(int fd, partition_id partitionID, off_t offset,
off_t size, const char *type, const char *parameters, disk_job_id job,
partition_id *childID)
off_t size, const char *type, const char *name, const char *parameters,
disk_job_id job, partition_id *childID)
{
if (fd < 0)
return B_ERROR;
@@ -1106,7 +1119,7 @@ efi_gpt_create_child(int fd, partition_id partitionID, off_t offset,
uint32 entryIndex = 0;
if (!efi_gpt_validate_create_child(partition, &validatedOffset,
&validatedSize, type, parameters, (int32 *)&entryIndex))
&validatedSize, type, name, parameters, (int32 *)&entryIndex))
return B_BAD_VALUE;
const static_guid *newType = guid_for_partition_type(type);
@@ -1122,6 +1135,7 @@ efi_gpt_create_child(int fd, partition_id partitionID, off_t offset,
efi_partition_entry &entry = header->EntryAt(entryIndex);
memcpy(&entry.partition_type, newType, sizeof(entry.partition_type));
to_ucs2(name, strlen(name), entry.name, EFI_PARTITION_NAME_LENGTH);
entry.SetStartBlock((validatedOffset - partition->offset)
/ partition->block_size);
entry.SetBlockCount(validatedSize / partition->block_size);
@@ -1135,6 +1149,7 @@ efi_gpt_create_child(int fd, partition_id partitionID, off_t offset,
*childID = child->id;
child->block_size = partition->block_size;
child->name = strdup(name);
child->type = strdup(type);
child->parameters = strdup(parameters);
child->cookie = (void *)entryIndex;