From 66fd027b962d8f9288c083d50ecdd5944818a180 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20S=C3=B6ntgen?= Date: Mon, 13 Dec 2021 15:32:21 +0100 Subject: [PATCH] base-hw: introduce 'cache_line_size' call This call is used to query the cache line size of the underlying CPU. For now it is only implemented and used by 'arm_v8' platforms. It does not distinguish between D-/I-cache sizes and always uses the smallest size. Furthermore it does not account for any discrepancy in 'big.little' CPUs. Issue #4339. --- repos/base-hw/include/kernel/interface.h | 26 ++++++++++++++----- repos/base-hw/src/core/kernel/thread.cc | 1 + repos/base-hw/src/core/kernel/thread.h | 1 + .../src/core/spec/arm/kernel/thread_caches.cc | 7 +++++ .../src/core/spec/riscv/kernel/thread.cc | 6 +++++ .../src/core/spec/x86_64/kernel/thread.cc | 6 +++++ 6 files changed, 40 insertions(+), 7 deletions(-) diff --git a/repos/base-hw/include/kernel/interface.h b/repos/base-hw/include/kernel/interface.h index af8255b218..f636b60075 100644 --- a/repos/base-hw/include/kernel/interface.h +++ b/repos/base-hw/include/kernel/interface.h @@ -38,13 +38,14 @@ namespace Kernel { constexpr Call_arg call_id_cache_coherent_region() { return 13; } constexpr Call_arg call_id_cache_clean_inv_region() { return 14; } constexpr Call_arg call_id_cache_inv_region() { return 15; } - constexpr Call_arg call_id_ack_cap() { return 16; } - constexpr Call_arg call_id_delete_cap() { return 17; } - constexpr Call_arg call_id_timeout() { return 18; } - constexpr Call_arg call_id_timeout_max_us() { return 19; } - constexpr Call_arg call_id_time() { return 20; } - constexpr Call_arg call_id_run_vm() { return 21; } - constexpr Call_arg call_id_pause_vm() { return 22; } + constexpr Call_arg call_id_cache_line_size() { return 16; } + constexpr Call_arg call_id_ack_cap() { return 17; } + constexpr Call_arg call_id_delete_cap() { return 18; } + constexpr Call_arg call_id_timeout() { return 19; } + constexpr Call_arg call_id_timeout_max_us() { return 20; } + constexpr Call_arg call_id_time() { return 21; } + constexpr Call_arg call_id_run_vm() { return 22; } + constexpr Call_arg call_id_pause_vm() { return 23; } /***************************************************************** @@ -214,6 +215,17 @@ namespace Kernel { } + /** + * Get cache line size + * + * \param vm pointer to vm kernel object + */ + inline size_t cache_line_size() + { + return (size_t)call(call_id_cache_line_size()); + } + + /** * Send request message and await reception of corresponding reply message * diff --git a/repos/base-hw/src/core/kernel/thread.cc b/repos/base-hw/src/core/kernel/thread.cc index a5f3b37593..8feb09c4ce 100644 --- a/repos/base-hw/src/core/kernel/thread.cc +++ b/repos/base-hw/src/core/kernel/thread.cc @@ -800,6 +800,7 @@ void Thread::_call() case call_id_cache_coherent_region(): _call_cache_coherent_region(); return; case call_id_cache_clean_inv_region(): _call_cache_clean_invalidate_data_region(); return; case call_id_cache_inv_region(): _call_cache_invalidate_data_region(); return; + case call_id_cache_line_size(): _call_cache_line_size(); return; case call_id_stop_thread(): _call_stop_thread(); return; case call_id_restart_thread(): _call_restart_thread(); return; case call_id_yield_thread(): _call_yield_thread(); return; diff --git a/repos/base-hw/src/core/kernel/thread.h b/repos/base-hw/src/core/kernel/thread.h index 93e45c3303..8e9b5aabc6 100644 --- a/repos/base-hw/src/core/kernel/thread.h +++ b/repos/base-hw/src/core/kernel/thread.h @@ -242,6 +242,7 @@ class Kernel::Thread : private Kernel::Object, public Cpu_job, private Timeout void _call_cache_coherent_region(); void _call_cache_clean_invalidate_data_region(); void _call_cache_invalidate_data_region(); + void _call_cache_line_size(); void _call_print_char(); void _call_await_signal(); void _call_pending_signal(); diff --git a/repos/base-hw/src/core/spec/arm/kernel/thread_caches.cc b/repos/base-hw/src/core/spec/arm/kernel/thread_caches.cc index 2eee9b912b..d73d8848fc 100644 --- a/repos/base-hw/src/core/spec/arm/kernel/thread_caches.cc +++ b/repos/base-hw/src/core/spec/arm/kernel/thread_caches.cc @@ -72,3 +72,10 @@ void Kernel::Thread::_call_cache_invalidate_data_region() [] (addr_t addr, size_t size) { Genode::Cpu::cache_invalidate_data_region(addr, size); }); } + + +void Kernel::Thread::_call_cache_line_size() +{ + size_t const cache_line_size = Genode::Cpu::cache_line_size(); + user_arg_0(cache_line_size); +} diff --git a/repos/base-hw/src/core/spec/riscv/kernel/thread.cc b/repos/base-hw/src/core/spec/riscv/kernel/thread.cc index 10814fde15..a1eb924bed 100644 --- a/repos/base-hw/src/core/spec/riscv/kernel/thread.cc +++ b/repos/base-hw/src/core/spec/riscv/kernel/thread.cc @@ -98,6 +98,12 @@ void Kernel::Thread::_call_cache_clean_invalidate_data_region() { } void Kernel::Thread::_call_cache_invalidate_data_region() { } +void Kernel::Thread::_call_cache_line_size() +{ + user_arg_0(0); +} + + void Kernel::Thread::proceed(Cpu & cpu) { /* diff --git a/repos/base-hw/src/core/spec/x86_64/kernel/thread.cc b/repos/base-hw/src/core/spec/x86_64/kernel/thread.cc index df3332a4de..09fc86c9cb 100644 --- a/repos/base-hw/src/core/spec/x86_64/kernel/thread.cc +++ b/repos/base-hw/src/core/spec/x86_64/kernel/thread.cc @@ -41,6 +41,12 @@ void Kernel::Thread::_call_cache_clean_invalidate_data_region() { } void Kernel::Thread::_call_cache_invalidate_data_region() { } +void Kernel::Thread::_call_cache_line_size() +{ + user_arg_0(0); +} + + void Kernel::Thread::proceed(Cpu & cpu) { if (!cpu.active(pd().mmu_regs) && type() != CORE)