From 6e30d00eefe0bf70e45ce2b1b4271b16468b7e9d Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Tue, 20 Jun 2023 14:46:54 +0200 Subject: [PATCH] base: remove env_deprecated from signalling code Issue #4784 --- .../src/include/signal_source/client.h | 3 +- .../src/lib/base/signal_source_client.cc | 7 +--- repos/base-hw/src/lib/base/signal_receiver.cc | 5 ++- .../src/include/signal_source/client.h | 3 +- .../src/include/signal_source/client.h | 10 +++-- repos/base/include/base/signal.h | 3 ++ repos/base/src/core/signal_receiver.cc | 22 ++++++++++- .../base/src/include/base/internal/globals.h | 1 + repos/base/src/include/signal_source/client.h | 3 +- repos/base/src/lib/base/component.cc | 1 + repos/base/src/lib/base/signal.cc | 39 ++++++++++++++----- repos/base/src/lib/base/signal_common.cc | 3 +- 12 files changed, 76 insertions(+), 24 deletions(-) diff --git a/repos/base-foc/src/include/signal_source/client.h b/repos/base-foc/src/include/signal_source/client.h index 74f0fae808..27ec10b92d 100644 --- a/repos/base-foc/src/include/signal_source/client.h +++ b/repos/base-foc/src/include/signal_source/client.h @@ -25,6 +25,7 @@ #include #include +#include #include namespace Genode { class Signal_source_client; } @@ -44,7 +45,7 @@ class Genode::Signal_source_client : public Rpc_client /** * Constructor */ - Signal_source_client(Capability cap); + Signal_source_client(Cpu_session &, Capability cap); /** * Destructor diff --git a/repos/base-foc/src/lib/base/signal_source_client.cc b/repos/base-foc/src/lib/base/signal_source_client.cc index 01f3592837..348cafd900 100644 --- a/repos/base-foc/src/lib/base/signal_source_client.cc +++ b/repos/base-foc/src/lib/base/signal_source_client.cc @@ -15,9 +15,6 @@ /* Genode includes */ #include #include -#include -#include -#include /* base-internal includes */ #include @@ -30,7 +27,7 @@ using namespace Genode; -Signal_source_client::Signal_source_client(Capability cap) +Signal_source_client::Signal_source_client(Cpu_session &cpu, Capability cap) : Rpc_client(static_cap_cast(cap)), @@ -39,7 +36,7 @@ Signal_source_client::Signal_source_client(Capability cap) { using namespace Foc; - Foc_native_cpu_client cpu_client(env_deprecated()->cpu_session()->native_cpu()); + Foc_native_cpu_client cpu_client(cpu.native_cpu()); Native_capability thread_cap = cpu_client.native_cap(Thread::myself()->cap()); l4_msgtag_t tag = l4_rcv_ep_bind_thread(_sem.data()->kcap(), thread_cap.data()->kcap(), 0); if (l4_error(tag)) diff --git a/repos/base-hw/src/lib/base/signal_receiver.cc b/repos/base-hw/src/lib/base/signal_receiver.cc index a39bec0602..55c1e609a7 100644 --- a/repos/base-hw/src/lib/base/signal_receiver.cc +++ b/repos/base-hw/src/lib/base/signal_receiver.cc @@ -47,7 +47,10 @@ void Genode::init_signal_thread(Env &env) { _pd_ptr = &env.pd(); } void Genode::destroy_signal_thread() { } -Signal_receiver::Signal_receiver() +void Genode::init_signal_receiver(Pd_session &, Parent &) { } + + +Signal_receiver::Signal_receiver() : _pd(pd()) { for (;;) { diff --git a/repos/base-nova/src/include/signal_source/client.h b/repos/base-nova/src/include/signal_source/client.h index 5a0159cbd6..ac64d000c8 100644 --- a/repos/base-nova/src/include/signal_source/client.h +++ b/repos/base-nova/src/include/signal_source/client.h @@ -23,6 +23,7 @@ /* Genode includes */ #include +#include #include /* base-internal includes */ @@ -49,7 +50,7 @@ namespace Genode { /** * Constructor */ - Signal_source_client(Capability cap) + Signal_source_client(Cpu_session &, Capability cap) : Rpc_client(static_cap_cast(cap)) { /* request mapping of semaphore capability selector */ diff --git a/repos/base-sel4/src/include/signal_source/client.h b/repos/base-sel4/src/include/signal_source/client.h index aed4ec5bbf..bb9c5c7143 100644 --- a/repos/base-sel4/src/include/signal_source/client.h +++ b/repos/base-sel4/src/include/signal_source/client.h @@ -18,6 +18,7 @@ #include #include #include +#include namespace Genode { class Signal_source_client; } @@ -38,9 +39,12 @@ class Genode::Signal_source_client : public Rpc_client /** * Constructor */ - Signal_source_client(Capability cap) - : Rpc_client(static_cap_cast(cap)) - { _init_notify(); } + Signal_source_client(Cpu_session &, Capability cap) + : + Rpc_client(static_cap_cast(cap)) + { + _init_notify(); + } /***************************** diff --git a/repos/base/include/base/signal.h b/repos/base/include/base/signal.h index 4ee1e0085c..2668507617 100644 --- a/repos/base/include/base/signal.h +++ b/repos/base/include/base/signal.h @@ -30,6 +30,7 @@ namespace Genode { class Entrypoint; class Rpc_entrypoint; + class Pd_session; class Signal_source; class Signal_receiver; @@ -314,6 +315,8 @@ class Genode::Signal_receiver : Noncopyable } }; + Pd_session &_pd; + /** * Semaphore used to indicate that signal(s) are ready to be picked * up. This is needed for platforms other than 'base-hw' only. diff --git a/repos/base/src/core/signal_receiver.cc b/repos/base/src/core/signal_receiver.cc index c3fb1c6e29..c332eab62f 100644 --- a/repos/base/src/core/signal_receiver.cc +++ b/repos/base/src/core/signal_receiver.cc @@ -28,18 +28,33 @@ using namespace Core; -Signal_receiver::Signal_receiver() { } +static Pd_session *_pd_ptr; + + +Signal_receiver::Signal_receiver() : _pd(*_pd_ptr) +{ + if (!_pd_ptr) { + struct Missing_call_of_init_signal_receiver { }; + for(;;); + throw Missing_call_of_init_signal_receiver(); + } +} + void Signal_receiver::_platform_destructor() { } void Signal_receiver::_platform_begin_dissolve (Signal_context *) { } void Signal_receiver::_platform_finish_dissolve(Signal_context *) { } + void Signal_receiver::unblock_signal_waiter(Rpc_entrypoint &) { ASSERT_NEVER_CALLED; } + typedef Signal_context_capability Sigh_cap; + Sigh_cap Signal_receiver::manage(Signal_context *) { ASSERT_NEVER_CALLED; } + void Signal_receiver::block_for_signal() { /* @@ -51,7 +66,12 @@ void Signal_receiver::block_for_signal() sleep_forever(); } + Signal Signal_receiver::pending_signal() { return Signal(); } + void Signal_receiver::local_submit(Signal::Data) { ASSERT_NEVER_CALLED; } + + +void Genode::init_signal_receiver(Pd_session &pd, Parent &) { _pd_ptr = &pd; } diff --git a/repos/base/src/include/base/internal/globals.h b/repos/base/src/include/base/internal/globals.h index daf36eaebc..c28ac27291 100644 --- a/repos/base/src/include/base/internal/globals.h +++ b/repos/base/src/include/base/internal/globals.h @@ -30,6 +30,7 @@ namespace Genode { void init_stack_area(); void init_exception_handling(Env &); void init_signal_transmitter(Env &); + void init_signal_receiver(Pd_session &, Parent &); void init_cxx_heap(Env &); void init_cxx_guard(); void init_ldso_phdr(Env &); diff --git a/repos/base/src/include/signal_source/client.h b/repos/base/src/include/signal_source/client.h index 42f5f9672f..949b396adf 100644 --- a/repos/base/src/include/signal_source/client.h +++ b/repos/base/src/include/signal_source/client.h @@ -16,13 +16,14 @@ #include #include +#include #include namespace Genode { class Signal_source_client; } struct Genode::Signal_source_client : Rpc_client { - Signal_source_client(Capability signal_source) + Signal_source_client(Cpu_session &, Capability signal_source) : Rpc_client(signal_source) { } Signal wait_for_signal() override { return call(); } diff --git a/repos/base/src/lib/base/component.cc b/repos/base/src/lib/base/component.cc index 82b8642ca7..50c0cb7a9a 100644 --- a/repos/base/src/lib/base/component.cc +++ b/repos/base/src/lib/base/component.cc @@ -243,6 +243,7 @@ struct Genode::Startup ::Env env { ep }; bool const exception_handling = (init_exception_handling(env), true); + bool const signal_receiver = (init_signal_receiver(env.pd(), env.parent()), true); /* * The construction of the main entrypoint does never return. diff --git a/repos/base/src/lib/base/signal.cc b/repos/base/src/lib/base/signal.cc index 2edfcb965f..e4f488d517 100644 --- a/repos/base/src/lib/base/signal.cc +++ b/repos/base/src/lib/base/signal.cc @@ -19,7 +19,6 @@ #include #include #include -#include /* base-internal includes */ #include @@ -28,10 +27,14 @@ using namespace Genode; + class Signal_handler_thread : Thread, Blockade { private: + Pd_session &_pd; + Cpu_session &_cpu; + /** * Actual signal source * @@ -43,7 +46,7 @@ class Signal_handler_thread : Thread, Blockade void entry() override { - _signal_source.construct(env_deprecated()->pd_session()->alloc_signal_source()); + _signal_source.construct(_cpu, _pd.alloc_signal_source()); wakeup(); Signal_receiver::dispatch_signals(&(*_signal_source)); } @@ -56,7 +59,8 @@ class Signal_handler_thread : Thread, Blockade * Constructor */ Signal_handler_thread(Env &env) - : Thread(env, "signal handler", STACK_SIZE) + : + Thread(env, "signal handler", STACK_SIZE), _pd(env.pd()), _cpu(env.cpu()) { start(); @@ -70,7 +74,7 @@ class Signal_handler_thread : Thread, Blockade ~Signal_handler_thread() { - env_deprecated()->pd_session()->free_signal_source(_signal_source->rpc_cap()); + _pd.free_signal_source(_signal_source->rpc_cap()); } }; @@ -202,7 +206,17 @@ Genode::Signal_context_registry *signal_context_registry() ** Signal receiver ** *********************/ -Signal_receiver::Signal_receiver() { } +static Pd_session *_pd_ptr; +static Parent *_parent_ptr; + + +Signal_receiver::Signal_receiver() : _pd(*_pd_ptr) +{ + if (!_pd_ptr) { + struct Missing_call_of_init_signal_receiver { }; + throw Missing_call_of_init_signal_receiver(); + } +} Signal_context_capability Signal_receiver::manage(Signal_context *context) @@ -227,7 +241,7 @@ Signal_context_capability Signal_receiver::manage(Signal_context *context) try { /* use signal context as imprint */ - context->_cap = env_deprecated()->pd_session()->alloc_context(_cap, (long)context); + context->_cap = _pd.alloc_context(_cap, (long)context); break; } catch (Out_of_ram) { ram_upgrade = Ram_quota { 1024*sizeof(long) }; } @@ -236,9 +250,9 @@ Signal_context_capability Signal_receiver::manage(Signal_context *context) log("upgrading quota donation for PD session " "(", ram_upgrade, " bytes, ", cap_upgrade, " caps)"); - env_deprecated()->parent()->upgrade(Parent::Env::pd(), - String<100>("ram_quota=", ram_upgrade, ", " - "cap_quota=", cap_upgrade).string()); + _parent_ptr->upgrade(Parent::Env::pd(), + String<100>("ram_quota=", ram_upgrade, ", " + "cap_quota=", cap_upgrade).string()); } return context->_cap; @@ -360,3 +374,10 @@ void Signal_receiver::_platform_finish_dissolve(Signal_context *) { } void Signal_receiver::_platform_destructor() { } + + +void Genode::init_signal_receiver(Pd_session &pd, Parent &parent) +{ + _pd_ptr = &pd; + _parent_ptr = &parent; +} diff --git a/repos/base/src/lib/base/signal_common.cc b/repos/base/src/lib/base/signal_common.cc index e1eb8bc1a9..9d842f6042 100644 --- a/repos/base/src/lib/base/signal_common.cc +++ b/repos/base/src/lib/base/signal_common.cc @@ -17,7 +17,6 @@ #include #include #include -#include using namespace Genode; @@ -178,7 +177,7 @@ Signal_receiver::~Signal_receiver() void Signal_receiver::_unsynchronized_dissolve(Signal_context * const context) { /* tell core to stop sending signals referring to the context */ - env_deprecated()->pd_session()->free_context(context->_cap); + _pd.free_context(context->_cap); /* restore default initialization of signal context */ context->_receiver = nullptr;