Skip to content

Commit

Permalink
Move server API concept to base framework
Browse files Browse the repository at this point in the history
This commit introduces the new `Component` interface in the form of the
headers base/component.h and base/entrypoint.h. The os/server.h API
has become merely a compatibilty wrapper and will eventually be removed.
The same holds true for os/signal_rpc_dispatcher.h. The mechanism has
moved to base/signal.h and is now called 'Signal_handler'.

This patch has been tested on base-linux, base-okl4, base-hw, base-nova,
and base-sel4.

Since the patch shuffles headers around, please do a 'make clean' in the
build directory.

Note that this patch changes the default behavior of components. Each
component opens a CAP and SIGNAL session during startup in order to
create the component's 'Entrypoint'. So we have to make sure to adjust
the session routing policies correspondingly. I did this for the
printf.run script but other run scripts may be affected as well.

Issue genodelabs#1832
  • Loading branch information
nfeske committed Dec 23, 2015
1 parent 202acc1 commit 1ca0676
Show file tree
Hide file tree
Showing 42 changed files with 882 additions and 440 deletions.
1 change: 1 addition & 0 deletions repos/base-fiasco/lib/mk/base-common.mk
Expand Up @@ -22,6 +22,7 @@ SRC_CC += server/server.cc server/common.cc
SRC_CC += thread/thread.cc thread/thread_bootstrap.cc thread/trace.cc
SRC_CC += thread/myself.cc
SRC_CC += thread/context_allocator.cc
SRC_CC += entrypoint/entrypoint.cc

INC_DIR += $(REP_DIR)/src/base/lock
INC_DIR += $(BASE_DIR)/src/base/thread
Expand Down
1 change: 1 addition & 0 deletions repos/base-foc/lib/mk/base-common.mk
Expand Up @@ -22,6 +22,7 @@ SRC_CC += server/server.cc server/common.cc
SRC_CC += thread/thread.cc thread/thread_bootstrap.cc thread/trace.cc
SRC_CC += thread/myself.cc
SRC_CC += thread/context_allocator.cc
SRC_CC += entrypoint/entrypoint.cc

INC_DIR += $(REP_DIR)/src/base/lock
INC_DIR += $(BASE_DIR)/src/base/lock
Expand Down
1 change: 1 addition & 0 deletions repos/base-hw/lib/mk/base-common.inc
Expand Up @@ -29,6 +29,7 @@ SRC_CC += thread/bootstrap.cc
SRC_CC += thread/trace.cc
SRC_CC += thread/context_allocator.cc
SRC_CC += kernel/interface.cc
SRC_CC += entrypoint/entrypoint.cc

# add include paths
INC_DIR += $(REP_DIR)/src/base/lock
Expand Down
1 change: 1 addition & 0 deletions repos/base-hw/src/base/env.cc
Expand Up @@ -16,6 +16,7 @@
#include <base/env.h>
#include <base/native_env.h>


void Genode::upgrade_pd_session_quota(Genode::size_t quota)
{
char buf[128];
Expand Down
24 changes: 17 additions & 7 deletions repos/base-hw/src/base/signal/signal.cc
Expand Up @@ -21,12 +21,24 @@

using namespace Genode;


namespace Genode {

/*
* On base-hw, no signal thread is needed.
*/
void init_signal_thread() __attribute__((weak));
void init_signal_thread() { }
}


/********************
** Signal context **
********************/

void Signal_context::submit(unsigned) { PERR("not implemented"); }


/************************
** Signal transmitter **
************************/
Expand All @@ -48,10 +60,9 @@ Signal_receiver::Signal_receiver()
{
/* create a kernel object that corresponds to the receiver */
bool session_upgraded = 0;
Signal_connection * const s = signal_connection();
while (1) {
try {
_cap = s->alloc_receiver();
_cap = env()->signal_session()->alloc_receiver();
return;
} catch (Signal_session::Out_of_metadata)
{
Expand All @@ -62,7 +73,7 @@ Signal_receiver::Signal_receiver()
return;
}
PINF("upgrading quota donation for SIGNAL session");
env()->parent()->upgrade(s->cap(), "ram_quota=8K");
env()->parent()->upgrade(env()->signal_session_cap(), "ram_quota=8K");
session_upgraded = 1;
}
}
Expand All @@ -72,7 +83,7 @@ Signal_receiver::Signal_receiver()
void Signal_receiver::_platform_destructor()
{
/* release server resources of receiver */
signal_connection()->free_receiver(_cap);
env()->signal_session()->free_receiver(_cap);
}


Expand All @@ -93,10 +104,9 @@ Signal_context_capability Signal_receiver::manage(Signal_context * const c)

/* create a context kernel-object at the receiver kernel-object */
bool session_upgraded = 0;
Signal_connection * const s = signal_connection();
while (1) {
try {
c->_cap = s->alloc_context(_cap, (unsigned long)c);
c->_cap = env()->signal_session()->alloc_context(_cap, (unsigned long)c);
c->_receiver = this;
_contexts.insert(&c->_receiver_le);
return c->_cap;
Expand All @@ -108,7 +118,7 @@ Signal_context_capability Signal_receiver::manage(Signal_context * const c)
return Signal_context_capability();
}
PINF("upgrading quota donation for signal session");
env()->parent()->upgrade(s->cap(), "ram_quota=8K");
env()->parent()->upgrade(env()->signal_session_cap(), "ram_quota=8K");
session_upgraded = 1;
}
}
Expand Down
8 changes: 4 additions & 4 deletions repos/base-hw/src/base/thread/start.cc
Expand Up @@ -20,7 +20,7 @@

using namespace Genode;

namespace Genode { Rm_session * env_context_area_rm_session(); }
namespace Genode { extern Rm_session * const env_context_area_rm_session; }

namespace Hw {
extern Ram_dataspace_capability _main_thread_utcb_ds;
Expand All @@ -47,7 +47,7 @@ void Thread_base::_init_platform_thread(size_t weight, Type type)
size_t const utcb_size = sizeof(Native_utcb);
addr_t const context_area = Native_config::context_area_virtual_base();
addr_t const utcb_new = (addr_t)&_context->utcb - context_area;
Rm_session * const rm = env_context_area_rm_session();
Rm_session * const rm = env_context_area_rm_session;
if (type == REINITIALIZED_MAIN) { rm->detach(utcb_new); }

/* remap initial main-thread UTCB according to context-area spec */
Expand All @@ -74,7 +74,7 @@ void Thread_base::_deinit_platform_thread()
addr_t utcb = Context_allocator::addr_to_base(_context) +
Native_config::context_virtual_size() - size -
Native_config::context_area_virtual_base();
env_context_area_rm_session()->detach(utcb);
env_context_area_rm_session->detach(utcb);

if (_pager_cap.valid()) {
env()->rm_session()->remove_client(_pager_cap);
Expand All @@ -98,7 +98,7 @@ void Thread_base::start()
addr_t dst = Context_allocator::addr_to_base(_context) +
Native_config::context_virtual_size() - size -
Native_config::context_area_virtual_base();
env_context_area_rm_session()->attach_at(ds, dst, size);
env_context_area_rm_session->attach_at(ds, dst, size);
} catch (...) {
PERR("failed to attach userland thread-context");
sleep_forever();
Expand Down
10 changes: 5 additions & 5 deletions repos/base-hw/src/core/include/signal_root.h
Expand Up @@ -28,7 +28,7 @@ namespace Genode
/**
* Provide EP to signal root before it initialises root component
*/
class Signal_handler
class Signal_handler_ep
{
enum { STACK_SIZE = 4096 };

Expand All @@ -39,7 +39,7 @@ namespace Genode
/**
* Constructor
*/
Signal_handler(Cap_session * const c)
Signal_handler_ep(Cap_session * const c)
: _entrypoint(c, STACK_SIZE, "signal") { }

/***************
Expand All @@ -52,7 +52,7 @@ namespace Genode
/**
* Provides signal service by managing appropriate sessions to the clients
*/
class Signal_root : private Signal_handler,
class Signal_root : private Signal_handler_ep,
public Root_component<Signal_session_component>
{
public:
Expand All @@ -64,7 +64,7 @@ namespace Genode
* \param c CAP session to be used by the root entrypoint
*/
Signal_root(Allocator * const md, Cap_session * const c) :
Signal_handler(c),
Signal_handler_ep(c),
Root_component<Signal_session_component>(entrypoint(), md)
{ }

Expand All @@ -79,7 +79,7 @@ namespace Genode
size_t ram_quota =
Arg_string::find_arg(args, "ram_quota").ulong_value(0);
return new (md_alloc())
Signal_session_component(md_alloc(), ram_quota);
Signal_session_component(nullptr, nullptr, md_alloc(), ram_quota);
}

void _upgrade_session(Signal_session_component *s,
Expand Down
4 changes: 2 additions & 2 deletions repos/base-hw/src/core/include/signal_session_component.h
Expand Up @@ -96,8 +96,8 @@ class Genode::Signal_session_component : public Rpc_object<Signal_session>
* \param allocator RAM allocator for meta data
* \param quota amount of RAM quota donated to this session
*/
Signal_session_component(Allocator * const allocator,
size_t const quota);
Signal_session_component(Rpc_entrypoint *, Rpc_entrypoint *,
Allocator *allocator, size_t const quota);

~Signal_session_component();

Expand Down
4 changes: 3 additions & 1 deletion repos/base-hw/src/core/signal_session_component.cc
Expand Up @@ -110,7 +110,9 @@ void Signal_session_component::free_context(Signal_context_capability cap)
}


Signal_session_component::Signal_session_component(Allocator * const allocator,
Signal_session_component::Signal_session_component(Rpc_entrypoint *,
Rpc_entrypoint *,
Allocator * const allocator,
size_t const quota)
: _allocator(allocator, quota), _receivers_slab(&_allocator),
_contexts_slab(&_allocator) { }
Expand Down
1 change: 1 addition & 0 deletions repos/base-linux/lib/mk/base-common.mk
Expand Up @@ -21,6 +21,7 @@ SRC_CC += signal/signal.cc signal/common.cc signal/platform.cc
SRC_CC += server/server.cc server/common.cc
SRC_CC += thread/trace.cc thread/thread_env.cc thread/context_allocator.cc
SRC_CC += irq/platform.cc
SRC_CC += entrypoint/entrypoint.cc

INC_DIR += $(REP_DIR)/src/base/lock $(BASE_DIR)/src/base/lock
INC_DIR += $(REP_DIR)/src/base/ipc
Expand Down
24 changes: 19 additions & 5 deletions repos/base-linux/src/base/env/platform_env.cc
Expand Up @@ -75,8 +75,7 @@ Platform_env::Local_parent::session(Service_name const &service_name,
if (size != ~0UL)
size = align_addr(size, get_page_size_log2());

Rm_session_mmap *rm = new (env()->heap())
Rm_session_mmap(true, size);
Rm_session_mmap *rm = new (_alloc) Rm_session_mmap(true, size);

return Local_capability<Session>::local_cap(rm);
}
Expand Down Expand Up @@ -105,8 +104,10 @@ void Platform_env::Local_parent::close(Session_capability session)


Platform_env::Local_parent::Local_parent(Parent_capability parent_cap,
Emergency_ram_reserve &reserve)
: Expanding_parent_client(parent_cap, reserve)
Emergency_ram_reserve &reserve,
Allocator &alloc)
:
Expanding_parent_client(parent_cap, reserve), _alloc(alloc)
{ }


Expand Down Expand Up @@ -149,7 +150,7 @@ static Parent_capability obtain_parent_cap()

Platform_env::Local_parent &Platform_env::_parent()
{
static Local_parent local_parent(obtain_parent_cap(), *this);
static Local_parent local_parent(obtain_parent_cap(), *this, _heap);
return local_parent;
}

Expand All @@ -159,9 +160,22 @@ Platform_env::Platform_env()
Platform_env_base(static_cap_cast<Ram_session>(_parent().session("Env::ram_session", "")),
static_cap_cast<Cpu_session>(_parent().session("Env::cpu_session", "")),
static_cap_cast<Pd_session> (_parent().session("Env::pd_session", ""))),

_cap_session_cap(static_cap_cast<Cap_session>
(_parent().session(Cap_session::service_name(), "ram_quota=4K"))),

_signal_session_cap(static_cap_cast<Signal_session>
(_parent().session(Signal_session::service_name(), "ram_quota=16K"))),

_heap(Platform_env_base::ram_session(), Platform_env_base::rm_session()),

_context_area(*parent(), *rm_session()),

_emergency_ram_ds(ram_session()->alloc(_emergency_ram_size()))
{
env_context_area_ram_session = ram_session();
env_context_area_rm_session = &_context_area;

/* register TID and PID of the main thread at core */
cpu_session()->thread_id(parent()->main_thread_cap(),
lx_getpid(), lx_gettid());
Expand Down
51 changes: 37 additions & 14 deletions repos/base-linux/src/base/env/platform_env.h
Expand Up @@ -26,6 +26,8 @@
#include <base/local_capability.h>
#include <base/heap.h>
#include <linux_cpu_session/client.h>
#include <cap_session/connection.h>
#include <signal_session/connection.h>

/* local includes (from 'base/src/base/env/') */
#include <platform_env_common.h>
Expand Down Expand Up @@ -314,10 +316,6 @@ namespace Genode {

private:

/*******************************
** Platform-specific members **
*******************************/

Ram_session_capability _ram_session_cap;
Expanding_ram_session_client _ram_session_client;
Cpu_session_capability _cpu_session_cap;
Expand Down Expand Up @@ -347,19 +345,19 @@ 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; }

/*
* Support functions for implementing fork on Noux.
*
* Not supported on Linux.
*/
void reinit(Native_capability::Dst, long) { };
void reinit(Native_capability::Dst, long) override { };
void reinit_main_thread(Rm_session_capability &) { };
};

Expand All @@ -385,6 +383,10 @@ namespace Genode {
*/
class Local_parent : public Expanding_parent_client
{
private:

Allocator &_alloc;

public:

/**********************
Expand All @@ -404,16 +406,30 @@ namespace Genode {
* services
*/
Local_parent(Parent_capability parent_cap,
Emergency_ram_reserve &);
Emergency_ram_reserve &,
Allocator &);
};

/**
* Return instance of parent interface
*/
Local_parent &_parent();

Cap_session_capability _cap_session_cap;
Cap_session_client _cap_session { _cap_session_cap };

Signal_session_capability _signal_session_cap;
Signal_session_client _signal_session { _signal_session_cap };

Heap _heap;

/*
* The '_heap' must be initialized before the '_context_area'
* because the 'Local_parent' performs a dynamic memory allocation
* due to the creation of the context area's sub-RM session.
*/
Attached_context_area _context_area;

/*
* Emergency RAM reserve
*
Expand Down Expand Up @@ -451,8 +467,15 @@ namespace Genode {
** Env interface **
*******************/

Parent *parent() { return &_parent(); }
Heap *heap() { return &_heap; }
Parent *parent() override { return &_parent(); }
Heap *heap() override { return &_heap; }
Cap_session *cap_session() override { return &_cap_session; }
Signal_session *signal_session() override { return &_signal_session; }

Signal_session_capability signal_session_cap() override
{
return _signal_session_cap;
}
};
}

Expand Down

0 comments on commit 1ca0676

Please sign in to comment.