nyx: allow backing up resized emummc

This commit is contained in:
CTCaer 2021-05-11 09:34:19 +03:00
parent 833dda7e7c
commit 588a834ae4

View file

@ -55,12 +55,13 @@ static void _get_valid_partition(u32 *sector_start, u32 *sector_size, u32 *part_
*part_idx = 0; *part_idx = 0;
int i = 0; int i = 0;
u32 curr_part_size = 0; u32 curr_part_size = 0;
// Find first partition with emuMMC GPP.
for (i = 1; i < 4; i++) for (i = 1; i < 4; i++)
{ {
curr_part_size = mbr->partitions[i].size_sct; curr_part_size = mbr->partitions[i].size_sct;
*sector_start = mbr->partitions[i].start_sct; *sector_start = mbr->partitions[i].start_sct;
u8 type = mbr->partitions[i].type; u8 type = mbr->partitions[i].type;
u32 sector_size_safe = !backup ? (*sector_size) + 0x8000 : (*sector_size); u32 sector_size_safe = backup ? 0x400000 : (*sector_size) + 0x8000; // 2GB min safe size for backup.
if ((curr_part_size >= sector_size_safe) && *sector_start && type != 0x83 && (!backup || type == 0xE0)) if ((curr_part_size >= sector_size_safe) && *sector_start && type != 0x83 && (!backup || type == 0xE0))
{ {
if (backup) if (backup)
@ -84,6 +85,7 @@ static void _get_valid_partition(u32 *sector_start, u32 *sector_size, u32 *part_
break; break;
} }
} }
free(mbr);
if (i < 4) if (i < 4)
*part_idx = i; *part_idx = i;
@ -94,7 +96,7 @@ static void _get_valid_partition(u32 *sector_start, u32 *sector_size, u32 *part_
*part_idx = 0; *part_idx = 0;
} }
free(mbr); // Get emuMMC GPP size.
if (backup && *part_idx && *sector_size) if (backup && *part_idx && *sector_size)
{ {
gpt_t *gpt = (gpt_t *)calloc(sizeof(gpt_t), 1); gpt_t *gpt = (gpt_t *)calloc(sizeof(gpt_t), 1);
@ -353,6 +355,7 @@ static int _dump_emmc_part(emmc_tool_gui_t *gui, char *sd_path, int active_part,
partial_sd_full_unmount = false; partial_sd_full_unmount = false;
u32 multipartSplitSize = (1u << 31); u32 multipartSplitSize = (1u << 31);
u32 lba_end = part->lba_end;
u32 totalSectors = part->lba_end - part->lba_start + 1; u32 totalSectors = part->lba_end - part->lba_start + 1;
u32 currPartIdx = 0; u32 currPartIdx = 0;
u32 numSplitParts = 0; u32 numSplitParts = 0;
@ -384,7 +387,10 @@ static int _dump_emmc_part(emmc_tool_gui_t *gui, char *sd_path, int active_part,
} }
sd_sector_off = sector_start + (0x2000 * active_part); sd_sector_off = sector_start + (0x2000 * active_part);
if (active_part == 2) if (active_part == 2)
{
totalSectors = sector_size; totalSectors = sector_size;
lba_end = sector_size + part->lba_start - 1;
}
} }
s_printf(gui->txt_buf, "#96FF00 SD Card free space:# %d MiB\n#96FF00 Total backup size:# %d MiB\n\n", s_printf(gui->txt_buf, "#96FF00 SD Card free space:# %d MiB\n#96FF00 Total backup size:# %d MiB\n\n",
@ -670,7 +676,7 @@ static int _dump_emmc_part(emmc_tool_gui_t *gui, char *sd_path, int active_part,
manual_system_maintenance(false); manual_system_maintenance(false);
pct = (u64)((u64)(lba_curr - part->lba_start) * 100u) / (u64)(part->lba_end - part->lba_start); pct = (u64)((u64)(lba_curr - part->lba_start) * 100u) / (u64)(lba_end - part->lba_start);
if (pct != prevPct) if (pct != prevPct)
{ {
lv_bar_set_value(gui->bar, pct); lv_bar_set_value(gui->bar, pct);