2012-04-17 18:46:14 +02:00
|
|
|
/*
|
|
|
|
* \brief Loader child interface
|
|
|
|
* \author Christian Prochaska
|
|
|
|
* \author Norman Feske
|
|
|
|
* \date 2009-10-05
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
2013-01-10 21:44:47 +01:00
|
|
|
* Copyright (C) 2009-2013 Genode Labs GmbH
|
2012-04-17 18:46:14 +02:00
|
|
|
*
|
|
|
|
* This file is part of the Genode OS framework, which is distributed
|
|
|
|
* under the terms of the GNU General Public License version 2.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _CHILD_H_
|
|
|
|
#define _CHILD_H_
|
|
|
|
|
|
|
|
/* Genode includes */
|
|
|
|
#include <base/child.h>
|
|
|
|
#include <util/arg_string.h>
|
|
|
|
#include <init/child_policy.h>
|
|
|
|
#include <ram_session/connection.h>
|
|
|
|
#include <cpu_session/connection.h>
|
2015-05-05 08:50:16 +02:00
|
|
|
#include <pd_session/connection.h>
|
2016-04-15 15:19:22 +02:00
|
|
|
#include <region_map/client.h>
|
2012-04-17 18:46:14 +02:00
|
|
|
|
|
|
|
|
|
|
|
namespace Loader {
|
|
|
|
|
|
|
|
using namespace Genode;
|
|
|
|
|
2016-11-06 14:27:26 +01:00
|
|
|
typedef Registered<Parent_service> Parent_service;
|
|
|
|
typedef Registry<Parent_service> Parent_services;
|
|
|
|
|
2012-04-17 18:46:14 +02:00
|
|
|
class Child : public Child_policy
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
|
2016-11-06 14:27:26 +01:00
|
|
|
Env &_env;
|
2016-05-10 18:05:38 +02:00
|
|
|
|
2016-11-06 14:27:26 +01:00
|
|
|
Session_label const _label;
|
|
|
|
Name const _binary_name;
|
2012-04-17 18:46:14 +02:00
|
|
|
|
2016-11-06 14:27:26 +01:00
|
|
|
size_t const _ram_quota;
|
|
|
|
|
|
|
|
Parent_services &_parent_services;
|
2012-04-17 18:46:14 +02:00
|
|
|
|
|
|
|
Service &_local_nitpicker_service;
|
|
|
|
Service &_local_rom_service;
|
2013-01-04 15:24:11 +01:00
|
|
|
Service &_local_cpu_service;
|
2016-04-15 15:19:22 +02:00
|
|
|
Service &_local_pd_service;
|
2012-04-17 18:46:14 +02:00
|
|
|
|
|
|
|
Genode::Child _child;
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
2016-11-06 14:27:26 +01:00
|
|
|
Child(Env &env,
|
|
|
|
Name const &binary_name,
|
|
|
|
Session_label const &label,
|
2013-01-04 15:24:11 +01:00
|
|
|
size_t ram_quota,
|
2016-11-06 14:27:26 +01:00
|
|
|
Parent_services &parent_services,
|
2013-01-04 15:24:11 +01:00
|
|
|
Service &local_rom_service,
|
|
|
|
Service &local_cpu_service,
|
2016-04-15 15:19:22 +02:00
|
|
|
Service &local_pd_service,
|
2013-01-04 15:24:11 +01:00
|
|
|
Service &local_nitpicker_service,
|
2014-01-07 18:39:25 +01:00
|
|
|
Signal_context_capability fault_sigh)
|
2012-04-17 18:46:14 +02:00
|
|
|
:
|
2016-11-06 14:27:26 +01:00
|
|
|
_env(env),
|
2012-04-17 18:46:14 +02:00
|
|
|
_label(label),
|
2016-11-06 14:27:26 +01:00
|
|
|
_binary_name(binary_name),
|
|
|
|
_ram_quota(Genode::Child::effective_ram_quota(ram_quota)),
|
2012-04-17 18:46:14 +02:00
|
|
|
_parent_services(parent_services),
|
|
|
|
_local_nitpicker_service(local_nitpicker_service),
|
|
|
|
_local_rom_service(local_rom_service),
|
2013-01-04 15:24:11 +01:00
|
|
|
_local_cpu_service(local_cpu_service),
|
2016-04-15 15:19:22 +02:00
|
|
|
_local_pd_service(local_pd_service),
|
2016-11-06 14:27:26 +01:00
|
|
|
_child(_env.rm(), _env.ep().rpc_ep(), *this)
|
2012-04-17 18:46:14 +02:00
|
|
|
{ }
|
|
|
|
|
2016-11-06 14:27:26 +01:00
|
|
|
~Child() { }
|
2012-04-17 18:46:14 +02:00
|
|
|
|
|
|
|
|
|
|
|
/****************************
|
|
|
|
** Child-policy interface **
|
|
|
|
****************************/
|
|
|
|
|
2016-11-06 14:27:26 +01:00
|
|
|
Name name() const override { return _label; }
|
|
|
|
|
|
|
|
Binary_name binary_name() const override { return _binary_name; }
|
2012-04-17 18:46:14 +02:00
|
|
|
|
2016-11-06 14:27:26 +01:00
|
|
|
Ram_session &ref_ram() override { return _env.ram(); }
|
|
|
|
Ram_session_capability ref_ram_cap() const override { return _env.ram_session_cap(); }
|
|
|
|
|
|
|
|
void init(Ram_session &ram, Ram_session_capability ram_cap) override
|
2012-04-17 18:46:14 +02:00
|
|
|
{
|
2016-11-06 14:27:26 +01:00
|
|
|
ram.ref_account(ref_ram_cap());
|
|
|
|
ref_ram().transfer_quota(ram_cap, _ram_quota);
|
2012-04-17 18:46:14 +02:00
|
|
|
}
|
|
|
|
|
2016-11-06 14:27:26 +01:00
|
|
|
Service &resolve_session_request(Service::Name const &name,
|
|
|
|
Session_state::Args const &args) override
|
|
|
|
{
|
|
|
|
if (name == "Nitpicker") return _local_nitpicker_service;
|
|
|
|
if (name == "ROM") return _local_rom_service;
|
|
|
|
if (name == "CPU") return _local_cpu_service;
|
|
|
|
if (name == "PD") return _local_pd_service;
|
2012-04-17 18:46:14 +02:00
|
|
|
|
|
|
|
/* populate session-local parent service registry on demand */
|
2016-11-06 14:27:26 +01:00
|
|
|
Service *service = nullptr;
|
|
|
|
_parent_services.for_each([&] (Parent_service &s) {
|
|
|
|
if (s.name() == name)
|
|
|
|
service = &s; });
|
|
|
|
|
|
|
|
if (service)
|
|
|
|
return *service;
|
|
|
|
|
|
|
|
return *new (env()->heap()) Parent_service(_parent_services, name);
|
2012-04-17 18:46:14 +02:00
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* _CHILD_H_ */
|