From 62e9936b71cf45e954b2b7d848492eb2be5b6beb Mon Sep 17 00:00:00 2001 From: mintsuki Date: Mon, 20 Dec 2021 07:49:39 +0100 Subject: [PATCH] fat32: Do not hardcode sector size --- stage23/fs/fat32.h | 1 + stage23/fs/fat32.s2.c | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/stage23/fs/fat32.h b/stage23/fs/fat32.h index 92ccecd4..c2cfd928 100644 --- a/stage23/fs/fat32.h +++ b/stage23/fs/fat32.h @@ -7,6 +7,7 @@ struct fat32_context { struct volume *part; int type; + uint16_t bytes_per_sector; uint8_t sectors_per_cluster; uint16_t reserved_sectors; uint8_t number_of_fats; diff --git a/stage23/fs/fat32.s2.c b/stage23/fs/fat32.s2.c index e539900a..8ec7a1ad 100644 --- a/stage23/fs/fat32.s2.c +++ b/stage23/fs/fat32.s2.c @@ -14,7 +14,6 @@ #define FAT32_VALID_SYSTEM_IDENTIFIER "FAT32 " #define FAT16_VALID_SYSTEM_IDENTIFIER "FAT16 " #define FAT12_VALID_SYSTEM_IDENTIFIER "FAT12 " -#define FAT32_SECTOR_SIZE 512 #define FAT32_ATTRIBUTE_SUBDIRECTORY 0x10 #define FAT32_LFN_ATTRIBUTE 0x0F @@ -95,6 +94,7 @@ static int fat32_init_context(struct fat32_context* context, struct volume *part return 1; valid: + context->bytes_per_sector = bpb.bytes_per_sector; context->sectors_per_cluster = bpb.sectors_per_cluster; context->reserved_sectors = bpb.reserved_sectors; context->number_of_fats = bpb.fats_count; @@ -104,7 +104,7 @@ valid: context->fat_start_lba = bpb.reserved_sectors; context->root_entries = bpb.directory_entries_count; context->root_start = context->reserved_sectors + context->number_of_fats * context->sectors_per_fat; - context->root_size = DIV_ROUNDUP(context->root_entries * sizeof(struct fat32_directory_entry), FAT32_SECTOR_SIZE); + context->root_size = DIV_ROUNDUP(context->root_entries * sizeof(struct fat32_directory_entry), context->bytes_per_sector); switch (context->type) { case 12: case 16: @@ -125,7 +125,7 @@ static int read_cluster_from_map(struct fat32_context *context, uint32_t cluster case 12: { *out = 0; uint16_t tmp = 0; - volume_read(context->part, &tmp, context->fat_start_lba * FAT32_SECTOR_SIZE + (cluster + cluster / 2), sizeof(uint16_t)); + volume_read(context->part, &tmp, context->fat_start_lba * context->bytes_per_sector + (cluster + cluster / 2), sizeof(uint16_t)); if (cluster % 2 == 0) { *out = tmp & 0xfff; } else { @@ -135,10 +135,10 @@ static int read_cluster_from_map(struct fat32_context *context, uint32_t cluster } case 16: *out = 0; - volume_read(context->part, out, context->fat_start_lba * FAT32_SECTOR_SIZE + cluster * sizeof(uint16_t), sizeof(uint16_t)); + volume_read(context->part, out, context->fat_start_lba * context->bytes_per_sector + cluster * sizeof(uint16_t), sizeof(uint16_t)); break; case 32: - volume_read(context->part, out, context->fat_start_lba * FAT32_SECTOR_SIZE + cluster * sizeof(uint32_t), sizeof(uint32_t)); + volume_read(context->part, out, context->fat_start_lba * context->bytes_per_sector + cluster * sizeof(uint32_t), sizeof(uint32_t)); *out &= 0x0fffffff; break; default: @@ -176,7 +176,7 @@ static uint32_t *cache_cluster_chain(struct fat32_context *context, static bool read_cluster_chain(struct fat32_context *context, uint32_t *cluster_chain, void *buf, uint64_t loc, uint64_t count) { - size_t block_size = context->sectors_per_cluster * FAT32_SECTOR_SIZE; + size_t block_size = context->sectors_per_cluster * context->bytes_per_sector; for (uint64_t progress = 0; progress < count;) { uint64_t block = (loc + progress) / block_size; @@ -185,7 +185,7 @@ static bool read_cluster_chain(struct fat32_context *context, if (chunk > block_size - offset) chunk = block_size - offset; - uint64_t base = ((uint64_t)context->data_start_lba + (cluster_chain[block] - 2) * context->sectors_per_cluster) * FAT32_SECTOR_SIZE; + uint64_t base = ((uint64_t)context->data_start_lba + (cluster_chain[block] - 2) * context->sectors_per_cluster) * context->bytes_per_sector; volume_read(context->part, buf + progress, base + offset, chunk); progress += chunk; @@ -231,7 +231,7 @@ static bool fat32_filename_to_8_3(char *dest, const char *src) { } static int fat32_open_in(struct fat32_context* context, struct fat32_directory_entry* directory, struct fat32_directory_entry* file, const char* name) { - size_t block_size = context->sectors_per_cluster * FAT32_SECTOR_SIZE; + size_t block_size = context->sectors_per_cluster * context->bytes_per_sector; char current_lfn[FAT32_LFN_MAX_FILENAME_LENGTH] = {0}; size_t dir_chain_len; @@ -257,7 +257,7 @@ static int fat32_open_in(struct fat32_context* context, struct fat32_directory_e directory_entries = ext_mem_alloc(dir_chain_len * block_size); - volume_read(context->part, directory_entries, context->root_start * FAT32_SECTOR_SIZE, context->root_entries * sizeof(struct fat32_directory_entry)); + volume_read(context->part, directory_entries, context->root_start * context->bytes_per_sector, context->root_entries * sizeof(struct fat32_directory_entry)); } int ret; @@ -399,7 +399,7 @@ bool fat32_open(struct fat32_file_handle* ret, struct volume *part, const char* ret->first_cluster = current_file.cluster_num_low; if (context.type == 32) ret->first_cluster |= (uint64_t)current_file.cluster_num_high << 16; - ret->size_clusters = DIV_ROUNDUP(current_file.file_size_bytes, FAT32_SECTOR_SIZE); + ret->size_clusters = DIV_ROUNDUP(current_file.file_size_bytes, context.bytes_per_sector); ret->size_bytes = current_file.file_size_bytes; ret->cluster_chain = cache_cluster_chain(&context, ret->first_cluster, &ret->chain_len); return true;