Skip to content

Commit a0526d5

Browse files
modify dosfs_sflash.c to detect fault flash at boot time
1 parent 62aaa84 commit a0526d5

File tree

2 files changed

+22
-4
lines changed

2 files changed

+22
-4
lines changed

system/libstm32l4_dragonfly/dosfs_sflash.c

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1536,7 +1536,7 @@ static void dosfs_sflash_ftl_check(dosfs_sflash_t *sflash)
15361536
* the entries into the tables ...
15371537
*/
15381538

1539-
static void dosfs_sflash_ftl_collect(dosfs_sflash_t *sflash, const uint32_t *cache, uint32_t offset, uint32_t sector, uint32_t *p_data_written, uint32_t *p_data_deleted)
1539+
static bool dosfs_sflash_ftl_collect(dosfs_sflash_t *sflash, const uint32_t *cache, uint32_t offset, uint32_t sector, uint32_t *p_data_written, uint32_t *p_data_deleted)
15401540
{
15411541
unsigned int index, free_total;
15421542
uint32_t info_logical;
@@ -1563,7 +1563,7 @@ static void dosfs_sflash_ftl_collect(dosfs_sflash_t *sflash, const uint32_t *cac
15631563
case DOSFS_SFLASH_INFO_TYPE_VICTIM:
15641564
case DOSFS_SFLASH_INFO_TYPE_ERASE:
15651565
case DOSFS_SFLASH_INFO_TYPE_RECLAIM:
1566-
break;
1566+
return false;
15671567

15681568
case DOSFS_SFLASH_INFO_TYPE_DELETED:
15691569
sflash->victim_score[sector] += DOSFS_SFLASH_VICTIM_DELETED_INCREMENT;
@@ -1596,10 +1596,20 @@ static void dosfs_sflash_ftl_collect(dosfs_sflash_t *sflash, const uint32_t *cac
15961596
break;
15971597

15981598
case DOSFS_SFLASH_INFO_TYPE_XLATE:
1599+
if ((cache[index] & DOSFS_SFLASH_INFO_DATA_MASK) >= DOSFS_SFLASH_XLATE_COUNT)
1600+
{
1601+
return false;
1602+
}
1603+
15991604
sflash->xlate_table[cache[index] & DOSFS_SFLASH_INFO_DATA_MASK] = info_logical;
16001605
break;
16011606

16021607
case DOSFS_SFLASH_INFO_TYPE_XLATE_SECONDARY:
1608+
if ((cache[index] & DOSFS_SFLASH_INFO_DATA_MASK) >= DOSFS_SFLASH_XLATE_COUNT)
1609+
{
1610+
return false;
1611+
}
1612+
16031613
sflash->xlate2_table[cache[index] & DOSFS_SFLASH_INFO_DATA_MASK] = info_logical;
16041614
break;
16051615

@@ -1619,6 +1629,8 @@ static void dosfs_sflash_ftl_collect(dosfs_sflash_t *sflash, const uint32_t *cac
16191629
}
16201630

16211631
sflash->alloc_free += free_total;
1632+
1633+
return true;
16221634
}
16231635

16241636
static bool dosfs_sflash_ftl_mount(dosfs_sflash_t *sflash)
@@ -1725,7 +1737,10 @@ static bool dosfs_sflash_ftl_mount(dosfs_sflash_t *sflash)
17251737
sflash->victim_sector = (cache[0] & DOSFS_SFLASH_INFO_DATA_MASK);
17261738
}
17271739

1728-
dosfs_sflash_ftl_collect(sflash, cache, offset, (cache[0] & DOSFS_SFLASH_INFO_DATA_MASK), &data_written[0], &data_deleted[0]);
1740+
if (!dosfs_sflash_ftl_collect(sflash, cache, offset, (cache[0] & DOSFS_SFLASH_INFO_DATA_MASK), &data_written[0], &data_deleted[0]))
1741+
{
1742+
return false;
1743+
}
17291744
break;
17301745

17311746
case DOSFS_SFLASH_INFO_TYPE_RECLAIM:
@@ -1855,7 +1870,10 @@ static bool dosfs_sflash_ftl_mount(dosfs_sflash_t *sflash)
18551870

18561871
dosfs_sflash_nor_write(sflash, reclaim_offset, 4, (const uint8_t*)cache); /* RECLAIM -> ERASE */
18571872

1858-
dosfs_sflash_ftl_collect(sflash, cache, reclaim_offset, (cache[0] & DOSFS_SFLASH_INFO_DATA_MASK), &data_written[0], &data_deleted[0]);
1873+
if (!dosfs_sflash_ftl_collect(sflash, cache, reclaim_offset, (cache[0] & DOSFS_SFLASH_INFO_DATA_MASK), &data_written[0], &data_deleted[0]))
1874+
{
1875+
return false;
1876+
}
18591877
}
18601878
}
18611879

-920 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)