@@ -70,89 +70,89 @@ typedef struct {
|
||||
allocation_table_header_t *header;
|
||||
} allocation_table_ctx_t;
|
||||
|
||||
static ALWAYS_INLINE uint32_t allocation_table_entry_index_to_block(uint32_t entry_index) {
|
||||
static inline __attribute__((always_inline)) uint32_t allocation_table_entry_index_to_block(uint32_t entry_index) {
|
||||
return entry_index - 1;
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE uint32_t allocation_table_block_to_entry_index(uint32_t block_index) {
|
||||
static inline __attribute__((always_inline)) uint32_t allocation_table_block_to_entry_index(uint32_t block_index) {
|
||||
return block_index + 1;
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE int allocation_table_get_prev(allocation_table_entry_t *entry) {
|
||||
static inline __attribute__((always_inline)) int allocation_table_get_prev(allocation_table_entry_t *entry) {
|
||||
return entry->prev & 0x7FFFFFFF;
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE int allocation_table_get_next(allocation_table_entry_t *entry) {
|
||||
static inline __attribute__((always_inline)) int allocation_table_get_next(allocation_table_entry_t *entry) {
|
||||
return entry->next & 0x7FFFFFFF;
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE int allocation_table_is_list_start(allocation_table_entry_t *entry) {
|
||||
static inline __attribute__((always_inline)) int allocation_table_is_list_start(allocation_table_entry_t *entry) {
|
||||
return entry->prev == 0x80000000;
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE int allocation_table_is_list_end(allocation_table_entry_t *entry) {
|
||||
static inline __attribute__((always_inline)) int allocation_table_is_list_end(allocation_table_entry_t *entry) {
|
||||
return (entry->next & 0x7FFFFFFF) == 0;
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE bool allocation_table_is_multi_block_segment(allocation_table_entry_t *entry) {
|
||||
static inline __attribute__((always_inline)) bool allocation_table_is_multi_block_segment(allocation_table_entry_t *entry) {
|
||||
return entry->next & 0x80000000;
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE void allocation_table_make_multi_block_segment(allocation_table_entry_t *entry) {
|
||||
static inline __attribute__((always_inline)) void allocation_table_make_multi_block_segment(allocation_table_entry_t *entry) {
|
||||
entry->next |= 0x80000000;
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE void allocation_table_make_single_block_segment(allocation_table_entry_t *entry) {
|
||||
static inline __attribute__((always_inline)) void allocation_table_make_single_block_segment(allocation_table_entry_t *entry) {
|
||||
entry->next &= 0x7FFFFFFF;
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE bool allocation_table_is_single_block_segment(allocation_table_entry_t *entry) {
|
||||
static inline __attribute__((always_inline)) bool allocation_table_is_single_block_segment(allocation_table_entry_t *entry) {
|
||||
return (entry->next & 0x80000000) == 0;
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE void allocation_table_make_list_start(allocation_table_entry_t *entry) {
|
||||
static inline __attribute__((always_inline)) void allocation_table_make_list_start(allocation_table_entry_t *entry) {
|
||||
entry->prev = 0x80000000;
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE bool allocation_table_is_range_entry(allocation_table_entry_t *entry) {
|
||||
static inline __attribute__((always_inline)) bool allocation_table_is_range_entry(allocation_table_entry_t *entry) {
|
||||
return (entry->prev & 0x80000000) == 0x80000000 && entry->prev != 0x80000000;
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE void allocation_table_make_range_entry(allocation_table_entry_t *entry) {
|
||||
static inline __attribute__((always_inline)) void allocation_table_make_range_entry(allocation_table_entry_t *entry) {
|
||||
entry->prev |= 0x80000000;
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE void allocation_table_set_next(allocation_table_entry_t *entry, int val) {
|
||||
static inline __attribute__((always_inline)) void allocation_table_set_next(allocation_table_entry_t *entry, int val) {
|
||||
entry->next = (entry->next & 0x80000000) | val;
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE void allocation_table_set_prev(allocation_table_entry_t *entry, int val) {
|
||||
static inline __attribute__((always_inline)) void allocation_table_set_prev(allocation_table_entry_t *entry, int val) {
|
||||
entry->prev = val;
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE void allocation_table_set_range(allocation_table_entry_t *entry, int start_index, int end_index) {
|
||||
static inline __attribute__((always_inline)) void allocation_table_set_range(allocation_table_entry_t *entry, int start_index, int end_index) {
|
||||
entry->next = end_index;
|
||||
entry->prev = start_index;
|
||||
allocation_table_make_range_entry(entry);
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE uint64_t allocation_table_query_size(uint32_t block_count) {
|
||||
static inline __attribute__((always_inline)) uint64_t allocation_table_query_size(uint32_t block_count) {
|
||||
return SAVE_FAT_ENTRY_SIZE * allocation_table_block_to_entry_index(block_count);
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE allocation_table_entry_t *save_allocation_table_read_entry(allocation_table_ctx_t *ctx, uint32_t entry_index) {
|
||||
static inline __attribute__((always_inline)) allocation_table_entry_t *save_allocation_table_read_entry(allocation_table_ctx_t *ctx, uint32_t entry_index) {
|
||||
return (allocation_table_entry_t *)((uint8_t *)ctx->base_storage + entry_index * SAVE_FAT_ENTRY_SIZE);
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE void save_allocation_table_write_entry(allocation_table_ctx_t *ctx, uint32_t entry_index, allocation_table_entry_t *entry) {
|
||||
static inline __attribute__((always_inline)) void save_allocation_table_write_entry(allocation_table_ctx_t *ctx, uint32_t entry_index, allocation_table_entry_t *entry) {
|
||||
memcpy((uint8_t *)ctx->base_storage + entry_index * SAVE_FAT_ENTRY_SIZE, entry, SAVE_FAT_ENTRY_SIZE);
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE uint32_t save_allocation_table_get_free_list_entry_index(allocation_table_ctx_t *ctx) {
|
||||
static inline __attribute__((always_inline)) uint32_t save_allocation_table_get_free_list_entry_index(allocation_table_ctx_t *ctx) {
|
||||
return allocation_table_get_next(save_allocation_table_read_entry(ctx, ctx->free_list_entry_index));
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE uint32_t save_allocation_table_get_free_list_block_index(allocation_table_ctx_t *ctx) {
|
||||
static inline __attribute__((always_inline)) uint32_t save_allocation_table_get_free_list_block_index(allocation_table_ctx_t *ctx) {
|
||||
return allocation_table_entry_index_to_block(save_allocation_table_get_free_list_entry_index(ctx));
|
||||
}
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ typedef struct {
|
||||
uint64_t _length;
|
||||
} allocation_table_storage_ctx_t;
|
||||
|
||||
static ALWAYS_INLINE void save_allocation_table_storage_get_size(allocation_table_storage_ctx_t *ctx, uint64_t *out_size) {
|
||||
static inline __attribute__((always_inline)) void save_allocation_table_storage_get_size(allocation_table_storage_ctx_t *ctx, uint64_t *out_size) {
|
||||
*out_size = ctx->_length;
|
||||
}
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
#include <string.h>
|
||||
|
||||
static ALWAYS_INLINE cache_block_t *cache_block_init(cached_storage_ctx_t *ctx) {
|
||||
static inline __attribute__((always_inline)) cache_block_t *cache_block_init(cached_storage_ctx_t *ctx) {
|
||||
cache_block_t *block = calloc(1, sizeof(cache_block_t));
|
||||
block->buffer = malloc(ctx->block_size);
|
||||
block->index = -1;
|
||||
|
||||
@@ -57,15 +57,15 @@ typedef struct {
|
||||
substorage base_storage;
|
||||
} duplex_storage_ctx_t;
|
||||
|
||||
static ALWAYS_INLINE void save_bitmap_set_bit(void *buffer, uint64_t bit_offset) {
|
||||
static inline __attribute__((always_inline)) void save_bitmap_set_bit(void *buffer, uint64_t bit_offset) {
|
||||
*((uint8_t *)buffer + (bit_offset >> 3)) |= 1 << (bit_offset & 7);
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE void save_bitmap_clear_bit(void *buffer, uint64_t bit_offset) {
|
||||
static inline __attribute__((always_inline)) void save_bitmap_clear_bit(void *buffer, uint64_t bit_offset) {
|
||||
*((uint8_t *)buffer + (bit_offset >> 3)) &= ~(uint8_t)(1 << (bit_offset & 7));
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE uint8_t save_bitmap_check_bit(const void *buffer, uint64_t bit_offset) {
|
||||
static inline __attribute__((always_inline)) uint8_t save_bitmap_check_bit(const void *buffer, uint64_t bit_offset) {
|
||||
return *((uint8_t *)buffer + (bit_offset >> 3)) & (1 << (bit_offset & 7));
|
||||
}
|
||||
|
||||
|
||||
@@ -28,12 +28,12 @@ typedef struct {
|
||||
uint32_t high;
|
||||
} fs_int64_t;
|
||||
|
||||
static ALWAYS_INLINE void fs_int64_set(fs_int64_t *i, int64_t val) {
|
||||
static inline __attribute__((always_inline)) void fs_int64_set(fs_int64_t *i, int64_t val) {
|
||||
i->low = (uint32_t)((val & (uint64_t)(0x00000000FFFFFFFFul)) >> 0);
|
||||
i->high = (uint32_t)((val & (uint64_t)(0xFFFFFFFF00000000ul)) >> 32);
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE const int64_t fs_int64_get(fs_int64_t *i) {
|
||||
static inline __attribute__((always_inline)) const int64_t fs_int64_get(fs_int64_t *i) {
|
||||
return ((int64_t)(i->high) << 32) | ((int64_t)i->low);
|
||||
}
|
||||
|
||||
|
||||
@@ -311,7 +311,7 @@ bool save_hierarchical_file_table_rename_file(hierarchical_save_file_table_ctx_t
|
||||
return save_fs_list_change_key(&ctx->file_table, &old_key, &new_key);
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE bool save_is_sub_path(const char *path1, const char *path2) {
|
||||
static inline __attribute__((always_inline)) bool save_is_sub_path(const char *path1, const char *path2) {
|
||||
/* Check if either path is subpath of the other. */
|
||||
uint64_t path1_len = strlen(path1), path2_len = strlen(path2);
|
||||
if (path1_len == 0 || path2_len == 0)
|
||||
|
||||
@@ -50,13 +50,13 @@ void save_ivfc_storage_init(integrity_verification_storage_ctx_t *ctx, integrity
|
||||
}
|
||||
|
||||
/* buffer must have size count + 0x20 for salt to by copied in at offset 0. */
|
||||
static ALWAYS_INLINE void save_ivfc_storage_do_hash(integrity_verification_storage_ctx_t *ctx, uint8_t *out_hash, void *buffer, uint64_t count) {
|
||||
static inline __attribute__((always_inline)) void save_ivfc_storage_do_hash(integrity_verification_storage_ctx_t *ctx, uint8_t *out_hash, void *buffer, uint64_t count) {
|
||||
memcpy(buffer, ctx->salt, sizeof(ctx->salt));
|
||||
se_calc_sha256_oneshot(out_hash, buffer, count + sizeof(ctx->salt));
|
||||
out_hash[0x1F] |= 0x80;
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE bool is_empty(const void *buffer, uint64_t count) {
|
||||
static inline __attribute__((always_inline)) bool is_empty(const void *buffer, uint64_t count) {
|
||||
bool empty = true;
|
||||
const uint8_t *buf = (const uint8_t *)buffer;
|
||||
for (uint64_t i = 0; i < count; i++) {
|
||||
|
||||
@@ -39,6 +39,13 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
typedef enum
|
||||
{
|
||||
VALIDITY_UNCHECKED = 0,
|
||||
VALIDITY_INVALID,
|
||||
VALIDITY_VALID
|
||||
} validity_t;
|
||||
|
||||
typedef struct {
|
||||
substorage hash_storage;
|
||||
int integrity_check_level;
|
||||
|
||||
@@ -71,11 +71,11 @@ typedef struct {
|
||||
uint8_t *free_blocks;
|
||||
} journal_map_ctx_t;
|
||||
|
||||
static ALWAYS_INLINE uint32_t save_journal_map_entry_make_physical_index(uint32_t index) {
|
||||
static inline __attribute__((always_inline)) uint32_t save_journal_map_entry_make_physical_index(uint32_t index) {
|
||||
return index | 0x80000000;
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE uint32_t save_journal_map_entry_get_physical_index(uint32_t index) {
|
||||
static inline __attribute__((always_inline)) uint32_t save_journal_map_entry_get_physical_index(uint32_t index) {
|
||||
return index & 0x7FFFFFFF;
|
||||
}
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@ typedef struct {
|
||||
bool _finished;
|
||||
} path_parser_ctx_t;
|
||||
|
||||
static ALWAYS_INLINE bool save_path_parser_is_finished(path_parser_ctx_t *ctx) {
|
||||
static inline __attribute__((always_inline)) bool save_path_parser_is_finished(path_parser_ctx_t *ctx) {
|
||||
return ctx->_finished;
|
||||
}
|
||||
|
||||
|
||||
@@ -80,7 +80,7 @@ remap_segment_ctx_t *save_remap_storage_init_segments(remap_storage_ctx_t *ctx)
|
||||
return segments;
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE remap_entry_ctx_t *save_remap_storage_get_map_entry(remap_storage_ctx_t *ctx, uint64_t offset) {
|
||||
static inline __attribute__((always_inline)) remap_entry_ctx_t *save_remap_storage_get_map_entry(remap_storage_ctx_t *ctx, uint64_t offset) {
|
||||
uint32_t segment_idx = save_remap_get_segment_from_virtual_offset(ctx->header, offset);
|
||||
if (segment_idx < ctx->header->map_segment_count) {
|
||||
for (unsigned int i = 0; i < ctx->segments[segment_idx].entry_count; i++) {
|
||||
|
||||
@@ -89,11 +89,11 @@ typedef struct {
|
||||
substorage base_storage;
|
||||
} remap_storage_ctx_t;
|
||||
|
||||
static ALWAYS_INLINE uint32_t save_remap_get_segment_from_virtual_offset(remap_header_t *header, uint64_t offset) {
|
||||
static inline __attribute__((always_inline)) uint32_t save_remap_get_segment_from_virtual_offset(remap_header_t *header, uint64_t offset) {
|
||||
return (uint32_t)(offset >> (64 - header->segment_bits));
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE uint64_t save_remap_get_virtual_offset(remap_header_t *header, uint64_t segment) {
|
||||
static inline __attribute__((always_inline)) uint64_t save_remap_get_virtual_offset(remap_header_t *header, uint64_t segment) {
|
||||
return segment << (64 - header->segment_bits);
|
||||
}
|
||||
|
||||
|
||||
@@ -106,7 +106,7 @@ static bool save_process_header(save_ctx_t *ctx) {
|
||||
|
||||
uint8_t cmac[0x10] __attribute__((aligned(4)));
|
||||
se_aes_key_set(10, ctx->save_mac_key, 0x10);
|
||||
se_aes_cmac(10, cmac, 0x10, &ctx->header.layout, sizeof(ctx->header.layout));
|
||||
se_aes_cmac_128(10, cmac, &ctx->header.layout, sizeof(ctx->header.layout));
|
||||
if (memcmp(cmac, &ctx->header.cmac, 0x10) == 0) {
|
||||
ctx->header_cmac_validity = VALIDITY_VALID;
|
||||
} else {
|
||||
@@ -298,7 +298,7 @@ void save_free_contexts(save_ctx_t *ctx) {
|
||||
free(ctx->fat_storage);
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE bool save_flush(save_ctx_t *ctx) {
|
||||
static inline __attribute__((always_inline)) bool save_flush(save_ctx_t *ctx) {
|
||||
if (ctx->header.layout.version < VERSION_DISF_5) {
|
||||
if (!save_cached_storage_flush(ctx->core_data_ivfc_storage.data_level)) {
|
||||
EPRINTF("Failed to flush cached storage!");
|
||||
@@ -329,7 +329,7 @@ bool save_commit(save_ctx_t *ctx) {
|
||||
se_calc_sha256_oneshot(ctx->header.layout.hash, header + hashed_data_offset, hashed_data_size);
|
||||
|
||||
se_aes_key_set(10, ctx->save_mac_key, 0x10);
|
||||
se_aes_cmac(10, ctx->header.cmac, 0x10, &ctx->header.layout, sizeof(ctx->header.layout));
|
||||
se_aes_cmac_128(10, ctx->header.cmac, &ctx->header.layout, sizeof(ctx->header.layout));
|
||||
|
||||
if (substorage_write(&ctx->base_storage, &ctx->header, 0, sizeof(ctx->header)) != sizeof(ctx->header)) {
|
||||
EPRINTF("Failed to write save header!");
|
||||
|
||||
@@ -95,7 +95,7 @@ typedef struct {
|
||||
|
||||
static_assert(sizeof(save_data_creation_info_t) == 0x40, "Save data creation info size is wrong!");
|
||||
|
||||
static ALWAYS_INLINE uint32_t save_calc_map_entry_storage_size(int32_t entry_count) {
|
||||
static inline __attribute__((always_inline)) uint32_t save_calc_map_entry_storage_size(int32_t entry_count) {
|
||||
int32_t val = entry_count < 1 ? entry_count : entry_count - 1;
|
||||
return (entry_count + (val >> 1)) * sizeof(remap_entry_t);
|
||||
}
|
||||
@@ -107,47 +107,47 @@ bool save_create_system_save_data(save_ctx_t *ctx, uint32_t version, const char
|
||||
void save_free_contexts(save_ctx_t *ctx);
|
||||
bool save_commit(save_ctx_t *ctx);
|
||||
|
||||
static ALWAYS_INLINE bool save_create_directory(save_ctx_t *ctx, const char *path) {
|
||||
static inline __attribute__((always_inline)) bool save_create_directory(save_ctx_t *ctx, const char *path) {
|
||||
return save_data_file_system_core_create_directory(&ctx->save_filesystem_core, path);
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE bool save_create_file(save_ctx_t *ctx, const char *path, uint64_t size) {
|
||||
static inline __attribute__((always_inline)) bool save_create_file(save_ctx_t *ctx, const char *path, uint64_t size) {
|
||||
return save_data_file_system_core_create_file(&ctx->save_filesystem_core, path, size);
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE bool save_delete_directory(save_ctx_t *ctx, const char *path) {
|
||||
static inline __attribute__((always_inline)) bool save_delete_directory(save_ctx_t *ctx, const char *path) {
|
||||
return save_data_file_system_core_delete_directory(&ctx->save_filesystem_core,path);
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE bool save_delete_file(save_ctx_t *ctx, const char *path) {
|
||||
static inline __attribute__((always_inline)) bool save_delete_file(save_ctx_t *ctx, const char *path) {
|
||||
return save_data_file_system_core_delete_file(&ctx->save_filesystem_core, path);
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE bool save_open_directory(save_ctx_t *ctx, save_data_directory_ctx_t *directory, const char *path, open_directory_mode_t mode) {
|
||||
static inline __attribute__((always_inline)) bool save_open_directory(save_ctx_t *ctx, save_data_directory_ctx_t *directory, const char *path, open_directory_mode_t mode) {
|
||||
return save_data_file_system_core_open_directory(&ctx->save_filesystem_core, directory, path, mode);
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE bool save_open_file(save_ctx_t *ctx, save_data_file_ctx_t *file, const char *path, open_mode_t mode) {
|
||||
static inline __attribute__((always_inline)) bool save_open_file(save_ctx_t *ctx, save_data_file_ctx_t *file, const char *path, open_mode_t mode) {
|
||||
return save_data_file_system_core_open_file(&ctx->save_filesystem_core, file, path, mode);
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE bool save_rename_directory(save_ctx_t *ctx, const char *old_path, const char *new_path) {
|
||||
static inline __attribute__((always_inline)) bool save_rename_directory(save_ctx_t *ctx, const char *old_path, const char *new_path) {
|
||||
return save_data_file_system_core_rename_directory(&ctx->save_filesystem_core, old_path, new_path);
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE bool save_rename_file(save_ctx_t *ctx, const char *old_path, const char *new_path) {
|
||||
static inline __attribute__((always_inline)) bool save_rename_file(save_ctx_t *ctx, const char *old_path, const char *new_path) {
|
||||
return save_data_file_system_core_rename_file(&ctx->save_filesystem_core, old_path, new_path);
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE bool save_get_entry_type(save_ctx_t *ctx, directory_entry_type_t *out_entry_type, const char *path) {
|
||||
static inline __attribute__((always_inline)) bool save_get_entry_type(save_ctx_t *ctx, directory_entry_type_t *out_entry_type, const char *path) {
|
||||
return save_data_file_system_core_get_entry_type(&ctx->save_filesystem_core, out_entry_type, path);
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE void save_get_free_space_size(save_ctx_t *ctx, uint64_t *out_free_space) {
|
||||
static inline __attribute__((always_inline)) void save_get_free_space_size(save_ctx_t *ctx, uint64_t *out_free_space) {
|
||||
return save_data_file_system_core_get_free_space_size(&ctx->save_filesystem_core, out_free_space);
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE void save_get_total_space_size(save_ctx_t *ctx, uint64_t *out_total_size) {
|
||||
static inline __attribute__((always_inline)) void save_get_total_space_size(save_ctx_t *ctx, uint64_t *out_total_size) {
|
||||
return save_data_file_system_core_get_total_space_size(&ctx->save_filesystem_core, out_total_size);
|
||||
}
|
||||
|
||||
|
||||
@@ -42,6 +42,15 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
typedef enum
|
||||
{
|
||||
OPEN_MODE_READ = 1,
|
||||
OPEN_MODE_WRITE = 2,
|
||||
OPEN_MODE_ALLOW_APPEND = 4,
|
||||
OPEN_MODE_READ_WRITE = OPEN_MODE_READ | OPEN_MODE_WRITE,
|
||||
OPEN_MODE_ALL = OPEN_MODE_READ | OPEN_MODE_WRITE | OPEN_MODE_ALLOW_APPEND
|
||||
} open_mode_t;
|
||||
|
||||
typedef struct {
|
||||
allocation_table_storage_ctx_t base_storage;
|
||||
const char *path;
|
||||
@@ -50,7 +59,7 @@ typedef struct {
|
||||
open_mode_t mode;
|
||||
} save_data_file_ctx_t;
|
||||
|
||||
static ALWAYS_INLINE void save_data_file_get_size(save_data_file_ctx_t *ctx, uint64_t *out_size) {
|
||||
static inline __attribute__((always_inline)) void save_data_file_get_size(save_data_file_ctx_t *ctx, uint64_t *out_size) {
|
||||
*out_size = ctx->size;
|
||||
}
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
#include <gfx_utils.h>
|
||||
#include <mem/heap.h>
|
||||
|
||||
static ALWAYS_INLINE bool save_data_file_system_core_open_fat_storage(save_data_file_system_core_ctx_t *ctx, allocation_table_storage_ctx_t *storage_ctx, uint32_t block_index) {
|
||||
static inline __attribute__((always_inline)) bool save_data_file_system_core_open_fat_storage(save_data_file_system_core_ctx_t *ctx, allocation_table_storage_ctx_t *storage_ctx, uint32_t block_index) {
|
||||
return save_allocation_table_storage_init(storage_ctx, ctx->base_storage, &ctx->allocation_table, (uint32_t)ctx->header->block_size, block_index);
|
||||
}
|
||||
|
||||
|
||||
@@ -49,20 +49,20 @@ typedef struct {
|
||||
hierarchical_save_file_table_ctx_t file_table;
|
||||
} save_data_file_system_core_ctx_t;
|
||||
|
||||
static ALWAYS_INLINE bool save_data_file_system_core_rename_directory(save_data_file_system_core_ctx_t *ctx, const char *old_path, const char *new_path) {
|
||||
static inline __attribute__((always_inline)) bool save_data_file_system_core_rename_directory(save_data_file_system_core_ctx_t *ctx, const char *old_path, const char *new_path) {
|
||||
return save_hierarchical_file_table_rename_directory(&ctx->file_table, old_path, new_path);
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE bool save_data_file_system_core_rename_file(save_data_file_system_core_ctx_t *ctx, const char *old_path, const char *new_path) {
|
||||
static inline __attribute__((always_inline)) bool save_data_file_system_core_rename_file(save_data_file_system_core_ctx_t *ctx, const char *old_path, const char *new_path) {
|
||||
return save_hierarchical_file_table_rename_file(&ctx->file_table, old_path, new_path);
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE void save_data_file_system_core_get_free_space_size(save_data_file_system_core_ctx_t *ctx, uint64_t *out_free_space) {
|
||||
static inline __attribute__((always_inline)) void save_data_file_system_core_get_free_space_size(save_data_file_system_core_ctx_t *ctx, uint64_t *out_free_space) {
|
||||
uint32_t free_block_count = save_allocation_table_get_free_list_length(&ctx->allocation_table);
|
||||
*out_free_space = ctx->header->block_size * free_block_count;
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE void save_data_file_system_core_get_total_space_size(save_data_file_system_core_ctx_t *ctx, uint64_t *out_total_space) {
|
||||
static inline __attribute__((always_inline)) void save_data_file_system_core_get_total_space_size(save_data_file_system_core_ctx_t *ctx, uint64_t *out_total_space) {
|
||||
*out_total_space = ctx->header->block_size * ctx->header->block_count;
|
||||
}
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@ void save_fs_list_init(save_filesystem_list_ctx_t *ctx) {
|
||||
ctx->used_list_head_index = 1;
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE uint32_t save_fs_list_get_capacity(save_filesystem_list_ctx_t *ctx) {
|
||||
static inline __attribute__((always_inline)) uint32_t save_fs_list_get_capacity(save_filesystem_list_ctx_t *ctx) {
|
||||
uint32_t capacity;
|
||||
if (save_allocation_table_storage_read(&ctx->storage, &capacity, 4, 4) != 4) {
|
||||
EPRINTF("Failed to read FS list capacity!");
|
||||
@@ -52,7 +52,7 @@ static ALWAYS_INLINE uint32_t save_fs_list_get_capacity(save_filesystem_list_ctx
|
||||
return capacity;
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE uint32_t save_fs_list_get_length(save_filesystem_list_ctx_t *ctx) {
|
||||
static inline __attribute__((always_inline)) uint32_t save_fs_list_get_length(save_filesystem_list_ctx_t *ctx) {
|
||||
uint32_t length;
|
||||
if (save_allocation_table_storage_read(&ctx->storage, &length, 0, 4) != 4) {
|
||||
EPRINTF("Failed to read FS list length!");
|
||||
@@ -61,11 +61,11 @@ static ALWAYS_INLINE uint32_t save_fs_list_get_length(save_filesystem_list_ctx_t
|
||||
return length;
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE bool save_fs_list_set_capacity(save_filesystem_list_ctx_t *ctx, uint32_t capacity) {
|
||||
static inline __attribute__((always_inline)) bool save_fs_list_set_capacity(save_filesystem_list_ctx_t *ctx, uint32_t capacity) {
|
||||
return save_allocation_table_storage_write(&ctx->storage, &capacity, 4, 4) == 4;
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE bool save_fs_list_set_length(save_filesystem_list_ctx_t *ctx, uint32_t length) {
|
||||
static inline __attribute__((always_inline)) bool save_fs_list_set_length(save_filesystem_list_ctx_t *ctx, uint32_t length) {
|
||||
return save_allocation_table_storage_write(&ctx->storage, &length, 0, 4) == 4;
|
||||
}
|
||||
|
||||
|
||||
@@ -76,11 +76,11 @@ typedef struct {
|
||||
|
||||
static_assert(sizeof(save_fs_list_entry_t) == 0x60, "Save filesystem list entry size is wrong!");
|
||||
|
||||
static ALWAYS_INLINE uint32_t save_fs_list_read_entry(save_filesystem_list_ctx_t *ctx, uint32_t index, void *entry) {
|
||||
static inline __attribute__((always_inline)) uint32_t save_fs_list_read_entry(save_filesystem_list_ctx_t *ctx, uint32_t index, void *entry) {
|
||||
return save_allocation_table_storage_read(&ctx->storage, entry, index * SAVE_FS_LIST_ENTRY_SIZE, SAVE_FS_LIST_ENTRY_SIZE);
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE uint32_t save_fs_list_write_entry(save_filesystem_list_ctx_t *ctx, uint32_t index, const void *entry) {
|
||||
static inline __attribute__((always_inline)) uint32_t save_fs_list_write_entry(save_filesystem_list_ctx_t *ctx, uint32_t index, const void *entry) {
|
||||
return save_allocation_table_storage_write(&ctx->storage, entry, index * SAVE_FS_LIST_ENTRY_SIZE, SAVE_FS_LIST_ENTRY_SIZE);
|
||||
}
|
||||
|
||||
|
||||
@@ -39,6 +39,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
#include <utils/types.h>
|
||||
|
||||
#define DIV_ROUND_UP(a, b) ((a + b - 1) / b)
|
||||
|
||||
typedef struct {
|
||||
uint32_t (*read)(void *ctx, void *buffer, uint64_t offset, uint64_t count);
|
||||
uint32_t (*write)(void *ctx, const void *buffer, uint64_t offset, uint64_t count);
|
||||
@@ -51,7 +53,7 @@ typedef struct {
|
||||
void *ctx;
|
||||
} storage;
|
||||
|
||||
static void ALWAYS_INLINE storage_init(storage *this, const storage_vt *vt, void *ctx) {
|
||||
static void inline __attribute__((always_inline)) storage_init(storage *this, const storage_vt *vt, void *ctx) {
|
||||
this->vt = vt;
|
||||
this->ctx = ctx;
|
||||
}
|
||||
@@ -65,15 +67,15 @@ typedef struct {
|
||||
void substorage_init(substorage *this, const storage_vt *vt, void *ctx, uint64_t offset, uint64_t length);
|
||||
bool substorage_init_from_other(substorage *this, const substorage *other, uint64_t offset, uint64_t length);
|
||||
|
||||
static ALWAYS_INLINE uint32_t substorage_read(substorage *ctx, void *buffer, uint64_t offset, uint64_t count) {
|
||||
static inline __attribute__((always_inline)) uint32_t substorage_read(substorage *ctx, void *buffer, uint64_t offset, uint64_t count) {
|
||||
return ctx->base_storage.vt->read(ctx->base_storage.ctx, buffer, ctx->offset + offset, count);
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE uint32_t substorage_write(substorage *ctx, const void *buffer, uint64_t offset, uint64_t count) {
|
||||
static inline __attribute__((always_inline)) uint32_t substorage_write(substorage *ctx, const void *buffer, uint64_t offset, uint64_t count) {
|
||||
return ctx->base_storage.vt->write(ctx->base_storage.ctx, buffer, ctx->offset + offset, count);
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE void substorage_get_size(substorage *ctx, uint64_t *out_size) {
|
||||
static inline __attribute__((always_inline)) void substorage_get_size(substorage *ctx, uint64_t *out_size) {
|
||||
ctx->base_storage.vt->get_size(ctx->base_storage.ctx, out_size);
|
||||
}
|
||||
|
||||
@@ -162,7 +164,7 @@ static const storage_vt hierarchical_duplex_storage_vt = {
|
||||
save_hierarchical_duplex_storage_get_size_wrapper
|
||||
};
|
||||
|
||||
static ALWAYS_INLINE bool is_range_valid(uint64_t offset, uint64_t size, uint64_t total_size) {
|
||||
static inline __attribute__((always_inline)) bool is_range_valid(uint64_t offset, uint64_t size, uint64_t total_size) {
|
||||
return offset >= 0 &&
|
||||
size >= 0 &&
|
||||
size <= total_size &&
|
||||
|
||||
Reference in New Issue
Block a user