diff --git a/base-hw/include/kernel/interface.h b/base-hw/include/kernel/interface.h index 82b5be63e..23cb44e15 100644 --- a/base-hw/include/kernel/interface.h +++ b/base-hw/include/kernel/interface.h @@ -47,6 +47,7 @@ namespace Kernel constexpr Call_arg call_id_signal_pending() { return 9; } constexpr Call_arg call_id_ack_signal() { return 10; } constexpr Call_arg call_id_print_char() { return 11; } + constexpr Call_arg call_id_update_data_region() { return 12; } /***************************************************************** @@ -120,6 +121,16 @@ namespace Kernel call(call_id_yield_thread(), thread_id); } + /** + * Globally apply writes to a data region in the current domain + * + * \param base base of the region within the current domain + * \param size size of the region + */ + inline void update_data_region(addr_t const base, size_t const size) + { + call(call_id_update_data_region(), (Call_arg)base, (Call_arg)size); + } /** * Send request message and await receipt of corresponding reply message diff --git a/base-hw/src/core/kernel/core_interface.h b/base-hw/src/core/kernel/core_interface.h index 906e47efa..89823b0af 100644 --- a/base-hw/src/core/kernel/core_interface.h +++ b/base-hw/src/core/kernel/core_interface.h @@ -31,14 +31,13 @@ namespace Kernel /** * Kernel names of the kernel calls */ - constexpr Call_arg call_id_new_thread() { return 12; } - constexpr Call_arg call_id_bin_thread() { return 13; } - constexpr Call_arg call_id_start_thread() { return 14; } - constexpr Call_arg call_id_resume_thread() { return 15; } - constexpr Call_arg call_id_access_thread_regs() { return 16; } - constexpr Call_arg call_id_route_thread_event() { return 17; } - constexpr Call_arg call_id_update_pd() { return 18; } - constexpr Call_arg call_id_update_data_region() { return 19; } + constexpr Call_arg call_id_new_thread() { return 13; } + constexpr Call_arg call_id_bin_thread() { return 14; } + constexpr Call_arg call_id_start_thread() { return 15; } + constexpr Call_arg call_id_resume_thread() { return 16; } + constexpr Call_arg call_id_access_thread_regs() { return 17; } + constexpr Call_arg call_id_route_thread_event() { return 18; } + constexpr Call_arg call_id_update_pd() { return 19; } constexpr Call_arg call_id_new_pd() { return 20; } constexpr Call_arg call_id_bin_pd() { return 21; } constexpr Call_arg call_id_new_signal_receiver() { return 22; } @@ -94,20 +93,6 @@ namespace Kernel } - /** - * Write-through the cached contents of a region in the current domain - * - * \param base base of the region within the current domain - * \param size size of the region - * - * Does apply only to data caches. - */ - inline void update_data_region(addr_t const base, size_t const size) - { - call(call_id_update_data_region(), (Call_arg)base, (Call_arg)size); - } - - /** * Create a thread * diff --git a/base-hw/src/core/kernel/thread.cc b/base-hw/src/core/kernel/thread.cc index 065685cd0..36b276e47 100644 --- a/base-hw/src/core/kernel/thread.cc +++ b/base-hw/src/core/kernel/thread.cc @@ -543,9 +543,9 @@ void Thread::_call_update_pd() void Thread::_call_update_data_region() { - /* flush hardware caches */ - Processor::flush_data_caches_by_virt_region((addr_t)user_arg_1(), - (size_t)user_arg_2()); + auto base = (addr_t)user_arg_1(); + auto const size = (size_t)user_arg_2(); + Processor::flush_data_caches_by_virt_region(base, size); } @@ -855,6 +855,7 @@ void Thread::_call() /* switch over unrestricted kernel calls */ unsigned const call_id = user_arg_0(); switch (call_id) { + case call_id_update_data_region(): _call_update_data_region(); return; case call_id_pause_current_thread(): _call_pause_current_thread(); return; case call_id_resume_local_thread(): _call_resume_local_thread(); return; case call_id_yield_thread(): _call_yield_thread(); return; @@ -884,7 +885,6 @@ void Thread::_call() case call_id_access_thread_regs(): _call_access_thread_regs(); return; case call_id_route_thread_event(): _call_route_thread_event(); return; case call_id_update_pd(): _call_update_pd(); return; - case call_id_update_data_region(): _call_update_data_region(); return; case call_id_new_pd(): _call_new_pd(); return; case call_id_bin_pd(): _call_bin_pd(); return; case call_id_new_signal_receiver(): _call_new_signal_receiver(); return;