base: restructure signal-submit initialization

This patch allows core's 'Signal_transmitter' implementation to sidestep
the 'Env::Pd' interface and thereby adhere to a stricter layering within
core. The 'Signal_transmitter' now uses - on kernels that depend on it -
a dedicated (and fairly freestanding) RPC proxy mechanism for signal
deliver, instead of channeling signals through the 'Pd_session::submit'
RPC function.
This commit is contained in:
Norman Feske 2017-05-10 20:11:38 +02:00 committed by Christian Helmuth
parent 71efb59873
commit a1df4fee44
38 changed files with 372 additions and 64 deletions

View File

@ -9,6 +9,5 @@ include $(BASE_DIR)/lib/mk/base-common.inc
LIBS += startup-fiasco syscall-fiasco LIBS += startup-fiasco syscall-fiasco
SRC_CC += capability.cc capability_raw.cc SRC_CC += capability.cc capability_raw.cc
SRC_CC += signal_submit.cc
SRC_CC += rpc_dispatch_loop.cc SRC_CC += rpc_dispatch_loop.cc
SRC_CC += thread.cc thread_bootstrap.cc thread_myself.cc SRC_CC += thread.cc thread_bootstrap.cc thread_myself.cc

View File

@ -1,7 +1,8 @@
include $(BASE_DIR)/lib/mk/base.inc include $(BASE_DIR)/lib/mk/base.inc
LIBS += syscall-fiasco timeout LIBS += syscall-fiasco base-fiasco-common cxx timeout
SRC_CC += thread_start.cc SRC_CC += thread_start.cc
SRC_CC += cache.cc SRC_CC += cache.cc
SRC_CC += capability_space.cc SRC_CC += capability_space.cc
SRC_CC += signal_transmitter.cc signal.cc

View File

@ -35,6 +35,8 @@ SRC_CC += stack_area.cc \
region_map_support.cc \ region_map_support.cc \
rom_session_component.cc \ rom_session_component.cc \
signal_source_component.cc \ signal_source_component.cc \
signal_transmitter_proxy.cc \
signal_receiver.cc \
thread_start.cc \ thread_start.cc \
trace_session_component.cc trace_session_component.cc
@ -65,6 +67,8 @@ vpath region_map_component.cc $(GEN_CORE_DIR)
vpath io_mem_session_component.cc $(GEN_CORE_DIR) vpath io_mem_session_component.cc $(GEN_CORE_DIR)
vpath io_mem_session_support.cc $(GEN_CORE_DIR) vpath io_mem_session_support.cc $(GEN_CORE_DIR)
vpath signal_source_component.cc $(GEN_CORE_DIR) vpath signal_source_component.cc $(GEN_CORE_DIR)
vpath signal_transmitter_proxy.cc $(GEN_CORE_DIR)
vpath signal_receiver.cc $(GEN_CORE_DIR)
vpath trace_session_component.cc $(GEN_CORE_DIR) vpath trace_session_component.cc $(GEN_CORE_DIR)
vpath dataspace_component.cc $(GEN_CORE_DIR) vpath dataspace_component.cc $(GEN_CORE_DIR)
vpath default_log.cc $(GEN_CORE_DIR) vpath default_log.cc $(GEN_CORE_DIR)

View File

@ -9,7 +9,6 @@ include $(BASE_DIR)/lib/mk/base-common.inc
LIBS += syscall-foc startup-foc LIBS += syscall-foc startup-foc
SRC_CC += spin_lock.cc cap_map.cc SRC_CC += spin_lock.cc cap_map.cc
SRC_CC += signal_submit.cc
SRC_CC += rpc_dispatch_loop.cc SRC_CC += rpc_dispatch_loop.cc
SRC_CC += thread.cc thread_bootstrap.cc thread_myself.cc utcb.cc SRC_CC += thread.cc thread_bootstrap.cc thread_myself.cc utcb.cc
SRC_CC += capability.cc SRC_CC += capability.cc

View File

@ -4,3 +4,4 @@ LIBS += base-foc-common syscall-foc cxx timeout
SRC_CC += cap_map_remove.cc cap_alloc.cc SRC_CC += cap_map_remove.cc cap_alloc.cc
SRC_CC += thread_start.cc SRC_CC += thread_start.cc
SRC_CC += signal_transmitter.cc signal.cc

View File

@ -34,6 +34,8 @@ SRC_CC += stack_area.cc \
region_map_support.cc \ region_map_support.cc \
rom_session_component.cc \ rom_session_component.cc \
signal_source_component.cc \ signal_source_component.cc \
signal_transmitter_proxy.cc \
signal_receiver.cc \
thread_start.cc \ thread_start.cc \
trace_session_component.cc trace_session_component.cc
@ -61,6 +63,8 @@ vpath ram_session_component.cc $(GEN_CORE_DIR)
vpath region_map_component.cc $(GEN_CORE_DIR) vpath region_map_component.cc $(GEN_CORE_DIR)
vpath rom_session_component.cc $(GEN_CORE_DIR) vpath rom_session_component.cc $(GEN_CORE_DIR)
vpath trace_session_component.cc $(GEN_CORE_DIR) vpath trace_session_component.cc $(GEN_CORE_DIR)
vpath signal_transmitter_proxy.cc $(GEN_CORE_DIR)
vpath signal_receiver.cc $(GEN_CORE_DIR)
vpath core_rpc_cap_alloc.cc $(GEN_CORE_DIR) vpath core_rpc_cap_alloc.cc $(GEN_CORE_DIR)
vpath core_region_map.cc $(GEN_CORE_DIR) vpath core_region_map.cc $(GEN_CORE_DIR)
vpath %.cc $(REP_DIR)/src/core vpath %.cc $(REP_DIR)/src/core

View File

@ -11,3 +11,4 @@ LIBS += syscall-hw
SRC_CC += rpc_dispatch_loop.cc SRC_CC += rpc_dispatch_loop.cc
SRC_CC += thread.cc thread_myself.cc thread_bootstrap.cc SRC_CC += thread.cc thread_myself.cc thread_bootstrap.cc
SRC_CC += signal_transmitter.cc

View File

@ -5,5 +5,6 @@ SRC_CC += env.cc
SRC_CC += capability.cc SRC_CC += capability.cc
SRC_CC += cache.cc SRC_CC += cache.cc
SRC_CC += raw_write_string.cc SRC_CC += raw_write_string.cc
SRC_CC += signal_receiver.cc
LIBS += startup-hw base-hw-common timeout-hw LIBS += startup-hw base-hw-common cxx timeout-hw

View File

@ -41,6 +41,8 @@ SRC_CC += ram_session_support.cc
SRC_CC += region_map_component.cc SRC_CC += region_map_component.cc
SRC_CC += rom_session_component.cc SRC_CC += rom_session_component.cc
SRC_CC += trace_session_component.cc SRC_CC += trace_session_component.cc
SRC_CC += signal_receiver.cc
SRC_CC += signal_transmitter_noinit.cc
SRC_CC += thread_start.cc SRC_CC += thread_start.cc
SRC_CC += env.cc SRC_CC += env.cc
SRC_CC += region_map_support.cc SRC_CC += region_map_support.cc

View File

@ -28,42 +28,25 @@
using namespace Genode; using namespace Genode;
static Pd_session *_pd_ptr;
static Pd_session &pd()
{
if (_pd_ptr)
return *_pd_ptr;
class Missing_init_signal_thread { };
throw Missing_init_signal_thread();
}
namespace Genode {
/* /*
* On base-hw, no signal thread is needed. * On base-hw, we don't use a signal thread. We mereely save the PD session
* pointer of the passed 'env' argument.
*/ */
void init_signal_thread(Env &) __attribute__((weak)); void Genode::init_signal_thread(Env &env) { _pd_ptr = &env.pd(); }
void init_signal_thread(Env &) { } void Genode::destroy_signal_thread() { }
void destroy_signal_thread() { }
}
/********************
** Signal context **
********************/
void Signal_context::submit(unsigned) { Genode::error("not implemented"); }
/************************
** Signal transmitter **
************************/
void Signal_transmitter::submit(unsigned cnt)
{
{
Trace::Signal_submit trace_event(cnt);
}
Kernel::submit_signal(Capability_space::capid(_context), cnt);
}
/*********************
** Signal_receiver **
*********************/
Signal_receiver::Signal_receiver() Signal_receiver::Signal_receiver()
{ {
for (;;) { for (;;) {
@ -72,7 +55,7 @@ Signal_receiver::Signal_receiver()
Cap_quota cap_upgrade { 0 }; Cap_quota cap_upgrade { 0 };
try { try {
_cap = internal_env().pd().alloc_signal_source(); _cap = pd().alloc_signal_source();
break; break;
} }
catch (Out_of_ram) { ram_upgrade = Ram_quota { 2*1024*sizeof(long) }; } catch (Out_of_ram) { ram_upgrade = Ram_quota { 2*1024*sizeof(long) }; }
@ -88,7 +71,7 @@ Signal_receiver::Signal_receiver()
void Signal_receiver::_platform_destructor() void Signal_receiver::_platform_destructor()
{ {
/* release server resources of receiver */ /* release server resources of receiver */
env_deprecated()->pd_session()->free_signal_source(_cap); pd().free_signal_source(_cap);
} }
@ -114,7 +97,7 @@ Signal_context_capability Signal_receiver::manage(Signal_context * const c)
try { try {
/* use signal context as imprint */ /* use signal context as imprint */
c->_cap = env_deprecated()->pd_session()->alloc_context(_cap, (unsigned long)c); c->_cap = pd().alloc_context(_cap, (unsigned long)c);
c->_receiver = this; c->_receiver = this;
_contexts.insert(&c->_receiver_le); _contexts.insert(&c->_receiver_le);
return c->_cap; return c->_cap;

View File

@ -0,0 +1,39 @@
/*
* \brief Implementations of the signaling framework specific for HW-core
* \author Martin Stein
* \date 2012-05-05
*/
/*
* Copyright (C) 2012-2017 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
/* Genode includes */
#include <util/retry.h>
#include <base/signal.h>
#include <base/trace/events.h>
/* base-internal includes */
#include <base/internal/native_utcb.h>
#include <base/internal/native_env.h>
#include <base/internal/capability_space.h>
#include <base/internal/globals.h>
using namespace Genode;
void Genode::init_signal_transmitter(Env &) { }
void Signal_context::submit(unsigned) { Genode::error("not implemented"); }
void Signal_transmitter::submit(unsigned cnt)
{
{
Trace::Signal_submit trace_event(cnt);
}
Kernel::submit_signal(Capability_space::capid(_context), cnt);
}

View File

@ -9,7 +9,6 @@ include $(BASE_DIR)/lib/mk/base-common.inc
LIBS += syscall-linux LIBS += syscall-linux
SRC_CC += region_map_mmap.cc debug.cc SRC_CC += region_map_mmap.cc debug.cc
SRC_CC += signal_submit.cc
SRC_CC += rpc_dispatch_loop.cc SRC_CC += rpc_dispatch_loop.cc
SRC_CC += thread_env.cc SRC_CC += thread_env.cc
SRC_CC += capability.cc SRC_CC += capability.cc

View File

@ -6,7 +6,8 @@
include $(REP_DIR)/lib/mk/base-linux.inc include $(REP_DIR)/lib/mk/base-linux.inc
LIBS += startup-linux base-linux-common timeout LIBS += startup-linux base-linux-common cxx timeout
SRC_CC += thread.cc thread_myself.cc thread_linux.cc SRC_CC += thread.cc thread_myself.cc thread_linux.cc
SRC_CC += capability_space.cc capability_raw.cc SRC_CC += capability_space.cc capability_raw.cc
SRC_CC += attach_stack_area.cc SRC_CC += attach_stack_area.cc
SRC_CC += signal_transmitter.cc signal.cc

View File

@ -1,4 +1,5 @@
SRC_CC += lx_hybrid.cc new_delete.cc capability_space.cc SRC_CC += lx_hybrid.cc new_delete.cc capability_space.cc
SRC_CC += signal_transmitter.cc signal.cc
vpath new_delete.cc $(BASE_DIR)/src/lib/cxx vpath new_delete.cc $(BASE_DIR)/src/lib/cxx
vpath lx_hybrid.cc $(REP_DIR)/src/lib/lx_hybrid vpath lx_hybrid.cc $(REP_DIR)/src/lib/lx_hybrid

View File

@ -24,6 +24,8 @@ SRC_CC = main.cc \
core_rpc_cap_alloc.cc \ core_rpc_cap_alloc.cc \
io_mem_session_component.cc \ io_mem_session_component.cc \
signal_source_component.cc \ signal_source_component.cc \
signal_transmitter_proxy.cc \
signal_receiver.cc \
trace_session_component.cc \ trace_session_component.cc \
thread_linux.cc \ thread_linux.cc \
stack_area.cc \ stack_area.cc \
@ -54,6 +56,8 @@ vpath capability_space.cc $(GEN_CORE_DIR)
vpath rpc_cap_factory_l4.cc $(GEN_CORE_DIR) vpath rpc_cap_factory_l4.cc $(GEN_CORE_DIR)
vpath platform_services.cc $(GEN_CORE_DIR) vpath platform_services.cc $(GEN_CORE_DIR)
vpath signal_source_component.cc $(GEN_CORE_DIR) vpath signal_source_component.cc $(GEN_CORE_DIR)
vpath signal_transmitter_proxy.cc $(GEN_CORE_DIR)
vpath signal_receiver.cc $(GEN_CORE_DIR)
vpath trace_session_component.cc $(GEN_CORE_DIR) vpath trace_session_component.cc $(GEN_CORE_DIR)
vpath core_rpc_cap_alloc.cc $(GEN_CORE_DIR) vpath core_rpc_cap_alloc.cc $(GEN_CORE_DIR)
vpath default_log.cc $(GEN_CORE_DIR) vpath default_log.cc $(GEN_CORE_DIR)

View File

@ -8,8 +8,8 @@ include $(BASE_DIR)/lib/mk/base-common.inc
LIBS += startup-nova LIBS += startup-nova
SRC_CC += signal_submit.cc
SRC_CC += thread.cc thread_myself.cc SRC_CC += thread.cc thread_myself.cc
SRC_CC += stack.cc SRC_CC += stack.cc
SRC_CC += cap_map.cc SRC_CC += cap_map.cc
SRC_CC += capability.cc SRC_CC += capability.cc
SRC_CC += signal_transmitter.cc

View File

@ -3,3 +3,4 @@ include $(BASE_DIR)/lib/mk/base.inc
LIBS += base-nova-common cxx timeout LIBS += base-nova-common cxx timeout
SRC_CC += thread_start.cc SRC_CC += thread_start.cc
SRC_CC += cache.cc SRC_CC += cache.cc
SRC_CC += signal.cc

View File

@ -39,7 +39,9 @@ SRC_CC += stack_area.cc \
rom_session_component.cc \ rom_session_component.cc \
thread_start.cc \ thread_start.cc \
bios_data_area.cc \ bios_data_area.cc \
trace_session_component.cc trace_session_component.cc \
signal_transmitter_noinit.cc \
signal_receiver.cc
INC_DIR = $(REP_DIR)/src/core/include \ INC_DIR = $(REP_DIR)/src/core/include \
$(REP_DIR)/src/include \ $(REP_DIR)/src/include \
@ -58,6 +60,8 @@ vpath pd_session_component.cc $(GEN_CORE_DIR)
vpath pd_upgrade_ram_quota.cc $(GEN_CORE_DIR) vpath pd_upgrade_ram_quota.cc $(GEN_CORE_DIR)
vpath region_map_component.cc $(GEN_CORE_DIR) vpath region_map_component.cc $(GEN_CORE_DIR)
vpath trace_session_component.cc $(GEN_CORE_DIR) vpath trace_session_component.cc $(GEN_CORE_DIR)
vpath signal_transmitter_noinit.cc $(GEN_CORE_DIR)
vpath signal_receiver.cc $(GEN_CORE_DIR)
vpath io_port_session_component.cc $(GEN_CORE_DIR)/spec/x86 vpath io_port_session_component.cc $(GEN_CORE_DIR)/spec/x86
vpath io_port_session_support.cc $(GEN_CORE_DIR)/spec/x86 vpath io_port_session_support.cc $(GEN_CORE_DIR)/spec/x86
vpath io_mem_session_component.cc $(GEN_CORE_DIR) vpath io_mem_session_component.cc $(GEN_CORE_DIR)

View File

@ -11,18 +11,23 @@
* under the terms of the GNU Affero General Public License version 3. * under the terms of the GNU Affero General Public License version 3.
*/ */
/* Genode includes */ /* Genode includes */
#include <base/signal.h> #include <base/signal.h>
#include <base/log.h> #include <base/log.h>
#include <base/trace/events.h> #include <base/trace/events.h>
/* base-internal includes */
#include <base/internal/globals.h>
/* NOVA includes */ /* NOVA includes */
#include <nova/syscalls.h> #include <nova/syscalls.h>
using namespace Genode; using namespace Genode;
void Genode::init_signal_transmitter(Env &) { }
void Signal_transmitter::submit(unsigned cnt) void Signal_transmitter::submit(unsigned cnt)
{ {
{ {

View File

@ -9,6 +9,5 @@ include $(BASE_DIR)/lib/mk/base-common.inc
LIBS += startup-okl4 syscall-okl4 LIBS += startup-okl4 syscall-okl4
SRC_CC += capability.cc capability_raw.cc SRC_CC += capability.cc capability_raw.cc
SRC_CC += signal_submit.cc
SRC_CC += rpc_dispatch_loop.cc SRC_CC += rpc_dispatch_loop.cc
SRC_CC += thread.cc thread_bootstrap.cc thread_myself.cc SRC_CC += thread.cc thread_bootstrap.cc thread_myself.cc

View File

@ -1,6 +1,8 @@
include $(BASE_DIR)/lib/mk/base.inc include $(BASE_DIR)/lib/mk/base.inc
LIBS += base-okl4-common syscall-okl4 timeout LIBS += base-okl4-common syscall-okl4 cxx timeout
SRC_CC += thread_start.cc SRC_CC += thread_start.cc
SRC_CC += cache.cc SRC_CC += cache.cc
SRC_CC += capability_space.cc SRC_CC += capability_space.cc
SRC_CC += signal_transmitter.cc
SRC_CC += signal.cc

View File

@ -38,6 +38,8 @@ SRC_CC += stack_area.cc \
region_map_support.cc \ region_map_support.cc \
rom_session_component.cc \ rom_session_component.cc \
signal_source_component.cc \ signal_source_component.cc \
signal_transmitter_proxy.cc \
signal_receiver.cc \
thread_start.cc \ thread_start.cc \
trace_session_component.cc trace_session_component.cc
@ -61,6 +63,8 @@ vpath region_map_component.cc $(GEN_CORE_DIR)
vpath io_mem_session_component.cc $(GEN_CORE_DIR) vpath io_mem_session_component.cc $(GEN_CORE_DIR)
vpath io_mem_session_support.cc $(GEN_CORE_DIR) vpath io_mem_session_support.cc $(GEN_CORE_DIR)
vpath signal_source_component.cc $(GEN_CORE_DIR) vpath signal_source_component.cc $(GEN_CORE_DIR)
vpath signal_transmitter_proxy.cc $(GEN_CORE_DIR)
vpath signal_receiver.cc $(GEN_CORE_DIR)
vpath trace_session_component.cc $(GEN_CORE_DIR) vpath trace_session_component.cc $(GEN_CORE_DIR)
vpath dataspace_component.cc $(GEN_CORE_DIR) vpath dataspace_component.cc $(GEN_CORE_DIR)
vpath core_mem_alloc.cc $(GEN_CORE_DIR) vpath core_mem_alloc.cc $(GEN_CORE_DIR)

View File

@ -9,7 +9,6 @@ include $(BASE_DIR)/lib/mk/base-common.inc
LIBS += startup-pistachio syscall-pistachio LIBS += startup-pistachio syscall-pistachio
SRC_CC += capability.cc capability_raw.cc SRC_CC += capability.cc capability_raw.cc
SRC_CC += signal_submit.cc
SRC_CC += rpc_dispatch_loop.cc SRC_CC += rpc_dispatch_loop.cc
SRC_CC += thread.cc thread_bootstrap.cc thread_myself.cc SRC_CC += thread.cc thread_bootstrap.cc thread_myself.cc

View File

@ -5,3 +5,5 @@ LIBS += base-pistachio-common syscall-pistachio cxx timeout
SRC_CC += thread_start.cc SRC_CC += thread_start.cc
SRC_CC += cache.cc SRC_CC += cache.cc
SRC_CC += capability_space.cc SRC_CC += capability_space.cc
SRC_CC += signal_transmitter.cc
SRC_CC += signal.cc

View File

@ -36,6 +36,8 @@ SRC_CC = stack_area.cc \
region_map_support.cc \ region_map_support.cc \
rom_session_component.cc \ rom_session_component.cc \
signal_source_component.cc \ signal_source_component.cc \
signal_transmitter_proxy.cc \
signal_receiver.cc \
thread_start.cc \ thread_start.cc \
trace_session_component.cc trace_session_component.cc
@ -59,6 +61,8 @@ vpath capability_space.cc $(GEN_CORE_DIR)
vpath io_mem_session_component.cc $(GEN_CORE_DIR) vpath io_mem_session_component.cc $(GEN_CORE_DIR)
vpath io_mem_session_support.cc $(GEN_CORE_DIR) vpath io_mem_session_support.cc $(GEN_CORE_DIR)
vpath signal_source_component.cc $(GEN_CORE_DIR) vpath signal_source_component.cc $(GEN_CORE_DIR)
vpath signal_transmitter_proxy.cc $(GEN_CORE_DIR)
vpath signal_receiver.cc $(GEN_CORE_DIR)
vpath trace_session_component.cc $(GEN_CORE_DIR) vpath trace_session_component.cc $(GEN_CORE_DIR)
vpath dataspace_component.cc $(GEN_CORE_DIR) vpath dataspace_component.cc $(GEN_CORE_DIR)
vpath dump_alloc.cc $(GEN_CORE_DIR) vpath dump_alloc.cc $(GEN_CORE_DIR)

View File

@ -8,7 +8,6 @@ include $(BASE_DIR)/lib/mk/base-common.inc
LIBS += startup-sel4 syscall-sel4 LIBS += startup-sel4 syscall-sel4
SRC_CC += signal_submit.cc
SRC_CC += rpc_dispatch_loop.cc SRC_CC += rpc_dispatch_loop.cc
SRC_CC += thread.cc thread_myself.cc thread_bootstrap.cc SRC_CC += thread.cc thread_myself.cc thread_bootstrap.cc
SRC_CC += capability.cc capability_raw.cc SRC_CC += capability.cc capability_raw.cc

View File

@ -3,5 +3,6 @@ include $(BASE_DIR)/lib/mk/base.inc
SRC_CC += capability_space.cc SRC_CC += capability_space.cc
SRC_CC += thread_start.cc thread_init.cc SRC_CC += thread_start.cc thread_init.cc
SRC_CC += cache.cc SRC_CC += cache.cc
SRC_CC += signal_transmitter.cc signal.cc
LIBS += syscall-sel4 base-sel4-common timeout LIBS += syscall-sel4 base-sel4-common cxx timeout

View File

@ -26,6 +26,8 @@ SRC_CC += \
region_map_support.cc \ region_map_support.cc \
irq_session_component.cc \ irq_session_component.cc \
signal_source_component.cc \ signal_source_component.cc \
signal_transmitter_proxy.cc \
signal_receiver.cc \
trace_session_component.cc \ trace_session_component.cc \
core_region_map.cc \ core_region_map.cc \
core_mem_alloc.cc \ core_mem_alloc.cc \
@ -58,6 +60,8 @@ vpath io_mem_session_support.cc $(GEN_CORE_DIR)
vpath io_port_session_component.cc $(GEN_CORE_DIR)/spec/x86 vpath io_port_session_component.cc $(GEN_CORE_DIR)/spec/x86
vpath platform_services.cc $(GEN_CORE_DIR)/spec/x86 vpath platform_services.cc $(GEN_CORE_DIR)/spec/x86
vpath trace_session_component.cc $(GEN_CORE_DIR) vpath trace_session_component.cc $(GEN_CORE_DIR)
vpath signal_transmitter_proxy.cc $(GEN_CORE_DIR)
vpath signal_receiver.cc $(GEN_CORE_DIR)
vpath dataspace_component.cc $(GEN_CORE_DIR) vpath dataspace_component.cc $(GEN_CORE_DIR)
vpath core_mem_alloc.cc $(GEN_CORE_DIR) vpath core_mem_alloc.cc $(GEN_CORE_DIR)
vpath core_rpc_cap_alloc.cc $(GEN_CORE_DIR) vpath core_rpc_cap_alloc.cc $(GEN_CORE_DIR)

View File

@ -74,6 +74,8 @@ class Genode::Entrypoint : Genode::Noncopyable
Signal_proxy_component _signal_proxy {*this}; Signal_proxy_component _signal_proxy {*this};
Capability<Signal_proxy> _signal_proxy_cap = _rpc_ep->manage(&_signal_proxy); Capability<Signal_proxy> _signal_proxy_cap = _rpc_ep->manage(&_signal_proxy);
bool const _signalling_initialized;
Reconstructible<Signal_receiver> _sig_rec; Reconstructible<Signal_receiver> _sig_rec;
Lock _deferred_signals_mutex; Lock _deferred_signals_mutex;

View File

@ -20,7 +20,7 @@ SRC_CC += lock.cc
SRC_CC += log.cc SRC_CC += log.cc
SRC_CC += raw_output.cc SRC_CC += raw_output.cc
SRC_CC += rpc_entrypoint.cc SRC_CC += rpc_entrypoint.cc
SRC_CC += signal.cc signal_common.cc SRC_CC += signal_common.cc
SRC_CC += sleep.cc SRC_CC += sleep.cc
SRC_CC += entrypoint.cc SRC_CC += entrypoint.cc
SRC_CC += component.cc SRC_CC += component.cc

View File

@ -0,0 +1,39 @@
/*
* \brief Initialization of core-specific signal-delivery mechanism
* \author Norman Feske
* \date 2017-05-10
*/
/*
* Copyright (C) 2017 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#ifndef _CORE__INCLUDE__SIGNAL_TRANSMITTER_H_
#define _CORE__INCLUDE__SIGNAL_TRANSMITTER_H_
namespace Genode {
class Rpc_entrypoint;
/*
* Initialize the emission of signals originating from the component
*
* The 'ep' is the entrypoint called by the signal-source clients. On
* kernels where signals are delivered by core as IPC-reply messages, we
* need to ensure that the replies are sent by the same thread that
* received the RPC request (the 'ep' thread). Otherwise, the kernel
* (e.g., OKL4, Pistachio, L4/Fiasco) will refuse to send the reply.
*
* On other kernels, the argument is unused.
*
* Note that this function is called at a very early stage, before the
* global constructors are executed. It should merely remember the 'ep'
* argument.
*/
void init_core_signal_transmitter(Rpc_entrypoint &ep);
}
#endif /* _CORE__INCLUDE__SIGNAL_TRANSMITTER_H_ */

View File

@ -28,6 +28,7 @@
/* core includes */ /* core includes */
#include <platform.h> #include <platform.h>
#include <core_env.h> #include <core_env.h>
#include <signal_transmitter.h>
#include <ram_root.h> #include <ram_root.h>
#include <rom_root.h> #include <rom_root.h>
#include <rm_root.h> #include <rm_root.h>
@ -59,6 +60,17 @@ Core_env * Genode::core_env()
* constructor gets called when this function is used the first time. * constructor gets called when this function is used the first time.
*/ */
static Core_env _env; static Core_env _env;
/*
* Register signal-source entrypoint at core-local signal-transmitter back
* end
*/
static bool signal_transmitter_initialized;
if (!signal_transmitter_initialized)
signal_transmitter_initialized =
(init_core_signal_transmitter(*_env.entrypoint()), true);
return &_env; return &_env;
} }
@ -224,7 +236,8 @@ class Core_child : public Child_policy
* the creation of regular threads within core is unsupported. * the creation of regular threads within core is unsupported.
*/ */
namespace Genode { void init_signal_thread(Env &) { } } void Genode::init_signal_thread(Env &) { }
void Genode::destroy_signal_thread() { }
/******************* /*******************

View File

@ -0,0 +1,40 @@
/*
* \brief Dummy implementation of the signal-receiver API
* \author Norman Feske
* \date 2017-05-11
*
* Core receives no signals. Therefore, we can leave the signal receiver
* blank.
*/
/*
* Copyright (C) 2017 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
/* Genode includes */
#include <base/env.h>
/* base-internal includes */
#include <base/internal/globals.h>
/* core-local includes */
#include <assertion.h>
using namespace Genode;
Signal_receiver::Signal_receiver() { }
void Signal_receiver::_platform_destructor() { }
void Signal_receiver::_platform_begin_dissolve (Signal_context *) { }
void Signal_receiver::_platform_finish_dissolve(Signal_context *) { }
void Signal_receiver::unblock_signal_waiter(Rpc_entrypoint &) { ASSERT_NEVER_CALLED; }
typedef Signal_context_capability Sigh_cap;
Sigh_cap Signal_receiver::manage(Signal_context *) { ASSERT_NEVER_CALLED; }
void Signal_receiver::block_for_signal() { ASSERT_NEVER_CALLED; }
void Signal_receiver::local_submit(Signal::Data) { ASSERT_NEVER_CALLED; }

View File

@ -0,0 +1,20 @@
/*
* \brief Generic implementation parts of the signaling framework
* \author Norman Feske
* \date 2017-05-10
*
* This dummy is used on base platforms that transmit signals directly via
* the kernel instead of using core's signal-source entrypoint as a proxy.
*/
/*
* Copyright (C) 2017 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
/* core-local includes */
#include <signal_transmitter.h>
void Genode::init_core_signal_transmitter(Rpc_entrypoint &) { }

View File

@ -0,0 +1,120 @@
/*
* \brief Generic implementation parts of the signaling framework
* \author Norman Feske
* \date 2017-05-10
*/
/*
* Copyright (C) 2017 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
/* Genode includes */
#include <base/env.h>
#include <base/rpc_server.h>
#include <base/trace/events.h>
/* core-local includes */
#include <signal_source_component.h>
#include <signal_transmitter.h>
/* base-internal includes */
#include <base/internal/globals.h>
using namespace Genode;
namespace {
struct Signal_delivery_proxy
{
/*
* Wrap pointer into struct to transmit it (core-locally) as plain-old
* data.
*/
struct Context_ptr { Signal_context_component *ptr; };
GENODE_RPC(Rpc_deliver, void, _deliver_from_ep, Context_ptr, unsigned);
GENODE_RPC_INTERFACE(Rpc_deliver);
};
struct Signal_delivery_proxy_component
:
Rpc_object<Signal_delivery_proxy, Signal_delivery_proxy_component>
{
Rpc_entrypoint &_ep;
Capability<Signal_delivery_proxy> _proxy_cap = _ep.manage(this);
/**
* Constructor
*
* \param ep entrypoint to be used as a proxy for delivering signals
* as IPC-reply messages.
*/
Signal_delivery_proxy_component(Rpc_entrypoint &ep) : _ep(ep) { }
/**
* Signal_delivery_proxy RPC interface
*
* This method is executed in the context of the 'ep'. Hence, it
* can produce legitimate IPC reply messages to 'Signal_source'
* clients.
*/
void _deliver_from_ep(Context_ptr context_ptr, unsigned cnt)
{
Signal_context_component *context = context_ptr.ptr;
context->source()->submit(context, cnt);
}
/**
* Deliver signal via the proxy mechanism
*
* Since this method perform an RPC call to the 'ep' specified at the
* constructor, is must never be called from this ep.
*
* Called from threads other than 'ep'.
*/
void submit(Signal_context_capability cap, unsigned cnt)
{
_ep.apply(cap, [&] (Signal_context_component *context) {
if (context) {
_proxy_cap.call<Rpc_deliver>(Context_ptr{context}, cnt);
} else {
warning("invalid signal-context capability");
}
});
}
};
}
static Constructible<Signal_delivery_proxy_component> delivery_proxy;
/*
* Entrypoint that servces the 'Signal_source' RPC objects
*/
static Rpc_entrypoint *_ep;
void Genode::init_core_signal_transmitter(Rpc_entrypoint &ep) { _ep = &ep; }
void Genode::init_signal_transmitter(Env &)
{
if (!delivery_proxy.constructed() && _ep)
delivery_proxy.construct(*_ep);
}
void Signal_transmitter::submit(unsigned cnt)
{
{
Trace::Signal_submit trace_event(cnt);
}
delivery_proxy->submit(_context, cnt);
}

View File

@ -2,9 +2,6 @@
* \brief Interfaces to library-global objects * \brief Interfaces to library-global objects
* \author Norman Feske * \author Norman Feske
* \date 2016-04-29 * \date 2016-04-29
*
* \deprecated This header should be removed once we have completed the
* transition to the modernized API.
*/ */
/* /*
@ -30,6 +27,7 @@ namespace Genode {
extern Ram_session *env_stack_area_ram_session; extern Ram_session *env_stack_area_ram_session;
void init_exception_handling(Env &); void init_exception_handling(Env &);
void init_signal_transmitter(Env &);
void init_cxx_heap(Env &); void init_cxx_heap(Env &);
void init_ldso_phdr(Env &); void init_ldso_phdr(Env &);
void init_signal_thread(Env &); void init_signal_thread(Env &);
@ -37,6 +35,8 @@ namespace Genode {
void init_log(); void init_log();
void exec_static_constructors(); void exec_static_constructors();
void destroy_signal_thread();
Id_space<Parent::Client> &env_session_id_space(); Id_space<Parent::Client> &env_session_id_space();
Env &internal_env(); Env &internal_env();
} }

View File

@ -272,6 +272,7 @@ namespace {
Genode::inhibit_tracing = false; Genode::inhibit_tracing = false;
Genode::call_global_static_constructors(); Genode::call_global_static_constructors();
Genode::init_signal_transmitter(env);
Component::construct(env); Component::construct(env);
} }
@ -282,11 +283,11 @@ namespace {
Entrypoint::Entrypoint(Env &env) Entrypoint::Entrypoint(Env &env)
: :
_env(env), _env(env),
_rpc_ep(&env.pd(), Component::stack_size(), initial_ep_name()) _rpc_ep(&env.pd(), Component::stack_size(), initial_ep_name()),
{
/* initialize signalling after initializing but before calling the entrypoint */
init_signal_thread(_env);
/* initialize signalling before creating the first signal receiver */
_signalling_initialized((init_signal_thread(env), true))
{
/* initialize emulation of the original synchronous root interface */ /* initialize emulation of the original synchronous root interface */
init_root_proxy(_env); init_root_proxy(_env);
@ -317,7 +318,7 @@ Entrypoint::Entrypoint(Env &env)
Entrypoint::Entrypoint(Env &env, size_t stack_size, char const *name) Entrypoint::Entrypoint(Env &env, size_t stack_size, char const *name)
: :
_env(env), _env(env),
_rpc_ep(&env.pd(), stack_size, name) _rpc_ep(&env.pd(), stack_size, name), _signalling_initialized(true)
{ {
_signal_proxy_thread.construct(env, *this); _signal_proxy_thread.construct(env, *this);
} }

View File

@ -2,30 +2,40 @@
* \brief Generic implementation parts of the signaling framework * \brief Generic implementation parts of the signaling framework
* \author Norman Feske * \author Norman Feske
* \author Alexander Boettcher * \author Alexander Boettcher
* \date 2015-03-17
*/ */
/* /*
* Copyright (C) 2008-2017 Genode Labs GmbH * Copyright (C) 2015-2017 Genode Labs GmbH
* *
* This file is part of the Genode OS framework, which is distributed * This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3. * under the terms of the GNU Affero General Public License version 3.
*/ */
/* Genode includes */
#include <base/env.h> #include <base/env.h>
#include <base/trace/events.h> #include <base/trace/events.h>
#include <base/signal.h>
/* base-internal includes */
#include <base/internal/globals.h>
using namespace Genode; using namespace Genode;
static Pd_session *_pd;
void Genode::init_signal_transmitter(Env &env) { _pd = &env.pd(); }
/************************
** Signal transmitter **
************************/
void Signal_transmitter::submit(unsigned cnt) void Signal_transmitter::submit(unsigned cnt)
{ {
{ {
Trace::Signal_submit trace_event(cnt); Trace::Signal_submit trace_event(cnt);
} }
env_deprecated()->pd_session()->submit(_context, cnt);
if (_pd)
_pd->submit(_context, cnt);
else
warning("missing call of 'init_signal_submit'");
} }