From ec53aa86dd6c14b4d5a35e84b7805734fa9be552 Mon Sep 17 00:00:00 2001 From: CTCaer Date: Thu, 30 Apr 2020 01:29:58 +0300 Subject: [PATCH] emmc: Use gpt struct and only add valid entries Additionally keep track of partition index --- bootloader/storage/nx_emmc.c | 27 +++++++++++++------------ bootloader/storage/nx_emmc.h | 32 ++---------------------------- nyx/nyx_gui/storage/nx_emmc.c | 27 +++++++++++++------------ nyx/nyx_gui/storage/nx_emmc.h | 37 +++++++---------------------------- 4 files changed, 39 insertions(+), 84 deletions(-) diff --git a/bootloader/storage/nx_emmc.c b/bootloader/storage/nx_emmc.c index 05215ef..f5765a1 100644 --- a/bootloader/storage/nx_emmc.c +++ b/bootloader/storage/nx_emmc.c @@ -24,28 +24,31 @@ void nx_emmc_gpt_parse(link_t *gpt, sdmmc_storage_t *storage) { - u8 *buf = (u8 *)malloc(NX_GPT_NUM_BLOCKS * NX_EMMC_BLOCKSIZE); + gpt_t *gpt_buf = (gpt_t *)calloc(NX_GPT_NUM_BLOCKS, NX_EMMC_BLOCKSIZE); - emummc_storage_read(storage, NX_GPT_FIRST_LBA, NX_GPT_NUM_BLOCKS, buf); + emummc_storage_read(storage, NX_GPT_FIRST_LBA, NX_GPT_NUM_BLOCKS, gpt_buf); - gpt_header_t *hdr = (gpt_header_t *)buf; - for (u32 i = 0; i < hdr->num_part_ents; i++) + for (u32 i = 0; i < gpt_buf->header.num_part_ents; i++) { - gpt_entry_t *ent = (gpt_entry_t *)(buf + (hdr->part_ent_lba - 1) * NX_EMMC_BLOCKSIZE + i * sizeof(gpt_entry_t)); emmc_part_t *part = (emmc_part_t *)calloc(sizeof(emmc_part_t), 1); - part->lba_start = ent->lba_start; - part->lba_end = ent->lba_end; - part->attrs = ent->attrs; + + if (gpt_buf->entries[i].lba_start < gpt_buf->header.first_use_lba) + continue; + + part->index = i; + part->lba_start = gpt_buf->entries[i].lba_start; + part->lba_end = gpt_buf->entries[i].lba_end; + part->attrs = gpt_buf->entries[i].attrs; // ASCII conversion. Copy only the LSByte of the UTF-16LE name. - for (u32 i = 0; i < 36; i++) - part->name[i] = ent->name[i]; - part->name[36] = 0; + for (u32 j = 0; j < 36; j++) + part->name[j] = gpt_buf->entries[i].name[j]; + part->name[35] = 0; list_append(gpt, &part->link); } - free(buf); + free(gpt_buf); } void nx_emmc_gpt_free(link_t *gpt) diff --git a/bootloader/storage/nx_emmc.h b/bootloader/storage/nx_emmc.h index 753d5aa..19bc1ca 100644 --- a/bootloader/storage/nx_emmc.h +++ b/bootloader/storage/nx_emmc.h @@ -17,38 +17,9 @@ #ifndef _NX_EMMC_H_ #define _NX_EMMC_H_ +#include "sdmmc.h" #include "../utils/types.h" #include "../utils/list.h" -#include "sdmmc.h" - -typedef struct _gpt_entry_t -{ - u8 type_guid[0x10]; - u8 part_guid[0x10]; - u64 lba_start; - u64 lba_end; - u64 attrs; - u16 name[36]; -} gpt_entry_t; - -typedef struct _gpt_header_t -{ - u64 signature; - u32 revision; - u32 size; - u32 crc32; - u32 res1; - u64 my_lba; - u64 alt_lba; - u64 first_use_lba; - u64 last_use_lba; - u8 disk_guid[0x10]; - u64 part_ent_lba; - u32 num_part_ents; - u32 part_ent_size; - u32 part_ents_crc32; - u8 res2[420]; -} gpt_header_t; #define NX_GPT_FIRST_LBA 1 #define NX_GPT_NUM_BLOCKS 33 @@ -56,6 +27,7 @@ typedef struct _gpt_header_t typedef struct _emmc_part_t { + u32 index; u32 lba_start; u32 lba_end; u64 attrs; diff --git a/nyx/nyx_gui/storage/nx_emmc.c b/nyx/nyx_gui/storage/nx_emmc.c index d30b374..3a37382 100644 --- a/nyx/nyx_gui/storage/nx_emmc.c +++ b/nyx/nyx_gui/storage/nx_emmc.c @@ -23,28 +23,31 @@ void nx_emmc_gpt_parse(link_t *gpt, sdmmc_storage_t *storage) { - u8 *buf = (u8 *)malloc(NX_GPT_NUM_BLOCKS * NX_EMMC_BLOCKSIZE); + gpt_t *gpt_buf = (gpt_t *)calloc(NX_GPT_NUM_BLOCKS, NX_EMMC_BLOCKSIZE); - sdmmc_storage_read(storage, NX_GPT_FIRST_LBA, NX_GPT_NUM_BLOCKS, buf); + sdmmc_storage_read(storage, NX_GPT_FIRST_LBA, NX_GPT_NUM_BLOCKS, gpt_buf); - gpt_header_t *hdr = (gpt_header_t *)buf; - for (u32 i = 0; i < hdr->num_part_ents; i++) + for (u32 i = 0; i < gpt_buf->header.num_part_ents; i++) { - gpt_entry_t *ent = (gpt_entry_t *)(buf + (hdr->part_ent_lba - 1) * NX_EMMC_BLOCKSIZE + i * sizeof(gpt_entry_t)); emmc_part_t *part = (emmc_part_t *)calloc(sizeof(emmc_part_t), 1); - part->lba_start = ent->lba_start; - part->lba_end = ent->lba_end; - part->attrs = ent->attrs; + + if (gpt_buf->entries[i].lba_start < gpt_buf->header.first_use_lba) + continue; + + part->index = i; + part->lba_start = gpt_buf->entries[i].lba_start; + part->lba_end = gpt_buf->entries[i].lba_end; + part->attrs = gpt_buf->entries[i].attrs; // ASCII conversion. Copy only the LSByte of the UTF-16LE name. - for (u32 i = 0; i < 36; i++) - part->name[i] = ent->name[i]; - part->name[36] = 0; + for (u32 j = 0; j < 36; j++) + part->name[j] = gpt_buf->entries[i].name[j]; + part->name[35] = 0; list_append(gpt, &part->link); } - free(buf); + free(gpt_buf); } void nx_emmc_gpt_free(link_t *gpt) diff --git a/nyx/nyx_gui/storage/nx_emmc.h b/nyx/nyx_gui/storage/nx_emmc.h index 753d5aa..1a9fd22 100644 --- a/nyx/nyx_gui/storage/nx_emmc.h +++ b/nyx/nyx_gui/storage/nx_emmc.h @@ -17,38 +17,10 @@ #ifndef _NX_EMMC_H_ #define _NX_EMMC_H_ +#include "sdmmc.h" +#include "../libs/fatfs/ff.h" #include "../utils/types.h" #include "../utils/list.h" -#include "sdmmc.h" - -typedef struct _gpt_entry_t -{ - u8 type_guid[0x10]; - u8 part_guid[0x10]; - u64 lba_start; - u64 lba_end; - u64 attrs; - u16 name[36]; -} gpt_entry_t; - -typedef struct _gpt_header_t -{ - u64 signature; - u32 revision; - u32 size; - u32 crc32; - u32 res1; - u64 my_lba; - u64 alt_lba; - u64 first_use_lba; - u64 last_use_lba; - u8 disk_guid[0x10]; - u64 part_ent_lba; - u32 num_part_ents; - u32 part_ent_size; - u32 part_ents_crc32; - u8 res2[420]; -} gpt_header_t; #define NX_GPT_FIRST_LBA 1 #define NX_GPT_NUM_BLOCKS 33 @@ -56,6 +28,7 @@ typedef struct _gpt_header_t typedef struct _emmc_part_t { + u32 index; u32 lba_start; u32 lba_end; u64 attrs; @@ -63,6 +36,10 @@ typedef struct _emmc_part_t link_t link; } emmc_part_t; +sdmmc_t emmc_sdmmc; +sdmmc_storage_t emmc_storage; +FATFS emmc_fs; + void nx_emmc_gpt_parse(link_t *gpt, sdmmc_storage_t *storage); void nx_emmc_gpt_free(link_t *gpt); emmc_part_t *nx_emmc_part_find(link_t *gpt, const char *name);