mirror of
https://github.com/genodelabs/genode.git
synced 2025-06-17 14:48:20 +00:00
@ -54,11 +54,11 @@ Init::Child::apply_config(Xml_node start_node)
|
||||
|
||||
Config_update config_update = CONFIG_UNCHANGED;
|
||||
|
||||
/* import new start node if new version differs */
|
||||
if (start_node.size() != _start_node->xml().size() ||
|
||||
Genode::memcmp(start_node.addr(), _start_node->xml().addr(),
|
||||
start_node.size()) != 0)
|
||||
{
|
||||
/*
|
||||
* Import new start node if new version differs
|
||||
*/
|
||||
if (start_node.differs_from(_start_node->xml())) {
|
||||
|
||||
/*
|
||||
* Check for a change of the version attribute, force restart
|
||||
* if the version changed.
|
||||
@ -85,11 +85,10 @@ Init::Child::apply_config(Xml_node start_node)
|
||||
|
||||
if (config_was_present && config_is_present) {
|
||||
|
||||
Xml_node old_config = _start_node->xml().sub_node(tag);
|
||||
Xml_node new_config = start_node.sub_node(tag);
|
||||
Xml_node const old_config = _start_node->xml().sub_node(tag);
|
||||
Xml_node const new_config = start_node.sub_node(tag);
|
||||
|
||||
if (Genode::memcmp(old_config.addr(), new_config.addr(),
|
||||
min(old_config.size(), new_config.size())))
|
||||
if (new_config.differs_from(old_config))
|
||||
config_update = CONFIG_CHANGED;
|
||||
}
|
||||
|
||||
@ -354,14 +353,14 @@ void Init::Child::report_state(Xml_generator &xml, Report_detail const &detail)
|
||||
if (_heartbeat_enabled && _child.skipped_heartbeats())
|
||||
xml.attribute("skipped_heartbeats", _child.skipped_heartbeats());
|
||||
|
||||
if (detail.child_ram() && _child.ram_session_cap().valid()) {
|
||||
if (detail.child_ram() && _child.pd_session_cap().valid()) {
|
||||
xml.node("ram", [&] () {
|
||||
|
||||
xml.attribute("assigned", String<32> {
|
||||
Number_of_bytes(_resources.assigned_ram_quota.value) });
|
||||
|
||||
if (pd_alive)
|
||||
generate_ram_info(xml, _child.ram());
|
||||
generate_ram_info(xml, _child.pd());
|
||||
|
||||
if (_requested_resources.constructed() && _requested_resources->ram.value)
|
||||
xml.attribute("requested", String<32>(_requested_resources->ram));
|
||||
@ -423,7 +422,7 @@ void Init::Child::init(Pd_session &session, Pd_session_capability cap)
|
||||
catch (Out_of_caps) {
|
||||
error(name(), ": unable to initialize cap quota of PD"); }
|
||||
|
||||
try { _env.ram().transfer_quota(cap, ram_quota); }
|
||||
try { _env.pd().transfer_quota(cap, ram_quota); }
|
||||
catch (Out_of_ram) {
|
||||
error(name(), ": unable to initialize RAM quota of PD"); }
|
||||
}
|
||||
|
@ -286,15 +286,18 @@ class Init::Child : Child_policy, Routed_service::Wakeup
|
||||
if (config_len + 1 /* null termination */ >= dst_len)
|
||||
throw Buffer_capacity_exceeded();
|
||||
|
||||
/*
|
||||
* The 'config.size()' method returns the number of bytes of
|
||||
* the config-node content, which is not null-terminated. Since
|
||||
* 'Genode::strncpy' always null-terminates the result, the
|
||||
* last byte of the source string is not copied. Hence, it is
|
||||
* safe to add '1' to 'config_len' and thereby include the
|
||||
* last actual config-content character in the result.
|
||||
*/
|
||||
Genode::strncpy(dst, config.addr(), config_len + 1);
|
||||
config.with_raw_node([&] (char const *start, size_t length) {
|
||||
|
||||
/*
|
||||
* The 'length' is the number of bytes of the config-node
|
||||
* content, which is not null-terminated. Since
|
||||
* 'Genode::strncpy' always null-terminates the result, the
|
||||
* last byte of the source string is not copied. Hence, it
|
||||
* is safe to add '1' to 'length' and thereby include the
|
||||
* last actual config-content character in the result.
|
||||
*/
|
||||
Genode::strncpy(dst, start, length + 1);
|
||||
});
|
||||
}
|
||||
|
||||
void trigger_update() { _session.trigger_update(); }
|
||||
@ -337,20 +340,27 @@ class Init::Child : Child_policy, Routed_service::Wakeup
|
||||
|
||||
Genode::Child _child { _env.rm(), _env.ep().rpc_ep(), *this };
|
||||
|
||||
struct Ram_pd_accessor : Routed_service::Ram_accessor,
|
||||
Routed_service::Pd_accessor
|
||||
struct Pd_accessor : Routed_service::Pd_accessor
|
||||
{
|
||||
Genode::Child &_child;
|
||||
|
||||
Ram_pd_accessor(Genode::Child &child) : _child(child) { }
|
||||
Pd_accessor(Genode::Child &child) : _child(child) { }
|
||||
|
||||
Ram_session &ram() override { return _child.ram(); }
|
||||
Ram_session_capability ram_cap() const override { return _child.ram_session_cap(); }
|
||||
Pd_session &pd() override { return _child.pd(); }
|
||||
Pd_session_capability pd_cap() const override { return _child.pd_session_cap(); }
|
||||
|
||||
Pd_session &pd() override { return _child.pd(); }
|
||||
Pd_session_capability pd_cap() const override { return _child.pd_session_cap(); }
|
||||
} _pd_accessor { _child };
|
||||
|
||||
} _ram_pd_accessor { _child };
|
||||
struct Ram_accessor : Routed_service::Ram_accessor
|
||||
{
|
||||
Genode::Child &_child;
|
||||
|
||||
Ram_accessor(Genode::Child &child) : _child(child) { }
|
||||
|
||||
Pd_session &ram() override { return _child.pd(); }
|
||||
Pd_session_capability ram_cap() const override { return _child.pd_session_cap(); }
|
||||
|
||||
} _ram_accessor { _child };
|
||||
|
||||
/**
|
||||
* Async_service::Wakeup callback
|
||||
@ -418,7 +428,7 @@ class Init::Child : Child_policy, Routed_service::Wakeup
|
||||
|
||||
new (_alloc)
|
||||
Routed_service(_child_services, this->name(),
|
||||
_ram_pd_accessor, _ram_pd_accessor,
|
||||
_pd_accessor, _ram_accessor,
|
||||
_session_requester.id_space(),
|
||||
_child.session_factory(),
|
||||
name, *this);
|
||||
@ -481,7 +491,7 @@ class Init::Child : Child_policy, Routed_service::Wakeup
|
||||
Ram_quota ram_quota() const { return _resources.assigned_ram_quota; }
|
||||
Cap_quota cap_quota() const { return _resources.assigned_cap_quota; }
|
||||
|
||||
void initiate_env_ram_session()
|
||||
void initiate_env_pd_session()
|
||||
{
|
||||
if (_state == STATE_INITIAL) {
|
||||
_child.initiate_env_ram_session();
|
||||
|
@ -63,7 +63,7 @@ struct Init::Main : State_reporter::Producer,
|
||||
{
|
||||
Ram_quota const preserved_ram = _preserved_ram_from_config(_config_xml);
|
||||
|
||||
Ram_quota avail_ram = _env.ram().avail_ram();
|
||||
Ram_quota avail_ram = _env.pd().avail_ram();
|
||||
|
||||
if (preserved_ram.value > avail_ram.value) {
|
||||
error("RAM preservation exceeds available memory");
|
||||
@ -115,7 +115,7 @@ struct Init::Main : State_reporter::Producer,
|
||||
void produce_state_report(Xml_generator &xml, Report_detail const &detail) const
|
||||
{
|
||||
if (detail.init_ram())
|
||||
xml.node("ram", [&] () { generate_ram_info (xml, _env.ram()); });
|
||||
xml.node("ram", [&] () { generate_ram_info (xml, _env.pd()); });
|
||||
|
||||
if (detail.init_caps())
|
||||
xml.node("caps", [&] () { generate_caps_info(xml, _env.pd()); });
|
||||
@ -444,7 +444,7 @@ void Init::Main::_handle_config()
|
||||
*/
|
||||
_children.for_each_child([&] (Child &child) {
|
||||
if (!child.abandoned())
|
||||
child.initiate_env_ram_session(); });
|
||||
child.initiate_env_pd_session(); });
|
||||
|
||||
/*
|
||||
* Initiate remaining environment sessions of all new children
|
||||
|
@ -162,7 +162,7 @@ void Init::Server::_close_session(Session_state &session,
|
||||
Ram_transfer::Account &service_ram_account = session.service();
|
||||
Cap_transfer::Account &service_cap_account = session.service();
|
||||
|
||||
service_ram_account.try_transfer(_env.ram_session_cap(),
|
||||
service_ram_account.try_transfer(_env.pd_session_cap(),
|
||||
session.donated_ram_quota());
|
||||
|
||||
service_cap_account.try_transfer(_env.pd_session_cap(),
|
||||
@ -233,8 +233,8 @@ void Init::Server::_handle_create_session_request(Xml_node request,
|
||||
|
||||
/* transfer session quota */
|
||||
try {
|
||||
Ram_transfer::Remote_account env_ram_account(_env.ram(), _env.ram_session_cap());
|
||||
Cap_transfer::Remote_account env_cap_account(_env.pd(), _env.pd_session_cap());
|
||||
Ram_transfer::Remote_account env_ram_account(_env.pd(), _env.pd_session_cap());
|
||||
Cap_transfer::Remote_account env_cap_account(_env.pd(), _env.pd_session_cap());
|
||||
|
||||
Ram_transfer ram_transfer(forward_ram_quota, env_ram_account, route.service);
|
||||
Cap_transfer cap_transfer(cap_quota, env_cap_account, route.service);
|
||||
@ -298,8 +298,8 @@ void Init::Server::_handle_upgrade_session_request(Xml_node request,
|
||||
session.phase = Session_state::UPGRADE_REQUESTED;
|
||||
|
||||
try {
|
||||
Ram_transfer::Remote_account env_ram_account(_env.ram(), _env.ram_session_cap());
|
||||
Cap_transfer::Remote_account env_cap_account(_env.pd(), _env.pd_session_cap());
|
||||
Ram_transfer::Remote_account env_ram_account(_env.pd(), _env.pd_session_cap());
|
||||
Cap_transfer::Remote_account env_cap_account(_env.pd(), _env.pd_session_cap());
|
||||
|
||||
Ram_transfer ram_transfer(ram_quota, env_ram_account, session.service());
|
||||
Cap_transfer cap_transfer(cap_quota, env_cap_account, session.service());
|
||||
|
@ -65,24 +65,23 @@ class Init::Routed_service : public Async_service, public Abandonable
|
||||
|
||||
typedef Child_policy::Name Child_name;
|
||||
|
||||
struct Ram_accessor : Interface
|
||||
{
|
||||
virtual Ram_session &ram() = 0;
|
||||
virtual Ram_session_capability ram_cap() const = 0;
|
||||
};
|
||||
|
||||
struct Pd_accessor : Interface
|
||||
{
|
||||
virtual Pd_session &pd() = 0;
|
||||
virtual Pd_session_capability pd_cap() const = 0;
|
||||
};
|
||||
|
||||
struct Ram_accessor : Interface
|
||||
{
|
||||
virtual Pd_session &ram() = 0;
|
||||
virtual Pd_session_capability ram_cap() const = 0;
|
||||
};
|
||||
|
||||
private:
|
||||
|
||||
Child_name _child_name;
|
||||
|
||||
Ram_accessor &_ram_accessor;
|
||||
Pd_accessor &_pd_accessor;
|
||||
Pd_accessor &_pd_accessor;
|
||||
|
||||
Session_state::Factory &_factory;
|
||||
|
||||
@ -100,16 +99,15 @@ class Init::Routed_service : public Async_service, public Abandonable
|
||||
*/
|
||||
Routed_service(Registry<Routed_service> &services,
|
||||
Child_name const &child_name,
|
||||
Ram_accessor &ram_accessor,
|
||||
Pd_accessor &pd_accessor,
|
||||
Ram_accessor &,
|
||||
Id_space<Parent::Server> &server_id_space,
|
||||
Session_state::Factory &factory,
|
||||
Service::Name const &name,
|
||||
Wakeup &wakeup)
|
||||
:
|
||||
Async_service(name, server_id_space, factory, wakeup),
|
||||
_child_name(child_name),
|
||||
_ram_accessor(ram_accessor), _pd_accessor(pd_accessor),
|
||||
_child_name(child_name), _pd_accessor(pd_accessor),
|
||||
_factory(factory), _registry_element(services, *this)
|
||||
{ }
|
||||
|
||||
@ -120,17 +118,17 @@ class Init::Routed_service : public Async_service, public Abandonable
|
||||
/**
|
||||
* Ram_transfer::Account interface
|
||||
*/
|
||||
void transfer(Ram_session_capability to, Ram_quota amount) override
|
||||
void transfer(Pd_session_capability to, Ram_quota amount) override
|
||||
{
|
||||
if (to.valid()) _ram_accessor.ram().transfer_quota(to, amount);
|
||||
if (to.valid()) _pd_accessor.pd().transfer_quota(to, amount);
|
||||
}
|
||||
|
||||
/**
|
||||
* Ram_transfer::Account interface
|
||||
*/
|
||||
Ram_session_capability cap(Ram_quota) const override
|
||||
Pd_session_capability cap(Ram_quota) const override
|
||||
{
|
||||
return _ram_accessor.ram_cap();
|
||||
return _pd_accessor.pd_cap();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -162,12 +162,12 @@ namespace Init {
|
||||
}
|
||||
|
||||
|
||||
inline void generate_ram_info(Xml_generator &xml, Ram_session const &ram)
|
||||
inline void generate_ram_info(Xml_generator &xml, Pd_session const &pd)
|
||||
{
|
||||
typedef String<32> Value;
|
||||
xml.attribute("quota", Value(ram.ram_quota()));
|
||||
xml.attribute("used", Value(ram.used_ram()));
|
||||
xml.attribute("avail", Value(ram.avail_ram()));
|
||||
xml.attribute("quota", Value(pd.ram_quota()));
|
||||
xml.attribute("used", Value(pd.used_ram()));
|
||||
xml.attribute("avail", Value(pd.avail_ram()));
|
||||
}
|
||||
|
||||
inline void generate_caps_info(Xml_generator &xml, Pd_session const &pd)
|
||||
@ -196,9 +196,9 @@ namespace Init {
|
||||
|
||||
inline long priority_from_xml(Xml_node start_node, Prio_levels prio_levels)
|
||||
{
|
||||
long priority = Cpu_session::DEFAULT_PRIORITY;
|
||||
try { start_node.attribute("priority").value(&priority); }
|
||||
catch (...) { }
|
||||
long const default_priority = Cpu_session::DEFAULT_PRIORITY;
|
||||
|
||||
long priority = start_node.attribute_value("priority", default_priority);
|
||||
|
||||
/*
|
||||
* All priority declarations in the config file are
|
||||
@ -211,9 +211,9 @@ namespace Init {
|
||||
|
||||
if (priority && (priority >= prio_levels.value)) {
|
||||
long new_prio = prio_levels.value ? prio_levels.value - 1 : 0;
|
||||
char name[Service::Name::capacity()];
|
||||
start_node.attribute("name").value(name, sizeof(name));
|
||||
warning(Cstring(name), ": invalid priority, upgrading "
|
||||
|
||||
Service::Name const name = start_node.attribute_value("name", Service::Name());
|
||||
warning(name, ": invalid priority, upgrading "
|
||||
"from ", -priority, " to ", -new_prio);
|
||||
return new_prio;
|
||||
}
|
||||
|
Reference in New Issue
Block a user