diff --git a/repos/base-hw/src/core/include/spec/arm/cpu_support.h b/repos/base-hw/src/core/include/spec/arm/cpu_support.h index 77e762088e..76a8dd4c6e 100644 --- a/repos/base-hw/src/core/include/spec/arm/cpu_support.h +++ b/repos/base-hw/src/core/include/spec/arm/cpu_support.h @@ -192,12 +192,12 @@ class Genode::Arm }; /** - * Data Cache Clean by MVA to PoC + * Data Cache Clean and Invalidate by MVA to PoC */ - struct Dccmvac : Register<32> + struct Dccimvac : Register<32> { static void write(access_t const v) { - asm volatile ("mcr p15, 0, %0, c7, c10, 1" :: "r" (v) : ); } + asm volatile ("mcr p15, 0, %0, c7, c14, 1" :: "r" (v) : ); } }; /** @@ -495,7 +495,7 @@ class Genode::Arm { addr_t const top = base + size; base &= line_align_mask; - for (; base < top; base += line_size) { Dccmvac::write(base); } + for (; base < top; base += line_size) { Dccimvac::write(base); } } /** diff --git a/repos/base-hw/src/core/ram_session_support.cc b/repos/base-hw/src/core/ram_session_support.cc index 52b615b0ec..1d0336142a 100644 --- a/repos/base-hw/src/core/ram_session_support.cc +++ b/repos/base-hw/src/core/ram_session_support.cc @@ -50,10 +50,13 @@ void Ram_session_component::_clear_ds (Dataspace_component * ds) /* clear dataspace */ memset(virt_addr, 0, page_rounded_size); - /* uncached dataspaces need to be flushed */ + /* uncached dataspaces need to be flushed from the data cache */ if (ds->cacheability() != CACHED) Kernel::update_data_region((addr_t)virt_addr, page_rounded_size); + /* invalidate the dataspace memory from instruction cache */ + Kernel::update_instr_region((addr_t)virt_addr, page_rounded_size); + /* unmap dataspace from core */ if (!unmap_local((addr_t)virt_addr, num_pages)) PERR("could not unmap core-local address range at %p", virt_addr);