From a0fb9447211ce02ebb4ef9d3cb968958e9b79026 Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Wed, 2 Dec 2020 10:30:22 +0100 Subject: [PATCH] Propagate session diag flag to core This commit restores the diag feature for selecting diagnostic output of services provided by core. This feature became unavailable with commit "base: remove dependency from deprecated APIs", which hard-wired the diag flag for core services to false. To control this feature, three possible policies can be expressed in a routing target of init's configuration: * Forcing silence by specifying 'diag="no"' * Enabling diagnostics by specifying 'diag="yes"' * Forwarding the preference of the client by omitting the 'diag' attribute Fixes #3962 --- repos/base/include/base/child.h | 6 ++++-- repos/base/include/base/local_connection.h | 2 +- repos/base/include/base/session_state.h | 4 ++++ repos/base/lib/symbols/ld | 4 ++-- repos/base/src/core/main.cc | 5 +++-- repos/base/src/lib/base/child.cc | 10 ++++++---- repos/base/src/lib/base/session_state.cc | 3 ++- repos/base/src/test/rm_fault/main.cc | 5 +++-- repos/demo/include/launchpad/launchpad.h | 5 +++-- repos/libports/src/lib/libc/fork.cc | 5 +++-- repos/os/include/os/slave.h | 5 +++-- repos/os/src/app/sequence/main.cc | 5 +++-- repos/os/src/lib/sandbox/child.cc | 12 ++++++------ repos/os/src/lib/sandbox/child.h | 5 +++-- repos/os/src/lib/sandbox/server.cc | 8 +++++--- repos/os/src/server/loader/child.h | 5 +++-- repos/os/src/test/bomb/main.cc | 5 +++-- repos/os/src/test/fault_detection/main.cc | 5 +++-- repos/ports/src/app/gdb_monitor/app_child.h | 5 +++-- 19 files changed, 63 insertions(+), 41 deletions(-) diff --git a/repos/base/include/base/child.h b/repos/base/include/base/child.h index 8c7b33a9d9..cfcf8e7844 100644 --- a/repos/base/include/base/child.h +++ b/repos/base/include/base/child.h @@ -83,7 +83,8 @@ struct Genode::Child_policy * \throw Service_denied */ virtual Route resolve_session_request(Service::Name const &, - Session_label const &) = 0; + Session_label const &, + Session::Diag) = 0; /** * Apply transformations to session arguments @@ -575,7 +576,8 @@ class Genode::Child : protected Rpc_object, try { Child_policy::Route const route = _child._policy.resolve_session_request(_service_name(), - label_from_args(_args.string())); + label_from_args(_args.string()), + session_diag_from_args(_args.string())); _env_service.construct(_child, route.service); _connection.construct(*_env_service, _child._id_space, _client_id, _args, _child._policy.filter_session_affinity(Affinity()), diff --git a/repos/base/include/base/local_connection.h b/repos/base/include/base/local_connection.h index 729d22112d..56c1d2e721 100644 --- a/repos/base/include/base/local_connection.h +++ b/repos/base/include/base/local_connection.h @@ -68,7 +68,7 @@ struct Genode::Local_connection_base : Noncopyable { enum { NUM_ATTEMPTS = 10 }; for (unsigned i = 0; i < NUM_ATTEMPTS; i++) { - _session_state.construct(service, id_space, id, label, + _session_state.construct(service, id_space, id, label, diag, _init_args(args, resources, diag), affinity); diff --git a/repos/base/include/base/session_state.h b/repos/base/include/base/session_state.h index 131367bc3a..f56af45e71 100644 --- a/repos/base/include/base/session_state.h +++ b/repos/base/include/base/session_state.h @@ -65,6 +65,7 @@ class Genode::Session_state : public Parent::Client, public Parent::Server Reconstructible::Element> _id_at_client; Session::Label const _label; + Session::Diag const _diag; Args _args; Affinity _affinity; @@ -138,6 +139,7 @@ class Genode::Session_state : public Parent::Client, public Parent::Server Id_space &client_id_space, Parent::Client::Id client_id, Session::Label const &label, + Session::Diag diag, Args const &args, Affinity const &affinity); @@ -179,6 +181,8 @@ class Genode::Session_state : public Parent::Client, public Parent::Server Args const &args() const { return _args; } + Session::Diag diag() const { return _diag; } + Affinity const &affinity() const { return _affinity; } void generate_session_request(Xml_generator &) const; diff --git a/repos/base/lib/symbols/ld b/repos/base/lib/symbols/ld index 3cfbdd7466..b8a8d91882 100644 --- a/repos/base/lib/symbols/ld +++ b/repos/base/lib/symbols/ld @@ -92,8 +92,8 @@ _ZN6Genode13Registry_base7_insertERNS0_7ElementE T _ZN6Genode13Registry_base7_removeERNS0_7ElementE T _ZN6Genode13Registry_base9_for_eachERNS0_15Untyped_functorE T _ZN6Genode13Session_state7destroyEv T -_ZN6Genode13Session_stateC1ERNS_7ServiceERNS_8Id_spaceINS_6Parent6ClientEEENS6_2IdERKNS_13Session_labelERKNS_6StringILm256EEERKNS_8AffinityE T -_ZN6Genode13Session_stateC2ERNS_7ServiceERNS_8Id_spaceINS_6Parent6ClientEEENS6_2IdERKNS_13Session_labelERKNS_6StringILm256EEERKNS_8AffinityE T +_ZN6Genode13Session_stateC1ERNS_7ServiceERNS_8Id_spaceINS_6Parent6ClientEEENS6_2IdERKNS_13Session_labelENS_7Session4DiagERKNS_6StringILm256EEERKNS_8AffinityE T +_ZN6Genode13Session_stateC2ERNS_7ServiceERNS_8Id_spaceINS_6Parent6ClientEEENS6_2IdERKNS_13Session_labelENS_7Session4DiagERKNS_6StringILm256EEERKNS_8AffinityE T _ZN6Genode13Shared_objectC1ERNS_3EnvERNS_9AllocatorEPKcNS0_4BindENS0_4KeepE T _ZN6Genode13Shared_objectC2ERNS_3EnvERNS_9AllocatorEPKcNS0_4BindENS0_4KeepE T _ZN6Genode13Shared_objectD1Ev T diff --git a/repos/base/src/core/main.cc b/repos/base/src/core/main.cc index d480585221..234bc455f6 100644 --- a/repos/base/src/core/main.cc +++ b/repos/base/src/core/main.cc @@ -146,7 +146,8 @@ class Core_child : public Child_policy Name name() const override { return "init"; } Route resolve_session_request(Service::Name const &name, - Session_label const &label) override + Session_label const &label, + Session::Diag const diag) override { Service *service = nullptr; _services.for_each([&] (Service &s) { @@ -158,7 +159,7 @@ class Core_child : public Child_policy return Route { .service = *service, .label = label, - .diag = Session::Diag() }; + .diag = diag }; } void init(Pd_session &session, Capability cap) override diff --git a/repos/base/src/lib/base/child.cc b/repos/base/src/lib/base/child.cc index 898e890d80..8c80318fbd 100644 --- a/repos/base/src/lib/base/child.cc +++ b/repos/base/src/lib/base/child.cc @@ -100,13 +100,13 @@ void Child::session_sigh(Signal_context_capability sigh) */ Session_state & create_session(Child_policy::Name const &child_name, Service &service, - Session_label const &label, + Session_label const &label, Session::Diag diag, Session_state::Factory &factory, Id_space &id_space, Parent::Client::Id id, Session_state::Args const &args, Affinity const &affinity) { try { - return service.create_session(factory, id_space, id, label, args, affinity); } + return service.create_session(factory, id_space, id, label, diag, args, affinity); } catch (Insufficient_ram_quota) { error(child_name, " requested session with insufficient RAM quota"); @@ -174,7 +174,9 @@ Session_capability Child::session(Parent::Client::Id id, Arg_string::set_arg(argbuf, sizeof(argbuf), "ram_quota", forward_ram_quota.value); /* may throw a 'Service_denied' exception */ - Child_policy::Route route = _policy.resolve_session_request(name.string(), label); + Child_policy::Route route = + _policy.resolve_session_request(name.string(), label, + session_diag_from_args(argbuf)); Service &service = route.service; @@ -182,7 +184,7 @@ Session_capability Child::session(Parent::Client::Id id, Arg_string::set_arg(argbuf, sizeof(argbuf), "diag", route.diag.enabled); Session_state &session = - create_session(_policy.name(), service, route.label, + create_session(_policy.name(), service, route.label, route.diag, _session_factory, _id_space, id, argbuf, filtered_affinity); _policy.session_state_changed(); diff --git a/repos/base/src/lib/base/session_state.cc b/repos/base/src/lib/base/session_state.cc index 279cb6bfcf..9e775bdef2 100644 --- a/repos/base/src/lib/base/session_state.cc +++ b/repos/base/src/lib/base/session_state.cc @@ -172,6 +172,7 @@ Session_state::Session_state(Service &service, Id_space &client_id_space, Parent::Client::Id client_id, Session::Label const &label, + Session::Diag const diag, Args const &args, Affinity const &affinity) : @@ -179,5 +180,5 @@ Session_state::Session_state(Service &service, _donated_ram_quota(ram_quota_from_args(args.string())), _donated_cap_quota(cap_quota_from_args(args.string())), _id_at_client(*this, client_id_space, client_id), - _label(label), _args(args), _affinity(affinity) + _label(label), _diag(diag), _args(args), _affinity(affinity) { } diff --git a/repos/base/src/test/rm_fault/main.cc b/repos/base/src/test/rm_fault/main.cc index 352b09b522..f1a87e7317 100644 --- a/repos/base/src/test/rm_fault/main.cc +++ b/repos/base/src/test/rm_fault/main.cc @@ -230,11 +230,12 @@ class Test_child_policy : public Child_policy } Route resolve_session_request(Service::Name const &name, - Session_label const &label) override + Session_label const &label, + Session::Diag const diag) override { return Route { .service = _matching_service(name), .label = label, - .diag = Session::Diag() }; + .diag = diag }; } }; diff --git a/repos/demo/include/launchpad/launchpad.h b/repos/demo/include/launchpad/launchpad.h index 5220ca150c..b609869def 100644 --- a/repos/demo/include/launchpad/launchpad.h +++ b/repos/demo/include/launchpad/launchpad.h @@ -153,12 +153,13 @@ class Launchpad_child : public Genode::Child_policy, Genode::Child_policy::Route resolve_session_request(Genode::Service::Name const &service_name, - Genode::Session_label const &label) override + Genode::Session_label const &label, + Genode::Session::Diag const diag) override { auto route = [&] (Genode::Service &service) { return Genode::Child_policy::Route { .service = service, .label = label, - .diag = Genode::Session::Diag() }; }; + .diag = diag }; }; Genode::Service *service = nullptr; diff --git a/repos/libports/src/lib/libc/fork.cc b/repos/libports/src/lib/libc/fork.cc index 4f3a9cdd07..e4f0c7fb5a 100644 --- a/repos/libports/src/lib/libc/fork.cc +++ b/repos/libports/src/lib/libc/fork.cc @@ -474,7 +474,8 @@ struct Libc::Forked_child : Child_policy, Child_ready } Route resolve_session_request(Service::Name const &name, - Session_label const &label) override + Session_label const &label, + Session::Diag const diag) override { Session_label rewritten_label = label; @@ -508,7 +509,7 @@ struct Libc::Forked_child : Child_policy, Child_ready if (service_ptr) return Route { .service = *service_ptr, .label = rewritten_label, - .diag = Session::Diag() }; + .diag = diag }; throw Service_denied(); } diff --git a/repos/os/include/os/slave.h b/repos/os/include/os/slave.h index 6ff715dcbf..f02c88e413 100644 --- a/repos/os/include/os/slave.h +++ b/repos/os/include/os/slave.h @@ -164,11 +164,12 @@ class Genode::Slave::Policy : public Child_policy } Route resolve_session_request(Service::Name const &name, - Session_label const &label) override + Session_label const &label, + Session::Diag const diag) override { return Route { .service = _matching_service(name, label), .label = label, - .diag = Session::Diag() }; + .diag = diag }; } Id_space &server_id_space() override { diff --git a/repos/os/src/app/sequence/main.cc b/repos/os/src/app/sequence/main.cc index 1069a53b1d..f5c8f8f780 100644 --- a/repos/os/src/app/sequence/main.cc +++ b/repos/os/src/app/sequence/main.cc @@ -114,12 +114,13 @@ struct Sequence::Child : Genode::Child_policy * otherwise forward directly to the parent. */ Route resolve_session_request(Service::Name const &name, - Session_label const &label) override + Session_label const &label, + Session::Diag const diag) override { auto route = [&] (Service &service) { return Route { .service = service, .label = label, - .diag = Session::Diag() }; }; + .diag = diag }; }; if (_have_config) { Service *s = diff --git a/repos/os/src/lib/sandbox/child.cc b/repos/os/src/lib/sandbox/child.cc index e321df61fd..4c1aa9fbbd 100644 --- a/repos/os/src/lib/sandbox/child.cc +++ b/repos/os/src/lib/sandbox/child.cc @@ -446,7 +446,8 @@ void Sandbox::Child::init(Cpu_session &session, Cpu_session_capability cap) Sandbox::Child::Route Sandbox::Child::resolve_session_request(Service::Name const &service_name, - Session_label const &label) + Session_label const &label, + Session::Diag const diag) { /* check for "config" ROM request */ if (service_name == Rom_session::service_name() && @@ -474,17 +475,16 @@ Sandbox::Child::resolve_session_request(Service::Name const &service_name, */ if (service_name == Rom_session::service_name() && label == _unique_name && _unique_name != _binary_name) - return resolve_session_request(service_name, _binary_name); + return resolve_session_request(service_name, _binary_name, diag); /* supply binary as dynamic linker if '' */ if (!_use_ld && service_name == Rom_session::service_name() && label == "ld.lib.so") - return resolve_session_request(service_name, _binary_name); + return resolve_session_request(service_name, _binary_name, diag); /* check for "session_requests" ROM request */ if (service_name == Rom_session::service_name() && label.last_element() == Session_requester::rom_name()) - return Route { _session_requester.service(), - Session::Label(), Session::Diag{false} }; + return Route { _session_requester.service(), Session::Label(), diag }; try { Xml_node route_node = _default_route_accessor.default_route(); @@ -517,7 +517,7 @@ Sandbox::Child::resolve_session_request(Service::Name const &service_name, target.attribute_value("label", Label(label.string())); Session::Diag const - target_diag { target.attribute_value("diag", false) }; + target_diag { target.attribute_value("diag", diag.enabled) }; auto no_filter = [] (Service &) -> bool { return false; }; diff --git a/repos/os/src/lib/sandbox/child.h b/repos/os/src/lib/sandbox/child.h index 2c213e662c..f338597f9c 100644 --- a/repos/os/src/lib/sandbox/child.h +++ b/repos/os/src/lib/sandbox/child.h @@ -385,7 +385,8 @@ class Sandbox::Child : Child_policy, Routed_service::Wakeup try { Route const route = resolve_session_request(session.service().name(), - session.client_label()); + session.client_label(), + session.diag()); return (session.service() == route.service) && (route.label == session.label()); @@ -599,7 +600,7 @@ class Sandbox::Child : Child_policy, Routed_service::Wakeup return _session_requester.id_space(); } Route resolve_session_request(Service::Name const &, - Session_label const &) override; + Session_label const &, Session::Diag) override; void filter_session_args(Service::Name const &, char *, size_t) override; Affinity filter_session_affinity(Affinity const &) override; diff --git a/repos/os/src/lib/sandbox/server.cc b/repos/os/src/lib/sandbox/server.cc index 54c338c1a1..39ea53a5f1 100644 --- a/repos/os/src/lib/sandbox/server.cc +++ b/repos/os/src/lib/sandbox/server.cc @@ -226,10 +226,12 @@ void Sandbox::Server::_handle_create_session_request(Xml_node request, Arg_string::set_arg(argbuf, sizeof(argbuf), "ram_quota", forward_ram_quota.value); + Session::Diag const diag = session_diag_from_args(args.string()); + Session_state &session = route.service.create_session(route.service.factory(), - _client_id_space, id, route.label, - argbuf, Affinity::from_xml(request)); + _client_id_space, id, route.label, + diag, argbuf, Affinity::from_xml(request)); /* transfer session quota */ try { @@ -401,7 +403,7 @@ void Sandbox::Server::apply_config(Xml_node config) session.client_label()); bool const route_unchanged = (route.service == session.service()) - && (route.label == session.label()); + && (route.label == session.label()); if (!route_unchanged) throw Service_denied(); } diff --git a/repos/os/src/server/loader/child.h b/repos/os/src/server/loader/child.h index fcba5d3433..393df50ab2 100644 --- a/repos/os/src/server/loader/child.h +++ b/repos/os/src/server/loader/child.h @@ -126,11 +126,12 @@ class Loader::Child : public Child_policy } Route resolve_session_request(Service::Name const &name, - Session_label const &label) override + Session_label const &label, + Session::Diag const diag) override { return Route { .service = _matching_service(name), .label = label, - .diag = Session::Diag() }; + .diag = diag }; } }; diff --git a/repos/os/src/test/bomb/main.cc b/repos/os/src/test/bomb/main.cc index 19f68e6503..1ddf16267d 100644 --- a/repos/os/src/test/bomb/main.cc +++ b/repos/os/src/test/bomb/main.cc @@ -101,11 +101,12 @@ class Bomb_child : public Child_policy } Route resolve_session_request(Service::Name const &service_name, - Session_label const &label) override + Session_label const &label, + Session::Diag const diag) override { return Route { .service = _matching_service(service_name, label), .label = label, - .diag = Session::Diag() }; + .diag = diag }; } }; diff --git a/repos/os/src/test/fault_detection/main.cc b/repos/os/src/test/fault_detection/main.cc index 722b101bee..8cbeb3640b 100644 --- a/repos/os/src/test/fault_detection/main.cc +++ b/repos/os/src/test/fault_detection/main.cc @@ -120,12 +120,13 @@ class Test_child : public Genode::Child_policy } Route resolve_session_request(Service::Name const &service, - Session_label const &label) override + Session_label const &label, + Session::Diag const diag) override { auto route = [&] (Service &service) { return Route { .service = service, .label = label, - .diag = Session::Diag() }; }; + .diag = diag }; }; if (service == Cpu_session::service_name()) return route(_cpu_service); if (service == Pd_session::service_name()) return route( _pd_service); diff --git a/repos/ports/src/app/gdb_monitor/app_child.h b/repos/ports/src/app/gdb_monitor/app_child.h index be8e0685d7..e6ed24bcfc 100644 --- a/repos/ports/src/app/gdb_monitor/app_child.h +++ b/repos/ports/src/app/gdb_monitor/app_child.h @@ -306,11 +306,12 @@ class Gdb_monitor::App_child : public Child_policy, } Route resolve_session_request(Service::Name const &service_name, - Session_label const &label) override + Session_label const &label, + Session::Diag const diag) override { return Route { .service = _matching_service(service_name, label), .label = label, - .diag = Session::Diag() }; + .diag = diag }; } void announce_service(Service::Name const &service_name) override