mirror of
https://github.com/genodelabs/genode.git
synced 2025-06-14 13:18:19 +00:00
Integrate SIGNAL session into PD session
This patch removes the SIGNAL service from core and moves its functionality to the PD session. Furthermore, it unifies the PD service implementation and terminology across the various base platforms. Issue #1841
This commit is contained in:
committed by
Christian Helmuth
parent
705ac74498
commit
b1910cdd54
21
repos/base-linux/src/base/env/platform_env.h
vendored
21
repos/base-linux/src/base/env/platform_env.h
vendored
@ -323,6 +323,7 @@ namespace Genode {
|
||||
Cpu_session_capability _cpu_session_cap;
|
||||
Expanding_cpu_session_client _cpu_session_client;
|
||||
Rm_session_mmap _rm_session_mmap;
|
||||
Pd_session_capability _pd_session_cap;
|
||||
Pd_session_client _pd_session_client;
|
||||
|
||||
public:
|
||||
@ -339,7 +340,8 @@ namespace Genode {
|
||||
_cpu_session_cap(cpu_cap),
|
||||
_cpu_session_client(static_cap_cast<Linux_cpu_session>(cpu_cap)),
|
||||
_rm_session_mmap(false),
|
||||
_pd_session_client(pd_cap)
|
||||
_pd_session_cap(pd_cap),
|
||||
_pd_session_client(_pd_session_cap)
|
||||
{ }
|
||||
|
||||
|
||||
@ -347,12 +349,13 @@ namespace Genode {
|
||||
** Env interface **
|
||||
*******************/
|
||||
|
||||
Ram_session *ram_session() { return &_ram_session_client; }
|
||||
Ram_session_capability ram_session_cap() { return _ram_session_cap; }
|
||||
Rm_session *rm_session() { return &_rm_session_mmap; }
|
||||
Linux_cpu_session *cpu_session() { return &_cpu_session_client; }
|
||||
Cpu_session_capability cpu_session_cap() { return _cpu_session_cap; }
|
||||
Pd_session *pd_session() { return &_pd_session_client; }
|
||||
Ram_session *ram_session() override { return &_ram_session_client; }
|
||||
Ram_session_capability ram_session_cap() override { return _ram_session_cap; }
|
||||
Rm_session *rm_session() override { return &_rm_session_mmap; }
|
||||
Linux_cpu_session *cpu_session() override { return &_cpu_session_client; }
|
||||
Cpu_session_capability cpu_session_cap() override { return _cpu_session_cap; }
|
||||
Pd_session *pd_session() override { return &_pd_session_client; }
|
||||
Pd_session_capability pd_session_cap() override { return _pd_session_cap; }
|
||||
|
||||
/*
|
||||
* Support functions for implementing fork on Noux.
|
||||
@ -451,8 +454,8 @@ namespace Genode {
|
||||
** Env interface **
|
||||
*******************/
|
||||
|
||||
Parent *parent() { return &_parent(); }
|
||||
Heap *heap() { return &_heap; }
|
||||
Parent *parent() override { return &_parent(); }
|
||||
Heap *heap() override { return &_heap; }
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include <core_parent.h>
|
||||
#include <cap_session_component.h>
|
||||
#include <ram_session_component.h>
|
||||
#include <core_pd_session.h>
|
||||
|
||||
/* internal base includes */
|
||||
#include <platform_env.h>
|
||||
@ -140,6 +141,17 @@ namespace Genode {
|
||||
Cap_session_component _cap_session;
|
||||
Entrypoint _entrypoint;
|
||||
Core_ram_session _ram_session;
|
||||
|
||||
/*
|
||||
* The core-local PD session is provided by a real RPC object
|
||||
* dispatched by the same entrypoint as the signal-source RPC
|
||||
* objects. This is needed to allow the 'Pd_session::submit'
|
||||
* method to issue out-of-order replies to
|
||||
* 'Signal_source::wait_for_signal' calls.
|
||||
*/
|
||||
Core_pd_session_component _pd_session_component;
|
||||
Pd_session_client _pd_session_client;
|
||||
|
||||
Heap _heap;
|
||||
Ram_session_capability const _ram_session_cap;
|
||||
|
||||
@ -158,6 +170,8 @@ namespace Genode {
|
||||
_ram_session(&_entrypoint, &_entrypoint,
|
||||
platform()->ram_alloc(), platform()->core_mem_alloc(),
|
||||
"ram_quota=4M", platform()->ram_alloc()->avail()),
|
||||
_pd_session_component(_entrypoint /* XXX use a different entrypoint */),
|
||||
_pd_session_client(_entrypoint.manage(&_pd_session_component)),
|
||||
_heap(&_ram_session, Platform_env_base::rm_session()),
|
||||
_ram_session_cap(_entrypoint.manage(&_ram_session))
|
||||
{ }
|
||||
@ -183,6 +197,7 @@ namespace Genode {
|
||||
Parent *parent() { return &_core_parent; }
|
||||
Ram_session *ram_session() { return &_ram_session; }
|
||||
Ram_session_capability ram_session_cap() { return _ram_session_cap; }
|
||||
Pd_session *pd_session() { return &_pd_session_client; }
|
||||
Allocator *heap() { return &_heap; }
|
||||
|
||||
Cpu_session_capability cpu_session_cap() {
|
||||
@ -190,12 +205,6 @@ namespace Genode {
|
||||
return Cpu_session_capability();
|
||||
}
|
||||
|
||||
Pd_session *pd_session()
|
||||
{
|
||||
PWRN("%s:%u not implemented", __FILE__, __LINE__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void reload_parent_cap(Capability<Parent>::Dst, long) { }
|
||||
};
|
||||
|
||||
|
@ -21,61 +21,92 @@
|
||||
|
||||
/* core includes */
|
||||
#include <platform_pd.h>
|
||||
#include <signal_broker.h>
|
||||
|
||||
namespace Genode {
|
||||
|
||||
class Dataspace_component;
|
||||
class Pd_session_component : public Rpc_object<Linux_pd_session, Pd_session_component>
|
||||
{
|
||||
private:
|
||||
|
||||
enum { LABEL_MAX_LEN = 1024 };
|
||||
enum { ROOT_PATH_MAX_LEN = 512 };
|
||||
|
||||
unsigned long _pid;
|
||||
char _label[LABEL_MAX_LEN];
|
||||
char _root[ROOT_PATH_MAX_LEN];
|
||||
unsigned _uid;
|
||||
unsigned _gid;
|
||||
Parent_capability _parent;
|
||||
Rpc_entrypoint *_ds_ep;
|
||||
|
||||
void _start(Dataspace_component *ds);
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* \param ds_ep entrypoint where the dataspaces are managed
|
||||
* \param md_alloc meta-data allocator
|
||||
* \param args additional session arguments
|
||||
*/
|
||||
Pd_session_component(Rpc_entrypoint *ds_ep, Allocator * md_alloc,
|
||||
const char *args);
|
||||
|
||||
~Pd_session_component();
|
||||
|
||||
/**
|
||||
* Register quota donation at allocator guard
|
||||
*/
|
||||
void upgrade_ram_quota(size_t ram_quota) { }
|
||||
|
||||
|
||||
/**************************
|
||||
** PD session interface **
|
||||
**************************/
|
||||
|
||||
int bind_thread(Thread_capability);
|
||||
int assign_parent(Parent_capability parent);
|
||||
|
||||
|
||||
/******************************
|
||||
** Linux-specific extension **
|
||||
******************************/
|
||||
|
||||
void start(Capability<Dataspace> binary);
|
||||
};
|
||||
class Pd_session_component;
|
||||
class Parent;
|
||||
}
|
||||
|
||||
|
||||
class Genode::Pd_session_component : public Rpc_object<Linux_pd_session, Pd_session_component>
|
||||
{
|
||||
private:
|
||||
|
||||
enum { LABEL_MAX_LEN = 1024 };
|
||||
enum { ROOT_PATH_MAX_LEN = 512 };
|
||||
|
||||
unsigned long _pid;
|
||||
char _label[LABEL_MAX_LEN];
|
||||
char _root[ROOT_PATH_MAX_LEN];
|
||||
unsigned _uid;
|
||||
unsigned _gid;
|
||||
Capability<Parent> _parent;
|
||||
Rpc_entrypoint &_ds_ep;
|
||||
Signal_broker _signal_broker;
|
||||
|
||||
void _start(Dataspace_component *ds);
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* \param ds_ep entrypoint where the dataspaces are managed
|
||||
* \param receiver_ep entrypoint holding signal-receiver component
|
||||
* objects
|
||||
* \param context_ep global pool of all signal contexts
|
||||
* \param md_alloc meta-data allocator
|
||||
* \param args additional session arguments
|
||||
*/
|
||||
Pd_session_component(Rpc_entrypoint &ds_ep,
|
||||
Rpc_entrypoint &receiver_ep,
|
||||
Rpc_entrypoint &context_ep,
|
||||
Allocator &md_alloc,
|
||||
const char *args);
|
||||
|
||||
~Pd_session_component();
|
||||
|
||||
/**
|
||||
* Register quota donation at allocator guard
|
||||
*/
|
||||
void upgrade_ram_quota(size_t ram_quota) { }
|
||||
|
||||
|
||||
/**************************
|
||||
** PD session interface **
|
||||
**************************/
|
||||
|
||||
int bind_thread(Thread_capability);
|
||||
int assign_parent(Capability<Parent>);
|
||||
bool assign_pci(addr_t, uint16_t) { return false; }
|
||||
|
||||
Signal_source_capability alloc_signal_source() override {
|
||||
return _signal_broker.alloc_signal_source(); }
|
||||
|
||||
void free_signal_source(Signal_source_capability cap) override {
|
||||
_signal_broker.free_signal_source(cap); }
|
||||
|
||||
Signal_context_capability
|
||||
alloc_context(Signal_source_capability sig_rec_cap, unsigned long imprint) override
|
||||
{
|
||||
return _signal_broker.alloc_context(sig_rec_cap, imprint);
|
||||
}
|
||||
|
||||
void free_context(Signal_context_capability cap) override {
|
||||
_signal_broker.free_context(cap); }
|
||||
|
||||
void submit(Signal_context_capability cap, unsigned n) override {
|
||||
_signal_broker.submit(cap, n); }
|
||||
|
||||
|
||||
/******************************
|
||||
** Linux-specific extension **
|
||||
******************************/
|
||||
|
||||
void start(Capability<Dataspace> binary);
|
||||
};
|
||||
|
||||
#endif /* _CORE__INCLUDE__PD_SESSION_COMPONENT_H_ */
|
||||
|
@ -397,11 +397,14 @@ void Pd_session_component::_start(Dataspace_component *ds)
|
||||
}
|
||||
|
||||
|
||||
Pd_session_component::Pd_session_component(Rpc_entrypoint * ep,
|
||||
Allocator * md_alloc,
|
||||
const char * args)
|
||||
Pd_session_component::Pd_session_component(Rpc_entrypoint &ds_ep,
|
||||
Rpc_entrypoint &receiver_ep,
|
||||
Rpc_entrypoint &context_ep,
|
||||
Allocator &md_alloc,
|
||||
const char *args)
|
||||
:
|
||||
_pid(0), _uid(0), _gid(0), _ds_ep(ep)
|
||||
_pid(0), _uid(0), _gid(0), _ds_ep(ds_ep),
|
||||
_signal_broker(md_alloc, receiver_ep, context_ep)
|
||||
{
|
||||
Arg_string::find_arg(args, "label").string(_label, sizeof(_label),
|
||||
"<unlabeled>");
|
||||
@ -449,7 +452,7 @@ Pd_session_component::~Pd_session_component()
|
||||
int Pd_session_component::bind_thread(Thread_capability) { return -1; }
|
||||
|
||||
|
||||
int Pd_session_component::assign_parent(Parent_capability parent)
|
||||
int Pd_session_component::assign_parent(Capability<Parent> parent)
|
||||
{
|
||||
_parent = parent;
|
||||
return 0;
|
||||
@ -459,6 +462,6 @@ int Pd_session_component::assign_parent(Parent_capability parent)
|
||||
void Pd_session_component::start(Capability<Dataspace> binary)
|
||||
{
|
||||
/* lookup binary dataspace */
|
||||
_ds_ep->apply(binary, [&] (Dataspace_component *ds) {
|
||||
_ds_ep.apply(binary, [&] (Dataspace_component *ds) {
|
||||
_start(ds); });
|
||||
};
|
||||
|
@ -18,7 +18,6 @@ SRC_CC = main.cc \
|
||||
dataspace_component.cc \
|
||||
pd_session_component.cc \
|
||||
io_mem_session_component.cc \
|
||||
signal_session_component.cc \
|
||||
signal_source_component.cc \
|
||||
trace_session_component.cc \
|
||||
thread_linux.cc \
|
||||
@ -44,7 +43,6 @@ vpath ram_session_component.cc $(GEN_CORE_DIR)
|
||||
vpath cap_session_component.cc $(GEN_CORE_DIR)
|
||||
vpath cpu_session_component.cc $(GEN_CORE_DIR)
|
||||
vpath platform_services.cc $(GEN_CORE_DIR)
|
||||
vpath signal_session_component.cc $(GEN_CORE_DIR)
|
||||
vpath signal_source_component.cc $(GEN_CORE_DIR)
|
||||
vpath trace_session_component.cc $(GEN_CORE_DIR)
|
||||
vpath core_printf.cc $(BASE_DIR)/src/base/console
|
||||
|
Reference in New Issue
Block a user