From add6dbac4ef7798df582c18f515c0b3bce1070b4 Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Tue, 16 May 2023 17:11:36 +0200 Subject: [PATCH] sandbox: add Pd_intrinsics::start_initial_thread This hook allows for intercepting the creation of initial threads whenever a new child is started. Issue #4917 --- repos/os/include/sandbox/sandbox.h | 5 +++++ repos/os/src/lib/sandbox/child.h | 5 +++++ repos/os/src/lib/sandbox/library.cc | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/repos/os/include/sandbox/sandbox.h b/repos/os/include/sandbox/sandbox.h index 54548611b5..c04420a6aa 100644 --- a/repos/os/include/sandbox/sandbox.h +++ b/repos/os/include/sandbox/sandbox.h @@ -66,6 +66,11 @@ class Genode::Sandbox : Noncopyable * Call 'Fn' with the 'Intrinsics' that apply for the specified PD */ virtual void with_intrinsics(Capability, Pd_session &, Fn const &) = 0; + + /** + * Start the initial thread of new PD at the given instruction pointer + */ + virtual void start_initial_thread(Capability, addr_t ip) = 0; }; private: diff --git a/repos/os/src/lib/sandbox/child.h b/repos/os/src/lib/sandbox/child.h index 674d7c8f8a..263c9fb81b 100644 --- a/repos/os/src/lib/sandbox/child.h +++ b/repos/os/src/lib/sandbox/child.h @@ -782,6 +782,11 @@ class Sandbox::Child : Child_policy, Routed_service::Wakeup fn.call(intrinsics.address_space); }); } + void start_initial_thread(Capability cap, addr_t ip) override + { + _pd_intrinsics.start_initial_thread(cap, ip); + } + void yield_response() override { apply_downgrade(); diff --git a/repos/os/src/lib/sandbox/library.cc b/repos/os/src/lib/sandbox/library.cc index ab1e7f00d6..846c9f39d9 100644 --- a/repos/os/src/lib/sandbox/library.cc +++ b/repos/os/src/lib/sandbox/library.cc @@ -268,6 +268,11 @@ struct Genode::Sandbox::Library : ::Sandbox::State_reporter::Producer, fn.call(intrinsics); } + void start_initial_thread(Capability cap, addr_t ip) override + { + Cpu_thread_client(cap).start(ip, 0); + } + Default_pd_intrinsics(Env &env) : _env(env) { } } _default_pd_intrinsics { _env };