Merge pull request #1820 from thloh85-intel/integration_mbr

drivers: partition: Add simple MBR partition entries support
This commit is contained in:
Antonio Niño Díaz 2019-02-13 15:53:18 +00:00 committed by GitHub
commit eaea119ea1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 53 additions and 4 deletions

View File

@ -105,6 +105,57 @@ static int load_gpt_header(uintptr_t image_handle)
return 0;
}
static int load_mbr_entry(uintptr_t image_handle, mbr_entry_t *mbr_entry,
int part_number)
{
size_t bytes_read;
uintptr_t offset;
int result;
assert(mbr_entry != NULL);
/* MBR partition table is in LBA0. */
result = io_seek(image_handle, IO_SEEK_SET, MBR_OFFSET);
if (result != 0) {
WARN("Failed to seek (%i)\n", result);
return result;
}
result = io_read(image_handle, (uintptr_t)&mbr_sector,
PARTITION_BLOCK_SIZE, &bytes_read);
if (result != 0) {
WARN("Failed to read data (%i)\n", result);
return result;
}
/* Check MBR boot signature. */
if ((mbr_sector[PARTITION_BLOCK_SIZE - 2] != MBR_SIGNATURE_FIRST) ||
(mbr_sector[PARTITION_BLOCK_SIZE - 1] != MBR_SIGNATURE_SECOND)) {
return -ENOENT;
}
offset = (uintptr_t)&mbr_sector +
MBR_PRIMARY_ENTRY_OFFSET +
MBR_PRIMARY_ENTRY_SIZE * part_number;
memcpy(mbr_entry, (void *)offset, sizeof(mbr_entry_t));
return 0;
}
static int load_mbr_entries(uintptr_t image_handle)
{
mbr_entry_t mbr_entry;
int i;
list.entry_count = MBR_PRIMARY_ENTRY_NUMBER;
for (i = 0; i < list.entry_count; i++) {
load_mbr_entry(image_handle, &mbr_entry, i);
list.list[i].start = mbr_entry.first_lba * 512;
list.list[i].length = mbr_entry.sector_nums * 512;
list.list[i].name[0] = mbr_entry.type;
}
return 0;
}
static int load_gpt_entry(uintptr_t image_handle, gpt_entry_t *entry)
{
size_t bytes_read;
@ -175,11 +226,9 @@ int load_partition_table(unsigned int image_id)
assert(result == 0);
result = verify_partition_gpt(image_handle);
} else {
/* MBR type isn't supported yet. */
result = -EINVAL;
goto exit;
result = load_mbr_entries(image_handle);
}
exit:
io_close(image_handle);
return result;
}