diff --git a/repos/base-foc/src/core/rpc_cap_factory.cc b/repos/base-foc/src/core/rpc_cap_factory.cc index 60baf669d..3d4d75038 100644 --- a/repos/base-foc/src/core/rpc_cap_factory.cc +++ b/repos/base-foc/src/core/rpc_cap_factory.cc @@ -14,7 +14,6 @@ /* Genode includes */ #include -#include #include /* core includes */ diff --git a/repos/base-foc/src/lib/base/signal_source_client.cc b/repos/base-foc/src/lib/base/signal_source_client.cc index 07f15517b..35de53346 100644 --- a/repos/base-foc/src/lib/base/signal_source_client.cc +++ b/repos/base-foc/src/lib/base/signal_source_client.cc @@ -17,6 +17,7 @@ #include #include #include +#include /* base-internal includes */ #include diff --git a/repos/base-foc/src/lib/base/thread_start.cc b/repos/base-foc/src/lib/base/thread_start.cc index ba41c6f26..911b64ecb 100644 --- a/repos/base-foc/src/lib/base/thread_start.cc +++ b/repos/base-foc/src/lib/base/thread_start.cc @@ -20,6 +20,7 @@ #include #include #include +#include /* base-internal includes */ #include diff --git a/repos/base-foc/src/test/cap_integrity/main.cc b/repos/base-foc/src/test/cap_integrity/main.cc index 16ec50ea6..019f35a46 100644 --- a/repos/base-foc/src/test/cap_integrity/main.cc +++ b/repos/base-foc/src/test/cap_integrity/main.cc @@ -35,7 +35,7 @@ Main::Main(Env &env) enum { COUNT = 1000 }; Cap_index* idx = cap_idx_alloc().alloc_range(COUNT); - Fiasco::l4_cap_idx_t tid = Capability_space::kcap(env.ram_session_cap()); + Fiasco::l4_cap_idx_t tid = Capability_space::kcap(env.pd_session_cap()); /* try the first 1000 local name IDs */ for (int local_name = 0; local_name < COUNT; local_name++, idx++) { diff --git a/repos/base-hw/src/bootstrap/env.cc b/repos/base-hw/src/bootstrap/env.cc index f4fc94168..64ab81b27 100644 --- a/repos/base-hw/src/bootstrap/env.cc +++ b/repos/base-hw/src/bootstrap/env.cc @@ -13,6 +13,7 @@ #include #include +#include Genode::Env_deprecated * Genode::env_deprecated() { diff --git a/repos/base-hw/src/bootstrap/platform.h b/repos/base-hw/src/bootstrap/platform.h index 8ce41c450..dd79d55f8 100644 --- a/repos/base-hw/src/bootstrap/platform.h +++ b/repos/base-hw/src/bootstrap/platform.h @@ -68,7 +68,7 @@ class Bootstrap::Platform Ram_allocator() : Genode::Allocator_avl_base(&_slab, sizeof(Base::Block)), - _slab(this, (Genode::Slab_block*)&_first_slab) {} + _slab(this, (Block *)&_first_slab) {} void * alloc_aligned(size_t size, unsigned align); bool alloc(size_t size, void **out_addr) override; diff --git a/repos/base-hw/src/core/platform_thread.cc b/repos/base-hw/src/core/platform_thread.cc index ac74195ba..f8b7029ba 100644 --- a/repos/base-hw/src/core/platform_thread.cc +++ b/repos/base-hw/src/core/platform_thread.cc @@ -47,7 +47,7 @@ Platform_thread::~Platform_thread() } /* free UTCB */ - core_env().ram_session()->free(_utcb); + core_env().pd_session()->free(_utcb); } @@ -90,7 +90,7 @@ Platform_thread::Platform_thread(size_t const quota, _kobj(true, _priority(virt_prio), quota, _label.string()) { try { - _utcb = core_env().ram_session()->alloc(sizeof(Native_utcb), CACHED); + _utcb = core_env().pd_session()->alloc(sizeof(Native_utcb), CACHED); } catch (...) { error("failed to allocate UTCB"); throw Out_of_ram(); diff --git a/repos/base-hw/src/core/platform_thread.h b/repos/base-hw/src/core/platform_thread.h index a6f296893..20d66b48c 100644 --- a/repos/base-hw/src/core/platform_thread.h +++ b/repos/base-hw/src/core/platform_thread.h @@ -16,7 +16,7 @@ #define _CORE__PLATFORM_THREAD_H_ /* Genode includes */ -#include +#include #include /* base-internal includes */ diff --git a/repos/base-hw/src/core/thread_start.cc b/repos/base-hw/src/core/thread_start.cc index 8f2f981d4..cf7cc38c6 100644 --- a/repos/base-hw/src/core/thread_start.cc +++ b/repos/base-hw/src/core/thread_start.cc @@ -29,8 +29,6 @@ using namespace Genode; -namespace Genode { Rm_session *env_stack_area_rm_session(); } - namespace Hw { extern Untyped_capability _main_thread_cap; } diff --git a/repos/base-hw/src/lib/base/signal_transmitter.cc b/repos/base-hw/src/lib/base/signal_transmitter.cc index e4944274f..d7a7bfd2d 100644 --- a/repos/base-hw/src/lib/base/signal_transmitter.cc +++ b/repos/base-hw/src/lib/base/signal_transmitter.cc @@ -27,9 +27,6 @@ using namespace Genode; void Genode::init_signal_transmitter(Env &) { } -void Signal_context::submit(unsigned) { Genode::error("not implemented"); } - - void Signal_transmitter::submit(unsigned cnt) { { diff --git a/repos/base-hw/src/lib/base/thread_start.cc b/repos/base-hw/src/lib/base/thread_start.cc index ce270866a..fa92ea9b5 100644 --- a/repos/base-hw/src/lib/base/thread_start.cc +++ b/repos/base-hw/src/lib/base/thread_start.cc @@ -18,6 +18,7 @@ #include #include #include +#include /* base-internal includes */ #include diff --git a/repos/base-hw/src/test/cpu_quota/include/sync_session/connection.h b/repos/base-hw/src/test/cpu_quota/include/sync_session/connection.h index c0013747c..65fc2cfee 100644 --- a/repos/base-hw/src/test/cpu_quota/include/sync_session/connection.h +++ b/repos/base-hw/src/test/cpu_quota/include/sync_session/connection.h @@ -27,7 +27,7 @@ struct Sync::Connection : public Genode::Connection, public Genode::Rpc_client { explicit Connection(Genode::Env &env) - : Genode::Connection(env, session("ram_quota=4K")), + : Genode::Connection(env, session(env.parent(), "ram_quota=4K")), Genode::Rpc_client(cap()) { } void threshold(unsigned threshold) override { call(threshold); } diff --git a/repos/base-linux/run/lx_hybrid_ctors.run b/repos/base-linux/run/lx_hybrid_ctors.run index 6fa4e07ec..53465130b 100644 --- a/repos/base-linux/run/lx_hybrid_ctors.run +++ b/repos/base-linux/run/lx_hybrid_ctors.run @@ -64,7 +64,7 @@ grep_output {\[init -\> test-lx_hybrid_ctors\]} compare_output_to { [init -> test-lx_hybrid_ctors] Global static constructor of host library called. - [init -> test-lx_hybrid_ctors] Global static constructor of Genode application called + [init -> test-lx_hybrid_ctors] Global static constructor of Genode application called. [init -> test-lx_hybrid_ctors] --- lx_hybrid global static constructor test --- [init -> test-lx_hybrid_ctors] --- returning from main --- } diff --git a/repos/base-linux/src/core/include/pager.h b/repos/base-linux/src/core/include/pager.h index 9639d1b01..e0ebfea0f 100644 --- a/repos/base-linux/src/core/include/pager.h +++ b/repos/base-linux/src/core/include/pager.h @@ -19,8 +19,8 @@ /* Genode includes */ #include +#include /* for 'Thread_capability' type */ #include -#include /* core-local includes */ #include diff --git a/repos/base-linux/src/core/include/server_socket_pair.h b/repos/base-linux/src/core/include/server_socket_pair.h index 5ce82dc20..9d5c8109d 100644 --- a/repos/base-linux/src/core/include/server_socket_pair.h +++ b/repos/base-linux/src/core/include/server_socket_pair.h @@ -49,6 +49,8 @@ static inline Genode::Socket_pair create_server_socket_pair(long id) { Genode::Socket_pair socket_pair; + using Genode::raw; + /* * Main thread uses 'Ipc_server' for 'sleep_forever()' only. No need for * binding. @@ -63,7 +65,7 @@ static inline Genode::Socket_pair create_server_socket_pair(long id) */ socket_pair.server_sd = lx_socket(AF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC, 0); if (socket_pair.server_sd < 0) { - PRAW("Error: Could not create server-side socket (ret=%d)", socket_pair.server_sd); + raw("Error: Could not create server-side socket (ret=", socket_pair.server_sd, ")"); class Server_socket_failed { }; throw Server_socket_failed(); } @@ -73,7 +75,7 @@ static inline Genode::Socket_pair create_server_socket_pair(long id) int const bind_ret = lx_bind(socket_pair.server_sd, (sockaddr *)&addr, sizeof(addr)); if (bind_ret < 0) { - PRAW("Error: Could not bind server socket (ret=%d)", bind_ret); + raw("Error: Could not bind server socket (ret=", bind_ret, ")"); class Bind_failed { }; throw Bind_failed(); } @@ -83,14 +85,14 @@ static inline Genode::Socket_pair create_server_socket_pair(long id) */ socket_pair.client_sd = lx_socket(AF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC, 0); if (socket_pair.client_sd < 0) { - PRAW("Error: Could not create client-side socket (ret=%d)", socket_pair.client_sd); + raw("Error: Could not create client-side socket (ret=", socket_pair.client_sd, ")"); class Client_socket_failed { }; throw Client_socket_failed(); } int const conn_ret = lx_connect(socket_pair.client_sd, (sockaddr *)&addr, sizeof(addr)); if (conn_ret < 0) { - PRAW("Error: Could not connect client-side socket (ret=%d)", conn_ret); + raw("Error: Could not connect client-side socket (ret=", conn_ret, ")"); class Connect_failed { }; throw Connect_failed(); } diff --git a/repos/base-linux/src/core/stack_area.cc b/repos/base-linux/src/core/stack_area.cc index 4f24436bb..32bd72828 100644 --- a/repos/base-linux/src/core/stack_area.cc +++ b/repos/base-linux/src/core/stack_area.cc @@ -13,7 +13,7 @@ /* Genode includes */ #include -#include +#include #include /* base-internal includes */ diff --git a/repos/base-linux/src/include/base/internal/local_pd_session.h b/repos/base-linux/src/include/base/internal/local_pd_session.h index 075422865..600cd55c1 100644 --- a/repos/base-linux/src/include/base/internal/local_pd_session.h +++ b/repos/base-linux/src/include/base/internal/local_pd_session.h @@ -33,7 +33,8 @@ struct Genode::Local_pd_session : Expanding_pd_session_client Region_map_mmap _stack_area { true, stack_area_virtual_size() }; Region_map_mmap _linker_area { true, Pd_session::LINKER_AREA_SIZE }; - Local_pd_session(Pd_session_capability pd) : Expanding_pd_session_client(pd) { } + Local_pd_session(Parent &parent, Pd_session_capability pd) + : Expanding_pd_session_client(parent, pd) { } Capability address_space() { diff --git a/repos/base-linux/src/include/base/internal/platform_env.h b/repos/base-linux/src/include/base/internal/platform_env.h index c0c146ba4..7ce68f408 100644 --- a/repos/base-linux/src/include/base/internal/platform_env.h +++ b/repos/base-linux/src/include/base/internal/platform_env.h @@ -55,29 +55,30 @@ class Genode::Platform_env_base : public Env_deprecated * in 'Platform_env_base' because the procedure differs between * core and non-core components. */ - Local_pd_session _local_pd_session { _pd_session_cap }; + Local_pd_session _local_pd_session; public: /** * Constructor */ - Platform_env_base(Cpu_session_capability cpu_cap, + Platform_env_base(Parent &parent, + Cpu_session_capability cpu_cap, Pd_session_capability pd_cap) : _cpu_session_cap(cpu_cap), - _cpu_session_client(cpu_cap, Parent::Env::cpu()), + _cpu_session_client(parent, cpu_cap, Parent::Env::cpu()), _region_map_mmap(false), _pd_session_cap(pd_cap), - _local_pd_session(_pd_session_cap) + _local_pd_session(parent, _pd_session_cap) { } /** * Constructor used by 'Core_env' */ - Platform_env_base() + Platform_env_base(Parent &parent) : - Platform_env_base(Cpu_session_capability(), Pd_session_capability()) + Platform_env_base(parent, Cpu_session_capability(), Pd_session_capability()) { } @@ -85,8 +86,6 @@ class Genode::Platform_env_base : public Env_deprecated ** Env_deprecated interface ** ******************************/ - Ram_session *ram_session() override { return &_local_pd_session; } - Ram_session_capability ram_session_cap() override { return _pd_session_cap; } Region_map *rm_session() override { return &_region_map_mmap; } Cpu_session *cpu_session() override { return &_cpu_session_client; } Cpu_session_capability cpu_session_cap() override { return _cpu_session_cap; } @@ -134,8 +133,9 @@ class Genode::Platform_env : public Platform_env_base ** Env_deprecated interface ** ******************************/ - Parent *parent() override { return &_parent(); } - Heap *heap() override { return &_heap; } + Parent *parent() override { return &_parent(); } + Allocator *heap() override { return &_heap; } + }; #endif /* _INCLUDE__BASE__INTERNAL__PLATFORM_ENV_H_ */ diff --git a/repos/base-linux/src/include/base/internal/region_map_mmap.h b/repos/base-linux/src/include/base/internal/region_map_mmap.h index fa5b9d7e7..2645128f9 100644 --- a/repos/base-linux/src/include/base/internal/region_map_mmap.h +++ b/repos/base-linux/src/include/base/internal/region_map_mmap.h @@ -19,6 +19,7 @@ #include #include #include +#include /* base-internal includes */ #include diff --git a/repos/base-linux/src/lib/base/ipc.cc b/repos/base-linux/src/lib/base/ipc.cc index 6ef792259..3372f4abd 100644 --- a/repos/base-linux/src/lib/base/ipc.cc +++ b/repos/base-linux/src/lib/base/ipc.cc @@ -160,7 +160,7 @@ static int lookup_tid_by_client_socket(int sd) unsigned tid = 0; if (Genode::ascii_to(name.sun_path + prefix_len.len, tid) == 0) { - PRAW("Error: could not parse tid number"); + raw("Error: could not parse tid number"); return -1; } return tid; @@ -354,7 +354,8 @@ static inline void lx_reply(int reply_socket, Rpc_exception_code exception_code, } if (ret < 0) - PRAW("[%d] lx_sendmsg failed with %d in lx_reply() reply_socket=%d", lx_gettid(), ret, reply_socket); + raw("[", lx_gettid, "] lx_sendmsg failed with ", ret, " " + "in lx_reply() reply_socket=", reply_socket); } @@ -388,7 +389,7 @@ Rpc_exception_code Genode::ipc_call(Native_capability dst, int ret = lx_socketpair(AF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC, 0, sd); if (ret < 0) { - PRAW("[%d] lx_socketpair failed with %d", lx_getpid(), ret); + raw("[", lx_gettid(), "] lx_socketpair failed with ", ret); throw Genode::Ipc_error(); } } @@ -438,7 +439,7 @@ Rpc_exception_code Genode::ipc_call(Native_capability dst, throw Genode::Blocking_canceled(); if (recv_ret < 0) { - PRAW("[%d] lx_recvmsg failed with %d in lx_call()", lx_getpid(), recv_ret); + raw("[", lx_getpid(), "] lx_recvmsg failed with ", recv_ret, " in lx_call()"); throw Genode::Ipc_error(); } @@ -496,8 +497,8 @@ Genode::Rpc_request Genode::ipc_reply_wait(Reply_capability const &last_caller, continue; if (ret < 0) { - PRAW("lx_recvmsg failed with %d in ipc_reply_wait, sd=%d", - ret, native_thread.socket_pair.server_sd); + raw("lx_recvmsg failed with ", ret, " in ipc_reply_wait, sd=", + native_thread.socket_pair.server_sd); continue; } @@ -528,8 +529,8 @@ Ipc_server::Ipc_server() Native_thread &native_thread = Thread::myself()->native_thread(); if (native_thread.is_ipc_server) { - PRAW("[%d] unexpected multiple instantiation of Ipc_server by one thread", - lx_gettid()); + Genode::raw("[", lx_gettid(), "] " + " unexpected multiple instantiation of Ipc_server by one thread"); struct Ipc_server_multiple_instance { }; throw Ipc_server_multiple_instance(); } diff --git a/repos/base-linux/src/lib/base/platform_env.cc b/repos/base-linux/src/lib/base/platform_env.cc index de523dd71..6cc5bb00c 100644 --- a/repos/base-linux/src/lib/base/platform_env.cc +++ b/repos/base-linux/src/lib/base/platform_env.cc @@ -154,14 +154,15 @@ Local_parent &Platform_env::_parent() Platform_env::Platform_env() : - Platform_env_base(static_cap_cast(_parent().session_cap(Parent::Env::cpu())), + Platform_env_base(_parent(), + static_cap_cast(_parent().session_cap(Parent::Env::cpu())), static_cap_cast (_parent().session_cap(Parent::Env::pd()))), - _heap(Platform_env_base::ram_session(), Platform_env_base::rm_session()) + _heap(Platform_env_base::pd_session(), Platform_env_base::rm_session()) { _attach_stack_area(); env_stack_area_region_map = &_local_pd_session._stack_area; - env_stack_area_ram_allocator = ram_session(); + env_stack_area_ram_allocator = Platform_env_base::pd_session(); /* register TID and PID of the main thread at core */ Linux_native_cpu_client native_cpu(cpu_session()->native_cpu()); diff --git a/repos/base-linux/src/lib/base/region_map_client.cc b/repos/base-linux/src/lib/base/region_map_client.cc index 463c15707..c5b55d8f0 100644 --- a/repos/base-linux/src/lib/base/region_map_client.cc +++ b/repos/base-linux/src/lib/base/region_map_client.cc @@ -41,13 +41,13 @@ Region_map_client::attach(Dataspace_capability ds, size_t size, Region_map::Local_addr local_addr, bool executable, bool writeable) { - return _local(*this)->attach(ds, size, offset, use_local_addr, + return _local(rpc_cap())->attach(ds, size, offset, use_local_addr, local_addr, executable, writeable); } void Region_map_client::detach(Local_addr local_addr) { - return _local(*this)->detach(local_addr); } + return _local(rpc_cap())->detach(local_addr); } void Region_map_client::fault_handler(Signal_context_capability /*handler*/) @@ -61,9 +61,9 @@ void Region_map_client::fault_handler(Signal_context_capability /*handler*/) } -Region_map::State Region_map_client::state() { return _local(*this)->state(); } +Region_map::State Region_map_client::state() { return _local(rpc_cap())->state(); } Dataspace_capability Region_map_client::dataspace() { - return _local(*this) ? _local(*this)->dataspace() : Dataspace_capability(); } + return _local(rpc_cap()) ? _local(rpc_cap())->dataspace() : Dataspace_capability(); } diff --git a/repos/base-linux/src/lib/base/rm_session_client.cc b/repos/base-linux/src/lib/base/rm_session_client.cc index 532d3529f..eefecc08c 100644 --- a/repos/base-linux/src/lib/base/rm_session_client.cc +++ b/repos/base-linux/src/lib/base/rm_session_client.cc @@ -36,8 +36,8 @@ Rm_session_client::Rm_session_client(Capability session) Capability Rm_session_client::create(size_t size) { - return _local(*this)->create(size); } + return _local(rpc_cap())->create(size); } void Rm_session_client::destroy(Capability cap) { - _local(*this)->destroy(cap); } + _local(rpc_cap())->destroy(cap); } diff --git a/repos/base-linux/src/lib/base/thread_env.cc b/repos/base-linux/src/lib/base/thread_env.cc index 0d8d97f90..d7523d68a 100644 --- a/repos/base-linux/src/lib/base/thread_env.cc +++ b/repos/base-linux/src/lib/base/thread_env.cc @@ -32,20 +32,6 @@ char **lx_environ; */ int main_thread_futex_counter __attribute__((aligned(sizeof(addr_t)))); -/** - * Genode console hook - */ -extern "C" int stdout_write(char const *); - -/* - * Core lacks the hook, so provide a base-linux specific weak implementation - */ -extern "C" __attribute__((weak)) int stdout_write(char const *s) -{ - raw(s); - return Genode::strlen(s); -} - /** * Signal handler for exceptions like segmentation faults */ @@ -62,17 +48,7 @@ void exception_signal_handler(int signum) default: /* unexpected signal */ return; } - /* - * We can't use Genode::printf() as the exception may have occurred in the - * Genode console library itself, which uses a mutex. Therefore, we use - * Genode::snprintf() and call the console hook directly to minimize - * overlaps with other code paths. - */ - static char msg[128]; - snprintf(msg, sizeof(msg), - ESC_ERR "%s (signum=%d), see Linux kernel log for details" ESC_END "\n", - reason, signum); - stdout_write(msg); + raw(reason, " (signum=", signum, "), see Linux kernel log for details"); /* * We reset the signal handler to SIG_DFL and trigger exception again, diff --git a/repos/base-linux/src/lib/base/thread_linux.cc b/repos/base-linux/src/lib/base/thread_linux.cc index 202896980..0d3e9a41d 100644 --- a/repos/base-linux/src/lib/base/thread_linux.cc +++ b/repos/base-linux/src/lib/base/thread_linux.cc @@ -20,6 +20,7 @@ #include #include #include +#include /* base-internal includes */ #include diff --git a/repos/base-linux/src/lib/lx_hybrid/lx_hybrid.cc b/repos/base-linux/src/lib/lx_hybrid/lx_hybrid.cc index 91ba10641..69d9a88a0 100644 --- a/repos/base-linux/src/lib/lx_hybrid/lx_hybrid.cc +++ b/repos/base-linux/src/lib/lx_hybrid/lx_hybrid.cc @@ -86,8 +86,16 @@ namespace Genode { * This function is normally provided by the cxx library, which is not * used for lx_hybrid programs. For lx_hybrid programs, the exception * handling is initialized by the host system's regular startup code. + * + * However, we conveniently use this function to get hold of the + * component's environment and initialize the default log output. */ - void init_exception_handling(Env &env) { _env_ptr = &env; } + void init_exception_handling(Env &env) + { + _env_ptr = &env; + + init_log(env.parent()); + } } /* diff --git a/repos/base-linux/src/lib/syscall/linux_syscalls.h b/repos/base-linux/src/lib/syscall/linux_syscalls.h index ad1745021..5b5bafad1 100644 --- a/repos/base-linux/src/lib/syscall/linux_syscalls.h +++ b/repos/base-linux/src/lib/syscall/linux_syscalls.h @@ -34,7 +34,6 @@ /* Genode includes */ #include -#include #include #include diff --git a/repos/base-linux/src/test/lx_hybrid_ctors/main.cc b/repos/base-linux/src/test/lx_hybrid_ctors/main.cc index 18e404cc3..9791be1e9 100644 --- a/repos/base-linux/src/test/lx_hybrid_ctors/main.cc +++ b/repos/base-linux/src/test/lx_hybrid_ctors/main.cc @@ -20,6 +20,7 @@ /* Linux includes */ #include +#include using namespace Genode; @@ -28,7 +29,7 @@ struct Testapp_testclass { Testapp_testclass() { - Genode::log("Global static constructor of Genode application called"); + printf("[init -> test-lx_hybrid_ctors] Global static constructor of Genode application called.\n"); } void dummy() { } diff --git a/repos/base-nova/src/core/include/platform_thread.h b/repos/base-nova/src/core/include/platform_thread.h index bef720d8b..a1f2c1337 100644 --- a/repos/base-nova/src/core/include/platform_thread.h +++ b/repos/base-nova/src/core/include/platform_thread.h @@ -16,7 +16,6 @@ #define _CORE__INCLUDE__PLATFORM_THREAD_H_ /* Genode includes */ -#include #include #include #include diff --git a/repos/base-nova/src/lib/base/rpc_cap_alloc.cc b/repos/base-nova/src/lib/base/rpc_cap_alloc.cc index ec8a379bf..8f0e0ad97 100644 --- a/repos/base-nova/src/lib/base/rpc_cap_alloc.cc +++ b/repos/base-nova/src/lib/base/rpc_cap_alloc.cc @@ -16,6 +16,7 @@ #include #include #include +#include /* base-internal includes */ #include diff --git a/repos/base-nova/src/lib/base/thread_start.cc b/repos/base-nova/src/lib/base/thread_start.cc index eae8efa59..fa42b0b6b 100644 --- a/repos/base-nova/src/lib/base/thread_start.cc +++ b/repos/base-nova/src/lib/base/thread_start.cc @@ -22,6 +22,7 @@ #include #include #include +#include /* base-internal includes */ #include diff --git a/repos/base-nova/src/test/platform/main.cc b/repos/base-nova/src/test/platform/main.cc index f20ca4471..856d0ba23 100644 --- a/repos/base-nova/src/test/platform/main.cc +++ b/repos/base-nova/src/test/platform/main.cc @@ -645,7 +645,7 @@ Main::Main(Env &env) : env(env) try { Attached_rom_dataspace config(env, "config"); - config.xml().attribute("check_pat").value(&check_pat); + config.xml().attribute("check_pat").value(check_pat); } catch (...) { Genode::error("no check_pat attribute found"); env.parent().exit(-__LINE__); diff --git a/repos/base-nova/src/timer/nova/time_source.cc b/repos/base-nova/src/timer/nova/time_source.cc index 869a840cb..ebf83fb4a 100644 --- a/repos/base-nova/src/timer/nova/time_source.cc +++ b/repos/base-nova/src/timer/nova/time_source.cc @@ -12,9 +12,6 @@ * under the terms of the GNU Affero General Public License version 3. */ -/* Genode includes */ -#include - /* NOVA includes */ #include @@ -25,17 +22,6 @@ using namespace Genode; using namespace Nova; -Timer::Time_source::Time_source(Env &env) : Threaded_time_source(env) -{ - /* read out the tsc frequency once */ - Attached_rom_dataspace const platform_info { env, "platform_info" }; - Xml_node const hardware = platform_info.xml().sub_node("hardware"); - hardware.sub_node("tsc").attribute("freq_khz").value(&_tsc_khz); - - start(); -} - - void Timer::Time_source::schedule_timeout(Microseconds duration, Timeout_handler &handler) { diff --git a/repos/base-nova/src/timer/nova/time_source.h b/repos/base-nova/src/timer/nova/time_source.h index 3f6925b64..5f1b90706 100644 --- a/repos/base-nova/src/timer/nova/time_source.h +++ b/repos/base-nova/src/timer/nova/time_source.h @@ -17,6 +17,7 @@ /* Genode includes */ #include +#include /* local includes */ #include @@ -28,9 +29,24 @@ class Timer::Time_source : public Threaded_time_source { private: + /* read the tsc frequency from platform info */ + static unsigned long _obtain_tsc_khz(Genode::Env &env) + { + try { + Genode::Attached_rom_dataspace info { env, "platform_info"}; + + return info.xml() + .sub_node("hardware") + .sub_node("tsc") + .attribute_value("freq_khz", 0UL); + } catch (...) { } + + return 0; + } + Genode::addr_t _sem { ~0UL }; unsigned long _timeout_us { 0 }; - unsigned long _tsc_khz { 0 }; + unsigned long const _tsc_khz; Duration _curr_time { Microseconds(0) }; Genode::Trace::Timestamp _tsc_start { Genode::Trace::timestamp() }; Genode::Trace::Timestamp _tsc_last { _tsc_start }; @@ -52,8 +68,12 @@ class Timer::Time_source : public Threaded_time_source public: - Time_source(Genode::Env &env); - + Time_source(Genode::Env &env) + : + Threaded_time_source(env), _tsc_khz(_obtain_tsc_khz(env)) + { + start(); + } /************************* ** Genode::Time_source ** diff --git a/repos/base-okl4/src/core/platform.cc b/repos/base-okl4/src/core/platform.cc index d9b7e6b9f..e9194d00d 100644 --- a/repos/base-okl4/src/core/platform.cc +++ b/repos/base-okl4/src/core/platform.cc @@ -91,12 +91,13 @@ int Platform::bi_add_phys_mem(Okl4::bi_name_t pool, Okl4::uintptr_t base, static char init_slab_block_rom[get_page_size()]; static char init_slab_block_thread[get_page_size()]; + Platform::Platform() : _io_mem_alloc(&core_mem_alloc()), _io_port_alloc(&core_mem_alloc()), _irq_alloc(&core_mem_alloc()), - _rom_slab(&core_mem_alloc(), (Slab_block *)&init_slab_block_rom), - _thread_slab(core_mem_alloc(), (Slab_block *)&init_slab_block_thread) + _rom_slab(&core_mem_alloc(), &init_slab_block_rom), + _thread_slab(core_mem_alloc(), &init_slab_block_thread) { /* * We must be single-threaded at this stage and so this is safe. diff --git a/repos/base-pistachio/src/core/include/map_local.h b/repos/base-pistachio/src/core/include/map_local.h index d28e14796..ef0bb2bdb 100644 --- a/repos/base-pistachio/src/core/include/map_local.h +++ b/repos/base-pistachio/src/core/include/map_local.h @@ -14,8 +14,6 @@ #ifndef _CORE__INCLUDE__MAP_LOCAL_H_ #define _CORE__INCLUDE__MAP_LOCAL_H_ -#include - /* core includes */ #include #include diff --git a/repos/base-sel4/src/core/platform.cc b/repos/base-sel4/src/core/platform.cc index 44381fd45..d8c258f7e 100644 --- a/repos/base-sel4/src/core/platform.cc +++ b/repos/base-sel4/src/core/platform.cc @@ -283,7 +283,7 @@ void Platform::_init_rom_modules() */ static long slab_block[4096]; static Tslab - rom_module_slab(core_mem_alloc(), (Genode::Slab_block *)slab_block); + rom_module_slab(core_mem_alloc(), &slab_block); /* * Allocate unused range of phys CNode address space where to make the diff --git a/repos/base/include/base/env.h b/repos/base/include/base/env.h index 96935a775..f1c2a050a 100644 --- a/repos/base/include/base/env.h +++ b/repos/base/include/base/env.h @@ -38,7 +38,7 @@ struct Genode::Env : Interface * The RAM allocator is backed with the RAM budget of the component's PD * session. This budget can be used to allocate RAM dataspaces. */ - virtual Ram_session &ram() = 0; + virtual Ram_session &ram() { return pd(); } /** * CPU session of the component @@ -68,7 +68,7 @@ struct Genode::Env : Interface * \deprecated the RAM session has become part of the PD session * \noapi */ - virtual Ram_session_capability ram_session_cap() = 0; + virtual Ram_session_capability ram_session_cap() { return pd_session_cap(); } /** * Return the CPU-session capability of the component diff --git a/repos/base/include/deprecated/env.h b/repos/base/include/deprecated/env.h index cd7576593..f9a4bd067 100644 --- a/repos/base/include/deprecated/env.h +++ b/repos/base/include/deprecated/env.h @@ -75,8 +75,8 @@ struct Genode::Env_deprecated : Interface * available to the component. This budget can be used to allocate * RAM dataspaces. */ - virtual Ram_session *ram_session() = 0; - virtual Ram_session_capability ram_session_cap() = 0; + virtual Ram_session *ram_session() { return pd_session(); } + virtual Ram_session_capability ram_session_cap() { return pd_session_cap(); } /** * CPU session of the component diff --git a/repos/base/lib/mk/base.inc b/repos/base/lib/mk/base.inc index 7b2b5a9d9..fda6c24ef 100644 --- a/repos/base/lib/mk/base.inc +++ b/repos/base/lib/mk/base.inc @@ -1,4 +1,4 @@ -SRC_CC += log_console.cc default_log.cc +SRC_CC += default_log.cc SRC_CC += env_deprecated.cc stack_area.cc env_reinit.cc main_thread_cap.cc SRC_CC += rpc_cap_alloc.cc heartbeat.cc diff --git a/repos/base/src/core/cpu_session_component.cc b/repos/base/src/core/cpu_session_component.cc index f3ce44837..4e161496a 100644 --- a/repos/base/src/core/cpu_session_component.cc +++ b/repos/base/src/core/cpu_session_component.cc @@ -239,7 +239,9 @@ int Cpu_session_component::ref_account(Cpu_session_capability ref_cap) } -Cpu_session_component::Cpu_session_component(Rpc_entrypoint &session_ep, +Cpu_session_component::Cpu_session_component(Ram_allocator &ram, + Region_map &local_rm, + Rpc_entrypoint &session_ep, Rpc_entrypoint &thread_ep, Pager_entrypoint &pager_ep, Allocator &md_alloc, @@ -257,7 +259,9 @@ Cpu_session_component::Cpu_session_component(Rpc_entrypoint &session_ep, /* map affinity to a location within the physical affinity space */ _location(affinity.scale_to(platform().affinity_space())), - _trace_sources(trace_sources), _quota(quota), _ref(0), + _trace_sources(trace_sources), + _trace_control_area(ram, local_rm), + _quota(quota), _ref(0), _native_cpu(*this, args) { Arg a = Arg_string::find_arg(args, "priority"); diff --git a/repos/base/src/core/default_log.cc b/repos/base/src/core/default_log.cc index aed0fc910..01a52833a 100644 --- a/repos/base/src/core/default_log.cc +++ b/repos/base/src/core/default_log.cc @@ -41,4 +41,4 @@ Genode::Log &Genode::Log::log() } -void Genode::init_log() { }; +void Genode::init_log(Parent &) { }; diff --git a/repos/base/src/core/include/core_env.h b/repos/base/src/core/include/core_env.h index ce5c19d26..d46500d61 100644 --- a/repos/base/src/core/include/core_env.h +++ b/repos/base/src/core/include/core_env.h @@ -17,6 +17,7 @@ /* Genode includes */ #include +#include /* base-internal includes */ #include @@ -91,8 +92,6 @@ class Genode::Core_env : public Env_deprecated, Noncopyable ******************************/ Parent *parent() override { return nullptr; } - Ram_session *ram_session() override { return &_pd_session; } - Ram_session_capability ram_session_cap() override { return _pd_session.cap(); } Region_map *rm_session() override { return &_region_map; } Pd_session *pd_session() override { return &_pd_session; } Allocator *heap() override { ASSERT_NEVER_CALLED; } diff --git a/repos/base/src/core/include/cpu_root.h b/repos/base/src/core/include/cpu_root.h index 17c6e4b43..ea7ec32d9 100644 --- a/repos/base/src/core/include/cpu_root.h +++ b/repos/base/src/core/include/cpu_root.h @@ -26,6 +26,8 @@ namespace Genode { { private: + Ram_allocator &_ram; + Region_map &_local_rm; Rpc_entrypoint &_thread_ep; Pager_entrypoint &_pager_ep; Allocator &_md_alloc; @@ -44,6 +46,7 @@ namespace Genode { return new (md_alloc()) Cpu_session_component( + _ram, _local_rm, *Root_component::ep(), _thread_ep, _pager_ep, _md_alloc, _trace_sources, args, affinity, 0); @@ -64,13 +67,16 @@ namespace Genode { * \param thread_ep entry point for managing threads * \param md_alloc meta data allocator to be used by root component */ - Cpu_root(Rpc_entrypoint &session_ep, + Cpu_root(Ram_allocator &ram, + Region_map &local_rm, + Rpc_entrypoint &session_ep, Rpc_entrypoint &thread_ep, Pager_entrypoint &pager_ep, Allocator &md_alloc, Trace::Source_registry &trace_sources) : Root_component(&session_ep, &md_alloc), + _ram(ram), _local_rm(local_rm), _thread_ep(thread_ep), _pager_ep(pager_ep), _md_alloc(md_alloc), _trace_sources(trace_sources) { } diff --git a/repos/base/src/core/include/cpu_session_component.h b/repos/base/src/core/include/cpu_session_component.h index 8100cba1b..57c9d4c04 100644 --- a/repos/base/src/core/include/cpu_session_component.h +++ b/repos/base/src/core/include/cpu_session_component.h @@ -55,7 +55,7 @@ class Genode::Cpu_session_component : public Rpc_object, Affinity::Location _location; /* CPU affinity of this session */ Trace::Source_registry &_trace_sources; - Trace::Control_area _trace_control_area { }; + Trace::Control_area _trace_control_area; /* * Members for quota accounting @@ -139,7 +139,9 @@ class Genode::Cpu_session_component : public Rpc_object, /** * Constructor */ - Cpu_session_component(Rpc_entrypoint &session_ep, + Cpu_session_component(Ram_allocator &ram, + Region_map &local_rm, + Rpc_entrypoint &session_ep, Rpc_entrypoint &thread_ep, Pager_entrypoint &pager_ep, Allocator &md_alloc, diff --git a/repos/base/src/core/include/platform_generic.h b/repos/base/src/core/include/platform_generic.h index 1bc50b2a5..c394c83a7 100644 --- a/repos/base/src/core/include/platform_generic.h +++ b/repos/base/src/core/include/platform_generic.h @@ -16,7 +16,6 @@ #define _CORE__INCLUDE__PLATFORM_GENERIC_H_ /* Genode includes */ -#include #include #include diff --git a/repos/base/src/core/include/trace/control_area.h b/repos/base/src/core/include/trace/control_area.h index bc8788734..beb50b3b2 100644 --- a/repos/base/src/core/include/trace/control_area.h +++ b/repos/base/src/core/include/trace/control_area.h @@ -31,18 +31,20 @@ class Genode::Trace::Control_area private: + Ram_allocator &_ram; + Region_map &_rm; Ram_dataspace_capability _ds; Trace::Control *_local_base; - static Ram_dataspace_capability _try_alloc(size_t size) + static Ram_dataspace_capability _try_alloc(Ram_allocator &ram, size_t size) { - try { return env_deprecated()->ram_session()->alloc(size); } + try { return ram.alloc(size); } catch (...) { return Ram_dataspace_capability(); } } - static Trace::Control *_try_attach(Dataspace_capability ds) + static Trace::Control *_try_attach(Region_map &rm, Dataspace_capability ds) { - try { return env_deprecated()->rm_session()->attach(ds); } + try { return rm.attach(ds); } catch (...) { return nullptr; } } @@ -59,16 +61,17 @@ class Genode::Trace::Control_area public: - Control_area() + Control_area(Ram_allocator &ram, Region_map &rm) : - _ds(_try_alloc(SIZE)), - _local_base(_try_attach(_ds)) + _ram(ram), _rm(rm), + _ds(_try_alloc(ram, SIZE)), + _local_base(_try_attach(rm, _ds)) { } ~Control_area() { - if (_local_base) env_deprecated()->rm_session()->detach(_local_base); - if (_ds.valid()) env_deprecated()->ram_session()->free(_ds); + if (_local_base) _rm.detach(_local_base); + if (_ds.valid()) _ram.free(_ds); } Dataspace_capability dataspace() const { return _ds; } diff --git a/repos/base/src/core/include/trace/root.h b/repos/base/src/core/include/trace/root.h index 666cb13bb..349ddc087 100644 --- a/repos/base/src/core/include/trace/root.h +++ b/repos/base/src/core/include/trace/root.h @@ -27,6 +27,8 @@ class Genode::Trace::Root : public Genode::Root_component { private: + Ram_allocator &_ram; + Region_map &_local_rm; Source_registry &_sources; Policy_registry &_policies; @@ -42,8 +44,9 @@ class Genode::Trace::Root : public Genode::Root_component throw Service_denied(); return new (md_alloc()) - Session_component(*md_alloc(), ram_quota, arg_buffer_size, - parent_levels, label_from_args(args).string(), _sources, _policies); + Session_component(_ram, _local_rm, *md_alloc(), ram_quota, + arg_buffer_size, parent_levels, + label_from_args(args).string(), _sources, _policies); } void _upgrade_session(Session_component *s, const char *args) override @@ -57,16 +60,14 @@ class Genode::Trace::Root : public Genode::Root_component /** * Constructor * - * \param session_ep entry point for managing session objects - * \param md_alloc meta data allocator used by root component - * \param ram_quota RAM for tracing purposes of this session - * \param arg_buffer_size session argument-buffer size + * \param session_ep entry point for managing session objects */ - Root(Rpc_entrypoint &session_ep, Allocator &md_alloc, + Root(Ram_allocator &ram, Region_map &local_rm, + Rpc_entrypoint &session_ep, Allocator &md_alloc, Source_registry &sources, Policy_registry &policies) : Root_component(&session_ep, &md_alloc), - _sources(sources), _policies(policies) + _ram(ram), _local_rm(local_rm), _sources(sources), _policies(policies) { } }; diff --git a/repos/base/src/core/include/trace/session_component.h b/repos/base/src/core/include/trace/session_component.h index 38a8c2afd..156ed17a2 100644 --- a/repos/base/src/core/include/trace/session_component.h +++ b/repos/base/src/core/include/trace/session_component.h @@ -18,6 +18,7 @@ #include #include #include +#include #include /* core-local includes */ @@ -35,7 +36,8 @@ class Genode::Trace::Session_component { private: - Ram_session &_ram; + Ram_allocator &_ram; + Region_map &_local_rm; Allocator_guard _md_alloc; Tslab _subjects_slab; Tslab _policies_slab; @@ -45,48 +47,18 @@ class Genode::Trace::Session_component Policy_registry &_policies; Subject_registry _subjects; unsigned _policy_cnt { 0 }; - - class Argument_buffer - { - private: - - /* - * Noncopyable - */ - Argument_buffer(Argument_buffer const &); - Argument_buffer &operator = (Argument_buffer const &); - - public: - - Ram_session &ram; - Ram_dataspace_capability ds; - char *base; - size_t size; - - Argument_buffer(Ram_session &ram, size_t size) - : - ram(ram), - ds(ram.alloc(size)), - base(env_deprecated()->rm_session()->attach(ds)), - size(ram.dataspace_size(ds)) - { } - - ~Argument_buffer() - { - env_deprecated()->rm_session()->detach(base); - ram.free(ds); - } - } _argument_buffer; + Attached_ram_dataspace _argument_buffer; public: /** * Constructor */ - Session_component(Allocator &md_alloc, size_t ram_quota, - size_t arg_buffer_size, unsigned parent_levels, - char const *label, Source_registry &sources, - Policy_registry &policies); + Session_component(Ram_allocator &ram, Region_map &local_rm, + Allocator &md_alloc, size_t ram_quota, + size_t arg_buffer_size, unsigned parent_levels, + char const *label, Source_registry &sources, + Policy_registry &policies); ~Session_component(); diff --git a/repos/base/src/core/include/trace/subject_registry.h b/repos/base/src/core/include/trace/subject_registry.h index b04484e03..87df4564c 100644 --- a/repos/base/src/core/include/trace/subject_registry.h +++ b/repos/base/src/core/include/trace/subject_registry.h @@ -54,7 +54,7 @@ class Genode::Trace::Subject { private: - Ram_session *_ram_ptr { nullptr }; + Ram_allocator *_ram_ptr { nullptr }; size_t _size { 0 }; Ram_dataspace_capability _ds { }; @@ -83,7 +83,7 @@ class Genode::Trace::Subject * \return true on success, false on the attempt to call setup * twice. */ - bool setup(Ram_session &ram, size_t size) + bool setup(Ram_allocator &ram, size_t size) { if (_size) return false; @@ -97,8 +97,8 @@ class Genode::Trace::Subject /** * Clone dataspace into newly allocated dataspace */ - bool setup(Ram_session &ram, Dataspace_capability &from_ds, - size_t size) + bool setup(Ram_allocator &ram, Region_map &local_rm, + Dataspace_capability &from_ds, size_t size) { if (!from_ds.valid()) return false; @@ -108,13 +108,13 @@ class Genode::Trace::Subject _ds = ram.alloc(_size); /* copy content */ - void *src = env_deprecated()->rm_session()->attach(from_ds), - *dst = env_deprecated()->rm_session()->attach(_ds); + void *src = local_rm.attach(from_ds), + *dst = local_rm.attach(_ds); memcpy(dst, src, _size); - env_deprecated()->rm_session()->detach(src); - env_deprecated()->rm_session()->detach(dst); + local_rm.detach(src); + local_rm.detach(dst); return true; } @@ -196,12 +196,13 @@ class Genode::Trace::Subject * \throw Traced_by_other_session */ void trace(Policy_id policy_id, Dataspace_capability policy_ds, - size_t policy_size, Ram_session &ram, size_t size) + size_t policy_size, Ram_allocator &ram, + Region_map &local_rm, size_t size) { _policy_id = policy_id; if (!_buffer.setup(ram, size) - || !_policy.setup(ram, policy_ds, policy_size)) + || !_policy.setup(ram, local_rm, policy_ds, policy_size)) throw Already_traced(); /* inform trace source about the new buffer */ @@ -288,7 +289,7 @@ class Genode::Trace::Subject_registry typedef List Subjects; Allocator &_md_alloc; - Ram_session &_ram; + Ram_allocator &_ram; Source_registry &_sources; unsigned _id_cnt { 0 }; Lock _lock { }; @@ -372,10 +373,10 @@ class Genode::Trace::Subject_registry * * \param md_alloc meta-data allocator used for allocating 'Subject' * objects. - * \param ram RAM session used for the allocation of trace + * \param ram allocator used for the allocation of trace * buffers and policy dataspaces. */ - Subject_registry(Allocator &md_alloc, Ram_session &ram, + Subject_registry(Allocator &md_alloc, Ram_allocator &ram, Source_registry &sources) : _md_alloc(md_alloc), _ram(ram), _sources(sources) diff --git a/repos/base/src/core/main.cc b/repos/base/src/core/main.cc index 1501b3e5b..ae5870ffd 100644 --- a/repos/base/src/core/main.cc +++ b/repos/base/src/core/main.cc @@ -145,8 +145,8 @@ class Core_child : public Child_policy Name name() const { return "init"; } - Service &resolve_session_request(Service::Name const &name, - Session_state::Args const &) override + Route resolve_session_request(Service::Name const &name, + Session_label const &label) override { Service *service = nullptr; _services.for_each([&] (Service &s) { @@ -156,7 +156,9 @@ class Core_child : public Child_policy if (!service) throw Service_denied(); - return *service; + return Route { .service = *service, + .label = label, + .diag = Session::Diag() }; } void init(Pd_session &session, Capability cap) override @@ -172,11 +174,8 @@ class Core_child : public Child_policy _core_cpu.transfer_quota(cap, Cpu_session::quota_lim_upscale(100, 100)); } - Pd_session &ref_pd() { return _core_pd; } - Pd_session_capability ref_pd_cap() const { return _core_pd_cap; } - - Ram_session &ref_ram() { return _core_pd; } - Ram_session_capability ref_ram_cap() const { return _core_pd_cap; } + Pd_session &ref_pd() override { return _core_pd; } + Pd_session_capability ref_pd_cap() const override { return _core_pd_cap; } size_t session_alloc_batch_size() const override { return 128; } }; @@ -254,8 +253,8 @@ int main() static Rom_root rom_root (ep, ep, platform().rom_fs(), sliced_heap); static Rm_root rm_root (ep, sliced_heap, pager_ep); - static Cpu_root cpu_root (ep, ep, pager_ep, sliced_heap, - Trace::sources()); + static Cpu_root cpu_root (core_ram_alloc, local_rm, ep, ep, pager_ep, + sliced_heap, Trace::sources()); static Pd_root pd_root (ep, core_env().signal_ep(), pager_ep, platform().ram_alloc(), local_rm, sliced_heap, @@ -265,7 +264,8 @@ int main() platform().ram_alloc(), sliced_heap); static Irq_root irq_root (*core_env().pd_session(), platform().irq_alloc(), sliced_heap); - static Trace::Root trace_root (ep, sliced_heap, Trace::sources(), trace_policies); + static Trace::Root trace_root (core_ram_alloc, local_rm, ep, sliced_heap, + Trace::sources(), trace_policies); static Core_service rom_service (services, rom_root); static Core_service rm_service (services, rm_root); @@ -300,7 +300,7 @@ int main() /* CPU session representing core */ static Cpu_session_component - core_cpu(ep, ep, pager_ep, sliced_heap, Trace::sources(), + core_cpu(core_ram_alloc, local_rm, ep, ep, pager_ep, sliced_heap, Trace::sources(), "label=\"core\"", Affinity(), Cpu_session::QUOTA_LIMIT); Cpu_session_capability core_cpu_cap = ep.manage(&core_cpu); diff --git a/repos/base/src/core/trace_session_component.cc b/repos/base/src/core/trace_session_component.cc index 80d656440..083f95cdd 100644 --- a/repos/base/src/core/trace_session_component.cc +++ b/repos/base/src/core/trace_session_component.cc @@ -23,7 +23,7 @@ using namespace Genode::Trace; Dataspace_capability Session_component::dataspace() { - return _argument_buffer.ds; + return _argument_buffer.cap(); } @@ -31,14 +31,14 @@ size_t Session_component::subjects() { _subjects.import_new_sources(_sources); - return _subjects.subjects((Subject_id *)_argument_buffer.base, - _argument_buffer.size/sizeof(Subject_id)); + return _subjects.subjects(_argument_buffer.local_addr(), + _argument_buffer.size()/sizeof(Subject_id)); } Policy_id Session_component::alloc_policy(size_t size) { - if (size > _argument_buffer.size) + if (size > _argument_buffer.size()) throw Policy_too_large(); /* @@ -92,7 +92,7 @@ void Session_component::trace(Subject_id subject_id, Policy_id policy_id, try { Trace::Subject &subject = _subjects.lookup_by_id(subject_id); subject.trace(policy_id, _policies.dataspace(*this, policy_id), - policy_size, _ram, buffer_size); + policy_size, _ram, _local_rm, buffer_size); } catch (...) { /* revert withdrawal or quota */ _md_alloc.upgrade(required_ram); @@ -139,12 +139,13 @@ void Session_component::free(Subject_id subject_id) } -Session_component::Session_component(Allocator &md_alloc, size_t ram_quota, +Session_component::Session_component(Ram_allocator &ram, Region_map &local_rm, + Allocator &md_alloc, size_t ram_quota, size_t arg_buffer_size, unsigned parent_levels, char const *label, Source_registry &sources, Policy_registry &policies) : - _ram(*env_deprecated()->ram_session()), + _ram(ram), _local_rm(local_rm), _md_alloc(&md_alloc, ram_quota), _subjects_slab(&_md_alloc), _policies_slab(&_md_alloc), @@ -153,9 +154,9 @@ Session_component::Session_component(Allocator &md_alloc, size_t ram_quota, _sources(sources), _policies(policies), _subjects(_subjects_slab, _ram, _sources), - _argument_buffer(_ram, arg_buffer_size) + _argument_buffer(_ram, local_rm, arg_buffer_size) { - _md_alloc.withdraw(_argument_buffer.size); + _md_alloc.withdraw(_argument_buffer.size()); } diff --git a/repos/base/src/include/base/internal/attached_stack_area.h b/repos/base/src/include/base/internal/attached_stack_area.h index 509002d3a..f48949a5b 100644 --- a/repos/base/src/include/base/internal/attached_stack_area.h +++ b/repos/base/src/include/base/internal/attached_stack_area.h @@ -28,9 +28,9 @@ namespace Genode { struct Attached_stack_area; } struct Genode::Attached_stack_area : Expanding_region_map_client { - Attached_stack_area(Parent &, Pd_session_capability pd) + Attached_stack_area(Parent &parent, Pd_session_capability pd) : - Expanding_region_map_client(pd, Pd_session_client(pd).stack_area(), + Expanding_region_map_client(parent, pd, Pd_session_client(pd).stack_area(), Parent::Env::pd()) { Region_map_client address_space(Pd_session_client(pd).address_space()); diff --git a/repos/base/src/include/base/internal/expanding_cpu_session_client.h b/repos/base/src/include/base/internal/expanding_cpu_session_client.h index b672f9187..1be6dd974 100644 --- a/repos/base/src/include/base/internal/expanding_cpu_session_client.h +++ b/repos/base/src/include/base/internal/expanding_cpu_session_client.h @@ -27,7 +27,7 @@ namespace Genode { struct Expanding_cpu_session_client; } struct Genode::Expanding_cpu_session_client : Upgradeable_client { - Expanding_cpu_session_client(Genode::Cpu_session_capability cap, Parent::Client::Id id) + Expanding_cpu_session_client(Parent &parent, Genode::Cpu_session_capability cap, Parent::Client::Id id) : /* * We need to upcast the capability because on some platforms (i.e., @@ -35,7 +35,7 @@ struct Genode::Expanding_cpu_session_client : Upgradeable_client - (static_cap_cast(cap), id) + (parent, static_cap_cast(cap), id) { } Thread_capability diff --git a/repos/base/src/include/base/internal/expanding_pd_session_client.h b/repos/base/src/include/base/internal/expanding_pd_session_client.h index 7d7bff73c..782e954f6 100644 --- a/repos/base/src/include/base/internal/expanding_pd_session_client.h +++ b/repos/base/src/include/base/internal/expanding_pd_session_client.h @@ -23,19 +23,20 @@ namespace Genode { class Expanding_pd_session_client; } struct Genode::Expanding_pd_session_client : Pd_session_client { + Parent &_parent; + void _request_ram_from_parent(size_t amount) { - Parent &parent = *env_deprecated()->parent(); - parent.resource_request(String<128>("ram_quota=", amount).string()); + _parent.resource_request(String<128>("ram_quota=", amount).string()); } void _request_caps_from_parent(size_t amount) { - Parent &parent = *env_deprecated()->parent(); - parent.resource_request(String<128>("cap_quota=", amount).string()); + _parent.resource_request(String<128>("cap_quota=", amount).string()); } - Expanding_pd_session_client(Pd_session_capability cap) : Pd_session_client(cap) { } + Expanding_pd_session_client(Parent &parent, Pd_session_capability cap) + : Pd_session_client(cap), _parent(parent) { } Ram_dataspace_capability alloc(size_t size, Cache_attribute cached = UNCACHED) override { diff --git a/repos/base/src/include/base/internal/expanding_region_map_client.h b/repos/base/src/include/base/internal/expanding_region_map_client.h index 4ff386876..bca104edd 100644 --- a/repos/base/src/include/base/internal/expanding_region_map_client.h +++ b/repos/base/src/include/base/internal/expanding_region_map_client.h @@ -29,9 +29,10 @@ struct Genode::Expanding_region_map_client : Region_map_client { Upgradeable_client _pd_client; - Expanding_region_map_client(Pd_session_capability pd, Capability rm, + Expanding_region_map_client(Parent &parent, Pd_session_capability pd, + Capability rm, Parent::Client::Id pd_id) - : Region_map_client(rm), _pd_client(pd, pd_id) { } + : Region_map_client(rm), _pd_client(parent, pd, pd_id) { } Local_addr attach(Dataspace_capability ds, size_t size, off_t offset, bool use_local_addr, Local_addr local_addr, diff --git a/repos/base/src/include/base/internal/globals.h b/repos/base/src/include/base/internal/globals.h index d842bc91a..9c899c422 100644 --- a/repos/base/src/include/base/internal/globals.h +++ b/repos/base/src/include/base/internal/globals.h @@ -35,7 +35,9 @@ namespace Genode { void init_ldso_phdr(Env &); void init_signal_thread(Env &); void init_root_proxy(Env &); - void init_log(); + void init_tracing(Env &); + void init_log(Parent &); + void init_exit(Parent &); void init_parent_resource_requests(Env &); void init_heartbeat_monitoring(Env &); void deinit_heartbeat_monitoring(); @@ -50,4 +52,6 @@ namespace Genode { Env &internal_env(); } +void genode_exit(int); + #endif /* _INCLUDE__BASE__INTERNAL__GLOBALS_H_ */ diff --git a/repos/base/src/include/base/internal/platform_env.h b/repos/base/src/include/base/internal/platform_env.h index a974fd205..44b2a7b73 100644 --- a/repos/base/src/include/base/internal/platform_env.h +++ b/repos/base/src/include/base/internal/platform_env.h @@ -24,6 +24,7 @@ #include #include #include +#include /* base-internal includes */ #include @@ -62,10 +63,10 @@ class Genode::Platform_env : public Platform_env_base Resources(Parent &parent) : - pd (request (parent, Parent::Env::pd())), - cpu(request(parent, Parent::Env::cpu()), - Parent::Env::cpu()), - rm(pd, pd.address_space(), Parent::Env::pd()) + pd (parent, request (parent, Parent::Env::pd())), + cpu(parent, request(parent, Parent::Env::cpu()), + Parent::Env::cpu()), + rm(parent, pd.rpc_cap(), pd.address_space(), Parent::Env::pd()) { } }; @@ -78,7 +79,7 @@ class Genode::Platform_env : public Platform_env_base * because the 'Local_parent' performs a dynamic memory allocation * due to the creation of the stack area's sub-RM session. */ - Attached_stack_area _stack_area { _parent_client, _resources.pd }; + Attached_stack_area _stack_area { _parent_client, _resources.pd.rpc_cap() }; public: @@ -107,13 +108,11 @@ class Genode::Platform_env : public Platform_env_base ******************************/ Parent *parent() override { return &_parent_client; } - Ram_session *ram_session() override { return &_resources.pd; } - Ram_session_capability ram_session_cap() override { return _resources.pd; } Cpu_session *cpu_session() override { return &_resources.cpu; } - Cpu_session_capability cpu_session_cap() override { return _resources.cpu; } - Region_map *rm_session() override { return &_resources.rm; } + Cpu_session_capability cpu_session_cap() override { return _resources.cpu.rpc_cap(); } Pd_session *pd_session() override { return &_resources.pd; } - Pd_session_capability pd_session_cap() override { return _resources.pd; } + Pd_session_capability pd_session_cap() override { return _resources.pd.rpc_cap(); } + Region_map *rm_session() override { return &_resources.rm; } Allocator *heap() override { return &_heap; } }; diff --git a/repos/base/src/include/base/internal/stack.h b/repos/base/src/include/base/internal/stack.h index e7ca2deda..761fb4410 100644 --- a/repos/base/src/include/base/internal/stack.h +++ b/repos/base/src/include/base/internal/stack.h @@ -56,7 +56,6 @@ /* Genode includes */ #include #include -#include /* for 'Ram_dataspace_capability' type */ #include /* for 'Cpu_session::Name' type */ /* base-internal includes */ diff --git a/repos/base/src/include/base/internal/upgradeable_client.h b/repos/base/src/include/base/internal/upgradeable_client.h index 3666d7ea9..3bfeb97a2 100644 --- a/repos/base/src/include/base/internal/upgradeable_client.h +++ b/repos/base/src/include/base/internal/upgradeable_client.h @@ -28,19 +28,20 @@ struct Genode::Upgradeable_client : CLIENT { typedef Genode::Capability Capability; + Parent &_parent; Parent::Client::Id _id; - Upgradeable_client(Capability cap, Parent::Client::Id id) - : CLIENT(cap), _id(id) { } + Upgradeable_client(Parent &parent, Capability cap, Parent::Client::Id id) + : CLIENT(cap), _parent(parent), _id(id) { } void upgrade_ram(size_t quota) { - env_deprecated()->parent()->upgrade(_id, String<64>("ram_quota=", quota).string()); + _parent.upgrade(_id, String<64>("ram_quota=", quota).string()); } void upgrade_caps(size_t quota) { - env_deprecated()->parent()->upgrade(_id, String<64>("cap_quota=", quota).string()); + _parent.upgrade(_id, String<64>("cap_quota=", quota).string()); } }; diff --git a/repos/base/src/lib/base/child.cc b/repos/base/src/lib/base/child.cc index fb594691c..a30731517 100644 --- a/repos/base/src/lib/base/child.cc +++ b/repos/base/src/lib/base/child.cc @@ -221,8 +221,8 @@ Session_capability Child::session(Parent::Client::Id id, Ram_transfer::Remote_account ref_ram_account { _policy.ref_pd(), _policy.ref_pd_cap() }; Cap_transfer::Remote_account ref_cap_account { _policy.ref_pd(), _policy.ref_pd_cap() }; - Ram_transfer::Remote_account ram_account { ram(), ram_session_cap() }; - Cap_transfer::Remote_account cap_account { pd(), pd_session_cap() }; + Ram_transfer::Remote_account ram_account { pd(), pd_session_cap() }; + Cap_transfer::Remote_account cap_account { pd(), pd_session_cap() }; /* transfer the quota donation from the child's account to ourself */ Ram_transfer ram_donation_from_child(ram_quota, ram_account, ref_ram_account); @@ -364,8 +364,8 @@ Parent::Upgrade_result Child::upgrade(Client::Id id, Parent::Upgrade_args const Ram_transfer::Remote_account ref_ram_account { _policy.ref_pd(), _policy.ref_pd_cap() }; Cap_transfer::Remote_account ref_cap_account { _policy.ref_pd(), _policy.ref_pd_cap() }; - Ram_transfer::Remote_account ram_account { ram(), pd_session_cap() }; - Cap_transfer::Remote_account cap_account { pd(), pd_session_cap() }; + Ram_transfer::Remote_account ram_account { pd(), pd_session_cap() }; + Cap_transfer::Remote_account cap_account { pd(), pd_session_cap() }; /* transfer quota from client to ourself */ Ram_transfer ram_donation_from_child(ram_quota, ram_account, ref_ram_account); @@ -416,7 +416,7 @@ void Child::_revert_quota_and_destroy(Session_state &session) { Ram_transfer::Remote_account ref_ram_account(_policy.ref_pd(), _policy.ref_pd_cap()); Ram_transfer::Account &service_ram_account = session.service(); - Ram_transfer::Remote_account child_ram_account(ram(), pd_session_cap()); + Ram_transfer::Remote_account child_ram_account(pd(), pd_session_cap()); Cap_transfer::Remote_account ref_cap_account(_policy.ref_pd(), _policy.ref_pd_cap()); Cap_transfer::Account &service_cap_account = session.service(); diff --git a/repos/base/src/lib/base/child_process.cc b/repos/base/src/lib/base/child_process.cc index 6a0b82a02..139c63a5a 100644 --- a/repos/base/src/lib/base/child_process.cc +++ b/repos/base/src/lib/base/child_process.cc @@ -26,7 +26,7 @@ using namespace Genode; Child::Process::Loaded_executable::Loaded_executable(Type type, Dataspace_capability ldso_ds, - Pd_session &pd, + Ram_session &ram, Region_map &local_rm, Region_map &remote_rm, Parent_capability parent_cap) @@ -84,7 +84,7 @@ Child::Process::Loaded_executable::Loaded_executable(Type type, /* alloc dataspace */ Dataspace_capability ds_cap; - try { ds_cap = pd.alloc(size); } + try { ds_cap = ram.alloc(size); } catch (Out_of_ram) { error("allocation of read-write segment failed"); throw; }; diff --git a/repos/base/src/lib/base/component.cc b/repos/base/src/lib/base/component.cc index fa5e8ad77..aa0b0f5b2 100644 --- a/repos/base/src/lib/base/component.cc +++ b/repos/base/src/lib/base/component.cc @@ -18,6 +18,7 @@ #include #include #include +#include /* base-internal includes */ #include @@ -73,17 +74,11 @@ namespace { Env(Genode::Entrypoint &ep) : _ep(ep) { env_ptr = this; } Genode::Parent &parent() override { return _parent; } - Genode::Ram_session &ram() override { return *Genode::env_deprecated()->ram_session(); } Genode::Cpu_session &cpu() override { return *Genode::env_deprecated()->cpu_session(); } Genode::Region_map &rm() override { return *Genode::env_deprecated()->rm_session(); } Genode::Pd_session &pd() override { return *Genode::env_deprecated()->pd_session(); } Genode::Entrypoint &ep() override { return _ep; } - Genode::Ram_session_capability ram_session_cap() override - { - return Genode::env_deprecated()->ram_session_cap(); - } - Genode::Cpu_session_capability cpu_session_cap() override { return Genode::env_deprecated()->cpu_session_cap(); @@ -171,7 +166,7 @@ namespace { cap_quota = Cap_quota { cap_quota.value + 4 }; } catch (Out_of_ram) { - if (ram_quota.value > ram().avail_ram().value) { + if (ram_quota.value > pd().avail_ram().value) { Parent::Resource_args args(String<64>("ram_quota=", ram_quota)); _parent.resource_request(args); } diff --git a/repos/base/src/lib/base/default_log.cc b/repos/base/src/lib/base/default_log.cc index ba3f2ea52..90356c179 100644 --- a/repos/base/src/lib/base/default_log.cc +++ b/repos/base/src/lib/base/default_log.cc @@ -12,9 +12,11 @@ */ /* Genode includes */ +#include #include -#include #include +#include +#include /* base-internal includes */ #include @@ -23,32 +25,68 @@ using namespace Genode; -static Log *log_ptr; +namespace { + /** + * Singleton back end for writing messages to the component's log session + */ + struct Back_end : Noncopyable + { + Log_session_client _client; + + static Session_capability _cap(Parent &parent) { + return parent.session_cap(Parent::Env::log()); } + + Back_end(Parent &parent) + : _client(reinterpret_cap_cast(_cap(parent))) { } + + void write(char const *string) { (void)_client.write(string); } + }; +} + +static Back_end *back_end_ptr; + + +/** + * Singleton instance of the 'Log' interface + */ +static Log *log_ptr; Log &Log::log() { - /* - * Ensure the log is initialized before use. This is only needed for - * components that do not initialize the log explicitly in the startup - * code, i.e., Linux hybrid components. - */ - Genode::init_log(); + if (log_ptr) + return *log_ptr; - return *log_ptr; + raw("Error: Missing call of init_log"); + sleep_forever(); } -extern "C" int stdout_write(const char *s); +/** + * Hook for support the 'fork' implementation of the noux libc backend + */ +extern "C" void stdout_reconnect(Parent &parent) +{ + /* + * We cannot use a 'Reconstructible' because we have to skip + * the object destruction inside a freshly forked process. + * Otherwise, the attempt to destruct the capability contained + * in the 'Log' object would result in an inconsistent ref counter + * of the respective capability-space element. + */ + construct_at(back_end_ptr, parent); +} -void Genode::init_log() +void Genode::init_log(Parent &parent) { /* ignore subsequent calls */ if (log_ptr) return; - struct Write_fn { void operator () (char const *s) { stdout_write(s); } }; + back_end_ptr = unmanaged_singleton(parent); + + struct Write_fn { void operator () (char const *s) { back_end_ptr->write(s); } }; typedef Buffered_output Buffered_log_output; diff --git a/repos/base/src/lib/base/entrypoint.cc b/repos/base/src/lib/base/entrypoint.cc index 88fc3bbd7..426731107 100644 --- a/repos/base/src/lib/base/entrypoint.cc +++ b/repos/base/src/lib/base/entrypoint.cc @@ -15,14 +15,9 @@ /* Genode includes */ #include #include - #include - -#define INCLUDED_BY_ENTRYPOINT_CC /* prevent "deprecated" warning */ -#include -#undef INCLUDED_BY_ENTRYPOINT_CC - #include +#include /* base-internal includes */ #include @@ -284,6 +279,7 @@ namespace { Genode::call_global_static_constructors(); Genode::init_signal_transmitter(env); + Genode::init_tracing(env); /* * Now, as signaling is available, initialize the asynchronous @@ -296,6 +292,11 @@ namespace { Component::construct(env); } }; + + void invoke_constructor_at_entrypoint(Capability cap) + { + cap.call(); + } } @@ -315,16 +316,15 @@ Entrypoint::Entrypoint(Env &env) */ Constructor_component constructor(env); - Capability constructor_cap = - _rpc_ep->manage(&constructor); + _env.ep().manage(constructor); try { - constructor_cap.call(); + invoke_constructor_at_entrypoint(constructor.cap()); } catch (Blocking_canceled) { warning("blocking canceled in entrypoint constructor"); } - _rpc_ep->dissolve(&constructor); + _env.ep().dissolve(constructor); /* * The calling initial thread becomes the signal proxy thread for this diff --git a/repos/base/src/lib/base/log_console.cc b/repos/base/src/lib/base/log_console.cc deleted file mode 100644 index 00144e11a..000000000 --- a/repos/base/src/lib/base/log_console.cc +++ /dev/null @@ -1,144 +0,0 @@ -/* - * \brief Printf backend for the LOG interface - * \author Norman Feske - * \date 2006-09-15 - */ - -/* - * Copyright (C) 2006-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. - */ - -#include -#include -#include -#include -#include -#include - -using namespace Genode; - -class Log_console : public Console -{ - private: - - enum { _BUF_SIZE = Log_session::MAX_STRING_LEN }; - - - struct Log : Log_session_client - { - Session_capability _cap() { - return env_deprecated()->parent()->session_cap(Parent::Env::log()); } - - Log() : Log_session_client(reinterpret_cap_cast(_cap())) - { } - }; - - Log _log { }; - - char _buf[_BUF_SIZE] { }; - unsigned _num_chars = 0; - Lock _lock { }; - - void _flush() - { - /* null-terminate string */ - _buf[_num_chars] = 0; - _log.write(_buf); - - /* restart with empty buffer */ - _num_chars = 0; - } - - protected: - - void _out_char(char c) - { - /* ensure enough buffer space for complete escape sequence */ - if ((c == 27) && (_num_chars + 8 > _BUF_SIZE)) _flush(); - - _buf[_num_chars++] = c; - - /* flush immediately on line break */ - if (c == '\n' || _num_chars >= sizeof(_buf) - 1) - _flush(); - } - - public: - - /** - * Constructor - */ - Log_console() { } - - /** - * Console interface - */ - void vprintf(const char *format, va_list list) - { - Lock::Guard lock_guard(_lock); - Console::vprintf(format, list); - } - - /** - * Return LOG session interface - */ - Log_session &log_session() { return _log; } - - /** - * Re-establish LOG session - */ - void reconnect() - { - /* - * We cannot use a 'Reconstructible' because we have to skip - * the object destruction inside a freshly forked process. - * Otherwise, the attempt to destruct the capability contained - * in the 'Log' object would result in an inconsistent ref counter - * of the respective capability-space element. - */ - construct_at(&_log); - } -}; - - -/* - * In the presence of a libC, we use the libC's full printf implementation and - * use the 'Log_console' as backend. - */ - -static Log_console *stdout_log_console() { return unmanaged_singleton(); } - - -/** - * Hook for supporting libc back ends for stdio - */ -extern "C" int stdout_write(const char *s) -{ - return stdout_log_console()->log_session().write(s); -} - - -/** - * Hook for support the 'fork' implementation of the noux libc backend - */ -extern "C" void stdout_reconnect() { stdout_log_console()->reconnect(); } - - -void Genode::printf(const char *format, ...) -{ - va_list list; - va_start(list, format); - - vprintf(format, list); - - va_end(list); -} - - -void Genode::vprintf(const char *format, va_list list) -{ - stdout_log_console()->vprintf(format, list); -} diff --git a/repos/base/src/lib/base/rpc_cap_alloc.cc b/repos/base/src/lib/base/rpc_cap_alloc.cc index 802c74e9f..8d5bd3365 100644 --- a/repos/base/src/lib/base/rpc_cap_alloc.cc +++ b/repos/base/src/lib/base/rpc_cap_alloc.cc @@ -16,6 +16,7 @@ #include #include #include +#include using namespace Genode; diff --git a/repos/base/src/lib/base/signal.cc b/repos/base/src/lib/base/signal.cc index 242753e1e..525b6ed4a 100644 --- a/repos/base/src/lib/base/signal.cc +++ b/repos/base/src/lib/base/signal.cc @@ -19,6 +19,7 @@ #include #include #include +#include /* base-internal includes */ #include @@ -182,31 +183,6 @@ Genode::Signal_context_registry *signal_context_registry() } -/******************** - ** Signal context ** - ********************/ - -void Signal_context::submit(unsigned num) -{ - if (!_receiver) { - warning("signal context with no receiver"); - return; - } - - if (!signal_context_registry()->test_and_lock(this)) { - warning("encountered dead signal context"); - return; - } - - /* construct and locally submit signal object */ - Signal::Data signal(this, num); - _receiver->local_submit(signal); - - /* free context lock that was taken by 'test_and_lock' */ - _lock.unlock(); -} - - /********************* ** Signal receiver ** *********************/ diff --git a/repos/base/src/lib/base/signal_common.cc b/repos/base/src/lib/base/signal_common.cc index 1e4d61ab4..2eeaefbc4 100644 --- a/repos/base/src/lib/base/signal_common.cc +++ b/repos/base/src/lib/base/signal_common.cc @@ -17,6 +17,7 @@ #include #include #include +#include using namespace Genode; diff --git a/repos/base/src/lib/base/thread.cc b/repos/base/src/lib/base/thread.cc index 351a08327..7c55e1295 100644 --- a/repos/base/src/lib/base/thread.cc +++ b/repos/base/src/lib/base/thread.cc @@ -19,6 +19,7 @@ #include #include #include +#include /* base-internal includes */ #include diff --git a/repos/base/src/lib/base/thread_start.cc b/repos/base/src/lib/base/thread_start.cc index b66c4b0d6..7d60fae59 100644 --- a/repos/base/src/lib/base/thread_start.cc +++ b/repos/base/src/lib/base/thread_start.cc @@ -17,6 +17,7 @@ #include #include #include +#include /* base-internal includes */ #include diff --git a/repos/base/src/lib/base/trace.cc b/repos/base/src/lib/base/trace.cc index 95fba7fbb..15b1ef8e5 100644 --- a/repos/base/src/lib/base/trace.cc +++ b/repos/base/src/lib/base/trace.cc @@ -27,6 +27,19 @@ using namespace Genode; namespace Genode { bool inhibit_tracing = true; /* cleared by '_main' */ } +static Env *_env_ptr; + +namespace Genode { void init_tracing(Env &env) { _env_ptr = &env; } } + +static Env &_env() +{ + if (_env_ptr) + return *_env_ptr; + + struct Missing_call_of_init_tracing { }; + throw Missing_call_of_init_tracing(); +} + /******************* ** Trace::Logger ** @@ -47,13 +60,13 @@ bool Trace::Logger::_evaluate_control() /* unload policy */ if (policy_module) { - env_deprecated()->rm_session()->detach(policy_module); + _env().rm().detach(policy_module); policy_module = 0; } /* unmap trace buffer */ if (buffer) { - env_deprecated()->rm_session()->detach(buffer); + _env().rm().detach(buffer); buffer = 0; } @@ -93,9 +106,8 @@ bool Trace::Logger::_evaluate_control() EXECUTABLE = true }; - Genode::Region_map * const rm = env_deprecated()->rm_session(); - policy_module = rm->attach(policy_ds, MAX_SIZE, NO_OFFSET, - ANY_LOCAL_ADDR, nullptr, EXECUTABLE); + policy_module = _env().rm().attach(policy_ds, MAX_SIZE, NO_OFFSET, + ANY_LOCAL_ADDR, nullptr, EXECUTABLE); /* relocate function pointers of policy callback table */ for (unsigned i = 0; i < sizeof(Trace::Policy_module)/sizeof(void *); i++) { @@ -118,7 +130,7 @@ bool Trace::Logger::_evaluate_control() } try { - buffer = env_deprecated()->rm_session()->attach(buffer_ds); + buffer = _env().rm().attach(buffer_ds); buffer->init(Dataspace_client(buffer_ds).size()); } catch (...) { } @@ -170,10 +182,10 @@ Trace::Logger::Logger() { } /** * return logger instance for the main thread ** */ -static Trace::Logger *main_trace_logger() +static Trace::Logger &main_trace_logger() { static Trace::Logger logger; - return &logger; + return logger; } @@ -183,38 +195,36 @@ static Trace::Control *main_trace_control; Trace::Logger *Thread::_logger() { if (inhibit_tracing) - return 0; + return nullptr; Thread * const myself = Thread::myself(); - Trace::Logger * const logger = myself ? &myself->_trace_logger - : main_trace_logger(); + Trace::Logger &logger = myself ? myself->_trace_logger + : main_trace_logger(); /* logger is already being initialized */ - if (logger->init_pending()) - return logger; + if (logger.init_pending()) + return &logger; /* lazily initialize trace object */ - if (!logger->initialized()) { - logger->init_pending(true); + if (!logger.initialized()) { + logger.init_pending(true); Thread_capability thread_cap = myself ? myself->_thread_cap - : env_deprecated()->parent()->main_thread_cap(); + : _env().parent().main_thread_cap(); - Genode::Cpu_session *cpu = myself ? myself->_cpu_session - : env_deprecated()->cpu_session(); - if (!cpu) cpu = env_deprecated()->cpu_session(); + Cpu_session &cpu = myself ? *myself->_cpu_session : _env().cpu(); if (!myself) if (!main_trace_control) { - Dataspace_capability ds = env_deprecated()->cpu_session()->trace_control(); + Dataspace_capability ds = _env().cpu().trace_control(); if (ds.valid()) - main_trace_control = env_deprecated()->rm_session()->attach(ds); + main_trace_control = _env().rm().attach(ds); } - logger->init(thread_cap, cpu, - myself ? myself->_trace_control : main_trace_control); + logger.init(thread_cap, &cpu, + myself ? myself->_trace_control : main_trace_control); } - return logger; + return &logger; } diff --git a/repos/base/src/lib/cxx/misc.cc b/repos/base/src/lib/cxx/misc.cc index d932b246b..e8ea059cc 100644 --- a/repos/base/src/lib/cxx/misc.cc +++ b/repos/base/src/lib/cxx/misc.cc @@ -18,7 +18,6 @@ #include #include #include -#include #include #include @@ -119,9 +118,8 @@ extern "C" void *abort(void) /* Notify the parent of failure */ if (name != "main") - Genode::env_deprecated()->parent()->exit(1); + genode_exit(1); - Genode::sleep_forever(); return 0; } diff --git a/repos/base/src/lib/startup/_main.cc b/repos/base/src/lib/startup/_main.cc index 4a9c175f6..331b52c0d 100644 --- a/repos/base/src/lib/startup/_main.cc +++ b/repos/base/src/lib/startup/_main.cc @@ -22,8 +22,8 @@ /* Genode includes */ #include #include -#include #include +#include /* platform-specific local helper functions */ #include @@ -173,6 +173,12 @@ void genode___cxa_finalize(void *dso) extern "C" void __cxa_finalize(void *dso); +static Genode::Parent *_parent_ptr; + + +namespace Genode { void init_exit(Parent &parent) { _parent_ptr = &parent; } } + + /** * Terminate the process. */ @@ -186,7 +192,8 @@ void genode_exit(int status) for (func = &_dtors_start; func != &_dtors_end; (*func++)()); /* inform parent about the exit status */ - Genode::env_deprecated()->parent()->exit(status); + if (_parent_ptr) + _parent_ptr->exit(status); /* wait for destruction by the parent */ Genode::sleep_forever(); diff --git a/repos/base/src/lib/startup/init_main_thread.cc b/repos/base/src/lib/startup/init_main_thread.cc index 6ba267b29..f2aa8d2c4 100644 --- a/repos/base/src/lib/startup/init_main_thread.cc +++ b/repos/base/src/lib/startup/init_main_thread.cc @@ -17,6 +17,7 @@ #include #include #include +#include /* base-internal includes */ #include @@ -98,7 +99,8 @@ extern "C" void init_main_thread() * destructor won't be registered for the atexit routine. */ (void*)env_deprecated(); - init_log(); + init_log(*env_deprecated()->parent()); + init_exit(*env_deprecated()->parent()); /* create a thread object for the main thread */ main_thread(); diff --git a/repos/base/src/test/rm_fault/main.cc b/repos/base/src/test/rm_fault/main.cc index 77a01f291..339b550c9 100644 --- a/repos/base/src/test/rm_fault/main.cc +++ b/repos/base/src/test/rm_fault/main.cc @@ -175,6 +175,19 @@ class Test_child_policy : public Child_policy Signal_context_capability const _fault_handler_sigh; Signal_context_capability const _fault_handler_stack_sigh; + Service &_matching_service(Service::Name const &name) + { + Service *service = nullptr; + _parent_services.for_each([&] (Service &s) { + if (!service && name == s.name()) + service = &s; }); + + if (!service) + throw Service_denied(); + + return *service; + } + public: /** @@ -216,18 +229,12 @@ class Test_child_policy : public Child_policy stack_area.fault_handler(_fault_handler_stack_sigh); } - Service &resolve_session_request(Service::Name const &service_name, - Session_state::Args const &) override + Route resolve_session_request(Service::Name const &name, + Session_label const &label) override { - Service *service = nullptr; - _parent_services.for_each([&] (Service &s) { - if (!service && service_name == s.name()) - service = &s; }); - - if (!service) - throw Service_denied(); - - return *service; + return Route { .service = _matching_service(name), + .label = label, + .diag = Session::Diag() }; } }; @@ -252,19 +259,19 @@ struct Main_parent { Allocator &alloc; - Parent_services(Allocator &alloc) : alloc(alloc) + Parent_services(Env &env, Allocator &alloc) : alloc(alloc) { static const char *names[] = { "PD", "CPU", "ROM", "LOG", 0 }; for (unsigned i = 0; names[i]; i++) - new (alloc) Test_child_policy::Parent_service(*this, names[i]); + new (alloc) Test_child_policy::Parent_service(*this, env, names[i]); } ~Parent_services() { for_each([&] (Test_child_policy::Parent_service &s) { destroy(alloc, &s); }); } - } _parent_services { _heap }; + } _parent_services { _env, _heap }; /* create child */ Test_child_policy _child_policy { _env, _parent_services, _fault_handler, diff --git a/repos/dde_linux/src/drivers/usb_host/main.cc b/repos/dde_linux/src/drivers/usb_host/main.cc index 94f94eb1c..81f1947f2 100644 --- a/repos/dde_linux/src/drivers/usb_host/main.cc +++ b/repos/dde_linux/src/drivers/usb_host/main.cc @@ -41,7 +41,6 @@ struct workqueue_struct *tasklet_wq; void breakpoint() { Genode::log("BREAK"); } -extern "C" int stdout_write(const char *); static void run_linux(void *s) { diff --git a/repos/dde_linux/src/lib/usb/main.cc b/repos/dde_linux/src/lib/usb/main.cc index 049c41542..d165bfe71 100644 --- a/repos/dde_linux/src/lib/usb/main.cc +++ b/repos/dde_linux/src/lib/usb/main.cc @@ -56,7 +56,6 @@ struct workqueue_struct *tasklet_wq; void breakpoint() { Genode::log("BREAK"); } -extern "C" int stdout_write(const char *); static void run_linux(void *s) { diff --git a/repos/dde_linux/src/lx_kit/printf.cc b/repos/dde_linux/src/lx_kit/printf.cc index 9d7cd224c..957d25804 100644 --- a/repos/dde_linux/src/lx_kit/printf.cc +++ b/repos/dde_linux/src/lx_kit/printf.cc @@ -11,6 +11,10 @@ * version 2. */ +/* Genode includes */ +#include +#include + /* local includes */ #include @@ -20,8 +24,6 @@ namespace Lx { class Format_command; } -extern "C" int stdout_write(const char *s); - /** * Format string command representation @@ -192,7 +194,7 @@ class Lx::Console return; _buf[_idx] = 0; - stdout_write(_buf); + Genode::log(Genode::Cstring(_buf)); _idx = 0; } diff --git a/repos/libports/src/test/rust/printf.cc b/repos/libports/src/test/rust/printf.cc index 060c85fe5..338003237 100644 --- a/repos/libports/src/test/rust/printf.cc +++ b/repos/libports/src/test/rust/printf.cc @@ -1,4 +1,4 @@ -#include +#include extern "C" void print_num(int num) { - Genode::printf("Number from rust: %d \n",num); + Genode::log("Number from rust: ", num); } diff --git a/repos/os/src/drivers/input/spec/imx53/main.cc b/repos/os/src/drivers/input/spec/imx53/main.cc index 24d0cf7c5..0df3de152 100644 --- a/repos/os/src/drivers/input/spec/imx53/main.cc +++ b/repos/os/src/drivers/input/spec/imx53/main.cc @@ -20,7 +20,6 @@ #include #include #include -#include #include /* local includes */ @@ -55,7 +54,7 @@ struct Main Input::Tablet_driver::factory(env, session.event_queue()); break; default: - PWRN("No input driver available for this board"); + warning("No input driver available for this board"); } /* tell parent about the service */ diff --git a/repos/ports/include/vmm/utcb_guard.h b/repos/ports/include/vmm/utcb_guard.h index 20dae3b10..905096dee 100644 --- a/repos/ports/include/vmm/utcb_guard.h +++ b/repos/ports/include/vmm/utcb_guard.h @@ -50,7 +50,7 @@ class Vmm::Utcb_guard Genode::memcpy(&_backup_utcb, utcb, len); if (utcb->msg_items()) - PWRN("Error: msg items on UTCB are not saved and restored!"); + Genode::warning("Error: msg items on UTCB are not saved and restored!"); } ~Utcb_guard() diff --git a/repos/ports/src/app/seoul/nova_user_env.cc b/repos/ports/src/app/seoul/nova_user_env.cc index 40daffc91..9d5293255 100644 --- a/repos/ports/src/app/seoul/nova_user_env.cc +++ b/repos/ports/src/app/seoul/nova_user_env.cc @@ -12,7 +12,8 @@ */ /* Genode includes */ -#include +#include +#include #include #include #include @@ -27,32 +28,36 @@ enum { verbose_memory_leak = false }; - -Genode::Lock *printf_lock() +static +void vprintf(const char *format, va_list &args) { - static Genode::Lock inst; - return &inst; + using namespace Genode; + typedef Vmm::Utcb_guard::Utcb_backup Utcb_backup; + + static Lock lock; + static Utcb_backup utcb_backup; + static char buf[Log_session::MAX_STRING_LEN-4]; + + Lock::Guard guard(lock); + utcb_backup = *(Utcb_backup *)Thread::myself()->utcb(); + + String_console sc(buf, sizeof(buf)); + sc.vprintf(format, args); + + int n = sc.len(); + if (0 < n && buf[n-1] == '\n') n--; + + log("VMM: ", Cstring(buf, n)); + + *(Utcb_backup *)Thread::myself()->utcb() = utcb_backup; } - -typedef Vmm::Utcb_guard::Utcb_backup Utcb_backup; - -static Utcb_backup utcb_backup; - - void Logging::printf(const char *format, ...) { va_list list; va_start(list, format); - Genode::Lock::Guard guard(*printf_lock()); - - utcb_backup = *(Utcb_backup *)Genode::Thread::myself()->utcb(); - - Genode::printf("VMM: "); - Genode::vprintf(format, list); - - *(Utcb_backup *)Genode::Thread::myself()->utcb() = utcb_backup; + ::vprintf(format, list); va_end(list); } @@ -60,15 +65,7 @@ void Logging::printf(const char *format, ...) void Logging::vprintf(const char *format, va_list &ap) { - Genode::Lock::Guard guard(*printf_lock()); - - utcb_backup = *(Utcb_backup *)Genode::Thread::myself()->utcb(); - - Genode::printf("VMM: "); - Genode::printf(format); - Genode::error("Logging::vprintf not implemented"); - - *(Utcb_backup *)Genode::Thread::myself()->utcb() = utcb_backup; + ::vprintf(format, ap); } @@ -77,9 +74,8 @@ void Logging::panic(const char *format, ...) va_list list; va_start(list, format); - Genode::printf("\nVMM PANIC! "); - Genode::vprintf(format, list); - Genode::printf("\n"); + Genode::error("VMM PANIC!"); + ::vprintf(format, list); va_end(list); @@ -159,9 +155,7 @@ void operator delete (void * ptr) void do_exit(char const *msg) { - Genode::printf("*** "); - Genode::printf(msg); - Genode::printf("\n"); + Genode::log("*** ", msg); Genode::sleep_forever(); } diff --git a/repos/ports/src/virtualbox5/logger.cc b/repos/ports/src/virtualbox5/logger.cc index 9068a2ae6..aab5e1da9 100644 --- a/repos/ports/src/virtualbox5/logger.cc +++ b/repos/ports/src/virtualbox5/logger.cc @@ -20,9 +20,6 @@ #include #include -/* interface to 'log_console' */ -extern "C" int stdout_write(const char *); - namespace { @@ -121,7 +118,7 @@ namespace { int curr_count= count > sizeof(tmp) - 1 ? sizeof(tmp) - 1 : count; strncpy(tmp, src, curr_count); tmp[curr_count > 0 ? curr_count : 0] = 0; - stdout_write(tmp); + Genode::log(Genode::Cstring(tmp)); count -= curr_count; src += curr_count; }