From 80c4b030051cfbfef9baf2914bb10e9bc5af34c6 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Wed, 20 Jul 2022 15:42:04 +0200 Subject: [PATCH] hw/misc: esp32_dport: fix cache invalidation Reported in https://github.com/espressif/qemu/issues/46 --- hw/misc/esp32_dport.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/hw/misc/esp32_dport.c b/hw/misc/esp32_dport.c index d72161b778..3d770279ba 100644 --- a/hw/misc/esp32_dport.c +++ b/hw/misc/esp32_dport.c @@ -42,6 +42,7 @@ static void esp32_cache_state_update(Esp32CacheState* cs); static void esp32_cache_data_sync(Esp32CacheRegionState* crs); +static void esp32_cache_invalidate_all_entries(Esp32CacheRegionState* crs); static inline uint32_t get_mmu_entry(Esp32CacheRegionState* crs, hwaddr base, hwaddr addr) { @@ -159,7 +160,9 @@ static void esp32_dport_write(void *opaque, hwaddr addr, if (FIELD_EX32(value, DPORT_PRO_CACHE_CTRL, CACHE_FLUSH_ENA)) { value |= R_DPORT_PRO_CACHE_CTRL_CACHE_FLUSH_DONE_MASK; value &= ~R_DPORT_PRO_CACHE_CTRL_CACHE_FLUSH_ENA_MASK; + esp32_cache_invalidate_all_entries(&s->cache_state[0].drom0); esp32_cache_data_sync(&s->cache_state[0].drom0); + esp32_cache_invalidate_all_entries(&s->cache_state[0].iram0); esp32_cache_data_sync(&s->cache_state[0].iram0); } old_val = s->cache_state[0].cache_ctrl_reg; @@ -179,7 +182,9 @@ static void esp32_dport_write(void *opaque, hwaddr addr, if (FIELD_EX32(value, DPORT_APP_CACHE_CTRL, CACHE_FLUSH_ENA)) { value |= R_DPORT_APP_CACHE_CTRL_CACHE_FLUSH_DONE_MASK; value &= ~R_DPORT_APP_CACHE_CTRL_CACHE_FLUSH_ENA_MASK; + esp32_cache_invalidate_all_entries(&s->cache_state[1].drom0); esp32_cache_data_sync(&s->cache_state[1].drom0); + esp32_cache_invalidate_all_entries(&s->cache_state[1].iram0); esp32_cache_data_sync(&s->cache_state[1].iram0); } old_val = s->cache_state[1].cache_ctrl_reg; @@ -266,6 +271,13 @@ static void esp32_cache_data_sync(Esp32CacheRegionState* crs) memory_region_flush_rom_device(&crs->mem, 0, ESP32_CACHE_REGION_SIZE); } +static void esp32_cache_invalidate_all_entries(Esp32CacheRegionState* crs) +{ + for (int i = 0; i < ESP32_CACHE_PAGES_PER_REGION; ++i) { + crs->mmu_table[i] |= ESP32_CACHE_MMU_ENTRY_CHANGED; + } +} + static void esp32_cache_state_update(Esp32CacheState* cs) { bool cache_enabled = FIELD_EX32(cs->cache_ctrl_reg, DPORT_PRO_CACHE_CTRL, CACHE_ENA) != 0; -- 2.32.0 (Apple Git-132)