diff --git a/epicardium/fs/filesystem_fat.c b/epicardium/fs/filesystem_fat.c index 43a4725d6c1b0e238a4d3373cd38d339eefb9a9d..8056dfa50865c4becb3ced0bfa428d0ef1b5cfd1 100644 --- a/epicardium/fs/filesystem_fat.c +++ b/epicardium/fs/filesystem_fat.c @@ -22,6 +22,7 @@ #include "epicardium.h" #include "card10.h" #include "modules/log.h" +#include "api/common.h" #define SSLOG_DEBUG(...) LOG_DEBUG("fatfs", __VA_ARGS__) #define SSLOG_INFO(...) LOG_INFO("fatfs", __VA_ARGS__) @@ -44,6 +45,7 @@ struct FatObject { uint32_t generation; + int coreMask; enum epic_stat_type type; union { FIL file; @@ -56,6 +58,7 @@ struct EpicFileSystem { uint32_t generationCount; bool initialized; FATFS FatFs; + int lockCoreMask; }; // this table converts from FRESULT to POSIX errno @@ -64,7 +67,7 @@ static const int s_libffToErrno[20]; static const char *f_get_rc_string(FRESULT rc); static bool globalLockAccquire(); static void globalLockRelease(); -static void efs_close_all(EpicFileSystem *fs); +static void efs_close_all(EpicFileSystem *fs, int coreMask); /** * if EPICSTAT_NONE is passed to `expected`, the type is not checked. @@ -159,7 +162,7 @@ void fatfs_detach() FRESULT ff_res; EpicFileSystem *fs; if (efs_lock_global(&fs) == 0) { - efs_close_all(fs); + efs_close_all(fs, EPICARDIUM_COREMASK_BOTH); //unmount by passing NULL as fs object, will destroy our sync object via ff_del_syncobj ff_res = f_mount(NULL, "/", 0); @@ -177,6 +180,13 @@ void fatfs_detach() } } +void fatfs_close_all(int coreMask) +{ + EpicFileSystem *fs; + if (efs_lock_global(&fs) == 0) { + efs_close_all(fs, coreMask); + } +} static const char *f_get_rc_string(FRESULT rc) { static const TCHAR *rcstrings = @@ -216,6 +226,11 @@ int efs_lock_global(EpicFileSystem **fs) return -ENODEV; } *fs = &s_globalFileSystem; + if (API_CALL_MEM->call_flag == _API_FLAG_CALLING) { + s_globalFileSystem.lockCoreMask = EPICARDIUM_COREMASK_1; + } else { + s_globalFileSystem.lockCoreMask = EPICARDIUM_COREMASK_0; + } return 0; } @@ -292,6 +307,7 @@ static int efs_obj_init( } obj->type = type; obj->generation = generation; + obj->coreMask = fs->lockCoreMask; return EPIC_FAT_FD(index, generation); } @@ -300,6 +316,7 @@ static void efs_obj_deinit(EpicFileSystem *fs, struct FatObject *obj) { obj->type = EPICSTAT_NONE; obj->generation = 0; + obj->coreMask = 0; } /* here we're trying to mirror glibc's behaviour: @@ -392,9 +409,13 @@ int efs_close(EpicFileSystem *fs, int fd) return res; } -void efs_close_all(EpicFileSystem *fs) +void efs_close_all(EpicFileSystem *fs, int coreMask) { + assert(coreMask != 0); for (int i = 0; i < EPIC_FAT_MAX_OPENED; ++i) { + if (!(fs->pool[i].coreMask & coreMask)) { + continue; + } switch (fs->pool[i].type) { case EPICSTAT_FILE: f_close(&fs->pool[i].file); diff --git a/epicardium/modules/filesystem.h b/epicardium/modules/filesystem.h index 7a638d5ab4a87d39fe5b3bd4edd5b3c1901dc194..720147ecd04a8f07755052d05adb90871b360bd7 100644 --- a/epicardium/modules/filesystem.h +++ b/epicardium/modules/filesystem.h @@ -22,4 +22,13 @@ int fatfs_attach(void); /** close all opened FDs, sync and deinitialize FLASH layer */ void fatfs_detach(void); +/** close all onpened FDs + * TODO: add ability to close FDs opened by core0/core1 only + */ +#define EPICARDIUM_COREMASK_0 0x01 +#define EPICARDIUM_COREMASK_1 0x02 +#define EPICARDIUM_COREMASK_BOTH 0x03 + +void fatfs_close_all(int coreMask); + #endif//EPICARDIUM_MODULE_FILESYSTEM_INCLUDED diff --git a/epicardium/modules/hardware.c b/epicardium/modules/hardware.c index 44ae9ab75dd0f9dd7223f40837db38e6b2d47e08..01d76545607e64c0ea08cf48f1ebb578445e3d7b 100644 --- a/epicardium/modules/hardware.c +++ b/epicardium/modules/hardware.c @@ -206,6 +206,11 @@ int hardware_reset(void) api_interrupt_init(); api_dispatcher_init(); + /* + * close all FDs currently owned by core1 + */ + fatfs_close_all(EPICARDIUM_COREMASK_1); + /* Personal State */ const int personal_state_is_persistent = epic_personal_state_is_persistent();