Skip to content

Commit 3bb3c19

Browse files
committed
[FIXUP] esp32_dport: fix cache invalidation
Reported in #46
1 parent b8c4c24 commit 3bb3c19

File tree

1 file changed

+12
-0
lines changed

1 file changed

+12
-0
lines changed

hw/misc/esp32_dport.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242

4343
static void esp32_cache_state_update(Esp32CacheState* cs);
4444
static void esp32_cache_data_sync(Esp32CacheRegionState* crs);
45+
static void esp32_cache_invalidate_all_entries(Esp32CacheRegionState* crs);
4546

4647
static inline uint32_t get_mmu_entry(Esp32CacheRegionState* crs, hwaddr base, hwaddr addr)
4748
{
@@ -159,7 +160,9 @@ static void esp32_dport_write(void *opaque, hwaddr addr,
159160
if (FIELD_EX32(value, DPORT_PRO_CACHE_CTRL, CACHE_FLUSH_ENA)) {
160161
value |= R_DPORT_PRO_CACHE_CTRL_CACHE_FLUSH_DONE_MASK;
161162
value &= ~R_DPORT_PRO_CACHE_CTRL_CACHE_FLUSH_ENA_MASK;
163+
esp32_cache_invalidate_all_entries(&s->cache_state[0].drom0);
162164
esp32_cache_data_sync(&s->cache_state[0].drom0);
165+
esp32_cache_invalidate_all_entries(&s->cache_state[0].iram0);
163166
esp32_cache_data_sync(&s->cache_state[0].iram0);
164167
}
165168
old_val = s->cache_state[0].cache_ctrl_reg;
@@ -179,7 +182,9 @@ static void esp32_dport_write(void *opaque, hwaddr addr,
179182
if (FIELD_EX32(value, DPORT_APP_CACHE_CTRL, CACHE_FLUSH_ENA)) {
180183
value |= R_DPORT_APP_CACHE_CTRL_CACHE_FLUSH_DONE_MASK;
181184
value &= ~R_DPORT_APP_CACHE_CTRL_CACHE_FLUSH_ENA_MASK;
185+
esp32_cache_invalidate_all_entries(&s->cache_state[1].drom0);
182186
esp32_cache_data_sync(&s->cache_state[1].drom0);
187+
esp32_cache_invalidate_all_entries(&s->cache_state[1].iram0);
183188
esp32_cache_data_sync(&s->cache_state[1].iram0);
184189
}
185190
old_val = s->cache_state[1].cache_ctrl_reg;
@@ -266,6 +271,13 @@ static void esp32_cache_data_sync(Esp32CacheRegionState* crs)
266271
memory_region_flush_rom_device(&crs->mem, 0, ESP32_CACHE_REGION_SIZE);
267272
}
268273

274+
static void esp32_cache_invalidate_all_entries(Esp32CacheRegionState* crs)
275+
{
276+
for (int i = 0; i < ESP32_CACHE_PAGES_PER_REGION; ++i) {
277+
crs->mmu_table[i] |= ESP32_CACHE_MMU_ENTRY_CHANGED;
278+
}
279+
}
280+
269281
static void esp32_cache_state_update(Esp32CacheState* cs)
270282
{
271283
bool cache_enabled = FIELD_EX32(cs->cache_ctrl_reg, DPORT_PRO_CACHE_CTRL, CACHE_ENA) != 0;

0 commit comments

Comments
 (0)