From ee38504d8167a5164aad5c5e87c04409a0d2fab0 Mon Sep 17 00:00:00 2001 From: Stefan Kalkowski Date: Wed, 10 Jul 2019 17:52:49 +0200 Subject: [PATCH] hw: implement update_data_region for ARMv8 Ref #3426 --- repos/base-hw/src/core/spec/arm_v8/cpu.cc | 9 +++++++++ repos/base-hw/src/core/spec/arm_v8/cpu.h | 1 + repos/base-hw/src/core/spec/arm_v8/kernel/thread.cc | 5 ++++- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/repos/base-hw/src/core/spec/arm_v8/cpu.cc b/repos/base-hw/src/core/spec/arm_v8/cpu.cc index 57cfbd480..bb4b526ae 100644 --- a/repos/base-hw/src/core/spec/arm_v8/cpu.cc +++ b/repos/base-hw/src/core/spec/arm_v8/cpu.cc @@ -86,6 +86,15 @@ void Genode::Cpu::clean_data_cache_by_virt_region(addr_t base, size_t sz) } +void Genode::Cpu::clean_invalidate_data_cache_by_virt_region(addr_t base, size_t sz) +{ + addr_t const top = base + sz; + base &= line_align_mask; + for (; base < top; base += line_size) { + asm volatile("dc civac, %0" :: "r" (base)); } +} + + void Genode::Cpu::invalidate_instr_cache_by_virt_region(addr_t base, size_t size) { diff --git a/repos/base-hw/src/core/spec/arm_v8/cpu.h b/repos/base-hw/src/core/spec/arm_v8/cpu.h index 337f332fa..ed1284488 100644 --- a/repos/base-hw/src/core/spec/arm_v8/cpu.h +++ b/repos/base-hw/src/core/spec/arm_v8/cpu.h @@ -87,6 +87,7 @@ struct Genode::Cpu : Hw::Arm_64_cpu static void clean_data_cache_by_virt_region(addr_t, size_t); + static void clean_invalidate_data_cache_by_virt_region(addr_t, size_t); static void invalidate_instr_cache_by_virt_region(addr_t, size_t); }; diff --git a/repos/base-hw/src/core/spec/arm_v8/kernel/thread.cc b/repos/base-hw/src/core/spec/arm_v8/kernel/thread.cc index 1f021cc3f..d8f2e0de8 100644 --- a/repos/base-hw/src/core/spec/arm_v8/kernel/thread.cc +++ b/repos/base-hw/src/core/spec/arm_v8/kernel/thread.cc @@ -106,7 +106,10 @@ bool Kernel::Pd::invalidate_tlb(Cpu &, addr_t addr, size_t size) void Kernel::Thread::_call_update_data_region() { - Genode::raw(__func__, " not implemented yet!"); + addr_t const base = (addr_t)user_arg_1(); + size_t const size = (size_t)user_arg_2(); + Cpu::clean_invalidate_data_cache_by_virt_region(base, size); + Cpu::invalidate_instr_cache_by_virt_region(base, size); }